Skip to content

Commit

Permalink
Merge branch 'pr-1676-openPGP-function-tests' into 'main'
Browse files Browse the repository at this point in the history
pr-1676-openPGP-function-tests

See merge request root/bc-java!13
  • Loading branch information
dghgit committed Jul 25, 2024
2 parents 4d44c17 + 4705216 commit 4cdf535
Show file tree
Hide file tree
Showing 5 changed files with 457 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,19 @@
import org.bouncycastle.crypto.params.Ed25519KeyGenerationParameters;
import org.bouncycastle.jcajce.spec.EdDSAParameterSpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openpgp.PGPException;
import org.bouncycastle.openpgp.PGPPublicKey;
import org.bouncycastle.openpgp.operator.bc.BcKeyFingerprintCalculator;
import org.bouncycastle.openpgp.operator.bc.BcPGPKeyConverter;
import org.bouncycastle.openpgp.operator.bc.BcPGPKeyPair;
import org.bouncycastle.openpgp.*;
import org.bouncycastle.openpgp.operator.PGPContentSignerBuilder;
import org.bouncycastle.openpgp.operator.PGPContentVerifierBuilderProvider;
import org.bouncycastle.openpgp.operator.bc.*;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentSignerBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentVerifierBuilderProvider;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyConverter;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair;
import org.bouncycastle.util.Pack;
import org.bouncycastle.util.encoders.Hex;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.Date;

Expand All @@ -36,6 +38,8 @@ public void performTest()
{
testConversionOfJcaKeyPair();
testConversionOfBcKeyPair();
testV4SigningVerificationWithJcaKey();
testV4SigningVerificationWithBcKey();

testConversionOfTestVectorKey();
}
Expand Down Expand Up @@ -134,6 +138,58 @@ private void testConversionOfBcKeyPair()
}
}

private void testV4SigningVerificationWithJcaKey()
throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, PGPException
{
Date date = currentTimeRounded();
KeyPairGenerator gen = KeyPairGenerator.getInstance("EDDSA", new BouncyCastleProvider());
gen.initialize(new EdDSAParameterSpec("Ed25519"));
KeyPair kp = gen.generateKeyPair();
PGPKeyPair keyPair = new JcaPGPKeyPair(PublicKeyAlgorithmTags.Ed25519, kp, date);

byte[] data = "Hello, World!\n".getBytes(StandardCharsets.UTF_8);

PGPContentSignerBuilder contSigBuilder = new JcaPGPContentSignerBuilder(
keyPair.getPublicKey().getAlgorithm(),
HashAlgorithmTags.SHA512)
.setProvider(new BouncyCastleProvider());
PGPSignatureGenerator sigGen = new PGPSignatureGenerator(contSigBuilder);
sigGen.init(PGPSignature.BINARY_DOCUMENT, keyPair.getPrivateKey());
sigGen.update(data);
PGPSignature signature = sigGen.generate();

PGPContentVerifierBuilderProvider contVerBuilder = new JcaPGPContentVerifierBuilderProvider()
.setProvider(new BouncyCastleProvider());
signature.init(contVerBuilder, keyPair.getPublicKey());
signature.update(data);
isTrue(signature.verify());
}

private void testV4SigningVerificationWithBcKey()
throws PGPException
{
Date date = currentTimeRounded();
Ed25519KeyPairGenerator gen = new Ed25519KeyPairGenerator();
gen.init(new Ed25519KeyGenerationParameters(new SecureRandom()));
AsymmetricCipherKeyPair kp = gen.generateKeyPair();
BcPGPKeyPair keyPair = new BcPGPKeyPair(PublicKeyAlgorithmTags.Ed25519, kp, date);

byte[] data = "Hello, World!\n".getBytes(StandardCharsets.UTF_8);

PGPContentSignerBuilder contSigBuilder = new BcPGPContentSignerBuilder(
keyPair.getPublicKey().getAlgorithm(),
HashAlgorithmTags.SHA512);
PGPSignatureGenerator sigGen = new PGPSignatureGenerator(contSigBuilder);
sigGen.init(PGPSignature.BINARY_DOCUMENT, keyPair.getPrivateKey());
sigGen.update(data);
PGPSignature signature = sigGen.generate();

PGPContentVerifierBuilderProvider contVerBuilder = new BcPGPContentVerifierBuilderProvider();
signature.init(contVerBuilder, keyPair.getPublicKey());
signature.update(data);
isTrue(signature.verify());
}

private void testConversionOfTestVectorKey() throws PGPException, IOException {
JcaPGPKeyConverter jc = new JcaPGPKeyConverter().setProvider(new BouncyCastleProvider());
BcPGPKeyConverter bc = new BcPGPKeyConverter();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.bouncycastle.bcpg.Ed448PublicBCPGKey;
import org.bouncycastle.bcpg.Ed448SecretBCPGKey;
import org.bouncycastle.bcpg.HashAlgorithmTags;
import org.bouncycastle.bcpg.PublicKeyAlgorithmTags;
import org.bouncycastle.bcpg.PublicKeyPacket;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
Expand All @@ -10,10 +11,20 @@
import org.bouncycastle.jcajce.spec.EdDSAParameterSpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openpgp.PGPException;
import org.bouncycastle.openpgp.PGPKeyPair;
import org.bouncycastle.openpgp.PGPSignature;
import org.bouncycastle.openpgp.PGPSignatureGenerator;
import org.bouncycastle.openpgp.operator.PGPContentSignerBuilder;
import org.bouncycastle.openpgp.operator.PGPContentVerifierBuilderProvider;
import org.bouncycastle.openpgp.operator.bc.BcPGPContentSignerBuilder;
import org.bouncycastle.openpgp.operator.bc.BcPGPContentVerifierBuilderProvider;
import org.bouncycastle.openpgp.operator.bc.BcPGPKeyPair;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentSignerBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentVerifierBuilderProvider;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.Date;

Expand All @@ -32,6 +43,8 @@ public void performTest()
{
testConversionOfJcaKeyPair();
testConversionOfBcKeyPair();
testV4SigningVerificationWithJcaKey();
testV4SigningVerificationWithBcKey();
}

private void testConversionOfJcaKeyPair()
Expand Down Expand Up @@ -128,6 +141,58 @@ private void testConversionOfBcKeyPair()
}
}

private void testV4SigningVerificationWithJcaKey()
throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, PGPException
{
Date date = currentTimeRounded();
KeyPairGenerator gen = KeyPairGenerator.getInstance("EDDSA", new BouncyCastleProvider());
gen.initialize(new EdDSAParameterSpec("Ed448"));
KeyPair kp = gen.generateKeyPair();
PGPKeyPair keyPair = new JcaPGPKeyPair(PublicKeyAlgorithmTags.Ed448, kp, date);

byte[] data = "Hello, World!\n".getBytes(StandardCharsets.UTF_8);

PGPContentSignerBuilder contSigBuilder = new JcaPGPContentSignerBuilder(
keyPair.getPublicKey().getAlgorithm(),
HashAlgorithmTags.SHA512)
.setProvider(new BouncyCastleProvider());
PGPSignatureGenerator sigGen = new PGPSignatureGenerator(contSigBuilder);
sigGen.init(PGPSignature.BINARY_DOCUMENT, keyPair.getPrivateKey());
sigGen.update(data);
PGPSignature signature = sigGen.generate();

PGPContentVerifierBuilderProvider contVerBuilder = new JcaPGPContentVerifierBuilderProvider()
.setProvider(new BouncyCastleProvider());
signature.init(contVerBuilder, keyPair.getPublicKey());
signature.update(data);
isTrue(signature.verify());
}

private void testV4SigningVerificationWithBcKey()
throws PGPException
{
Date date = currentTimeRounded();
Ed448KeyPairGenerator gen = new Ed448KeyPairGenerator();
gen.init(new Ed448KeyGenerationParameters(new SecureRandom()));
AsymmetricCipherKeyPair kp = gen.generateKeyPair();
BcPGPKeyPair keyPair = new BcPGPKeyPair(PublicKeyAlgorithmTags.Ed448, kp, date);

byte[] data = "Hello, World!\n".getBytes(StandardCharsets.UTF_8);

PGPContentSignerBuilder contSigBuilder = new BcPGPContentSignerBuilder(
keyPair.getPublicKey().getAlgorithm(),
HashAlgorithmTags.SHA512);
PGPSignatureGenerator sigGen = new PGPSignatureGenerator(contSigBuilder);
sigGen.init(PGPSignature.BINARY_DOCUMENT, keyPair.getPrivateKey());
sigGen.update(data);
PGPSignature signature = sigGen.generate();

PGPContentVerifierBuilderProvider contVerBuilder = new BcPGPContentVerifierBuilderProvider();
signature.init(contVerBuilder, keyPair.getPublicKey());
signature.update(data);
isTrue(signature.verify());
}

public static void main(String[] args)
{
runTest(new DedicatedEd448KeyPairTest());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,33 @@

import org.bouncycastle.bcpg.PublicKeyAlgorithmTags;
import org.bouncycastle.bcpg.PublicKeyPacket;
import org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags;
import org.bouncycastle.bcpg.X25519PublicBCPGKey;
import org.bouncycastle.bcpg.X25519SecretBCPGKey;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.generators.X25519KeyPairGenerator;
import org.bouncycastle.crypto.params.X25519KeyGenerationParameters;
import org.bouncycastle.jcajce.spec.XDHParameterSpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openpgp.PGPException;
import org.bouncycastle.openpgp.*;
import org.bouncycastle.openpgp.bc.BcPGPObjectFactory;
import org.bouncycastle.openpgp.jcajce.JcaPGPObjectFactory;
import org.bouncycastle.openpgp.operator.PGPDataEncryptorBuilder;
import org.bouncycastle.openpgp.operator.PublicKeyDataDecryptorFactory;
import org.bouncycastle.openpgp.operator.PublicKeyKeyEncryptionMethodGenerator;
import org.bouncycastle.openpgp.operator.bc.BcPGPDataEncryptorBuilder;
import org.bouncycastle.openpgp.operator.bc.BcPGPKeyPair;
import org.bouncycastle.openpgp.operator.bc.BcPublicKeyDataDecryptorFactory;
import org.bouncycastle.openpgp.operator.bc.BcPublicKeyKeyEncryptionMethodGenerator;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair;

import java.io.IOException;
import org.bouncycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.util.io.Streams;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.Date;

Expand All @@ -32,6 +47,8 @@ public void performTest()
{
testConversionOfJcaKeyPair();
testConversionOfBcKeyPair();
testV4MessageEncryptionDecryptionWithJcaKey();
testV4MessageEncryptionDecryptionWithBcKey();
}

private void testConversionOfJcaKeyPair()
Expand Down Expand Up @@ -128,6 +145,96 @@ private void testConversionOfBcKeyPair()
}
}

