From b96f22d0a9097f1af89f8720210ea72392f8672c Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 29 Mar 2024 20:37:24 +0100 Subject: [PATCH] Add EncryptionBuilder.discardOutput() Also move NullOutputStream from pgpainless-sop to pgpainless-core --- .../encryption_signing/EncryptionBuilder.kt | 5 +++++ .../encryption_signing/EncryptionBuilderInterface.kt | 12 +++++++++++- .../kotlin/org/pgpainless/util}/NullOutputStream.kt | 2 +- .../kotlin/org/pgpainless/sop/DetachedSignImpl.kt | 7 +------ 4 files changed, 18 insertions(+), 8 deletions(-) rename {pgpainless-sop/src/main/kotlin/org/pgpainless/sop => pgpainless-core/src/main/kotlin/org/pgpainless/util}/NullOutputStream.kt (95%) diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/encryption_signing/EncryptionBuilder.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/encryption_signing/EncryptionBuilder.kt index 13785df4..6b4713d6 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/encryption_signing/EncryptionBuilder.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/encryption_signing/EncryptionBuilder.kt @@ -9,6 +9,7 @@ import org.pgpainless.PGPainless.Companion.getPolicy import org.pgpainless.algorithm.CompressionAlgorithm import org.pgpainless.algorithm.SymmetricKeyAlgorithm import org.pgpainless.algorithm.negotiation.SymmetricKeyAlgorithmNegotiator.Companion.byPopularity +import org.pgpainless.util.NullOutputStream import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -19,6 +20,10 @@ class EncryptionBuilder : EncryptionBuilderInterface { return WithOptionsImpl(outputStream) } + override fun discardOutput(): EncryptionBuilderInterface.WithOptions { + return onOutputStream(NullOutputStream()) + } + class WithOptionsImpl(val outputStream: OutputStream) : EncryptionBuilderInterface.WithOptions { override fun withOptions(options: ProducerOptions): EncryptionStream { diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/encryption_signing/EncryptionBuilderInterface.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/encryption_signing/EncryptionBuilderInterface.kt index 586fbc6e..2db98846 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/encryption_signing/EncryptionBuilderInterface.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/encryption_signing/EncryptionBuilderInterface.kt @@ -8,7 +8,7 @@ import java.io.IOException import java.io.OutputStream import org.bouncycastle.openpgp.PGPException -fun interface EncryptionBuilderInterface { +interface EncryptionBuilderInterface { /** * Create a [EncryptionStream] wrapping an [OutputStream]. Data that is piped through the @@ -19,6 +19,16 @@ fun interface EncryptionBuilderInterface { */ fun onOutputStream(outputStream: OutputStream): WithOptions + /** + * Create an [EncryptionStream] that discards the data after processing it. This is useful, e.g. + * for generating detached signatures, where the resulting signature is retrieved from the + * [EncryptionResult] once the operation is finished. In this case, the plaintext data does not + * need to be retained. + * + * @return api handle + */ + fun discardOutput(): WithOptions + fun interface WithOptions { /** diff --git a/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/NullOutputStream.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/util/NullOutputStream.kt similarity index 95% rename from pgpainless-sop/src/main/kotlin/org/pgpainless/sop/NullOutputStream.kt rename to pgpainless-core/src/main/kotlin/org/pgpainless/util/NullOutputStream.kt index 0f644881..5a3df702 100644 --- a/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/NullOutputStream.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/util/NullOutputStream.kt @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -package org.pgpainless.sop +package org.pgpainless.util import java.io.OutputStream diff --git a/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/DetachedSignImpl.kt b/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/DetachedSignImpl.kt index c3857ef5..a84ed6ef 100644 --- a/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/DetachedSignImpl.kt +++ b/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/DetachedSignImpl.kt @@ -53,15 +53,10 @@ class DetachedSignImpl : DetachedSign { } } - // When creating a detached signature, the output of the signing stream is actually - // the unmodified plaintext data, so we can discard it. - // The detached signature will later be retrieved from the metadata object instead. - val sink = NullOutputStream() - try { val signingStream = PGPainless.encryptAndOrSign() - .onOutputStream(sink) + .discardOutput() .withOptions(ProducerOptions.sign(signingOptions).setAsciiArmor(armor)) return object : ReadyWithResult() {