99import java .security .PrivateKey ;
1010import java .security .Provider ;
1111import java .security .PublicKey ;
12+ import java .security .SecureRandom ;
1213import java .security .Security ;
1314import java .security .spec .PKCS8EncodedKeySpec ;
1415import java .security .spec .X509EncodedKeySpec ;
2122import org .bouncycastle .bcpg .HashAlgorithmTags ;
2223import org .bouncycastle .bcpg .PublicKeyAlgorithmTags ;
2324import org .bouncycastle .bcpg .PublicKeyPacket ;
25+ import org .bouncycastle .bcpg .S2K ;
2426import org .bouncycastle .bcpg .SymmetricKeyAlgorithmTags ;
2527import org .bouncycastle .crypto .digests .SHA256Digest ;
2628import org .bouncycastle .crypto .params .X25519PrivateKeyParameters ;
3032import org .bouncycastle .jcajce .spec .HybridValueParameterSpec ;
3133import org .bouncycastle .jcajce .spec .UserKeyingMaterialSpec ;
3234import org .bouncycastle .jce .provider .BouncyCastleProvider ;
35+ import org .bouncycastle .jce .spec .ECNamedCurveGenParameterSpec ;
3336import org .bouncycastle .openpgp .PGPEncryptedData ;
37+ import org .bouncycastle .openpgp .PGPKeyPair ;
3438import org .bouncycastle .openpgp .PGPPublicKey ;
39+ import org .bouncycastle .openpgp .operator .PBESecretKeyEncryptor ;
3540import org .bouncycastle .openpgp .operator .PGPContentVerifier ;
3641import org .bouncycastle .openpgp .operator .PGPDigestCalculator ;
3742import org .bouncycastle .openpgp .operator .PGPDigestCalculatorProvider ;
43+ import org .bouncycastle .openpgp .operator .jcajce .JcaAEADSecretKeyEncryptorBuilder ;
3844import org .bouncycastle .openpgp .operator .jcajce .JcaKeyFingerprintCalculator ;
3945import org .bouncycastle .openpgp .operator .jcajce .JcaPGPContentVerifierBuilderProvider ;
4046import org .bouncycastle .openpgp .operator .jcajce .JcaPGPDigestCalculatorProviderBuilder ;
4147import org .bouncycastle .openpgp .operator .jcajce .JcaPGPKeyConverter ;
48+ import org .bouncycastle .openpgp .operator .jcajce .JcaPGPKeyPair ;
4249import org .bouncycastle .openpgp .operator .jcajce .JcePBESecretKeyEncryptorBuilder ;
4350import org .bouncycastle .openpgp .operator .jcajce .JcePGPDataEncryptorBuilder ;
4451import org .bouncycastle .util .Arrays ;
4552import org .bouncycastle .util .Strings ;
4653import org .bouncycastle .util .encoders .Hex ;
4754import org .bouncycastle .util .test .SimpleTest ;
55+ import org .junit .Assert ;
4856
4957public class OperatorJcajceTest
5058 extends SimpleTest
@@ -66,6 +74,7 @@ public String getName()
6674 public void performTest ()
6775 throws Exception
6876 {
77+ testJcaAEADSecretKeyEncryptorBuilder ();
6978 testCreateDigest ();
7079 testX25519HKDF ();
7180 testJcePBESecretKeyEncryptorBuilder ();
@@ -316,12 +325,43 @@ public void testX25519HKDF()
316325 //isTrue(Arrays.areEqual(output, expectedDecryptedSessionKey));
317326 }
318327
328+ public void testJcaAEADSecretKeyEncryptorBuilder ()
329+ throws Exception
330+ {
331+ BouncyCastleProvider prov = new BouncyCastleProvider ();
332+ KeyPairGenerator eddsaGen = KeyPairGenerator .getInstance ("EdDSA" , prov );
333+ Date creationTime = new Date ();
334+ eddsaGen .initialize (new ECNamedCurveGenParameterSpec ("ed25519" ));
335+ KeyPair kp = eddsaGen .generateKeyPair ();
336+ SecureRandom random = new SecureRandom ();
337+ for (int version : new int []{PublicKeyPacket .VERSION_4 , PublicKeyPacket .VERSION_6 })
338+ {
339+ PGPKeyPair keyPair = new JcaPGPKeyPair (version , PublicKeyAlgorithmTags .Ed25519 , kp , creationTime );
340+ JcaAEADSecretKeyEncryptorBuilder jcaEncBuilder = new JcaAEADSecretKeyEncryptorBuilder (
341+ AEADAlgorithmTags .OCB , SymmetricKeyAlgorithmTags .AES_256 ,
342+ S2K .Argon2Params .memoryConstrainedParameters ())
343+ .setProvider (new BouncyCastleProvider ());
344+ PBESecretKeyEncryptor encryptor = jcaEncBuilder .build (
345+ "Yin" .toCharArray (),
346+ keyPair .getPublicKey ().getPublicKeyPacket ());
347+ byte [] key = new byte [16 ];
348+ random .nextBytes (key );
349+ byte [] input1 = new byte [64 ];
350+ random .nextBytes (input1 );
351+
352+ byte [] input2 = Arrays .copyOfRange (input1 , 32 , 64 );
353+ byte [] output1 = encryptor .encryptKeyData (key , input1 , 32 , 32 );
354+ byte [] output2 = encryptor .encryptKeyData (key , input2 , 0 , 32 );
355+ Assert .assertTrue (Arrays .areEqual (output1 , output2 ));
356+ }
357+ }
358+
319359 private class NullProvider
320360 extends Provider
321361 {
322362 NullProvider ()
323363 {
324- super ("NULL" , 0.0 , "Null Provider" );
364+ super ("NULL" , 0.0 , "Null Provider" );
325365 }
326366 }
327367
0 commit comments