1212#include <stdlib.h>
1313#include <string.h>
1414#include <ctype.h>
15+ #include <time.h>
1516
1617#if 0
1718#include <stdbool.h>
@@ -608,6 +609,152 @@ PQC_sign_test(ICC_CTX* ctx, const char* algname, const char* hash, size_t msg_le
608609 return 0 ;
609610}
610611
612+ double PQC_speed_test_keygen (ICC_CTX * ctx , const char * algname , int num_iters , enum ed encdec )
613+ {
614+ int i , ret_val ;
615+ clock_t start , end ;
616+
617+ start = clock ();
618+ for (i = 0 ; i < num_iters ; i ++ )
619+ {
620+ pkbuf pk = {0 };
621+ skbuf sk = {0 };
622+ ret_val = SignatureEVP_gen (ctx , algname , & pk , & sk , encdec );
623+ if (ret_val != 0 )
624+ {
625+ printf ("SignatureEVP_gen failed at iteration %d with code %d\n" , i , ret_val );
626+ return 1 ;
627+ }
628+ /* Clean up allocated resources */
629+ if (pk .der .data )
630+ free (pk .der .data );
631+ if (sk .ctx )
632+ ICC_EVP_PKEY_CTX_free (ctx , sk .ctx );
633+ if (sk .key )
634+ ICC_EVP_PKEY_free (ctx , sk .key );
635+ if (sk .der .data )
636+ free (sk .der .data );
637+ }
638+ end = clock ();
639+
640+ return (double )(end - start ) / CLOCKS_PER_SEC / num_iters ;
641+ }
642+
643+ double PQC_speed_test_sign (ICC_CTX * ctx , const char * algname , const char * hash , size_t msg_len , int num_iters , enum ed encdec )
644+ {
645+ int i , ret_val ;
646+ clock_t start , end ;
647+ pkbuf pk = {0 };
648+ skbuf sk = {0 };
649+ sbuf signature = {0 };
650+ unsigned char * message = malloc (msg_len );
651+ if (!message )
652+ return 1 ;
653+ count_up (message , msg_len );
654+
655+ ret_val = SignatureEVP_gen (ctx , algname , & pk , & sk , encdec );
656+ if (ret_val != 0 )
657+ {
658+ printf ("SignatureEVP_gen failed at iteration %d with code %d\n" , i , ret_val );
659+ return 1 ;
660+ }
661+ /* get rid of gen context */
662+ if (sk .ctx )
663+ {
664+ ICC_EVP_PKEY_CTX_free (ctx , sk .ctx );
665+ sk .ctx = NULL ;
666+ }
667+ if (encdec & (raw | pkcs8 ))
668+ {
669+ /* delete ICC key and context so we use private encoding */
670+ if (sk .key )
671+ {
672+ ICC_EVP_PKEY_free (ctx , sk .key );
673+ sk .key = NULL ;
674+ }
675+ }
676+
677+ start = clock ();
678+ for (i = 0 ; i < num_iters ; i ++ )
679+ {
680+ if (signature .data )
681+ free (signature .data );
682+ ret_val = SignatureEVP_sign (ctx , & signature , & sk , message , msg_len , encdec , hash );
683+ if (ret_val != 0 )
684+ {
685+ printf ("SignatureEVP_sign failed at iteration %d with code %d\n" , i , ret_val );
686+ return 1 ;
687+ }
688+ }
689+ end = clock ();
690+ /* Clean up allocated resources */
691+ if (signature .data )
692+ free (signature .data );
693+ if (message )
694+ free (message );
695+ if (pk .der .data )
696+ free (pk .der .data );
697+ if (sk .der .data )
698+ free (sk .der .data );
699+
700+ return (double )(end - start ) / CLOCKS_PER_SEC / num_iters ;
701+ }
702+
703+ double PQC_speed_test_verify (ICC_CTX * ctx , const char * algname , const char * hash , size_t msg_len , int num_iters , enum ed encdec )
704+ {
705+ int i , ret_val ;
706+ clock_t start , end ;
707+ pkbuf pk = {0 };
708+ skbuf sk = {0 };
709+ sbuf signature = {0 };
710+ unsigned char * message = malloc (msg_len );
711+ if (!message )
712+ return 1 ;
713+ count_up (message , msg_len );
714+
715+ ret_val = SignatureEVP_gen (ctx , algname , & pk , & sk , encdec );
716+ if (ret_val != 0 )
717+ return 1 ;
718+
719+ ret_val = SignatureEVP_sign (ctx , & signature , & sk , message , msg_len , encdec , hash );
720+ if (ret_val != 0 )
721+ return 1 ;
722+
723+ start = clock ();
724+ for (i = 0 ; i < num_iters ; i ++ )
725+ {
726+ ret_val = SignatureEVP_verify (ctx , & pk , message , msg_len , & signature , encdec , hash );
727+ if (ret_val != 0 )
728+ {
729+ printf ("SignatureEVP_verify failed at iteration %d with code %d\n" , i , ret_val );
730+ return 1 ;
731+ }
732+ }
733+ end = clock ();
734+ /* Clean up allocated resources */
735+ free (signature .data );
736+ free (message );
737+ if (pk .der .data )
738+ free (pk .der .data );
739+ if (sk .ctx )
740+ ICC_EVP_PKEY_CTX_free (ctx , sk .ctx );
741+ if (sk .key )
742+ ICC_EVP_PKEY_free (ctx , sk .key );
743+ if (sk .der .data )
744+ free (sk .der .data );
745+
746+ return (double )(end - start ) / CLOCKS_PER_SEC / num_iters ;
747+ }
748+
749+ void print_speed_results (double keygen_t , double sign_t , double verify_t , int iters )
750+ {
751+ printf ("\n=== Timing results over %d iterations ===\n" , iters );
752+ printf ("Average keygen: %.6f sec\n" , keygen_t );
753+ printf ("Average sign : %.6f sec\n" , sign_t );
754+ printf ("Average verify: %.6f sec\n" , verify_t );
755+ printf ("========================================\n" );
756+ }
757+
611758static
612759char * algs [] =
613760{
@@ -677,6 +824,8 @@ int main(int argc, const char *argv[])
677824 size_t dataSize = 100 ;
678825 enum ed encdec = none ;
679826 int rv = 0 ;
827+ bool speed_test = false;
828+ int iterations = 100 ; /* default iterations for speed test */
680829
681830 /* Parse command-line arguments */
682831 if (argc > 1 ) {
@@ -745,6 +894,21 @@ int main(int argc, const char *argv[])
745894 i ++ ;
746895 algname = argv [i ];
747896 }
897+ else if (NULL != strstr (arg , "-speed" ))
898+ {
899+ speed_test = true;
900+ }
901+ else if (NULL != strstr (arg , "-iterations" ))
902+ {
903+ i ++ ;
904+ if (i < argc )
905+ iterations = atoi (argv [i ]);
906+ else
907+ {
908+ printf ("Missing value after -iterations\n" );
909+ return -1 ;
910+ }
911+ }
748912 else if (* arg == '-' ) {
749913 /* another setting - pass it on */
750914 i ++ ;
@@ -853,8 +1017,18 @@ int main(int argc, const char *argv[])
8531017 algname = to_SIGNATURE_ALGNAME (3 ); /* Dilithium 768 */
8541018 printf ("algname = %s\n" , algname ?algname :"NULL" );
8551019 }
856- /* Execute the signature test */
857- rv = PQC_sign_test (icc_ctx , algname , hash , dataSize , verbose , encdec );
1020+ /* Execute the signature test or speed test if the flag is set */
1021+ if (speed_test )
1022+ {
1023+ double t_k = PQC_speed_test_keygen (icc_ctx , algname , iterations , encdec );
1024+ double t_s = PQC_speed_test_sign (icc_ctx , algname , hash , dataSize , iterations , encdec );
1025+ double t_v = PQC_speed_test_verify (icc_ctx , algname , hash , dataSize , iterations , encdec );
1026+ print_speed_results (t_k , t_s , t_v , iterations );
1027+ }
1028+ else
1029+ {
1030+ rv = PQC_sign_test (icc_ctx , algname , hash , dataSize , verbose , encdec );
1031+ }
8581032 if (rv ) {
8591033 OpenSSLError (icc_ctx );
8601034 printf ("%s: Error %d, try -? to get help\n" , algname , rv );
@@ -865,4 +1039,4 @@ int main(int argc, const char *argv[])
8651039 }
8661040
8671041 return rv ;
868- }
1042+ }
0 commit comments