Skip to content

Commit 1d2c91b

Browse files
authored
Merge pull request #106 from jackctj117/wolfJSSE_Benchmark
JCE: Implements MessageDigest benchmarks
2 parents a47e24a + 2555020 commit 1d2c91b

File tree

1 file changed

+116
-2
lines changed

1 file changed

+116
-2
lines changed

examples/provider/CryptoBenchmark.java

Lines changed: 116 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
import java.security.spec.ECGenParameterSpec;
1919
import javax.crypto.SecretKeyFactory;
2020
import javax.crypto.spec.PBEKeySpec;
21+
import java.security.MessageDigest;
22+
import java.security.NoSuchAlgorithmException;
23+
import java.security.NoSuchProviderException;
2124
import java.util.*;
2225

2326
import com.wolfssl.provider.jce.WolfCryptProvider;
@@ -154,9 +157,9 @@ private static void printDeltaTable() {
154157
String displayProvider = provider;
155158
if (isRSAOperation) {
156159
if (operation.contains("key gen")) {
157-
displayProvider = "SunRsaSign"; // Key generation uses SunRsaSign
160+
displayProvider = "SunRsaSign"; /* Key generation uses SunRsaSign */
158161
} else {
159-
displayProvider = "SunJCE"; // Public/private operations use SunJCE
162+
displayProvider = "SunJCE"; /* Public/private operations use SunJCE */
160163
}
161164
}
162165

@@ -296,6 +299,15 @@ private static void runEncDecBenchmark(String algorithm, String mode, String pad
296299
results.add(new BenchmarkResult(providerName, cipherName + " dec", decryptThroughput));
297300
}
298301

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+
}
299311
/* Print RSA results in simpler format */
300312
private static void printKeyGenResults(int operations, double totalTime, String operation,
301313
String providerName, String mode) {
@@ -609,6 +621,35 @@ private static void runPBKDF2Benchmark(String algorithm, String providerName) th
609621
results.add(new BenchmarkResult(providerName, algorithm, throughput));
610622
}
611623

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+
612653
public static void main(String[] args) {
613654
try {
614655
/* Check if Bouncy Castle is available */
@@ -776,6 +817,79 @@ public static void main(String[] args) {
776817
}
777818
}
778819

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+
779893
System.out.println("-----------------------------------------------------------------------------\n");
780894

781895
/* Print delta table */

0 commit comments

Comments
 (0)