Skip to content

Commit 4cdf535

Browse files
committed
Merge branch 'pr-1676-openPGP-function-tests' into 'main'
pr-1676-openPGP-function-tests See merge request root/bc-java!13
2 parents 4d44c17 + 4705216 commit 4cdf535

File tree

5 files changed

+457
-15
lines changed

5 files changed

+457
-15
lines changed

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

Lines changed: 61 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,19 @@
77
import org.bouncycastle.crypto.params.Ed25519KeyGenerationParameters;
88
import org.bouncycastle.jcajce.spec.EdDSAParameterSpec;
99
import org.bouncycastle.jce.provider.BouncyCastleProvider;
10-
import org.bouncycastle.openpgp.PGPException;
11-
import org.bouncycastle.openpgp.PGPPublicKey;
12-
import org.bouncycastle.openpgp.operator.bc.BcKeyFingerprintCalculator;
13-
import org.bouncycastle.openpgp.operator.bc.BcPGPKeyConverter;
14-
import org.bouncycastle.openpgp.operator.bc.BcPGPKeyPair;
10+
import org.bouncycastle.openpgp.*;
11+
import org.bouncycastle.openpgp.operator.PGPContentSignerBuilder;
12+
import org.bouncycastle.openpgp.operator.PGPContentVerifierBuilderProvider;
13+
import org.bouncycastle.openpgp.operator.bc.*;
14+
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentSignerBuilder;
15+
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentVerifierBuilderProvider;
1516
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyConverter;
1617
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair;
1718
import org.bouncycastle.util.Pack;
1819
import org.bouncycastle.util.encoders.Hex;
1920

2021
import java.io.IOException;
22+
import java.nio.charset.StandardCharsets;
2123
import java.security.*;
2224
import java.util.Date;
2325

@@ -36,6 +38,8 @@ public void performTest()
3638
{
3739
testConversionOfJcaKeyPair();
3840
testConversionOfBcKeyPair();
41+
testV4SigningVerificationWithJcaKey();
42+
testV4SigningVerificationWithBcKey();
3943

4044
testConversionOfTestVectorKey();
4145
}
@@ -134,6 +138,58 @@ private void testConversionOfBcKeyPair()
134138
}
135139
}
136140

