1
0
Fork 0
mirror of https://github.com/pgpainless/pgpainless.git synced 2025-09-09 02:09:38 +02:00

Even more fuzzing

This commit is contained in:
Paul Schaub 2025-07-09 14:09:47 +02:00
parent cefdfa8eac
commit 1560980c7e
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
33 changed files with 509 additions and 365 deletions

View file

@ -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)

View file

@ -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 {

View file

@ -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<DecryptionResult>() {
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) {

View file

@ -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 <alice@pgpainless.org>\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 <alice@pgpainless.org>\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 <alice@pgpainless.org>\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 <alice@pgpainless.org>\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 <alice@pgpainless.org>\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 <alice@pgpainless.org>\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 <alice@pgpainless.org>\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<byte[]> keys;
@BeforeAll
public static void setup() throws IOException {
keys = getKeys();
}
private static List<byte[]> getKeys() throws IOException {
List<byte[]> 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);
}

View file

@ -0,0 +1 @@
ця ▌╞ёН<`╠!J]В╣,й╔┤ tс ╤р@:╗0▒╩sdЁ╠÷╒Е$X⌠²Зщ, ©bcЁv7НG┤┐█5iU▀v·X▌VнЕьЭ▌ы щ 8Р

View file

@ -0,0 +1 @@
ця ▌╞ёН<`╠!J]В╣,й╔┤ tс рС▌VнЕьЭ▌ы щ 3

View file

@ -0,0 +1 @@
ÃÑ ޝ£î<`±!J]÷µ,Ê¥‡ ¶Ò@:¨0»sd³±Ÿ¢å$X“<58>úÝ, ·bc³v7îG‡ƒ<1B>5iUIìæ¦l 'Š,¿½£w—Ñ/3OÖc

View file

@ -0,0 +1 @@
ця ▌╞ёН<`╠!J]В╣,й╔┤ tс ╤р@:╗0▒╩sdЁ╠÷╒Е$X⌠²Зщ, ╥bcЁv7НG┤┐█5iU▀v·X▌VнЕьЭ▌ы щ 8Р

View file

@ -0,0 +1 @@
ÃÑ ޝ£î<`±!J]÷µ,Ê¥‡ ¶Ò@:¨0»sd³±Ÿ¢å$X“<58>úÝ, ·&c³v7îG‡ƒ<1B>5iUIìæ¦l 'Š,¿½£w—Ñ/3OÖc

View file

@ -0,0 +1 @@
ÃÑ ޝ£î<`±!J]÷µ,Ê¥‡ ¶Ò@:¨0»sd³±Ÿ¢å$X“<58>ú݇ ¶Ò@:¨0»sd³±Ÿ¢å$X“<58>úÝ, ¿½£w—Ñ/7OÖc

View file

@ -0,0 +1 @@
Á^VÝđ]ĚVż!â7<C3A2>Qm‡'ŇçĂŮä\ĎÍk QýZ#ż80ż80Žo¤]FžZs†TAO¬<4F>•"rüyb“züăgî<67>ĎüÝńĎNś"ź<˙ ˇŇ@îi 8ň%mđZ±ˇf´h:"#:Š

View file

@ -0,0 +1 @@
Á^VÝđ]ĚVż!â7<C3A2>Qm‡'ŇçĂŮä@ĎÍk QýZ#ż80Žo¤]FžZs†TAO¬<4F>•"rüyb“züăgî<67>ńĎüÝĎNś"ź<˙ ˇŇ@îi 8ň%mđZ±ˇf´h:"#:Š

View file

@ -0,0 +1 @@
ÃÑ ޝ£î<`±!J]÷µ,Ê¥‡ ¶Ò@:¨0»sd³±Ÿ¢å$X“<58>úÝ, ·bc³v7îG‡ƒ<1B>ÿÿÿÿÿÿÿÿ 'Š,¿½£w—Ñ/3OÖc

View file

@ -0,0 +1 @@
ÃÑ ޝ£î<`±!J]÷µ,Ê¥‡ ¶Ò@:¨0»sd³±Ÿ¢å$X“<58>úÝ, ·bc³v7îG‡ƒ<1B>5iUI*ìæ¦l 'Š,¿½£w—Ñ/Ò@¥‡ c

View file