private void testV4MessageEncryptionDecryptionWithJcaKey()
throws PGPException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, IOException
{
BouncyCastleProvider provider = new BouncyCastleProvider();

Date date = currentTimeRounded();
KeyPairGenerator gen = KeyPairGenerator.getInstance("XDH", provider);
gen.initialize(new XDHParameterSpec("X25519"));
KeyPair kp = gen.generateKeyPair();
PGPKeyPair keyPair = new JcaPGPKeyPair(PublicKeyAlgorithmTags.X25519, kp, date);

byte[] data = "Hello, World!\n".getBytes(StandardCharsets.UTF_8);

PGPDataEncryptorBuilder encBuilder = new JcePGPDataEncryptorBuilder(SymmetricKeyAlgorithmTags.AES_256)
.setProvider(provider);
PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator(encBuilder);
PublicKeyKeyEncryptionMethodGenerator metGen = new JcePublicKeyKeyEncryptionMethodGenerator(keyPair.getPublicKey())
.setProvider(provider);
encGen.addMethod(metGen);
PGPLiteralDataGenerator litGen = new PGPLiteralDataGenerator();

ByteArrayOutputStream bOut = new ByteArrayOutputStream();
OutputStream encOut = encGen.open(bOut, new byte[4096]);
OutputStream litOut = litGen.open(encOut, PGPLiteralData.BINARY, "", PGPLiteralData.NOW, new byte[4096]);
litOut.write(data);
litGen.close();
encGen.close();

byte[] encrypted = bOut.toByteArray();

ByteArrayInputStream bIn = new ByteArrayInputStream(encrypted);
PGPObjectFactory objectFactory = new JcaPGPObjectFactory(bIn);
PGPEncryptedDataList encDataList = (PGPEncryptedDataList) objectFactory.nextObject();
PGPPublicKeyEncryptedData encData = (PGPPublicKeyEncryptedData) encDataList.get(0);
PublicKeyDataDecryptorFactory decFactory = new JcePublicKeyDataDecryptorFactoryBuilder()
.setProvider(provider)
.build(keyPair.getPrivateKey());
InputStream decIn = encData.getDataStream(decFactory);
objectFactory = new JcaPGPObjectFactory(decIn);
PGPLiteralData lit = (PGPLiteralData) objectFactory.nextObject();
InputStream litIn = lit.getDataStream();
byte[] plaintext = Streams.readAll(litIn);
litIn.close();
decIn.close();

isTrue(Arrays.areEqual(data, plaintext));
}

private void testV4MessageEncryptionDecryptionWithBcKey()
throws PGPException, IOException
{
Date date = currentTimeRounded();
X25519KeyPairGenerator gen = new X25519KeyPairGenerator();
gen.init(new X25519KeyGenerationParameters(new SecureRandom()));
AsymmetricCipherKeyPair kp = gen.generateKeyPair();
BcPGPKeyPair keyPair = new BcPGPKeyPair(PublicKeyAlgorithmTags.X25519, kp, date);

byte[] data = "Hello, World!\n".getBytes(StandardCharsets.UTF_8);

PGPDataEncryptorBuilder encBuilder = new BcPGPDataEncryptorBuilder(SymmetricKeyAlgorithmTags.AES_256);
PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator(encBuilder);
PublicKeyKeyEncryptionMethodGenerator metGen = new BcPublicKeyKeyEncryptionMethodGenerator(keyPair.getPublicKey());
encGen.addMethod(metGen);
PGPLiteralDataGenerator litGen = new PGPLiteralDataGenerator();

ByteArrayOutputStream bOut = new ByteArrayOutputStream();
OutputStream encOut = encGen.open(bOut, new byte[4096]);
OutputStream litOut = litGen.open(encOut, PGPLiteralData.BINARY, "", PGPLiteralData.NOW, new byte[4096]);
litOut.write(data);
litGen.close();
encGen.close();

byte[] encrypted = bOut.toByteArray();

ByteArrayInputStream bIn = new ByteArrayInputStream(encrypted);
PGPObjectFactory objectFactory = new BcPGPObjectFactory(bIn);
PGPEncryptedDataList encDataList = (PGPEncryptedDataList) objectFactory.nextObject();
PGPPublicKeyEncryptedData encData = (PGPPublicKeyEncryptedData) encDataList.get(0);
PublicKeyDataDecryptorFactory decFactory = new BcPublicKeyDataDecryptorFactory(keyPair.getPrivateKey());
InputStream decIn = encData.getDataStream(decFactory);
objectFactory = new BcPGPObjectFactory(decIn);
PGPLiteralData lit = (PGPLiteralData) objectFactory.nextObject();
InputStream litIn = lit.getDataStream();
byte[] plaintext = Streams.readAll(litIn);
litIn.close();
decIn.close();

isTrue(Arrays.areEqual(data, plaintext));
}

public static void main(String[] args)
{
runTest(new DedicatedX25519KeyPairTest());
Expand Down
Loading

0 comments on commit 4cdf535

Please sign in to comment.