JCE: Implements ECDH benchmark

pull/116/head
Jack Tjaden 2025-06-10 13:37:52 -06:00
parent 7ab0ddda38
commit 8f4c66f8bf
1 changed files with 81 additions and 0 deletions

View File

@ -1376,6 +1376,67 @@ public class CryptoBenchmark {
} }
} }
/* Run ECDH benchmarks for specified provider and curve */
private static void runECDHBenchmark(String providerName, String curveName) throws Exception {
/* Variables for benchmark operations */
KeyPairGenerator keyGen;
KeyAgreement keyAgreement;
int keyGenOps;
int agreementOps;
long startTime;
double elapsedTime;
KeyPair keyPair1 = null;
KeyPair keyPair2 = null;
/* Initialize key generator */
if (providerName.equals("SunJCE")) {
keyGen = KeyPairGenerator.getInstance("EC", "SunEC");
keyGen.initialize(new ECGenParameterSpec(curveName));
providerName = "SunEC";
} else {
keyGen = KeyPairGenerator.getInstance("EC", providerName);
keyGen.initialize(new ECGenParameterSpec(curveName));
}
/* Key Generation benchmark */
keyGenOps = 0;
startTime = System.nanoTime();
elapsedTime = 0;
/* Run key generation benchmark */
do {
keyGen.generateKeyPair();
keyGenOps++;
elapsedTime = (System.nanoTime() - startTime) / 1_000_000_000.0;
} while (elapsedTime < TEST_MIN_TIME_SECONDS);
String keyGenOp = String.format("ECDH %s key gen", curveName);
printKeyGenResults(keyGenOps, elapsedTime, keyGenOp, providerName, "ECDH");
/* Generate key pairs for agreement operations */
keyPair1 = keyGen.generateKeyPair();
keyPair2 = keyGen.generateKeyPair();
/* Key Agreement benchmark - create new KeyAgreement instance for each operation */
agreementOps = 0;
startTime = System.nanoTime();
elapsedTime = 0;
/* Run key agreement benchmark */
do {
/* Create a new KeyAgreement instance for each operation to avoid "Object already has a key" error */
keyAgreement = KeyAgreement.getInstance("ECDH", providerName);
keyAgreement.init(keyPair1.getPrivate());
keyAgreement.doPhase(keyPair2.getPublic(), true);
keyAgreement.generateSecret();
agreementOps++;
elapsedTime = (System.nanoTime() - startTime) / 1_000_000_000.0;
} while (elapsedTime < TEST_MIN_TIME_SECONDS);
String agreementOp = String.format("ECDH %s agree", curveName);
printKeyGenResults(agreementOps, elapsedTime, agreementOp, providerName, "ECDH");
}
public static void main(String[] args) { public static void main(String[] args) {
try { try {
/* Check if Bouncy Castle is available */ /* Check if Bouncy Castle is available */
@ -1520,6 +1581,26 @@ public class CryptoBenchmark {
} }
} }
System.out.println("\n-----------------------------------------------------------------------------");
System.out.println("ECDH Benchmark Results");
System.out.println("-----------------------------------------------------------------------------");
for (Provider provider : providers) {
if (provider instanceof WolfCryptProvider && !FeatureDetect.EccDheEnabled()) {
continue;
}
setupProvidersForTest(provider);
System.out.println("\n" + (provider.getName().equals("SunJCE") ? "SunJCE / SunEC" : provider.getName()) + ":");
for (String curve : ECC_CURVES) {
try {
runECDHBenchmark(provider.getName(), curve);
} catch (Exception e) {
System.out.printf("Failed to benchmark ECDH %s with provider %s: %s%n",
curve, provider.getName(), e.getMessage());
}
}
}
/* Run PBKDF2 benchmarks with clean provider setup */ /* Run PBKDF2 benchmarks with clean provider setup */
System.out.println("\n-----------------------------------------------------------------------------"); System.out.println("\n-----------------------------------------------------------------------------");
System.out.println("PBKDF2 Benchmark Results"); System.out.println("PBKDF2 Benchmark Results");