All Downloads are FREE. Search and download functionalities are using the official Maven repository.

sop.operation.Encrypt.kt Maven / Gradle / Ivy

There is a newer version: 10.0.3
Show newest version
// SPDX-FileCopyrightText: 2023 Paul Schaub 
//
// SPDX-License-Identifier: Apache-2.0

package sop.operation

import java.io.IOException
import java.io.InputStream
import sop.EncryptionResult
import sop.Profile
import sop.ReadyWithResult
import sop.enums.EncryptAs
import sop.exception.SOPGPException.*
import sop.util.UTF8Util

interface Encrypt {

    /**
     * Disable ASCII armor encoding.
     *
     * @return builder instance
     */
    fun noArmor(): Encrypt

    /**
     * Sets encryption mode.
     *
     * @param mode mode
     * @return builder instance
     * @throws UnsupportedOption if this option is not supported
     */
    @Throws(UnsupportedOption::class) fun mode(mode: EncryptAs): Encrypt

    /**
     * Adds the signer key.
     *
     * @param key input stream containing the encoded signer key
     * @return builder instance
     * @throws KeyCannotSign if the key cannot be used for signing
     * @throws UnsupportedAsymmetricAlgo if the key uses an unsupported asymmetric algorithm
     * @throws BadData if the [InputStream] does not contain an OpenPGP key
     * @throws IOException in case of an IO error
     */
    @Throws(
        KeyCannotSign::class, UnsupportedAsymmetricAlgo::class, BadData::class, IOException::class)
    fun signWith(key: InputStream): Encrypt

    /**
     * Adds the signer key.
     *
     * @param key byte array containing the encoded signer key
     * @return builder instance
     * @throws KeyCannotSign if the key cannot be used for signing
     * @throws UnsupportedAsymmetricAlgo if the key uses an unsupported asymmetric algorithm
     * @throws BadData if the byte array does not contain an OpenPGP key
     * @throws IOException in case of an IO error
     */
    @Throws(
        KeyCannotSign::class, UnsupportedAsymmetricAlgo::class, BadData::class, IOException::class)
    fun signWith(key: ByteArray): Encrypt = signWith(key.inputStream())

    /**
     * Provide the password for the secret key used for signing.
     *
     * @param password password
     * @return builder instance
     * @throws PasswordNotHumanReadable if the password is not human-readable
     * @throws UnsupportedOption if key password are not supported
     */
    @Throws(PasswordNotHumanReadable::class, UnsupportedOption::class)
    fun withKeyPassword(password: String): Encrypt =
        withKeyPassword(password.toByteArray(UTF8Util.UTF8))

    /**
     * Provide the password for the secret key used for signing.
     *
     * @param password password
     * @return builder instance
     * @throws PasswordNotHumanReadable if the password is not human-readable
     * @throws UnsupportedOption if key password are not supported
     */
    @Throws(PasswordNotHumanReadable::class, UnsupportedOption::class)
    fun withKeyPassword(password: ByteArray): Encrypt

    /**
     * Encrypt with the given password.
     *
     * @param password password
     * @return builder instance
     * @throws PasswordNotHumanReadable if the password is not human-readable
     * @throws UnsupportedOption if this option is not supported
     */
    @Throws(PasswordNotHumanReadable::class, UnsupportedOption::class)
    fun withPassword(password: String): Encrypt

    /**
     * Encrypt with the given cert.
     *
     * @param cert input stream containing the encoded cert.
     * @return builder instance
     * @throws CertCannotEncrypt if the certificate is not encryption capable
     * @throws UnsupportedAsymmetricAlgo if the certificate uses an unsupported asymmetric algorithm
     * @throws BadData if the [InputStream] does not contain an OpenPGP certificate
     * @throws IOException in case of an IO error
     */
    @Throws(
        CertCannotEncrypt::class,
        UnsupportedAsymmetricAlgo::class,
        BadData::class,
        IOException::class)
    fun withCert(cert: InputStream): Encrypt

    /**
     * Encrypt with the given cert.
     *
     * @param cert byte array containing the encoded cert.
     * @return builder instance
     * @throws CertCannotEncrypt if the certificate is not encryption capable
     * @throws UnsupportedAsymmetricAlgo if the certificate uses an unsupported asymmetric algorithm
     * @throws BadData if the byte array does not contain an OpenPGP certificate
     * @throws IOException in case of an IO error
     */
    @Throws(
        CertCannotEncrypt::class,
        UnsupportedAsymmetricAlgo::class,
        BadData::class,
        IOException::class)
    fun withCert(cert: ByteArray): Encrypt = withCert(cert.inputStream())

    /**
     * Pass in a profile.
     *
     * @param profile profile
     * @return builder instance
     */
    fun profile(profile: Profile): Encrypt = profile(profile.name)

    /**
     * Pass in a profile identifier.
     *
     * @param profileName profile identifier
     * @return builder instance
     */
    fun profile(profileName: String): Encrypt

    /**
     * Encrypt the given data yielding the ciphertext.
     *
     * @param plaintext plaintext
     * @return result and ciphertext
     * @throws IOException in case of an IO error
     * @throws KeyIsProtected if at least one signing key cannot be unlocked
     */
    @Throws(IOException::class, KeyIsProtected::class)
    fun plaintext(plaintext: InputStream): ReadyWithResult

    /**
     * Encrypt the given data yielding the ciphertext.
     *
     * @param plaintext plaintext
     * @return result and ciphertext
     * @throws IOException in case of an IO error
     * @throws KeyIsProtected if at least one signing key cannot be unlocked
     */
    @Throws(IOException::class, KeyIsProtected::class)
    fun plaintext(plaintext: ByteArray): ReadyWithResult =
        plaintext(plaintext.inputStream())
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy