Skip to content

Commit 90629d1

Browse files
committed
Add decryption test using X448 key
Thanks to @twiss for the test vector
1 parent f68f0d2 commit 90629d1

File tree

1 file changed

+73
-3
lines changed

1 file changed

+73
-3
lines changed

pg/src/test/java/org/bouncycastle/openpgp/test/PGPv6MessageDecryptionTest.java

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,13 @@ public void performTest()
3636
throws Exception
3737
{
3838
decryptMessageEncryptedUsingPKESKv6();
39+
encryptDecryptMessageUsingV6GopenpgpTestKey();
3940
}
4041

4142
private void decryptMessageEncryptedUsingPKESKv6()
4243
throws IOException, PGPException
4344
{
45+
// X25519 test key from rfc9580
4446
String key = "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" +
4547
"\n" +
4648
"xUsGY4d/4xsAAAAg+U2nu0jWCmHlZ3BqZYfQMxmZu52JGggkLq2EVD34laMAGXKB\n" +
@@ -81,20 +83,88 @@ private void decryptMessageEncryptedUsingPKESKv6()
8183
PGPEncryptedDataList encList = (PGPEncryptedDataList) objFac.nextObject();
8284
PGPPublicKeyEncryptedData encData = (PGPPublicKeyEncryptedData) encList.get(0);
8385

84-
isEquals(PublicKeyEncSessionPacket.VERSION_6, encData.getVersion());
85-
isEquals(PublicKeyAlgorithmTags.X25519, encData.getAlgorithm());
86+
isEquals("PKESK version mismatch",
87+
PublicKeyEncSessionPacket.VERSION_6, encData.getVersion());
88+
isEquals("Public key algorithm mismatch",
89+
PublicKeyAlgorithmTags.X25519, encData.getAlgorithm());
8690
PGPSecretKey decryptionKey = secretKeys.getSecretKey(encData.getKeyID()); // TODO: getKeyIdentifier()
8791
isNotNull("Decryption key MUST be identifiable", decryptionKey);
8892
PGPPrivateKey privateKey = decryptionKey.extractPrivateKey(null);
8993
PublicKeyDataDecryptorFactory decryptor = new BcPublicKeyDataDecryptorFactory(privateKey);
9094
InputStream decrypted = encData.getDataStream(decryptor);
9195
PGPObjectFactory decFac = new BcPGPObjectFactory(decrypted);
9296
PGPLiteralData lit = (PGPLiteralData) decFac.nextObject();
93-
isEncodingEqual(
97+
isEncodingEqual("Message plaintext mismatch",
9498
"Hello World :)".getBytes(StandardCharsets.UTF_8),
9599
Streams.readAll(lit.getDataStream()));
96100
}
97101

102+
private void encryptDecryptMessageUsingV6GopenpgpTestKey()
103+
throws IOException, PGPException
104+
{
105+
// Ed448/X448 test key
106+
// Courtesy of @twiss from Proton
107+
String key = "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" +
108+
"\n" +
109+
"xX0GZrnFtRwAAAA5wl2q+bhfNkzHsxlLowaUy0sTOeAsmhseHBvPKKc7yehR\n" +
110+
"8Qs93LbjQHjw3IaqduMRDRs4pZJyV/+AACKFtkkC3ebcyaOvHGaJpc9rx0Z1\n" +
111+
"4YHdd4BG1AJvZuhk8pJ6dQuuQeFtBsQctoktFwlDh0XjnjUrkMLALQYfHAoA\n" +
112+
"AABMBYJmucW1AwsJBwUVCAoMDgQWAAIBApsDAh4JIqEGEvURGalOLHznAmcI\n" +
113+
"MRsEHorGZ2ikxHawiPyOMw+CAOANJwkDBwMJAQcBCQIHAgAAAACbfCBvUoq6\n" +
114+
"bon1bSsp9HLc829xjDINBOvegmk4tMKv392c1LNPJacojQ46YZpkNVhE4sSx\n" +
115+
"Gf/vdUqh62KP+vwm5cXs/f11WmdVnclv7uR9s3a1GI79lwOJiuw3AIXA3VjR\n" +
116+
"+AhmeoAFJRfcjfT3hwwkBdu8E3BQ+1bGqfXGhOPYcDTJOO+vMExGSTEk+A9j\n" +
117+
"DmWnW6snAMd7Bma5xbUaAAAAOAPvCJKYxSQ+SfLb313/tC9N2tGF00x6YJkz\n" +
118+
"JLqLKVDofMHmUC1f8IJFtQ3cLMDhHVY0VxffLXT1AEffhVpafxBdelL69esq\n" +
119+
"2zQtDp5l8Hx7D/sU+W3+KmGLnRki72g7gfoQuio+wk8UcHmfwYm7AHvuwsAN\n" +
120+
"BhgcCgAAACwFgma5xbUCmwwioQYS9REZqU4sfOcCZwgxGwQeisZnaKTEdrCI\n" +
121+
"/I4zD4IA4AAAAACQUiBvjI1gFe4O/GDPwIoX8YSK/qP3IsMAwvidXclpmlLN\n" +
122+
"RzPkkfUzRgZw8+AHZxV62TPWhxrZETAuEaahrQ6HViQRAfk60gLvT37iWZrG\n" +
123+
"BU64272NrJ+UFXrzAEKZ/HK+hIL6yZvYDqIxWBg3Pwt9YxgpOfJ8UeYcrEx3\n" +
124+
"B1Hkd6QprSOLFCj53zZ++q3SZkWYz28gAA==\n" +
125+
"-----END PGP PRIVATE KEY BLOCK-----\n";
126+
ByteArrayInputStream bIn = new ByteArrayInputStream(key.getBytes(StandardCharsets.UTF_8));
127+
ArmoredInputStream aIn = new ArmoredInputStream(bIn);
128+
BCPGInputStream pIn = new BCPGInputStream(aIn);
129+
PGPObjectFactory objFac = new BcPGPObjectFactory(pIn);
130+
PGPSecretKeyRing secretKeys = (PGPSecretKeyRing) objFac.nextObject();
131+
pIn.close();
132+
aIn.close();
133+
bIn.close();
134+
135+
// created using gosop 430bb02923c123e39815814f6b97a6d501bdde6a
136+
// ./gosop encrypt --profile=rfc9580 cert.asc < msg.plain > msg.asc
137+
String MSG = "-----BEGIN PGP MESSAGE-----\n" +
138+
"\n" +
139+
"wYUGIQaz5Iy7+n5O1bg87Cy2PfSolKK6L8cwIPLJnEeZFjMu2xoAfSM/MwQpXahy\n" +
140+
"Od1pknhDyw3X5EgxQG0EffQCMpaKsNtqvVGYBJ5chuAcV/8gayReP/g6RREGeyj4\n" +
141+
"Vc2dgJ67/KwaP0Z7k7vExHs79U24DsrU088QbYhk/XLvJHWlXXj90loCCQMMIvmD\n" +
142+
"KS5f5WYbntB4N+FspsbQ7GN6taOrAqUtEuKWKzrlhZdtg9qGG4RLCvX1vfL0u6NV\n" +
143+
"Yzk9fGVgty73B8pmyYdefLdWt87ljwr8wGGX/Dl8PSBIE3w=\n" +
144+
"-----END PGP MESSAGE-----\n";
145+
bIn = new ByteArrayInputStream(MSG.getBytes(StandardCharsets.UTF_8));
146+
aIn = new ArmoredInputStream(bIn);
147+
pIn = new BCPGInputStream(aIn);
148+
objFac = new BcPGPObjectFactory(pIn);
149+
PGPEncryptedDataList encList = (PGPEncryptedDataList) objFac.nextObject();
150+
PGPPublicKeyEncryptedData encData = (PGPPublicKeyEncryptedData) encList.get(0);
151+
152+
isEquals("PKESK version mismatch",
153+
PublicKeyEncSessionPacket.VERSION_6, encData.getVersion());
154+
isEquals("Public Key algorithm mismatch",
155+
PublicKeyAlgorithmTags.X448, encData.getAlgorithm());
156+
PGPSecretKey decryptionKey = secretKeys.getSecretKey(encData.getKeyID()); // TODO: getKeyIdentifier()
157+
isNotNull("Decryption key MUST be identifiable", decryptionKey);
158+
PGPPrivateKey privateKey = decryptionKey.extractPrivateKey(null);
159+
PublicKeyDataDecryptorFactory decryptor = new BcPublicKeyDataDecryptorFactory(privateKey);
160+
InputStream decrypted = encData.getDataStream(decryptor);
161+
PGPObjectFactory decFac = new BcPGPObjectFactory(decrypted);
162+
PGPLiteralData lit = (PGPLiteralData) decFac.nextObject();
163+
isEncodingEqual("Message plaintext mismatch",
164+
"Hello, World!\n".getBytes(StandardCharsets.UTF_8),
165+
Streams.readAll(lit.getDataStream()));
166+
}
167+
98168
public static void main(String[] args)
99169
{
100170
runTest(new PGPv6MessageDecryptionTest());

0 commit comments

Comments
 (0)