|
18 | 18 | import java.security.spec.ECGenParameterSpec; |
19 | 19 | import javax.crypto.SecretKeyFactory; |
20 | 20 | import javax.crypto.spec.PBEKeySpec; |
| 21 | +import java.security.MessageDigest; |
| 22 | +import java.security.NoSuchAlgorithmException; |
| 23 | +import java.security.NoSuchProviderException; |
21 | 24 | import java.util.*; |
22 | 25 |
|
23 | 26 | import com.wolfssl.provider.jce.WolfCryptProvider; |
@@ -154,9 +157,9 @@ private static void printDeltaTable() { |
154 | 157 | String displayProvider = provider; |
155 | 158 | if (isRSAOperation) { |
156 | 159 | if (operation.contains("key gen")) { |
157 | | - displayProvider = "SunRsaSign"; // Key generation uses SunRsaSign |
| 160 | + displayProvider = "SunRsaSign"; /* Key generation uses SunRsaSign */ |
158 | 161 | } else { |
159 | | - displayProvider = "SunJCE"; // Public/private operations use SunJCE |
| 162 | + displayProvider = "SunJCE"; /* Public/private operations use SunJCE */ |
160 | 163 | } |
161 | 164 | } |
162 | 165 |
|
@@ -296,6 +299,15 @@ private static void runEncDecBenchmark(String algorithm, String mode, String pad |
296 | 299 | results.add(new BenchmarkResult(providerName, cipherName + " dec", decryptThroughput)); |
297 | 300 | } |
298 | 301 |
|
| 302 | + /* Helper method to check if an algorithm is supported by the provider */ |
| 303 | + private static boolean isAlgorithmSupported(String algorithm, String providerName) { |
| 304 | + try { |
| 305 | + MessageDigest.getInstance(algorithm, providerName); |
| 306 | + return true; |
| 307 | + } catch (NoSuchAlgorithmException | NoSuchProviderException e) { |
| 308 | + return false; |
| 309 | + } |
| 310 | + } |
299 | 311 | /* Print RSA results in simpler format */ |
300 | 312 | private static void printKeyGenResults(int operations, double totalTime, String operation, |
301 | 313 | String providerName, String mode) { |
@@ -609,6 +621,35 @@ private static void runPBKDF2Benchmark(String algorithm, String providerName) th |
609 | 621 | results.add(new BenchmarkResult(providerName, algorithm, throughput)); |
610 | 622 | } |
611 | 623 |
|
| 624 | + /* MessageDigest benchmark */ |
| 625 | + private static void runMessageDigestBenchmark(String algorithm, String providerName) throws Exception { |
| 626 | + MessageDigest md = MessageDigest.getInstance(algorithm, providerName); |
| 627 | + byte[] testData = generateTestData(DATA_SIZE); |
| 628 | + int ops = 0; |
| 629 | + long startTime = System.nanoTime(); |
| 630 | + double elapsedTime; |
| 631 | + |
| 632 | + /* Warm up phase */ |
| 633 | + for (int i = 0; i < WARMUP_ITERATIONS; i++) { |
| 634 | + md.update(testData); |
| 635 | + md.digest(); |
| 636 | + } |
| 637 | + |
| 638 | + /* Benchmark phase: run for at least 1 second */ |
| 639 | + do { |
| 640 | + md.update(testData); |
| 641 | + md.digest(); |
| 642 | + ops++; |
| 643 | + elapsedTime = (System.nanoTime() - startTime) / 1_000_000_000.0; |
| 644 | + } while (elapsedTime < TEST_MIN_TIME_SECONDS); |
| 645 | + |
| 646 | + double dataSizeMiB = (DATA_SIZE * ops) / (1024.0 * 1024.0); |
| 647 | + double throughput = dataSizeMiB / elapsedTime; |
| 648 | + System.out.printf("%-40s %8.3f MiB took %.3f sec, %8.3f MiB/s%n", |
| 649 | + algorithm + " (" + providerName + ")", dataSizeMiB, elapsedTime, throughput); |
| 650 | + results.add(new BenchmarkResult(providerName, algorithm, throughput)); |
| 651 | + } |
| 652 | + |
612 | 653 | public static void main(String[] args) { |
613 | 654 | try { |
614 | 655 | /* Check if Bouncy Castle is available */ |
@@ -776,6 +817,79 @@ public static void main(String[] args) { |
776 | 817 | } |
777 | 818 | } |
778 | 819 |
|
| 820 | + System.out.println("\n-----------------------------------------------------------------------------"); |
| 821 | + System.out.println("MessageDigest Benchmark Results"); |
| 822 | + System.out.println("-----------------------------------------------------------------------------"); |
| 823 | + |
| 824 | + for (int i = 0; i < providers.length; i++) { |
| 825 | + Security.insertProviderAt(providers[i], 1); |
| 826 | + String providerName = providerNames[i]; |
| 827 | + String digestProviderName = providerName; |
| 828 | + |
| 829 | + if (!providerName.equals("wolfJCE")) { |
| 830 | + if (providerName.equals("BC")) { |
| 831 | + digestProviderName = "BC"; |
| 832 | + } else { |
| 833 | + try { |
| 834 | + Provider sunProvider = Security.getProvider("SUN"); |
| 835 | + if (sunProvider != null) { |
| 836 | + Security.insertProviderAt(sunProvider, 1); |
| 837 | + digestProviderName = "SUN"; |
| 838 | + } else { |
| 839 | + System.out.println("SUN provider not available, using " + providerName + " for MessageDigest"); |
| 840 | + } |
| 841 | + } catch (Exception e) { |
| 842 | + System.out.println("Failed to set up SUN provider for " + providerName + ": " + e.getMessage()); |
| 843 | + System.out.println("Using " + providerName + " for MessageDigest instead"); |
| 844 | + } |
| 845 | + } |
| 846 | + } |
| 847 | + |
| 848 | + System.out.println("\n" + digestProviderName + ":"); |
| 849 | + try { |
| 850 | + if (FeatureDetect.Md5Enabled() && isAlgorithmSupported("MD5", digestProviderName)) { |
| 851 | + runMessageDigestBenchmark("MD5", digestProviderName); |
| 852 | + } |
| 853 | + if (FeatureDetect.ShaEnabled() && isAlgorithmSupported("SHA-1", digestProviderName)) { |
| 854 | + runMessageDigestBenchmark("SHA-1", digestProviderName); |
| 855 | + } |
| 856 | + if (FeatureDetect.Sha224Enabled() && isAlgorithmSupported("SHA-224", digestProviderName)) { |
| 857 | + runMessageDigestBenchmark("SHA-224", digestProviderName); |
| 858 | + } |
| 859 | + if (FeatureDetect.Sha256Enabled() && isAlgorithmSupported("SHA-256", digestProviderName)) { |
| 860 | + runMessageDigestBenchmark("SHA-256", digestProviderName); |
| 861 | + } |
| 862 | + if (FeatureDetect.Sha384Enabled() && isAlgorithmSupported("SHA-384", digestProviderName)) { |
| 863 | + runMessageDigestBenchmark("SHA-384", digestProviderName); |
| 864 | + } |
| 865 | + if (FeatureDetect.Sha512Enabled() && isAlgorithmSupported("SHA-512", digestProviderName)) { |
| 866 | + runMessageDigestBenchmark("SHA-512", digestProviderName); |
| 867 | + } |
| 868 | + if (FeatureDetect.Sha3Enabled() && isAlgorithmSupported("SHA3-224", digestProviderName)) { |
| 869 | + runMessageDigestBenchmark("SHA3-224", digestProviderName); |
| 870 | + } |
| 871 | + if (FeatureDetect.Sha3Enabled() && isAlgorithmSupported("SHA3-256", digestProviderName)) { |
| 872 | + runMessageDigestBenchmark("SHA3-256", digestProviderName); |
| 873 | + } |
| 874 | + if (FeatureDetect.Sha3Enabled() && isAlgorithmSupported("SHA3-384", digestProviderName)) { |
| 875 | + runMessageDigestBenchmark("SHA3-384", digestProviderName); |
| 876 | + } |
| 877 | + if (FeatureDetect.Sha3Enabled() && isAlgorithmSupported("SHA3-512", digestProviderName)) { |
| 878 | + runMessageDigestBenchmark("SHA3-512", digestProviderName); |
| 879 | + } |
| 880 | + } catch (Exception e) { |
| 881 | + System.out.println("Failed to benchmark MessageDigest with provider " + digestProviderName + ": " + e.getMessage()); |
| 882 | + } finally { |
| 883 | + Security.removeProvider(providers[i].getName()); |
| 884 | + if (!providerName.equals("wolfJCE") && !providerName.equals("BC")) { |
| 885 | + Provider sunProvider = Security.getProvider("SUN"); |
| 886 | + if (sunProvider != null) { |
| 887 | + Security.removeProvider(sunProvider.getName()); |
| 888 | + } |
| 889 | + } |
| 890 | + } |
| 891 | + } |
| 892 | + |
779 | 893 | System.out.println("-----------------------------------------------------------------------------\n"); |
780 | 894 |
|
781 | 895 | /* Print delta table */ |
|
0 commit comments