|
1 | 1 | import javax.crypto.Cipher; |
| 2 | +import javax.crypto.KeyGenerator; |
| 3 | +import javax.crypto.Mac; |
2 | 4 | import javax.crypto.SecretKey; |
3 | 5 | import javax.crypto.spec.GCMParameterSpec; |
4 | 6 | import javax.crypto.spec.IvParameterSpec; |
|
7 | 9 | import java.security.SecureRandom; |
8 | 10 | import java.security.Security; |
9 | 11 | import java.security.spec.AlgorithmParameterSpec; |
10 | | -import java.util.*; |
11 | 12 | import java.security.KeyPair; |
12 | 13 | import java.security.KeyPairGenerator; |
13 | 14 | import java.security.spec.ECGenParameterSpec; |
| 15 | +import java.util.*; |
14 | 16 |
|
15 | 17 | import com.wolfssl.provider.jce.WolfCryptProvider; |
16 | 18 | import com.wolfssl.wolfcrypt.FeatureDetect; |
@@ -403,6 +405,55 @@ private static void runECCBenchmark(String providerName, String curveName) throw |
403 | 405 | printKeyGenResults(keyGenOps, elapsedTime, keyGenOp, providerName, "EC"); |
404 | 406 | } |
405 | 407 |
|
| 408 | + /* HMAC benchmark */ |
| 409 | + private static void runHmacBenchmark(String algorithm, String providerName) throws Exception { |
| 410 | + Mac mac; |
| 411 | + byte[] testData; |
| 412 | + double dataSizeMiB; |
| 413 | + long startTime; |
| 414 | + long endTime; |
| 415 | + long elapsedTime; |
| 416 | + double throughput; |
| 417 | + |
| 418 | + /* Generate test data */ |
| 419 | + testData = generateTestData(DATA_SIZE); |
| 420 | + |
| 421 | + /* Initialize Mac with specific provider */ |
| 422 | + mac = Mac.getInstance(algorithm, providerName); |
| 423 | + |
| 424 | + /* Initialize Mac with a random key */ |
| 425 | + SecureRandom secureRandom = new SecureRandom(); |
| 426 | + byte[] keyBytes = new byte[64]; |
| 427 | + secureRandom.nextBytes(keyBytes); |
| 428 | + SecretKeySpec key = new SecretKeySpec(keyBytes, algorithm); |
| 429 | + mac.init(key); |
| 430 | + |
| 431 | + /* Warm up phase */ |
| 432 | + for (int i = 0; i < WARMUP_ITERATIONS; i++) { |
| 433 | + mac.update(testData); |
| 434 | + mac.doFinal(); |
| 435 | + } |
| 436 | + |
| 437 | + /* Benchmark */ |
| 438 | + startTime = System.nanoTime(); |
| 439 | + for (int i = 0; i < TEST_ITERATIONS; i++) { |
| 440 | + mac.update(testData); |
| 441 | + mac.doFinal(); |
| 442 | + } |
| 443 | + endTime = System.nanoTime(); |
| 444 | + elapsedTime = (endTime - startTime) / TEST_ITERATIONS; |
| 445 | + |
| 446 | + dataSizeMiB = (DATA_SIZE * TEST_ITERATIONS) / (1024.0 * 1024.0); |
| 447 | + throughput = (DATA_SIZE / (elapsedTime / 1000000000.0)) / (1024.0 * 1024.0); |
| 448 | + |
| 449 | + String testName = String.format("%s (%s)", algorithm, providerName); |
| 450 | + System.out.printf(" %-40s %8.3f MiB took %.3f seconds, %8.3f MiB/s%n", |
| 451 | + testName, dataSizeMiB, elapsedTime / 1_000_000_000.0, throughput); |
| 452 | + |
| 453 | + /* Store result */ |
| 454 | + results.add(new BenchmarkResult(providerName, algorithm, throughput)); |
| 455 | + } |
| 456 | + |
406 | 457 | public static void main(String[] args) { |
407 | 458 | try { |
408 | 459 | /* Check if Bouncy Castle is available */ |
@@ -494,6 +545,32 @@ public static void main(String[] args) { |
494 | 545 | Security.removeProvider(provider.getName()); |
495 | 546 | } |
496 | 547 |
|
| 548 | + System.out.println("\n-----------------------------------------------------------------------------"); |
| 549 | + System.out.println("HMAC Benchmark Results"); |
| 550 | + System.out.println("-----------------------------------------------------------------------------"); |
| 551 | + |
| 552 | + for (int i = 0; i < providers.length; i++) { |
| 553 | + Security.insertProviderAt(providers[i], 1); |
| 554 | + |
| 555 | + if (FeatureDetect.HmacMd5Enabled()) { |
| 556 | + runHmacBenchmark("HmacMD5", providerNames[i]); |
| 557 | + } |
| 558 | + if (FeatureDetect.HmacShaEnabled()) { |
| 559 | + runHmacBenchmark("HmacSHA1", providerNames[i]); |
| 560 | + } |
| 561 | + if (FeatureDetect.HmacSha256Enabled()) { |
| 562 | + runHmacBenchmark("HmacSHA256", providerNames[i]); |
| 563 | + } |
| 564 | + if (FeatureDetect.HmacSha384Enabled()) { |
| 565 | + runHmacBenchmark("HmacSHA384", providerNames[i]); |
| 566 | + } |
| 567 | + if (FeatureDetect.HmacSha512Enabled()) { |
| 568 | + runHmacBenchmark("HmacSHA512", providerNames[i]); |
| 569 | + } |
| 570 | + |
| 571 | + Security.removeProvider(providers[i].getName()); |
| 572 | + } |
| 573 | + |
497 | 574 | System.out.println("-----------------------------------------------------------------------------\n"); |
498 | 575 |
|
499 | 576 | /* Print delta table */ |
|
0 commit comments