From 0ee31b232ac7b4beda0940bcbd52fc078209dfc4 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Wed, 23 Jul 2025 11:23:34 +0200 Subject: [PATCH 01/20] Allow UserIDs with trailing/leading whitespace and escape newlines in ASCII armor --- .../org/pgpainless/key/generation/KeyRingBuilder.kt | 2 +- .../modification/secretkeyring/SecretKeyRingEditor.kt | 7 ++++--- .../src/main/kotlin/org/pgpainless/util/ArmorUtils.kt | 3 ++- .../test/java/org/pgpainless/sop/GenerateKeyTest.java | 10 ++++++++++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingBuilder.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingBuilder.kt index 05adf7d9..aacfcceb 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingBuilder.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingBuilder.kt @@ -45,7 +45,7 @@ class KeyRingBuilder : KeyRingBuilderInterface { } override fun addUserId(userId: CharSequence): KeyRingBuilder = apply { - userIds[userId.toString().trim()] = null + userIds[userId.toString()] = null } override fun addUserId(userId: ByteArray): KeyRingBuilder = diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/modification/secretkeyring/SecretKeyRingEditor.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/modification/secretkeyring/SecretKeyRingEditor.kt index ec93c6d6..56fb7695 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/modification/secretkeyring/SecretKeyRingEditor.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/modification/secretkeyring/SecretKeyRingEditor.kt @@ -569,9 +569,10 @@ class SecretKeyRingEditor( } private fun sanitizeUserId(userId: CharSequence): CharSequence = - // TODO: Further research how to sanitize user IDs. - // e.g. what about newlines? - userId.toString().trim() + // I'm not sure, what kind of sanitization is needed. + // Newlines are allowed, they just need to be escaped when emitted in an ASCII armor header + // Trailing/Leading whitespace is also fine. + userId.toString() private fun callbackFromRevocationAttributes(attributes: RevocationAttributes?) = object : RevocationSignatureSubpackets.Callback { diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/util/ArmorUtils.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/util/ArmorUtils.kt index b5d5b839..b6e802b2 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/util/ArmorUtils.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/util/ArmorUtils.kt @@ -247,7 +247,8 @@ class ArmorUtils { .add(OpenPgpFingerprint.of(publicKey).prettyPrint()) // Primary / First User ID (primary ?: first)?.let { - headerMap.getOrPut(HEADER_COMMENT) { mutableSetOf() }.add(it) + headerMap.getOrPut(HEADER_COMMENT) { mutableSetOf() } + .add(it.replace("\n", "\\n").replace("\r", "\\r")) } // X-1 further identities when (userIds.size) { diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/GenerateKeyTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/GenerateKeyTest.java index ca6df790..521cdfe0 100644 --- a/pgpainless-sop/src/test/java/org/pgpainless/sop/GenerateKeyTest.java +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/GenerateKeyTest.java @@ -100,4 +100,14 @@ public class GenerateKeyTest { assertThrows(SOPGPException.UnsupportedProfile.class, () -> sop.generateKey().profile("invalid")); } + + @Test + public void generateKeyWithNewlinesInUserId() throws IOException { + byte[] keyBytes = sop.generateKey() + .userId("Foo\n\nBar") + .generate() + .getBytes(); + + assertTrue(new String(keyBytes).contains("Foo\\n\\nBar")); + } } From 9b0a3cd4c7ffe8866ab9622fde866b79cd34a62b Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Wed, 23 Jul 2025 11:24:10 +0200 Subject: [PATCH 02/20] Do not trim passphrases automatically --- .../main/kotlin/org/pgpainless/util/Passphrase.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/util/Passphrase.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/util/Passphrase.kt index 4d1e49d2..bd25f2b9 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/util/Passphrase.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/util/Passphrase.kt @@ -11,14 +11,9 @@ import org.bouncycastle.util.Arrays * * @param chars may be null for empty passwords. */ -class Passphrase(chars: CharArray?) { +class Passphrase(private val chars: CharArray?) { private val lock = Any() private var valid = true - private val chars: CharArray? - - init { - this.chars = trimWhitespace(chars) - } /** * Return a copy of the underlying char array. A return value of null represents an empty @@ -67,6 +62,13 @@ class Passphrase(chars: CharArray?) { override fun hashCode(): Int = getChars()?.let { String(it) }.hashCode() + /** + * Return a copy of this [Passphrase], but with whitespace characters trimmed off. + * + * @return copy with trimmed whitespace + */ + fun withTrimmedWhitespace(): Passphrase = Passphrase(trimWhitespace(chars)) + companion object { /** From 0d807cb6b8317f2e878509b5cb5f4a9a91e5287d Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Wed, 23 Jul 2025 11:25:31 +0200 Subject: [PATCH 03/20] Fix typo in error message --- .../key/modification/secretkeyring/SecretKeyRingEditor.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/modification/secretkeyring/SecretKeyRingEditor.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/modification/secretkeyring/SecretKeyRingEditor.kt index 56fb7695..5480442d 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/modification/secretkeyring/SecretKeyRingEditor.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/modification/secretkeyring/SecretKeyRingEditor.kt @@ -478,7 +478,7 @@ class SecretKeyRingEditor( val prevBinding = inspectKeyRing(secretKeyRing).getCurrentSubkeyBindingSignature(keyId) ?: throw NoSuchElementException( - "Previous subkey binding signaure for ${keyId.openPgpKeyId()} MUST NOT be null.") + "Previous subkey binding signature for ${keyId.openPgpKeyId()} MUST NOT be null.") val bindingSig = reissueSubkeyBindingSignature(subkey, expiration, protector, prevBinding) secretKeyRing = injectCertification(secretKeyRing, subkey, bindingSig) } From d1826eb9611956671ca713cb76910dce6060c81a Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 4 Jul 2025 17:34:44 +0200 Subject: [PATCH 04/20] OpenPGPInputStream: Expose inspectBuffer method --- .../pgpainless/decryption_verification/OpenPgpInputStream.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgpainless-core/src/main/java/org/pgpainless/decryption_verification/OpenPgpInputStream.java b/pgpainless-core/src/main/java/org/pgpainless/decryption_verification/OpenPgpInputStream.java index 3522f509..9e431302 100644 --- a/pgpainless-core/src/main/java/org/pgpainless/decryption_verification/OpenPgpInputStream.java +++ b/pgpainless-core/src/main/java/org/pgpainless/decryption_verification/OpenPgpInputStream.java @@ -81,7 +81,7 @@ public class OpenPgpInputStream extends BufferedInputStream { this(in, true); } - private void inspectBuffer() throws IOException { + public void inspectBuffer() throws IOException { if (checkForAsciiArmor()) { return; } From 4a4f85767a9f6daf4c19c7dc1dc9925a91d37aa6 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 4 Jul 2025 17:35:27 +0200 Subject: [PATCH 05/20] SOP armor: catch IOException during inspection of data --- .../src/main/kotlin/org/pgpainless/sop/ArmorImpl.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/ArmorImpl.kt b/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/ArmorImpl.kt index 40ac811d..2a5dd6e7 100644 --- a/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/ArmorImpl.kt +++ b/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/ArmorImpl.kt @@ -14,6 +14,7 @@ import org.pgpainless.util.ArmoredOutputStreamFactory import sop.Ready import sop.exception.SOPGPException import sop.operation.Armor +import java.io.IOException /** Implementation of the `armor` operation using PGPainless. */ class ArmorImpl : Armor { @@ -26,8 +27,14 @@ class ArmorImpl : Armor { val bufferedOutputStream = BufferedOutputStream(outputStream) // Determine the nature of the given data - val openPgpIn = OpenPgpInputStream(data) - openPgpIn.reset() + val openPgpIn = OpenPgpInputStream(data, false).apply { + try { + inspectBuffer() + } catch (e: IOException) { + // ignore + } + reset() + } if (openPgpIn.isAsciiArmored) { // armoring already-armored data is an idempotent operation From 32dc1fa1a1390010a9354c9512b0bf1326e63dee Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 4 Jul 2025 17:37:04 +0200 Subject: [PATCH 06/20] Add pgpainless-sop/.cifuzz-corpus/* to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 0a0ff0f1..1ce9f38e 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,5 @@ pgpainless-core/.settings/ push_html.sh node_modules + +pgpainless-sop/.cifuzz-corpus/* From 0d8ce6a50bd02d1899385ff9e04e87db8cc75e0e Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 4 Jul 2025 17:37:26 +0200 Subject: [PATCH 07/20] Fuzz different methods --- pgpainless-sop/build.gradle | 3 ++ .../sop/fuzzing/AsciiArmorFuzzTest.java | 30 +++++++++++ .../sop/fuzzing/ParseCertFuzzTest.java | 48 ++++++++++++++++++ .../armorAndDearmorData/alice.asc | 21 ++++++++ .../armorAndDearmorData/alice.cert | 21 ++++++++ .../armorAndDearmorData/alice.key | Bin 0 -> 807 bytes .../armorAndDearmorData/alice_pub.asc | 21 ++++++++ .../armorAndDearmorData/hello-world | 1 + .../armorAndDearmorData/hello-world.asc | 5 ++ .../hello-world.enc.alice.asc | 9 ++++ .../hello-world.enc.alice.bin | Bin 0 -> 202 bytes .../armorAndDearmorData/hello-world.sig | Bin 0 -> 119 bytes .../armorAndDearmorData/hello-world.sig.asc | 7 +++ .../hello-world_broken_crc.asc | 5 ++ .../hello-world_missing_crc.asc | 4 ++ .../parseOpenPGPCert/alice.cert | 21 ++++++++ .../parseOpenPGPCert/alice_pub.asc | 21 ++++++++ ...h-0a029b82575b0e76bd3fb06c215091f8fdbd98e6 | 21 ++++++++ ...h-1f62a2420a02ef980e60d0d4ab2c1533dbd30333 | 1 + ...h-2dac4aca575d32e777d909bee76ae15a353fa725 | 19 +++++++ ...h-315fa4eed3a87da9415b93b47195902308f83963 | 6 +++ ...h-4ded2defb9d9d728ed6bd2ae30957985122073df | Bin 0 -> 172 bytes ...h-56ef8d72d34df75d4618b3e8b50a126e9fd60dfe | 1 + ...h-5a6b875c86e8e9778c5454164b573d6db64f47f5 | 1 + ...h-659c9a1c28029f7560b17c33f46652293fe3ff5b | 3 ++ ...h-683e76bcd514f90093ee6fded36b704360f8521c | 21 ++++++++ ...h-69d0980b9798ae5ea5a1cd4a1054b8dc0ae5d9ee | 19 +++++++ ...h-79e915474e9a2d7508fb6baa8c0b930ec317c72b | 15 ++++++ ...h-806000130f90ce82b72e494ef5fb871869da8639 | 16 ++++++ ...h-8e3b42793b220b96d02cf8942d0311b930594e01 | 6 +++ ...h-92fe4e1d57663a9b8f1afaf42b2b7ab19b1511be | 1 + ...h-9bc5937c36255779a76d5e95128766c09402a307 | 7 +++ ...h-d0b2edb49cc29d978a5430b23902345ff7a09a6e | 8 +++ ...h-e04f0ac5d8c756e1bd162b2cc9748d97261b64cd | 5 ++ ...h-e27bd5104a595844730f44df571de7da07951ffb | 1 + ...h-f65d905bc7b32e64073841a61f1d8253eb41eb30 | 1 + ...h-f71e5adcab8e580f85e84ce95f4064524775f5c8 | 1 + ...h-fc6fab834e7fe57b374df7f66cfa0f420e91bc24 | 6 +++ version.gradle | 2 +- 39 files changed, 377 insertions(+), 1 deletion(-) create mode 100644 pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java create mode 100644 pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/ParseCertFuzzTest.java create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/alice.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/alice.cert create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/alice.key create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/alice_pub.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.enc.alice.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.enc.alice.bin create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.sig create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.sig.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world_broken_crc.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world_missing_crc.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/alice.cert create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/alice_pub.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-0a029b82575b0e76bd3fb06c215091f8fdbd98e6 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-1f62a2420a02ef980e60d0d4ab2c1533dbd30333 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-2dac4aca575d32e777d909bee76ae15a353fa725 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-315fa4eed3a87da9415b93b47195902308f83963 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-4ded2defb9d9d728ed6bd2ae30957985122073df create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-56ef8d72d34df75d4618b3e8b50a126e9fd60dfe create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-5a6b875c86e8e9778c5454164b573d6db64f47f5 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-659c9a1c28029f7560b17c33f46652293fe3ff5b create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-683e76bcd514f90093ee6fded36b704360f8521c create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-69d0980b9798ae5ea5a1cd4a1054b8dc0ae5d9ee create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-79e915474e9a2d7508fb6baa8c0b930ec317c72b create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-806000130f90ce82b72e494ef5fb871869da8639 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-8e3b42793b220b96d02cf8942d0311b930594e01 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-92fe4e1d57663a9b8f1afaf42b2b7ab19b1511be create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-9bc5937c36255779a76d5e95128766c09402a307 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-d0b2edb49cc29d978a5430b23902345ff7a09a6e create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e04f0ac5d8c756e1bd162b2cc9748d97261b64cd create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e27bd5104a595844730f44df571de7da07951ffb create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f65d905bc7b32e64073841a61f1d8253eb41eb30 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f71e5adcab8e580f85e84ce95f4064524775f5c8 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-fc6fab834e7fe57b374df7f66cfa0f420e91bc24 diff --git a/pgpainless-sop/build.gradle b/pgpainless-sop/build.gradle index 53b499c6..adcbd283 100644 --- a/pgpainless-sop/build.gradle +++ b/pgpainless-sop/build.gradle @@ -18,6 +18,9 @@ dependencies { testImplementation "org.junit.jupiter:junit-jupiter-params:$junitVersion" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion" + // Jazzer for Fuzzing + testImplementation "com.code-intelligence:jazzer-junit:0.24.0" + // Logging testImplementation "ch.qos.logback:logback-classic:$logbackVersion" diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java new file mode 100644 index 00000000..bedeee9e --- /dev/null +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java @@ -0,0 +1,30 @@ +package org.pgpainless.sop.fuzzing; + +import com.code_intelligence.jazzer.api.FuzzedDataProvider; +import com.code_intelligence.jazzer.junit.FuzzTest; +import org.bouncycastle.util.Arrays; +import org.pgpainless.sop.SOPImpl; +import sop.SOP; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +public class AsciiArmorFuzzTest { + + private final SOP sop = new SOPImpl(); + + @FuzzTest() + public void armorAndDearmorData(FuzzedDataProvider data) throws IOException { + byte[] bytes = data.consumeBytes(1024); + + byte[] armored = sop.armor().data(bytes).getBytes(); + if (Arrays.areEqual(bytes, armored)) { + // armoring already armored data is idempotent + return; + } + + byte[] dearmored = sop.dearmor().data(armored).getBytes(); + assertArrayEquals(bytes, dearmored, new String(armored)); + } +} diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/ParseCertFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/ParseCertFuzzTest.java new file mode 100644 index 00000000..b8caebaf --- /dev/null +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/ParseCertFuzzTest.java @@ -0,0 +1,48 @@ +package org.pgpainless.sop.fuzzing; + +import com.code_intelligence.jazzer.api.FuzzedDataProvider; +import com.code_intelligence.jazzer.junit.FuzzTest; +import org.bouncycastle.bcpg.ArmoredInputException; +import org.bouncycastle.bcpg.UnsupportedPacketVersionException; +import org.bouncycastle.openpgp.api.OpenPGPCertificate; +import org.bouncycastle.openpgp.api.OpenPGPKeyReader; +import org.pgpainless.sop.SOPImpl; +import sop.SOP; + +import java.io.EOFException; +import java.io.IOException; + +public class ParseCertFuzzTest { + + private final SOP sop = new SOPImpl(); + + @FuzzTest(maxDuration = "30s") + public void parseOpenPGPCert(FuzzedDataProvider data) throws IOException { + byte[] certEncoding = data.consumeBytes(8192); + if (certEncoding.length == 0) { + return; + } + + try { + OpenPGPCertificate cert = new OpenPGPKeyReader().parseCertificate(certEncoding); + } + catch (ArmoredInputException e) { + // ignore + } + catch (EOFException e) { + // ignore + } + catch (IOException e) { + // ignore + } + catch (UnsupportedPacketVersionException e) { + // ignore + } + catch (ClassCastException e) { + + } + catch (OutOfMemoryError e) { + + } + } +} diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/alice.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/alice.asc new file mode 100644 index 00000000..60329ee4 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/alice.asc @@ -0,0 +1,21 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +xVgEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 +gMq3BzUAAP9jcz6ydPE5rdNwUAxxOVn2stxGntC6mm0m9RI+1hYhbRCQzRxBbGlj +ZSA8YWxpY2VAcGdwYWlubGVzcy5vcmc+wp8EExYKAFEFgmhn3NAJEEjYL/TjDku0 +FqEE3bruvdTZy1Xd+RNsSNgv9OMOS7QCmwEFFQoJCAsFFgIDAQAECwkIBwknCQEJ +AgkDCAECngkFiQlmAYACmQEAAKq4AQC98RHIFbs5pyeWpKimjP3LFZ6rroorBcMc +izPAPqXEjQD+N5DSn/TJeKeld6KCB69W2KSj4BBdPvabLG6cRq+/8AbHWARoZ9zQ +FgkrBgEEAdpHDwEBB0A9Q+9+bvKSI1voDq+rb7yKjCVKVG4jO1qj/wTPF5PkSQAB +AIP7XckHeFuJ8qnp2hU2keb+Xzo+8ZlR57mj37uAuQUzEibCwBgEGBYKAIoFgmhn +3NAJEERXJjHxSbsAFqEEFQlMncw3fOJ/EBmfRFcmMfFJuwACmwJfIAQZFgoABgWC +aGfc0AAKCRBEVyYx8Um7AEw5AQDkSgGU1E6rmHO2DTj1jNXkD8k3rnyxxjP66RLi +whLVYwD9FwWQ5kXwM2qFheWbuMN7sghEt+SDQHc7tgwgnWppEwAAAGNHAQDM4ncO +o05rjfFVAaTFJ26Ixm8MK2HnGl+fQT73wyDJEgD/U/g+b7bppnSF4scuZMUSA9xQ +oyK3b5J5uNqfj+mxpgDHXQRoZ9zQEgorBgEEAZdVAQUBAQdAdEmUSz3XlPFa+u8I +0hJu+RAuJO0Sj64+ZlvawGsQhFcDAQgHAAD/Y78qz+fyfkEa6DjwhhLdZzKWJlII +KL1oW1vsNE8SVEAPGMJ4BBgWCgAqBYJoZ9zQCRBqhz9va/rd1hahBOfnmVV9LWWf +y/UZPWqHP29r+t3WApsMAADktwD/TSz5ZK5WFaaLSzpIwyA2U9XvgUvGD+5bSban +XsYU9LwA/1NWshgcBfDMRoboZGPwWIikfRUOatGph4IRj/5UZmIJ +=n5sh +-----END PGP PRIVATE KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/alice.cert b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/alice.cert new file mode 100644 index 00000000..2d75333f --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/alice.cert @@ -0,0 +1,21 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: DDBA EEBD D4D9 CB55 DDF9 136C 48D8 2FF4 E30E 4BB4 +Comment: Alice + +xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 +gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc +0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB +AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM +/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG +r7/wBs4zBGhn3NAWCSsGAQQB2kcPAQEHQD1D735u8pIjW+gOr6tvvIqMJUpUbiM7 +WqP/BM8Xk+RJwsAYBBgWCgCKBYJoZ9zQCRBEVyYx8Um7ABahBBUJTJ3MN3zifxAZ +n0RXJjHxSbsAApsCXyAEGRYKAAYFgmhn3NAACgkQRFcmMfFJuwBMOQEA5EoBlNRO +q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7IIRLfk +g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg +yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB +BAGXVQEFAQEHQHRJlEs915TxWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 +BBgWCgAqBYJoZ9zQCRBqhz9va/rd1hahBOfnmVV9LWWfy/UZPWqHP29r+t3WApsM +AADktwD/TSz5ZK5WFaaLSzpIwyA2U9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM +RoboZGPwWIikfRUOatGph4IRj/5UZmIJ +=hJD/ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/alice.key b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/alice.key new file mode 100644 index 0000000000000000000000000000000000000000..1833595ee4e1f4f49d24d52c1bb6aae4ce69db40 GIT binary patch literal 807 zcmX>a!IF`F=YklgHX9=g<1Kf7Mn-lApXZ^kxtGjZGHcJorSn##Om=^7Z{a)N`sKaT zKO0VMXE$YF_@7*Cx2fc#<=V>y0X&74k>57mahrEx*Q{K%uR?a$#1wM{CY+UV%*jkn zRj^3}Q4R&^1&Nt?IjP0Pdih1^c8BJ(2#aws1hO`PtmhQ)xS{{$F`xGqv4t#mcfH$t z<>u+oyFZ0(XXDEYod#z;5Z0UWR|>6E4mFa`C^D=*~|oU)~ZmoA~Tsyp`R@nSsxDF229JVJEAxklLXG z5-buxzjwj>?h>wM_|bDW1JLiHoIZ2UnAbe27m%C}6K0yt6tBP{3Dm&`(ZRsQDFBo7 zv1DX;;>9@Sir?xP#oKr-zV=*w!hh0yUCqX0#=l+)JvtHV<_X2qw0Ab$MSi!6Q4`P z&v&%@epun85X1lAA9nfMUM?$XeRNze<){$zoq)wk+w&(??zlC-|K-MI498=^sY!?n zoSLSGGO~h_Q;FvkZ`_rw1hJ=a7!1q-;WcKiJ7Uw5wo1Md0r znW441sq;^Nm9&KkGtK5{gbeG4Gj44!Qj$MJbS$YA<;%Lbvb{;L|6fR25+?wxj8PW= literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/alice_pub.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/alice_pub.asc new file mode 100644 index 00000000..2d75333f --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/alice_pub.asc @@ -0,0 +1,21 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: DDBA EEBD D4D9 CB55 DDF9 136C 48D8 2FF4 E30E 4BB4 +Comment: Alice + +xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 +gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc +0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB +AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM +/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG +r7/wBs4zBGhn3NAWCSsGAQQB2kcPAQEHQD1D735u8pIjW+gOr6tvvIqMJUpUbiM7 +WqP/BM8Xk+RJwsAYBBgWCgCKBYJoZ9zQCRBEVyYx8Um7ABahBBUJTJ3MN3zifxAZ +n0RXJjHxSbsAApsCXyAEGRYKAAYFgmhn3NAACgkQRFcmMfFJuwBMOQEA5EoBlNRO +q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7IIRLfk +g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg +yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB +BAGXVQEFAQEHQHRJlEs915TxWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 +BBgWCgAqBYJoZ9zQCRBqhz9va/rd1hahBOfnmVV9LWWfy/UZPWqHP29r+t3WApsM +AADktwD/TSz5ZK5WFaaLSzpIwyA2U9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM +RoboZGPwWIikfRUOatGph4IRj/5UZmIJ +=hJD/ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world new file mode 100644 index 00000000..8ab686ea --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world @@ -0,0 +1 @@ +Hello, World! diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.asc new file mode 100644 index 00000000..f7e94a34 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.asc @@ -0,0 +1,5 @@ +-----BEGIN PGP MESSAGE----- + +SGVsbG8gV29ybGQK +=1hzE +-----END PGP MESSAGE----- \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.enc.alice.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.enc.alice.asc new file mode 100644 index 00000000..9ffec16b --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.enc.alice.asc @@ -0,0 +1,9 @@ +-----BEGIN PGP MESSAGE----- + +wWwGFQTn55lVfS1ln8v1GT1qhz9va/rd1hIBB0CK2xMAGPBhSAztl26xmFEMGg3a +oKnwCwphhU7yshVCOTAY4zKszTvvn3CxMV8HbNQ0jr61kp9H9bwGDz8w6Nz/WQrn +S4QPVvXsLOIZd9L/KKbSWgIJAQOoAMCSkjp146L+E1uYItfRk/K4dupbQWX+jAHp +6MJvIi4rzyht7qt2C0RPPFDImzCTR9V1Ry/BCa3w4E3x3CBpFVyEy9N8mizUEJU6 +TPRvAFqekyQpjg== +=EL9J +-----END PGP MESSAGE----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.enc.alice.bin b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.enc.alice.bin new file mode 100644 index 0000000000000000000000000000000000000000..8c70cf9b32d91ddf18fb3e22e57801b4fd313a2d GIT binary patch literal 202 zcmV;*05$)?Yz7qs=jWMKeJy35%k>#OYKK2>Yx>>R5&;K5irW(a81P|84DFY0v6xW| z8V%Z@sqhO5VTDfevK2x(Fc{-9tj#;`pK!4;Uk7Z|G>*QtlAlNQyao?HFzDR>SqkS% zgb!Br>@4CLchdhTrqWsh2>}DB0Kk%xI(6fs{u5i6BG=KA^0;>DTR~<1i~;HB!fzrj zE6*rx?yGhSL{B_W$eS>eN7Z#lFTn||@Ze4H+#qQcT!hQhe3~rO5S2Pi^lt!Ko|7ag Eju7o$`Tzg` literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.sig b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.sig new file mode 100644 index 0000000000000000000000000000000000000000..5caf248d263124bc1bdaa5d2729062ab9894b2aa GIT binary patch literal 119 zcmX?9%EBPV#h}jGl#zb-KBs_7xSHWd&)p1S3t2=tedeAquX$82AUPi<%)szMoROg+ zUi8gW?jPM3c1&R1oAJo0f5Y;(GkG?v=pVj)*)uQjCBt8_%sbBOG%OOio38%dytp-g VL+n*Y>6(4V?y_t<#48}n4gjGPF}eT% literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.sig.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.sig.asc new file mode 100644 index 00000000..0c814c86 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world.sig.asc @@ -0,0 +1,7 @@ +-----BEGIN PGP SIGNATURE----- + +wnUEABYKACcFgmhn3d8JEERXJjHxSbsAFqEEFQlMncw3fOJ/EBmfRFcmMfFJuwAA +AOgXAQCAXxXslQv4i9C4kAW9aOJCj7Cn7ZkMsyQvw9vTSW5R6QD9FmncQ64oOGEL +gtX9s6OFb7Bd1UEbfL7G3QS2wg0QHQc= +=o0Xk +-----END PGP SIGNATURE----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world_broken_crc.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world_broken_crc.asc new file mode 100644 index 00000000..05183ba9 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world_broken_crc.asc @@ -0,0 +1,5 @@ +-----BEGIN PGP MESSAGE----- + +SGVsbG8gV29ybGQK +=1hzA +-----END PGP MESSAGE----- \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world_missing_crc.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world_missing_crc.asc new file mode 100644 index 00000000..2f74f208 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTestInputs/armorAndDearmorData/hello-world_missing_crc.asc @@ -0,0 +1,4 @@ +-----BEGIN PGP MESSAGE----- + +SGVsbG8gV29ybGQK +-----END PGP MESSAGE----- \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/alice.cert b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/alice.cert new file mode 100644 index 00000000..2d75333f --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/alice.cert @@ -0,0 +1,21 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: DDBA EEBD D4D9 CB55 DDF9 136C 48D8 2FF4 E30E 4BB4 +Comment: Alice + +xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 +gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc +0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB +AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM +/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG +r7/wBs4zBGhn3NAWCSsGAQQB2kcPAQEHQD1D735u8pIjW+gOr6tvvIqMJUpUbiM7 +WqP/BM8Xk+RJwsAYBBgWCgCKBYJoZ9zQCRBEVyYx8Um7ABahBBUJTJ3MN3zifxAZ +n0RXJjHxSbsAApsCXyAEGRYKAAYFgmhn3NAACgkQRFcmMfFJuwBMOQEA5EoBlNRO +q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7IIRLfk +g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg +yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB +BAGXVQEFAQEHQHRJlEs915TxWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 +BBgWCgAqBYJoZ9zQCRBqhz9va/rd1hahBOfnmVV9LWWfy/UZPWqHP29r+t3WApsM +AADktwD/TSz5ZK5WFaaLSzpIwyA2U9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM +RoboZGPwWIikfRUOatGph4IRj/5UZmIJ +=hJD/ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/alice_pub.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/alice_pub.asc new file mode 100644 index 00000000..2d75333f --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/alice_pub.asc @@ -0,0 +1,21 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: DDBA EEBD D4D9 CB55 DDF9 136C 48D8 2FF4 E30E 4BB4 +Comment: Alice + +xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 +gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc +0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB +AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM +/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG +r7/wBs4zBGhn3NAWCSsGAQQB2kcPAQEHQD1D735u8pIjW+gOr6tvvIqMJUpUbiM7 +WqP/BM8Xk+RJwsAYBBgWCgCKBYJoZ9zQCRBEVyYx8Um7ABahBBUJTJ3MN3zifxAZ +n0RXJjHxSbsAApsCXyAEGRYKAAYFgmhn3NAACgkQRFcmMfFJuwBMOQEA5EoBlNRO +q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7IIRLfk +g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg +yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB +BAGXVQEFAQEHQHRJlEs915TxWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 +BBgWCgAqBYJoZ9zQCRBqhz9va/rd1hahBOfnmVV9LWWfy/UZPWqHP29r+t3WApsM +AADktwD/TSz5ZK5WFaaLSzpIwyA2U9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM +RoboZGPwWIikfRUOatGph4IRj/5UZmIJ +=hJD/ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-0a029b82575b0e76bd3fb06c215091f8fdbd98e6 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-0a029b82575b0e76bd3fb06c215091f8fdbd98e6 new file mode 100644 index 00000000..6b9bddb1 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-0a029b82575b0e76bd3fb06c215091f8fdbd98e6 @@ -0,0 +1,21 @@ +-----BEGIN e@pgpainless.org> + +xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 +gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc +0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB +AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM +/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG +r7/wBs4zBGhn3NAWCSsGAQQB2kcPAQEHQD1D735u8pIjW+gOr6tvvIqMJUpUbiM7 +WqP/BM8Xk+RJwsAYBBgWCgCKBYJoZ9zQCRBEVyYx8Um7ABahBBUJTJ3MN3zifxAZ +n0RXJjHxSbsAApsCXyAEGRYKAAYFgmhn3NAACgkQRFcmMfFJuwBMOQEA5EoBlNRO +q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7IIRLfk +g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg +yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB +BAGXVQEFAQEHQHRJlEs915TxWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 +BBgWCgAqBYJoZ9zQCRBqhz9va/rd1hahBOfnmVV9LWWfy/UZPWqHP29r+t3WApsM +AADkCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 +BBgWCgAqBYJoZ9zQCRBqhz9va/rd1hahBOfnmVV9LWWfy/UZPWqHP29r+t3WApsM +AADktwD/TSz5ZK5WFaaLSzpIwyA2U9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM +RoboZGPwWIikfRUOatGph4IRj/5UZmIJ +=hJD/ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-1f62a2420a02ef980e60d0d4ab2c1533dbd30333 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-1f62a2420a02ef980e60d0d4ab2c1533dbd30333 new file mode 100644 index 00000000..c287f99c --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-1f62a2420a02ef980e60d0d4ab2c1533dbd30333 @@ -0,0 +1 @@ +wxsFxjyLM8Ml9MlS \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-2dac4aca575d32e777d909bee76ae15a353fa725 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-2dac4aca575d32e777d909bee76ae15a353fa725 new file mode 100644 index 00000000..d55f7332 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-2dac4aca575d32e777d909bee76ae15a353fa725 @@ -0,0 +1,19 @@ +-----BEGIN PGP PUBLIC KE48D8 2FF4 E30E 4BB4 +Comment: Alice + +xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 +gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc +0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB +AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM +/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG +r7/wBs4zBGhn3NASCSsGAQQB2kcPAQEHQD1D735u8pIjW+gOr6tvvIqMJUpUbiM7 +WqP/BM8Xk+RJwsAYBBgWCgCKBYJoZ9zQCRBEVyYx8Um7ABahBBUJTJ3MN3zifxAZ +n0RXJjHxSbsAApsCXyAEGRYKAAYFgmhn3NAACgkQRFcmMfFJuwBMOQEA5EoBlNRO +q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7IIRLfk +g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg +yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB +BAGXVQEFAQEHkQRFcmMfFJuwBMOQEA5EoBlNRO +q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7IIRLfk +g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg +yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+SebQHRJlEs915TxWvrvCNISbvk+uPmZb2sBrEIRXAwU9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM +RoboZGP---END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-315fa4eed3a87da9415b93b47195902308f83963 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-315fa4eed3a87da9415b93b47195902308f83963 new file mode 100644 index 00000000..b3591bb9 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-315fa4eed3a87da9415b93b47195902308f83963 @@ -0,0 +1,6 @@ +-Kg> + +xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGLnqhkk0fvPzaNnzvp3sv1 +gMq3Zz7CowQTFgoAUQWCaGfc +0AkQSNgv9OMOS4QWoQTduu346NnLVd30E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB +AAQCCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrLgB3AxEcgb \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-4ded2defb9d9d728ed6bd2ae30957985122073df b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-4ded2defb9d9d728ed6bd2ae30957985122073df new file mode 100644 index 0000000000000000000000000000000000000000..7bc973b3dd331dd4f49bddcfd656a63c06a79b9c GIT binary patch literal 172 zcmdO8U~pj2%eUj=s>mvKE3c^Z@wIT&E=Ugc^9(RC&i3<8v-HgY3Nla!V47`GU>0Va qpYQ2WWEAP;T^{M=;M1%jEn#m9U#^K literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-56ef8d72d34df75d4618b3e8b50a126e9fd60dfe b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-56ef8d72d34df75d4618b3e8b50a126e9fd60dfe new file mode 100644 index 00000000..f8ca4f7f --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-56ef8d72d34df75d4618b3e8b50a126e9fd60dfe @@ -0,0 +1 @@ +ööööödöööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööö· \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-5a6b875c86e8e9778c5454164b573d6db64f47f5 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-5a6b875c86e8e9778c5454164b573d6db64f47f5 new file mode 100644 index 00000000..c1cb2fac --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-5a6b875c86e8e9778c5454164b573d6db64f47f5 @@ -0,0 +1 @@ +‹ \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-659c9a1c28029f7560b17c33f46652293fe3ff5b b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-659c9a1c28029f7560b17c33f46652293fe3ff5b new file mode 100644 index 00000000..9c6d4277 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-659c9a1c28029f7560b17c33f46652293fe3ff5b @@ -0,0 +1,3 @@ +- + +xjMGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGA 138C u5D8 \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-683e76bcd514f90093ee6fded36b704360f8521c b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-683e76bcd514f90093ee6fded36b704360f8521c new file mode 100644 index 00000000..73df5fbd --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-683e76bcd514f90093ee6fded36b704360f8521c @@ -0,0 +1,21 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: DDBA EEBD D4D9 CB55 DDF9 136C 48D8 2FF4 E30E 4BB4 +Comment: Alice + +xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 +gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc +0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB +AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM +/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG +r7/wBs4zBGhn3NAWCSsGAQQB2kcPAQEHQD1D735u8pIjW+gOr6tvvIqMJUpUbiM7 +WqP/BM8Xk+RJwsAYBBgWCgCKBYJoZ9zQCRBEVyYx8Um7ABahBBUJTJ3MN3zifxAZ +n0RXJjHxSbsAApsCXyAEGRYKAApFgmhn3NAACgkQRFcmMfFJuwBMOQEA5EoBlNRO +q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7IIRLfk +g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg +yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB +BAGXVQEFAQEHQHRJlEs915TxWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 +BBgWCgAqBYJoZ9zQCRBqhz9va/rd1hahBOfnmVV9LWWfy/UZPWqHP29r+t3WApsM +AADktwD/TSz5ZK5WFaaLSzpIwyA2U9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM +RoboZGPwWIikfRUOatGph4IRj/5UZmIJ +=hJD/ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-69d0980b9798ae5ea5a1cd4a1054b8dc0ae5d9ee b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-69d0980b9798ae5ea5a1cd4a1054b8dc0ae5d9ee new file mode 100644 index 00000000..6a2c8f30 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-69d0980b9798ae5ea5a1cd4a1054b8dc0ae5d9ee @@ -0,0 +1,19 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: DDBA EEBD D4D9 CB55 DDF9 136C 48D8 2FF4 E30E 4BB4 +Comment: Alice + +xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 +gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc +0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB +AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM +/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG +r7/wBs4zBGhn3NAWCSsGAQQB2kcPAQEHQD1D735u8pIjW+gOr6tvvIqMJUpUbiM7 +WqP/BM8Xk+RJwsAYBBgWCgCKBYJoZ9zQCRBEVyYx8Um7ABahBBUJTJ3MN3zifxAZ +n0RXJjHxSbsAApsCXyAEGRYKAAYFgmhn3NAACgkQRFcmMfFJuwBMOQEA5EoBlNRO +q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7IIRLfk +g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg +yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB +BAGXVQEFAQEHQHRJlEs915TxWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwU9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM +RoboZGPwWIikfRUOatGph4IRj/5UZmIJ +=hJD/ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-79e915474e9a2d7508fb6baa8c0b930ec317c72b b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-79e915474e9a2d7508fb6baa8c0b930ec317c72b new file mode 100644 index 00000000..7ba1b4eb --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-79e915474e9a2d7508fb6baa8c0b930ec317c72b @@ -0,0 +1,15 @@ +-----BEGIN PGP PUBLIC KE48D8 2FF4 E30E 4BB4 +Comment: Alice + +xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 +gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc +0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB +AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM +/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG +r7/wBs4zBYYYYYYYYYYYYYYYYYYYYYYGhn3NAWCSsGAQQB2kcPAQEHQD1D735u8pIjW+gOr6tvvIqMJUpUbiM7 +WqP/BM8Xk+RJwsAYBBgWCgCKBYJoZ9zQCRĀEVyYx8Um7ABahBBUJTJ3MN3zifxAZ +n0RXJjHxSbsAApsCXyAEGRYKAAYFgmhn3NAACgkQRFcmMfFJuwBMOQEA5EoBlNRO +q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7h5xpfn0E+98Mg +yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB +BAGXVQEFAQEHQHRJlEs915TxWvrvCNI’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’SbvkQLiTtEo+uPmZb2sBrEIRXAwU9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM +RoboZGP---END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-806000130f90ce82b72e494ef5fb871869da8639 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-806000130f90ce82b72e494ef5fb871869da8639 new file mode 100644 index 00000000..3f67fb7f --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-806000130f90ce82b72e494ef5fb871869da8639 @@ -0,0 +1,16 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: DDBA EEBD D4D9 CB55 DDF9 136C 48D8 2FF4 E30E 4BB4 +Comment: Alice + +xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 +gMq3BzXNHEFsaWNlIDxhbGljZUBwLOCKZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc +0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB +AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM +/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG +r7/wBs4zBGhd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB +AAQLCQgHCScJAQkCCQWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 +BBgWCgAqBYJoZ9zQCRBqhz9va/rd1hahBOfnmVV9LWWfy/U^PWqHP29r+t3WApsM +AADktwD/TSz5ZK5WFaaLSzpIwyA2U9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM +RoboZGPwWIikfRUOatGph4IRj/5UZmIJ +=hJD/ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-8e3b42793b220b96d02cf8942d0311b930594e01 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-8e3b42793b220b96d02cf8942d0311b930594e01 new file mode 100644 index 00000000..710df371 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-8e3b42793b220b96d02cf8942d0311b930594e01 @@ -0,0 +1,6 @@ +Ó--GIN PGP PUBLICC> + +xjMEaGfc0BYJKwYBBAHĀaRw8BAQdCTOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 +gMq3BzXYNHEFsaWNlIDxŅhbG--- +ljZUBwZ3BhaW5s +ZXNz \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-92fe4e1d57663a9b8f1afaf42b2b7ab19b1511be b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-92fe4e1d57663a9b8f1afaf42b2b7ab19b1511be new file mode 100644 index 00000000..5d3e5870 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-92fe4e1d57663a9b8f1afaf42b2b7ab19b1511be @@ -0,0 +1 @@ +ю’’’’’’’’ \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-9bc5937c36255779a76d5e95128766c09402a307 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-9bc5937c36255779a76d5e95128766c09402a307 new file mode 100644 index 00000000..6cfe266e --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-9bc5937c36255779a76d5e95128766c09402a307 @@ -0,0 +1,7 @@ +YB +BAGXVQEFAQEHQHRJlEs915TxWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 +BBgWCgAqBYJoZ9zQIC KEY BLOCK-e7IIRLfk +g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg +yRIA/1P4Pm+26aZ0heLHLmTFEgPćUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB +BAGXVQEFAQEHQHRJlEs915TxWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 +BBgWCgAqBYJoZ9zQIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-d0b2edb49cc29d978a5430b23902345ff7a09a6e b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-d0b2edb49cc29d978a5430b23902345ff7a09a6e new file mode 100644 index 00000000..21ed6480 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-d0b2edb49cc29d978a5430b23902345ff7a09a6e @@ -0,0 +1,8 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: DDB-----BEGIN e@pgpainless.org> + +xjMA EEBD D4D9 CB55 DDF9 136C 48D8 EaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 +gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7II2FF4 E30E 4BB4RLfk +Comment: Alice + +xjME \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e04f0ac5d8c756e1bd162b2cc9748d97261b64cd b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e04f0ac5d8c756e1bd162b2cc9748d97261b64cd new file mode 100644 index 00000000..9563c3a2 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e04f0ac5d8c756e1bd162b2cc9748d97261b64cd @@ -0,0 +1,5 @@ +- + +xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvpZXNzLm9yZz7CnwQTFgoAUQWCaGfc +0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04wtKLA5bAQUVCgkACwUWAgMB +AAQLCQgHCwYBBAHaRw8BAQLCQg2C/04w5LtCQMIA \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e27bd5104a595844730f44df571de7da07951ffb b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e27bd5104a595844730f44df571de7da07951ffb new file mode 100644 index 00000000..bd97d753 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e27bd5104a595844730f44df571de7da07951ffb @@ -0,0 +1 @@ +Æ \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f65d905bc7b32e64073841a61f1d8253eb41eb30 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f65d905bc7b32e64073841a61f1d8253eb41eb30 new file mode 100644 index 00000000..ff78111d --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f65d905bc7b32e64073841a61f1d8253eb41eb30 @@ -0,0 +1 @@ +ŌÆ,FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f71e5adcab8e580f85e84ce95f4064524775f5c8 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f71e5adcab8e580f85e84ce95f4064524775f5c8 new file mode 100644 index 00000000..0d632980 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f71e5adcab8e580f85e84ce95f4064524775f5c8 @@ -0,0 +1 @@ +³ \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-fc6fab834e7fe57b374df7f66cfa0f420e91bc24 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-fc6fab834e7fe57b374df7f66cfa0f420e91bc24 new file mode 100644 index 00000000..40013e49 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-fc6fab834e7fe57b374df7f66cfa0f420e91bc24 @@ -0,0 +1,6 @@ +---PKg> + +xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGLnqhkk0fvPzaNnzvp3sv5 +gMq3Zz7CowQTFgoAUQWCaGfc +0AkQSNgv9OMOS4QWoQTduu346NnLVd30E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB +AAQQCHCgCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrLgB3AxEcgb \ No newline at end of file diff --git a/version.gradle b/version.gradle index bc2515a4..c50556ac 100644 --- a/version.gradle +++ b/version.gradle @@ -7,7 +7,7 @@ allprojects { shortVersion = '1.7.7' isSnapshot = true javaSourceCompatibility = 11 - bouncyCastleVersion = '1.81' + bouncyCastleVersion = '1.82-SNAPSHOT' bouncyPgVersion = bouncyCastleVersion junitVersion = '5.8.2' logbackVersion = '1.5.13' From 307b3ae40bd072c28d01f536c9cdd63f4343c392 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Tue, 8 Jul 2025 14:34:35 +0200 Subject: [PATCH 08/20] Fuzzer tests --- .../pgpainless/signature/SignatureUtils.kt | 64 +++++++----- .../org/pgpainless/sop/DetachedVerifyImpl.kt | 7 +- .../sop/fuzzing/AsciiArmorFuzzTest.java | 4 + .../sop/fuzzing/ParseCertFuzzTest.java | 4 + .../sop/fuzzing/SignatureFuzzTest.java | 96 ++++++++++++++++++ ...h-94d4f79102352b762d29a2596cec0a16fb4f6a61 | 1 + ...h-f76fa673913fd9409423d16fc3593596cbf71023 | 1 + ...h-0cf7eacc2a3bac835ac97aa40d8f7735cef966c4 | Bin 0 -> 118 bytes ...h-13384a176fc0bacf13f7a6431bdca5ccc30f8baa | Bin 0 -> 103 bytes ...h-40a90a6a0d5a51ec600e9ec6b54e7377f072fd3c | Bin 0 -> 447 bytes ...h-5a8ca84c7d4d9b055f05c55b1f707f223979d387 | 1 + ...h-5aed3e11291d53244b523b605011b3b0fd26ba4b | Bin 0 -> 56 bytes ...h-5f55f2f1999e35e7dc4da488679f149bc38a9ace | Bin 0 -> 119 bytes ...h-6a5368d90575590101c96b99febb74e17388e388 | Bin 0 -> 476 bytes ...h-9e75de4a2f16140d7f0fc47f1b17c24186cfcdec | Bin 0 -> 188 bytes ...h-9e9ebd7736a1e6ee971dc3d328e9e929caaa101b | Bin 0 -> 119 bytes ...h-a398e552b9fe8bcb6d6c2cac6fb6e564762c87f9 | Bin 0 -> 41 bytes ...h-a4dc44449d64decbb5459f8572b54af63a4eb4f8 | 1 + ...h-bea7acca1916ad2e8fcc55c6c22372fa8db47f10 | 1 + ...h-c000a51366616d33f9df61c9260fba450f9e2e7c | 1 + ...h-c4a0ed88c991d1482b6eb0301f6a48005a711def | Bin 0 -> 238 bytes ...h-c71f29422931ea494827e83f146ff3caed79129f | Bin 0 -> 119 bytes ...h-ce933ff5f8546a54ac5d85df62509dc8c6faf74e | Bin 0 -> 119 bytes ...h-dae649c2d3128fa2e70857e1d4598566ec669192 | Bin 0 -> 153 bytes ...h-f03f6f5bb897abe1c95a7058ebfb101855207798 | 1 + .../verifyFuzzedSig/sig.asc | 7 ++ .../verifyFuzzedSig/sig.bin | Bin 0 -> 119 bytes 27 files changed, 160 insertions(+), 29 deletions(-) create mode 100644 pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-94d4f79102352b762d29a2596cec0a16fb4f6a61 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f76fa673913fd9409423d16fc3593596cbf71023 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-0cf7eacc2a3bac835ac97aa40d8f7735cef966c4 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-13384a176fc0bacf13f7a6431bdca5ccc30f8baa create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-40a90a6a0d5a51ec600e9ec6b54e7377f072fd3c create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5a8ca84c7d4d9b055f05c55b1f707f223979d387 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5aed3e11291d53244b523b605011b3b0fd26ba4b create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5f55f2f1999e35e7dc4da488679f149bc38a9ace create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-6a5368d90575590101c96b99febb74e17388e388 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-9e75de4a2f16140d7f0fc47f1b17c24186cfcdec create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-9e9ebd7736a1e6ee971dc3d328e9e929caaa101b create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-a398e552b9fe8bcb6d6c2cac6fb6e564762c87f9 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-a4dc44449d64decbb5459f8572b54af63a4eb4f8 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-bea7acca1916ad2e8fcc55c6c22372fa8db47f10 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-c000a51366616d33f9df61c9260fba450f9e2e7c create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-c4a0ed88c991d1482b6eb0301f6a48005a711def create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-c71f29422931ea494827e83f146ff3caed79129f create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-ce933ff5f8546a54ac5d85df62509dc8c6faf74e create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-dae649c2d3128fa2e70857e1d4598566ec669192 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-f03f6f5bb897abe1c95a7058ebfb101855207798 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig.bin diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/signature/SignatureUtils.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/signature/SignatureUtils.kt index 770dfc56..6e1329fb 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/signature/SignatureUtils.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/signature/SignatureUtils.kt @@ -8,6 +8,7 @@ import java.io.IOException import java.io.InputStream import java.util.* import openpgp.plusSeconds +import org.bouncycastle.bcpg.UnsupportedPacketVersionException import org.bouncycastle.bcpg.sig.KeyExpirationTime import org.bouncycastle.openpgp.* import org.bouncycastle.util.encoders.Hex @@ -151,37 +152,46 @@ class SignatureUtils { */ @JvmStatic fun readSignatures(inputStream: InputStream, maxIterations: Int): List { - val signatures = mutableListOf() - val pgpIn = ArmorUtils.getDecoderStream(inputStream) - val objectFactory = ImplementationFactory.getInstance().getPGPObjectFactory(pgpIn) + try { + val signatures = mutableListOf() + val pgpIn = ArmorUtils.getDecoderStream(inputStream) + val objectFactory = ImplementationFactory.getInstance().getPGPObjectFactory(pgpIn) - var i = 0 - var nextObject: Any? = null - while (i++ < maxIterations && - objectFactory.nextObject().also { nextObject = it } != null) { - // Since signatures are indistinguishable from randomness, there is no point in - // having them compressed, - // except for an attacker who is trying to exploit flaws in the decompression - // algorithm. - // Therefore, we ignore compressed data packets without attempting decompression. - if (nextObject is PGPCompressedData) { - // getInputStream() does not do decompression, contrary to getDataStream(). - Streams.drain( - (nextObject as PGPCompressedData) - .inputStream) // Skip packet without decompressing + var i = 0 + var nextObject: Any? = null + while (i++ < maxIterations && + objectFactory.nextObject().also { nextObject = it } != null) { + // Since signatures are indistinguishable from randomness, there is no point in + // having them compressed, + // except for an attacker who is trying to exploit flaws in the decompression + // algorithm. + // Therefore, we ignore compressed data packets without attempting decompression. + if (nextObject is PGPCompressedData) { + // getInputStream() does not do decompression, contrary to getDataStream(). + Streams.drain( + (nextObject as PGPCompressedData) + .inputStream + ) // Skip packet without decompressing + } + + if (nextObject is PGPSignatureList) { + signatures.addAll(nextObject as PGPSignatureList) + } + + if (nextObject is PGPSignature) { + signatures.add(nextObject as PGPSignature) + } } - if (nextObject is PGPSignatureList) { - signatures.addAll(nextObject as PGPSignatureList) - } - - if (nextObject is PGPSignature) { - signatures.add(nextObject as PGPSignature) - } + pgpIn.close() + return signatures.toList() + } catch (e: UnsupportedPacketVersionException) { + throw PGPException("Unsupported packet version encountered.", e) + } catch (e: ClassCastException) { + throw PGPException("Unexpected packet encountered.", e) + } catch (e: IllegalArgumentException) { + throw PGPException("Malformed packet encountered.", e) } - - pgpIn.close() - return signatures.toList() } /** diff --git a/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/DetachedVerifyImpl.kt b/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/DetachedVerifyImpl.kt index 08472144..c4a6a550 100644 --- a/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/DetachedVerifyImpl.kt +++ b/pgpainless-sop/src/main/kotlin/org/pgpainless/sop/DetachedVerifyImpl.kt @@ -29,8 +29,11 @@ class DetachedVerifyImpl : DetachedVerify { override fun data(data: InputStream): List { try { val verificationStream = - PGPainless.decryptAndOrVerify().onInputStream(data).withOptions(options) - + try { + PGPainless.decryptAndOrVerify().onInputStream(data).withOptions(options) + } catch (e: RuntimeException) { + throw SOPGPException.BadData(e) + } Streams.drain(verificationStream) verificationStream.close() diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java index bedeee9e..c58090b9 100644 --- a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2025 Paul Schaub +// +// SPDX-License-Identifier: Apache-2.0 + package org.pgpainless.sop.fuzzing; import com.code_intelligence.jazzer.api.FuzzedDataProvider; diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/ParseCertFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/ParseCertFuzzTest.java index b8caebaf..39296126 100644 --- a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/ParseCertFuzzTest.java +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/ParseCertFuzzTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2025 Paul Schaub +// +// SPDX-License-Identifier: Apache-2.0 + package org.pgpainless.sop.fuzzing; import com.code_intelligence.jazzer.api.FuzzedDataProvider; diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java new file mode 100644 index 00000000..7d578824 --- /dev/null +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java @@ -0,0 +1,96 @@ +// SPDX-FileCopyrightText: 2025 Paul Schaub +// +// SPDX-License-Identifier: Apache-2.0 + +package org.pgpainless.sop.fuzzing; + +import com.code_intelligence.jazzer.api.FuzzedDataProvider; +import com.code_intelligence.jazzer.junit.FuzzTest; +import org.pgpainless.sop.SOPImpl; +import sop.SOP; +import sop.Verification; +import sop.exception.SOPGPException; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.List; + +public class SignatureFuzzTest { + + private final SOP sop = new SOPImpl(); + private final byte[] data = "Hello, World!\n".getBytes(StandardCharsets.UTF_8); + + private final String key = "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" + + "Comment: D7BC FF6B B105 40D9 87F9 CB6E 542D C9F6 FCAE AD63\n" + + "Comment: Alice \n" + + "\n" + + "lFgEaGzu+BYJKwYBBAHaRw8BAQdAlqjB241N44drAJvxa3wx0uRb5bxuVNXrCwPZ\n" + + "yf4Qg+MAAQCpACcGmoOPZISRbMjRzI/0Wf5iIZwp7r9huzLe6NToBRFxtBxBbGlj\n" + + "ZSA8YWxpY2VAcGdwYWlubGVzcy5vcmc+wpUEExYKAEcFgmhs7vgJEFQtyfb8rq1j\n" + + "FiEE17z/a7EFQNmH+ctuVC3J9vyurWMCngECmwEFFgIDAQAECwkIBwUVCgkICwWJ\n" + + "CWYBfwKZAQAA1SMBAIuffSIKKkG73rWInDrfV6G0kCh/uP7Qf3Jh4A+x5BrvAP42\n" + + "KANAmmLmDVsPGWEPEAlCAJFwKZvHzvYsk8dEFNZEDJxYBGhs7vgWCSsGAQQB2kcP\n" + + "AQEHQOPChGD0z51fOsnFswJPNmhzxdhZHuXCxbEJ+/5WhU9QAAEA3i0J/Vbyhj92\n" + + "kd8gsjLUIkbDHGGDb/vfRCgmRAySF1MOL8LAFQQYFgoAfQWCaGzu+AKeAQKbAgUW\n" + + "AgMBAAQLCQgHBRUKCQgLXyAEGRYKAAYFgmhs7vgACgkQIvV9b29BRNSV1AEAtywX\n" + + "h7bdVq0597D0JfASIvo/ksyHsTyf/JRVH6M0Gv0A/RvFJnVRt1EitamD8i2mX2H3\n" + + "yC2lP2t1WzTafT7GzkYMAAoJEFQtyfb8rq1jhRABAIb/GkyCOlU02zfDMd5UHQ4J\n" + + "EpexaSodCvrGcQMA5t2nAPsEPXQOl1AOdJoc/sICsVAi4DvxohelpWJ19ZUy7WYQ\n" + + "CZxdBGhs7vgSCisGAQQBl1UBBQEBB0BeCegzdBr3B6+q3IBjkzNXPfLopNi2d+sL\n" + + "9hcbV9ztDgMBCAcAAP9hFCttDV8qWyven96rQ0WKGfVo1bKp2EZHGUR7tIScWA9P\n" + + "wnUEGBYKAB0Fgmhs7vgCngECmwwFFgIDAQAECwkIBwUVCgkICwAKCRBULcn2/K6t\n" + + "Y7GuAP9Kf1Ec1GJmZ99UHsgiN60os+6adMLj4G2ASiIbNSDvKgD9F/VLFIb/eN7k\n" + + "JQp3E5C15x5pMMKEI/rjwdrKmYH3aAw=\n" + + "=hnEg\n" + + "-----END PGP PRIVATE KEY BLOCK-----"; + private final String cert = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + + "Comment: D7BC FF6B B105 40D9 87F9 CB6E 542D C9F6 FCAE AD63\n" + + "Comment: Alice \n" + + "\n" + + "mDMEaGzu+BYJKwYBBAHaRw8BAQdAlqjB241N44drAJvxa3wx0uRb5bxuVNXrCwPZ\n" + + "yf4Qg+O0HEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7ClQQTFgoARwWCaGzu\n" + + "+AkQVC3J9vyurWMWIQTXvP9rsQVA2Yf5y25ULcn2/K6tYwKeAQKbAQUWAgMBAAQL\n" + + "CQgHBRUKCQgLBYkJZgF/ApkBAADVIwEAi599IgoqQbvetYicOt9XobSQKH+4/tB/\n" + + "cmHgD7HkGu8A/jYoA0CaYuYNWw8ZYQ8QCUIAkXApm8fO9iyTx0QU1kQMuDMEaGzu\n" + + "+BYJKwYBBAHaRw8BAQdA48KEYPTPnV86ycWzAk82aHPF2Fke5cLFsQn7/laFT1DC\n" + + "wBUEGBYKAH0Fgmhs7vgCngECmwIFFgIDAQAECwkIBwUVCgkIC18gBBkWCgAGBYJo\n" + + "bO74AAoJECL1fW9vQUTUldQBALcsF4e23VatOfew9CXwEiL6P5LMh7E8n/yUVR+j\n" + + "NBr9AP0bxSZ1UbdRIrWpg/Itpl9h98gtpT9rdVs02n0+xs5GDAAKCRBULcn2/K6t\n" + + "Y4UQAQCG/xpMgjpVNNs3wzHeVB0OCRKXsWkqHQr6xnEDAObdpwD7BD10DpdQDnSa\n" + + "HP7CArFQIuA78aIXpaVidfWVMu1mEAm4OARobO74EgorBgEEAZdVAQUBAQdAXgno\n" + + "M3Qa9wevqtyAY5MzVz3y6KTYtnfrC/YXG1fc7Q4DAQgHwnUEGBYKAB0Fgmhs7vgC\n" + + "ngECmwwFFgIDAQAECwkIBwUVCgkICwAKCRBULcn2/K6tY7GuAP9Kf1Ec1GJmZ99U\n" + + "HsgiN60os+6adMLj4G2ASiIbNSDvKgD9F/VLFIb/eN7kJQp3E5C15x5pMMKEI/rj\n" + + "wdrKmYH3aAw=\n" + + "=4uX6\n" + + "-----END PGP PUBLIC KEY BLOCK-----"; + + @FuzzTest( + maxDuration = "60s" + ) + public void verifyFuzzedSig(FuzzedDataProvider provider) throws IOException { + byte[] sig = provider.consumeBytes(1024); + if (sig.length == 0) { + return; + } + + try { + List verifs = sop.verify() + .cert(cert.getBytes(StandardCharsets.UTF_8)) + .signatures(sig) + .data(data); + + if (verifs.isEmpty()) { + return; + } + + for (Verification v : verifs) { + System.out.println(v.toString()); + } + } catch (SOPGPException.NoSignature e) { + // ignore + } catch (SOPGPException.BadData e) { + // expected + } + } +} diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-94d4f79102352b762d29a2596cec0a16fb4f6a61 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-94d4f79102352b762d29a2596cec0a16fb4f6a61 new file mode 100644 index 00000000..69e7d806 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-94d4f79102352b762d29a2596cec0a16fb4f6a61 @@ -0,0 +1 @@ +xjsFwxylML8M9MlS \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f76fa673913fd9409423d16fc3593596cbf71023 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f76fa673913fd9409423d16fc3593596cbf71023 new file mode 100644 index 00000000..b3235e56 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f76fa673913fd9409423d16fc3593596cbf71023 @@ -0,0 +1 @@ +xjx \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-0cf7eacc2a3bac835ac97aa40d8f7735cef966c4 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-0cf7eacc2a3bac835ac97aa40d8f7735cef966c4 new file mode 100644 index 0000000000000000000000000000000000000000..6cc3e018540bff51f8c0ffe2b690e3c4b7f6e012 GIT binary patch literal 118 zcmX?9%EBNf!l2IDl#%o92d9A2*V_DiN0%#NiY$68i*{@LjlQ4vI3Nus%)qcyiIL&r zt{AD)+P2%CzgnYV$B;1jgj9*=l)pB@i@1CjrK-3_TD5)U5H7n*x G6DI%<88Nj0 literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-13384a176fc0bacf13f7a6431bdca5ccc30f8baa b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-13384a176fc0bacf13f7a6431bdca5ccc30f8baa new file mode 100644 index 0000000000000000000000000000000000000000..7bcd5f1655be63a99f24cdd000726040f25c0ccf GIT binary patch literal 103 zcmX?9%EBNf!oa}5#-h&Jl#%o92d9A2*V_DiN0%#NiYyEaJCzt2F7AqvI<0NH?fI)U w8g>i`lTS#Mcux6iBfN;qcTuX^k8}16d(U3{eBirIFPe5q1?jC>F;AK}0dE2*J^%m! literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-40a90a6a0d5a51ec600e9ec6b54e7377f072fd3c b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-40a90a6a0d5a51ec600e9ec6b54e7377f072fd3c new file mode 100644 index 0000000000000000000000000000000000000000..9998542abdec9a32ad3170485ab496636eea61a5 GIT binary patch literal 447 zcmX?9%EBPV#h}jGl#%o92d9A2*V_DiN0%#NiY$68i*{@LjlQ4vI3Nus%)qcyiIL&r zt{AD)+P2%CzgnYV$B;1jgj9*=l)pB@i@1CjrKF;AK}57EzBh=1S?A5?Bb4id7$5diTFzWo3I literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5a8ca84c7d4d9b055f05c55b1f707f223979d387 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5a8ca84c7d4d9b055f05c55b1f707f223979d387 new file mode 100644 index 00000000..54a81dca --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5a8ca84c7d4d9b055f05c55b1f707f223979d387 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5aed3e11291d53244b523b605011b3b0fd26ba4b b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5aed3e11291d53244b523b605011b3b0fd26ba4b new file mode 100644 index 0000000000000000000000000000000000000000..69fb1789b90b46deaa6560ed224c65e8b63612da GIT binary patch literal 56 wcmX?9%EBNf!l2IDl#%o92d5$n1A`_55Qu?Ta2^ALB?E&YNE`&@7&bBh012lC=Kufz literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5f55f2f1999e35e7dc4da488679f149bc38a9ace b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5f55f2f1999e35e7dc4da488679f149bc38a9ace new file mode 100644 index 0000000000000000000000000000000000000000..cd3eff15d3808bd746e3f07dc76d9b76fa8be2a5 GIT binary patch literal 119 zcmX?9%EBPV#i0I#fq~)O4^9E4ueJI4jxJZk6j}6G7VXyf8+||TaX=bOn1NxZ5+lRK zT`^LpwQaXOf3-%#jv-<438@m#DSvH*7jgM6N>%%Dj*(&S*^8eKeAnqkGg4APdTUn9 HlO|38{An>Y literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-6a5368d90575590101c96b99febb74e17388e388 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-6a5368d90575590101c96b99febb74e17388e388 new file mode 100644 index 0000000000000000000000000000000000000000..3aeda8f0374604ea4afb753417a4f19e9c031104 GIT binary patch literal 476 zcmX?9%EBPV#h}jGl#%o92d9A2*V_DiN0%#NiY$68i*{@LjlQ4vI3Nus%)qcyiIL&r zt{AD)+P2%CzgnYV$B;1jgj9*=l)pB@i@1CjrKF;AK}4~<$23gl**1~LE#A<2IL literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-9e75de4a2f16140d7f0fc47f1b17c24186cfcdec b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-9e75de4a2f16140d7f0fc47f1b17c24186cfcdec new file mode 100644 index 0000000000000000000000000000000000000000..a48fe0daba1d350d80c2c0e8362b882915ac9e55 GIT binary patch literal 188 zcmX?9%EBPV#h}jGl#%o92d9A2*V_DiN0%#NiY$68i*{@LjlQ4vI3Nus%)qcyi;>~t zt{AD)+P2%CzgnYV$B;1jgj9*=l)pB@i@1CjrKF;AK}55cSzA=+LgxV)}ueJI4jxJZk6j}6G7VXyf8+||TaX=bOn1NxZ5+lRK zT`^LpwQaXOf3-%#jv-<438@m#DSvH*7jgM6N>%%Dj*(&S*^8eKeAnq^nv|}nntv^N eliQ}O57v#63esD%VxBZ{9zwNN0A@aotpxxh(`6F? literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-c71f29422931ea494827e83f146ff3caed79129f b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-c71f29422931ea494827e83f146ff3caed79129f new file mode 100644 index 0000000000000000000000000000000000000000..9221390aa7406171dba1968d27a6491780156f14 GIT binary patch literal 119 zcmX?9%EBPV#h}jGl#%o92d9A2*V_DiN0%#NiY$68i*{@LjlQ4vI3Nus%)qcyiIMT* zt{AD)+P2%CzgnYV$B;1jgj9*=l)pB@i@1CjrKF;AK}0VsMhNdN!< literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-ce933ff5f8546a54ac5d85df62509dc8c6faf74e b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-ce933ff5f8546a54ac5d85df62509dc8c6faf74e new file mode 100644 index 0000000000000000000000000000000000000000..62d83b0b99793c289848bf5c6c0ade3b17e25dac GIT binary patch literal 119 zcmX?9%EBPV#h}jGl#%o92d9A2*V_DiN0%#NiY$68i*{@LjlQ4vI3Nus%)qcyiIL&r zt{AD)+P2%CzgnYV$B;1jgj9*=l)pB@i@1CjrKF;AK}0Vp>zNB{r; literal 0 HcmV?d00001 From 06b3452c6cdd373b5e881a73602a850f156ee27b Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Tue, 8 Jul 2025 14:34:55 +0200 Subject: [PATCH 09/20] Add fuzzing data to REUSE.toml --- REUSE.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/REUSE.toml b/REUSE.toml index 66b5e867..42e7dc3e 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -111,6 +111,12 @@ precedence = "aggregate" SPDX-FileCopyrightText = "2022 Paul Schaub " SPDX-License-Identifier = "Apache-2.0" +[[annotations]] +path = "pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2025 Paul Schaub " +SPDX-License-Identifier = "CC0-1.0" + [[annotations]] path = ".github/ISSUE_TEMPLATE/**" precedence = "aggregate" From 95eb73a8c7dcb14cc9c1545f2ef0d6d378b6b579 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Tue, 8 Jul 2025 15:03:59 +0200 Subject: [PATCH 10/20] Add more test vectors --- .../sop/fuzzing/SignatureFuzzTest.java | 261 ++++++++++++++++-- ...h-0a029b82575b0e76bd3fb06c215091f8fdbd98e6 | 21 -- ...h-1f62a2420a02ef980e60d0d4ab2c1533dbd30333 | 1 - ...h-2dac4aca575d32e777d909bee76ae15a353fa725 | 19 -- ...h-315fa4eed3a87da9415b93b47195902308f83963 | 6 - ...h-4ded2defb9d9d728ed6bd2ae30957985122073df | Bin 172 -> 0 bytes ...h-56ef8d72d34df75d4618b3e8b50a126e9fd60dfe | 1 - ...h-5a6b875c86e8e9778c5454164b573d6db64f47f5 | 1 - ...h-659c9a1c28029f7560b17c33f46652293fe3ff5b | 3 - ...h-683e76bcd514f90093ee6fded36b704360f8521c | 21 -- ...h-69d0980b9798ae5ea5a1cd4a1054b8dc0ae5d9ee | 19 -- ...h-79e915474e9a2d7508fb6baa8c0b930ec317c72b | 15 - ...h-806000130f90ce82b72e494ef5fb871869da8639 | 16 -- ...h-8e3b42793b220b96d02cf8942d0311b930594e01 | 6 - ...h-92fe4e1d57663a9b8f1afaf42b2b7ab19b1511be | 1 - ...h-94d4f79102352b762d29a2596cec0a16fb4f6a61 | 1 - ...h-9bc5937c36255779a76d5e95128766c09402a307 | 7 - ...h-d0b2edb49cc29d978a5430b23902345ff7a09a6e | 8 - ...h-e04f0ac5d8c756e1bd162b2cc9748d97261b64cd | 5 - ...h-e27bd5104a595844730f44df571de7da07951ffb | 1 - ...h-f65d905bc7b32e64073841a61f1d8253eb41eb30 | 1 - ...h-f71e5adcab8e580f85e84ce95f4064524775f5c8 | 1 - ...h-f76fa673913fd9409423d16fc3593596cbf71023 | 1 - ...h-fc6fab834e7fe57b374df7f66cfa0f420e91bc24 | 6 - ...h-0cf7eacc2a3bac835ac97aa40d8f7735cef966c4 | Bin 118 -> 0 bytes ...h-13384a176fc0bacf13f7a6431bdca5ccc30f8baa | Bin 103 -> 0 bytes ...h-40a90a6a0d5a51ec600e9ec6b54e7377f072fd3c | Bin 447 -> 0 bytes ...h-5a8ca84c7d4d9b055f05c55b1f707f223979d387 | 1 - ...h-5aed3e11291d53244b523b605011b3b0fd26ba4b | Bin 56 -> 0 bytes ...h-5f55f2f1999e35e7dc4da488679f149bc38a9ace | Bin 119 -> 0 bytes ...h-6a5368d90575590101c96b99febb74e17388e388 | Bin 476 -> 0 bytes ...h-9e75de4a2f16140d7f0fc47f1b17c24186cfcdec | Bin 188 -> 0 bytes ...h-9e9ebd7736a1e6ee971dc3d328e9e929caaa101b | Bin 119 -> 0 bytes ...h-a398e552b9fe8bcb6d6c2cac6fb6e564762c87f9 | Bin 41 -> 0 bytes ...h-a4dc44449d64decbb5459f8572b54af63a4eb4f8 | 1 - ...h-bea7acca1916ad2e8fcc55c6c22372fa8db47f10 | 1 - ...h-c000a51366616d33f9df61c9260fba450f9e2e7c | 1 - ...h-c4a0ed88c991d1482b6eb0301f6a48005a711def | Bin 238 -> 0 bytes ...h-c71f29422931ea494827e83f146ff3caed79129f | Bin 119 -> 0 bytes ...h-ce933ff5f8546a54ac5d85df62509dc8c6faf74e | Bin 119 -> 0 bytes ...h-dae649c2d3128fa2e70857e1d4598566ec669192 | Bin 153 -> 0 bytes ...h-f03f6f5bb897abe1c95a7058ebfb101855207798 | 1 - .../{sig.asc => sig_v4_ed25519.asc} | 0 .../{sig.bin => sig_v4_ed25519.bin} | Bin .../verifyFuzzedSig/sig_v4_nist-p256.asc | 7 + .../verifyFuzzedSig/sig_v4_nist-p256.bin | Bin 0 -> 119 bytes .../verifyFuzzedSig/sig_v4_nist-p384.asc | 8 + .../verifyFuzzedSig/sig_v4_nist-p384.bin | Bin 0 -> 151 bytes .../verifyFuzzedSig/sig_v4_nist-p521.asc | 8 + .../verifyFuzzedSig/sig_v4_nist-p521.bin | Bin 0 -> 187 bytes .../verifyFuzzedSig/sig_v4_rsa4096.asc | 16 ++ .../verifyFuzzedSig/sig_v4_rsa4096.bin | Bin 0 -> 566 bytes .../verifyFuzzedSig/sig_v6_ed25519.asc | 8 + .../verifyFuzzedSig/sig_v6_ed25519.bin | Bin 0 -> 154 bytes .../verifyFuzzedSig/sig_v6_ed448.asc | 9 + .../verifyFuzzedSig/sig_v6_ed448.bin | Bin 0 -> 205 bytes 56 files changed, 292 insertions(+), 191 deletions(-) delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-0a029b82575b0e76bd3fb06c215091f8fdbd98e6 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-1f62a2420a02ef980e60d0d4ab2c1533dbd30333 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-2dac4aca575d32e777d909bee76ae15a353fa725 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-315fa4eed3a87da9415b93b47195902308f83963 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-4ded2defb9d9d728ed6bd2ae30957985122073df delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-56ef8d72d34df75d4618b3e8b50a126e9fd60dfe delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-5a6b875c86e8e9778c5454164b573d6db64f47f5 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-659c9a1c28029f7560b17c33f46652293fe3ff5b delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-683e76bcd514f90093ee6fded36b704360f8521c delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-69d0980b9798ae5ea5a1cd4a1054b8dc0ae5d9ee delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-79e915474e9a2d7508fb6baa8c0b930ec317c72b delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-806000130f90ce82b72e494ef5fb871869da8639 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-8e3b42793b220b96d02cf8942d0311b930594e01 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-92fe4e1d57663a9b8f1afaf42b2b7ab19b1511be delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-94d4f79102352b762d29a2596cec0a16fb4f6a61 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-9bc5937c36255779a76d5e95128766c09402a307 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-d0b2edb49cc29d978a5430b23902345ff7a09a6e delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e04f0ac5d8c756e1bd162b2cc9748d97261b64cd delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e27bd5104a595844730f44df571de7da07951ffb delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f65d905bc7b32e64073841a61f1d8253eb41eb30 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f71e5adcab8e580f85e84ce95f4064524775f5c8 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f76fa673913fd9409423d16fc3593596cbf71023 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-fc6fab834e7fe57b374df7f66cfa0f420e91bc24 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-0cf7eacc2a3bac835ac97aa40d8f7735cef966c4 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-13384a176fc0bacf13f7a6431bdca5ccc30f8baa delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-40a90a6a0d5a51ec600e9ec6b54e7377f072fd3c delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5a8ca84c7d4d9b055f05c55b1f707f223979d387 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5aed3e11291d53244b523b605011b3b0fd26ba4b delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5f55f2f1999e35e7dc4da488679f149bc38a9ace delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-6a5368d90575590101c96b99febb74e17388e388 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-9e75de4a2f16140d7f0fc47f1b17c24186cfcdec delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-9e9ebd7736a1e6ee971dc3d328e9e929caaa101b delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-a398e552b9fe8bcb6d6c2cac6fb6e564762c87f9 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-a4dc44449d64decbb5459f8572b54af63a4eb4f8 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-bea7acca1916ad2e8fcc55c6c22372fa8db47f10 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-c000a51366616d33f9df61c9260fba450f9e2e7c delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-c4a0ed88c991d1482b6eb0301f6a48005a711def delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-c71f29422931ea494827e83f146ff3caed79129f delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-ce933ff5f8546a54ac5d85df62509dc8c6faf74e delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-dae649c2d3128fa2e70857e1d4598566ec669192 delete mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-f03f6f5bb897abe1c95a7058ebfb101855207798 rename pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/{sig.asc => sig_v4_ed25519.asc} (100%) rename pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/{sig.bin => sig_v4_ed25519.bin} (100%) create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p256.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p256.bin create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p384.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p384.bin create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p521.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p521.bin create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_rsa4096.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_rsa4096.bin create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v6_ed25519.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v6_ed25519.bin create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v6_ed448.asc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v6_ed448.bin diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java index 7d578824..3d14ffb8 100644 --- a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java @@ -6,6 +6,7 @@ package org.pgpainless.sop.fuzzing; import com.code_intelligence.jazzer.api.FuzzedDataProvider; import com.code_intelligence.jazzer.junit.FuzzTest; +import org.junit.jupiter.api.Test; import org.pgpainless.sop.SOPImpl; import sop.SOP; import sop.Verification; @@ -20,30 +21,7 @@ public class SignatureFuzzTest { private final SOP sop = new SOPImpl(); private final byte[] data = "Hello, World!\n".getBytes(StandardCharsets.UTF_8); - private final String key = "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" + - "Comment: D7BC FF6B B105 40D9 87F9 CB6E 542D C9F6 FCAE AD63\n" + - "Comment: Alice \n" + - "\n" + - "lFgEaGzu+BYJKwYBBAHaRw8BAQdAlqjB241N44drAJvxa3wx0uRb5bxuVNXrCwPZ\n" + - "yf4Qg+MAAQCpACcGmoOPZISRbMjRzI/0Wf5iIZwp7r9huzLe6NToBRFxtBxBbGlj\n" + - "ZSA8YWxpY2VAcGdwYWlubGVzcy5vcmc+wpUEExYKAEcFgmhs7vgJEFQtyfb8rq1j\n" + - "FiEE17z/a7EFQNmH+ctuVC3J9vyurWMCngECmwEFFgIDAQAECwkIBwUVCgkICwWJ\n" + - "CWYBfwKZAQAA1SMBAIuffSIKKkG73rWInDrfV6G0kCh/uP7Qf3Jh4A+x5BrvAP42\n" + - "KANAmmLmDVsPGWEPEAlCAJFwKZvHzvYsk8dEFNZEDJxYBGhs7vgWCSsGAQQB2kcP\n" + - "AQEHQOPChGD0z51fOsnFswJPNmhzxdhZHuXCxbEJ+/5WhU9QAAEA3i0J/Vbyhj92\n" + - "kd8gsjLUIkbDHGGDb/vfRCgmRAySF1MOL8LAFQQYFgoAfQWCaGzu+AKeAQKbAgUW\n" + - "AgMBAAQLCQgHBRUKCQgLXyAEGRYKAAYFgmhs7vgACgkQIvV9b29BRNSV1AEAtywX\n" + - "h7bdVq0597D0JfASIvo/ksyHsTyf/JRVH6M0Gv0A/RvFJnVRt1EitamD8i2mX2H3\n" + - "yC2lP2t1WzTafT7GzkYMAAoJEFQtyfb8rq1jhRABAIb/GkyCOlU02zfDMd5UHQ4J\n" + - "EpexaSodCvrGcQMA5t2nAPsEPXQOl1AOdJoc/sICsVAi4DvxohelpWJ19ZUy7WYQ\n" + - "CZxdBGhs7vgSCisGAQQBl1UBBQEBB0BeCegzdBr3B6+q3IBjkzNXPfLopNi2d+sL\n" + - "9hcbV9ztDgMBCAcAAP9hFCttDV8qWyven96rQ0WKGfVo1bKp2EZHGUR7tIScWA9P\n" + - "wnUEGBYKAB0Fgmhs7vgCngECmwwFFgIDAQAECwkIBwUVCgkICwAKCRBULcn2/K6t\n" + - "Y7GuAP9Kf1Ec1GJmZ99UHsgiN60os+6adMLj4G2ASiIbNSDvKgD9F/VLFIb/eN7k\n" + - "JQp3E5C15x5pMMKEI/rjwdrKmYH3aAw=\n" + - "=hnEg\n" + - "-----END PGP PRIVATE KEY BLOCK-----"; - private final String cert = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + + private final String v4_ed25519 = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + "Comment: D7BC FF6B B105 40D9 87F9 CB6E 542D C9F6 FCAE AD63\n" + "Comment: Alice \n" + "\n" + @@ -64,6 +42,233 @@ public class SignatureFuzzTest { "wdrKmYH3aAw=\n" + "=4uX6\n" + "-----END PGP PUBLIC KEY BLOCK-----"; + private static final String v4_rsa4096 = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + + "Comment: C2C1 DB5E 3AE2 9711 62D9 7BFB 101D 531D 1C69 12A7\n" + + "Comment: Alice \n" + + "\n" + + "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\n" + + "XgWruN+wC+b9XY+Rrn+5\n" + + "=ppAk\n" + + "-----END PGP PUBLIC KEY BLOCK-----"; + + private static final String v4_nistP256 = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + + "Comment: 7A00 864E BC9C 503A 05C7 4687 338C BC25 2B16 66D4\n" + + "Comment: Alice \n" + + "\n" + + "xlIEaG0TDxMIKoZIzj0DAQcCAwRixWErG7QLr7ACFxUGjnVHuy1fzaHArCjhXQdJ\n" + + "cFkly6lxXqpth8a6Ef7ww4xicoCBUkMWDcMDmArolc8pzK7ZzRxBbGljZSA8YWxp\n" + + "Y2VAcGdwYWlubGVzcy5vcmc+wp8EExMKAFEFgmhtEw8JEDOMvCUrFmbUFqEEegCG\n" + + "TrycUDoFx0aHM4y8JSsWZtQCmwEFFQoJCAsFFgIDAQAECwkIBwknCQEJAgkDCAEC\n" + + "ngkFiQlmAYACmQEAAAjYAP9/DDAzA0Ykon8ACI6atMQYYnbIU894956akr64mmo9\n" + + "FgEAke0o9t/zrH0z1LD7yr3qkW0j+NK2OEy1XIjADrp5wRLOUgRobRMPEwgqhkjO\n" + + "PQMBBwIDBAqrl9l6YvdrzOWXO4ZFakQCI22HGw4U806IrjGuYFBwdhnu+lGFVFsD\n" + + "CGMXY2ZhslsSNAJNDrxAP+xeAulDaDvCwBgEGBMKAIoFgmhtEw8JEGTDz6W23cHo\n" + + "FqEE4bpPaE2vfK5LIsVuZMPPpbbdwegCmwJfIAQZEwoABgWCaG0TDwAKCRBkw8+l\n" + + "tt3B6HvEAQDN/84YKO0rDGbVyZEuVrOxeHXTC/8DlhHYx9Am5TZu9wD+NJCIzwzU\n" + + "a4fPISDUJRH+vxAHsRSp4rOCod+tgXsq+7wAANrKAP9dyYnyMEfZcts3i/BZo25D\n" + + "pqIrfDeZ1ZwP7mMZQ9lmRgEAqKKGBSLnLViyng5Z7Q5BqzW01q7CkLXZZ5IXaNns\n" + + "0XTOVgRobRMPEggqhkjOPQMBBwIDBC9IY09+8DOpG9aOK2iY6isENu6TvDClVvug\n" + + "SBnnsUdS3fOhVYYfcniboqrV6+BmfpbwptdGyD0yBUwzfL62/QADAQgHwngEGBMK\n" + + "ACoFgmhtEw8JEMlGff4yehhJFqEEC15pityd3XNDfeS0yUZ9/jJ6GEkCmwwAAHt4\n" + + "AQDG3xESM+ryzFUb8c4ldcb5NQ32eg0L1nFgTQEBHNJFpQEAi5xO1ZM4wEOlzk3e\n" + + "SC3qFyx9K6WQBlpY7TNdgqX8aEY=\n" + + "=1lGG\n" + + "-----END PGP PUBLIC KEY BLOCK-----\n"; + private static final String v4_nistP384 = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + + "Comment: C52D CD97 0953 D8A9 3136 509D 20B0 88C6 9BBF 089C\n" + + "Comment: Alice \n" + + "\n" + + "xm8EaG0TIhMFK4EEACIDAwTn7aRgEpefzWD3a9g/h7BA6EOVHxcV93BKE2Zf53kT\n" + + "Yvs13YmY1wTDjsYbHTGTMmm46Q+QSphhiWTVyodykqinFnhmmt/R1L4Z3qQWVBWE\n" + + "JNyS+swSqPSPQnIEygjqJrPNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7C\n" + + "vwQTEwoAUQWCaG0TIgkQILCIxpu/CJwWoQTFLc2XCVPYqTE2UJ0gsIjGm78InAKb\n" + + "AQUVCgkICwUWAgMBAAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAApfYBgNg1\n" + + "Ni0jkkT1TncTslHERidv+teYXTNhtE1Qe4fK9LM/iTruMo3KI5vLQ0yThODrtAF5\n" + + "AWzr3j/vhAZ0keXBTFiKj+8L564uGZ/Ab2wQUYVNgyrJ4nIylQqjl5v3AoxaQa8s\n" + + "zm8EaG0TIhMFK4EEACIDAwT2Pz19+CkZouSUqvLtDGKdOfiRoAg2TmVEMkjanwyM\n" + + "pml7g4XVh0D0WNktvTltHvDepZU4JO5Dse+zC+KlORk6w6KABrC8dujPlO2miFDO\n" + + "ziqrZClDgkdeJG0F4I/QIbjCwFgEGBMKAKoFgmhtEyIJEBxvr0D4OkYGFqEEB1Ic\n" + + "cXRzT2WMi+p2HG+vQPg6RgYCmwJ/IAQZEwoABgWCaG0TIgAKCRAcb69A+DpGBgnx\n" + + "AYDLFfyzoaL02LRlOULvqicJjDuWII4HHQKlWU0bL1CPdVGLizQBPVIrqOE7ne4X\n" + + "ofQBf3S4CH2TGJdG6joVa5J22VLXhKFVD9MsO7X+QpLcpvpcdWdZpu8pSEIAQ1ck\n" + + "VwJEAgAAzNMBf34fez/WxNFg7autqSXqSRjeQH6EgJeommuCZg90530WnDRQrm53\n" + + "a4Ava+p4nW766gGAxzPG8wZ9YiNFWXP80rPaFnVDUvpAzVN6QulNgA9X++PFdnn8\n" + + "udhXqbn/tjtmhz4ZznMEaG0TIhIFK4EEACIDAwSyypi9tH1VKoyz+whB1u8Poi9n\n" + + "9G5bWBpQwlkqDMz5P7D0To7m2bnif6qjXfBo0e43NLst7XL9YTXKGiHssGWdvBjW\n" + + "nUjM9UXWIpuigAEX5Run5Bn/mryfrIL6ocJIrJkDAQkIwpgEGBMKACoFgmhtEyIJ\n" + + "EB4h59bAP7IKFqEERagGFBZG9V3Kbwc8HiHn1sA/sgoCmwwAAI91AX4hX/+DJLdN\n" + + "jhZXEiY9SX3jyD97VfvZMTokCB7AfPGZ1GIMtaaTgN/fjhlZcQuoQhsBfjUvF5Rr\n" + + "S0CgvzBn3v/m72uykFayWZ06cHufSrgkR7UygCjGlVPO5bp4ZoPhW7FUqg==\n" + + "=UtdE\n" + + "-----END PGP PUBLIC KEY BLOCK-----\n"; + private static final String v4_nistP521 = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + + "Comment: E17E 59B5 7DAD 1868 AA48 053F C762 4862 050A 405F\n" + + "Comment: Alice \n" + + "\n" + + "xpMEaG0TLBMFK4EEACMEIwQAFc+kLfLeUvejNlyhZHH6DF9QGvYD0SzJnTQyecDP\n" + + "GUk0kUFPx0i2UFh/bFNvfqA5DFG/6WSnWcasSNH1YZAXx8cAUXyISgGSiuqGUztw\n" + + "/sSkcTSZ0ZJwHEMNlk8BPDdSgPadvy54BxSR+8bxGj+rFmgdB45V/RrXMYNyYAEF\n" + + "m9HINCfNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CwCIEExMKAFEFgmht\n" + + "EywJEMdiSGIFCkBfFqEE4X5ZtX2tGGiqSAU/x2JIYgUKQF8CmwEFFQoJCAsFFgID\n" + + "AQAECwkIBwknCQEJAgkDCAECngkFiQlmAYACmQEAAMf/AgQPsBNL2LNlZLHr8REB\n" + + "TS1ykw0S1RfEHir2XuneunYVxQD+WIK+f9O3lGoA79ojEnbWY3vn5KYL3uIQGTrs\n" + + "XeJAEAIJAUCmZetIcQD3aixOURerS8gS5pn8jAbSESpzaSyW/EFOCRpMo+zTkZYk\n" + + "/wFfYayLgtRiEscppMUfyb1lwjiN4vePzpMEaG0TLBMFK4EEACMEIwQBc8xQHGwC\n" + + "oG04BAmED/5Ju4EkQJC0qTdCLzktWOyHoVplqcUuMR27cf+kHlF65VUJ2OsX8ETH\n" + + "LHKir9QnPDYSBjcA4Jzq7IBRQrKRF/YKC/UiGI2OMUTB9DF2IpTFWooGEm3WNtY7\n" + + "r97x3OPNAQjg4Jius/OpbSoOwsxC8Wb44Kw/lTPCwJ4EGBMKAM0FgmhtEywJECtT\n" + + "oxFC+nyfFqEEeshC8VthZwiw1D6OK1OjEUL6fJ8CmwKiIAQZEwoABgWCaG0TLAAK\n" + + "CRArU6MRQvp8n5aqAgjS3GZHO7RIJji2zn6Vo7r0C3IXhBx/+ZDmgAEJxZT1WGYR\n" + + "N9Vjii5tpGIKem6U5ChptHulYvFlK+nvnQfpADFSJQIJAQV7tMmyeTsTw8IOFMAJ\n" + + "bxaRU+Bn9X3WqcNugzaBhNREW81WFGnRKd2zEK+GY1FEnZvIOj1UoQSrpjPiYAxz\n" + + "alH9AACLIgII29p8NxOFdMGvvRNcQ5tAr32flqDHD62K3rOYo0qwI1D3OYL6xk6v\n" + + "cjdoLoLoFa5sDse+4QffjJ9UxsEw+Uye85wCCQEaPDUdeLFLzwcqJQp3X7a3Ok1h\n" + + "aV3MYf5NYSrTGGVk8KT7xWZOaLCDWdtAF/kteBT/Prg6NpTBZH8fAbItm3KWks6X\n" + + "BGhtEywSBSuBBAAjBCMEAVBY8RHg8B13ra/HoWvvcNG5gl0yVMhSSSVkjJfyoWyK\n" + + "CMd3OH4fBti+Z+nllPHPlgAaw/6UMQoNq242LWtr+Y/XAX0G2snCs5dWG+biNaee\n" + + "QWvRkL/26KVwAmV1AsIfY577TXva/0y7Dj3hnAO/+x383cCAqwAsjsXrDWoscuf/\n" + + "LLxOAwEKCcK8BBgTCgAqBYJobRMsCRBcxJwrVFEM0hahBLBO62CL4VLDpYpOZVzE\n" + + "nCtUUQzSApsMAACuNQIJAQz2sTSbfeERmHa97smijy+Kqt8ZtDQ+k7vXOMSFGlVO\n" + + "mz84Kzs1+it62a+PaNPM1UnrcRE4NmppCtnVIS6kV8z7AgkBMcH5EeBCe10fbqdm\n" + + "BI0at8JPONR1s7yZ7R7z+G1EsnUkF+t3dzQrCOBlXI83KC+hb5eOXKURkfiZgdpO\n" + + "oR99QtE=\n" + + "=1kU8\n" + + "-----END PGP PUBLIC KEY BLOCK-----\n"; + private static final String v6_curve25519 = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + + "Comment: 075CE2AD 721B3A3E 877329F1 24131A25 A43876BC DD09943D\n" + + "Comment: B1EB5C73 4E98EFEF\n" + + "Comment: Alice \n" + + "\n" + + "xioGaG0TTxsAAAAgAhlYynX3JdyxowVByJP29cYt7tTRVtMEHzj3ctWRaNvNHEFs\n" + + "aWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CwAIGExsKAAAAUwWCaG0TTyKhBgdc\n" + + "4q1yGzo+h3Mp8SQTGiWkOHa83QmUPbHrXHNOmO/vApsBBRUKCQgLBRYCAwEABAsJ\n" + + "CAcJJwkBCQIJAwgBAp4JBYkJZgGAApkBAAAAAD2DIFbG7ai9HSJKlRqtv1c8KTXc\n" + + "7PcJeF0wjKcqxrSCp2Gwhd4/CdfHEeDWxE7x0QRuXERQJLPwae1dYITvsBrk7cR4\n" + + "DpMe33Kqaj2KuWsPWhU5efaIZ68hxurXPH1eHjpXAc4qBmhtE08bAAAAINBT+USX\n" + + "w4Y/WFM6ArUXFrjZAV8+FyUa2aZJps3zZmuiwsB1BhgbCgAAAMYFgmhtE08ioQZB\n" + + "a272wKwg9+XBs4b15pDGecNCy5kqOeZzJrWLET546gKbApkgBhkbCgAAACkioQZB\n" + + "a272wKwg9+XBs4b15pDGecNCy5kqOeZzJrWLET546gWCaG0TTwAAAABLmSA4FypT\n" + + "lEiKE1Jd8isuE3+gXWRZO+/tDkrwsar5dTUFysv0NR+LDOYy/a/HbPCDhEIKjBcY\n" + + "qzTP+3R2ZZe2rGkE+77sht2j1YIcBlzm+t3HA8V20iFn4rpWHy0571hVpggAAAAA\n" + + "Bt0gnCR4K4AuIH7fZr4b9BVJ3k4kIvdk9X7S25yyjw6JxZH17fluPiJQVCu/m0be\n" + + "lj0dfqCHfTPJ2iZl3RLu0e5mBoolbN4JostQ9FzVi9dZ788jYXvnGIUnoBRu57ZO\n" + + "n3UAzioGaG0TTxkAAAAgDRJh03RIU+tZWnyRk684h/GqvO7zL8LJFxL/lHEruULC\n" + + "mwYYGwoAAAAsBYJobRNPIqEGo8G75Tf7oWt8oa59iQ32S6uKCXrpadeS/Xjdt1iE\n" + + "zyECmwwAAAAAQPQgn2hzfU/3y0CkbuuHn0+jdFLJgs8hFpDx0v1cLpiAKvWLBIZI\n" + + "sixI3KLQxiqvxZQXCg+/dQoNO1se4XZ/g6KLvGLzJ6BC5MpUfOfJoGc23u68G2K3\n" + + "WpYP1EQ/UjACBT4I\n" + + "=Uq9u\n" + + "-----END PGP PUBLIC KEY BLOCK-----\n"; + private static final String v6_curve448 = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + + "Comment: 212F1BC9 7FF7DBF0 B6F18D83 F59BB2BC 075F26C3 2CE5F150\n" + + "Comment: 0B770469 11A0A196\n" + + "Comment: Alice \n" + + "\n" + + "xkMGaG0TXxwAAAA5ffh5M4YFiH+SEFbP8SeW7FhJns/56XYfUjk28nejYWQgl4Fd\n" + + "vihxLAtryw6iEscMoudI7NsUWC+AzRxBbGljZSA8YWxpY2VAcGdwYWlubGVzcy5v\n" + + "cmc+wsA0BhMcCgAAAFMFgmhtE18ioQYhLxvJf/fb8LbxjYP1m7K8B18mwyzl8VAL\n" + + "dwRpEaChlgKbAQUVCgkICwUWAgMBAAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZ\n" + + "AQAAAAChXiCvjG1wSHZzZwaVEnfGyMGrhb/l9mjULQFaQmdEgJ33i/iEv6MQYaBS\n" + + "nPRCcI9GLjq/kkz957EhvBxeM1K5OHUAhHLy2AY4ReKB/N5Xz3D7pAivqsQzq/DS\n" + + "gIKfGQxjEt/QPy7C+qsNNHsss4l2mo3ugdV5mQV4DcBzeHJcz7hMce00HRIVRemw\n" + + "JuPhh3gEFN8hAM5DBmhtE18cAAAAOTs6skyf+PcX3A+rsPMjmEGVc1IqJw4xOqoZ\n" + + "gPghbYGGqBrYAqzr//xKshyewSMOH5fmGX8aQyoPgMLA2gYYHAoAAAD5BYJobRNf\n" + + "IqEGC4EDngLrM73LIg5bZQKYVUAM98vVI86Qq6SE4mUxlxkCmwLACyAGGRwKAAAA\n" + + "KSKhBguBA54C6zO9yyIOW2UCmFVADPfL1SPOkKukhOJlMZcZBYJobRNfAAAAAHuS\n" + + "IBQQaYywrO5u+n8R7Xcb+WoQ7FtHUmHpW5triJ/tkwfnufiC56CD465EyLJ9g+Mm\n" + + "IA+5n03AxeH0Yk7afFBgRw9pQlPb2/1P66iexPV7445sjJ9jCK2NTJaAd/H6R+CW\n" + + "iCYl5VCtkoryXNN4yad6OVt+TrEQHCF4vRUpAUAF30EO8LUuUsB0F3D0D0aDglBi\n" + + "tiAAAAAAAAR4ILw9d7lfCTtaOpBEr0YHo8kPzVcBxdDbUfo9UAqScZhwCbSVrANI\n" + + "CJw614Ss3WhTuV+l465zwccF2xh0D+VAue1AwnwnQzp518zFqTXJmOUcs7YuPWyU\n" + + "iQEA/tc+jUg9XL6EQ/5UYMhfj7nO/b8uZuD2KYPtc2e8X3mk1is05fhB9JSOOGib\n" + + "d6su8g3Pv+HQGx4AzkIGaG0TXxoAAAA4WAHz84E3zX2mIoVBETPWdzvumbTqFiUM\n" + + "uiI96b6XmWi21G8F/BdpWs1Gg347x7PbVWfq9SD7t6TCwA0GGBwKAAAALAWCaG0T\n" + + "XyKhBq9bQBVplmkyzKWaEqIweNfJ85ls16CfR2rNXYYs2vDyApsMAAAAAPQUIKzs\n" + + "xWkiYn0kM7FsHGMlMGET0wrdKg4F45dGCHDUHeUZSusp5Zs7okmY6HP4tePSMuMq\n" + + "9whjVqimGN6Xx0ybErP/ku6jExwN6QtYohZempWCZXv3SJteGI8ADuVKmcNT9MBN\n" + + "ic3vixr3vjkXsuUwBQDGDb7SRfA7DGh4mXxAaB5gUwQC+wSIG6D7gIP2Hz0fVj4A\n" + + "=9WFq\n" + + "-----END PGP PUBLIC KEY BLOCK-----\n"; @FuzzTest( maxDuration = "60s" @@ -76,7 +281,13 @@ public class SignatureFuzzTest { try { List verifs = sop.verify() - .cert(cert.getBytes(StandardCharsets.UTF_8)) + .cert(v4_ed25519.getBytes(StandardCharsets.UTF_8)) + .cert(v4_rsa4096.getBytes(StandardCharsets.UTF_8)) + .cert(v4_nistP256.getBytes(StandardCharsets.UTF_8)) + .cert(v4_nistP384.getBytes(StandardCharsets.UTF_8)) + .cert(v4_nistP521.getBytes(StandardCharsets.UTF_8)) + .cert(v6_curve25519.getBytes(StandardCharsets.UTF_8)) + .cert(v6_curve448.getBytes(StandardCharsets.UTF_8)) .signatures(sig) .data(data); diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-0a029b82575b0e76bd3fb06c215091f8fdbd98e6 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-0a029b82575b0e76bd3fb06c215091f8fdbd98e6 deleted file mode 100644 index 6b9bddb1..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-0a029b82575b0e76bd3fb06c215091f8fdbd98e6 +++ /dev/null @@ -1,21 +0,0 @@ ------BEGIN e@pgpainless.org> - -xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 -gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc -0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB -AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM -/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG -r7/wBs4zBGhn3NAWCSsGAQQB2kcPAQEHQD1D735u8pIjW+gOr6tvvIqMJUpUbiM7 -WqP/BM8Xk+RJwsAYBBgWCgCKBYJoZ9zQCRBEVyYx8Um7ABahBBUJTJ3MN3zifxAZ -n0RXJjHxSbsAApsCXyAEGRYKAAYFgmhn3NAACgkQRFcmMfFJuwBMOQEA5EoBlNRO -q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7IIRLfk -g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg -yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB -BAGXVQEFAQEHQHRJlEs915TxWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 -BBgWCgAqBYJoZ9zQCRBqhz9va/rd1hahBOfnmVV9LWWfy/UZPWqHP29r+t3WApsM -AADkCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 -BBgWCgAqBYJoZ9zQCRBqhz9va/rd1hahBOfnmVV9LWWfy/UZPWqHP29r+t3WApsM -AADktwD/TSz5ZK5WFaaLSzpIwyA2U9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM -RoboZGPwWIikfRUOatGph4IRj/5UZmIJ -=hJD/ ------END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-1f62a2420a02ef980e60d0d4ab2c1533dbd30333 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-1f62a2420a02ef980e60d0d4ab2c1533dbd30333 deleted file mode 100644 index c287f99c..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-1f62a2420a02ef980e60d0d4ab2c1533dbd30333 +++ /dev/null @@ -1 +0,0 @@ -wxsFxjyLM8Ml9MlS \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-2dac4aca575d32e777d909bee76ae15a353fa725 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-2dac4aca575d32e777d909bee76ae15a353fa725 deleted file mode 100644 index d55f7332..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-2dac4aca575d32e777d909bee76ae15a353fa725 +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN PGP PUBLIC KE48D8 2FF4 E30E 4BB4 -Comment: Alice - -xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 -gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc -0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB -AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM -/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG -r7/wBs4zBGhn3NASCSsGAQQB2kcPAQEHQD1D735u8pIjW+gOr6tvvIqMJUpUbiM7 -WqP/BM8Xk+RJwsAYBBgWCgCKBYJoZ9zQCRBEVyYx8Um7ABahBBUJTJ3MN3zifxAZ -n0RXJjHxSbsAApsCXyAEGRYKAAYFgmhn3NAACgkQRFcmMfFJuwBMOQEA5EoBlNRO -q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7IIRLfk -g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg -yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB -BAGXVQEFAQEHkQRFcmMfFJuwBMOQEA5EoBlNRO -q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7IIRLfk -g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg -yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+SebQHRJlEs915TxWvrvCNISbvk+uPmZb2sBrEIRXAwU9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM -RoboZGP---END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-315fa4eed3a87da9415b93b47195902308f83963 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-315fa4eed3a87da9415b93b47195902308f83963 deleted file mode 100644 index b3591bb9..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-315fa4eed3a87da9415b93b47195902308f83963 +++ /dev/null @@ -1,6 +0,0 @@ --Kg> - -xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGLnqhkk0fvPzaNnzvp3sv1 -gMq3Zz7CowQTFgoAUQWCaGfc -0AkQSNgv9OMOS4QWoQTduu346NnLVd30E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB -AAQCCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrLgB3AxEcgb \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-4ded2defb9d9d728ed6bd2ae30957985122073df b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-4ded2defb9d9d728ed6bd2ae30957985122073df deleted file mode 100644 index 7bc973b3dd331dd4f49bddcfd656a63c06a79b9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmdO8U~pj2%eUj=s>mvKE3c^Z@wIT&E=Ugc^9(RC&i3<8v-HgY3Nla!V47`GU>0Va qpYQ2WWEAP;T^{M=;M1%jEn#m9U#^K diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-56ef8d72d34df75d4618b3e8b50a126e9fd60dfe b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-56ef8d72d34df75d4618b3e8b50a126e9fd60dfe deleted file mode 100644 index f8ca4f7f..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-56ef8d72d34df75d4618b3e8b50a126e9fd60dfe +++ /dev/null @@ -1 +0,0 @@ -ööööödöööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööö· \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-5a6b875c86e8e9778c5454164b573d6db64f47f5 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-5a6b875c86e8e9778c5454164b573d6db64f47f5 deleted file mode 100644 index c1cb2fac..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-5a6b875c86e8e9778c5454164b573d6db64f47f5 +++ /dev/null @@ -1 +0,0 @@ -‹ \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-659c9a1c28029f7560b17c33f46652293fe3ff5b b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-659c9a1c28029f7560b17c33f46652293fe3ff5b deleted file mode 100644 index 9c6d4277..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-659c9a1c28029f7560b17c33f46652293fe3ff5b +++ /dev/null @@ -1,3 +0,0 @@ -- - -xjMGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGA 138C u5D8 \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-683e76bcd514f90093ee6fded36b704360f8521c b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-683e76bcd514f90093ee6fded36b704360f8521c deleted file mode 100644 index 73df5fbd..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-683e76bcd514f90093ee6fded36b704360f8521c +++ /dev/null @@ -1,21 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Comment: DDBA EEBD D4D9 CB55 DDF9 136C 48D8 2FF4 E30E 4BB4 -Comment: Alice - -xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 -gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc -0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB -AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM -/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG -r7/wBs4zBGhn3NAWCSsGAQQB2kcPAQEHQD1D735u8pIjW+gOr6tvvIqMJUpUbiM7 -WqP/BM8Xk+RJwsAYBBgWCgCKBYJoZ9zQCRBEVyYx8Um7ABahBBUJTJ3MN3zifxAZ -n0RXJjHxSbsAApsCXyAEGRYKAApFgmhn3NAACgkQRFcmMfFJuwBMOQEA5EoBlNRO -q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7IIRLfk -g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg -yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB -BAGXVQEFAQEHQHRJlEs915TxWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 -BBgWCgAqBYJoZ9zQCRBqhz9va/rd1hahBOfnmVV9LWWfy/UZPWqHP29r+t3WApsM -AADktwD/TSz5ZK5WFaaLSzpIwyA2U9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM -RoboZGPwWIikfRUOatGph4IRj/5UZmIJ -=hJD/ ------END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-69d0980b9798ae5ea5a1cd4a1054b8dc0ae5d9ee b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-69d0980b9798ae5ea5a1cd4a1054b8dc0ae5d9ee deleted file mode 100644 index 6a2c8f30..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-69d0980b9798ae5ea5a1cd4a1054b8dc0ae5d9ee +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Comment: DDBA EEBD D4D9 CB55 DDF9 136C 48D8 2FF4 E30E 4BB4 -Comment: Alice - -xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 -gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc -0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB -AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM -/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG -r7/wBs4zBGhn3NAWCSsGAQQB2kcPAQEHQD1D735u8pIjW+gOr6tvvIqMJUpUbiM7 -WqP/BM8Xk+RJwsAYBBgWCgCKBYJoZ9zQCRBEVyYx8Um7ABahBBUJTJ3MN3zifxAZ -n0RXJjHxSbsAApsCXyAEGRYKAAYFgmhn3NAACgkQRFcmMfFJuwBMOQEA5EoBlNRO -q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7IIRLfk -g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg -yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB -BAGXVQEFAQEHQHRJlEs915TxWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwU9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM -RoboZGPwWIikfRUOatGph4IRj/5UZmIJ -=hJD/ ------END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-79e915474e9a2d7508fb6baa8c0b930ec317c72b b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-79e915474e9a2d7508fb6baa8c0b930ec317c72b deleted file mode 100644 index 7ba1b4eb..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-79e915474e9a2d7508fb6baa8c0b930ec317c72b +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN PGP PUBLIC KE48D8 2FF4 E30E 4BB4 -Comment: Alice - -xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 -gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc -0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB -AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM -/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG -r7/wBs4zBYYYYYYYYYYYYYYYYYYYYYYGhn3NAWCSsGAQQB2kcPAQEHQD1D735u8pIjW+gOr6tvvIqMJUpUbiM7 -WqP/BM8Xk+RJwsAYBBgWCgCKBYJoZ9zQCRĀEVyYx8Um7ABahBBUJTJ3MN3zifxAZ -n0RXJjHxSbsAApsCXyAEGRYKAAYFgmhn3NAACgkQRFcmMfFJuwBMOQEA5EoBlNRO -q5hztg049YzV5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7h5xpfn0E+98Mg -yRIA/1P4Pm+26aZ0heLHLmTFEgPcUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB -BAGXVQEFAQEHQHRJlEs915TxWvrvCNI’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’SbvkQLiTtEo+uPmZb2sBrEIRXAwU9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM -RoboZGP---END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-806000130f90ce82b72e494ef5fb871869da8639 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-806000130f90ce82b72e494ef5fb871869da8639 deleted file mode 100644 index 3f67fb7f..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-806000130f90ce82b72e494ef5fb871869da8639 +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Comment: DDBA EEBD D4D9 CB55 DDF9 136C 48D8 2FF4 E30E 4BB4 -Comment: Alice - -xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 -gMq3BzXNHEFsaWNlIDxhbGljZUBwLOCKZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc -0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB -AAQLCQgHCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrgBAL3xEcgVuzmnJ5akqKaM -/csVnquuiisFwxyLM8A+pcSNAP43kNKf9Ml4p6V3ooIHr1bYpKPgEF0+9pssbpxG -r7/wBs4zBGhd35E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB -AAQLCQgHCScJAQkCCQWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 -BBgWCgAqBYJoZ9zQCRBqhz9va/rd1hahBOfnmVV9LWWfy/U^PWqHP29r+t3WApsM -AADktwD/TSz5ZK5WFaaLSzpIwyA2U9XvgUvGD+5bSbanXsYU9LwA/1NWshgcBfDM -RoboZGPwWIikfRUOatGph4IRj/5UZmIJ -=hJD/ ------END PGP PUBLIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-8e3b42793b220b96d02cf8942d0311b930594e01 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-8e3b42793b220b96d02cf8942d0311b930594e01 deleted file mode 100644 index 710df371..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-8e3b42793b220b96d02cf8942d0311b930594e01 +++ /dev/null @@ -1,6 +0,0 @@ -Ó--GIN PGP PUBLICC> - -xjMEaGfc0BYJKwYBBAHĀaRw8BAQdCTOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 -gMq3BzXYNHEFsaWNlIDxŅhbG--- -ljZUBwZ3BhaW5s -ZXNz \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-92fe4e1d57663a9b8f1afaf42b2b7ab19b1511be b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-92fe4e1d57663a9b8f1afaf42b2b7ab19b1511be deleted file mode 100644 index 5d3e5870..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-92fe4e1d57663a9b8f1afaf42b2b7ab19b1511be +++ /dev/null @@ -1 +0,0 @@ -ю’’’’’’’’ \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-94d4f79102352b762d29a2596cec0a16fb4f6a61 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-94d4f79102352b762d29a2596cec0a16fb4f6a61 deleted file mode 100644 index 69e7d806..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-94d4f79102352b762d29a2596cec0a16fb4f6a61 +++ /dev/null @@ -1 +0,0 @@ -xjsFwxylML8M9MlS \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-9bc5937c36255779a76d5e95128766c09402a307 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-9bc5937c36255779a76d5e95128766c09402a307 deleted file mode 100644 index 6cfe266e..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-9bc5937c36255779a76d5e95128766c09402a307 +++ /dev/null @@ -1,7 +0,0 @@ -YB -BAGXVQEFAQEHQHRJlEs915TxWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 -BBgWCgAqBYJoZ9zQIC KEY BLOCK-e7IIRLfk -g0B3O7YMIJ1qaRMAAABjRwEAzOJ3DqNOa43xVQGkxSduiMZvDCth5xpfn0E+98Mg -yRIA/1P4Pm+26aZ0heLHLmTFEgPćUKMit2+Sebjan4/psaYAzjgEaGfc0BIKKwYB -BAGXVQEFAQEHQHRJlEs915TxWvrvCNISbvkQLiTtEo+uPmZb2sBrEIRXAwEIB8J4 -BBgWCgAqBYJoZ9zQIC KEY BLOCK----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-d0b2edb49cc29d978a5430b23902345ff7a09a6e b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-d0b2edb49cc29d978a5430b23902345ff7a09a6e deleted file mode 100644 index 21ed6480..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-d0b2edb49cc29d978a5430b23902345ff7a09a6e +++ /dev/null @@ -1,8 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Comment: DDB-----BEGIN e@pgpainless.org> - -xjMA EEBD D4D9 CB55 DDF9 136C 48D8 EaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvp3sv5 -gMq3BzXNHEFsaWNlIDxhbGljZUBwZ3BhaW5sZXNzLm9yZz7CnwQTFgoAUQWCaGfc5A/JN658scYz+ukS4sIS1WMA/RcFkOZF8DNqhYXlm7jDe7II2FF4 E30E 4BB4RLfk -Comment: Alice - -xjME \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e04f0ac5d8c756e1bd162b2cc9748d97261b64cd b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e04f0ac5d8c756e1bd162b2cc9748d97261b64cd deleted file mode 100644 index 9563c3a2..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e04f0ac5d8c756e1bd162b2cc9748d97261b64cd +++ /dev/null @@ -1,5 +0,0 @@ -- - -xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGlnqhkk0fvPzhNnzvpZXNzLm9yZz7CnwQTFgoAUQWCaGfc -0AkQSNgv9OMOS7QWoQTduu691NnLVd35E2xI2C/04wtKLA5bAQUVCgkACwUWAgMB -AAQLCQgHCwYBBAHaRw8BAQLCQg2C/04w5LtCQMIA \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e27bd5104a595844730f44df571de7da07951ffb b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e27bd5104a595844730f44df571de7da07951ffb deleted file mode 100644 index bd97d753..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-e27bd5104a595844730f44df571de7da07951ffb +++ /dev/null @@ -1 +0,0 @@ -Æ \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f65d905bc7b32e64073841a61f1d8253eb41eb30 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f65d905bc7b32e64073841a61f1d8253eb41eb30 deleted file mode 100644 index ff78111d..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f65d905bc7b32e64073841a61f1d8253eb41eb30 +++ /dev/null @@ -1 +0,0 @@ -ŌÆ,FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f71e5adcab8e580f85e84ce95f4064524775f5c8 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f71e5adcab8e580f85e84ce95f4064524775f5c8 deleted file mode 100644 index 0d632980..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f71e5adcab8e580f85e84ce95f4064524775f5c8 +++ /dev/null @@ -1 +0,0 @@ -³ \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f76fa673913fd9409423d16fc3593596cbf71023 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f76fa673913fd9409423d16fc3593596cbf71023 deleted file mode 100644 index b3235e56..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-f76fa673913fd9409423d16fc3593596cbf71023 +++ /dev/null @@ -1 +0,0 @@ -xjx \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-fc6fab834e7fe57b374df7f66cfa0f420e91bc24 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-fc6fab834e7fe57b374df7f66cfa0f420e91bc24 deleted file mode 100644 index 40013e49..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/ParseCertFuzzTestInputs/parseOpenPGPCert/crash-fc6fab834e7fe57b374df7f66cfa0f420e91bc24 +++ /dev/null @@ -1,6 +0,0 @@ ----PKg> - -xjMEaGfc0BYJKwYBBAHaRw8BAQdATOdV6wukmqSavJGLnqhkk0fvPzaNnzvp3sv5 -gMq3Zz7CowQTFgoAUQWCaGfc -0AkQSNgv9OMOS4QWoQTduu346NnLVd30E2xI2C/04w5LtAKbAQUVCgkICwUWAgMB -AAQQCHCgCScJAQkCCQMIAQKeCQWJCWYBgAKZAQAAqrLgB3AxEcgb \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-0cf7eacc2a3bac835ac97aa40d8f7735cef966c4 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-0cf7eacc2a3bac835ac97aa40d8f7735cef966c4 deleted file mode 100644 index 6cc3e018540bff51f8c0ffe2b690e3c4b7f6e012..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 zcmX?9%EBNf!l2IDl#%o92d9A2*V_DiN0%#NiY$68i*{@LjlQ4vI3Nus%)qcyiIL&r zt{AD)+P2%CzgnYV$B;1jgj9*=l)pB@i@1CjrK-3_TD5)U5H7n*x G6DI%<88Nj0 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-13384a176fc0bacf13f7a6431bdca5ccc30f8baa b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-13384a176fc0bacf13f7a6431bdca5ccc30f8baa deleted file mode 100644 index 7bcd5f1655be63a99f24cdd000726040f25c0ccf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103 zcmX?9%EBNf!oa}5#-h&Jl#%o92d9A2*V_DiN0%#NiYyEaJCzt2F7AqvI<0NH?fI)U w8g>i`lTS#Mcux6iBfN;qcTuX^k8}16d(U3{eBirIFPe5q1?jC>F;AK}0dE2*J^%m! diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-40a90a6a0d5a51ec600e9ec6b54e7377f072fd3c b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-40a90a6a0d5a51ec600e9ec6b54e7377f072fd3c deleted file mode 100644 index 9998542abdec9a32ad3170485ab496636eea61a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 447 zcmX?9%EBPV#h}jGl#%o92d9A2*V_DiN0%#NiY$68i*{@LjlQ4vI3Nus%)qcyiIL&r zt{AD)+P2%CzgnYV$B;1jgj9*=l)pB@i@1CjrKF;AK}57EzBh=1S?A5?Bb4id7$5diTFzWo3I diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5a8ca84c7d4d9b055f05c55b1f707f223979d387 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5a8ca84c7d4d9b055f05c55b1f707f223979d387 deleted file mode 100644 index 54a81dca..00000000 --- a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5a8ca84c7d4d9b055f05c55b1f707f223979d387 +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5aed3e11291d53244b523b605011b3b0fd26ba4b b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5aed3e11291d53244b523b605011b3b0fd26ba4b deleted file mode 100644 index 69fb1789b90b46deaa6560ed224c65e8b63612da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56 wcmX?9%EBNf!l2IDl#%o92d5$n1A`_55Qu?Ta2^ALB?E&YNE`&@7&bBh012lC=Kufz diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5f55f2f1999e35e7dc4da488679f149bc38a9ace b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-5f55f2f1999e35e7dc4da488679f149bc38a9ace deleted file mode 100644 index cd3eff15d3808bd746e3f07dc76d9b76fa8be2a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmX?9%EBPV#i0I#fq~)O4^9E4ueJI4jxJZk6j}6G7VXyf8+||TaX=bOn1NxZ5+lRK zT`^LpwQaXOf3-%#jv-<438@m#DSvH*7jgM6N>%%Dj*(&S*^8eKeAnqkGg4APdTUn9 HlO|38{An>Y diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-6a5368d90575590101c96b99febb74e17388e388 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-6a5368d90575590101c96b99febb74e17388e388 deleted file mode 100644 index 3aeda8f0374604ea4afb753417a4f19e9c031104..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 476 zcmX?9%EBPV#h}jGl#%o92d9A2*V_DiN0%#NiY$68i*{@LjlQ4vI3Nus%)qcyiIL&r zt{AD)+P2%CzgnYV$B;1jgj9*=l)pB@i@1CjrKF;AK}4~<$23gl**1~LE#A<2IL diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-9e75de4a2f16140d7f0fc47f1b17c24186cfcdec b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-9e75de4a2f16140d7f0fc47f1b17c24186cfcdec deleted file mode 100644 index a48fe0daba1d350d80c2c0e8362b882915ac9e55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmX?9%EBPV#h}jGl#%o92d9A2*V_DiN0%#NiY$68i*{@LjlQ4vI3Nus%)qcyi;>~t zt{AD)+P2%CzgnYV$B;1jgj9*=l)pB@i@1CjrKF;AK}55cSzA=+LgxV)}ueJI4jxJZk6j}6G7VXyf8+||TaX=bOn1NxZ5+lRK zT`^LpwQaXOf3-%#jv-<438@m#DSvH*7jgM6N>%%Dj*(&S*^8eKeAnq^nv|}nntv^N eliQ}O57v#63esD%VxBZ{9zwNN0A@aotpxxh(`6F? diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-c71f29422931ea494827e83f146ff3caed79129f b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-c71f29422931ea494827e83f146ff3caed79129f deleted file mode 100644 index 9221390aa7406171dba1968d27a6491780156f14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmX?9%EBPV#h}jGl#%o92d9A2*V_DiN0%#NiY$68i*{@LjlQ4vI3Nus%)qcyiIMT* zt{AD)+P2%CzgnYV$B;1jgj9*=l)pB@i@1CjrKF;AK}0VsMhNdN!< diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-ce933ff5f8546a54ac5d85df62509dc8c6faf74e b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-ce933ff5f8546a54ac5d85df62509dc8c6faf74e deleted file mode 100644 index 62d83b0b99793c289848bf5c6c0ade3b17e25dac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmX?9%EBPV#h}jGl#%o92d9A2*V_DiN0%#NiY$68i*{@LjlQ4vI3Nus%)qcyiIL&r zt{AD)+P2%CzgnYV$B;1jgj9*=l)pB@i@1CjrK8PoKgM$jYy@V`NsF V(K%Pj>4wO~WeZlGHF00!4gls&Gpzss literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p384.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p384.asc new file mode 100644 index 00000000..f83af70b --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p384.asc @@ -0,0 +1,8 @@ +-----BEGIN PGP SIGNATURE----- + +wpUEABMKACcFgmhtFJIJEBxvr0D4OkYGFiEEB1IccXRzT2WMi+p2HG+vQPg6RgYA +AL2NAYD5aJwmYzB4TlroVOkurvhtahKeg0dlph8QQMIW/4w7UrqH4H2t8vzAD/x8 +0F8hGSQBgI+S7r856Oeo3v9o4abFEjKlKu/35+bAIIcqkfeqLNvsSbdMchC+Vzum +h2MD4u247A== +=fnfC +-----END PGP SIGNATURE----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p384.bin b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p384.bin new file mode 100644 index 0000000000000000000000000000000000000000..963b6e3998ee18de067b0c503952e1d6c4bff4b2 GIT binary patch literal 151 zcmX>!m4!i=i$R^WDI-^85~qMn{(6TWR&H!!iY)9wGKD3@{;56PugYM;3=DgF85@3P z%u!1=sPKz=5%N-R-H+TXp?S^jsmtUA91e;7@39Wr)&8J%?WaEn`2W;gh*y+UVQlE1 z^lrc9i{~ru{m*!~?5L2@QmyyjpFcaG(5^M{`zoE=Z#=jA6bbALw_ets%>3x>jyC|z C|3z>B literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p521.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p521.asc new file mode 100644 index 00000000..034597bb --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p521.asc @@ -0,0 +1,8 @@ +-----BEGIN PGP SIGNATURE----- + +wrkEABMKACcFgmhtFLMJECtToxFC+nyfFiEEeshC8VthZwiw1D6OK1OjEUL6fJ8A +AEGWAgkBupKqqpVZ20r0omF9mRa+lVf5y6XduSpBcUrpBVmB6ABjRPdNVc/4HNmB +Jiv2PwM4PJFncnyEMUwbfwtJ3X2TOocCCQGu6cRT25hYO7ShPgLQwOac7FoHpmor +xiMb7jCq3o3itJJJpRSWtTlhKFVH4FXwxih3lqnu54Lp+D7haDc4SuI2mA== +=eQOs +-----END PGP SIGNATURE----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p521.bin b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_nist-p521.bin new file mode 100644 index 0000000000000000000000000000000000000000..25e08a567f7ff2f07111852ceff3b2b68279bb16 GIT binary patch literal 187 zcmV;s07U=7xdZ?c3IHbsf@p0Nvk4F@Q=<_=`h1@jAq0BJLh)N+X9%#=K8`C>qY*;- ze4hXSL6!mu0lJc^s+C#WO7x;(eVG=%l~?)8rQNwIL2*jy1zCaU0Aob=O;ykM9NB>; zEA~GFI6RSOa(sj_OdEd-N!@*uI)?%Y0j}x9Q`?wWJG7xb0?@$boa|Z$rfMt3BOC58 ps@{#_w311s6qdC)VJKBc;8pO(D0h~r?&pH(_&(uiH#kb-Hkg%OR9pZ6 literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_rsa4096.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_rsa4096.asc new file mode 100644 index 00000000..20112876 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_rsa4096.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +wsFzBAABCgAnBYJobRIHCRCtIGpQoDHbwhYhBHRAVPatZ4CR0z2XN60galCgMdvC +AAA5uw//e2P+RbXRAG36In7ngExbYns2lLxOPhQlDvYLDnr+lw2LyLTgtFJ++Ab0 +J3mBogu11mCuREgP7pc8A3okhRZIW4H655p+d9D3nAaxehRK5mVCZW4Y8i7OvOCa ++qsl+oM5MK8Buh2r/IqaTVeuVAZCK/Mfqh0uJtfTmyxIoxZhvJxJkWufDf0L6dop +gphKRpka/KklVawlQsgDxUHZ+xa398qjmqTaWjhYY7z9u8sCl6VX6eQ/2sJFGpKA +Xhtg4YJYewxt9dv5jdOHCzK/MhuMbg1G2P+ZKnWOE6R3kAfBMk5QCqRhgIZ7RovS ++JpeNvan9TYmhM5wdaOniTTEDlZ9chqHrEgXnaUP5T4TboDP8p74n/FJX7sNm/r0 +M9/FainfPjwYdUBj3ao3z5v8q/b3DBPUlqwAsgny7gTOx4KywErjk77G1iOID4Qi +T4KhIGgYsd6Wgwnj76H/7A1V17K8zOzQCIrpVHTSfANseHqF1WQtQCyFArUAW8MR +/aWZHa2iRyI+GvNE+iE+cjdhD63oEoSxb2Ol4ONvO+4PeqUk1xo9jYrQVgfK93QH +ExDq9NaQkx4/+qc7AMMfwIA+3/VuO+Rf2PnWo22mh50PrlvuP7hMOhHIPRwTWUPd +3ataR62uQ5tmOS32FhiLIiPoFhNKeSnm5KnlkO6SEiveMFXRKg0= +=ALLM +-----END PGP SIGNATURE----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_rsa4096.bin b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v4_rsa4096.bin new file mode 100644 index 0000000000000000000000000000000000000000..8b04b4b15675c3e7d4b1198c349ea443d0442d65 GIT binary patch literal 566 zcmV-60?GZt!E*!v0SW*o1%ha85(fzotsrVppfTIR79j+5KvedvXMmB@J(oAFAZk#c zG26lb06Du4|9fNpMYYiYZTcd9=YULGVtY1}yiPt8B@Xrr4toBV4U5RM;IvYH_y+VR zd4Zw}wbo#+L`VuLntpfC_nZc?dK60LWkO|c81gR8yx^Mpt0nq_ zIWVsQx*eEAtDnoRm`X;O8vLmx zRjegK$OFYe+4~l^_sXN1q}p0ISYy2XyUPNXrB~_XKia}Y8j^rs8(`srSbGd@_1pQ4 z(}xQ(zcL$)ZVg7*|CuUvjuWJJkO#psPEZP@VSt8vMvKz;nqD^cr}Z`_gwAkvqo;{9 z#12+{avF!MNEe-@59K}+Zh+77p7@{fNng7SoBH%K-^FSv-#$DTbwFd?syEM@{Hyl& z3=`CrtN^kJ^6muA$AYrJO5>Bh#?~W<4}>C5f}tR27_r`#g9+pBq5td+RoAk-%gn!=oS-7c`4@PspXLFk`gQ4Fjdhi E4G_N&hX4Qo literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v6_ed25519.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v6_ed25519.asc new file mode 100644 index 00000000..021a0c3d --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v6_ed25519.asc @@ -0,0 +1,8 @@ +-----BEGIN PGP SIGNATURE----- + +wpgGABsKAAAAKQWCaG0VOyKhBkFrbvbArCD35cGzhvXmkMZ5w0LLmSo55nMmtYsR +PnjqAAAAAPvQIA4Iq2K0v57sNFtWbQyeRybyrhs5mGF5xGdfrgLsXdTTeR9vYj0q +d7373twGVErwtoecYULB4K86RXkilEKBZBwbbvZY6uvpJmvqyZJcrQ6VlXnq9Vt1 +VADMXhMCt8jWDw== +=a2ih +-----END PGP SIGNATURE----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v6_ed25519.bin b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v6_ed25519.bin new file mode 100644 index 0000000000000000000000000000000000000000..7bd1e7f41c454952551f9e91ce7380e468b0de42 GIT binary patch literal 154 zcmV;L0A>Hem<9kF3IG5ADFuRPZ52Brp$0)~ZuY>eAou0LvxfENkj8n#Ld%&dIp%XF zwTlrxc@-_eZ491ACi1QuIhbL2#Ajcw0_mR0L)$! I0=LN44{eA?RR910 literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v6_ed448.asc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v6_ed448.asc new file mode 100644 index 00000000..f9cf84c4 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v6_ed448.asc @@ -0,0 +1,9 @@ +-----BEGIN PGP SIGNATURE----- + +wsAKBgAcCgAAACkFgmhtFU8ioQYLgQOeAuszvcsiDltlAphVQAz3y9UjzpCrpITi +ZTGXGQAAAABWhiAF9q3I54NfibfICvcMoFaGX39NFlt1PYut1zvX2DcQnHpDaQCe +rQ3VRR82lGzXJ8gKUqL1T7Jv4nBEe2+Hx/UkHKrMrvYc3oGg9WXAotH8lI8iEu+l +4iI8AJUaxSZcM55wFEQO+XW8OHScWDiza5pNkWPDEnulhoERmZOOWixDzW2DpJbp +BIRNeQKEa6n47uY/AA== +=/IGW +-----END PGP SIGNATURE----- diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v6_ed448.bin b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/sig_v6_ed448.bin new file mode 100644 index 0000000000000000000000000000000000000000..a6c8f6944a59095cdf9e44bb82e6369eecbf2a6f GIT binary patch literal 205 zcmV;;05bo=zzPNc90~vc04W86Xl)fwBB2Hgfdifb>odK}A`V++0+>}m4EM{`BhHYk zq=e#SF_#$t00011h9Cv@t;pwtUx~NK3ik}4R)$}HO%_{qJ&Uc^JJ;AZ5S)5LX#k$B z4b?>-Hk54FC&&s?qV-R*Z{l!7dvAxw^&}js%&ztv-hrU?Wx%4*{FIL(67QwrB0K<< z8pS4DGoEl1L=O3Nyf}26SU9t5noW^o!xDR?hJg{8la5*}L(Of2q?YLfgiUz@glnnz H?&d!L#F$!Z literal 0 HcmV?d00001 From 05cea3e5a9e44a5dc1f7bc7246b1af103de4f992 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Wed, 9 Jul 2025 11:24:18 +0200 Subject: [PATCH 11/20] More fuzzing --- .../fuzzing/EncryptedMessageFuzzingTest.java | 394 ++++++++++++++++++ .../sop/fuzzing/SignatureFuzzTest.java | 3 +- ...h-32e33f4ab3ec144d7ecab9104c44ec3776939e2a | Bin 0 -> 253 bytes 3 files changed, 395 insertions(+), 2 deletions(-) create mode 100644 pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTest.java create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-32e33f4ab3ec144d7ecab9104c44ec3776939e2a 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 new file mode 100644 index 00000000..fb830b71 --- /dev/null +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTest.java @@ -0,0 +1,394 @@ +package org.pgpainless.sop.fuzzing; + +import com.code_intelligence.jazzer.api.FuzzedDataProvider; +import com.code_intelligence.jazzer.junit.FuzzTest; +import org.junit.jupiter.api.Test; +import org.pgpainless.sop.SOPImpl; +import sop.SOP; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +public class EncryptedMessageFuzzingTest { + + private final SOP sop = new SOPImpl(); + 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-----"; + + @FuzzTest + public void decryptFuzzedMessage(FuzzedDataProvider provider) { + byte[] ciphertext = provider.consumeBytes(8192); + if (ciphertext.length == 0) { + 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) + .ciphertext(ciphertext) + .toByteArrayAndResult() + .getBytes(); + + assertArrayEquals(data, decrypted); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java index 3d14ffb8..1f7c10e2 100644 --- a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java @@ -6,7 +6,6 @@ package org.pgpainless.sop.fuzzing; import com.code_intelligence.jazzer.api.FuzzedDataProvider; import com.code_intelligence.jazzer.junit.FuzzTest; -import org.junit.jupiter.api.Test; import org.pgpainless.sop.SOPImpl; import sop.SOP; import sop.Verification; @@ -271,7 +270,7 @@ public class SignatureFuzzTest { "-----END PGP PUBLIC KEY BLOCK-----\n"; @FuzzTest( - maxDuration = "60s" + //maxDuration = "60s" ) public void verifyFuzzedSig(FuzzedDataProvider provider) throws IOException { byte[] sig = provider.consumeBytes(1024); diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-32e33f4ab3ec144d7ecab9104c44ec3776939e2a b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SignatureFuzzTestInputs/verifyFuzzedSig/crash-32e33f4ab3ec144d7ecab9104c44ec3776939e2a new file mode 100644 index 0000000000000000000000000000000000000000..b06f0124e133e4f6700ce14d2873038e00621a64 GIT binary patch literal 253 zcmcb(o6G9Lo%^hBE<9qiWby-p|KtICY}z0u(t$i^wpeSGcAfO@Ne(gfhqO%Eq!<}` l-Fw&$efkuBKvsUG9V4^ajLx}IPB%m@E?cnjtcm*)cK}RxiNyc_ literal 0 HcmV?d00001 From 002bd871365394a14af181c110d66684d25285ce Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Wed, 9 Jul 2025 14:09:47 +0200 Subject: [PATCH 12/20] 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 + +mQINBGhuTgcBEADBHeYUkuPBmTu/bUMmw/So8vg9CPv5o4NqSfbutZos+DyPtUa3 +dYLCrRCj/O0pHThHdQBI7L9NGnIgbZ5kwDN4GchIOL0L/1KU6Ew9jz8sAiNuSk8v +IMiIIlDUG8T96zbHlsf18j2p8ILaaJZfXGp/cjGLoayleBd5ToE+yEYbg1fxQ4cL +Xhz7cexW7JPFA3CjsBw6VIEaXuPJ2yoo390xBD42ztmekZ5FFV771EoOtzTsVCuD +irV81TDP7/gf0oUPoNykM/Qz/REmler4KOzfheNDrMRs6XWAcf6ODpYDGgi3LCZa +isPUgJj16VBPDG6ptw7OLsghCMMIewTHMCWYuea1n0qih5oLO/5gISKzWBHhA/JA +WEAsaheSWDxZQO81jWxs7szN4QmCLutReT8b7DnkLoGitmVxlXIXlJuGDi9Hnaev +9blXDrOBWxvbYULwajzxX+gZ0nfDZkKADFYybKAdRzfouoDmqN2yin6kVdHwTtBg +6UbWcgz6G5PbDK1F3wE3vnShoBL9biAxxT8zfB4C/l/NOOC1i4/e1ZVmpmjGmmzv +az9y64W3JhHL8LF98z4ISw0VehT3E6CEMF5icCjIv1xpzqvNuR/iC1iW4G82xY8h +PZGsP3rI05/UVFTd2UrzvswYxyOuab6ZmLCRx2rKkXQqHAm9ZLjVlUDXOwARAQAB +tBxBbGljZSA8YWxpY2VAcGdwYWlubGVzcy5vcmc+wsGTBBMBCgBHBYJobk4LCRAf +SnWTVSytKBYhBBC+LutoSuXKmEm84R9KdZNVLK0oAp4BApsBBRYCAwEABAsJCAcF +FQoJCAsFiQlmAYACmQEAAJa2EACqxSbXi4pO/umaYpH9bXxDAA81GIPBGN0jBQqE +upj/akABS69o30B/Loocr/np8uShofvrR+4KuyaQGq5pEmhXmZToe0BjK8I3e5kG +c2Dj6LkoR6z+UTKIxqS+WtJzMtMOV7bXeyQ7aHIiBol/s6vV/Mn93PEidewv4hKE +T+CuHzDatzn5f41BsT9/d9+T2msO2Brfnvz3/Wv7wG0HOr0LiDvgr65KButA2RKL +z8lcsKaZLsf0kYV1Myvblo33iZd1zd+Msz4yTzDFT6doM59t4mbGlLUj8e27d/In +ur1+mXKbAGmRslmqd269VjFmcgeYr89UmTFQnsEx/eJypq/eOPzJQiOIhhrlQEBN +VOZ8udaormhrSelwSZGZh58Wy5ZsjpG9FF1VHT+ts1FoOm/9gbkm+mVAE+x/2FFw +qOEFzV8IrOxvAaq37gZE2Veg7/3jz3zyB8hr0dWGXUuL43cBsH4hK7aIHhz1epZm +9Z9E+eSf/EnRS3Z701igyVjXcNAXTKjqjzMpicTeKvTBnv7UstdDfLVr7tK+sZTK +Nnm8wO06Lgd9bQxIYUAX1mn5Msu8u0vIu2IsiJZga7KFyaoTEB+ZQ5r8sdgoG50i +BrsrxXboH8y1vhzhCGYzgVsScyyvWhb6GaWbN0QjQPLUGUSLz0yKmCcAevZFKsdy +hT/ZFbkCDQRobk4LARAAu4thy2HvL8YQiGzLH63f0AlmRMq9x6phK3xJbvkDekhe +Nqxazy8lWcxNV/c8PxGl97Itz5aNg/Z1/jG/VqgT8cQbWj8hodGJXfuPg/HBOf65 +WorhL5WG10uaGtfUtRPN5uqNfjzRk+Zed2N2F2iIIqly2HFh/OF22u6pqH6qKoHm +28uwwyelM7fr/6QUkRe87bJufjoyW8z/y9fQvNsY2pQSyO7ZYAWchspJqu1KVtKh +tYG/y48q5m6gAuCzlBbgvyvj9LUfrXMQTMfxlbvTvs6GllEdLQf4UI1Ki8WCWPgS +DOZvUOX40wOrZAxqGOmKZIaTX4LPcjvpZusJKQ6/3uBOLlWBZlMfBlskfv1lWFdo +GB+tSfmdSfapk4zz92Q4BAGvZiEaDbBqlsZCaRLpYXy/0xBGLH88jDwAr6MJsgFP +JZzW40dy7iDBtVfCUatquKMBEqtfLuEIEXC+ef0xUXieM+NTM3D0D5MoiyjordEX +sOlzz27xTUXEVXMJXkcxJljyuvYddAEiqZ72eCT7U30qm2LuXgxu1o1GzA3vntWB +C75UFPuI3mGxyejxmq2INScujLNndK8RUDMczjChZP8ajeLGIJbpJ/9gUq2WK5t7 +HdAQE0KWiYrloF9PNOsMA0wOBc83KIN6FoI2sWdUa8LIGr7HAC9T1yXjMq3OcMUA +EQEAAcLDkgQYAQoCPAWCaG5OHAKeAQKbAgUWAgMBAAQLCQgHBRUKCQgLwV0gBBkB +CgAGBYJobk4cAAoJEDNth2YpLd7yRgwQAK4O7oiQ6qr50mb1FlV0c5A1XvZ9Dp9T +cyrEy9kuwKTHq5fOrX7ST5iBOguI4bktYHSSV+CbFwo8ozS7UCxQHBJoHSf3qQ0Y +sKoYvpEQbQ85SHVe9vWUJeKjBULmvY8qXTwQk9pRo8H5yCqIdTtOupWrrHwJL1pQ +PTN4QUH2DWRBaWkMU1cmLhnfrHjUvr7K2QegPWMCYbWxhtaVcZf5+FZstaI03wg+ +lK0WrgZlNY3tmoORpWgYRUh1FhprynGSrgP5opt7APoYYrCkvjBVD8wu3tcOOUUn +lfN3upO8iMpG9favAkDE4OQhKujTcLn4s6gPLqdhWRnSnzpdUXuiVD30RSYPjvhq +b8ZEgd0SmR7P4w7O89Srk3jPafO505ofVleKkIltt/8yppXx1t4YaWOEE2ofAsJA +pKx6Wru++m0vYLNNqEvzcSOUhEhadieXqoS2Gf78W/Rq1GGiegVJXmAlkpYruzR3 +x3m/sGN5BVO0nN+vAcmzhW/6rY/zt3EP7DgLBwSOn882nF0uknhhkdH2npc/HIkB +yiUHoQpMDMyOIGPv+PTSwr1oZKqdOsZ2E1vejHemEMXJnePKiP9esDzwJwMSMXoE +8f71H5jPfQknQyG2t9CMYXGGwVgrWXAJ1mQyKMlFdUoo2fHGz35JEbxWjxDOlisv +gj9NxDiFyzjrAAoJEB9KdZNVLK0oPjUQAJlCpKrYnZTkNRthpCVNpBNQd2IYYzv8 +mu5lfWIL0ifH1uDp/nARyd1AXlK/k56bZl3h/XWTowe7EVCpgDXwBnsAhhjJ80Z/ +Zo04VT8Z2060Y4lb5r+eFClX9k4d5bVJTJG0oN22zlvlrnSljRARQUaFOsPugOK1 +p6Rq6qyniL4uY7qmsIPqymkwhems5FmzZOChx8woBBqVmbJ2MMb2DWCyGnB/2mXD +rKQaaMIQZ7QOiLYyT9P2pLOZyfTwliFnW3iyPkrt0FUiMKz4p9tuJylG7nvursov +hJ+fnQnWQT99WKc/MTla1bpBl3aCJFVpiPrFWgL+16YOra3aVRvguIm/j4wXjSiK +gi5xjJdm0GjEoMd58uvNnby0zO5H1Cm6r+Vl1F6oS+5RJL3Aprj11cOUufZyAx69 +1ddnY0pgQQScsK6Tfl87iVb8FH+Gb/GMVTFosUpp7VIobH/da5TEmEvBShdTmFpi +5cMKVYo0h+Csvh5mKeh1ALDRo8x0u0n4JAz01yP1Y5fdRGZOPtNCZRHI+eGou5OX +qA6alD3+evMlciEd4vueqLF/AUx46yLtJlOjCR1Cz1Ls3mNWcDOXZMPvu096acwb +prPpvx1XuVR/qYWzcix3Y69c81K8a8Y8OQOVZOKXjFfYtgfHt8eVA+O88BJjMirA +cXuLuJrFz7WYuQINBGhuThwBEACcFOrgQDl10L4laWqKenTQQ6ImcgiGU6V8c+6L +SvgDs27Y2nMvoSsAV8o292+alp48NHVYJiBHNQVQyLabJMxs9aOp90uy37HJ8DZ6 +6BQsPOoVRfkgHJv2MRjV5Xez/d0MMmryp6xFiDx+kKkHj3Dc04dMftwJPR5puW+2 +8wdXxWbVoGRr+ByhrSHVOTxRKpRG/24sa0k9QNTM7jQqBedFmZpPvny8b5KUwpXL +BtuwrhxGQ9FDHH0ZPfX8GoYKRqtNVCeznVz/EJMiM2L4Km7WBHSCJc5sfntLS4VR +Aha+PJaP+IRm/QhGYXzPYYTR/RL+Uog6FHXFnR4JVVhhRoSA9coDPm8Z5fNsQL8N +6iF9cdXBdaC8wyFsey8CgRLLBDzvs8XRruBrFuvLurFrl0mZXmFEstxdMKOK/6su +wMMty/G/Q5jF1exqqsW9Zj1GKYi/TJ5MN811uf9JZqI7+3hnMSw9Y8g3feLym+93 +23fBVh7sQZXXlvzcA6/tGWIjOOQI/irSbbNSrkL+seiT3DvCcb6AFpecCMvc0PlZ +E5FkfCzlTNjZA6F4AhRdTOzB06s1ri9HASf3UTf6p8nQgikxXm7SDAzVNWdwryCz +AnPFpAIVWNzUV39wK98VCWxCd7lyiwwgeLnjoqF7mQxPuT9ONhwhTu3pWWWImaYr +rS1mowARAQABwsFzBBgBCgAdBYJobk4dAp4BApsMBRYCAwEABAsJCAcFFQoJCAsA +CgkQH0p1k1UsrSiC2w/9FIMglUMf3DFympG0xRh8QRrYFEAMFYYc3WTyI+e4r1hy +Y1HnPws06snEbLy2G8XiovUgEt4LDVEPQLbKsiLPYLLD0F2AQ4yWolcP0sJcIjZw +eM8wsjc76F9jH+VoOV6W9aqciTZPIxzbRWvmJH4dkx5MZy+gpCzOjBXD4V+TE8jQ +y1dkN/3hNAbymF/MTAGmtN3Dz9wZDop16/sUcNWz/MnZ9zhrFvFlz/06OsEJBGDV +MDGxvekoi6HLyzmKtF2M3nuI+D7TXP1j5+PiLysHgF9xIdFUkmdxMyNrleMCqqSu +Y20amHjed9PWyIW+6QGxzM3JpSz1x22bMPwY2wnjLjv9/dU2NVED+v9rTvjE7w+Q +SIzcS6deoCbpXbdHag4aVe4ktGDn1qqSkkbFM6L6jCcstppSuBA7UGgVRK8l7yJE +BhiEwvEU4fOu7nKieadPuW+wK1Q3WK2cbSw+ya4QJoLIwhVGp7YmM0ZPpEJ5bNCy +T/xgvREhUQVFkfU1RjSNgUjcTligLKME+uVEkihjJb2aLORc691HyQOYK7uv8UuF +w6AKEnISA0xncWLD4v5HacWnMmXOdGsYzHx8U75KmiigUKL3QkorragCufCCkMCl +k3R34rdjKcJp22a2vrfriG21+1FqjAWCq3u4soalnYreRx/xkibXZ+pMhaTwnWI= +=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 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 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----- From 916809ad609bf9f1c6285fe9709109b58996c687 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 12 Jul 2025 11:29:07 +0200 Subject: [PATCH 13/20] More fuzzing tests and vectors --- .../sop/fuzzing/AsciiArmorFuzzTest.java | 4 +- .../fuzzing/EncryptedMessageFuzzingTest.java | 8 +++- .../sop/fuzzing/PublicKeyPacketFuzzTest.java | 44 ++++++++++++++++++ .../sop/fuzzing/SecretKeyPacketFuzzTest.java | 44 ++++++++++++++++++ .../sop/fuzzing/SignatureFuzzTest.java | 2 +- ...h-72aacd2d82d3c3fa750807ad1138e6a566996f04 | 1 + .../ed25519Legacy_v4.pgp | Bin 0 -> 53 bytes .../ed25519_v4.pgp | 1 + .../ed25519_v6.pgp | Bin 0 -> 44 bytes .../ed448_v4.pgp | Bin 0 -> 65 bytes .../ed448_v6.pgp | Bin 0 -> 69 bytes .../nistP256ECDH_v4.pgp | 1 + .../nistP256ECDH_v6.pgp | Bin 0 -> 92 bytes .../nistP256ECDSA_v4.pgp | 2 + .../nistP256ECDSA_v6.pgp | Bin 0 -> 88 bytes .../nistP384ECDH_v4.pgp | Bin 0 -> 117 bytes .../nistP384ECDH_v6.pgp | Bin 0 -> 121 bytes .../nistP384ECDSA_v4.pgp | Bin 0 -> 113 bytes .../nistP384ECDSA_v6.pgp | Bin 0 -> 117 bytes .../nistP521ECDH_v4.pgp | Bin 0 -> 153 bytes .../nistP521ECDH_v6.pgp | Bin 0 -> 157 bytes .../nistP521ECDSA_v4.pgp | Bin 0 -> 149 bytes .../nistP521ECDSA_v6.pgp | Bin 0 -> 153 bytes ...h-40b0e946bfad779a720ffb4ddf3afda127c381e0 | Bin 0 -> 38 bytes ...h-6ff0478f8c84828619d721a9c582cf0dc048198d | Bin 0 -> 11 bytes ...h-972998632851a93af5c647ad0f8f684afbb6e788 | 1 + ...h-b2703b347fec497f13d319cfd5e337052683f853 | Bin 0 -> 117 bytes ...h-b47757e7135bbaf31049992ed13461a1c95255c9 | Bin 0 -> 15 bytes ...h-fd8f91587a20a22513ee536aec3411052e5b3217 | 1 + .../rsa2048_v4.pgp | Bin 0 -> 272 bytes .../rsa2048_v6.pgp | Bin 0 -> 276 bytes .../rsa4096_v4.pgp | Bin 0 -> 528 bytes .../rsa4096_v6.pgp | Bin 0 -> 532 bytes .../x25519Legacy_v4.pgp | 2 + .../x25519_v4.pgp | 1 + .../x25519_v6.pgp | Bin 0 -> 44 bytes .../PublicKeyPacketFuzzTestInputs/x448_v4.pgp | 1 + .../PublicKeyPacketFuzzTestInputs/x448_v6.pgp | Bin 0 -> 68 bytes .../ed25519Legacy_v4.key.pgp | Bin 0 -> 90 bytes .../ed25519_v4.key.pgp | Bin 0 -> 75 bytes .../ed25519_v6.key.pgp | Bin 0 -> 77 bytes .../ed448_v4.key.pgp | Bin 0 -> 125 bytes .../ed448_v6.key.pgp | Bin 0 -> 127 bytes .../nistP256ECDH_v4.key.pgp | Bin 0 -> 125 bytes .../nistP256ECDH_v6.key.pgp | Bin 0 -> 127 bytes .../nistP256ECDSA_v4.key.pgp | Bin 0 -> 121 bytes .../nistP256ECDSA_v6.key.pgp | Bin 0 -> 123 bytes .../nistP384ECDH_v4.key.pgp | Bin 0 -> 170 bytes .../nistP384ECDH_v6.key.pgp | Bin 0 -> 172 bytes .../nistP384ECDSA_v4.key.pgp | Bin 0 -> 166 bytes .../nistP384ECDSA_v6.key.pgp | Bin 0 -> 168 bytes .../nistP521ECDH_v4.key.pgp | Bin 0 -> 225 bytes .../nistP521ECDH_v6.key.pgp | Bin 0 -> 225 bytes .../nistP521ECDSA_v4.key.pgp | Bin 0 -> 221 bytes .../nistP521ECDSA_v6.key.pgp | Bin 0 -> 223 bytes ...h-28f2677523ed3043117ea46f27bf8b9b990c4e3a | Bin 0 -> 3 bytes ...h-4fbc082c98d268e4495e09d40912053a9c08b896 | 1 + ...h-56fb7129479f381d7cfd4598b540d3b753730ffc | 1 + ...h-6c04193b9d8991eec00fdef05735bfed376c0f6c | 1 + ...h-8eb418bf4e4721c572e13bd11313a1d29de247a9 | Bin 0 -> 17 bytes ...h-e3411c8a800f1d8d38cd62027ff5c51f51ab5224 | Bin 0 -> 18 bytes .../rsa2048_v4.key.pgp | Bin 0 -> 923 bytes .../rsa2048_v6.key.pgp | Bin 0 -> 925 bytes .../rsa4096_v4.key.pgp | Bin 0 -> 1819 bytes .../rsa4096_v6.key.pgp | Bin 0 -> 1821 bytes .../x25519Legacy_v4.key.pgp | Bin 0 -> 95 bytes .../x25519_v4.key.pgp | Bin 0 -> 75 bytes .../x25519_v6.key.pgp | Bin 0 -> 77 bytes .../x448_v4.key.pgp | Bin 0 -> 123 bytes .../x448_v6.key.pgp | Bin 0 -> 125 bytes 70 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTest.java create mode 100644 pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTest.java create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-72aacd2d82d3c3fa750807ad1138e6a566996f04 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/ed25519Legacy_v4.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/ed25519_v4.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/ed25519_v6.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/ed448_v4.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/ed448_v6.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP256ECDH_v4.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP256ECDH_v6.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP256ECDSA_v4.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP256ECDSA_v6.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP384ECDH_v4.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP384ECDH_v6.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP384ECDSA_v4.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP384ECDSA_v6.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP521ECDH_v4.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP521ECDH_v6.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP521ECDSA_v4.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP521ECDSA_v6.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-40b0e946bfad779a720ffb4ddf3afda127c381e0 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-6ff0478f8c84828619d721a9c582cf0dc048198d create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-972998632851a93af5c647ad0f8f684afbb6e788 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-b2703b347fec497f13d319cfd5e337052683f853 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-b47757e7135bbaf31049992ed13461a1c95255c9 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-fd8f91587a20a22513ee536aec3411052e5b3217 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/rsa2048_v4.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/rsa2048_v6.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/rsa4096_v4.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/rsa4096_v6.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/x25519Legacy_v4.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/x25519_v4.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/x25519_v6.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/x448_v4.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/x448_v6.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/ed25519Legacy_v4.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/ed25519_v4.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/ed25519_v6.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/ed448_v4.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/ed448_v6.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP256ECDH_v4.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP256ECDH_v6.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP256ECDSA_v4.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP256ECDSA_v6.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP384ECDH_v4.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP384ECDH_v6.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP384ECDSA_v4.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP384ECDSA_v6.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP521ECDH_v4.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP521ECDH_v6.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP521ECDSA_v4.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP521ECDSA_v6.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-28f2677523ed3043117ea46f27bf8b9b990c4e3a create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-4fbc082c98d268e4495e09d40912053a9c08b896 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-56fb7129479f381d7cfd4598b540d3b753730ffc create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-6c04193b9d8991eec00fdef05735bfed376c0f6c create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-8eb418bf4e4721c572e13bd11313a1d29de247a9 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-e3411c8a800f1d8d38cd62027ff5c51f51ab5224 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/rsa2048_v4.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/rsa2048_v6.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/rsa4096_v4.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/rsa4096_v6.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/x25519Legacy_v4.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/x25519_v4.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/x25519_v6.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/x448_v4.key.pgp create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/x448_v6.key.pgp diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java index c58090b9..7f068506 100644 --- a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java @@ -18,7 +18,9 @@ public class AsciiArmorFuzzTest { private final SOP sop = new SOPImpl(); - @FuzzTest() + @FuzzTest( + maxDuration = "60s" + ) public void armorAndDearmorData(FuzzedDataProvider data) throws IOException { byte[] bytes = data.consumeBytes(1024); 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 7a2c18c0..4cc2daa0 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 @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2025 Paul Schaub +// +// SPDX-License-Identifier: Apache-2.0 + package org.pgpainless.sop.fuzzing; import com.code_intelligence.jazzer.api.FuzzedDataProvider; @@ -67,7 +71,9 @@ public class EncryptedMessageFuzzingTest { return keys; } - @FuzzTest + @FuzzTest( + maxDuration = "60s" + ) public void decryptFuzzedMessage(FuzzedDataProvider provider) { byte[] ciphertext = provider.consumeBytes(8192); if (ciphertext.length == 0) { diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTest.java new file mode 100644 index 00000000..bbd7e662 --- /dev/null +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTest.java @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2025 Paul Schaub +// +// SPDX-License-Identifier: Apache-2.0 + +package org.pgpainless.sop.fuzzing; + +import com.code_intelligence.jazzer.api.FuzzedDataProvider; +import com.code_intelligence.jazzer.junit.FuzzTest; +import org.bouncycastle.bcpg.BCPGInputStream; +import org.bouncycastle.bcpg.UnsupportedPacketVersionException; +import org.bouncycastle.openpgp.PGPObjectFactory; +import org.bouncycastle.openpgp.PGPPublicKeyRing; +import org.bouncycastle.openpgp.bc.BcPGPObjectFactory; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +public class PublicKeyPacketFuzzTest { + + @FuzzTest(maxDuration = "30m") + public void parsePublicKeyPacket(FuzzedDataProvider provider) + { + byte[] encoding = provider.consumeBytes(8192); + if (encoding.length == 0) { + return; + } + + ByteArrayInputStream bIn = new ByteArrayInputStream(encoding); + BCPGInputStream pIn = new BCPGInputStream(bIn); + PGPObjectFactory objFac = new BcPGPObjectFactory(pIn); + try { + Object next = objFac.nextObject(); + if (next == null) return; + + PGPPublicKeyRing pubKey = (PGPPublicKeyRing) next; + } catch (IOException e) { + // ignore + } catch (UnsupportedPacketVersionException e) { + // ignore + } catch (ClassCastException e) { + // ignore + } + } +} diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTest.java new file mode 100644 index 00000000..2d0e94b5 --- /dev/null +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTest.java @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2025 Paul Schaub +// +// SPDX-License-Identifier: Apache-2.0 + +package org.pgpainless.sop.fuzzing; + +import com.code_intelligence.jazzer.api.FuzzedDataProvider; +import com.code_intelligence.jazzer.junit.FuzzTest; +import org.bouncycastle.bcpg.BCPGInputStream; +import org.bouncycastle.bcpg.UnsupportedPacketVersionException; +import org.bouncycastle.openpgp.PGPObjectFactory; +import org.bouncycastle.openpgp.PGPSecretKeyRing; +import org.bouncycastle.openpgp.bc.BcPGPObjectFactory; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +public class SecretKeyPacketFuzzTest { + + @FuzzTest(maxDuration = "30m") + public void parseSecretKeyPacket(FuzzedDataProvider provider) + { + byte[] encoding = provider.consumeBytes(8192); + if (encoding.length == 0) { + return; + } + + ByteArrayInputStream bIn = new ByteArrayInputStream(encoding); + BCPGInputStream pIn = new BCPGInputStream(bIn); + PGPObjectFactory objFac = new BcPGPObjectFactory(pIn); + try { + Object next = objFac.nextObject(); + if (next == null) return; + + PGPSecretKeyRing secKey = (PGPSecretKeyRing) next; + } catch (IOException e) { + // ignore + } catch (UnsupportedPacketVersionException e) { + // ignore + } catch (ClassCastException e) { + // ignore + } + } +} diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java index 1f7c10e2..6d1be4a2 100644 --- a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java @@ -270,7 +270,7 @@ public class SignatureFuzzTest { "-----END PGP PUBLIC KEY BLOCK-----\n"; @FuzzTest( - //maxDuration = "60s" + maxDuration = "60s" ) public void verifyFuzzedSig(FuzzedDataProvider provider) throws IOException { byte[] sig = provider.consumeBytes(1024); diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-72aacd2d82d3c3fa750807ad1138e6a566996f04 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-72aacd2d82d3c3fa750807ad1138e6a566996f04 new file mode 100644 index 00000000..6a639ac1 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/EncryptedMessageFuzzingTestInputs/decryptFuzzedMessage/crash-72aacd2d82d3c3fa750807ad1138e6a566996f04 @@ -0,0 +1 @@ +ĆŃóęqP\ƙ±!J]÷µ,Ź„‡ tÓ ¶Ņ@:Ø0‘.sd³±Ÿ¢å$X“śŻ, ·bc«v7īG‡ \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/ed25519Legacy_v4.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/ed25519Legacy_v4.pgp new file mode 100644 index 0000000000000000000000000000000000000000..fc43a52ae545ab0f23d2e71d52f0a04c556606f3 GIT binary patch literal 53 zcmV-50LuTyGX!XG5{DKED+U1s0oq3o0RaakeJ-E=+u?{-|?X_7ehrP6dTPaXd^F*p`oQTHCou>7T%@ Xcy1%xd#!$D@>|-J91^cn@N+8T08*cE2DUuy|-uJf4<8!;LvL%-Q literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP384ECDH_v4.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP384ECDH_v4.pgp new file mode 100644 index 0000000000000000000000000000000000000000..eb69b803b09f7f43cda1946d49ca503b38773af9 GIT binary patch literal 117 zcmV-*0E+*{a|CE`5{D86D}e+6A_D^iZb%@bH@d1U*{QU=&jaqr#ROxQ-W~VMQJsr6 zM?L5bx+UK)H(A)is+`oa;Xf9JOy9h{X^Cq^^(Z}e+}yv5(Ad8Jk6qmJoWo7Zbhu#E XUwd>x!*#t{^eTFWSD{?z0|5yLLdZD) literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP384ECDH_v6.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP384ECDH_v6.pgp new file mode 100644 index 0000000000000000000000000000000000000000..fcd9418f0c88edb3a4838e5c11c7548b90fb6458 GIT binary patch literal 121 zcmV-<0EYj@cLr#15{D81003d*V!>XQvd@_r<2-#(Jk)}Nf@})Z^Ou-EFIsgOK_3Kns4CXy( bkZe#Vj7X1xoedv@a+Phlb6ro30|5yLuSGJL literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP384ECDSA_v4.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP384ECDSA_v4.pgp new file mode 100644 index 0000000000000000000000000000000000000000..753af46d1324d40a651a97ca577b71afec318b8c GIT binary patch literal 113 zcmV-%0FM90Zv<#?5{DB7D}e+6A_D^iz1KNv8AeWyeQRQL_}9*%8(U4$9hR29nA-DW zd_GZ&oiDEN=dRy7A99x|=2u~=ay&uqxHT_$^!8gknnx8@0s61#j$F4JU literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP384ECDSA_v6.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP384ECDSA_v6.pgp new file mode 100644 index 0000000000000000000000000000000000000000..e64e6b2391ca512ebe6b81a9e9a3603222844379 GIT binary patch literal 117 zcmV-*0E+*{a|UQ|5{DB2003zPD}e+6A_D^iNXr`Zp?6RKmUNWAHeuuDFCp@rs|z{* zW2;XP<6UKTzp5v>P?%}^J_lu~=&84()*)5;Gq4RvD0h7m*R}@%h?AQM7Rm#3-9S-M X1+PV&Wnk`7;`;)aICO(Ct>;NCgk3QX literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP521ECDH_v4.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP521ECDH_v4.pgp new file mode 100644 index 0000000000000000000000000000000000000000..c2dba861877ffdf23151075d4d71ddae2c5d070a GIT binary patch literal 153 zcmV;K0A~Njmjq~V5{D86D}e+6BLpJ^0Tat~A(2rLrQ%T&zs)M(VMCgxs2>_QYG49# zl?6=O@VtV7z!=?z>hHxRdgmd8Of13YNtOo{vS5$=l9Wb3ztaFQDm3(cD}==Hm(5N< z$O;Q%9HLBuFY6In0kWa30!+H59F|ruSvw6Me-e|5(AhmTUkhn^HOZTm9VGrc;k~?4 H0|5#Nv9muz literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP521ECDH_v6.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP521ECDH_v6.pgp new file mode 100644 index 0000000000000000000000000000000000000000..c9c82deef40054d4dcfffedcc5d7168d64c9ec58 GIT binary patch literal 157 zcmV;O0Al~fn+9lb5{D81005B%D}e+6BLpJ^0Q)nYRtOaN1(kOXj(**{G`InZJb{|_ z-c>k)340CE4(?PG&a^AMD5@K}2dFdjDKHM@Sev+gE=B0nWHl&gLYM&H_95;@p4J$4 zi)2Pl;j(oSU4@~*riZbPiBI^~g1}8{<7L(&SOWcm-+3{|&u9&2ZbM0i@$d4q__E7^ LAKT})0|5#Ner`ro literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP521ECDSA_v4.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP521ECDSA_v4.pgp new file mode 100644 index 0000000000000000000000000000000000000000..66a16898aeb3a7cc4bda168f552152123646c71b GIT binary patch literal 149 zcmV;G0BZlnlLTmR5{DB7D}e+6BLpJ^07OH#FM5PS(9jcH*xIsSfDnDD=$uhXt!!SR zxz9i+KoEFKji&<25q$Z{+02zJDM9w~=HmL$^`C0HjMn02-^c(``AZ)7_xw9>{Se`z zPYj+`1ZtPWPbt-%=Ok`ch~Ou|*c0^b D`;AIJ literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP521ECDSA_v6.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/nistP521ECDSA_v6.pgp new file mode 100644 index 0000000000000000000000000000000000000000..e751b3093a987a53a27dc12259b30fac693c3993 GIT binary patch literal 153 zcmV;K0A~Njmj-BX5{DB2004~zD}e+6BLpJ^0r%rB3;=e2(AZ!9yuecN?2d$~yMo%& zQs)+T@@5b1#sESuqCDQFPPHE~vGs+G`B%jSuIQXPBn)^Jds?IldISM#31nxE?v=%> zhe|vhi%FR6{F*Nn8)ts@pV`r~=net1L#pJ)vKjpp&l?WRbpfJPHb<6NQCxInp40}8 HD;pM2`J6-9 literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-40b0e946bfad779a720ffb4ddf3afda127c381e0 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-40b0e946bfad779a720ffb4ddf3afda127c381e0 new file mode 100644 index 0000000000000000000000000000000000000000..6e8f29a8e22a879f4c0629e0d4aa4ba6fd1dbb6b GIT binary patch literal 38 ScmeBY0|EvH1~m|k6951wS^<0j literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-6ff0478f8c84828619d721a9c582cf0dc048198d b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-6ff0478f8c84828619d721a9c582cf0dc048198d new file mode 100644 index 0000000000000000000000000000000000000000..4ad30ddad61a9f2a2b3b2d5b7a11efadea0bdf8a GIT binary patch literal 11 QcmeBYW42~y00L%a00?~m-2eap literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-972998632851a93af5c647ad0f8f684afbb6e788 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-972998632851a93af5c647ad0f8f684afbb6e788 new file mode 100644 index 00000000..ba689842 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-972998632851a93af5c647ad0f8f684afbb6e788 @@ -0,0 +1 @@ +»vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-b2703b347fec497f13d319cfd5e337052683f853 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-b2703b347fec497f13d319cfd5e337052683f853 new file mode 100644 index 0000000000000000000000000000000000000000..ed86d1e54ac98b6d2e6cf7f3df6fd6be88277eb9 GIT binary patch literal 117 VcmdnZ3;{w=8cs1#3g9MTG5~%d0b~FG literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-b47757e7135bbaf31049992ed13461a1c95255c9 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-b47757e7135bbaf31049992ed13461a1c95255c9 new file mode 100644 index 0000000000000000000000000000000000000000..5fc4ff51001737ca7d1447e07bec4c96996987ed GIT binary patch literal 15 QcmeBXV`kpX00qp<01)K?SpWb4 literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-fd8f91587a20a22513ee536aec3411052e5b3217 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-fd8f91587a20a22513ee536aec3411052e5b3217 new file mode 100644 index 00000000..c31520de --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/parsePublicKeyPacket/crash-fd8f91587a20a22513ee536aec3411052e5b3217 @@ -0,0 +1 @@ +æ+ \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/rsa2048_v4.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/rsa2048_v4.pgp new file mode 100644 index 0000000000000000000000000000000000000000..0547008838cb0d08583a06cac5d20f22165329e2 GIT binary patch literal 272 zcmV+r0q_3Cz)b{ba1w_B2mrQ8((4idUoLtR#*N<=;%|BM31(-B*Lc2Lw8&`Jl*R|u43X9i{&VLSiPXwKQ zqEOtu(?ZZ$CJ`nr_^hmQ#DZBE8#$OYEjX02saeNl_a*K{+xBzTJ-Bnl&e>M)FN<{c zZXj|#Mg3K5aj@H^Oh0FA&mY3qtx_*vh7o`>((=9QRCnbao~L|Dvqq9uc5)eXhC>QBNtlscZjeve-0 z5XYSJsBwb7s^)r-3ZEFqLewFlocq@%3TlVnA!y0!iti?`_t=qhhgH}#vYajpzJbxYqb+vQAgTdqN3EfE7fnqxLt=jqTgY3A*S&B}+?Pzr!belZ$Y4eG zo^o^^r-kb?fkd(L!qjqdEq4ZF6huT=oQlspwHi$6=5|$6<6h^RV#@fcFv`fkapcIX zWQh6Axi&6!>y!R#NdzVcwQ`__zhJx$)XJ+TXYw_$1lDzPOhpr5=b#76by{gR S#LGh+0lal*u1x?D0RRE(m;`qK literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/rsa4096_v6.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/rsa4096_v6.pgp new file mode 100644 index 0000000000000000000000000000000000000000..fa112b0c32f4819fa76ae9b617929ff87cc2ced8 GIT binary patch literal 532 zcmV+v0_*+8!BGZia1w_B000695CGC}T;2nsZMVQ%UwxAz&L<+rtR2bgDW(?cT$rIe z(YYk*J1Q}qJ~*`>o*=@-P^F0(+yU~Y`1R*R3U_D#9WBh5(+M(j4z!WCD}yIB&(tt?5Mzq`nOtpx5IE!>9puf;JD}bmY)#1iJRiv^nlr5 zFOT8*t$TgX3UVGdt=InqgCpjUP&X^^z|cEM=3YOSWb{OS&J0lu&=8uzG=K1eK5VB; zCb&YqVW0afhbU7bL3Ps7q|G3x*AkNjy)P^>aD* z*omY9I7>Szoh#ql_zv6Rs--Al!O)~t9)j?G_I1ueQ9<{94#-STmu6+jJrB6rEK*e( z{Z&`SRRE8ats$ie%Z*zXJIA^^Wwh%UN0Y+Go+56u3ln CH4{4k literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/x448_v4.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/x448_v4.pgp new file mode 100644 index 00000000..eda6730e --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/x448_v4.pgp @@ -0,0 +1 @@ +Ę>hp‡ENø¤āś.-†?žFĻB­MŚ_-'ň[k® łqnł³Q»ŠźŌŖą£г&[Ņm¦YĖÓ \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/x448_v6.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTestInputs/x448_v6.pgp new file mode 100644 index 0000000000000000000000000000000000000000..a71f3a735638a6dd5203d4a37cc3dc770d8fce34 GIT binary patch literal 68 zcmV-K0K5OjLI!AX5{DW9001~Y=`gt>s4f(2SaO9hbK0nn>ODZ*mX|#)?|d|O&Ok_T a&KpXjl7|(FEju6738il2qhWC|Is|8jjvGk; literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/ed25519Legacy_v4.key.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/ed25519Legacy_v4.key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..4a8fecd65bcc3c95b8aea947ff0798d153f0ce15 GIT binary patch literal 90 zcmV-g0Hy!MSOjQr5{DKED+U1s0oq3o0Raa85Yk0@A#trVwTT%da*u^Q?CSo`*I@! literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/ed448_v4.key.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/ed448_v4.key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..738ca3a1285a265a51ec52a545e667cef56cc813 GIT binary patch literal 125 zcmV-@0D}L;djx235{Dew>keJ-E=+u?{-|?X_7ehrP6dTPaXd^F*p`oQTHCou>7T%@ zcy1%xd#!$D@>|-J90EGX=c?M{35{DB2002w~DuzhTJp%y;0s{o0XYTn)kxb3ZN=s-2`;c^V@vJ?} zxFw2*J|=Mz464S8gy=Y)Iu)S>1^cn@N+8T08*cE2DUuy|-uJf4<8!+J0RY7~*3SHM dJ|y^CyIF?R4kj&jk;(@Z8GW2SI&d4wu4U*2G)w>h literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP384ECDH_v4.key.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP384ECDH_v4.key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..d0c46bc14984cda2065406eb48df08efa09d86b2 GIT binary patch literal 170 zcmV;b09F6Rs03(m5{D86D}e+6A_D^iZb%@bH@d1U*{QU=&jaqr#ROxQ-W~VMQJsr6 zM?L5bx+UK)H(A)is+`oa;Xf9JOy9h{X^Cq^^(Z}e+}yv5(Ad8Jk6qmJoWo7Zbhu#E zUwd>x!*#t{^eTFWSD{?z0|5yL00DsL&+WXO7YkepS4#^zM~pPVAU@i*8};sOR3;{q Ycb(f;f{9>%gWO3jgg~eqqg*Z({E`+>K>z>% literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP384ECDH_v6.key.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP384ECDH_v6.key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..6ad434aa03c69230c55934171e3da0fb69a0b5ab GIT binary patch literal 172 zcmV;d08{_Pss?Cq5{D81003d*V!>XQvd@_r<2-#(Jk)}Nf@})Z^Ou-EFIsgOK_3Kns4CXy( zkZe#Vj7X1xoedv@a+Phlb6ro30|5yL00Dr5ZV!~_n6-QEQ;4T2MS7%j<`_BC;Yn6g aQSB}L%{W+iXen5x&J$7B%~5rS4UD)@PD>g9 literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP384ECDSA_v4.key.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP384ECDSA_v4.key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..7268e0ab810c4fa74e54976e96aae5995e343562 GIT binary patch literal 166 zcmV;X09pUVqy%Vi5{DB7D}e+6A_D^iz1KNv8AeWyeQRQL_}9*%8(U4$9hR29nA-DW zd_GZ&oiDEN=dRy7A99x|=2u~=ay&uqxHT_$^!8gknnx8@0s61#j00Do0iZ494fJd>l`MA5B!rpVdjR34oSZ!Mx0k)&Ru*R4I U&AgZAoxmr~j`EeJxH!%mYhFZ8nE(I) literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP384ECDSA_v6.key.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP384ECDSA_v6.key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..665e65bbcdd6529c58f3b3c134736693a1f09ade GIT binary patch literal 168 zcmV;Z09XITrUqzm5{DB2003zPD}e+6A_D^iNXr`Zp?6RKmUNWAHeuuDFCp@rs|z{* zW2;XP<6UKTzp5v>P?%}^J_lu~=&84()*)5;Gq4RvD0h7m*R}@%h?AQM7Rm#3-9S-M z1+PV&Wnk`7;`;)aICO(Ct>;NC00DsTrB|JLLy&N4z|OMEFc&L{Xea1w_S1uKCB03!q=1OXGvbRm&Z5vAf$6Ti(W;9*0Wrl=npIBH-5 za+L*4+wi=CfxsBuhU)LdC3@!}giI{K=Sh|a6|!KD{F0PLK)=%fF)B3leJg~-@t4g` zK*$OUV;rJPf-mb4S^=`5tpZHCrW}@5FIhVcAAb^)iqP3THD3#9dNs+Ll^rDhJK?>& zQUd`B2>=2K0qGk`X^789fGjg;T_jpN^_uA*o`pH75P)uEQv~7=R@S$E4HFi8Oq?D6 bSNoQf>6IbyuNalWJCp_vznt6TN;nj)_nB*Mh)JYvX0sB3J_bg5P;D$IoaDXKq7DhVk$6wD_{i zfgjuFwgUkQ2>=2B!d_JLxDdrHqC5qI#G>aF9Jniw^|C4kZgh-=;K~zVT12!)+T#SP bF9FKuygg*_r=cGnf8Hd+MM}^ASQW7u6_aI# literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP521ECDSA_v4.key.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/nistP521ECDSA_v4.key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..de6515e820a945cba1cd59d7b753ab5a59aa97d9 GIT binary patch literal 221 zcmV<303!dzz#0T-a1w_T1uKCB03!q=1OP-sw=a5xL(tF@T-e&OV1N*Pspya1w_T0001u1uKCB03!q=1OfNsE(`#6f6&-p|GdCb@$8O-sk?&O z(^BUack*Tr?ZyB?FQPo&rcSjVF|qZ9jrmu_1+M6vIwTBu6?1vqP%n#4$Pyhl60pwDuVM6j`sy=ey3J$MG`l@yzZb*rX9xP|DXOh=>>TXnjyusFB Z1>$F?9_;t5|FgJv1LQOl7-0gEgKVUAWB~vG literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-28f2677523ed3043117ea46f27bf8b9b990c4e3a b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-28f2677523ed3043117ea46f27bf8b9b990c4e3a new file mode 100644 index 0000000000000000000000000000000000000000..7a5d881cce87640adc3cd1197a091abba62375ae GIT binary patch literal 3 KcmZ3($N&HW2>`AD literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-4fbc082c98d268e4495e09d40912053a9c08b896 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-4fbc082c98d268e4495e09d40912053a9c08b896 new file mode 100644 index 00000000..94423c97 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-4fbc082c98d268e4495e09d40912053a9c08b896 @@ -0,0 +1 @@ +¢® \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-56fb7129479f381d7cfd4598b540d3b753730ffc b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-56fb7129479f381d7cfd4598b540d3b753730ffc new file mode 100644 index 00000000..307e2ad8 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-56fb7129479f381d7cfd4598b540d3b753730ffc @@ -0,0 +1 @@ +‡ \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-6c04193b9d8991eec00fdef05735bfed376c0f6c b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-6c04193b9d8991eec00fdef05735bfed376c0f6c new file mode 100644 index 00000000..eb9f0fc5 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-6c04193b9d8991eec00fdef05735bfed376c0f6c @@ -0,0 +1 @@ +:“: \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-8eb418bf4e4721c572e13bd11313a1d29de247a9 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/parseSecretKeyPacket/crash-8eb418bf4e4721c572e13bd11313a1d29de247a9 new file mode 100644 index 0000000000000000000000000000000000000000..8d55b6be9f3644ed6d005fc374bac88404d29c4b GIT binary patch literal 17 UcmbQvDkUl=El^bOQ(vWCmxl9GgKnSfNBQy2f6rB%c-u0Uu}T1 zcf8pTJhDxyG|ldTFrlB@R0)Q^5;Y#hE$n+y3#CSA2)`gtp3s6DnR#PwS%=HoABQJv z^8N}YvkHQBUy+>b4zy<)JI0~`B*Lj7qMHp&3hN3$MZ_#PzD0S31N$cY`83Y>Srl0O z&bpl7&B8eg*KjsAoODwd#RD~T$*4=$Wj2+;?%dxKJsQ9~PB=?X?})O!lBO6PS}YAP z8X-8A7?CmJT8=t1nIQ>1Q~?A4yj}0o*D2y>68svG*v=SDH{a_$`bA)IzyjGWrPTs% zDc;^p?Ep3S72qTh2KaXjI+1vcL|O?3!bZYa?mC#^2lK2fd96&<&y7F32$;(5l{6jiT6G@M{==I81PN zHe`ATz0(OG*~;2N?$#Z8f6pKEKzZcv#hAV3#A-6UnV-^SYrf{@vHxwy)glYXE#N2u zBZVg@53)>Nj0oLtR#*N<=;%|BM31(-B*Lc2Lw8&`Jl*R|u43X9i{&VLSiPXwKQ zqEOtu(?ZZ$CJ`nr_^hmQ#DZBE8#$OYEjX02saeNl_a*K{+xBzTJ-Bnl&e>M)FN<{c zZXj|#Mg3K5aj@H^Oh0FA&mY3qtx_*vh7o`>((=9QRCnbao~L|Dvqq9uc&E-sMBO(0OI7q?H+wty`8_j{px;Jk-+ zu`vbKl$~rNSAC13^C~7H;TnKs*Qd%)R{Hj7@moF^9DWW{s3+b0mgtll2+e#p+Zab0 z+Vgd^2pv~czvYjq)hGMWyR01v%Q?abq#)_fmCgNz14A2e<(BVlRY}~8^N?aU*n#A@ zK4-RZXY7AGW#|sZ1HyC=v{?pKPX9ow%TrVq3T!6jr1hCq!Hl`Wlheojm6xO0v8W$x z&NDNvi>kcBK~2z4j{daE@f1}P$VyJQS3iC+r;auumAS&yW}06dhzX_H4=mW|PnXL{ zLHFv&=aIk_nXVvSLwY3Rg}yUm*$^Udu@~Th zB!IsX|E|`<0!D>4@&lw>n&{3r2sl8}5|k^~Di;WsX4Ib{HygeYjMdMwU^h1P87%NF zXiGu^Bt}}Id+BJ|q+K(C4^Tdov)mKIUb}UbSd{k2Na|ld*qT2G6UqNGh-QI(1OUMp zo(7~td79J_ADEgT0NV%Vumj)R0=|WXHMUqJ{#Y=>6i_ZBM9PUUFgFflWwp*mX3hX2 z+Ym-FIVSnBb+G5g=^jHz#j47muC7Sqh|@2_061_prmPn34nwuuzo%sPmGM(mhxpKWQX5xTU?>ViR3;2 z-Nxsu!R32&{g9wT7?v(l2B>t0EDHC0{}tG$S84q{lhj=x915k%;KTCQ+;_YtTIRYr literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/rsa4096_v4.key.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/rsa4096_v4.key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..9b56e3e905ecdce94a88057f01f354fca1a358b3 GIT binary patch literal 1819 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 L2~bi9=+(I$u(gHp literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/x25519Legacy_v4.key.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/x25519Legacy_v4.key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..582aed09c52822dedfd8efa6888b22561ae90a22 GIT binary patch literal 95 zcmV-l0HFWHT?A-w5{D8BD+U1s0hd()1pxsEKvwIAN&LCch~}uHFvcyC$)s;0LpXe~xSB&3hs!)s_M=Du2v=2Z hDFas+Mrj*&pg+nyhO4c(DXe%AbRxV9QWH{q3uoM-9?Ad! literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/x25519_v6.key.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/x25519_v6.key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..04cc139269d31ec10988fd4fc2c17b0527525ec2 GIT binary patch literal 77 zcmV-T0J8tZO9p6g5{DT8001E1NxM5BKYAYi(r)-1lTo4xy(XLUfvx>Y+Go+56u3kH ja4nUoxeTosX$dhCM_k}{NuqG`6%QO$R>FoxWoA83#jzib literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/x448_v4.key.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/x448_v4.key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..44f5c11a7a6abed520b232946210b9288792a227 GIT binary patch literal 123 zcmV->0EGX=c?4*15{DW^PPnAv`YtVxhClvB&jUiOP1;{AC&h?cYp$UAagQ5r`Lj{G z(CXBx2jHV0inAtL(ru<$%LUT_I9bRpVWiUnuYIxPLkKD@`gXhO!%#AEv)B6qZ^+mk d`K{rO--p4oS=Zf%&uGmH1!M>H{8Y%I9`xRIKu7=p literal 0 HcmV?d00001 diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/x448_v6.key.pgp b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTestInputs/x448_v6.key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..e9d7d88cdba9f5a033ed5e03ba7716636c26d5bf GIT binary patch literal 125 zcmV-@0D}L;dj@E55{DW9001~Y=`gt>s4f(2SaO9hbK0nn>ODZ*mX|#)?|d|O&Ok_T z&KpXjl7|(FEju6738il2qhWC|Is|6`L_SlmL+fmd|1d<0jx^RaRJ>R*z-6nq^~Coh f{$D)Jynu3=dcn1Wu}Ih Date: Wed, 9 Jul 2025 23:45:25 +0200 Subject: [PATCH 14/20] Move jazzerVersion to version.gradle --- pgpainless-sop/build.gradle | 2 +- version.gradle | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pgpainless-sop/build.gradle b/pgpainless-sop/build.gradle index adcbd283..70a4a743 100644 --- a/pgpainless-sop/build.gradle +++ b/pgpainless-sop/build.gradle @@ -19,7 +19,7 @@ dependencies { testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion" // Jazzer for Fuzzing - testImplementation "com.code-intelligence:jazzer-junit:0.24.0" + testImplementation "com.code-intelligence:jazzer-junit:$jazzerVersion" // Logging testImplementation "ch.qos.logback:logback-classic:$logbackVersion" diff --git a/version.gradle b/version.gradle index c50556ac..2ba79714 100644 --- a/version.gradle +++ b/version.gradle @@ -10,6 +10,7 @@ allprojects { bouncyCastleVersion = '1.82-SNAPSHOT' bouncyPgVersion = bouncyCastleVersion junitVersion = '5.8.2' + jazzerVersion = '0.24.0' logbackVersion = '1.5.13' mockitoVersion = '4.5.1' slf4jVersion = '1.7.36' From 16a2bf27eb6bb6b866def2c8e5989eb4e07f2abe Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 14 Jul 2025 20:34:33 +0200 Subject: [PATCH 15/20] gitignore all .cifuzz-corpus directories --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1ce9f38e..96a5578d 100644 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,4 @@ push_html.sh node_modules -pgpainless-sop/.cifuzz-corpus/* +*/.cifuzz-corpus/* From 4f8c52d2156ce30ab62875358369059d5da118ee Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 14 Jul 2025 21:33:51 +0200 Subject: [PATCH 16/20] Fix IndexOutOfBounds, but keep decryption with only SK working --- .../decryption_verification/OpenPgpMessageInputStream.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) 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 5524dcae..9112273e 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 @@ -347,12 +347,7 @@ 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) { + if (!encDataList.isIntegrityProtected && !encDataList.isEmpty && !encDataList.get(0).isAEAD) { LOGGER.warn("Symmetrically Encrypted Data Packet is not integrity-protected.") if (!options.isIgnoreMDCErrors()) { throw MessageNotIntegrityProtectedException() From 9f8ce475ebe842f1d3a96e45665d2ef6fc2e1ac7 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 14 Jul 2025 21:52:04 +0200 Subject: [PATCH 17/20] Replace consumeAsBytes(XXX) with consumeRemainingAsBytes() --- .../java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java | 2 +- .../pgpainless/sop/fuzzing/EncryptedMessageFuzzingTest.java | 3 ++- .../java/org/pgpainless/sop/fuzzing/ParseCertFuzzTest.java | 2 +- .../org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTest.java | 2 +- .../org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTest.java | 2 +- .../java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java | 2 +- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java index 7f068506..ead6098a 100644 --- a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/AsciiArmorFuzzTest.java @@ -22,7 +22,7 @@ public class AsciiArmorFuzzTest { maxDuration = "60s" ) public void armorAndDearmorData(FuzzedDataProvider data) throws IOException { - byte[] bytes = data.consumeBytes(1024); + byte[] bytes = data.consumeRemainingAsBytes(); byte[] armored = sop.armor().data(bytes).getBytes(); if (Arrays.areEqual(bytes, armored)) { 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 4cc2daa0..5277cac2 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 @@ -10,6 +10,7 @@ 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.MissingDecryptionMethodException; import org.pgpainless.exception.ModificationDetectionException; import org.pgpainless.sop.SOPImpl; import sop.SOP; @@ -75,7 +76,7 @@ public class EncryptedMessageFuzzingTest { maxDuration = "60s" ) public void decryptFuzzedMessage(FuzzedDataProvider provider) { - byte[] ciphertext = provider.consumeBytes(8192); + byte[] ciphertext = provider.consumeRemainingAsBytes(); if (ciphertext.length == 0) { return; } diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/ParseCertFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/ParseCertFuzzTest.java index 39296126..97324535 100644 --- a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/ParseCertFuzzTest.java +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/ParseCertFuzzTest.java @@ -22,7 +22,7 @@ public class ParseCertFuzzTest { @FuzzTest(maxDuration = "30s") public void parseOpenPGPCert(FuzzedDataProvider data) throws IOException { - byte[] certEncoding = data.consumeBytes(8192); + byte[] certEncoding = data.consumeRemainingAsBytes(); if (certEncoding.length == 0) { return; } diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTest.java index bbd7e662..a5f6acc3 100644 --- a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTest.java +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTest.java @@ -20,7 +20,7 @@ public class PublicKeyPacketFuzzTest { @FuzzTest(maxDuration = "30m") public void parsePublicKeyPacket(FuzzedDataProvider provider) { - byte[] encoding = provider.consumeBytes(8192); + byte[] encoding = provider.consumeRemainingAsBytes(); if (encoding.length == 0) { return; } diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTest.java index 2d0e94b5..670050eb 100644 --- a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTest.java +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTest.java @@ -20,7 +20,7 @@ public class SecretKeyPacketFuzzTest { @FuzzTest(maxDuration = "30m") public void parseSecretKeyPacket(FuzzedDataProvider provider) { - byte[] encoding = provider.consumeBytes(8192); + byte[] encoding = provider.consumeRemainingAsBytes(); if (encoding.length == 0) { return; } diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java index 6d1be4a2..c13057b0 100644 --- a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SignatureFuzzTest.java @@ -273,7 +273,7 @@ public class SignatureFuzzTest { maxDuration = "60s" ) public void verifyFuzzedSig(FuzzedDataProvider provider) throws IOException { - byte[] sig = provider.consumeBytes(1024); + byte[] sig = provider.consumeRemainingAsBytes(); if (sig.length == 0) { return; } From 7656bcd101491e4d2a9d8dfa899483de52692f25 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 14 Jul 2025 22:09:51 +0200 Subject: [PATCH 18/20] key packet fuzzing tests: Use OpenPGPKey/OpenPGPCertificate API --- .../sop/fuzzing/PublicKeyPacketFuzzTest.java | 21 ++++++------------- .../sop/fuzzing/SecretKeyPacketFuzzTest.java | 18 +++++----------- 2 files changed, 11 insertions(+), 28 deletions(-) diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTest.java index a5f6acc3..ab961811 100644 --- a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTest.java +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/PublicKeyPacketFuzzTest.java @@ -6,33 +6,24 @@ package org.pgpainless.sop.fuzzing; import com.code_intelligence.jazzer.api.FuzzedDataProvider; import com.code_intelligence.jazzer.junit.FuzzTest; -import org.bouncycastle.bcpg.BCPGInputStream; import org.bouncycastle.bcpg.UnsupportedPacketVersionException; -import org.bouncycastle.openpgp.PGPObjectFactory; -import org.bouncycastle.openpgp.PGPPublicKeyRing; -import org.bouncycastle.openpgp.bc.BcPGPObjectFactory; +import org.bouncycastle.openpgp.api.OpenPGPKeyReader; -import java.io.ByteArrayInputStream; import java.io.IOException; public class PublicKeyPacketFuzzTest { - @FuzzTest(maxDuration = "30m") - public void parsePublicKeyPacket(FuzzedDataProvider provider) - { + private final OpenPGPKeyReader reader = new OpenPGPKeyReader(); + + @FuzzTest(maxDuration = "60s") + public void parsePublicKeyPacket(FuzzedDataProvider provider) { byte[] encoding = provider.consumeRemainingAsBytes(); if (encoding.length == 0) { return; } - ByteArrayInputStream bIn = new ByteArrayInputStream(encoding); - BCPGInputStream pIn = new BCPGInputStream(bIn); - PGPObjectFactory objFac = new BcPGPObjectFactory(pIn); try { - Object next = objFac.nextObject(); - if (next == null) return; - - PGPPublicKeyRing pubKey = (PGPPublicKeyRing) next; + reader.parseCertificate(encoding); } catch (IOException e) { // ignore } catch (UnsupportedPacketVersionException e) { diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTest.java index 670050eb..cb3cfd9a 100644 --- a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTest.java +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/SecretKeyPacketFuzzTest.java @@ -6,18 +6,16 @@ package org.pgpainless.sop.fuzzing; import com.code_intelligence.jazzer.api.FuzzedDataProvider; import com.code_intelligence.jazzer.junit.FuzzTest; -import org.bouncycastle.bcpg.BCPGInputStream; import org.bouncycastle.bcpg.UnsupportedPacketVersionException; -import org.bouncycastle.openpgp.PGPObjectFactory; -import org.bouncycastle.openpgp.PGPSecretKeyRing; -import org.bouncycastle.openpgp.bc.BcPGPObjectFactory; +import org.bouncycastle.openpgp.api.OpenPGPKeyReader; -import java.io.ByteArrayInputStream; import java.io.IOException; public class SecretKeyPacketFuzzTest { - @FuzzTest(maxDuration = "30m") + private final OpenPGPKeyReader reader = new OpenPGPKeyReader(); + + @FuzzTest(maxDuration = "6ßs") public void parseSecretKeyPacket(FuzzedDataProvider provider) { byte[] encoding = provider.consumeRemainingAsBytes(); @@ -25,14 +23,8 @@ public class SecretKeyPacketFuzzTest { return; } - ByteArrayInputStream bIn = new ByteArrayInputStream(encoding); - BCPGInputStream pIn = new BCPGInputStream(bIn); - PGPObjectFactory objFac = new BcPGPObjectFactory(pIn); try { - Object next = objFac.nextObject(); - if (next == null) return; - - PGPSecretKeyRing secKey = (PGPSecretKeyRing) next; + reader.parseKey(encoding); } catch (IOException e) { // ignore } catch (UnsupportedPacketVersionException e) { From 4d46edf3b64edf84f6488563cf8d3387f958383e Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Wed, 23 Jul 2025 11:25:12 +0200 Subject: [PATCH 19/20] Add fuzzer test for generate-key for testing fuzzed passphrases and user-ids --- .../sop/fuzzing/GenerateKeyFuzzTest.java | 67 +++++++++++++++++++ ...h-ab461f6b8a6842a473257a2561c1fbdf91bdfe77 | 0 ...h-e15f6d2aaf7124b3412b4ba69928aa087a2c37f3 | 2 + ...h-1a5db5bb461c354c040c6aff91bbf119661b19e8 | 1 + ...h-5088fe58b92db5e48f739e69e327d0b502f76d1a | 1 + ...h-6ef3f0fcd6325e34a205ca8e9f8ed2a648072776 | 1 + ...h-74ee2de3da27436407d779d58cc9256be185fede | 2 + ...h-a1a7715c7596c77b892dc6d4debb7c108ca4ef97 | 1 + ...h-ec9f11fde2456714178aecb8b78f181216a8150f | 3 + 9 files changed, 78 insertions(+) create mode 100644 pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTest.java create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedPassphrase/crash-ab461f6b8a6842a473257a2561c1fbdf91bdfe77 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedPassphrase/crash-e15f6d2aaf7124b3412b4ba69928aa087a2c37f3 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-1a5db5bb461c354c040c6aff91bbf119661b19e8 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-5088fe58b92db5e48f739e69e327d0b502f76d1a create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-6ef3f0fcd6325e34a205ca8e9f8ed2a648072776 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-74ee2de3da27436407d779d58cc9256be185fede create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-a1a7715c7596c77b892dc6d4debb7c108ca4ef97 create mode 100644 pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-ec9f11fde2456714178aecb8b78f181216a8150f diff --git a/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTest.java b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTest.java new file mode 100644 index 00000000..d90abb1c --- /dev/null +++ b/pgpainless-sop/src/test/java/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTest.java @@ -0,0 +1,67 @@ +// SPDX-FileCopyrightText: 2025 Paul Schaub +// +// SPDX-License-Identifier: Apache-2.0 + +package org.pgpainless.sop.fuzzing; + +import com.code_intelligence.jazzer.api.FuzzedDataProvider; +import com.code_intelligence.jazzer.junit.FuzzTest; +import org.bouncycastle.openpgp.PGPException; +import org.bouncycastle.openpgp.api.KeyPassphraseProvider; +import org.bouncycastle.openpgp.api.OpenPGPKey; +import org.bouncycastle.openpgp.api.OpenPGPKeyReader; +import org.bouncycastle.openpgp.api.exception.KeyPassphraseException; +import org.bouncycastle.util.encoders.Hex; +import org.junit.jupiter.api.Test; +import org.pgpainless.sop.SOPImpl; +import sop.SOP; +import sop.exception.SOPGPException; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class GenerateKeyFuzzTest { + + private final SOP sop = new SOPImpl(); + + @FuzzTest(maxDuration = "5m") + public void generateKeyWithFuzzedUserId(FuzzedDataProvider provider) throws IOException { + String userId = provider.consumeRemainingAsString(); + + try { + byte[] keyBytes = sop.generateKey() + .userId(userId) + .generate() + .getBytes(); + + OpenPGPKey key = new OpenPGPKeyReader().parseKey(keyBytes); + assertNotNull(key.getUserId(userId), "Cannot fetch user-id for '" + userId + "' (" + Hex.toHexString(userId.getBytes(StandardCharsets.UTF_8)) + ")\n" + new String(keyBytes)); + } catch (IllegalArgumentException e) { + // expected. + } + } + + @FuzzTest + public void generateKeyWithFuzzedPassphrase(FuzzedDataProvider provider) throws IOException, KeyPassphraseException { + byte[] passphrase = provider.consumeRemainingAsBytes(); + + try { + byte[] keyBytes = sop.generateKey() + .withKeyPassword(passphrase) + .generate() + .getBytes(); + + OpenPGPKey key = new OpenPGPKeyReader().parseKey(keyBytes); + OpenPGPKey.OpenPGPPrivateKey pk = key.getPrimarySecretKey().unlock(new String(passphrase).toCharArray()); + assertNotNull(pk, "Got null result unlocking key that was generated with passphrase 0x'" + Hex.toHexString(passphrase) + "'"); + } + catch (SOPGPException.PasswordNotHumanReadable e) { + // expected. + } + catch (PGPException e) { + throw new RuntimeException("Cannot unlock key that was generated with passphrase 0x'" + Hex.toHexString(passphrase) + "'", e); + } + } +} diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedPassphrase/crash-ab461f6b8a6842a473257a2561c1fbdf91bdfe77 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedPassphrase/crash-ab461f6b8a6842a473257a2561c1fbdf91bdfe77 new file mode 100644 index 00000000..e69de29b diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedPassphrase/crash-e15f6d2aaf7124b3412b4ba69928aa087a2c37f3 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedPassphrase/crash-e15f6d2aaf7124b3412b4ba69928aa087a2c37f3 new file mode 100644 index 00000000..45518ca5 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedPassphrase/crash-e15f6d2aaf7124b3412b4ba69928aa087a2c37f3 @@ -0,0 +1,2 @@ + +/ \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-1a5db5bb461c354c040c6aff91bbf119661b19e8 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-1a5db5bb461c354c040c6aff91bbf119661b19e8 new file mode 100644 index 00000000..e6b455b2 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-1a5db5bb461c354c040c6aff91bbf119661b19e8 @@ -0,0 +1 @@ +] M \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-5088fe58b92db5e48f739e69e327d0b502f76d1a b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-5088fe58b92db5e48f739e69e327d0b502f76d1a new file mode 100644 index 00000000..5b487190 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-5088fe58b92db5e48f739e69e327d0b502f76d1a @@ -0,0 +1 @@ +  ”  \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-6ef3f0fcd6325e34a205ca8e9f8ed2a648072776 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-6ef3f0fcd6325e34a205ca8e9f8ed2a648072776 new file mode 100644 index 00000000..2b36e1be --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-6ef3f0fcd6325e34a205ca8e9f8ed2a648072776 @@ -0,0 +1 @@ +   \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-74ee2de3da27436407d779d58cc9256be185fede b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-74ee2de3da27436407d779d58cc9256be185fede new file mode 100644 index 00000000..4edaa423 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-74ee2de3da27436407d779d58cc9256be185fede @@ -0,0 +1,2 @@ + +] \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-a1a7715c7596c77b892dc6d4debb7c108ca4ef97 b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-a1a7715c7596c77b892dc6d4debb7c108ca4ef97 new file mode 100644 index 00000000..39583112 --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-a1a7715c7596c77b892dc6d4debb7c108ca4ef97 @@ -0,0 +1 @@ +ł \ No newline at end of file diff --git a/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-ec9f11fde2456714178aecb8b78f181216a8150f b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-ec9f11fde2456714178aecb8b78f181216a8150f new file mode 100644 index 00000000..6d51bd5d --- /dev/null +++ b/pgpainless-sop/src/test/resources/org/pgpainless/sop/fuzzing/GenerateKeyFuzzTestInputs/generateKeyWithFuzzedUserId/crash-ec9f11fde2456714178aecb8b78f181216a8150f @@ -0,0 +1,3 @@ + +] +] \ No newline at end of file From 7daa3783bc4ec4c1fb80fd53967864f0a7a1aea9 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Wed, 23 Jul 2025 11:25:49 +0200 Subject: [PATCH 20/20] Fuzz PGPObjectFactory --- pgpainless-core/build.gradle | 3 ++ .../fuzzing/PGPObjectFactoryFuzzingTest.kt | 48 ++++++++++++++++++ ...h-109647c495d69596e778c9d8077547b9ecf227a3 | Bin 0 -> 38 bytes ...h-16f60c43a386bd079675f4b67da22a6abc986fa1 | 1 + ...h-461a23344509ca1e8cae0c6e76d4dd3c8adf45d1 | Bin 0 -> 82 bytes ...h-a2bb907275f07fc8b8522f3d1d88f7a77b7cb193 | Bin 0 -> 16 bytes ...h-b8484cb8aa998062e1c4a7e8f749287d29b1a3b8 | Bin 0 -> 50 bytes ...h-f25481c9ffd17932404b3826bbc97c6a1f818446 | 5 ++ .../literaldata_binary_coffeebabe.asc | 5 ++ .../bouncycastle/fuzzing/ascii_armor.dict | 39 ++++++++++++++ .../bouncycastle/fuzzing/openpgp.dict | 34 +++++++++++++ 11 files changed, 135 insertions(+) create mode 100644 pgpainless-core/src/test/kotlin/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTest.kt create mode 100644 pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTestInputs/parseFuzzedObjects/crash-109647c495d69596e778c9d8077547b9ecf227a3 create mode 100644 pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTestInputs/parseFuzzedObjects/crash-16f60c43a386bd079675f4b67da22a6abc986fa1 create mode 100644 pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTestInputs/parseFuzzedObjects/crash-461a23344509ca1e8cae0c6e76d4dd3c8adf45d1 create mode 100644 pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTestInputs/parseFuzzedObjects/crash-a2bb907275f07fc8b8522f3d1d88f7a77b7cb193 create mode 100644 pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTestInputs/parseFuzzedObjects/crash-b8484cb8aa998062e1c4a7e8f749287d29b1a3b8 create mode 100644 pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTestInputs/parseFuzzedObjects/crash-f25481c9ffd17932404b3826bbc97c6a1f818446 create mode 100644 pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTestInputs/parseFuzzedObjects/literaldata_binary_coffeebabe.asc create mode 100644 pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/ascii_armor.dict create mode 100644 pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/openpgp.dict diff --git a/pgpainless-core/build.gradle b/pgpainless-core/build.gradle index 64d538d5..dd88b694 100644 --- a/pgpainless-core/build.gradle +++ b/pgpainless-core/build.gradle @@ -12,6 +12,9 @@ dependencies { testImplementation "org.junit.jupiter:junit-jupiter-params:$junitVersion" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion" + // Jazzer for Fuzzing + testImplementation "com.code-intelligence:jazzer-junit:$jazzerVersion" + // Mocking Components testImplementation "org.mockito:mockito-core:$mockitoVersion" diff --git a/pgpainless-core/src/test/kotlin/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTest.kt b/pgpainless-core/src/test/kotlin/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTest.kt new file mode 100644 index 00000000..bc73617a --- /dev/null +++ b/pgpainless-core/src/test/kotlin/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTest.kt @@ -0,0 +1,48 @@ +// SPDX-FileCopyrightText: 2025 Paul Schaub +// +// SPDX-License-Identifier: Apache-2.0 + +package org.pgpainless.bouncycastle.fuzzing + +import com.code_intelligence.jazzer.api.FuzzedDataProvider +import com.code_intelligence.jazzer.junit.DictionaryFile +import com.code_intelligence.jazzer.junit.FuzzTest +import org.bouncycastle.bcpg.ArmoredInputException +import org.bouncycastle.bcpg.UnsupportedPacketVersionException +import org.bouncycastle.openpgp.PGPException +import org.bouncycastle.openpgp.PGPUtil +import org.bouncycastle.openpgp.bc.BcPGPObjectFactory +import java.io.EOFException +import java.io.IOException + +class PGPObjectFactoryFuzzingTest { + + @FuzzTest + @DictionaryFile(resourcePath = "ascii_armor.dict") + @DictionaryFile(resourcePath = "openpgp.dict") + fun parseFuzzedObjects(provider: FuzzedDataProvider) { + val encoding = provider.consumeRemainingAsBytes() + + if (encoding.isEmpty()) { + return + } + try { + val decIn = PGPUtil.getDecoderStream(encoding.inputStream()) + val objFac = BcPGPObjectFactory(decIn) + var obj = objFac.nextObject() + while (obj != null) { + obj = objFac.nextObject() + } + } catch (e: ArmoredInputException) { + return + } catch (e: PGPException) { + return + } catch (e: EOFException) { + return + } catch (e: IOException) { + return + } catch (e: UnsupportedPacketVersionException) { + return + } + } +} diff --git a/pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTestInputs/parseFuzzedObjects/crash-109647c495d69596e778c9d8077547b9ecf227a3 b/pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTestInputs/parseFuzzedObjects/crash-109647c495d69596e778c9d8077547b9ecf227a3 new file mode 100644 index 0000000000000000000000000000000000000000..da0c74a5bb1df8629eec869ba2f90387fea66ec9 GIT binary patch literal 38 ecmcb(n~{N?fq{XA;s5{tMnH@Lz@q>EGXMarVHvjo literal 0 HcmV?d00001 diff --git a/pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTestInputs/parseFuzzedObjects/crash-16f60c43a386bd079675f4b67da22a6abc986fa1 b/pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTestInputs/parseFuzzedObjects/crash-16f60c43a386bd079675f4b67da22a6abc986fa1 new file mode 100644 index 00000000..be665fdb --- /dev/null +++ b/pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTestInputs/parseFuzzedObjects/crash-16f60c43a386bd079675f4b67da22a6abc986fa1 @@ -0,0 +1 @@ +»ĪõŅĪ---Q(K \ No newline at end of file diff --git a/pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTestInputs/parseFuzzedObjects/crash-461a23344509ca1e8cae0c6e76d4dd3c8adf45d1 b/pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/PGPObjectFactoryFuzzingTestInputs/parseFuzzedObjects/crash-461a23344509ca1e8cae0c6e76d4dd3c8adf45d1 new file mode 100644 index 0000000000000000000000000000000000000000..56ffc575bdfe5200affef2a70f1157bc0c1cea65 GIT binary patch literal 82 zcmdPZ1p)>J5UK0r>h9^M5a1r55bWvh=jx*1>lz&F= + +# +# ASCII Armor +# +BEGIN_PGP_MESSAGE="-----BEGIN PGP MESSAGE-----" +END_PGP_MESSAGE="-----END PGP MESSAGE-----" +BEGIN_PGP_SIGNATURE="-----BEGIN PGP SIGNATURE-----" +END_PGP_SIGNATURE="-----END PGP SIGNATURE-----" +BEGIN_PGP_PUBLIC_KEY="-----BEGIN PGP PUBLIC KEY-----" +END_PGP_PUBLIC_KEY="-----END PGP PUBLIC KEY-----" +BEGIN_PGP_PUBLIC_KEY_BLOCK="-----BEGIN PGP PUBLIC KEY BLOCK-----" +END_PGP_PUBLIC_KEY_BLOCK="-----END PGP PUBLIC KEY BLOCK-----" +BEGIN_PGP_PRIVATE_KEY="-----BEGIN PGP PRIVATE KEY-----" +END_PGP_PRIVATE_KEY="-----END PGP PRIVATE KEY-----" +BEGIN_PGP_PRIVATE_KEY_BLOCK="-----BEGIN PGP PRIVATE KEY BLOCK-----" +END_PGP_PRIVATE_KEY_BLOCK="-----END PGP PRIVATE KEY BLOCK-----" +BEGIN_PGP_SIGNED_MESSAGE="-----BEGIN PGP SIGNED MESSAGE-----" + +HEADER_VERSION="Version" +HEADER_COMMENT="Comment" +HEADER_HASH="Hash" +HEADER_CHARSET="Charset" +HASH_SHA224="SHA224" +HASH_SHA256="SHA256" +HASH_SHA384="SHA384" +HASH_SHA512="SHA512" + +PART_BEGIN="BEGIN" +PART_PGP="PGP" +PART_MESSAGE="MESSAGE" +PART_BLOCK="BLOCK" +PART_PUBLIC="PUBLIC" +PART_PRIVATE="PRIVATE" +PART_KEY="KEY" diff --git a/pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/openpgp.dict b/pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/openpgp.dict new file mode 100644 index 00000000..e0eb30dc --- /dev/null +++ b/pgpainless-core/src/test/resources/org/pgpainless/bouncycastle/fuzzing/openpgp.dict @@ -0,0 +1,34 @@ +# +# AFL Dictionary for OpenPGP (RFC9580) +# ------------------------------------------ +# +# Created by Paul Schaub + +# +# Packet Type IDs +# +RESERVED="\x00" +PKESK="\x01" +SIG="\x02" +SKESK="\0x03" +OPS="\x04" +SECKEY="\x05" +PUBKEY="\x06" +SECSUBKEY="\x07" +COMP="\x08" +SED="\x09" +MARKER="\x0A" +LIT="\x0B" +TRUST="\x0C" +UID="\x0D" +PUBSUBKEY="\x0E" +UAT="\x11" +SEIPD="\x12" +MOD="\x13" +RES20="\x14" +PADDING="\x15" + +# +# Entire Packets +# +MARKER_PACKET="\xCA\x03\x50\x47\x50" \ No newline at end of file