Skip to content

Commit 7e94713

Browse files
committed
Updated BouncyCastle tests and corresponding stubs
1 parent 37d3b88 commit 7e94713

14 files changed

+293
-44
lines changed
Lines changed: 95 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import java.security.Security;
22
import java.security.SecureRandom;
3+
import java.security.interfaces.ECPrivateKey;
4+
import java.security.interfaces.ECPublicKey;
35
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
46
import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
57
import org.bouncycastle.crypto.params.ECDomainParameters;
@@ -8,54 +10,114 @@
810
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
911
import org.bouncycastle.crypto.signers.ECDSASigner;
1012
import org.bouncycastle.jce.provider.BouncyCastleProvider;
13+
import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
14+
import org.bouncycastle.jce.spec.ECNamedCurveSpec;
15+
import org.bouncycastle.jce.ECNamedCurveTable;
1116
import org.bouncycastle.asn1.sec.SECNamedCurves;
1217
import org.bouncycastle.asn1.x9.X9ECParameters;
18+
import org.bouncycastle.math.ec.ECCurve;
19+
import org.bouncycastle.math.ec.ECPoint;
1320

1421
/**
15-
* Example of using Bouncy Castle's low-level API for ECDSA signing and verification over P-256.
22+
* Test Bouncy Castle's low-level ECDSA API
1623
*/
1724
public class ECDSAP256SignAndVerify {
25+
1826
public static void main(String[] args) {
1927
// Add Bouncy Castle provider
2028
Security.addProvider(new BouncyCastleProvider());
2129

2230
try {
23-
// Get P-256 curve parameters using BouncyCastle's SECNamedCurves
24-
String curveName = "secp256r1";
25-
X9ECParameters ecParams = SECNamedCurves.getByName(curveName);
26-
ECDomainParameters domainParams = new ECDomainParameters(ecParams);
27-
28-
// Generate a key pair
29-
SecureRandom random = new SecureRandom();
30-
ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
31-
ECKeyGenerationParameters keyGenParams = new ECKeyGenerationParameters(domainParams, random);
32-
keyPairGenerator.init(keyGenParams);
33-
AsymmetricCipherKeyPair keyPair = keyPairGenerator.generateKeyPair();
34-
35-
ECPrivateKeyParameters privateKey = (ECPrivateKeyParameters) keyPair.getPrivate();
36-
ECPublicKeyParameters publicKey = (ECPublicKeyParameters) keyPair.getPublic();
37-
3831
byte[] message = "Hello, ECDSA P-256 signature!".getBytes("UTF-8");
3932

40-
// Sign the message
41-
ECDSASigner signer = new ECDSASigner();
42-
signer.init(true, privateKey); // true for signing
43-
// Note: ECDSA typically signs a hash of the message, not the message directly
44-
// For simplicity, we're signing the message bytes directly here
45-
java.math.BigInteger[] signature = signer.generateSignature(message);
46-
47-
System.out.println("Signature generated!");
48-
System.out.println("Signature r: " + signature[0].toString(16));
49-
System.out.println("Signature s: " + signature[1].toString(16));
50-
51-
// Verify the signature
52-
ECDSASigner verifier = new ECDSASigner();
53-
verifier.init(false, publicKey); // false for verification
54-
boolean verified = verifier.verifySignature(message, signature[0], signature[1]);
55-
56-
System.out.println("Signature verified: " + verified);
33+
// Test different key generation methods
34+
signWithKeyPair(generateKeyPair1(), message);
35+
signWithKeyPair(generateKeyPair2(), message);
36+
signWithKeyPair(generateKeyPair3(), message);
5737
} catch (Exception e) {
5838
e.printStackTrace();
5939
}
6040
}
41+
42+
/**
43+
* Method 1: Generate key pair with SECNamedCurves
44+
*/
45+
private static AsymmetricCipherKeyPair generateKeyPair1() throws Exception {
46+
// Get P-256 curve parameters using BouncyCastle's SECNamedCurves
47+
String curveName = "secp256r1";
48+
X9ECParameters ecParams = SECNamedCurves.getByName(curveName);
49+
ECDomainParameters domainParams = new ECDomainParameters(ecParams);
50+
51+
// Generate a key pair
52+
SecureRandom random = new SecureRandom();
53+
ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
54+
ECKeyGenerationParameters keyGenParams = new ECKeyGenerationParameters(domainParams, random);
55+
keyPairGenerator.init(keyGenParams);
56+
57+
return keyPairGenerator.generateKeyPair();
58+
}
59+
60+
/**
61+
* Method 2: Generate key pair with explicit curve construction
62+
*/
63+
private static AsymmetricCipherKeyPair generateKeyPair2() throws Exception {
64+
// Get the X9.62 parameters and construct domain parameters explicitly
65+
String curveName = "secp256k1";
66+
X9ECParameters x9Params = SECNamedCurves.getByName(curveName);
67+
ECCurve curve = x9Params.getCurve();
68+
ECPoint g = x9Params.getG();
69+
java.math.BigInteger n = x9Params.getN();
70+
java.math.BigInteger h = x9Params.getH();
71+
72+
// Create domain parameters with explicit values
73+
ECDomainParameters domainParams = new ECDomainParameters(curve, g, n, h);
74+
75+
SecureRandom random = new SecureRandom();
76+
ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
77+
ECKeyGenerationParameters keyGenParams = new ECKeyGenerationParameters(domainParams, random);
78+
keyPairGenerator.init(keyGenParams);
79+
80+
return keyPairGenerator.generateKeyPair();
81+
}
82+
83+
84+
/**
85+
* Method 3: Generate key pair using ECNamedCurveTable
86+
*/
87+
private static AsymmetricCipherKeyPair generateKeyPair3() throws Exception {
88+
// Get curve parameters using ECNamedCurveTable
89+
String curveName = "secp384r1";
90+
ECNamedCurveParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(curveName);
91+
ECDomainParameters domainParams = new ECDomainParameters(
92+
ecSpec.getCurve(),
93+
ecSpec.getG(),
94+
ecSpec.getN(),
95+
ecSpec.getH()
96+
);
97+
98+
SecureRandom random = new SecureRandom();
99+
ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
100+
ECKeyGenerationParameters keyGenParams = new ECKeyGenerationParameters(domainParams, random);
101+
keyPairGenerator.init(keyGenParams);
102+
103+
return keyPairGenerator.generateKeyPair();
104+
}
105+
106+
/**
107+
* Test signing and verification with BouncyCastle low-level key pair
108+
*/
109+
private static void signWithKeyPair(AsymmetricCipherKeyPair keyPair, byte[] message) throws Exception {
110+
ECPrivateKeyParameters privateKey = (ECPrivateKeyParameters) keyPair.getPrivate();
111+
ECPublicKeyParameters publicKey = (ECPublicKeyParameters) keyPair.getPublic();
112+
113+
// Sign the message
114+
ECDSASigner signer = new ECDSASigner();
115+
signer.init(true, privateKey); // true for signing
116+
java.math.BigInteger[] signature = signer.generateSignature(message);
117+
118+
// Verify the signature
119+
ECDSASigner verifier = new ECDSASigner();
120+
verifier.init(false, publicKey); // false for verification
121+
boolean verified = verifier.verifySignature(message, signature[0], signature[1]);
122+
}
61123
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import java.security.SecureRandom;
2+
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
3+
import org.bouncycastle.pqc.crypto.lms.LMSKeyPairGenerator;
4+
import org.bouncycastle.pqc.crypto.lms.LMSKeyGenerationParameters;
5+
import org.bouncycastle.pqc.crypto.lms.LMSParameters;
6+
import org.bouncycastle.pqc.crypto.lms.LMSPrivateKeyParameters;
7+
import org.bouncycastle.pqc.crypto.lms.LMSPublicKeyParameters;
8+
import org.bouncycastle.pqc.crypto.lms.LMSSigner;
9+
import org.bouncycastle.pqc.crypto.lms.LMSigParameters;
10+
import org.bouncycastle.pqc.crypto.lms.LMOtsParameters;
11+
import org.bouncycastle.jce.provider.BouncyCastleProvider;
12+
import java.security.Security;
13+
14+
/**
15+
* Example of the Leighton-Micali Signature (LMS) scheme using Bouncy Castle's
16+
* low-level API.
17+
*
18+
*/
19+
public class LMSSignature {
20+
public static void main(String[] args) {
21+
Security.addProvider(new BouncyCastleProvider());
22+
23+
try {
24+
// Set up LMS parameters
25+
LMSParameters lmsParameters = new LMSParameters(
26+
LMSigParameters.lms_sha256_n32_h10,
27+
LMOtsParameters.sha256_n32_w8);
28+
29+
// Generate key pair
30+
SecureRandom random = new SecureRandom();
31+
LMSKeyPairGenerator keyPairGen = new LMSKeyPairGenerator();
32+
keyPairGen.init(new LMSKeyGenerationParameters(lmsParameters, random));
33+
AsymmetricCipherKeyPair keyPair = keyPairGen.generateKeyPair();
34+
35+
LMSPrivateKeyParameters privateKey = (LMSPrivateKeyParameters) keyPair.getPrivate();
36+
LMSPublicKeyParameters publicKey = (LMSPublicKeyParameters) keyPair.getPublic();
37+
38+
byte[] message = "Hello, LMS signature!".getBytes("UTF-8");
39+
40+
LMSSigner signer = new LMSSigner();
41+
42+
// Sign the message
43+
signer.init(true, privateKey); // true for signing
44+
byte[] signature = signer.generateSignature(message);
45+
46+
// Verify the signature
47+
//
48+
// TODO: Using the same signer instance for verification causes both
49+
// keys to be reported. This should be handled using dataflow.
50+
signer.init(false, publicKey);
51+
boolean verified = signer.verifySignature(message, signature);
52+
53+
System.out.println("Signature verified: " + verified);
54+
} catch (Exception e) {
55+
e.printStackTrace();
56+
}
57+
}
58+
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
| ECDSAP256SignAndVerify.java:33:47:33:80 | Key | Unknown |
2-
| ECDSAP256SignAndVerify.java:33:47:33:80 | Key | secp256r1 |
3-
| Ed448SignAndVerify.java:21:47:21:80 | Key | Curve25519 |
1+
| ECDSAP256SignAndVerify.java:57:16:57:49 | Key | Unknown |
2+
| ECDSAP256SignAndVerify.java:80:16:80:49 | Key | Unknown |
3+
| ECDSAP256SignAndVerify.java:103:16:103:49 | Key | Unknown |
44
| Ed448SignAndVerify.java:21:47:21:80 | Key | Ed448 |
5-
| Ed25519SignAndVerify.java:21:47:21:80 | Key | Curve25519 |
65
| Ed25519SignAndVerify.java:21:47:21:80 | Key | Ed25519 |
6+
| LMSSignature.java:33:47:33:74 | Key | LMS |
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
| ECDSAP256SignAndVerify.java:33:47:33:80 | KeyGeneration | ECDSAP256SignAndVerify.java:24:32:24:42 | EllipticCurve | ECDSAP256SignAndVerify.java:33:47:33:80 | Key |
2-
| ECDSAP256SignAndVerify.java:33:47:33:80 | KeyGeneration | ECDSAP256SignAndVerify.java:30:51:30:74 | KeyOperationAlgorithm | ECDSAP256SignAndVerify.java:33:47:33:80 | Key |
3-
| Ed448SignAndVerify.java:21:47:21:80 | KeyGeneration | Ed448SignAndVerify.java:19:54:19:80 | EllipticCurve | Ed448SignAndVerify.java:21:47:21:80 | Key |
1+
| ECDSAP256SignAndVerify.java:57:16:57:49 | KeyGeneration | ECDSAP256SignAndVerify.java:53:47:53:70 | KeyOperationAlgorithm | ECDSAP256SignAndVerify.java:57:16:57:49 | Key |
2+
| ECDSAP256SignAndVerify.java:80:16:80:49 | KeyGeneration | ECDSAP256SignAndVerify.java:76:47:76:70 | KeyOperationAlgorithm | ECDSAP256SignAndVerify.java:80:16:80:49 | Key |
3+
| ECDSAP256SignAndVerify.java:103:16:103:49 | KeyGeneration | ECDSAP256SignAndVerify.java:99:47:99:70 | KeyOperationAlgorithm | ECDSAP256SignAndVerify.java:103:16:103:49 | Key |
44
| Ed448SignAndVerify.java:21:47:21:80 | KeyGeneration | Ed448SignAndVerify.java:19:54:19:80 | KeyOperationAlgorithm | Ed448SignAndVerify.java:21:47:21:80 | Key |
5-
| Ed25519SignAndVerify.java:21:47:21:80 | KeyGeneration | Ed25519SignAndVerify.java:19:56:19:84 | EllipticCurve | Ed25519SignAndVerify.java:21:47:21:80 | Key |
65
| Ed25519SignAndVerify.java:21:47:21:80 | KeyGeneration | Ed25519SignAndVerify.java:19:56:19:84 | KeyOperationAlgorithm | Ed25519SignAndVerify.java:21:47:21:80 | Key |
6+
| LMSSignature.java:33:47:33:74 | KeyGeneration | LMSSignature.java:31:46:31:70 | KeyOperationAlgorithm | LMSSignature.java:33:47:33:74 | Key |
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
| ECDSAP256SignAndVerify.java:45:48:45:80 | SignOperation | ECDSAP256SignAndVerify.java:41:34:41:50 | KeyOperationAlgorithm | ECDSAP256SignAndVerify.java:42:31:42:40 | Key | ECDSAP256SignAndVerify.java:45:73:45:79 | Message | | SignatureOutput |
2-
| ECDSAP256SignAndVerify.java:54:32:54:92 | VerifyOperation | ECDSAP256SignAndVerify.java:52:36:52:52 | KeyOperationAlgorithm | ECDSAP256SignAndVerify.java:53:34:53:42 | Key | ECDSAP256SignAndVerify.java:54:57:54:63 | Message | SignatureInput | |
1+
| ECDSAP256SignAndVerify.java:116:44:116:76 | SignOperation | ECDSAP256SignAndVerify.java:114:30:114:46 | KeyOperationAlgorithm | ECDSAP256SignAndVerify.java:115:27:115:36 | Key | ECDSAP256SignAndVerify.java:116:69:116:75 | Message | | SignatureOutput |
2+
| ECDSAP256SignAndVerify.java:121:28:121:88 | VerifyOperation | ECDSAP256SignAndVerify.java:119:32:119:48 | KeyOperationAlgorithm | ECDSAP256SignAndVerify.java:120:30:120:38 | Key | ECDSAP256SignAndVerify.java:121:53:121:59 | Message | SignatureInput | |
33
| Ed448SignAndVerify.java:32:32:32:57 | SignOperation | Ed448SignAndVerify.java:29:34:29:70 | KeyOperationAlgorithm | Ed448SignAndVerify.java:30:31:30:40 | Key | Ed448SignAndVerify.java:31:27:31:33 | Message | | SignatureOutput |
44
| Ed448SignAndVerify.java:40:32:40:66 | VerifyOperation | Ed448SignAndVerify.java:37:36:37:72 | KeyOperationAlgorithm | Ed448SignAndVerify.java:38:34:38:42 | Key | Ed448SignAndVerify.java:39:29:39:35 | Message | SignatureInput | |
55
| Ed25519SignAndVerify.java:32:32:32:57 | SignOperation | Ed25519SignAndVerify.java:29:36:29:54 | KeyOperationAlgorithm | Ed25519SignAndVerify.java:30:31:30:40 | Key | Ed25519SignAndVerify.java:31:27:31:33 | Message | | SignatureOutput |
66
| Ed25519SignAndVerify.java:40:32:40:66 | VerifyOperation | Ed25519SignAndVerify.java:37:38:37:56 | KeyOperationAlgorithm | Ed25519SignAndVerify.java:38:34:38:42 | Key | Ed25519SignAndVerify.java:39:29:39:35 | Message | SignatureInput | |
7+
| LMSSignature.java:44:32:44:64 | SignOperation | LMSSignature.java:40:32:40:46 | KeyOperationAlgorithm | LMSSignature.java:43:31:43:40 | Key | LMSSignature.java:44:57:44:63 | Message | | SignatureOutput |
8+
| LMSSignature.java:51:32:51:73 | VerifyOperation | LMSSignature.java:40:32:40:46 | KeyOperationAlgorithm | LMSSignature.java:43:31:43:40 | Key | LMSSignature.java:51:55:51:61 | Message | SignatureInput | |
9+
| LMSSignature.java:51:32:51:73 | VerifyOperation | LMSSignature.java:40:32:40:46 | KeyOperationAlgorithm | LMSSignature.java:50:32:50:40 | Key | LMSSignature.java:51:55:51:61 | Message | SignatureInput | |

java/ql/test/stubs/bcprov-lts8on-2.73.7/org/bouncycastle/jce/ECNamedCurveTable.java

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java/ql/test/stubs/bcprov-lts8on-2.73.7/org/bouncycastle/pqc/crypto/lms/LMOtsParameters.java

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java/ql/test/stubs/bcprov-lts8on-2.73.7/org/bouncycastle/pqc/crypto/lms/LMSKeyGenerationParameters.java

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java/ql/test/stubs/bcprov-lts8on-2.73.7/org/bouncycastle/pqc/crypto/lms/LMSKeyPairGenerator.java

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java/ql/test/stubs/bcprov-lts8on-2.73.7/org/bouncycastle/pqc/crypto/lms/LMSParameters.java

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java/ql/test/stubs/bcprov-lts8on-2.73.7/org/bouncycastle/pqc/crypto/lms/LMSPrivateKeyParameters.java

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java/ql/test/stubs/bcprov-lts8on-2.73.7/org/bouncycastle/pqc/crypto/lms/LMSPublicKeyParameters.java

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java/ql/test/stubs/bcprov-lts8on-2.73.7/org/bouncycastle/pqc/crypto/lms/LMSSigner.java

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java/ql/test/stubs/bcprov-lts8on-2.73.7/org/bouncycastle/pqc/crypto/lms/LMSigParameters.java

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)