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