1111import java .security .spec .AlgorithmParameterSpec ;
1212import java .security .KeyPair ;
1313import 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 ;
1418import java .security .spec .ECGenParameterSpec ;
1519import 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