From 633cbe271460980ff18a350fb6b7864a424ec83a Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Sat, 29 Oct 2022 04:36:00 +0530 Subject: feat(crypto-common): support passing arbitrary crypto options --- .../app/passwordstore/crypto/PGPDecryptOptions.kt | 21 +++++++++++++ .../app/passwordstore/crypto/PGPEncryptOptions.kt | 35 ++++++++++++++++++++++ .../crypto/PGPainlessCryptoHandler.kt | 5 +++- 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 crypto-pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPDecryptOptions.kt create mode 100644 crypto-pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPEncryptOptions.kt (limited to 'crypto-pgpainless/src/main/kotlin/app') diff --git a/crypto-pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPDecryptOptions.kt b/crypto-pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPDecryptOptions.kt new file mode 100644 index 00000000..15ce92f0 --- /dev/null +++ b/crypto-pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPDecryptOptions.kt @@ -0,0 +1,21 @@ +package app.passwordstore.crypto + +/** [CryptoOptions] implementation for PGPainless decrypt operations. */ +public class PGPDecryptOptions +private constructor( + private val values: Map, +) : CryptoOptions { + + override fun isOptionEnabled(option: String): Boolean { + return values.getOrDefault(option, false) + } + + /** Implementation of a builder pattern for [PGPDecryptOptions]. */ + public class Builder { + + /** Build the final [PGPDecryptOptions] object. */ + public fun build(): PGPDecryptOptions { + return PGPDecryptOptions(emptyMap()) + } + } +} diff --git a/crypto-pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPEncryptOptions.kt b/crypto-pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPEncryptOptions.kt new file mode 100644 index 00000000..90de6b51 --- /dev/null +++ b/crypto-pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPEncryptOptions.kt @@ -0,0 +1,35 @@ +package app.passwordstore.crypto + +/** [CryptoOptions] implementation for PGPainless encrypt operations. */ +public class PGPEncryptOptions +private constructor( + private val values: Map, +) : CryptoOptions { + + internal companion object { + const val ASCII_ARMOR = "ASCII_ARMOR" + } + + override fun isOptionEnabled(option: String): Boolean { + return values.getOrDefault(option, false) + } + + /** Implementation of a builder pattern for [PGPEncryptOptions]. */ + public class Builder { + private val optionsMap = mutableMapOf() + + /** + * Toggle whether the encryption operation output will be ASCII armored or in OpenPGP's binary + * format. + */ + public fun withAsciiArmor(enabled: Boolean): Builder { + optionsMap[ASCII_ARMOR] = enabled + return this + } + + /** Build the final [PGPEncryptOptions] object. */ + public fun build(): PGPEncryptOptions { + return PGPEncryptOptions(optionsMap) + } + } +} diff --git a/crypto-pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandler.kt b/crypto-pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandler.kt index faa94dff..91c17004 100644 --- a/crypto-pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandler.kt +++ b/crypto-pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandler.kt @@ -27,13 +27,15 @@ import org.pgpainless.exception.WrongPassphraseException import org.pgpainless.key.protection.SecretKeyRingProtector import org.pgpainless.util.Passphrase -public class PGPainlessCryptoHandler @Inject constructor() : CryptoHandler { +public class PGPainlessCryptoHandler @Inject constructor() : + CryptoHandler { public override fun decrypt( keys: List, passphrase: String, ciphertextStream: InputStream, outputStream: OutputStream, + options: PGPDecryptOptions, ): Result = runCatching { if (keys.isEmpty()) throw NoKeysProvided("No keys provided for encryption") @@ -63,6 +65,7 @@ public class PGPainlessCryptoHandler @Inject constructor() : CryptoHandler, plaintextStream: InputStream, outputStream: OutputStream, + options: PGPEncryptOptions, ): Result = runCatching { if (keys.isEmpty()) throw NoKeysProvided("No keys provided for encryption") -- cgit v1.2.3