/*
 * Copyright 2024 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.gradle.util.internal;

import javax.crypto.SecretKey;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.GeneralSecurityException;

/**
 * Encrypts and decrypts streams of data by wrapping plaintext and ciphertext streams.
 */
public interface EncryptionAlgorithm {

    /**
     * The transformation performed by this cipher.
     *
     * @see javax.crypto.Cipher
     */
    String getTransformation();

    /**
     * The algorithm that backs the transformation. This is the first part of
     * the transformation string. For example, AES is the algorithm for AES/CTR/NoPadding
     */
    String getAlgorithm();

    /**
     * Return a new input stream that decrypts ciphertext from the given input stream using the
     * provided key.
     * <p>
     * This method assumes the data read from the given input stream was written
     * with {@link #encryptedStream(OutputStream, SecretKey)}
     */
    InputStream decryptedStream(InputStream inputStream, SecretKey key) throws GeneralSecurityException, IOException;

    /**
     * Return a new output stream that encrypts incoming plaintext using the provided key and writes
     * it to the given output stream.
     * <p>
     * Data written by this method should only be decrypted by {@link #decryptedStream(InputStream, SecretKey)}
     */
    OutputStream encryptedStream(OutputStream outputStream, SecretKey key) throws GeneralSecurityException, IOException;
}
