1
1
package org .bouncycastle .openpgp .test ;
2
2
3
3
import org .bouncycastle .bcpg .PublicKeyAlgorithmTags ;
4
+ import org .bouncycastle .bcpg .SymmetricKeyAlgorithmTags ;
4
5
import org .bouncycastle .bcpg .X25519PublicBCPGKey ;
5
6
import org .bouncycastle .bcpg .X25519SecretBCPGKey ;
6
7
import org .bouncycastle .crypto .AsymmetricCipherKeyPair ;
7
8
import org .bouncycastle .crypto .generators .X25519KeyPairGenerator ;
8
9
import org .bouncycastle .crypto .params .X25519KeyGenerationParameters ;
9
10
import org .bouncycastle .jcajce .spec .XDHParameterSpec ;
10
11
import org .bouncycastle .jce .provider .BouncyCastleProvider ;
11
- import org .bouncycastle .openpgp .PGPException ;
12
+ import org .bouncycastle .openpgp .*;
13
+ import org .bouncycastle .openpgp .bc .BcPGPObjectFactory ;
14
+ import org .bouncycastle .openpgp .jcajce .JcaPGPObjectFactory ;
15
+ import org .bouncycastle .openpgp .operator .PGPDataEncryptorBuilder ;
16
+ import org .bouncycastle .openpgp .operator .PublicKeyDataDecryptorFactory ;
17
+ import org .bouncycastle .openpgp .operator .PublicKeyKeyEncryptionMethodGenerator ;
18
+ import org .bouncycastle .openpgp .operator .bc .BcPGPDataEncryptorBuilder ;
12
19
import org .bouncycastle .openpgp .operator .bc .BcPGPKeyPair ;
20
+ import org .bouncycastle .openpgp .operator .bc .BcPublicKeyDataDecryptorFactory ;
21
+ import org .bouncycastle .openpgp .operator .bc .BcPublicKeyKeyEncryptionMethodGenerator ;
13
22
import org .bouncycastle .openpgp .operator .jcajce .JcaPGPKeyPair ;
14
-
15
- import java .io .IOException ;
23
+ import org .bouncycastle .openpgp .operator .jcajce .JcePGPDataEncryptorBuilder ;
24
+ import org .bouncycastle .openpgp .operator .jcajce .JcePublicKeyDataDecryptorFactoryBuilder ;
25
+ import org .bouncycastle .openpgp .operator .jcajce .JcePublicKeyKeyEncryptionMethodGenerator ;
26
+ import org .bouncycastle .util .Arrays ;
27
+ import org .bouncycastle .util .io .Streams ;
28
+
29
+ import java .io .*;
30
+ import java .nio .charset .StandardCharsets ;
16
31
import java .security .*;
17
32
import java .util .Date ;
18
33
@@ -31,6 +46,98 @@ public void performTest()
31
46
{
32
47
testConversionOfJcaKeyPair ();
33
48
testConversionOfBcKeyPair ();
49
+
50
+ testV4MessageEncryptionDecryptionWithJcaKey ();
51
+ testV4MessageEncryptionDecryptionWithBcKey ();
52
+ }
53
+
54
+ private void testV4MessageEncryptionDecryptionWithJcaKey ()
55
+ throws PGPException , NoSuchAlgorithmException , InvalidAlgorithmParameterException , IOException
56
+ {
57
+ BouncyCastleProvider provider = new BouncyCastleProvider ();
58
+
59
+ Date date = currentTimeRounded ();
60
+ KeyPairGenerator gen = KeyPairGenerator .getInstance ("XDH" , provider );
61
+ gen .initialize (new XDHParameterSpec ("X25519" ));
62
+ KeyPair kp = gen .generateKeyPair ();
63
+ PGPKeyPair keyPair = new JcaPGPKeyPair (PublicKeyAlgorithmTags .X25519 , kp , date );
64
+
65
+ byte [] data = "Hello, World!\n " .getBytes (StandardCharsets .UTF_8 );
66
+
67
+ PGPDataEncryptorBuilder encBuilder = new JcePGPDataEncryptorBuilder (SymmetricKeyAlgorithmTags .AES_256 )
68
+ .setProvider (provider );
69
+ PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator (encBuilder );
70
+ PublicKeyKeyEncryptionMethodGenerator metGen = new JcePublicKeyKeyEncryptionMethodGenerator (keyPair .getPublicKey ())
71
+ .setProvider (provider );
72
+ encGen .addMethod (metGen );
73
+ PGPLiteralDataGenerator litGen = new PGPLiteralDataGenerator ();
74
+
75
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream ();
76
+ OutputStream encOut = encGen .open (bOut , new byte [4096 ]);
77
+ OutputStream litOut = litGen .open (encOut , PGPLiteralData .BINARY , "" , PGPLiteralData .NOW , new byte [4096 ]);
78
+ litOut .write (data );
79
+ litGen .close ();
80
+ encGen .close ();
81
+
82
+ byte [] encrypted = bOut .toByteArray ();
83
+
84
+ ByteArrayInputStream bIn = new ByteArrayInputStream (encrypted );
85
+ PGPObjectFactory objectFactory = new JcaPGPObjectFactory (bIn );
86
+ PGPEncryptedDataList encDataList = (PGPEncryptedDataList ) objectFactory .nextObject ();
87
+ PGPPublicKeyEncryptedData encData = (PGPPublicKeyEncryptedData ) encDataList .get (0 );
88
+ PublicKeyDataDecryptorFactory decFactory = new JcePublicKeyDataDecryptorFactoryBuilder ()
89
+ .setProvider (provider )
90
+ .build (keyPair .getPrivateKey ());
91
+ InputStream decIn = encData .getDataStream (decFactory );
92
+ objectFactory = new JcaPGPObjectFactory (decIn );
93
+ PGPLiteralData lit = (PGPLiteralData ) objectFactory .nextObject ();
94
+ InputStream litIn = lit .getDataStream ();
95
+ byte [] plaintext = Streams .readAll (litIn );
96
+ litIn .close ();
97
+ decIn .close ();
98
+
99
+ isTrue (Arrays .areEqual (data , plaintext ));
100
+ }
101
+
102
+ private void testV4MessageEncryptionDecryptionWithBcKey ()
103
+ throws PGPException , IOException {
104
+ Date date = currentTimeRounded ();
105
+ X25519KeyPairGenerator gen = new X25519KeyPairGenerator ();
106
+ gen .init (new X25519KeyGenerationParameters (new SecureRandom ()));
107
+ AsymmetricCipherKeyPair kp = gen .generateKeyPair ();
108
+ BcPGPKeyPair keyPair = new BcPGPKeyPair (PublicKeyAlgorithmTags .X25519 , kp , date );
109
+
110
+ byte [] data = "Hello, World!\n " .getBytes (StandardCharsets .UTF_8 );
111
+
112
+ PGPDataEncryptorBuilder encBuilder = new BcPGPDataEncryptorBuilder (SymmetricKeyAlgorithmTags .AES_256 );
113
+ PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator (encBuilder );
114
+ PublicKeyKeyEncryptionMethodGenerator metGen = new BcPublicKeyKeyEncryptionMethodGenerator (keyPair .getPublicKey ());
115
+ encGen .addMethod (metGen );
116
+ PGPLiteralDataGenerator litGen = new PGPLiteralDataGenerator ();
117
+
118
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream ();
119
+ OutputStream encOut = encGen .open (bOut , new byte [4096 ]);
120
+ OutputStream litOut = litGen .open (encOut , PGPLiteralData .BINARY , "" , PGPLiteralData .NOW , new byte [4096 ]);
121
+ litOut .write (data );
122
+ litGen .close ();
123
+ encGen .close ();
124
+
125
+ byte [] encrypted = bOut .toByteArray ();
126
+
127
+ ByteArrayInputStream bIn = new ByteArrayInputStream (encrypted );
128
+ PGPObjectFactory objectFactory = new BcPGPObjectFactory (bIn );
129
+ PGPEncryptedDataList encDataList = (PGPEncryptedDataList ) objectFactory .nextObject ();
130
+ PGPPublicKeyEncryptedData encData = (PGPPublicKeyEncryptedData ) encDataList .get (0 );
131
+ PublicKeyDataDecryptorFactory decFactory = new BcPublicKeyDataDecryptorFactory (keyPair .getPrivateKey ());
132
+ InputStream decIn = encData .getDataStream (decFactory );
133
+ objectFactory = new BcPGPObjectFactory (decIn );
134
+ PGPLiteralData lit = (PGPLiteralData ) objectFactory .nextObject ();
135
+ InputStream litIn = lit .getDataStream ();
136
+ byte [] plaintext = Streams .readAll (litIn );
137
+ litIn .close ();
138
+ decIn .close ();
139
+
140
+ isTrue (Arrays .areEqual (data , plaintext ));
34
141
}
35
142
36
143
private void testConversionOfJcaKeyPair ()
0 commit comments