@ -0,0 +1 @@
ця ▌╞ёН<`╠!J]В╣,й╔┤ tс рС▌VнЕьЭ▌ы щ 3Р@:╗0▒╩sd╖С▌VнЕьЭ▌ы щ 3Р

View file

@ -0,0 +1 @@
ÃÑ ޝ£î<`±!J]÷µ,Ê¥‡ ¶Ò@:¨0»sd³±Ÿ¢å$X“<58>úÝ, ·bc³v7îG‡ƒ<1B><35>•"rüybŠ,¿½£w—Ñ/3OÖc

View file

@ -0,0 +1 @@
Á^VÝđ]ĚVż!â7<C3A2>Qm‡'ŇçĂŮä\ĎÍk QýZ#ż80Žo¤]FžZs†TAO¬<4F>•"rüyb“züăgî<67>ńĎüÝĎNś"ź<˙ ˇŇ@îikRŞŕ,`Ŕ9<>(<28>dd%vžXŽVÎĺŘüŽŮ Ý 8ň%mđZ±ˇf´h:"#:Š

View file

@ -0,0 +1 @@
ÃÑ ޝ£î<`±!J]÷µ,Ê¥‡ ¶Ò@:¨0»sd³±Ÿ¢å$X“<58>ú—Ñ/7OÖc

View file

@ -0,0 +1 @@
Á^VÝđ]ĚVż!â7<C3A2>Qm‡'ŇçĂŮä\ĎÍk QýZ#ż80Žo¤]FžZs†TAO¬<4F>•"rüyb“züăgî<67>ńĎüÝĎNś"ź<˙ ˇŇ@kRŞŕ,`Ŕ9<>(<28>dd%vžXŽVÎĺŘüŽŮ Ý 8ň%mđZ±ˇf´h:"#:Š

View file

@ -0,0 +1,8 @@
-----BEGIN PGP MESSAGE-----
wV4DVhfd8F3MVr8SAQdAphsh4jeDfsoaUW2HJ9Lnw9nkDlzPzWsDC1ES/Vojvzgw
jm/CpF1GA55aHXOGVEFPrIGVInIc/HliApN6/ONn7oPxz/zdz06cCCKfPBT/CQeh
0kABae4Oa1KSeboCqhXgLGDAGhY5gSiYZBdkJYt2nlgOjlYHzuXY/I7ZDAjdDSA4
GPIWJW0F8FqxoWa0aDoiIzqK
=BXMn
-----END PGP MESSAGE-----

View file

@ -0,0 +1 @@
ÃÑ ޝ£î<`±!J]÷µ,Ê¥‡ ¶Ò@:¨0»sd³±Ÿ¢å$X“<58>úÝ, ·bc³v7îG‡ƒ<1B>5iUIìæ¦l 'Š,¿½£w—Ñ/7OÖc

View file

@ -0,0 +1,7 @@
-----BEGIN PGP MESSAGE-----
wx4EBwMC0Q0Zjq+j7jxgsSFKXRX3CLUsyqWHDHTTDLbSQAE6qDCRu3Nks7Gfohbl
JFiTnfrdHiwMArdiY7N2NwHuR4eDARuNNWlVSezmpmwFICeKLL+9o3eX0S83Fk8S
1mM=
=N/kL
-----END PGP MESSAGE-----

View file

@ -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-----

View file

@ -0,0 +1,34 @@
#!/bin/bash
SOP=pgpainless-cli
USERID="Alice <alice@pgpainless.org>"
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

View file

@ -0,0 +1,21 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: 84EA 2DE1 DF87 684D C4F1 4C4F 8D97 A0EB 70CC C181
Comment: Alice <alice@pgpainless.org>
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-----

View file

@ -0,0 +1,23 @@
-----BEGIN PGP PRIVATE KEY BLOCK-----
Comment: 84EA 2DE1 DF87 684D C4F1 4C4F 8D97 A0EB 70CC C181
Comment: Alice <alice@pgpainless.org>
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-----

View file

@ -0,0 +1,87 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: 10BE 2EEB 684A E5CA 9849 BCE1 1F4A 7593 552C AD28
Comment: Alice <alice@pgpainless.org>
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
=yjFq
-----END PGP PUBLIC KEY BLOCK-----

View file

@ -0,0 +1,168 @@
-----BEGIN PGP PRIVATE KEY BLOCK-----
Comment: 10BE 2EEB 684A E5CA 9849 BCE1 1F4A 7593 552C AD28
Comment: Alice <alice@pgpainless.org>
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
=jGAJ
-----END PGP PRIVATE KEY BLOCK-----