diff options
author | Greg Renda <104654128+gregrenda@users.noreply.github.com> | 2024-07-30 11:31:10 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-30 18:31:10 +0000 |
commit | b5b7f746dfd6cf9be752431978e05f19c5d2c2cd (patch) | |
tree | 90436dfd3dafed1924d6fca49ae9b91fbc5b710e | |
parent | 1ae6cc4c8f3e2187133bdc023f2e0e8b2aeb96d5 (diff) |
fix null pointer exception when using public only keys (#3143) (#3144)
Co-authored-by: Greg Renda <greg@renda.org>
-rw-r--r-- | crypto/pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandler.kt | 2 | ||||
-rw-r--r-- | crypto/pgpainless/src/test/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandlerTest.kt | 36 |
2 files changed, 37 insertions, 1 deletions
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 b3f2a64b..40288ffc 100644 --- a/crypto/pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandler.kt +++ b/crypto/pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandler.kt @@ -54,7 +54,7 @@ public class PGPainlessCryptoHandler @Inject constructor() : } val keyringCollection = keys - .map { key -> PGPainless.readKeyRing().secretKeyRing(key.contents) } + .mapNotNull { key -> PGPainless.readKeyRing().secretKeyRing(key.contents) } .run(::PGPSecretKeyRingCollection) val protector = SecretKeyRingProtector.unlockAnyKeyWith(Passphrase.fromPassword(passphrase)) val decryptionStream = diff --git a/crypto/pgpainless/src/test/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandlerTest.kt b/crypto/pgpainless/src/test/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandlerTest.kt index 600cc39d..55c3faeb 100644 --- a/crypto/pgpainless/src/test/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandlerTest.kt +++ b/crypto/pgpainless/src/test/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandlerTest.kt @@ -181,4 +181,40 @@ class PGPainlessCryptoHandlerTest { assertTrue { cryptoHandler.canHandle("example.com.gpg") } assertFalse { cryptoHandler.canHandle("example.com.asc") } } + + @Test + fun decryptWithPublicKeys() { + val alice = + PGPainless.generateKeyRing().modernKeyRing("Alice <owner@example.com>", KEY_PASSPHRASE) + val bob = PGPainless.generateKeyRing().modernKeyRing("Bob <owner@example.com>", KEY_PASSPHRASE) + val bobCertificate = PGPainless.extractCertificate(bob) + val aliceKey = PGPKey(PGPainless.asciiArmor(alice).encodeToByteArray()) + val bobPublicKey = PGPKey(PGPainless.asciiArmor(bobCertificate).encodeToByteArray()) + val ciphertextStream = ByteArrayOutputStream() + val encryptRes = + cryptoHandler.encrypt( + listOf(aliceKey, bobPublicKey), + PLAIN_TEXT.byteInputStream(Charsets.UTF_8), + ciphertextStream, + PGPEncryptOptions.Builder().withAsciiArmor(true).build(), + ) + assertTrue(encryptRes.isOk) + val message = ciphertextStream.toByteArray().decodeToString() + val info = MessageInspector.determineEncryptionInfoForMessage(message) + assertTrue(info.isEncrypted) + assertEquals(2, info.keyIds.size) + assertFalse(info.isSignedOnly) + + val ciphertextStreamCopy = message.byteInputStream() + val plaintextStream = ByteArrayOutputStream() + val res = + cryptoHandler.decrypt( + listOf(aliceKey, bobPublicKey), + KEY_PASSPHRASE, + ciphertextStreamCopy, + plaintextStream, + PGPDecryptOptions.Builder().build(), + ) + assertTrue(res.isOk) + } } |