141+
private void testV4SigningVerificationWithJcaKey()
142+
throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, PGPException
143+
{
144+
Date date = currentTimeRounded();
145+
KeyPairGenerator gen = KeyPairGenerator.getInstance("EDDSA", new BouncyCastleProvider());
146+
gen.initialize(new EdDSAParameterSpec("Ed25519"));
147+
KeyPair kp = gen.generateKeyPair();
148+
PGPKeyPair keyPair = new JcaPGPKeyPair(PublicKeyAlgorithmTags.Ed25519, kp, date);
149+
150+
byte[] data = "Hello, World!\n".getBytes(StandardCharsets.UTF_8);
151+
152+
PGPContentSignerBuilder contSigBuilder = new JcaPGPContentSignerBuilder(
153+
keyPair.getPublicKey().getAlgorithm(),
154+
HashAlgorithmTags.SHA512)
155+
.setProvider(new BouncyCastleProvider());
156+
PGPSignatureGenerator sigGen = new PGPSignatureGenerator(contSigBuilder);
157+
sigGen.init(PGPSignature.BINARY_DOCUMENT, keyPair.getPrivateKey());
158+
sigGen.update(data);
159+
PGPSignature signature = sigGen.generate();
160+
161+
PGPContentVerifierBuilderProvider contVerBuilder = new JcaPGPContentVerifierBuilderProvider()
162+
.setProvider(new BouncyCastleProvider());
163+
signature.init(contVerBuilder, keyPair.getPublicKey());
164+
signature.update(data);
165+
isTrue(signature.verify());
166+
}
167+
168+
private void testV4SigningVerificationWithBcKey()
169+
throws PGPException
170+
{
171+
Date date = currentTimeRounded();
172+
Ed25519KeyPairGenerator gen = new Ed25519KeyPairGenerator();
173+
gen.init(new Ed25519KeyGenerationParameters(new SecureRandom()));
174+
AsymmetricCipherKeyPair kp = gen.generateKeyPair();
175+
BcPGPKeyPair keyPair = new BcPGPKeyPair(PublicKeyAlgorithmTags.Ed25519, kp, date);
176+
177+
byte[] data = "Hello, World!\n".getBytes(StandardCharsets.UTF_8);
178+
179+
PGPContentSignerBuilder contSigBuilder = new BcPGPContentSignerBuilder(
180+
keyPair.getPublicKey().getAlgorithm(),
181+
HashAlgorithmTags.SHA512);
182+
PGPSignatureGenerator sigGen = new PGPSignatureGenerator(contSigBuilder);
183+
sigGen.init(PGPSignature.BINARY_DOCUMENT, keyPair.getPrivateKey());
184+
sigGen.update(data);
185+
PGPSignature signature = sigGen.generate();
186+
187+
PGPContentVerifierBuilderProvider contVerBuilder = new BcPGPContentVerifierBuilderProvider();
188+
signature.init(contVerBuilder, keyPair.getPublicKey());
189+
signature.update(data);
190+
isTrue(signature.verify());
191+
}
192+
137193
private void testConversionOfTestVectorKey() throws PGPException, IOException {
138194
JcaPGPKeyConverter jc = new JcaPGPKeyConverter().setProvider(new BouncyCastleProvider());
139195
BcPGPKeyConverter bc = new BcPGPKeyConverter();

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

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.bouncycastle.bcpg.Ed448PublicBCPGKey;
44
import org.bouncycastle.bcpg.Ed448SecretBCPGKey;
5+
import org.bouncycastle.bcpg.HashAlgorithmTags;
56
import org.bouncycastle.bcpg.PublicKeyAlgorithmTags;
67
import org.bouncycastle.bcpg.PublicKeyPacket;
78
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
@@ -10,10 +11,20 @@
1011
import org.bouncycastle.jcajce.spec.EdDSAParameterSpec;
1112
import org.bouncycastle.jce.provider.BouncyCastleProvider;
1213
import org.bouncycastle.openpgp.PGPException;
14+
import org.bouncycastle.openpgp.PGPKeyPair;
15+
import org.bouncycastle.openpgp.PGPSignature;
16+
import org.bouncycastle.openpgp.PGPSignatureGenerator;
17+
import org.bouncycastle.openpgp.operator.PGPContentSignerBuilder;
18+
import org.bouncycastle.openpgp.operator.PGPContentVerifierBuilderProvider;
19+
import org.bouncycastle.openpgp.operator.bc.BcPGPContentSignerBuilder;
20+
import org.bouncycastle.openpgp.operator.bc.BcPGPContentVerifierBuilderProvider;
1321
import org.bouncycastle.openpgp.operator.bc.BcPGPKeyPair;
22+
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentSignerBuilder;
23+
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentVerifierBuilderProvider;
1424
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair;
1525

1626
import java.io.IOException;
27+
import java.nio.charset.StandardCharsets;
1728
import java.security.*;
1829
import java.util.Date;
1930

@@ -32,6 +43,8 @@ public void performTest()
3243
{
3344
testConversionOfJcaKeyPair();
3445
testConversionOfBcKeyPair();
46+
testV4SigningVerificationWithJcaKey();
47+
testV4SigningVerificationWithBcKey();
3548
}
3649

3750
private void testConversionOfJcaKeyPair()
@@ -128,6 +141,58 @@ private void testConversionOfBcKeyPair()
128141
}
129142
}
130143

