Skip to content

Commit 4703483

Browse files
committed
JCE: Implements DH key gen and key agreement benchmark
1 parent 98e85c9 commit 4703483

File tree

1 file changed

+97
-2
lines changed

1 file changed

+97
-2
lines changed

examples/provider/CryptoBenchmark.java

Lines changed: 97 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
import java.security.spec.AlgorithmParameterSpec;
1212
import java.security.KeyPair;
1313
import java.security.KeyPairGenerator;
14+
import javax.crypto.KeyAgreement;
15+
import java.math.BigInteger;
16+
import javax.crypto.interfaces.DHPublicKey;
17+
import javax.crypto.spec.DHParameterSpec;
1418
import java.security.spec.ECGenParameterSpec;
1519
import java.util.*;
1620

@@ -29,6 +33,8 @@ public class CryptoBenchmark {
2933
private static final int RSA_MIN_TIME_SECONDS = 1; /* minimum time to run each test */
3034
private static final int SMALL_MESSAGE_SIZE = 32; /* small message size for RSA ops */
3135
private static final String[] ECC_CURVES = {"secp256r1"}; /* Can add more curves benchmark.c only uses secp256r1 */
36+
private static final int[] DH_KEY_SIZES = {2048}; /* Can add more key sizes benchmark.c only uses 2048 */
37+
private static final String DH_ALGORITHM = "DiffieHellman";
3238

3339
/* Class to store benchmark results */
3440
private static class BenchmarkResult {
@@ -473,6 +479,78 @@ private static void runHmacBenchmark(String algorithm, String providerName) thro
473479
results.add(new BenchmarkResult(providerName, algorithm, throughput));
474480
}
475481

482+
/* Run DH benchmarks for specified provider and key size */
483+
private static void runDHBenchmark(String providerName, int keySize) throws Exception {
484+
/* Variables for benchmark operations */
485+
KeyPairGenerator keyGen;
486+
KeyAgreement keyAgreement;
487+
int keyGenOps;
488+
int agreementOps;
489+
long startTime;
490+
double elapsedTime;
491+
KeyPair keyPair1 = null;
492+
KeyPair keyPair2 = null;
493+
494+
/* Standard DH parameters for 2048-bit key from RFC 3526 */
495+
BigInteger p = new BigInteger(
496+
"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" +
497+
"29024E088A67CC74020BBEA63B139B22514A08798E3404DD" +
498+
"EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" +
499+
"E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" +
500+
"EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" +
501+
"C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" +
502+
"83655D23DCA3AD961C62F356208552BB9ED529077096966D" +
503+
"670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" +
504+
"E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" +
505+
"DE2BCBF6955817183995497CEA956AE515D2261898FA0510" +
506+
"15728E5A8AACAA68FFFFFFFFFFFFFFFF", 16);
507+
BigInteger g = BigInteger.valueOf(2);
508+
DHParameterSpec dhParams = new DHParameterSpec(p, g);
509+
510+
/* Get KeyPairGenerator for DH */
511+
keyGen = KeyPairGenerator.getInstance("DH", providerName);
512+
513+
/* Initialize with parameters */
514+
keyGen.initialize(dhParams);
515+
516+
/* Key Generation benchmark */
517+
keyGenOps = 0;
518+
startTime = System.nanoTime();
519+
elapsedTime = 0;
520+
521+
/* Run key generation benchmark */
522+
do {
523+
keyGen.generateKeyPair();
524+
keyGenOps++;
525+
elapsedTime = (System.nanoTime() - startTime) / 1_000_000_000.0;
526+
} while (elapsedTime < RSA_MIN_TIME_SECONDS);
527+
528+
String keyGenOp = String.format("DH %d key gen", keySize);
529+
printKeyGenResults(keyGenOps, elapsedTime, keyGenOp, providerName, DH_ALGORITHM);
530+
531+
/* Generate key pairs for agreement operations */
532+
keyPair1 = keyGen.generateKeyPair();
533+
keyPair2 = keyGen.generateKeyPair();
534+
535+
/* Key Agreement benchmark */
536+
keyAgreement = KeyAgreement.getInstance("DH", providerName);
537+
agreementOps = 0;
538+
startTime = System.nanoTime();
539+
elapsedTime = 0;
540+
541+
/* Run key agreement benchmark */
542+
do {
543+
keyAgreement.init(keyPair1.getPrivate());
544+
keyAgreement.doPhase(keyPair2.getPublic(), true);
545+
keyAgreement.generateSecret();
546+
agreementOps++;
547+
elapsedTime = (System.nanoTime() - startTime) / 1_000_000_000.0;
548+
} while (elapsedTime < RSA_MIN_TIME_SECONDS);
549+
550+
String agreementOp = String.format("DH %d agree", keySize);
551+
printKeyGenResults(agreementOps, elapsedTime, agreementOp, providerName, DH_ALGORITHM);
552+
}
553+
476554
public static void main(String[] args) {
477555
try {
478556
/* Check if Bouncy Castle is available */
@@ -524,10 +602,27 @@ public static void main(String[] args) {
524602
if (FeatureDetect.Des3Enabled()) {
525603
runEncDecBenchmark("DESede", "CBC", "NoPadding", providerNames[i]);
526604
}
527-
528-
Security.removeProvider(providers[i].getName());
529605
}
530606

607+
System.out.println("\n-----------------------------------------------------------------------------");
608+
System.out.println("DH Benchmark Results");
609+
System.out.println("-----------------------------------------------------------------------------");
610+
611+
for (Provider provider : providers) {
612+
if (provider instanceof WolfCryptProvider && !FeatureDetect.DhEnabled()) {
613+
continue;
614+
}
615+
Security.insertProviderAt(provider, 1);
616+
System.out.println("\n" + provider.getName() + ":");
617+
for (int keySize : DH_KEY_SIZES) {
618+
try {
619+
runDHBenchmark(provider.getName(), keySize);
620+
} catch (Exception e) {
621+
System.out.printf("Failed to benchmark DH %d with provider %s: %s%n",
622+
keySize, provider.getName(), e.getMessage());
623+
}
624+
}
625+
}
531626

532627
/* Run RSA benchmarks */
533628
System.out.println("\n-----------------------------------------------------------------------------");

0 commit comments

Comments
 (0)