Skip to content

Commit b25eccc

Browse files
authored
Merge pull request #15 from declan-ebz/V_8.9.11
Speed testing capability added to sigtest.c
2 parents 82847dd + d5c071d commit b25eccc

File tree

1 file changed

+177
-3
lines changed

1 file changed

+177
-3
lines changed

iccpkg/pqc/sigtest.c

Lines changed: 177 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
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+
611758
static
612759
char* 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

Comments
 (0)