144+
private void testV4SigningVerificationWithJcaKey()
145+
throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, PGPException
146+
{
147+
Date date = currentTimeRounded();
148+
KeyPairGenerator gen = KeyPairGenerator.getInstance("EDDSA", new BouncyCastleProvider());
149+
gen.initialize(new EdDSAParameterSpec("Ed448"));
150+
KeyPair kp = gen.generateKeyPair();
151+
PGPKeyPair keyPair = new JcaPGPKeyPair(PublicKeyAlgorithmTags.Ed448, kp, date);
152+
153+
byte[] data = "Hello, World!\n".getBytes(StandardCharsets.UTF_8);
154+
155+
PGPContentSignerBuilder contSigBuilder = new JcaPGPContentSignerBuilder(
156+
keyPair.getPublicKey().getAlgorithm(),
157+
HashAlgorithmTags.SHA512)
158+
.setProvider(new BouncyCastleProvider());
159+
PGPSignatureGenerator sigGen = new PGPSignatureGenerator(contSigBuilder);
160+
sigGen.init(PGPSignature.BINARY_DOCUMENT, keyPair.getPrivateKey());
161+
sigGen.update(data);
162+
PGPSignature signature = sigGen.generate();
163+
164+
PGPContentVerifierBuilderProvider contVerBuilder = new JcaPGPContentVerifierBuilderProvider()
165+
.setProvider(new BouncyCastleProvider());
166+
signature.init(contVerBuilder, keyPair.getPublicKey());
167+
signature.update(data);
168+
isTrue(signature.verify());
169+
}
170+
171+
private void testV4SigningVerificationWithBcKey()
172+
throws PGPException
173+
{
174+
Date date = currentTimeRounded();
175+
Ed448KeyPairGenerator gen = new Ed448KeyPairGenerator();
176+
gen.init(new Ed448KeyGenerationParameters(new SecureRandom()));
177+
AsymmetricCipherKeyPair kp = gen.generateKeyPair();
178+
BcPGPKeyPair keyPair = new BcPGPKeyPair(PublicKeyAlgorithmTags.Ed448, kp, date);
179+
180+
byte[] data = "Hello, World!\n".getBytes(StandardCharsets.UTF_8);
181+
182+
PGPContentSignerBuilder contSigBuilder = new BcPGPContentSignerBuilder(
183+
keyPair.getPublicKey().getAlgorithm(),
184+
HashAlgorithmTags.SHA512);
185+
PGPSignatureGenerator sigGen = new PGPSignatureGenerator(contSigBuilder);
186+
sigGen.init(PGPSignature.BINARY_DOCUMENT, keyPair.getPrivateKey());
187+
sigGen.update(data);
188+
PGPSignature signature = sigGen.generate();
189+
190+
PGPContentVerifierBuilderProvider contVerBuilder = new BcPGPContentVerifierBuilderProvider();
191+
signature.init(contVerBuilder, keyPair.getPublicKey());
192+
signature.update(data);
193+
isTrue(signature.verify());
194+
}
195+
131196
public static void main(String[] args)
132197
{
133198
runTest(new DedicatedEd448KeyPairTest());

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

Lines changed: 110 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,33 @@
22

33
import org.bouncycastle.bcpg.PublicKeyAlgorithmTags;
44
import org.bouncycastle.bcpg.PublicKeyPacket;
5+
import org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags;
56
import org.bouncycastle.bcpg.X25519PublicBCPGKey;
67
import org.bouncycastle.bcpg.X25519SecretBCPGKey;
78
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
89
import org.bouncycastle.crypto.generators.X25519KeyPairGenerator;
910
import org.bouncycastle.crypto.params.X25519KeyGenerationParameters;
1011
import org.bouncycastle.jcajce.spec.XDHParameterSpec;
1112
import org.bouncycastle.jce.provider.BouncyCastleProvider;
12-
import org.bouncycastle.openpgp.PGPException;
13+
import org.bouncycastle.openpgp.*;
14+
import org.bouncycastle.openpgp.bc.BcPGPObjectFactory;
15+
import org.bouncycastle.openpgp.jcajce.JcaPGPObjectFactory;
16+
import org.bouncycastle.openpgp.operator.PGPDataEncryptorBuilder;
17+
import org.bouncycastle.openpgp.operator.PublicKeyDataDecryptorFactory;
18+
import org.bouncycastle.openpgp.operator.PublicKeyKeyEncryptionMethodGenerator;
19+
import org.bouncycastle.openpgp.operator.bc.BcPGPDataEncryptorBuilder;
1320
import org.bouncycastle.openpgp.operator.bc.BcPGPKeyPair;
21+
import org.bouncycastle.openpgp.operator.bc.BcPublicKeyDataDecryptorFactory;
22+
import org.bouncycastle.openpgp.operator.bc.BcPublicKeyKeyEncryptionMethodGenerator;
1423
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair;
15-
16-
import java.io.IOException;
24+
import org.bouncycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder;
25+
import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder;
26+
import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator;
27+
import org.bouncycastle.util.Arrays;
28+
import org.bouncycastle.util.io.Streams;
29+
30+
import java.io.*;
31+
import java.nio.charset.StandardCharsets;
1732
import java.security.*;
1833
import java.util.Date;
1934

@@ -32,6 +47,8 @@ public void performTest()
3247
{
3348
testConversionOfJcaKeyPair();
3449
testConversionOfBcKeyPair();
50+
testV4MessageEncryptionDecryptionWithJcaKey();
51+
testV4MessageEncryptionDecryptionWithBcKey();
3552
}
3653

3754
private void testConversionOfJcaKeyPair()
@@ -128,6 +145,96 @@ private void testConversionOfBcKeyPair()
128145
}
129146
}
130147

