From 1560980c7e4aaaf51a9cfe1c532238c4c767a727 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Wed, 9 Jul 2025 14:09:47 +0200 Subject: [PATCH] Even more fuzzing --- .../OpenPgpMessageInputStream.kt | 44 +- .../TeeBCPGInputStream.kt | 8 +- .../kotlin/org/pgpainless/sop/DecryptImpl.kt | 27 +- .../fuzzing/EncryptedMessageFuzzingTest.java | 414 +++--------------- ...h-016417ab22e685a205fb1ba24fca0c0abdfbf024 | 1 + ...h-4360ccd96e058fd2f83627a36f849592c6c4f113 | Bin 0 -> 125 bytes ...h-5beb6a9df56d2215eb9058bd241d195a41a3d5be | 1 + ...h-674d33e75e52b105c63919aed5341f44ee6d34b4 | 1 + ...h-69b4c08f74f9653ddf0bd13fd042638fafee18ab | 1 + ...h-6baebbe06e92c73d2cc41e2cd5eb358a07f34420 | Bin 0 -> 112 bytes ...h-7a28ce2dfca01ededa28577f0397be089cbb5193 | 1 + ...h-87b6b9d7de833ac9c1b42049a591b84b9cd4a937 | 1 + ...h-91508c7a3d06501d324f4769f702818dc882cb53 | 1 + ...h-9991f110a0c43a7b68c355be88fbcb4f858ba523 | 1 + ...h-a6688e26770eba930d1f4450628284f7e54a188e | 1 + ...h-b91786eba970d3f88e028504a52d00df2767ae30 | 1 + ...h-c01c76683093e04c68ebde60e0db25493521887c | 1 + ...h-dd1bb74569f01fb452bc39370230fb8fe2fac7e2 | 1 + ...h-f1916a406490728f771aae506c3e09c8b2cd446b | 1 + ...h-f90880b9a49f13e75778cbf94d7d47feec11f941 | 1 + ...raft-koch-eddsa-for-openpgp-00.rfc4880.pgp | 1 + ...-koch-eddsa-for-openpgp-00.rfc4880.pgp.asc | 8 + .../decryptFuzzedMessage/password.rfc4880.pgp | 1 + .../password.rfc4880.pgp.asc | 7 + .../decryptFuzzedMessage/rfc4880.rfc4880.pgp | Bin 0 -> 593 bytes .../rfc4880.rfc4880.pgp.asc | 17 + .../org/pgpainless/sop/fuzzing/generate.sh | 34 ++ .../draft-koch-eddsa-for-openpgp-00.cert.asc | 21 + .../draft-koch-eddsa-for-openpgp-00.cert.pgp | Bin 0 -> 680 bytes .../draft-koch-eddsa-for-openpgp-00.key.asc | 23 + .../sop/fuzzing/testKeys/rfc4880.cert.asc | 87 ++++ .../sop/fuzzing/testKeys/rfc4880.cert.pgp | Bin 0 -> 3887 bytes .../sop/fuzzing/testKeys/rfc4880.key.asc | 168 +++++++ 33 files changed, 509 insertions(+), 365 deletions(-) create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-016417ab22e685a205fb1ba24fca0c0abdfbf024 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-4360ccd96e058fd2f83627a36f849592c6c4f113 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-5beb6a9df56d2215eb9058bd241d195a41a3d5be create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-674d33e75e52b105c63919aed5341f44ee6d34b4 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-69b4c08f74f9653ddf0bd13fd042638fafee18ab create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-6baebbe06e92c73d2cc41e2cd5eb358a07f34420 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-7a28ce2dfca01ededa28577f0397be089cbb5193 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-87b6b9d7de833ac9c1b42049a591b84b9cd4a937 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-91508c7a3d06501d324f4769f702818dc882cb53 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-9991f110a0c43a7b68c355be88fbcb4f858ba523 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-a6688e26770eba930d1f4450628284f7e54a188e create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-b91786eba970d3f88e028504a52d00df2767ae30 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-c01c76683093e04c68ebde60e0db25493521887c create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-dd1bb74569f01fb452bc39370230fb8fe2fac7e2 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-f1916a406490728f771aae506c3e09c8b2cd446b create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-f90880b9a49f13e75778cbf94d7d47feec11f941 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/draft-koch-eddsa-for-openpgp-00.rfc4880.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/draft-koch-eddsa-for-openpgp-00.rfc4880.pgp.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/password.rfc4880.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/password.rfc4880.pgp.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/rfc4880.rfc4880.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/rfc4880.rfc4880.pgp.asc create mode 100755 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/generate.sh create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/draft-koch-eddsa-for-openpgp-00.cert.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/draft-koch-eddsa-for-openpgp-00.cert.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/draft-koch-eddsa-for-openpgp-00.key.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/rfc4880.cert.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/rfc4880.cert.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/rfc4880.key.asc diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/decryption_verification/OpenPgpMessageInputStream.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/decryption_verification/OpenPgpMessageInputStream.kt index bd24b245..5524dcae 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/decryption_verification/OpenPgpMessageInputStream.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/decryption_verification/OpenPgpMessageInputStream.kt @@ -139,7 +139,11 @@ class OpenPgpMessageInputStream( // Comsume packets, potentially stepping into nested layers layer@ while (run { - packet = pIn.nextPacketTag() + packet = try { + pIn.nextPacketTag() + } catch (e: NoSuchElementException) { + throw MalformedOpenPgpMessageException(e.message) + } packet } != null) { @@ -206,12 +210,25 @@ class OpenPgpMessageInputStream( syntaxVerifier.next(InputSymbol.LITERAL_DATA) val literalData = packetInputStream!!.readLiteralData() + val streamEncoding = try { + StreamEncoding.requireFromCode(literalData.format) + } catch (e: NoSuchElementException) { + throw PGPException("Invalid stream encoding format encountered: ${literalData.format}; ${e.message}") + } + + val fileName = try { + literalData.fileName + } catch (e: IllegalArgumentException) { + // Non UTF8 + throw PGPException("Cannot decode literal data filename: ${e.message}") + } + // Extract Metadata layerMetadata.child = LiteralData( - literalData.fileName, + fileName, literalData.modificationTime, - StreamEncoding.requireFromCode(literalData.format)) + streamEncoding) nestedInputStream = literalData.inputStream } @@ -221,10 +238,16 @@ class OpenPgpMessageInputStream( signatures.enterNesting() val compressedData = packetInputStream!!.readCompressedData() + val compAlg = try { + CompressionAlgorithm.requireFromId(compressedData.algorithm) + } catch (e: NoSuchElementException) { + throw PGPException(e.message) + } + // Extract Metadata val compressionLayer = CompressedData( - CompressionAlgorithm.requireFromId(compressedData.algorithm), + compAlg, layerMetadata.depth + 1) LOGGER.debug( @@ -324,6 +347,11 @@ class OpenPgpMessageInputStream( "Symmetrically Encrypted Data Packet at depth ${layerMetadata.depth} encountered.") syntaxVerifier.next(InputSymbol.ENCRYPTED_DATA) val encDataList = packetInputStream!!.readEncryptedDataList() + if (encDataList.isEmpty) { + LOGGER.debug( + "Missing encrypted session key packet.") + return false + } if (!encDataList.isIntegrityProtected && !encDataList.get(0).isAEAD) { LOGGER.warn("Symmetrically Encrypted Data Packet is not integrity-protected.") if (!options.isIgnoreMDCErrors()) { @@ -546,7 +574,13 @@ class OpenPgpMessageInputStream( pkesk: PGPPublicKeyEncryptedData ): Boolean { try { - val decrypted = pkesk.getDataStream(decryptorFactory) + val decrypted = try { + pkesk.getDataStream(decryptorFactory) + } catch (e: ClassCastException) { + throw PGPException(e.message) + } catch (e: IllegalArgumentException) { + throw PGPException(e.message) + } val sessionKey = SessionKey(pkesk.getSessionKey(decryptorFactory)) throwIfUnacceptable(sessionKey.algorithm) diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/decryption_verification/TeeBCPGInputStream.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/decryption_verification/TeeBCPGInputStream.kt index a9b353ca..83b461a1 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/decryption_verification/TeeBCPGInputStream.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/decryption_verification/TeeBCPGInputStream.kt @@ -17,6 +17,7 @@ import org.bouncycastle.openpgp.PGPOnePassSignature import org.bouncycastle.openpgp.PGPPadding import org.bouncycastle.openpgp.PGPSignature import org.pgpainless.algorithm.OpenPgpPacket +import org.pgpainless.exception.MalformedOpenPgpMessageException /** * Since we need to update signatures with data from the underlying stream, this class is used to @@ -61,7 +62,12 @@ class TeeBCPGInputStream(inputStream: BCPGInputStream, outputStream: OutputStrea fun readEncryptedDataList(): PGPEncryptedDataList { delayedTee.squeeze() - return PGPEncryptedDataList(packetInputStream) + return try { + PGPEncryptedDataList(packetInputStream) + } catch (e: IllegalArgumentException) { + // Mismatched SKESK / SEIPD version + throw MalformedOpenPgpMessageException(e.message) + } } fun readOnePassSignature(): PGPOnePassSignature { diff --git a/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/DecryptImpl.kt b/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/DecryptImpl.kt index de2b2b3c..45210683 100644 --- a/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/DecryptImpl.kt +++ b/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/DecryptImpl.kt @@ -4,6 +4,7 @@ package org.pgpainless.sop +import org.bouncycastle.bcpg.UnsupportedPacketVersionException import java.io.IOException import java.io.InputStream import java.io.OutputStream @@ -15,6 +16,7 @@ import org.pgpainless.algorithm.SymmetricKeyAlgorithm import org.pgpainless.decryption_verification.ConsumerOptions import org.pgpainless.exception.MalformedOpenPgpMessageException import org.pgpainless.exception.MissingDecryptionMethodException +import org.pgpainless.exception.ModificationDetectionException import org.pgpainless.exception.WrongPassphraseException import org.pgpainless.util.Passphrase import sop.DecryptionResult @@ -23,6 +25,8 @@ import sop.SessionKey import sop.exception.SOPGPException import sop.operation.Decrypt import sop.util.UTF8Util +import java.util.zip.ZipException +import kotlin.NoSuchElementException /** Implementation of the `decrypt` operation using PGPainless. */ class DecryptImpl : Decrypt { @@ -53,15 +57,32 @@ class DecryptImpl : Decrypt { throw SOPGPException.BadData(e) } catch (e: IOException) { throw SOPGPException.BadData(e) - } finally { + } catch (e: UnsupportedPacketVersionException) { + throw SOPGPException.BadData(e) + } catch (e: ModificationDetectionException) { + throw SOPGPException.BadData(e) + } + finally { // Forget passphrases after decryption protector.clear() } return object : ReadyWithResult() { override fun writeTo(outputStream: OutputStream): DecryptionResult { - Streams.pipeAll(decryptionStream, outputStream) - decryptionStream.close() + try { + Streams.pipeAll(decryptionStream, outputStream) + decryptionStream.close() + } catch (e: MalformedOpenPgpMessageException) { + throw SOPGPException.BadData(e) + } catch (e: ModificationDetectionException) { + throw SOPGPException.BadData(e) + } catch (e: ZipException) { + throw SOPGPException.BadData(e) + } catch (e: IOException) { + throw SOPGPException.BadData(e) + } catch (e: NoSuchElementException) { + throw SOPGPException.BadData(e) + } val metadata = decryptionStream.metadata if (!metadata.isEncrypted) { diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTest.java index fb830b71..7a2c18c0 100644 --- a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTest.java +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTest.java @@ -2,14 +2,34 @@ package org.pgpainless.sop.fuzzing; import com.code_intelligence.jazzer.api.FuzzedDataProvider; import com.code_intelligence.jazzer.junit.FuzzTest; +import org.bouncycastle.util.encoders.Hex; +import org.bouncycastle.util.io.Streams; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.pgpainless.exception.ModificationDetectionException; import org.pgpainless.sop.SOPImpl; import sop.SOP; +import sop.exception.SOPGPException; +import sop.operation.Decrypt; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URI; +import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; public class EncryptedMessageFuzzingTest { @@ -17,351 +37,35 @@ public class EncryptedMessageFuzzingTest { private final String password = "sw0rdf1sh"; private final byte[] data = "Hello, World!\n".getBytes(StandardCharsets.UTF_8); - private final String draftKochEddsaForOpenPGP00Key = "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" + - "Comment: 015A 5712 B4A1 B9E0 7504 4359 DCCF 0A79 79D7 FCEC\n" + - "Comment: Alice \n" + - "\n" + - "xVgEaG4qsRYJKwYBBAHaRw8BAQdA6Zj+CYg+8An51lmhdS74yBVJCb9F89fN6QB4\n" + - "bPI5JdoAAP40iGbC9y9PDYNgWz+4aOA7n4z/uQrq0PG5+4ymzDMboBJUzRxBbGlj\n" + - "ZSA8YWxpY2VAcGdwYWlubGVzcy5vcmc+wp8EExYKAFEFgmhuKrEJENzPCnl51/zs\n" + - "FqEEAVpXErShueB1BENZ3M8KeXnX/OwCmwEFFQoJCAsFFgIDAQAECwkIBwknCQEJ\n" + - "AgkDCAECngkFiQlmAYACmQEAAOdbAQCxZmiNa25K/rwr1+bbsH04BeloaD0n8yvr\n" + - "2L9E0AwQoAEA8w/L223ea71Ed/6GC+lFRnbxfO8vJbvy3F+vo90CPQ7HWARobiqx\n" + - "FgkrBgEEAdpHDwEBB0BFiPqvr2l/XW7CEL2yGgfJW20Skbl6TT5qx/m7NNHaAgAA\n" + - "/1Pn/E/7F8lymfTznRcEpbjta0h4ixVvpuMfyxqVCBuIEVrCwBgEGBYKAIoFgmhu\n" + - "KrEJECYeAW88jxbsFqEEPT26IQxqpOidag2lJh4BbzyPFuwCmwJfIAQZFgoABgWC\n" + - "aG4qsQAKCRAmHgFvPI8W7JpmAQDcbCGDrF2laIk9TAuOFSXE6eMPPymHyyNXQHx/\n" + - "zRvRzgEAmrmbuDEBEDjavY7D3BpvBjeNd705IraIrz+P1FQHPwcAALLlAP9y8YqE\n" + - "ejUZym5U7O38WBT1PpU7rbT+Zk1tZAGEa2Se7QD/btbhZc4KPjpsrExNRsPPhv7E\n" + - "mXIQvy+oGnqIW3TXCwDHXQRobiqxEgorBgEEAZdVAQUBAQdAbEIG4ce4EEY8UOQP\n" + - "OIN9tQMYgehkArtx1OImoTTslxgDAQgHAAD/WWzY2QXSnQ2pIGDU2Pc8OVvQ5tnS\n" + - "ASZPsTDsBTUnOdAQoMJ4BBgWCgAqBYJobiqxCRBOSsimV0t1yxahBHM8Ont4ioLt\n" + - "hxtXtk5KyKZXS3XLApsMAAD/0QD+Ndq3yXurDIZxFNemx5HJ3Omz+tBaJZf5DsJY\n" + - "ymshOtgA/AqZacPh+K15PtPB6wd3I3nDou7ZFnaL4vczXu9QRBcO\n" + - "=F7NV\n" + - "-----END PGP PRIVATE KEY BLOCK-----"; - private final String rfc4880_rsa4096Key = "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" + - "Comment: 0006 CDA2 AD82 9CC8 750A B7CA A992 50AB 54CF 91C7\n" + - "Comment: Alice \n" + - "\n" + - "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\n" + - "=y73F\n" + - "-----END PGP PRIVATE KEY BLOCK-----"; - private final String rfc6637_nist_p256Key = "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" + - "Comment: 676E A02C 0524 D5A1 7E2E 35DA 88BF B5EA 7283 A28D\n" + - "Comment: Alice \n" + - "\n" + - "xXcEaG4r2xMIKoZIzj0DAQcCAwRbPwcrdsS/qStWtWMqgvEMecs85/AO+9hQmGMX\n" + - "JEwJ0m7FVuRax9tNy7AsNtELwhqX86oHV5M4jXgJJftIQU6LAAEArRyV6Vgzpr7I\n" + - "OqYVAgAMGWqAkkwwXOEq+ukxy1thY2IN2s0cQWxpY2UgPGFsaWNlQHBncGFpbmxl\n" + - "c3Mub3JnPsKfBBMTCgBRBYJobivbCRCIv7XqcoOijRahBGduoCwFJNWhfi412oi/\n" + - "tepyg6KNApsBBRUKCQgLBRYCAwEABAsJCAcJJwkBCQIJAwgBAp4JBYkJZgGAApkB\n" + - "AAC5kwEA/csN9PMen64EB89uxa1lSkbCvFNHEFEdvbL5pHYJnO8BAKkdfG/2pfkl\n" + - "maj+yrz8jZJSxUOpk70ChPJMM4XSYQryx3cEaG4r2xMIKoZIzj0DAQcCAwT32mVR\n" + - "AVXGPEcOwy8Cp6oQDoVOEX+uSzeuiHllIIMsA+4/tqL6UCcrmy2exvuAKzZATdTr\n" + - "XNpJCveYhkgGQrZ5AAEAprKnzjgtXFCUUJcDxiMgMkRTTin2mkt6CbvYfkVe6wcN\n" + - "qsLAGAQYEwoAigWCaG4r2wkQKQ/gNDNFyqEWoQTg31jM2Fu4SJ69chspD+A0M0XK\n" + - "oQKbAl8gBBkTCgAGBYJobivbAAoJECkP4DQzRcqh4HcA/1duhOn9b9+Slp7mU0cI\n" + - "8MasqP670nJqYSnCK+FQein5AP9ypyOVaaBUzpvcssM0tQ5eAqowGr8AeWaWVgWd\n" + - "ooAvEgAAreIA/j1T1rhE6HT5Qx9VqhOSNlLvocXn7FZE6R0mSbUM8fQoAQCKqboL\n" + - "EFyQgHqtd/1cwE7XCoP9XGpeR/wrrlu+C8fEKMd7BGhuK9sSCCqGSM49AwEHAgME\n" + - "NBcdejsLU0f8PySxVheQDbIBgBTb96AzFXP7R43JwGP5fwVqdFtm6+c8uIs9MGPu\n" + - "fploeKB8rJy5pYCQdOLP7gMBCAcAAQCD5MOaoblzvaZY45owlK1Ql9+Pjy9guvYP\n" + - "Aq8pVMv8FhF4wngEGBMKACoFgmhuK9sJEHCEoMs7Vp9lFqEECCC6yX4Ec3rhHBTY\n" + - "cISgyztWn2UCmwwAAMMoAQDJ/7MYCcccQ9/3TTxT8pmSsDiNyw2EVw3gdx/Wgda4\n" + - "+QD/ZiadfaINnG+cL/70xG3Nk6Zq7cj8HpplS+eioH8T0D4=\n" + - "=vt0e\n" + - "-----END PGP PRIVATE KEY BLOCK-----\n"; - private final String rfc6637_nist_p384Key = "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" + - "Comment: 94F6 9FC9 FAD5 1B28 C7E3 6194 30AE 6C4E C0DD 7A36\n" + - "Comment: Alice \n" + - "\n" + - "xaQEaG4sORMFK4EEACIDAwSwoS/xK6vbTSP9+rvlW4bHyEOux6RXB8WozeIgJ4pG\n" + - "0Da8tyDRaRRwIWDHZANUaOl6Iq6KVTZmEZCq65IvxOwC3lwFPILlTIBlgn3kBNFX\n" + - "nVPrmEyHuR1kzyVzdegSPicAAX43CTFhi/T6NXA+KIMXLI8Gs03JHG8Xe2XgzHEW\n" + - "vZG0QhiLK5c4fN2riZKvaSKviwUVJ80cQWxpY2UgPGFsaWNlQHBncGFpbmxlc3Mu\n" + - "b3JnPsK/BBMTCgBRBYJobiw5CRAwrmxOwN16NhahBJT2n8n61Rsox+NhlDCubE7A\n" + - "3Xo2ApsBBRUKCQgLBRYCAwEABAsJCAcJJwkBCQIJAwgBAp4JBYkJZgGAApkBAACt\n" + - "ZQGA1f6gMWWf+jRIX/BP57hkTpNPpXWb391p/HmQeaq976nJu9pf/2NqkXcY2LXl\n" + - "WiFYAX9gxaP1l1UwIvQza7bTfvurt3NKY73NHtYnkEdRKfrkF8BoLO0EPiWbnKAj\n" + - "4uQvDnDHpARobiw5EwUrgQQAIgMDBC/URxDZzlFngKNcheVX7I38zD6WM5XI/EWD\n" + - "lPZwU27qjNuDYm/MaRGNVUwwGBz/IVyuv2gkKhM77fdvCXiw7Cp048XJxRqQgbT2\n" + - "eHMxV0WDktdOiQPmbiPl3f+WUIi26gABgKFPNs1Zc5B34skW4ekDjTG+AN3CaPyN\n" + - "9JQw8m42NgU4zLFYBO/RPQM2BURW84+jVBfJwsBYBBgTCgCqBYJobiw5CRDIOxbO\n" + - "vwEL8xahBEyydor1aZucFc968Mg7Fs6/AQvzApsCfyAEGRMKAAYFgmhuLDkACgkQ\n" + - "yDsWzr8BC/MOLgF/WryQUQDFJbnOnL7DfIH9pSuQyzoXV2NMuI+boBY4vNGOKldD\n" + - "ARHhD7JlYcojotZoAYC8g+LlQtiNM+pwvAyDrABZJlsJ8It61otVN6ZZ7s5XtFbc\n" + - "ejdOPAjFQwLUnmFUkZ0AAHTLAYD/J4/idYykPWjVBkCYj5H1cjUB0s9SA/Gzg265\n" + - "SivgRK7uftq/FKcTWJvgeyzZMDYBf1m1KR/8MXSxueFMXh5dOHtB7knidlJhoCx7\n" + - "WAid5lRLjLNicmKgTrSn8WFPJcMno8eoBGhuLDkSBSuBBAAiAwMEgmwL/2Pnbtnj\n" + - "I7yT0RXdqKqedkcdAWO4nYXFgSEIry6D91OsU7w2zjlY4A6OwH9CcEzCIFzxdd9b\n" + - "e6lJMgt4Jo7jL0BHKQGI1g+wjAhFE1OPDUKyowG6Jg3f/ClIhRcnAwEJCAABf3vS\n" + - "le9oR3yjGqDBUoQbjpjGOVqdY9U3KwmF4pVG4IO7KBfz4hb0ac8mKAQ+yT0kchcs\n" + - "wpgEGBMKACoFgmhuLDkJEM01rTUhRvQBFqEEdXycZR2JfwMHDpXIzTWtNSFG9AEC\n" + - "mwwAAL/lAYC6abLpSzdONnsbU/4l2pUDspW6nlwQCubpHEYK/wILu/VxsKOnkGY9\n" + - "AoI8XJ4FD1oBgN0YaQbzLwcyokZDkv6Qs61J0vJdLIQqcs2Pg3Sgz9z2/RGmn3Cf\n" + - "ulVQ7f+i2iXPiw==\n" + - "=REc7\n" + - "-----END PGP PRIVATE KEY BLOCK-----"; - private final String rfc6637_nist_p521Key = "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" + - "Comment: DFDE 25E0 9BB5 1B3E BF54 2464 F66D 7C1B 5CA1 6CFA\n" + - "Comment: Alice \n" + - "\n" + - "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\n" + - "=k2f9\n" + - "-----END PGP PRIVATE KEY BLOCK-----"; - private final String rfc9580_curve25519Key = "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" + - "Comment: B314DED9 261228B2 B0D532BB F51BDBA2 A9D82A96 72E72026\n" + - "Comment: 05753EE3 3D0384DF\n" + - "Comment: Alice \n" + - "\n" + - "xUsGaG4s6BsAAAAg7gPWPUygdAOQ2UpKq9OVrAwgkwyyNAiWdOLaz5fVdyoA5yP3\n" + - "L0YRfI1gpqf/xpPBDXqxJfG2WQAeONgURB9VGY7NHEFsaWNlIDxhbGljZUBwZ3Bh\n" + - "aW5sZXNzLm9yZz7CwAIGExsKAAAAUwWCaG4s6CKhBrMU3tkmEiiysNUyu/Ub26Kp\n" + - "2CqWcucgJgV1PuM9A4TfApsBBRUKCQgLBRYCAwEABAsJCAcJJwkBCQIJAwgBAp4J\n" + - "BYkJZgGAApkBAAAAAIhfICpt+6KTUR1hPhrFhUBIhOIOCWYaq+T7LQvjZqVCJGCV\n" + - "yQmNkiWif60p8yoNt98xeluWJR1JzlgELas6Yk3VwwCovCG5f6Wy+N24al/7QRcW\n" + - "P8OoY/QC26iq6fa89OCaBcdLBmhuLOgbAAAAIC5xzZC2SfJ4EmHdm8gQ2kSK70gF\n" + - "CNft4Cp1QHrrJ6ztADbMh1VLxMh6NDv7veidlpt/QYOLYu0q3GiSuMSedEdAwsB1\n" + - "BhgbCgAAAMYFgmhuLOgioQY+0msPIWONP74ILxChN8KYq4YthwEyleVGRCOnFYJh\n" + - "uQKbApkgBhkbCgAAACkioQY+0msPIWONP74ILxChN8KYq4YthwEyleVGRCOnFYJh\n" + - "uQWCaG4s6AAAAABkmSAm81g4eLBFV/+NqyCC0zVeoogB6sHzyggIOa+N9SU91nKW\n" + - "RpxbMjBngqAgJfGMQMPcJVrk+OZq5qtO/ymLF3ZstWDUFkz4TjUTE3Rnwcq1cZSF\n" + - "aTM8b1tU9x/THu/QIwUAAAAAOoUgStz+zEYrGa9RJZflAOKqRnrV982sbwSSVxlX\n" + - "ZM5lDxho4V/ml4FMLSimsaayKQvgLGG0D9CY/DAaFG6swR0a6vhJGIXmG/yFnjZV\n" + - "O8Nag3ILTRQROo+EGsxF1GKVjXkBx0sGaG4s6BkAAAAg2DMyEKVzvpAmKIySltDq\n" + - "yTecz3rJaB2wgMy/ezzMTAUAyEfaLkpWJQn1tas2LmLwQozm40gArZM/LWEhb06E\n" + - "0mfCmwYYGwoAAAAsBYJobizoIqEGeK8FaQTzFASP/wgCezMGLDt/wWgRPECuIUpi\n" + - "uvP1TX4CmwwAAAAAWZogQKL+ST9ooOeA4yY17pNcc4xIJCxHcOyBHnDTVLEaVvpA\n" + - "sH4w8cwCObiCuWFlZV0OT98grtvKB9d8wvXHFgVdQIXFfxpH0U9A69stD40WnUcq\n" + - "rSoALRT/UC0knHxQC1EC\n" + - "=P0v2\n" + - "-----END PGP PRIVATE KEY BLOCK-----"; - private final String rfc9580_curve448Key = "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" + - "Comment: B1B2466D 4B443432 425AE494 229AD153 0DDBA981 DB39CE5A\n" + - "Comment: B2A12078 D8489849\n" + - "Comment: Alice \n" + - "\n" + - "xX0GaG4tJhwAAAA5TzpWwV5T+9yxlRTfE0vF4tVIy4Go/Ki5O8iuyJe7HytlQa2k\n" + - "CICNWr/E/COtvaULPJpWc3HnNdoAAHQ4BZAMyYJr6mBnbOmAUEYc1ICMEBZhnYtN\n" + - "og896p/k3NhZc9stwb1eNFlNPV/ggt8LBcGuyTfiDc0cQWxpY2UgPGFsaWNlQHBn\n" + - "cGFpbmxlc3Mub3JnPsLANAYTHAoAAABTBYJobi0mIqEGsbJGbUtENDJCWuSUIprR\n" + - "Uw3bqYHbOc5asqEgeNhImEkCmwEFFQoJCAsFFgIDAQAECwkIBwknCQEJAgkDCAEC\n" + - "ngkFiQlmAYACmQEAAAAAwTkg/uSWDcdMxaU0dmX589uo6mDbA41RjbIV4WNM0rPp\n" + - "c+ReYsDP0BdX1PMm0PNwmIDt6iiasgOY/+jMd1y9UN1aXToIMrizUophUvg4eVhi\n" + - "F+0MT4eyIDjjdQAZv2evwLE3pkAPmi2D4LJ0d1cBLYAYAb4oMANUJXeDJsPWMf4Z\n" + - "wIC9Wmr7TjSQRE5R6wXdh9cUEQDHfQZobi0mHAAAADm9lpUPfcAunOlcevNCNt6W\n" + - "FAlmRn3QY+yT8cEFbfrflPzxB2uLwBDITX8mIKuTxEo651C4fNSdmQAALB7qjJSi\n" + - "ew0rTFgqsZv6ud5aFR+vjpbHiQXkXQZ25BegJNut+tuvsj3SzxNNaAunKNgPXkx4\n" + - "b8jZwsDaBhgcCgAAAPkFgmhuLSYioQbb/ck2OY9t+zdD+42TydVXF9yfj7Zns9sq\n" + - "70urK/wNtQKbAsALIAYZHAoAAAApIqEG2/3JNjmPbfs3Q/uNk8nVVxfcn4+2Z7Pb\n" + - "Ku9Lqyv8DbUFgmhuLSYAAAAAFg0giil1++wOpbPp08JikLQoO6n2B42gVIIuNo1t\n" + - "ZH40/eI3tHLWtuWwvADiBtP+MWA/fCu5BjUNlrUSo/l58IvYAuL83r23hZbkB93P\n" + - "S4x2zTIcPV/EmCd/KIA9hk8TjlN3FE2nqBUsytNb8fVDa6RfknvONhG6aSRaYHSm\n" + - "cC5ijnZb5CMF6q9flVkdmULlBjyINAAAAAAAxeMgIVnKE/QZlRc9XKI9nOySipMe\n" + - "y0YXUJAH9beCkGnj91KlCLAOvRIPGl+g9avbLVrEISSYLWXXWt5QpcL+v50dYixO\n" + - "Dcw03lElwTb8tViclp8hoLdyGmre+QCLcn82w5bjSbJmUuSWUzaxdXt8mwhcsm8C\n" + - "7nPWom+VKK2gmMhW+iIPCbZRq7mFXTlSyx5dewEmNwDHewZobi0mGgAAADgCf7RH\n" + - "XYY4Iy6eJOjNMc+5Tb8FITtygbO6yD+wsNXgVeb02eolP2qhewtrOjGzBOa97bHt\n" + - "PBEPUgAcV65IaTL7hDyHliS+1Sr07g8g1e9mQEZoZpfL0mAMhDp2cKVH4JP+EcZ1\n" + - "Z28FVdMyCaMbZRnho8LADQYYHAoAAAAsBYJobi0mIqEGyDW+wOEE70nUm3kUGUr4\n" + - "n/fvzk39E1FDfJM+CfjryzICmwwAAAAA2VsgR8S9//EIwf9HEHzqFc8KrpviwOBC\n" + - "sqyKZrtH3wTzU9AIn2Ljhm40/RW5hKjXn/ChmQFgjplY+3vYz5ygmUooiNTt95LK\n" + - "oRAFD/6/ZuugybGrqfgMGHs50gDKf+unENCOBzh5M68ERszNVDyqcKaYrqLEX/s1\n" + - "s8z1wxR1F9ktlnwfqejv0XkUPIF+nRgSWv8ABgA=\n" + - "=9CEB\n" + - "-----END PGP PRIVATE KEY BLOCK-----"; + private static List keys; + + @BeforeAll + public static void setup() throws IOException { + keys = getKeys(); + } + + private static List getKeys() throws IOException { + List keys = new ArrayList<>(); + + String dir = "/org/pgpainless/sop/fuzzing/testKeys"; + InputStream in = EncryptedMessageFuzzingTest.class.getResourceAsStream(dir); + BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + + String file; + while ((file = reader.readLine()) != null) { + if (!file.endsWith(".key.asc")) { + continue; + } + + try(InputStream fIn = EncryptedMessageFuzzingTest.class.getResourceAsStream(dir + "/" + file)) { + byte[] b = Streams.readAll(fIn); + keys.add(b); + } + } + reader.close(); + + return keys; + } @FuzzTest public void decryptFuzzedMessage(FuzzedDataProvider provider) { @@ -370,23 +74,21 @@ public class EncryptedMessageFuzzingTest { return; } - System.out.println(new String(rfc4880_rsa4096Key)); - try { - byte[] decrypted = sop.decrypt() - .withKey(draftKochEddsaForOpenPGP00Key.getBytes(StandardCharsets.UTF_8)) - .withKey(rfc4880_rsa4096Key.getBytes(StandardCharsets.UTF_8)) - .withKey(rfc6637_nist_p256Key.getBytes(StandardCharsets.UTF_8)) - .withKey(rfc6637_nist_p384Key.getBytes(StandardCharsets.UTF_8)) - .withKey(rfc6637_nist_p521Key.getBytes(StandardCharsets.UTF_8)) - .withKey(rfc9580_curve25519Key.getBytes(StandardCharsets.UTF_8)) - .withKey(rfc9580_curve448Key.getBytes(StandardCharsets.UTF_8)) - .withPassword(password) + Decrypt decrypt = sop.decrypt(); + for (byte[] k : keys) { + decrypt.withKey(k); + } + byte[] decrypted = decrypt.withPassword(password) .ciphertext(ciphertext) .toByteArrayAndResult() .getBytes(); assertArrayEquals(data, decrypted); + } catch (SOPGPException.BadData e) { + // expected + } catch (SOPGPException.CannotDecrypt e) { + // expected } catch (IOException e) { throw new RuntimeException(e); } diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-016417ab22e685a205fb1ba24fca0c0abdfbf024 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-016417ab22e685a205fb1ba24fca0c0abdfbf024 new file mode 100644 index 00000000..28453ae7 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-016417ab22e685a205fb1ba24fca0c0abdfbf024 @@ -0,0 +1 @@ +ÃÑ ޝ£î<`±!J]÷µ,Ê¥‡ tÓ ¶Ò@:¨0‘»sd³±Ÿ¢å$X“úÝ, ¿bc³v7îG‡ƒ5iU‹vžXŽVÎåØüŽÙ Ý 8ò \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-4360ccd96e058fd2f83627a36f849592c6c4f113 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-4360ccd96e058fd2f83627a36f849592c6c4f113 new file mode 100644 index 0000000000000000000000000000000000000000..698c329d259c3bfa911ac3b24d2115b1a01fbfc7 GIT binary patch literal 125 zcmX>s$HLCcbdguGZ~fwTHVGRQy<$bbb8OW)wX~h579JasDE) srz#PX=l;4Yr^CavJt=u}nK|P-_x5H+Mg}4@NcWnqX`HI$4FlJb0pNl(L;wH) literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-5beb6a9df56d2215eb9058bd241d195a41a3d5be b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-5beb6a9df56d2215eb9058bd241d195a41a3d5be new file mode 100644 index 00000000..08115d7e --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-5beb6a9df56d2215eb9058bd241d195a41a3d5be @@ -0,0 +1 @@ +ÃÑ ޝ£î<`±!J]÷µ,Ê¥‡ tÓ ¶ÒóŽVÎåØüŽÙ Ý 3 \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-674d33e75e52b105c63919aed5341f44ee6d34b4 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-674d33e75e52b105c63919aed5341f44ee6d34b4 new file mode 100644 index 00000000..944bbe04 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-674d33e75e52b105c63919aed5341f44ee6d34b4 @@ -0,0 +1 @@ +ÃÑ ޝ£î<`±!J]÷µ,Ê¥‡ tÓ ¶Ò@:¨0‘»sd³±Ÿ¢å$X“úÝ, ·bc³v7îG‡ƒ5iUIìæ¦l 'Š,¿½£w—Ñ/3OÖc \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-69b4c08f74f9653ddf0bd13fd042638fafee18ab b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-69b4c08f74f9653ddf0bd13fd042638fafee18ab new file mode 100644 index 00000000..e5733fd8 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-69b4c08f74f9653ddf0bd13fd042638fafee18ab @@ -0,0 +1 @@ +ÃÑ ޝ£î<`±!J]÷µ,Ê¥‡ tÓ ¶Ò@:¨0‘»sd³±Ÿ¢å$X“úÝ, ·bc³v7îG‡ƒ5iU‹vžXŽVÎåØüŽÙ Ý 8ò \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-6baebbe06e92c73d2cc41e2cd5eb358a07f34420 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-6baebbe06e92c73d2cc41e2cd5eb358a07f34420 new file mode 100644 index 0000000000000000000000000000000000000000..27c91af09608af811d5cf62a3b334f56bef33f41 GIT binary patch literal 112 zcmX>s$HM;q|9@tti@cJTdA410V6!~pgK~+n;nAlcTA(DNWc8DajmXKSj%;2ORQP-6k)Dx{U}U2t83f<{P>mA zjxuHwfHeH0$Rnz!KJF5>0nej!in=D*tFw=C#N$-=Wef6(<|VPII8{OV&=ev8M~T1m zsm`2-lA&>OR0%)hx3?$w8Vi$!HlELB2OKA0pRb=B#jKoQ$tE;RA*{KC@>FWl^TdQ;Izq-xASfpfZfpW=FOt^fod>nYA&s#T1j5}?OU-AdD!ggb_D zpm10o>oS0v1wLHfFo*2&c(gHSNu$fkXa*UQ3G$bnZlvajxOb ff?!}f(2Hna)5=e2xv|hFM!VusPz&S~KIGSJCK)P> literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/rfc4880.rfc4880.pgp.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/rfc4880.rfc4880.pgp.asc new file mode 100644 index 00000000..8b7de1df --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/rfc4880.rfc4880.pgp.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP MESSAGE----- + +wcFMA6SJex80gcWaAQ/8C4tRTyBQhmtBERKS0VHc/nb7cS2dbr7XSMpvk53Fj9Se +qWgJloepmkFea0OGy+ectRwGFWj3Aj0bdChRbi3ipfX1QXdhAbdBTb3+GlfPkr6X +WfywYYMbKB2eoDpSw5sdgvN3TKOlSL/8snGtrkZYy3VoS6xZ9RRhrmz9KEw6q2vc +APz4ldOOMmYTgDT8o8gjqqc+7hK2Ac+jdIq6Jtmrs49yxONU92UL8ormJbGpOFVB ++tAUIgFHib/0qc6ch5KhcXJUCT/jt7cn+BoLk4U2ns9mBxwnYJ+vnxzFrJxgySY0 +TOOGxmuPQOCMZfOxme0HUROxu5xiSM6PRLWilL6YRyw3IXekfVGNeFHnsF/Rxx7c +3v9cvnsDQpGE9qRsgtxcvCGJkKnPNFRQPA/vpXB/GhrBtGLSpTMKHxbHyPsb10ZP +IN5aR37QqN7LLu1vlFdjz37CL0ib4pHEH1FvpsaY9l+nzv3eltF2U7aFHHdGQd7E +mmihSbdzRTYys2yX2P/mYVZo2j/GciGUtd9ucllouTRlBEL1IEgBSeSuaH9xYscN +u4rTDgezBS8WF9/0T8elmeTjk2RRojRGKt98HFl/YU8V/MLTDS/c7Hl6U9FIpGrM +QIFzunmf4npwrgAEH+spzl6qVYygEqDHTt1K05eEO4ZxoHBwTd9dTgRtj/b35lHS +QAHc37MCFlJVNma77AinyVs17c2kgUP+gV5Liwt07kSRca7hzYJgYDvQi2hf08pP +abmx0ChGu+JRUAvkFD7k120= +=CaPm +-----END PGP MESSAGE----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/generate.sh b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/generate.sh new file mode 100755 index 00000000..64963a44 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/generate.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +SOP=pgpainless-cli +USERID="Alice " +KEYSDIR="testKeys" +TESTDIR="EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage" + +mkdir $KEYSDIR +mkdir -p $TESTDIR + +echo "Hello, World!" > $TESTDIR/msg +echo -n "sw0rdf1sh" > $TESTDIR/pass + +gen_profiles=$($SOP list-profiles generate-key | awk '{ sub(/:$/, "", $1); print $1 }') +enc_profiles=$($SOP list-profiles encrypt | awk '{ sub(/:$/, "", $1); print $1 }') + + +for p in $gen_profiles; do + $SOP generate-key --profile=$p "$USERID" > $KEYSDIR/$p.key.asc + $SOP extract-cert < $KEYSDIR/$p.key.asc > $KEYSDIR/$p.cert.asc + $SOP dearmor < $KEYSDIR/$p.cert.asc > $KEYSDIR/$p.cert.pgp + + for m in $enc_profiles; do + $SOP encrypt --profile=$m $KEYSDIR/$p.cert.asc < $TESTDIR/msg > $TESTDIR/$p.$m.pgp.asc + $SOP dearmor < $TESTDIR/$p.$m.pgp.asc > $TESTDIR/$p.$m.pgp + done +done + +for m in $enc_profiles; do + $SOP encrypt --profile=$m --with-password=$TESTDIR/pass < $TESTDIR/msg > $TESTDIR/password.$m.pgp.asc + $SOP dearmor < $TESTDIR/password.$m.pgp.asc > $TESTDIR/password.$m.pgp +done + +rm $TESTDIR/pass $TESTDIR/msg diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/draft-koch-eddsa-for-openpgp-00.cert.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/draft-koch-eddsa-for-openpgp-00.cert.asc new file mode 100644 index 00000000..a41e9049 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/draft-koch-eddsa-for-openpgp-00.cert.asc @@ -0,0 +1,21 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: 84EA 2DE1 DF87 684D C4F1 4C4F 8D97 A0EB 70CC C181 +Comment: Alice + +mDMEaG5OBxYJKwYBBAHaRw8BAQdAbeZUgAIwxA8HtMUEV01uXdjevE5PDWChinJ9 +mEdrz/K0HEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7ClQQTFgoARwWCaG5O +BwkQjZeg63DMwYEWIQSE6i3h34doTcTxTE+Nl6DrcMzBgQKeAQKbAQUWAgMBAAQL +CQgHBRUKCQgLBYkJZgGAApkBAAAXhAEApW8e4Vofp4aS9kRchjZBlOjUkTgd24jI +9Bnc12+wswkA/3QQkdJPzlCOAhsA6JExV8pFXCPU5oOXTxeTJU8mdwUNuDMEaG5O +BxYJKwYBBAHaRw8BAQdATuMzSZ89y7XR8wJXn5l+dGcUsd0Z1KHWh3G4myfPQvXC +wBUEGBYKAH0FgmhuTgcCngECmwIFFgIDAQAECwkIBwUVCgkIC18gBBkWCgAGBYJo +bk4HAAoJEBktzDv5fvLT1hsBALtHPeLKzbjFyHb7EXC6zTJd5l9cpcgKICnIlGk5 +QJMiAQDgRe8o34sJEVSYKXpJuuJ88LONBNDm+iWxGP7f6ESKCwAKCRCNl6DrcMzB +gQmvAP40Ow7gskdm9W0e/f7XIPeHF+BkjGmL6dY446J7tmykjAD/ZkMpKEZyaXi1 +pKZfhWIKgLc1Z8utFPPcQMXlmnRTaQS4OARobk4HEgorBgEEAZdVAQUBAQdAliH3 +1osodetlQ+fAbMCKISjrQ+O2djpkY8lEPgkAdW8DAQgHwnUEGBYKAB0FgmhuTgcC +ngECmwwFFgIDAQAECwkIBwUVCgkICwAKCRCNl6DrcMzBgbMUAQCuu4RprvUFBCNG +lbWasJfuVeJOhbiZtLblkWt5ZvvG4wEAsn932ol2eX3rK4ri5h6L7msqRBMaKIHu +2egrKBc8igs= +=6VYt +-----END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/draft-koch-eddsa-for-openpgp-00.cert.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/draft-koch-eddsa-for-openpgp-00.cert.pgp new file mode 100644 index 0000000000000000000000000000000000000000..b20f645f931f82ab7bd2e796876c4a6ac58203fb GIT binary patch literal 680 zcmbPX%#xAk$1cXH&Bn;Wc*~uik&)dY_gP2-lfe;w_AN(Q!hQ2%Z`|AC=g*t4u&bzc zhI{t;Pg`Uhb25`t6>JhgltV#!L1JcJPHJ(nUVc%!-Jz*0!eU$u?yOB9lQ{)?r!RP2 zaOPm6m?BHdE8U0p+cSKReDv{$2{X-OWSY&$D#paj$iTwQ$-&Ml%EigS&DzPC#@N6# zlaYZzyoHfrX};XUDEZ}WlfJpcw3#_hd2wZ;h3xH)6JI3nT+iRInUmpviNM55{^tVv zn4}qAOf(EX3Ei$6%|$?Sf4 z&EoN*>TNkodKmtvIcsXT6=hazU9v2`HHoWXyJ`CAwIZMII2?UCt0Xv+Wrqbg+J(5l z(LOztkrfp0(-gm7>((fJo$CDjK+b_KMUB_akGGXsr6iwpvEyVY&1YuhU_Vp}4iH(S z0O7$15M&2$7GY#qx4R{C-B(r?Ww)tYXKk4NF7%OK>yDXQwmqGgU77a#*keY9P4(rs hI?F0+Uu$ + +lFgEaG5OBxYJKwYBBAHaRw8BAQdAbeZUgAIwxA8HtMUEV01uXdjevE5PDWChinJ9 +mEdrz/IAAP94BrURAVogP3wUtGpL14lIAQYANMgeUExwfYQay+t+Ygx8tBxBbGlj +ZSA8YWxpY2VAcGdwYWlubGVzcy5vcmc+wpUEExYKAEcFgmhuTgcJEI2XoOtwzMGB +FiEEhOot4d+HaE3E8UxPjZeg63DMwYECngECmwEFFgIDAQAECwkIBwUVCgkICwWJ +CWYBgAKZAQAAF4QBAKVvHuFaH6eGkvZEXIY2QZTo1JE4HduIyPQZ3NdvsLMJAP90 +EJHST85QjgIbAOiRMVfKRVwj1OaDl08XkyVPJncFDZxYBGhuTgcWCSsGAQQB2kcP +AQEHQE7jM0mfPcu10fMCV5+ZfnRnFLHdGdSh1odxuJsnz0L1AAEAyWlKBTvKIubB +l6kx0RU8uWSChrndM8ST8SAF4jvjqhoQAsLAFQQYFgoAfQWCaG5OBwKeAQKbAgUW +AgMBAAQLCQgHBRUKCQgLXyAEGRYKAAYFgmhuTgcACgkQGS3MO/l+8tPWGwEAu0c9 +4srNuMXIdvsRcLrNMl3mX1ylyAogKciUaTlAkyIBAOBF7yjfiwkRVJgpekm64nzw +s40E0Ob6JbEY/t/oRIoLAAoJEI2XoOtwzMGBCa8A/jQ7DuCyR2b1bR79/tcg94cX +4GSMaYvp1jjjonu2bKSMAP9mQykoRnJpeLWkpl+FYgqAtzVny60U89xAxeWadFNp +BJxdBGhuTgcSCisGAQQBl1UBBQEBB0CWIffWiyh162VD58BswIohKOtD47Z2OmRj +yUQ+CQB1bwMBCAcAAP9jokbt/Vs+sVFbY9pcnn/Umb/OpzNViUHmrPToDFt7yBLr +wnUEGBYKAB0FgmhuTgcCngECmwwFFgIDAQAECwkIBwUVCgkICwAKCRCNl6DrcMzB +gbMUAQCuu4RprvUFBCNGlbWasJfuVeJOhbiZtLblkWt5ZvvG4wEAsn932ol2eX3r +K4ri5h6L7msqRBMaKIHu2egrKBc8igs= +=7H8m +-----END PGP PRIVATE KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/rfc4880.cert.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/rfc4880.cert.asc new file mode 100644 index 00000000..1e0a7192 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/rfc4880.cert.asc @@ -0,0 +1,87 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: 10BE 2EEB 684A E5CA 9849 BCE1 1F4A 7593 552C AD28 +Comment: Alice + +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 +=yjFq +-----END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/rfc4880.cert.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/rfc4880.cert.pgp new file mode 100644 index 0000000000000000000000000000000000000000..84c0756caed4fc82cfe59f98057e0ca371ba9b5c GIT binary patch literal 3887 zcmZYAXD}QJ*TC^zeGyjg(V~mq>*`UWM2$pUR&R?CL<_Ro6>YWXqIW?AD|(I9MRdZ| zduMrWd7qhg=J|AH&YX{De*X-tM>vk|y7)japp$8nGHJatL$e)lM(1)8bJVCTZ>O|Kn#J~v z_}<4f22Bg053iUfB1!WWibT&uF=U*nJ6GI$%aQ9Ul|8Q8zM)?Ce~=)t=?R+oIn86b zr$W=uxApai-OHLuMg;~~3Azaaar%Wg(pxqgbF~USWD?2VTeGq?n31hwpFqqY{LVB< zW^ykfhvMIHE*2e@F8IK?7j#+Q3&%lXq7?S6StJIc( zk|>}2JaUXXi*T=^XwYMaV#mHr*FzUY_-~*v&h-}Js_SAo;FVIuJ+#E0v>P& zg|5zI910*IKm#}Yucsjbftj^@la2YSxT#rjz$k%TN3D&abj`Na|E{refLK{TTxu+A zAOMF5M1YS=MF=7w!i@&OfT36!KmY*Q1O}A%a?Zxa=-zK<+9qP$f>Z#c;8qW{9ZfS*wgMqgzAnkY3_Ne^ z^{p0ejmmoi5ky}R%6!6GWRk?RX*TeQtRtKaFFK^5V)||nvvADjyC=9t9-+5V%`Eh* zS^7F8Ua3wo#BVwImkY^H`sJLvON`6ycQ<^Qb|QrAN=>yE-Y#U0JQh9py0$n&p#Ll} z(pQvk9vOcbo#y*vIj%uLL{F$!uf$O_*KG~fm(s|7yx;0~!u72^I0K#qa7wIyS?=fF zZXyhW&&^Is-IN}YIHf6K-HxTNxW_QzAqzy|IUs0nGJ+y#_3vQxUE%tpw*TifwXq1 zj~pzg05fN(WZu>Nhk&1IvE&m!s^p`=cu{Ogthk|`zgzGSK)$$k!raIK#Uv9$}r0IT* z9q`OjqS72K$nkRIx#^{xBH8E5`lo1Q{QC>vd*Kd~Qi|gq26IK${PAdu+l2SWoznL$ z<}s^+sZq1qne?+$jTApNcjANP#*;TK{h)7X91(0~@Sk2bcdKuH9h8*@m-B{g&JWji zbA1+V-hC*dOr&YsuXhiY5qUN8Fg!cfHc$I2g?!*(&Kmbq)R1QRzLv>Eeq&h2a02h9 zdmh$GLkjgu2jBWxBXgBESf~FuwRI9T8ih1qdWwIgAFmbL8*X+*PQ2-%zi~B*U13M; zOuHRp7nN)kj)u!_!*)SDBppjDx&p>wFhgd%S5Ja5_GYGzw9HkS*V&pEWyx`;mv&M( zz#14U{i9lEWS_DV`L<0^$0S&tKSVB04p37Fst4+Ee41I;fFH1QHkx)BR5*Vv1d>-+ z39J&3d7|E8gbn<2MAr>PJW$*x4qHs$IsPzjJ-jY8p51rC*LlZe1L3a zIT!vlal>zN|o|F))QPGCF1>&q_~hml#`z1Q#vI{XT#?T%yjw$faw5 z9@P&JG@RvF7pWTc?ES}}uI?lpS|A~o+&{`N{(}hC{~*$7!Gc5gmqmF0UI7R}U{SXZ zFrKGNC+fstKsCt$;^R*F^#tsk+SteYqqyb8JCa;OZ{D8aIf3s*{S|4WRlyT_>0vTN zh}D*-);>w5D_Jyza)n~8`uzHg^Smt~J=Ys+a-iC{NU>1V!{7w0J)YlXPVo9zj_ z7INU^Uj~Jp*8{u=Us>I6sTGw$AVG6|c~O5QrHe;)N={D1hNheXbjy|gQz+EX9DbfW z6w9WuE@~##EA9Hq#I>Z#wixYcojzk0SX5!xf+RNJS1y z?f(4_|ILtsI2e$jTvYxuJLR`HgG~{~^CAj;KU-R;>|N%8{X1Kt39kN`mF;^^vcW}& z<%^EwoGh5dD#kat5Wkg7zbsVz2rm#2MLT$^9s-M(GFGIU*Zl&Gezn<=L&;-$q06+< zsHv0qC2z55^wmbS&*ykBnUZ>>O!q_hK(K~j59lnqtnnd&_FNzv62G5R=tPZdI>lL*2 z$Bfy8Dz8fB-MM(w4+0OWhXf;XbF)D+N{a8yN)&~q&8NR9rM(G%V(f&t={3i?pDiY- zs`_Qju<|v!BO#6^o;xO7z$-2dHs;uq*Z=lp_eXZymyrXFDV}dN8}?I{rP>DuPujm1 ze?6b>PHDM-V?S=6o^^m~Su5dus;y2AwvvrDxuXn;@;Ht&7Iv)Da@v2v?HaP^lG2l| z-Kj-mm~L*n(M@O^BlcmX67?9yv*in@9WNa5Y1O=XLVPyMehy7rRE6m(Oe))x4P395 zwkD^Ql4PdH-v^v>z*(8rZgWcOLV!B{yKMWMhJ_#|W%P@^C8&v~XqsL3VXIz%(+ERx z!*&OgX^T-vS!4s8-w#^z`t(JcOP`!HcB9{#5Mswj*+=2=8~Vz}T;u zz39gD|BDRcUy=Dlxw8V1_8miUI621z_>8F(aKZ_q3_k~XAH-^1VK=z{{N*i}&j&Ca zlDPE9MCQne`I>REXo%zL4>V;x8F4)?EW6aMU#=TGk_gzMbMsv+cpKbGMqcrHwS&Q@=h?YjG3HmXPD{%f@TRCg zxbwSc%0s3`4#aqI|5VG!)I$Zec_gKDr4HlG*H$yCtBk8KzN3>rzoU;LRIhk$#MO}f z`T?BGCTe@d>pp|y6V5T}8XTyt9ch3?jgmtqTt&bz1nM?HXq$*}4Eg;Fgbbx`Z}wx5 zv6+o}MCkbtwt@%U#;Gf$U$Ew!`Grc@P~sIXaR*d|MtgVFj|c{tm+Y z^3VavcWWnEhko;ZohFa>lu~DrcMI4x`*gPKQojlAc_-W&UQ{dJ*KH*)$aZ<5LaEa} z5ezSkUB9GAv%IawiIEvNzHx-^iyDH$9K=MlDapCBfl7I*Nh zVQIkf?k&QiGFzB34e{h#rUJPt`?bJhiCO$x)(i3jGl=zC6m=ySS#|ffU)m!wiutOZ z!V3S5OsDtXkpVFMlMkkUB18N?k@^3MgwK;=DBrWBsxU7I!!r}V^wI_?(f_1`5K~1l zF4~>2|M|7X3=TE;Q;|q)XRyb$t%;#`t>B!6e2M6h0V$+usGbdNUEe)s5vmf0EHEXV z=z7g2;pvYSs+W}AvVt;iI7(Y0&&xkWOX#sP&a1g>J_%+@eyrmlm{-I<8b{T=YL!ee zFg9#zCy7}V!#hd08qon3e_8BCFVK<1`0n0PdQLao4bELkxlkY5qcJivogf_RX(8dd z_HFLi{NZ8gm@gJ_OM!?hg~`_#=%4Frf_(U)R$i>*MoA7{qUsaMQ)lfJ3bpIv4 z$(eyj)HbkgHLiQ^li==sKocJ*_@~7rZUe zYw@V%GmPAK#D3Jr zg?1z;$PlHK$(^TPaH*`tS5=DDauojY`{!gIzqMv4PnXj?tO?b;i*ReaHE@o@4X+6N ZS|9Z}J7!6P`8bJl)?r5{vgjz=_CEkvQrZ9j literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/rfc4880.key.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/rfc4880.key.asc new file mode 100644 index 00000000..6f9058d2 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/testKeys/rfc4880.key.asc @@ -0,0 +1,168 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- +Comment: 10BE 2EEB 684A E5CA 9849 BCE1 1F4A 7593 552C AD28 +Comment: Alice + +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 +=jGAJ +-----END PGP PRIVATE KEY BLOCK-----