Skip to content

Commit 2947743

Browse files
committed
Implement AEADProtectedPGPSecretKeyTest.reencryptKeyJca()
1 parent 7bbc1b6 commit 2947743

File tree

1 file changed

+46
-1
lines changed

1 file changed

+46
-1
lines changed

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

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.bouncycastle.bcpg.SecretKeyPacket;
2222
import org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags;
2323
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
24+
import org.bouncycastle.crypto.CryptoServicesRegistrar;
2425
import org.bouncycastle.crypto.generators.Ed25519KeyPairGenerator;
2526
import org.bouncycastle.crypto.params.Ed25519KeyGenerationParameters;
2627
import org.bouncycastle.jce.provider.BouncyCastleProvider;
@@ -45,6 +46,7 @@
4546
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair;
4647
import org.bouncycastle.openpgp.operator.jcajce.JcePBEProtectionRemoverFactory;
4748
import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder;
49+
import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyEncryptorBuilder;
4850
import org.bouncycastle.util.encoders.Hex;
4951

5052
public class AEADProtectedPGPSecretKeyTest
@@ -363,14 +365,57 @@ private void lockUnlockKeyJca(
363365
keyPair.getPrivateKey().getPrivateKeyDataPacket().getEncoded(), dec.getPrivateKeyDataPacket().getEncoded());
364366
}
365367

366-
private void reencryptKey() throws PGPException {
368+
private void reencryptKey()
369+
throws PGPException, InvalidAlgorithmParameterException, NoSuchAlgorithmException
370+
{
367371
reencryptKeyBc();
368372
reencryptKeyJca();
369373
}
370374

371375
private void reencryptKeyJca()
376+
throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, PGPException
372377
{
378+
BouncyCastleProvider prov = new BouncyCastleProvider();
379+
KeyPairGenerator eddsaGen = KeyPairGenerator.getInstance("EdDSA", prov);
373380

381+
eddsaGen.initialize(new ECNamedCurveGenParameterSpec("ed25519"));
382+
KeyPair kp = eddsaGen.generateKeyPair();
383+
Date creationTime = currentTimeRounded();
384+
String passphrase = "recycle";
385+
386+
PGPKeyPair keyPair = new JcaPGPKeyPair(PublicKeyPacket.VERSION_6, PublicKeyAlgorithmTags.Ed25519, kp, creationTime);
387+
PBESecretKeyEncryptor cfbEncBuilder = new JcePBESecretKeyEncryptorBuilder(SymmetricKeyAlgorithmTags.AES_128)
388+
.setProvider(prov)
389+
.setSecureRandom(CryptoServicesRegistrar.getSecureRandom())
390+
.build(passphrase.toCharArray());
391+
PGPDigestCalculatorProvider digestProv = new JcaPGPDigestCalculatorProviderBuilder()
392+
.setProvider(prov)
393+
.build();
394+
395+
// Encrypt key using CFB mode
396+
PGPSecretKey cfbEncKey = new PGPSecretKey(
397+
keyPair.getPrivateKey(),
398+
keyPair.getPublicKey(),
399+
digestProv.get(HashAlgorithmTags.SHA1),
400+
true,
401+
cfbEncBuilder);
402+
403+
PBESecretKeyDecryptor cfbDecryptor = new JcePBESecretKeyDecryptorBuilder(digestProv)
404+
.setProvider(prov)
405+
.build(passphrase.toCharArray());
406+
407+
JcaAEADSecretKeyEncryptorBuilder aeadEncBuilder = new JcaAEADSecretKeyEncryptorBuilder(
408+
AEADAlgorithmTags.OCB, SymmetricKeyAlgorithmTags.AES_128, S2K.Argon2Params.memoryConstrainedParameters())
409+
.setProvider(prov);
410+
411+
PGPSecretKey aeadEncKey = PGPSecretKey.copyWithNewPassword(
412+
cfbEncKey,
413+
cfbDecryptor,
414+
aeadEncBuilder.build(passphrase.toCharArray(), cfbEncKey.getPublicKey().getPublicKeyPacket()));
415+
PBESecretKeyDecryptor aeadDecryptor = new JcePBESecretKeyDecryptorBuilder(digestProv)
416+
.setProvider(prov)
417+
.build(passphrase.toCharArray());
418+
isNotNull(aeadEncKey.extractPrivateKey(aeadDecryptor));
374419
}
375420

376421
private void reencryptKeyBc()

0 commit comments

Comments
 (0)