148+
private void testV4MessageEncryptionDecryptionWithJcaKey()
149+
throws PGPException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, IOException
150+
{
151+
BouncyCastleProvider provider = new BouncyCastleProvider();
152+
153+
Date date = currentTimeRounded();
154+
KeyPairGenerator gen = KeyPairGenerator.getInstance("XDH", provider);
155+
gen.initialize(new XDHParameterSpec("X25519"));
156+
KeyPair kp = gen.generateKeyPair();
157+
PGPKeyPair keyPair = new JcaPGPKeyPair(PublicKeyAlgorithmTags.X25519, kp, date);
158+
159+
byte[] data = "Hello, World!\n".getBytes(StandardCharsets.UTF_8);
160+
161+
PGPDataEncryptorBuilder encBuilder = new JcePGPDataEncryptorBuilder(SymmetricKeyAlgorithmTags.AES_256)
162+
.setProvider(provider);
163+
PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator(encBuilder);
164+
PublicKeyKeyEncryptionMethodGenerator metGen = new JcePublicKeyKeyEncryptionMethodGenerator(keyPair.getPublicKey())
165+
.setProvider(provider);
166+
encGen.addMethod(metGen);
167+
PGPLiteralDataGenerator litGen = new PGPLiteralDataGenerator();
168+
169+
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
170+
OutputStream encOut = encGen.open(bOut, new byte[4096]);
171+
OutputStream litOut = litGen.open(encOut, PGPLiteralData.BINARY, "", PGPLiteralData.NOW, new byte[4096]);
172+
litOut.write(data);
173+
litGen.close();
174+
encGen.close();
175+
176+
byte[] encrypted = bOut.toByteArray();
177+
178+
ByteArrayInputStream bIn = new ByteArrayInputStream(encrypted);
179+
PGPObjectFactory objectFactory = new JcaPGPObjectFactory(bIn);
180+
PGPEncryptedDataList encDataList = (PGPEncryptedDataList) objectFactory.nextObject();
181+
PGPPublicKeyEncryptedData encData = (PGPPublicKeyEncryptedData) encDataList.get(0);
182+
PublicKeyDataDecryptorFactory decFactory = new JcePublicKeyDataDecryptorFactoryBuilder()
183+
.setProvider(provider)
184+
.build(keyPair.getPrivateKey());
185+
InputStream decIn = encData.getDataStream(decFactory);
186+
objectFactory = new JcaPGPObjectFactory(decIn);
187+
PGPLiteralData lit = (PGPLiteralData) objectFactory.nextObject();
188+
InputStream litIn = lit.getDataStream();
189+
byte[] plaintext = Streams.readAll(litIn);
190+
litIn.close();
191+
decIn.close();
192+
193+
isTrue(Arrays.areEqual(data, plaintext));
194+
}
195+
196+
private void testV4MessageEncryptionDecryptionWithBcKey()
197+
throws PGPException, IOException
198+
{
199+
Date date = currentTimeRounded();
200+
X25519KeyPairGenerator gen = new X25519KeyPairGenerator();
201+
gen.init(new X25519KeyGenerationParameters(new SecureRandom()));
202+
AsymmetricCipherKeyPair kp = gen.generateKeyPair();
203+
BcPGPKeyPair keyPair = new BcPGPKeyPair(PublicKeyAlgorithmTags.X25519, kp, date);
204+
205+
byte[] data = "Hello, World!\n".getBytes(StandardCharsets.UTF_8);
206+
207+
PGPDataEncryptorBuilder encBuilder = new BcPGPDataEncryptorBuilder(SymmetricKeyAlgorithmTags.AES_256);
208+
PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator(encBuilder);
209+
PublicKeyKeyEncryptionMethodGenerator metGen = new BcPublicKeyKeyEncryptionMethodGenerator(keyPair.getPublicKey());
210+
encGen.addMethod(metGen);
211+
PGPLiteralDataGenerator litGen = new PGPLiteralDataGenerator();
212+
213+
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
214+
OutputStream encOut = encGen.open(bOut, new byte[4096]);
215+
OutputStream litOut = litGen.open(encOut, PGPLiteralData.BINARY, "", PGPLiteralData.NOW, new byte[4096]);
216+
litOut.write(data);
217+
litGen.close();
218+
encGen.close();
219+
220+
byte[] encrypted = bOut.toByteArray();
221+
222+
ByteArrayInputStream bIn = new ByteArrayInputStream(encrypted);
223+
PGPObjectFactory objectFactory = new BcPGPObjectFactory(bIn);
224+
PGPEncryptedDataList encDataList = (PGPEncryptedDataList) objectFactory.nextObject();
225+
PGPPublicKeyEncryptedData encData = (PGPPublicKeyEncryptedData) encDataList.get(0);
226+
PublicKeyDataDecryptorFactory decFactory = new BcPublicKeyDataDecryptorFactory(keyPair.getPrivateKey());
227+
InputStream decIn = encData.getDataStream(decFactory);
228+
objectFactory = new BcPGPObjectFactory(decIn);
229+
PGPLiteralData lit = (PGPLiteralData) objectFactory.nextObject();
230+
InputStream litIn = lit.getDataStream();
231+
byte[] plaintext = Streams.readAll(litIn);
232+
litIn.close();
233+
decIn.close();
234+
235+
isTrue(Arrays.areEqual(data, plaintext));
236+
}
237+
131238
public static void main(String[] args)
132239
{
133240
runTest(new DedicatedX25519KeyPairTest());

0 commit comments

Comments
 (0)