Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 72d6228

Browse files
committedNov 28, 2024
Implement AEADProtectedPGPSecretKeyTest.reencryptKeyJca()
1 parent 3620a94 commit 72d6228

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

+46-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.bouncycastle.bcpg.SecretKeyPacket;
2121
import org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags;
2222
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
23+
import org.bouncycastle.crypto.CryptoServicesRegistrar;
2324
import org.bouncycastle.crypto.generators.Ed25519KeyPairGenerator;
2425
import org.bouncycastle.crypto.params.Ed25519KeyGenerationParameters;
2526
import org.bouncycastle.jce.provider.BouncyCastleProvider;
@@ -45,6 +46,7 @@
4546
import org.bouncycastle.openpgp.operator.jcajce.JcePBEProtectionRemoverFactory;
4647
import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder;
4748
import org.bouncycastle.util.Strings;
49+
import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyEncryptorBuilder;
4850
import org.bouncycastle.util.encoders.Hex;
4951

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

368-
private void reencryptKey() throws PGPException {
370+
private void reencryptKey()
371+
throws PGPException, InvalidAlgorithmParameterException, NoSuchAlgorithmException
372+
{
369373
reencryptKeyBc();
370374
reencryptKeyJca();
371375
}
372376

373377
private void reencryptKeyJca()
378+
throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, PGPException
374379
{
380+
BouncyCastleProvider prov = new BouncyCastleProvider();
381+
KeyPairGenerator eddsaGen = KeyPairGenerator.getInstance("EdDSA", prov);
375382

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

378423
private void reencryptKeyBc()

0 commit comments

Comments
 (0)
Please sign in to comment.