Skip to content

Commit 06fa0e9

Browse files
committed
Added unit tests for BouncyCastle EdDSA signatures and key generators
1 parent 80796dd commit 06fa0e9

File tree

9 files changed

+130
-0
lines changed

9 files changed

+130
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import java.security.KeyPair;
2+
import java.security.Security;
3+
import java.security.SecureRandom;
4+
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
5+
import org.bouncycastle.crypto.generators.Ed25519KeyPairGenerator;
6+
import org.bouncycastle.crypto.params.Ed25519KeyGenerationParameters;
7+
import org.bouncycastle.crypto.params.Ed25519PrivateKeyParameters;
8+
import org.bouncycastle.crypto.params.Ed25519PublicKeyParameters;
9+
import org.bouncycastle.crypto.signers.Ed25519Signer;
10+
import org.bouncycastle.jce.provider.BouncyCastleProvider;
11+
12+
public class Ed25519SignAndVerify {
13+
public static void main(String[] args) {
14+
Security.addProvider(new BouncyCastleProvider());
15+
16+
try {
17+
// Generate a key pair
18+
SecureRandom random = new SecureRandom();
19+
Ed25519KeyPairGenerator keyPairGenerator = new Ed25519KeyPairGenerator();
20+
keyPairGenerator.init(new Ed25519KeyGenerationParameters(random));
21+
AsymmetricCipherKeyPair keyPair = keyPairGenerator.generateKeyPair();
22+
23+
Ed25519PrivateKeyParameters privateKey = (Ed25519PrivateKeyParameters) keyPair.getPrivate();
24+
Ed25519PublicKeyParameters publicKey = (Ed25519PublicKeyParameters) keyPair.getPublic();
25+
26+
byte[] message = "Hello, Ed25519 signature!".getBytes("UTF-8");
27+
28+
// Sign the message
29+
Ed25519Signer signer = new Ed25519Signer();
30+
signer.init(true, privateKey); // true for signing
31+
signer.update(message, 0, message.length);
32+
byte[] signature = signer.generateSignature();
33+
34+
System.out.println("Signature generated!");
35+
36+
// Verify the signature
37+
Ed25519Signer verifier = new Ed25519Signer();
38+
verifier.init(false, publicKey); // false for verification
39+
verifier.update(message, 0, message.length);
40+
boolean verified = verifier.verifySignature(signature);
41+
42+
System.out.println("Signature verified: " + verified);
43+
} catch (Exception e) {
44+
e.printStackTrace();
45+
}
46+
}
47+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import java.security.KeyPair;
2+
import java.security.Security;
3+
import java.security.SecureRandom;
4+
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
5+
import org.bouncycastle.crypto.generators.Ed448KeyPairGenerator;
6+
import org.bouncycastle.crypto.params.Ed448KeyGenerationParameters;
7+
import org.bouncycastle.crypto.params.Ed448PrivateKeyParameters;
8+
import org.bouncycastle.crypto.params.Ed448PublicKeyParameters;
9+
import org.bouncycastle.crypto.signers.Ed448Signer;
10+
import org.bouncycastle.jce.provider.BouncyCastleProvider;
11+
12+
public class Ed448SignAndVerify {
13+
public static void main(String[] args) {
14+
Security.addProvider(new BouncyCastleProvider());
15+
16+
try {
17+
// Generate a key pair
18+
SecureRandom random = new SecureRandom();
19+
Ed448KeyPairGenerator keyPairGenerator = new Ed448KeyPairGenerator();
20+
keyPairGenerator.init(new Ed448KeyGenerationParameters(random));
21+
AsymmetricCipherKeyPair keyPair = keyPairGenerator.generateKeyPair();
22+
23+
Ed448PrivateKeyParameters privateKey = (Ed448PrivateKeyParameters) keyPair.getPrivate();
24+
Ed448PublicKeyParameters publicKey = (Ed448PublicKeyParameters) keyPair.getPublic();
25+
26+
byte[] message = "Hello, Ed448 signature!".getBytes("UTF-8");
27+
28+
// Sign the message
29+
Ed448Signer signer = new Ed448Signer("context".getBytes());
30+
signer.init(true, privateKey); // true for signing
31+
signer.update(message, 0, message.length);
32+
byte[] signature = signer.generateSignature();
33+
34+
System.out.println("Signature generated!");
35+
36+
// Verify the signature
37+
Ed448Signer verifier = new Ed448Signer("context".getBytes());
38+
verifier.init(false, publicKey); // false for verification
39+
verifier.update(message, 0, message.length);
40+
boolean verified = verifier.verifySignature(signature);
41+
42+
System.out.println("Signature verified: " + verified);
43+
} catch (Exception e) {
44+
e.printStackTrace();
45+
}
46+
}
47+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
| Ed448SignAndVerify.java:21:47:21:80 | Key | CURVE25519 |
2+
| Ed448SignAndVerify.java:21:47:21:80 | Key | Ed448 |
3+
| Ed25519SignAndVerify.java:21:47:21:80 | Key | CURVE25519 |
4+
| Ed25519SignAndVerify.java:21:47:21:80 | Key | Ed25519 |
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import java
2+
import experimental.quantum.Language
3+
4+
from Crypto::KeyArtifactNode n
5+
select n, n.getAKnownAlgorithm()
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
| Ed448SignAndVerify.java:21:47:21:80 | KeyGeneration | Ed448SignAndVerify.java:19:54:19:80 | EllipticCurve | Ed448SignAndVerify.java:21:47:21:80 | Key |
2+
| Ed448SignAndVerify.java:21:47:21:80 | KeyGeneration | Ed448SignAndVerify.java:19:54:19:80 | KeyOperationAlgorithm | Ed448SignAndVerify.java:21:47:21:80 | Key |
3+
| Ed25519SignAndVerify.java:21:47:21:80 | KeyGeneration | Ed25519SignAndVerify.java:19:56:19:84 | EllipticCurve | Ed25519SignAndVerify.java:21:47:21:80 | Key |
4+
| Ed25519SignAndVerify.java:21:47:21:80 | KeyGeneration | Ed25519SignAndVerify.java:19:56:19:84 | KeyOperationAlgorithm | Ed25519SignAndVerify.java:21:47:21:80 | Key |
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import java
2+
import experimental.quantum.Language
3+
4+
from Crypto::KeyGenerationOperationNode n
5+
select n, n.getAKnownAlgorithm(), n.getOutputKeyArtifact()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../stubs/bcprov-lts8on-2.73.7
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
| Ed448SignAndVerify.java:32:32:32:57 | SignOperation | Ed448SignAndVerify.java:30:31:30:40 | Key | Ed448SignAndVerify.java:31:27:31:33 | Message | KeyOperationOutput |
2+
| Ed448SignAndVerify.java:40:32:40:66 | VerifyOperation | Ed448SignAndVerify.java:38:34:38:42 | Key | Ed448SignAndVerify.java:39:29:39:35 | Message | |
3+
| Ed25519SignAndVerify.java:32:32:32:57 | SignOperation | Ed25519SignAndVerify.java:30:31:30:40 | Key | Ed25519SignAndVerify.java:31:27:31:33 | Message | KeyOperationOutput |
4+
| Ed25519SignAndVerify.java:40:32:40:66 | VerifyOperation | Ed25519SignAndVerify.java:38:34:38:42 | Key | Ed25519SignAndVerify.java:39:29:39:35 | Message | |
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import java
2+
import experimental.quantum.Language
3+
4+
string getAnOutputArtifact(Crypto::KeyOperationNode n) {
5+
exists(Crypto::KeyOperationOutputNode output |
6+
output = n.getAnOutputArtifact() and result = output.toString()
7+
)
8+
or
9+
not exists(n.getAnOutputArtifact()) and result = ""
10+
}
11+
12+
from Crypto::SignatureOperationNode n
13+
select n, n.getAKey(), n.getAnInputArtifact(), getAnOutputArtifact(n)

0 commit comments

Comments
 (0)