From a40de50be26788bf7c7e6cdbb674bf9189dd6f97 Mon Sep 17 00:00:00 2001 From: Lealem Amedie Date: Mon, 23 Oct 2023 16:35:57 -0600 Subject: [PATCH] Add ADVANCED_STATS in benchmark.c --- wolfcrypt/benchmark/benchmark.c | 5131 +++++++++++++++++++++++++++++-- 1 file changed, 4902 insertions(+), 229 deletions(-) diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index c069ee50f..2a0a1e2fc 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -40,6 +40,13 @@ * use microseconds as the unit of time: * BENCH_MICROSECOND * + * display mean, max, min and sd of operation durations: + * ADVANCED_STATS + * + * related to ADVANCED_STATS, use the below to specify how many sample + * observations are recorded to produce the stats above (defaults to 1000) + * MAX_SAMPLE_RUNS + * * Enable tracking of the stats into an allocated linked list: * (use -print to display results): * WC_BENCH_TRACK_STATS @@ -222,7 +229,23 @@ #endif /* default units per second. See WOLFSSL_BENCHMARK_FIXED_UNITS_* to change */ -#define WOLFSSL_FIXED_UNITS_PER_SEC "MB/s" /* may be re-set by fixed units */ +#define WOLFSSL_FIXED_UNIT "MB" /* may be re-set by fixed units */ + +#ifdef BENCH_MICROSECOND + #define WOLFSSL_FIXED_TIME_UNIT "μs" + #define WOLFSSL_BENCHMARK_FIXED_UNITS_KB +#else + #define WOLFSSL_FIXED_TIME_UNIT "s" +#endif + +#ifdef ADVANCED_STATS + #ifndef MAX_SAMPLE_RUNS + #define MAX_SAMPLE_RUNS 1000 + #endif + #define NEW_LINE "" +#else + #define NEW_LINE "\n" +#endif #ifdef WOLFSSL_NO_FLOAT_FMT #define FLT_FMT "%0ld,%09lu" @@ -985,7 +1008,7 @@ static int lng_index = 0; #ifndef NO_MAIN_DRIVER #ifndef MAIN_NO_ARGS -static const char* bench_Usage_msg1[][22] = { +static const char* bench_Usage_msg1[][25] = { /* 0 English */ { "-? Help, print this usage\n", " 0: English, 1: Japanese\n", @@ -1017,7 +1040,10 @@ static const char* bench_Usage_msg1[][22] = { " option, but must be used after that one.\n" ), "-threads Number of threads to run\n", - "-print Show benchmark stats summary\n" + "-print Show benchmark stats summary\n", + "-hash_input Input data to use for hash benchmarking\n", + "-cipher_input Input data to use for cipher benchmarking\n", + "-min_runs Specify minimum number of operation runs\n" }, #ifndef NO_MULTIBYTE_PRINT /* 1 Japanese */ @@ -1046,7 +1072,11 @@ static const char* bench_Usage_msg1[][22] = { " ブロックサイズをバイト単位で指定します。\n", "-blocks TBD.\n", "-threads 実行するスレッド数\n", - "-print ベンチマーク統計の要約を表示する\n" + "-print ベンチマーク統計の要約を表示する\n", + /* TODO: translate below */ + "-hash_input Input data to use for hash benchmarking\n", + "-cipher_input Input data to use for cipher benchmarking\n" + "-min_runs Specify minimum number of operation runs\n" }, #endif }; @@ -1054,12 +1084,13 @@ static const char* bench_Usage_msg1[][22] = { #endif static const char* bench_result_words1[][4] = { + { "took", #ifdef BENCH_MICROSECOND - { "took", "microseconds" , "Cycles per byte", NULL }, /* 0 English for - mircroseconds */ + "microseconds" #else - { "took", "seconds" , "Cycles per byte", NULL }, /* 0 English */ + "seconds" #endif + , "Cycles per byte", NULL }, /* 0 English */ #ifndef NO_MULTIBYTE_PRINT { "を" , "秒で処理", "1バイトあたりのサイクル数", NULL }, /* 1 Japanese */ #endif @@ -1082,6 +1113,15 @@ static const char* bench_desc_words[][15] = { #endif +#ifdef ADVANCED_STATS +static const char* bench_result_words3[][5] = { + /* 0 English */ + { "max duration", "min duration" , "mean duration", "sd", NULL }, + /* TODO: Add japenese version */ + { "max duration", "min duration" , "mean duration", "sd", NULL } +}; +#endif + #if defined(__GNUC__) && defined(__x86_64__) && !defined(NO_ASM) && !defined(WOLFSSL_SGX) #define HAVE_GET_CYCLES static WC_INLINE word64 get_intel_cycles(void); @@ -1090,15 +1130,15 @@ static const char* bench_desc_words[][15] = { #define BEGIN_INTEL_CYCLES total_cycles = get_intel_cycles(); #define END_INTEL_CYCLES total_cycles = get_intel_cycles() - total_cycles; /* s == size in bytes that 1 count represents, normally BENCH_SIZE */ - #define SHOW_INTEL_CYCLES(b, n, s) \ - (void)XSNPRINTF((b) + XSTRLEN(b), (n) - XSTRLEN(b), \ - " %s = " FLT_FMT_PREC2 "\n", \ - bench_result_words1[lng_index][2], \ - FLT_FMT_PREC2_ARGS(6, 2, count == 0 ? 0 : \ + #define SHOW_INTEL_CYCLES(b, n, s) \ + (void)XSNPRINTF((b) + XSTRLEN(b), (n) - XSTRLEN(b), \ + " %s = " FLT_FMT_PREC2 NEW_LINE, \ + bench_result_words1[lng_index][2], \ + FLT_FMT_PREC2_ARGS(6, 2, count == 0 ? 0 : \ (double)total_cycles / ((word64)count*(s)))) - #define SHOW_INTEL_CYCLES_CSV(b, n, s) \ - (void)XSNPRINTF((b) + XSTRLEN(b), (n) - XSTRLEN(b), FLT_FMT_PREC ",\n", \ - FLT_FMT_PREC_ARGS(6, count == 0 ? 0 : \ + #define SHOW_INTEL_CYCLES_CSV(b, n, s) \ + (void)XSNPRINTF((b) + XSTRLEN(b), (n) - XSTRLEN(b), FLT_FMT_PREC "," \ + NEW_LINE, FLT_FMT_PREC_ARGS(6, count == 0 ? 0 : \ (double)total_cycles / ((word64)count*(s)))) #elif defined(LINUX_CYCLE_COUNT) #include @@ -1125,12 +1165,12 @@ static const char* bench_desc_words[][15] = { /* s == size in bytes that 1 count represents, normally BENCH_SIZE */ #define SHOW_INTEL_CYCLES(b, n, s) \ (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), \ - " %s = " FLT_FMT_PREC2 "\n", \ + " %s = " FLT_FMT_PREC2 NEW_LINE, \ bench_result_words1[lng_index][2], \ FLT_FMT_PREC2_ARGS(6, 2, (double)total_cycles / (count*s))) #define SHOW_INTEL_CYCLES_CSV(b, n, s) \ - (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), FLT_FMT_PREC ",\n", \ - FLT_FMT_PREC_ARGS(6, (double)total_cycles / (count*s))) + (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), FLT_FMT_PREC "," \ + NEW_LINE, FLT_FMT_PREC_ARGS(6, (double)total_cycles / (count*s))) #elif defined(SYNERGY_CYCLE_COUNT) #include "hal_data.h" @@ -1144,7 +1184,7 @@ static const char* bench_desc_words[][15] = { /* s == size in bytes that 1 count represents, normally BENCH_SIZE */ #define SHOW_INTEL_CYCLES(b, n, s) \ (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), \ - " %s = " FLT_FMT_PREC2 "\n", \ + " %s = " FLT_FMT_PREC2 NEW_LINE, \ bench_result_words1[lng_index][2], \ FLT_FMT_PREC2_ARGS(6, 2, (double)total_cycles / (count*s))) #define SHOW_INTEL_CYCLES_CSV(b, n, s) \ @@ -1249,8 +1289,13 @@ static const char* bench_desc_words[][15] = { #define INIT_CYCLE_COUNTER #define BEGIN_INTEL_CYCLES #define END_INTEL_CYCLES - #define SHOW_INTEL_CYCLES(b, n, s) b[XSTRLEN(b)] = '\n' - #define SHOW_INTEL_CYCLES_CSV(b, n, s) b[XSTRLEN(b)] = '\n' + #ifdef ADVANCED_STATS + #define SHOW_INTEL_CYCLES(b, n, s) + #define SHOW_INTEL_CYCLES_CSV(b, n, s) + #else + #define SHOW_INTEL_CYCLES(b, n, s) b[XSTRLEN(b)] = '\n' + #define SHOW_INTEL_CYCLES_CSV(b, n, s) b[XSTRLEN(b)] = '\n' + #endif #endif /* determine benchmark buffer to use (if NO_FILESYSTEM) */ @@ -1589,6 +1634,10 @@ static word32 bench_size = BENCH_SIZE; static int base2 = 1; static int digest_stream = 1; +#ifdef ADVANCED_STATS +static int minimum_runs = 0; +#endif + #ifndef NO_RSA /* Don't measure RSA sign/verify by default */ static int rsa_sign_verify = 0; @@ -1615,6 +1664,8 @@ static int csv_format = 0; /* globals for cipher tests */ static THREAD_LS_T byte* bench_plain = NULL; static THREAD_LS_T byte* bench_cipher = NULL; +static THREAD_LS_T char* hash_input = NULL; +static THREAD_LS_T char* cipher_input = NULL; static const XGEN_ALIGN byte bench_key_buf[] = { @@ -1669,6 +1720,9 @@ static void benchmark_static_init(int force) #endif base2 = 1; digest_stream = 1; + #ifdef ADVANCED_STATS + minimum_runs = 0; + #endif bench_all = 1; bench_cipher_algs = 0; @@ -1783,24 +1837,33 @@ typedef enum bench_stat_type { void bench_stats_print(void) { bench_stats_t* bstat; + int digits; #ifdef WC_ENABLE_BENCH_THREADING /* protect bench_stats_head and bench_stats_tail access */ THREAD_CHECK_RET(pthread_mutex_lock(&bench_lock)); #endif + #ifdef BENCH_MICROSECOND + digits = 5; + #else + digits = 3; + #endif + for (bstat = bench_stats_head; bstat != NULL; ) { if (bstat->type == BENCH_STAT_SYM) { - printf("%-16s%s " FLT_FMT_PREC2 " %s/s\n", bstat->desc, + printf("%-16s%s " FLT_FMT_PREC2 " %s/" WOLFSSL_FIXED_TIME_UNIT + "\n", bstat->desc, BENCH_DEVID_GET_NAME(bstat->useDeviceID), - FLT_FMT_PREC2_ARGS(8, 3, bstat->perfsec), + FLT_FMT_PREC2_ARGS(8, digits, bstat->perfsec), base2 ? "MB" : "mB"); } else { - printf("%-5s %4d %-9s %s " FLT_FMT_PREC " ops/sec\n", + printf("%-5s %4d %-9s %s " FLT_FMT_PREC " ops/" + WOLFSSL_FIXED_TIME_UNIT "ec\n", bstat->algo, bstat->strength, bstat->desc, BENCH_DEVID_GET_NAME(bstat->useDeviceID), - FLT_FMT_PREC_ARGS(3, bstat->perfsec)); + FLT_FMT_PREC_ARGS(digits, bstat->perfsec)); } bstat = bstat->next; @@ -1861,25 +1924,25 @@ static const char* get_blocktype(double* blocks) #if ( defined(WOLFSSL_BENCHMARK_FIXED_UNITS_G) || \ defined(WOLFSSL_BENCHMARK_FIXED_UNITS_GB)) - #undef WOLFSSL_FIXED_UNITS_PER_SEC - #define WOLFSSL_FIXED_UNITS_PER_SEC "GB/s" + #undef WOLFSSL_FIXED_UNIT + #define WOLFSSL_FIXED_UNIT "GB" *blocks /= (1024UL * 1024UL * 1024UL); rt = "GiB"; #elif (defined(WOLFSSL_BENCHMARK_FIXED_UNITS_M) || \ defined(WOLFSSL_BENCHMARK_FIXED_UNITS_MB)) - #undef WOLFSSL_FIXED_UNITS_PER_SEC - #define WOLFSSL_FIXED_UNITS_PER_SEC "MB/s" + #undef WOLFSSL_FIXED_UNIT + #define WOLFSSL_FIXED_UNIT "MB" *blocks /= (1024UL * 1024UL); rt = "MiB"; #elif (defined(WOLFSSL_BENCHMARK_FIXED_UNITS_K) || \ defined(WOLFSSL_BENCHMARK_FIXED_UNITS_KB)) - #undef WOLFSSL_FIXED_UNITS_PER_SEC - #define WOLFSSL_FIXED_UNITS_PER_SEC "KB/s" + #undef WOLFSSL_FIXED_UNIT + #define WOLFSSL_FIXED_UNIT "KB" *blocks /= 1024; rt = "KiB"; #elif defined (WOLFSSL_BENCHMARK_FIXED_UNITS_B) - #undef WOLFSSL_FIXED_UNITS_PER_SEC - #define WOLFSSL_FIXED_UNITS_PER_SEC "bytes/s" + #undef WOLFSSL_FIXED_UNIT + #define WOLFSSL_FIXED_UNIT "bytes" (void)(*blocks); /* no adjustment, just appease compiler for not used */ rt = "bytes"; #else @@ -1940,6 +2003,69 @@ static const char* get_blocktype_base10(double* blocks) return rt; } +#ifdef ADVANCED_STATS +static double wc_sqroot(double in) +{ + /* do 32 iterations for the sqroot */ + int iter = 32; + double root = in/3.0; + + if (in < 0.0) + return -1; + + for (int i=0; i < iter; i++) + root = (root + in / root) / 2.0; + + return root; +} + +static void bench_advanced_stats(double deltas[], double max, double min, + double sum, int runs) +{ + double mean = 0; + double sd = 0; + char msg[WC_BENCH_MAX_LINE_LEN]; + const char** word = bench_result_words3[lng_index]; + + XMEMSET(msg, 0, sizeof(msg)); + + mean = sum / runs; + + /* Calculating standard deviation */ + for (int i = 0; i < runs; i++) { + sd += ((deltas[i] - mean) * (deltas[i] - mean)); + } + sd = sd / (runs - 1); + sd = wc_sqroot(sd); + + if (csv_format == 1) { + (void)XSNPRINTF(msg, sizeof(msg), FLT_FMT_PREC2 "," + FLT_FMT_PREC2 "," FLT_FMT_PREC2 "," FLT_FMT_PREC2 ",\n", + FLT_FMT_PREC2_ARGS(3, 3, max), + FLT_FMT_PREC2_ARGS(3, 3, min), + FLT_FMT_PREC2_ARGS(3, 3, mean), + FLT_FMT_PREC2_ARGS(3, 3, sd)); + } + else{ + (void)XSNPRINTF(msg, sizeof(msg), ", %s " FLT_FMT_PREC2 " " + WOLFSSL_FIXED_TIME_UNIT ", %s " FLT_FMT_PREC2 " " + WOLFSSL_FIXED_TIME_UNIT ", %s " FLT_FMT_PREC2 " " + WOLFSSL_FIXED_TIME_UNIT ", %s " FLT_FMT_PREC2 " " + WOLFSSL_FIXED_TIME_UNIT "\n", + word[0], FLT_FMT_PREC2_ARGS(3, 3, max), + word[1], FLT_FMT_PREC2_ARGS(3, 3, min), + word[2], FLT_FMT_PREC2_ARGS(3, 3, mean), + word[3], FLT_FMT_PREC2_ARGS(3, 3, sd)); + } + printf("%s", msg); + +#ifndef WOLFSSL_SGX + XFFLUSH(stdout); +#endif + +} +#endif + /* countSz is number of bytes that 1 count represents. Normally bench_size, * except for AES direct that operates on AES_BLOCK_SIZE blocks */ static void bench_stats_sym_finish(const char* desc, int useDeviceID, @@ -1948,11 +2074,9 @@ static void bench_stats_sym_finish(const char* desc, int useDeviceID, { double total, persec = 0, blocks = (double)count; const char* blockType; - const char* timeUnit; char msg[WC_BENCH_MAX_LINE_LEN]; const char** word = bench_result_words1[lng_index]; static int sym_header_printed = 0; - int timeDigits; XMEMSET(msg, 0, sizeof(msg)); @@ -1981,11 +2105,15 @@ static void bench_stats_sym_finish(const char* desc, int useDeviceID, #ifdef GENERATE_MACHINE_PARSEABLE_REPORT /* machine parseable CSV */ #ifdef HAVE_GET_CYCLES - printf("%s", "\"sym\",Algorithm,HW/SW,bytes_total,seconds_total," - WOLFSSL_FIXED_UNITS_PER_SEC ",cycles_total,Cycles per byte,\n"); + printf("%s", "\"sym\",Algorithm,HW/SW,bytes_total," + WOLFSSL_FIXED_TIME_UNIT "econds_total," + WOLFSSL_FIXED_UNIT "/" WOLFSSL_FIXED_TIME_UNIT + ",cycles_total,Cycles per byte,"); #else - printf("%s", "\"sym\",Algorithm,HW/SW,bytes_total,seconds_total," - WOLFSSL_FIXED_UNITS_PER_SEC ",cycles_total,\n"); + printf("%s", "\"sym\",Algorithm,HW/SW,bytes_total," + WOLFSSL_FIXED_TIME_UNIT "econds_total," + WOLFSSL_FIXED_UNIT "/" WOLFSSL_FIXED_TIME_UNIT + ",cycles_total,"); #endif #else /* normal CSV */ @@ -1998,26 +2126,24 @@ static void bench_stats_sym_finish(const char* desc, int useDeviceID, printf("\n\nSymmetric Ciphers:\n\n"); printf("Algorithm," BENCH_DEVID_COLUMN_HEADER - WOLFSSL_FIXED_UNITS_PER_SEC ",Cycles per byte,\n"); + WOLFSSL_FIXED_UNIT "/" WOLFSSL_FIXED_TIME_UNIT + ",Cycles per byte,"); #else printf("\n\nSymmetric Ciphers:\n\n"); printf("Algorithm," BENCH_DEVID_COLUMN_HEADER - WOLFSSL_FIXED_UNITS_PER_SEC ", \n"); + WOLFSSL_FIXED_UNIT "/" WOLFSSL_FIXED_TIME_UNIT ","); #endif #endif + #ifdef ADVANCED_STATS + printf("max duration,min duration,mean duration,sd,\n"); + #else + printf("\n"); + #endif sym_header_printed = 1; } } -#ifdef BENCH_MICROSECOND - timeUnit = "μs"; - timeDigits = 8; -#else - timeUnit = "s"; - timeDigits = 3; -#endif - /* determine if we have fixed units, or auto-scale bits or bytes for units. * note that the blockType text is assigned AND the blocks param is scaled. */ @@ -2095,33 +2221,31 @@ static void bench_stats_sym_finish(const char* desc, int useDeviceID, else { #ifdef GENERATE_MACHINE_PARSEABLE_REPORT #ifdef HAVE_GET_CYCLES + (void)XSNPRINTF(msg, sizeof(msg), + "%-24s%s " FLT_FMT_PREC2 " %s %s " FLT_FMT_PREC2 " %s, " + FLT_FMT_PREC2 " %s/" WOLFSSL_FIXED_TIME_UNIT ", %lu cycles,", + desc, BENCH_DEVID_GET_NAME(useDeviceID), + FLT_FMT_PREC2_ARGS(5, 0, blocks), blockType, + word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], + FLT_FMT_PREC2_ARGS(8, 3, persec), blockType, + (unsigned long) total_cycles); + #else (void)XSNPRINTF(msg, sizeof(msg), "%-24s%s " FLT_FMT_PREC2 " %s %s " FLT_FMT_PREC2 " %s, " - FLT_FMT_PREC2 " %s/%s, %lu cycles,", + FLT_FMT_PREC2 " %s/" WOLFSSL_FIXED_TIME_UNIT ",", desc, BENCH_DEVID_GET_NAME(useDeviceID), FLT_FMT_PREC2_ARGS(5, 0, blocks), blockType, word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], - FLT_FMT_PREC2_ARGS(8, timeDigits, persec), blockType, timeUnit - (unsigned long) total_cycles); - #else - (void)XSNPRINTF(msg, sizeof(msg), - "%-24s%s " FLT_FMT_PREC2 " %s %s " FLT_FMT_PREC2 " %s, " - FLT_FMT_PREC2 " %s/%s,", - desc, BENCH_DEVID_GET_NAME(useDeviceID), - FLT_FMT_PREC2_ARGS(5, 0, blocks), blockType, - word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], - FLT_FMT_PREC2_ARGS(8, timeDigits, persec), blockType, - timeUnit); - #endif /* HAVE_GET_CYCLES */ + FLT_FMT_PREC2_ARGS(8, 3, persec), blockType); + #endif /* HAVE_GET_CYCLES */ #else (void)XSNPRINTF(msg, sizeof(msg), - "%-24s%s " FLT_FMT_PREC2 " %s %s " FLT_FMT_PREC2 " %s, " - FLT_FMT_PREC2 " %s/%s", - desc, BENCH_DEVID_GET_NAME(useDeviceID), - FLT_FMT_PREC2_ARGS(5, 0, blocks), blockType, - word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], - FLT_FMT_PREC2_ARGS(8, timeDigits, persec), blockType, - timeUnit); + "%-24s%s " FLT_FMT_PREC2 " %s %s " FLT_FMT_PREC2 " %s, " + FLT_FMT_PREC2 " %s/" WOLFSSL_FIXED_TIME_UNIT, + desc, BENCH_DEVID_GET_NAME(useDeviceID), + FLT_FMT_PREC2_ARGS(5, 0, blocks), blockType, + word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], + FLT_FMT_PREC2_ARGS(8, 3, persec), blockType); #endif #ifdef WOLFSSL_ESPIDF @@ -2175,6 +2299,7 @@ static void bench_stats_asym_finish_ex(const char* algo, int strength, #endif char msg[256]; static int asym_header_printed = 0; + int digits; XMEMSET(msg, 0, sizeof(msg)); @@ -2215,6 +2340,12 @@ static void bench_stats_asym_finish_ex(const char* algo, int strength, #endif +#ifdef BENCH_MICROSECOND + digits = 5; +#else + digits = 3; +#endif + SLEEP_ON_ERROR(ret); /* format and print to terminal */ if (csv_format == 1) { @@ -2222,44 +2353,51 @@ static void bench_stats_asym_finish_ex(const char* algo, int strength, if (asym_header_printed == 0) { #ifdef GENERATE_MACHINE_PARSEABLE_REPORT #ifdef HAVE_GET_CYCLES - printf("%s", "\"asym\",Algorithm,key size,operation,avg ms,ops/sec," - "ops,secs,cycles,cycles/op\n"); + printf("%s", "\"asym\",Algorithm,key size,operation,avg ms,ops/" + WOLFSSL_FIXED_TIME_UNIT "ec,ops," WOLFSSL_FIXED_TIME_UNIT + "ecs,cycles,cycles/op"); #else - printf("%s", "\"asym\",Algorithm,key size,operation,avg ms,ops/sec," - "ops,secs\n"); + printf("%s", "\"asym\",Algorithm,key size,operation,avg ms,ops/" + WOLFSSL_FIXED_TIME_UNIT "ec,ops," WOLFSSL_FIXED_TIME_UNIT + "ecs"); #endif #else printf("\n%sAsymmetric Ciphers:\n\n", info_prefix); - printf("%sAlgorithm,key size,operation,avg ms,ops/sec,\n", - info_prefix); + printf("%sAlgorithm,key size,operation,avg ms,ops/" + WOLFSSL_FIXED_TIME_UNIT "ec,", info_prefix); #endif + #ifdef ADVANCED_STATS + printf("max duration,min duration,mean duration,sd,\n"); + #else + printf("\n"); + #endif asym_header_printed = 1; } #ifdef GENERATE_MACHINE_PARSEABLE_REPORT #ifdef HAVE_GET_CYCLES (void)XSNPRINTF(msg, sizeof(msg), "asym,%s,%d,%s%s," FLT_FMT_PREC "," FLT_FMT_PREC ",%d," - FLT_FMT ",%lu," FLT_FMT_PREC "\n", + FLT_FMT ",%lu," FLT_FMT_PREC NEW_LINE, algo, strength, desc, desc_extra, FLT_FMT_PREC_ARGS(3, milliEach), - FLT_FMT_PREC_ARGS(3, opsSec), + FLT_FMT_PREC_ARGS(digits, opsSec), count, FLT_FMT_ARGS(total), (unsigned long)total_cycles, FLT_FMT_PREC_ARGS(6, (double)total_cycles / (double)count)); #else (void)XSNPRINTF(msg, sizeof(msg), "asym,%s,%d,%s%s," FLT_FMT_PREC "," FLT_FMT_PREC ",%d," - FLT_FMT "\n", + FLT_FMT NEW_LINE, algo, strength, desc, desc_extra, FLT_FMT_PREC_ARGS(3, milliEach), - FLT_FMT_PREC_ARGS(3, opsSec), + FLT_FMT_PREC_ARGS(digits, opsSec), count, FLT_FMT_ARGS(total)); #endif #else (void)XSNPRINTF(msg, sizeof(msg), "%s,%d,%s%s," FLT_FMT_PREC "," - FLT_FMT_PREC ",\n", algo, strength, desc, desc_extra, - FLT_FMT_PREC_ARGS(3, milliEach), - FLT_FMT_PREC_ARGS(3, opsSec)); + FLT_FMT_PREC "," NEW_LINE, algo, strength, desc, + desc_extra, FLT_FMT_PREC_ARGS(3, milliEach), + FLT_FMT_PREC_ARGS(digits, opsSec)); #endif } /* if (csv_format == 1) */ @@ -2268,32 +2406,32 @@ static void bench_stats_asym_finish_ex(const char* algo, int strength, #ifdef HAVE_GET_CYCLES (void)XSNPRINTF(msg, sizeof(msg), "%-6s %5d %8s%-2s %s %6d %s " FLT_FMT_PREC2 " %s, %s " - FLT_FMT_PREC2 " ms, " FLT_FMT_PREC " %s, %lu cycles\n", - algo, strength, desc, desc_extra, + FLT_FMT_PREC2 " ms, " FLT_FMT_PREC " %s, %lu cycles" + NEW_LINE, algo, strength, desc, desc_extra, BENCH_DEVID_GET_NAME(useDeviceID), count, word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], word[2], FLT_FMT_PREC2_ARGS(5, 3, milliEach), - FLT_FMT_PREC_ARGS(3, opsSec), word[3], + FLT_FMT_PREC_ARGS(digits, opsSec), word[3], (unsigned long)total_cycles); #else (void)XSNPRINTF(msg, sizeof(msg), "%-6s %5d %8s%-2s %s %6d %s " FLT_FMT_PREC2 " %s, %s " - FLT_FMT_PREC2 " ms, " FLT_FMT_PREC " %s\n", + FLT_FMT_PREC2 " ms, " FLT_FMT_PREC " %s" NEW_LINE, algo, strength, desc, desc_extra, BENCH_DEVID_GET_NAME(useDeviceID), count, word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], word[2], FLT_FMT_PREC2_ARGS(5, 3, milliEach), - FLT_FMT_PREC_ARGS(3, opsSec), word[3]); + FLT_FMT_PREC_ARGS(digits, opsSec), word[3]); #endif /* HAVE_GET_CYCLES */ #else (void)XSNPRINTF(msg, sizeof(msg), "%-6s %5d %8s%-2s %s %6d %s " FLT_FMT_PREC2 " %s, %s " - FLT_FMT_PREC2 " ms, " FLT_FMT_PREC " %s\n", + FLT_FMT_PREC2 " ms, " FLT_FMT_PREC " %s" NEW_LINE, algo, strength, desc, desc_extra, BENCH_DEVID_GET_NAME(useDeviceID), count, word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], word[2], FLT_FMT_PREC2_ARGS(5, 3, milliEach), - FLT_FMT_PREC_ARGS(3, opsSec), word[3]); + FLT_FMT_PREC_ARGS(digits, opsSec), word[3]); #endif } printf("%s", msg); @@ -2352,7 +2490,7 @@ static WC_INLINE void bench_stats_free(void) static void* benchmarks_do(void* args) { - int bench_buf_size; + long bench_buf_size; #ifdef WOLFSSL_ASYNC_CRYPT #ifndef WC_NO_ASYNC_THREADING @@ -2436,9 +2574,74 @@ static void* benchmarks_do(void* args) printf("%sBenchmark block buffer alloc failed!\n", err_prefix); goto exit; } - XMEMSET(bench_plain, 0, (size_t)bench_buf_size); - XMEMSET(bench_cipher, 0, (size_t)bench_buf_size); + if (hash_input) { + XFILE file; + file = XFOPEN(hash_input, "rb"); + if (file == XBADFILE) + goto exit; + + if (XFSEEK(file, 0, XSEEK_END) != 0) { + XFCLOSE(file); + goto exit; + } + + bench_buf_size = XFTELL(file); + if(XFSEEK(file, 0, XSEEK_SET) != 0) { + XFCLOSE(file); + goto exit; + } + + XFREE(bench_plain, HEAP_HINT, DYNAMIC_TYPE_WOLF_BIGINT); + + bench_plain = (byte*)XMALLOC((size_t)bench_buf_size, + HEAP_HINT, DYNAMIC_TYPE_WOLF_BIGINT); + + if (bench_plain == NULL) + goto exit; + + if ((size_t)XFREAD(bench_plain, 1, bench_buf_size, file) != (size_t)bench_buf_size) { + XFCLOSE(file); + goto exit; + } + } + else { + XMEMSET(bench_plain, 0, (size_t)bench_buf_size); + } + + if (cipher_input) { + XFILE file; + file = XFOPEN(cipher_input, "rb"); + if (file == XBADFILE) + goto exit; + + if (XFSEEK(file, 0, XSEEK_END) != 0) { + XFCLOSE(file); + goto exit; + } + + bench_buf_size = XFTELL(file); + if(XFSEEK(file, 0, XSEEK_SET) != 0) { + XFCLOSE(file); + goto exit; + } + + XFREE(bench_cipher, HEAP_HINT, DYNAMIC_TYPE_WOLF_BIGINT); + + bench_cipher = (byte*)XMALLOC((size_t)bench_buf_size, + HEAP_HINT, DYNAMIC_TYPE_WOLF_BIGINT); + + if (bench_cipher == NULL) + goto exit; + + if ((size_t)XFREAD(bench_cipher, 1, bench_buf_size, file) != (size_t)bench_buf_size) { + XFCLOSE(file); + goto exit; + } + } + else { + XMEMSET(bench_cipher, 0, (size_t)bench_buf_size); + } #if defined(WOLFSSL_ASYNC_CRYPT) || defined(HAVE_INTEL_QA_SYNC) bench_key = (byte*)XMALLOC(sizeof(bench_key_buf), HEAP_HINT, DYNAMIC_TYPE_WOLF_BIGINT); @@ -3389,6 +3592,11 @@ void bench_rng(void) double start; long pos, len, remain; WC_RNG myrng; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif #ifndef HAVE_FIPS ret = wc_InitRng_ex(&myrng, HEAP_HINT, devId); @@ -3400,6 +3608,10 @@ void bench_rng(void) return; } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + bench_stats_start(&count, &start); do { for (i = 0; i < numBlocks; i++) { @@ -3418,11 +3630,40 @@ void bench_rng(void) remain -= len; pos += len; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); exit_rng: bench_stats_sym_finish("RNG", 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif wc_FreeRng(&myrng); } @@ -3440,9 +3681,17 @@ static void bench_aescbc_internal(int useDeviceID, int ret = 0, i, count = 0, times, pending = 0; Aes enc[BENCH_MAX_PENDING]; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif /* clear for done cleanup */ XMEMSET(enc, 0, sizeof(enc)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { @@ -3459,6 +3708,10 @@ static void bench_aescbc_internal(int useDeviceID, } } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks || pending > 0; ) { @@ -3477,13 +3730,42 @@ static void bench_aescbc_internal(int useDeviceID, } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); exit_aes_enc: bench_stats_sym_finish(encLabel, useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif if (ret < 0) { goto exit; @@ -3499,6 +3781,13 @@ exit_aes_enc: } } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif + bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks || pending > 0; ) { @@ -3517,12 +3806,42 @@ exit_aes_enc: } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit_aes_dec: bench_stats_sym_finish(decLabel, useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif #endif /* HAVE_AES_DECRYPT */ @@ -3574,6 +3893,11 @@ static void bench_aesgcm_internal(int useDeviceID, Aes dec[BENCH_MAX_PENDING+1]; #endif double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif WC_DECLARE_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT); WC_DECLARE_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT); @@ -3586,6 +3910,9 @@ static void bench_aesgcm_internal(int useDeviceID, /* clear for done cleanup */ XMEMSET(enc, 0, sizeof(enc)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif #ifdef WOLFSSL_ASYNC_CRYPT if (bench_additional) #endif @@ -3610,6 +3937,10 @@ static void bench_aesgcm_internal(int useDeviceID, } } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + /* GCM uses same routine in backend for both encrypt and decrypt */ bench_stats_start(&count, &start); do { @@ -3630,16 +3961,53 @@ static void bench_aesgcm_internal(int useDeviceID, } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit_aes_gcm: bench_stats_sym_finish(encLabel, useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif #ifdef HAVE_AES_DECRYPT XMEMSET(dec, 0, sizeof(dec)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif + /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { if ((ret = wc_AesInit(&dec[i], HEAP_HINT, @@ -3674,13 +4042,42 @@ exit_aes_gcm: } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); exit_aes_gcm_dec: bench_stats_sym_finish(decLabel, useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif #endif /* HAVE_AES_DECRYPT */ (void)decLabel; @@ -3714,6 +4111,11 @@ static void bench_aesgcm_stream_internal(int useDeviceID, Aes dec[BENCH_MAX_PENDING]; #endif double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif WC_DECLARE_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT); WC_DECLARE_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT); @@ -3779,12 +4181,42 @@ static void bench_aesgcm_stream_internal(int useDeviceID, } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit_aes_gcm: bench_stats_sym_finish(encLabel, useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif #ifdef HAVE_AES_DECRYPT /* init keys */ @@ -3802,6 +4234,13 @@ exit_aes_gcm: } } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif + bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks || pending > 0; ) { @@ -3827,13 +4266,42 @@ exit_aes_gcm: } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); exit_aes_gcm_dec: bench_stats_sym_finish(decLabel, useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif #endif /* HAVE_AES_DECRYPT */ (void)decLabel; @@ -3914,6 +4382,11 @@ void bench_gmac(int useDeviceID) Gmac gmac; double start; byte tag[AES_AUTH_TAG_SZ]; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif /* determine GCM GHASH method */ #ifdef GCM_SMALL @@ -3928,6 +4401,10 @@ void bench_gmac(int useDeviceID) const char* gmacStr = "GMAC Default"; #endif +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + /* init keys */ XMEMSET(bench_plain, 0, bench_size); XMEMSET(tag, 0, sizeof(tag)); @@ -3945,10 +4422,41 @@ void bench_gmac(int useDeviceID) tag, sizeof(tag)); count++; - } while (bench_stats_check(start)); + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + wc_AesFree((Aes*)&gmac); bench_stats_sym_finish(gmacStr, 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif + } #endif /* HAVE_AESGCM */ @@ -3962,6 +4470,11 @@ static void bench_aesecb_internal(int useDeviceID, int ret = 0, i, count = 0, times, pending = 0; Aes enc[BENCH_MAX_PENDING]; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif #ifdef HAVE_FIPS static const int benchSz = AES_BLOCK_SIZE; #else @@ -3970,6 +4483,9 @@ static void bench_aesecb_internal(int useDeviceID, /* clear for done cleanup */ XMEMSET(enc, 0, sizeof(enc)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { @@ -4011,12 +4527,42 @@ static void bench_aesecb_internal(int useDeviceID, } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit_aes_enc: bench_stats_sym_finish(encLabel, useDeviceID, count, benchSz, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif #ifdef HAVE_AES_DECRYPT /* init keys */ @@ -4028,6 +4574,13 @@ exit_aes_enc: } } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif + bench_stats_start(&count, &start); do { int outer_loop_limit = (10 * ((int)bench_size / benchSz)) + 1; @@ -4051,12 +4604,42 @@ exit_aes_enc: } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit_aes_dec: bench_stats_sym_finish(decLabel, useDeviceID, count, benchSz, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif #endif /* HAVE_AES_DECRYPT */ @@ -4091,8 +4674,17 @@ static void bench_aescfb_internal(const byte* key, { Aes enc; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, ret, count; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + ret = wc_AesSetKey(&enc, key, keySz, iv, AES_ENCRYPTION); if (ret != 0) { printf("AesSetKey failed, ret = %d\n", ret); @@ -4107,10 +4699,40 @@ static void bench_aescfb_internal(const byte* key, printf("wc_AesCfbEncrypt failed, ret = %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(label, 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } void bench_aescfb(void) @@ -4135,8 +4757,17 @@ static void bench_aesofb_internal(const byte* key, { Aes enc; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, ret, count; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + ret = wc_AesInit(&enc, NULL, INVALID_DEVID); if (ret != 0) { printf("AesInit failed, ret = %d\n", ret); @@ -4157,10 +4788,40 @@ static void bench_aesofb_internal(const byte* key, printf("wc_AesCfbEncrypt failed, ret = %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(label, 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif wc_AesFree(&enc); } @@ -4185,8 +4846,17 @@ void bench_aesxts(void) { XtsAes aes; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count, ret; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + static unsigned char k1[] = { 0xa1, 0xb9, 0x0c, 0xba, 0x3f, 0x06, 0xac, 0x35, 0x3b, 0x2c, 0x34, 0x38, 0x76, 0x08, 0x17, 0x62, @@ -4214,10 +4884,40 @@ void bench_aesxts(void) printf("wc_AesXtsEncrypt failed, ret = %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("AES-XTS-enc", 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif wc_AesXtsFree(&aes); /* decryption benchmark */ @@ -4228,6 +4928,13 @@ void bench_aesxts(void) return; } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif + bench_stats_start(&count, &start); do { for (i = 0; i < numBlocks; i++) { @@ -4236,10 +4943,40 @@ void bench_aesxts(void) printf("wc_AesXtsDecrypt failed, ret = %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("AES-XTS-dec", 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif wc_AesXtsFree(&aes); } #endif /* WOLFSSL_AES_XTS */ @@ -4252,8 +4989,17 @@ static void bench_aesctr_internal(const byte* key, word32 keySz, { Aes enc; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count, ret = 0; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + if ((ret = wc_AesInit(&enc, HEAP_HINT, useDeviceID ? devId : INVALID_DEVID)) != 0) { printf("wc_AesInit failed, ret = %d\n", ret); @@ -4272,10 +5018,40 @@ static void bench_aesctr_internal(const byte* key, word32 keySz, printf("wc_AesCtrEncrypt failed, ret = %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(label, useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif wc_AesFree(&enc); } @@ -4300,6 +5076,11 @@ void bench_aesccm(int useDeviceID) { Aes enc; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret, i, count; WC_DECLARE_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT); @@ -4314,6 +5095,9 @@ void bench_aesccm(int useDeviceID) XMEMSET(bench_tag, 0, AES_AUTH_TAG_SZ); XMEMSET(bench_additional, 0, AES_AUTH_ADD_SZ); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if ((ret = wc_AesInit(&enc, HEAP_HINT, useDeviceID ? devId : INVALID_DEVID)) != 0) { @@ -4332,27 +5116,94 @@ void bench_aesccm(int useDeviceID) ret |= wc_AesCcmEncrypt(&enc, bench_cipher, bench_plain, bench_size, bench_iv, 12, bench_tag, AES_AUTH_TAG_SZ, bench_additional, 0); + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(AES_AAD_STRING("AES-CCM-enc"), useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif if (ret != 0) { printf("wc_AesCcmEncrypt failed, ret = %d\n", ret); goto exit; } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif + bench_stats_start(&count, &start); do { for (i = 0; i < numBlocks; i++) { ret |= wc_AesCcmDecrypt(&enc, bench_plain, bench_cipher, bench_size, bench_iv, 12, bench_tag, AES_AUTH_TAG_SZ, bench_additional, 0); + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(AES_AAD_STRING("AES-CCM-dec"), useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif if (ret != 0) { printf("wc_AesCcmEncrypt failed, ret = %d\n", ret); goto exit; @@ -4377,6 +5228,13 @@ static void bench_aessiv_internal(const byte* key, word32 keySz, const char* byte siv[AES_BLOCK_SIZE]; int count = 0; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; + + XMEMSET(deltas, 0, sizeof(deltas)); +#endif bench_stats_start(&count, &start); do { @@ -4388,10 +5246,45 @@ static void bench_aessiv_internal(const byte* key, word32 keySz, const char* printf("wc_AesSivEncrypt failed (%d)\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(encLabel, 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif bench_stats_start(&count, &start); do { @@ -4403,10 +5296,40 @@ static void bench_aessiv_internal(const byte* key, word32 keySz, const char* printf("wc_AesSivDecrypt failed (%d)\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(decLabel, 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } void bench_aessiv(void) @@ -4426,6 +5349,13 @@ void bench_poly1305(void) byte mac[16]; double start; int ret = 0, i, count; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; + + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { ret = wc_Poly1305SetKey(&enc, bench_key, 32); @@ -4442,11 +5372,36 @@ void bench_poly1305(void) printf("Poly1305Update failed: %d\n", ret); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } wc_Poly1305Final(&enc, mac); count += i; - } while (bench_stats_check(start)); - bench_stats_sym_finish("POLY1305", 0, count, bench_size, start, ret); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -4463,11 +5418,40 @@ void bench_poly1305(void) break; } wc_Poly1305Final(&enc, mac); + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); - bench_stats_sym_finish("POLY1305", 0, count, bench_size, start, ret); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } + bench_stats_sym_finish("POLY1305", 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } #endif /* HAVE_POLY1305 */ @@ -4478,6 +5462,13 @@ void bench_camellia(void) Camellia cam; double start; int ret, i, count; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; + + XMEMSET(deltas, 0, sizeof(deltas)); +#endif ret = wc_CamelliaSetKey(&cam, bench_key, 16, bench_iv); if (ret != 0) { @@ -4494,10 +5485,40 @@ void bench_camellia(void) printf("CamelliaCbcEncrypt failed: %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("Camellia", 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } #endif @@ -4506,10 +5527,19 @@ void bench_sm4_cbc(void) { wc_Sm4 sm4; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret; int i; int count; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + ret = wc_Sm4SetKey(&sm4, bench_key, SM4_KEY_SIZE); if (ret != 0) { printf("Sm4SetKey failed, ret = %d\n", ret); @@ -4529,10 +5559,45 @@ void bench_sm4_cbc(void) printf("Sm4CbcEncrypt failed: %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("SM4-CBC-enc", 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif bench_stats_start(&count, &start); do { @@ -4542,10 +5607,40 @@ void bench_sm4_cbc(void) printf("Sm4CbcDecrypt failed: %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("SM4-CBC-dec", 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } #endif @@ -4554,6 +5649,11 @@ void bench_sm4_gcm(void) { wc_Sm4 sm4; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret; int i; int count; @@ -4567,6 +5667,10 @@ void bench_sm4_gcm(void) } #endif +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + ret = wc_Sm4GcmSetKey(&sm4, bench_key, SM4_KEY_SIZE); if (ret != 0) { printf("Sm4GcmSetKey failed, ret = %d\n", ret); @@ -4583,10 +5687,45 @@ void bench_sm4_gcm(void) printf("Sm4GcmEncrypt failed: %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("SM4-GCM-enc", 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif bench_stats_start(&count, &start); do { @@ -4598,10 +5737,40 @@ void bench_sm4_gcm(void) printf("Sm4GcmDecrypt failed: %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("SM4-GCM-dec", 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } #endif @@ -4610,6 +5779,11 @@ void bench_sm4_ccm() { wc_Sm4 enc; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret, i, count; WC_DECLARE_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT); @@ -4624,6 +5798,9 @@ void bench_sm4_ccm() XMEMSET(bench_tag, 0, AES_AUTH_TAG_SZ); XMEMSET(bench_additional, 0, AES_AUTH_ADD_SZ); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if ((ret = wc_Sm4SetKey(&enc, bench_key, 16)) != 0) { printf("wc_Sm4SetKey failed, ret = %d\n", ret); @@ -4636,25 +5813,92 @@ void bench_sm4_ccm() ret |= wc_Sm4CcmEncrypt(&enc, bench_cipher, bench_plain, bench_size, bench_iv, 12, bench_tag, AES_AUTH_TAG_SZ, bench_additional, 0); + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("SM4-CCM-enc", 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif if (ret != 0) { printf("wc_Sm4Encrypt failed, ret = %d\n", ret); goto exit; } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif + bench_stats_start(&count, &start); do { for (i = 0; i < numBlocks; i++) { ret |= wc_Sm4CcmDecrypt(&enc, bench_plain, bench_cipher, bench_size, bench_iv, 12, bench_tag, AES_AUTH_TAG_SZ, bench_additional, 0); + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("SM4-CCM-dec", 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif if (ret != 0) { printf("wc_Sm4Decrypt failed, ret = %d\n", ret); goto exit; @@ -4672,9 +5916,17 @@ void bench_des(int useDeviceID) int ret = 0, i, count = 0, times, pending = 0; Des3 enc[BENCH_MAX_PENDING]; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif /* clear for done cleanup */ XMEMSET(enc, 0, sizeof(enc)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { @@ -4709,11 +5961,41 @@ void bench_des(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit_3des: bench_stats_sym_finish("3DES", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -4730,9 +6012,17 @@ void bench_arc4(int useDeviceID) int ret = 0, i, count = 0, times, pending = 0; Arc4 enc[BENCH_MAX_PENDING]; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif /* clear for done cleanup */ XMEMSET(enc, 0, sizeof(enc)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { @@ -4766,11 +6056,41 @@ void bench_arc4(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit_arc4: bench_stats_sym_finish("ARC4", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -4787,6 +6107,13 @@ void bench_chacha(void) ChaCha enc; double start; int i, count; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; + + XMEMSET(deltas, 0, sizeof(deltas)); +#endif XMEMSET(&enc, 0, sizeof(enc)); wc_Chacha_SetKey(&enc, bench_key, 16); @@ -4796,10 +6123,40 @@ void bench_chacha(void) for (i = 0; i < numBlocks; i++) { wc_Chacha_SetIV(&enc, bench_iv, 0); wc_Chacha_Process(&enc, bench_cipher, bench_plain, bench_size); + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("CHACHA", 0, count, bench_size, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } #endif /* HAVE_CHACHA*/ @@ -4808,9 +6165,17 @@ void bench_chacha20_poly1305_aead(void) { double start; int ret = 0, i, count; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif byte authTag[CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE]; XMEMSET(authTag, 0, sizeof(authTag)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif bench_stats_start(&count, &start); do { @@ -4821,10 +6186,40 @@ void bench_chacha20_poly1305_aead(void) printf("wc_ChaCha20Poly1305_Encrypt error: %d\n", ret); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("CHA-POLY", 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } #endif /* HAVE_CHACHA && HAVE_POLY1305 */ @@ -4835,6 +6230,12 @@ void bench_md5(int useDeviceID) wc_Md5 hash[BENCH_MAX_PENDING]; double start; int ret = 0, i, count = 0, times, pending = 0; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif + WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_MD5_DIGEST_SIZE, HEAP_HINT); WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, @@ -4842,6 +6243,9 @@ void bench_md5(int useDeviceID) /* clear for done cleanup */ XMEMSET(hash, 0, sizeof(hash)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { /* init keys */ @@ -4875,6 +6279,28 @@ void bench_md5(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; @@ -4894,7 +6320,11 @@ void bench_md5(int useDeviceID) } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -4907,12 +6337,41 @@ void bench_md5(int useDeviceID) ret = wc_Md5Final(hash, digest[0]); if (ret != 0) goto exit_md5; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } exit_md5: bench_stats_sym_finish("MD5", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -4933,6 +6392,11 @@ void bench_sha(int useDeviceID) wc_Sha hash[BENCH_MAX_PENDING]; double start; int ret = 0, i, count = 0, times, pending = 0; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA_DIGEST_SIZE, HEAP_HINT); WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, @@ -4940,6 +6404,9 @@ void bench_sha(int useDeviceID) /* clear for done cleanup */ XMEMSET(hash, 0, sizeof(hash)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { /* init keys */ @@ -4973,6 +6440,28 @@ void bench_sha(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; @@ -4992,7 +6481,11 @@ void bench_sha(int useDeviceID) } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -5006,12 +6499,41 @@ void bench_sha(int useDeviceID) ret = wc_ShaFinal(hash, digest[0]); if (ret != 0) goto exit_sha; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } exit_sha: bench_stats_sym_finish("SHA", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -5030,6 +6552,11 @@ void bench_sha224(int useDeviceID) wc_Sha224 hash[BENCH_MAX_PENDING]; double start; int ret = 0, i, count = 0, times, pending = 0; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA224_DIGEST_SIZE, HEAP_HINT); WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, @@ -5037,6 +6564,9 @@ void bench_sha224(int useDeviceID) /* clear for done cleanup */ XMEMSET(hash, 0, sizeof(hash)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { /* init keys */ @@ -5067,6 +6597,28 @@ void bench_sha224(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; @@ -5085,7 +6637,11 @@ void bench_sha224(int useDeviceID) } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -5101,11 +6657,18 @@ void bench_sha224(int useDeviceID) goto exit_sha224; } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } exit_sha224: bench_stats_sym_finish("SHA-224", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -5117,12 +6680,18 @@ exit: } #endif + #ifndef NO_SHA256 void bench_sha256(int useDeviceID) { wc_Sha256 hash[BENCH_MAX_PENDING]; double start; int ret = 0, i, count = 0, times, pending = 0; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA256_DIGEST_SIZE, HEAP_HINT); WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, @@ -5130,6 +6699,9 @@ void bench_sha256(int useDeviceID) /* clear for done cleanup */ XMEMSET(hash, 0, sizeof(hash)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { /* init keys */ @@ -5163,6 +6735,28 @@ void bench_sha256(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; @@ -5181,7 +6775,11 @@ void bench_sha256(int useDeviceID) } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -5195,16 +6793,43 @@ void bench_sha256(int useDeviceID) ret = wc_Sha256Final(hash, digest[0]); if (ret != 0) goto exit_sha256; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } exit_sha256: bench_stats_sym_finish("SHA-256", useDeviceID, count, bench_size, start, ret); - +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { wc_Sha256Free(&hash[i]); } @@ -5219,6 +6844,11 @@ void bench_sha384(int useDeviceID) wc_Sha384 hash[BENCH_MAX_PENDING]; double start; int ret = 0, i, count = 0, times, pending = 0; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA384_DIGEST_SIZE, HEAP_HINT); WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, @@ -5226,6 +6856,9 @@ void bench_sha384(int useDeviceID) /* clear for done cleanup */ XMEMSET(hash, 0, sizeof(hash)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { /* init keys */ @@ -5256,6 +6889,28 @@ void bench_sha384(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; @@ -5274,7 +6929,11 @@ void bench_sha384(int useDeviceID) } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -5288,13 +6947,42 @@ void bench_sha384(int useDeviceID) ret = wc_Sha384Final(hash, digest[0]); if (ret != 0) goto exit_sha384; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } exit_sha384: bench_stats_sym_finish("SHA-384", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -5312,6 +7000,11 @@ void bench_sha512(int useDeviceID) wc_Sha512 hash[BENCH_MAX_PENDING]; double start; int ret = 0, i, count = 0, times, pending = 0; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA512_DIGEST_SIZE, HEAP_HINT); WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, @@ -5319,6 +7012,9 @@ void bench_sha512(int useDeviceID) /* clear for done cleanup */ XMEMSET(hash, 0, sizeof(hash)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { /* init keys */ @@ -5349,6 +7045,28 @@ void bench_sha512(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; @@ -5367,7 +7085,11 @@ void bench_sha512(int useDeviceID) } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -5381,13 +7103,42 @@ void bench_sha512(int useDeviceID) ret = wc_Sha512Final(hash, digest[0]); if (ret != 0) goto exit_sha512; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } exit_sha512: bench_stats_sym_finish("SHA-512", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -5405,13 +7156,21 @@ void bench_sha512_224(int useDeviceID) wc_Sha512_224 hash[BENCH_MAX_PENDING]; double start; int ret = 0, i, count = 0, times, pending = 0; - WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif + WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA512_224_DIGEST_SIZE, HEAP_HINT); WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA512_224_DIGEST_SIZE, HEAP_HINT); /* clear for done cleanup */ XMEMSET(hash, 0, sizeof(hash)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { /* init keys */ @@ -5442,6 +7201,28 @@ void bench_sha512_224(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; @@ -5460,7 +7241,11 @@ void bench_sha512_224(int useDeviceID) } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -5474,13 +7259,42 @@ void bench_sha512_224(int useDeviceID) ret = wc_Sha512_224Final(hash, digest[0]); if (ret != 0) goto exit_sha512_224; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } exit_sha512_224: bench_stats_sym_finish("SHA-512/224", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -5499,13 +7313,21 @@ void bench_sha512_256(int useDeviceID) wc_Sha512_256 hash[BENCH_MAX_PENDING]; double start; int ret = 0, i, count = 0, times, pending = 0; - WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif + WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA512_256_DIGEST_SIZE, HEAP_HINT); WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA512_256_DIGEST_SIZE, HEAP_HINT); /* clear for done cleanup */ XMEMSET(hash, 0, sizeof(hash)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { /* init keys */ @@ -5536,6 +7358,28 @@ void bench_sha512_256(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; @@ -5554,7 +7398,11 @@ void bench_sha512_256(int useDeviceID) } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -5568,13 +7416,42 @@ void bench_sha512_256(int useDeviceID) ret = wc_Sha512_256Final(hash, digest[0]); if (ret != 0) goto exit_sha512_256; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } exit_sha512_256: bench_stats_sym_finish("SHA-512/256", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -5596,6 +7473,11 @@ void bench_sha3_224(int useDeviceID) wc_Sha3 hash[BENCH_MAX_PENDING]; double start; int ret = 0, i, count = 0, times, pending = 0; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA3_224_DIGEST_SIZE, HEAP_HINT); WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, @@ -5603,6 +7485,9 @@ void bench_sha3_224(int useDeviceID) /* clear for done cleanup */ XMEMSET(hash, 0, sizeof(hash)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { /* init keys */ @@ -5633,6 +7518,28 @@ void bench_sha3_224(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; @@ -5651,7 +7558,11 @@ void bench_sha3_224(int useDeviceID) } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -5665,13 +7576,42 @@ void bench_sha3_224(int useDeviceID) ret = wc_Sha3_224_Final(hash, digest[0]); if (ret != 0) goto exit_sha3_224; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } exit_sha3_224: bench_stats_sym_finish("SHA3-224", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -5688,6 +7628,11 @@ void bench_sha3_256(int useDeviceID) { wc_Sha3 hash[BENCH_MAX_PENDING]; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret = 0, i, count = 0, times, pending = 0; WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA3_256_DIGEST_SIZE, HEAP_HINT); @@ -5696,6 +7641,9 @@ void bench_sha3_256(int useDeviceID) /* clear for done cleanup */ XMEMSET(hash, 0, sizeof(hash)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { /* init keys */ @@ -5726,6 +7674,28 @@ void bench_sha3_256(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; @@ -5744,7 +7714,11 @@ void bench_sha3_256(int useDeviceID) } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -5758,13 +7732,42 @@ void bench_sha3_256(int useDeviceID) ret = wc_Sha3_256_Final(hash, digest[0]); if (ret != 0) goto exit_sha3_256; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } exit_sha3_256: bench_stats_sym_finish("SHA3-256", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -5782,6 +7785,11 @@ void bench_sha3_384(int useDeviceID) wc_Sha3 hash[BENCH_MAX_PENDING]; double start; int ret = 0, i, count = 0, times, pending = 0; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA3_384_DIGEST_SIZE, HEAP_HINT); WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, @@ -5789,6 +7797,9 @@ void bench_sha3_384(int useDeviceID) /* clear for done cleanup */ XMEMSET(hash, 0, sizeof(hash)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { /* init keys */ @@ -5819,6 +7830,28 @@ void bench_sha3_384(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; @@ -5837,7 +7870,11 @@ void bench_sha3_384(int useDeviceID) } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -5851,13 +7888,42 @@ void bench_sha3_384(int useDeviceID) ret = wc_Sha3_384_Final(hash, digest[0]); if (ret != 0) goto exit_sha3_384; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } exit_sha3_384: bench_stats_sym_finish("SHA3-384", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -5875,13 +7941,21 @@ void bench_sha3_512(int useDeviceID) wc_Sha3 hash[BENCH_MAX_PENDING]; double start; int ret = 0, i, count = 0, times, pending = 0; - WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif + WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA3_512_DIGEST_SIZE, HEAP_HINT); WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA3_512_DIGEST_SIZE, HEAP_HINT); /* clear for done cleanup */ XMEMSET(hash, 0, sizeof(hash)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { /* init keys */ @@ -5912,6 +7986,28 @@ void bench_sha3_512(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; @@ -5930,7 +8026,11 @@ void bench_sha3_512(int useDeviceID) } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -5944,13 +8044,42 @@ void bench_sha3_512(int useDeviceID) ret = wc_Sha3_512_Final(hash, digest[0]); if (ret != 0) goto exit_sha3_512; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } exit_sha3_512: bench_stats_sym_finish("SHA3-512", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -5967,6 +8096,11 @@ void bench_shake128(int useDeviceID) { wc_Shake hash[BENCH_MAX_PENDING]; double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret = 0, i, count = 0, times, pending = 0; WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA3_128_BLOCK_SIZE, HEAP_HINT); @@ -5975,6 +8109,9 @@ void bench_shake128(int useDeviceID) /* clear for done cleanup */ XMEMSET(hash, 0, sizeof(hash)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { /* init keys */ @@ -6005,6 +8142,28 @@ void bench_shake128(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; @@ -6024,7 +8183,11 @@ void bench_shake128(int useDeviceID) } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -6039,13 +8202,42 @@ void bench_shake128(int useDeviceID) WC_SHA3_128_BLOCK_SIZE); if (ret != 0) goto exit_shake128; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } exit_shake128: bench_stats_sym_finish("SHAKE128", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -6062,6 +8254,11 @@ void bench_shake256(int useDeviceID) { wc_Shake hash[BENCH_MAX_PENDING]; double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret = 0, i, count = 0, times, pending = 0; WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA3_256_BLOCK_SIZE, HEAP_HINT); @@ -6070,6 +8267,9 @@ void bench_shake256(int useDeviceID) /* clear for done cleanup */ XMEMSET(hash, 0, sizeof(hash)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { /* init keys */ @@ -6100,6 +8300,28 @@ void bench_shake256(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; @@ -6119,7 +8341,11 @@ void bench_shake256(int useDeviceID) } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -6134,13 +8360,42 @@ void bench_shake256(int useDeviceID) WC_SHA3_256_BLOCK_SIZE); if (ret != 0) goto exit_shake256; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } exit_shake256: bench_stats_sym_finish("SHAKE256", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -6158,6 +8413,11 @@ void bench_sm3(int useDeviceID) { wc_Sm3 hash[BENCH_MAX_PENDING]; double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret = 0, i, count = 0, times, pending = 0; WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SM3_DIGEST_SIZE, HEAP_HINT); @@ -6166,6 +8426,9 @@ void bench_sm3(int useDeviceID) /* clear for done cleanup */ XMEMSET(hash, 0, sizeof(hash)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { /* init keys */ @@ -6195,6 +8458,28 @@ void bench_sm3(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; @@ -6212,7 +8497,11 @@ void bench_sm3(int useDeviceID) } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -6226,12 +8515,41 @@ void bench_sm3(int useDeviceID) ret = wc_Sm3Final(hash, digest[0]); if (ret != 0) goto exit_sm3; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } exit_sm3: bench_stats_sym_finish("SM3", useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -6250,8 +8568,17 @@ void bench_ripemd(void) RipeMd hash; byte digest[RIPEMD_DIGEST_SIZE]; double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count, ret = 0; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + if (digest_stream) { ret = wc_InitRipeMd(&hash); if (ret != 0) { @@ -6267,6 +8594,28 @@ void bench_ripemd(void) printf("wc_RipeMdUpdate failed, retval %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } ret = wc_RipeMdFinal(&hash, digest); if (ret != 0) { @@ -6275,7 +8624,11 @@ void bench_ripemd(void) } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -6296,11 +8649,40 @@ void bench_ripemd(void) printf("wc_RipeMdFinal failed, retval %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } bench_stats_sym_finish("RIPEMD", 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif return; } @@ -6314,6 +8696,13 @@ void bench_blake2b(void) byte digest[64]; double start; int ret = 0, i, count; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; + + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { ret = wc_InitBlake2b(&b2b, 64); @@ -6330,6 +8719,28 @@ void bench_blake2b(void) printf("Blake2bUpdate failed, ret = %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } ret = wc_Blake2bFinal(&b2b, digest, 64); if (ret != 0) { @@ -6337,7 +8748,11 @@ void bench_blake2b(void) return; } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -6358,11 +8773,40 @@ void bench_blake2b(void) printf("Blake2bFinal failed, ret = %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } bench_stats_sym_finish("BLAKE2b", 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } #endif @@ -6373,6 +8817,13 @@ void bench_blake2s(void) byte digest[32]; double start; int ret = 0, i, count; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; + + XMEMSET(deltas, 0, sizeof(deltas)); +#endif if (digest_stream) { ret = wc_InitBlake2s(&b2s, 32); @@ -6389,6 +8840,28 @@ void bench_blake2s(void) printf("Blake2sUpdate failed, ret = %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } ret = wc_Blake2sFinal(&b2s, digest, 32); if (ret != 0) { @@ -6396,7 +8869,11 @@ void bench_blake2s(void) return; } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -6417,11 +8894,40 @@ void bench_blake2s(void) printf("Blake2sFinal failed, ret = %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); } bench_stats_sym_finish("BLAKE2s", 0, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } #endif @@ -6434,6 +8940,11 @@ static void bench_cmac_helper(word32 keySz, const char* outMsg, int useDeviceID) byte digest[AES_BLOCK_SIZE]; word32 digestSz = sizeof(digest); double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret, i, count; #ifdef WOLFSSL_SECO_CAAM unsigned int keyID; @@ -6455,6 +8966,10 @@ static void bench_cmac_helper(word32 keySz, const char* outMsg, int useDeviceID) #endif (void)useDeviceID; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + bench_stats_start(&count, &start); do { #ifdef HAVE_FIPS @@ -6479,6 +8994,28 @@ static void bench_cmac_helper(word32 keySz, const char* outMsg, int useDeviceID) printf("CmacUpdate failed, ret = %d\n", ret); return; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* Note: final force zero's the Cmac struct */ ret = wc_CmacFinal(&cmac, digest, &digestSz); @@ -6487,8 +9024,16 @@ static void bench_cmac_helper(word32 keySz, const char* outMsg, int useDeviceID) return; } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(outMsg, useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } void bench_cmac(int useDeviceID) @@ -6509,8 +9054,17 @@ void bench_scrypt(void) { byte derived[64]; double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret, i, count; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + bench_stats_start(&count, &start); do { for (i = 0; i < scryptCnt; i++) { @@ -6521,11 +9075,41 @@ void bench_scrypt(void) printf("scrypt failed, ret = %d\n", ret); goto exit; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit: bench_stats_asym_finish("scrypt", 17, "", 0, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } #endif /* HAVE_SCRYPT */ @@ -6538,6 +9122,11 @@ static void bench_hmac(int useDeviceID, int type, int digestSz, Hmac hmac[BENCH_MAX_PENDING]; double start; int ret = 0, i, count = 0, times, pending = 0; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif #ifdef WOLFSSL_ASYNC_CRYPT WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_MAX_DIGEST_SIZE, HEAP_HINT); @@ -6551,6 +9140,9 @@ static void bench_hmac(int useDeviceID, int type, int digestSz, /* clear for done cleanup */ XMEMSET(hmac, 0, sizeof(hmac)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { @@ -6604,11 +9196,41 @@ static void bench_hmac(int useDeviceID, int type, int digestSz, goto exit_hmac; } } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit_hmac: bench_stats_sym_finish(label, useDeviceID, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -6726,6 +9348,11 @@ void bench_pbkdf2(void) { double start; int ret = 0, count = 0; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif const char* passwd32 = "passwordpasswordpasswordpassword"; WOLFSSL_SMALL_STACK_STATIC const byte salt32[] = { 0x78, 0x57, 0x8E, 0x5a, 0x5d, 0x63, 0xcb, 0x06, @@ -6734,13 +9361,47 @@ void bench_pbkdf2(void) 0x78, 0x57, 0x8E, 0x5a, 0x5d, 0x63, 0xcb, 0x06 }; byte derived[32]; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + bench_stats_start(&count, &start); do { ret = wc_PBKDF2(derived, (const byte*)passwd32, (int)XSTRLEN(passwd32), salt32, (int)sizeof(salt32), 1000, 32, WC_SHA256); count++; - } while (bench_stats_check(start)); + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("PBKDF2", 32, count, 32, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } #endif /* !NO_PWDBASED */ @@ -6750,30 +9411,104 @@ void bench_pbkdf2(void) void bench_siphash(void) { double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret = 0, count; const char* passwd16 = "passwordpassword"; byte out[16]; int i; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + bench_stats_start(&count, &start); do { for (i = 0; i < numBlocks; i++) { ret = wc_SipHash((const byte*)passwd16, bench_plain, bench_size, out, 8); + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("SipHash-8", 1, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif bench_stats_start(&count, &start); do { for (i = 0; i < numBlocks; i++) { ret = wc_SipHash((const byte*)passwd16, bench_plain, bench_size, out, 16); + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("SipHash-16", 1, count, bench_size, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } #endif @@ -6850,6 +9585,11 @@ static void bench_rsaKeyGen_helper(int useDeviceID, word32 keySz) RsaKey genKey[BENCH_MAX_PENDING]; #endif double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret = 0, i, count = 0, times, pending = 0; const long rsa_e_val = WC_RSA_EXPONENT; const char**desc = bench_desc_words[lng_index]; @@ -6865,6 +9605,9 @@ static void bench_rsaKeyGen_helper(int useDeviceID, word32 keySz) /* clear for done cleanup */ XMEMSET(genKey, 0, sizeof(*genKey) * BENCH_MAX_PENDING); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif bench_stats_start(&count, &start); do { @@ -6891,12 +9634,42 @@ static void bench_rsaKeyGen_helper(int useDeviceID, word32 keySz) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit: bench_stats_asym_finish("RSA", (int)keySz, desc[2], useDeviceID, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif /* cleanup */ for (i = 0; i < BENCH_MAX_PENDING; i++) { @@ -7046,6 +9819,11 @@ static void bench_rsa_helper(int useDeviceID, RsaKey rsaKey[BENCH_MAX_PENDING], const int len = (int)TEST_STRING_SZ; #endif double start = 0.0F; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif const char**desc = bench_desc_words[lng_index]; #ifndef WOLFSSL_RSA_VERIFY_ONLY WC_DECLARE_VAR(message, byte, TEST_STRING_SZ, HEAP_HINT); @@ -7088,6 +9866,10 @@ static void bench_rsa_helper(int useDeviceID, RsaKey rsaKey[BENCH_MAX_PENDING], XMEMCPY(message, messageStr, len); #endif +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + if (!rsa_sign_verify) { #ifndef WOLFSSL_RSA_VERIFY_ONLY /* begin public RSA */ @@ -7112,12 +9894,42 @@ static void bench_rsa_helper(int useDeviceID, RsaKey rsaKey[BENCH_MAX_PENDING], } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); + exit_rsa_verify: bench_stats_asym_finish("RSA", (int)rsaKeySz, desc[0], useDeviceID, count, start, ret); + #ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + #endif #endif /* !WOLFSSL_RSA_VERIFY_ONLY */ #ifndef WOLFSSL_RSA_PUBLIC_ONLY @@ -7125,6 +9937,13 @@ exit_rsa_verify: goto exit; } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif + /* capture resulting encrypt length */ idx = (word32)(rsaKeySz/8); @@ -7148,12 +9967,42 @@ exit_rsa_verify: } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); + exit_rsa_pub: bench_stats_asym_finish("RSA", (int)rsaKeySz, desc[1], useDeviceID, count, start, ret); + #ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + #endif #endif /* !WOLFSSL_RSA_PUBLIC_ONLY */ } else { @@ -7178,16 +10027,53 @@ exit_rsa_pub: } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); + exit_rsa_sign: bench_stats_asym_finish("RSA", (int)rsaKeySz, desc[4], useDeviceID, count, start, ret); - + #ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + #endif if (ret < 0) { goto exit; } + +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif + #endif /* !WOLFSSL_RSA_PUBLIC_ONLY && !WOLFSSL_RSA_VERIFY_ONLY */ /* capture resulting encrypt length */ @@ -7234,13 +10120,42 @@ exit_rsa_sign: } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef ADVANCED_STATS + || runs < minimum_runs + #endif + ); exit_rsa_verifyinline: bench_stats_asym_finish("RSA", (int)rsaKeySz, desc[5], useDeviceID, count, start, ret); + #ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + #endif } exit: @@ -7473,6 +10388,11 @@ void bench_dh(int useDeviceID) int count = 0, times, pending = 0; const byte* tmp = NULL; double start = 0.0F; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif #ifdef WOLFSSL_SMALL_STACK DhKey *dhKey = NULL; #else @@ -7595,6 +10515,9 @@ void bench_dh(int useDeviceID) XMEMSET(dhKey[i], 0, sizeof(DhKey)); } #endif +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { @@ -7632,6 +10555,10 @@ void bench_dh(int useDeviceID) } } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + /* Key Gen */ bench_stats_start(&count, &start); PRIVATE_KEY_UNLOCK(); @@ -7655,18 +10582,55 @@ void bench_dh(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + PRIVATE_KEY_LOCK(); exit_dh_gen: bench_stats_asym_finish("DH", dhKeySz, desc[2], useDeviceID, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif if (ret < 0) { goto exit; } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif + /* Generate key to use as other public */ PRIVATE_KEY_UNLOCK(); ret = wc_DhGenerateKeyPair(&dhKey[0], &gRng, @@ -7695,14 +10659,44 @@ exit_dh_gen: } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + PRIVATE_KEY_LOCK(); exit: bench_stats_asym_finish("DH", dhKeySz, desc[3], useDeviceID, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif /* cleanup */ #ifdef WOLFSSL_SMALL_STACK @@ -7732,8 +10726,17 @@ static void bench_kyber_keygen(int type, const char* name, int keySize, { int ret = 0, times, count, pending = 0; double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif const char**desc = bench_desc_words[lng_index]; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + /* KYBER Make Key */ bench_stats_start(&count, &start); do { @@ -7752,19 +10755,52 @@ static void bench_kyber_keygen(int type, const char* name, int keySize, #endif if (ret != 0) goto exit; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } - while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); exit: bench_stats_asym_finish(name, keySize, desc[2], 0, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } static void bench_kyber_encap(const char* name, int keySize, KyberKey* key) { int ret = 0, times, count, pending = 0; double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif const char**desc = bench_desc_words[lng_index]; byte ct[KYBER_MAX_CIPHER_TEXT_SIZE]; byte ss[KYBER_SS_SZ]; @@ -7775,6 +10811,10 @@ static void bench_kyber_encap(const char* name, int keySize, KyberKey* key) return; } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + /* KYBER Encapsulate */ bench_stats_start(&count, &start); do { @@ -7789,13 +10829,48 @@ static void bench_kyber_encap(const char* name, int keySize, KyberKey* key) #endif if (ret != 0) goto exit_encap; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } - while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); exit_encap: bench_stats_asym_finish(name, keySize, desc[9], 0, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif + +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif /* KYBER Decapsulate */ bench_stats_start(&count, &start); @@ -7805,13 +10880,41 @@ exit_encap: ret = wc_KyberKey_Decapsulate(key, ss, ct, ctSz); if (ret != 0) goto exit_decap; + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } - while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); exit_decap: bench_stats_asym_finish(name, keySize, desc[13], 0, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } void bench_kyber(int type) @@ -8162,13 +11265,47 @@ static void bench_lms_sign_verify(enum wc_LmsParm parm) printf("wc_LmsKey_Sign failed: %d\n", ret); goto exit_lms_sign_verify; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); bench_stats_asym_finish(str, (int)sigSz, "sign", 0, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif count = 0; bench_stats_start(&count, &start); @@ -8181,14 +11318,43 @@ static void bench_lms_sign_verify(enum wc_LmsParm parm) printf("wc_LmsKey_Verify failed: %d\n", ret); goto exit_lms_sign_verify; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); exit_lms_sign_verify: bench_stats_asym_finish(str, (int)sigSz, "verify", 0, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif if (loaded) { @@ -8500,6 +11666,11 @@ void bench_eccMakeKey(int useDeviceID, int curveId) #endif char name[BENCH_ECC_NAME_SZ]; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif const char**desc = bench_desc_words[lng_index]; #ifdef WOLFSSL_SMALL_STACK @@ -8516,6 +11687,9 @@ void bench_eccMakeKey(int useDeviceID, int curveId) /* clear for done cleanup */ XMEMSET(genKey, 0, sizeof(*genKey) * BENCH_MAX_PENDING); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif /* ECC Make Key */ bench_stats_start(&count, &start); @@ -8544,15 +11718,44 @@ void bench_eccMakeKey(int useDeviceID, int curveId) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); exit: (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECC [%15s]", wc_ecc_get_name(curveId)); bench_stats_asym_finish(name, keySize * 8, desc[2], useDeviceID, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif /* cleanup */ for (i = 0; i < BENCH_MAX_PENDING; i++) { @@ -8592,6 +11795,11 @@ void bench_ecc(int useDeviceID, int curveId) word32 x[BENCH_MAX_PENDING]; double start = 0; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif const char**desc = bench_desc_words[lng_index]; #ifdef HAVE_ECC_DHE @@ -8639,6 +11847,9 @@ void bench_ecc(int useDeviceID, int curveId) XMEMSET(genKey, 0, sizeof(*genKey) * BENCH_MAX_PENDING); #ifdef HAVE_ECC_DHE XMEMSET(genKey2, 0, sizeof(*genKey2) * BENCH_MAX_PENDING); +#endif +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); #endif keySize = wc_ecc_get_curve_size_from_id(curveId); @@ -8697,9 +11908,36 @@ void bench_ecc(int useDeviceID, int curveId) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + PRIVATE_KEY_UNLOCK(); exit_ecdhe: (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECDHE [%15s]", @@ -8707,10 +11945,19 @@ exit_ecdhe: bench_stats_asym_finish(name, keySize * 8, desc[3], useDeviceID, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif if (ret < 0) { goto exit; } + #endif /* HAVE_ECC_DHE */ #if !defined(NO_ASN) && defined(HAVE_ECC_SIGN) @@ -8747,9 +11994,35 @@ exit_ecdhe: } } /* bench_async_check */ } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); exit_ecdsa_sign: (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECDSA [%15s]", @@ -8757,6 +12030,14 @@ exit_ecdsa_sign: bench_stats_asym_finish(name, keySize * 8, desc[4], useDeviceID, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif if (ret < 0) { goto exit; @@ -8790,9 +12071,35 @@ exit_ecdsa_sign: } } /* if bench_async_check */ } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); exit_ecdsa_verify: (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECDSA [%15s]", @@ -8800,6 +12107,9 @@ exit_ecdsa_verify: bench_stats_asym_finish(name, keySize * 8, desc[5], useDeviceID, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif #endif /* HAVE_ECC_VERIFY */ #endif /* !NO_ASN && HAVE_ECC_SIGN */ @@ -8861,6 +12171,11 @@ void bench_eccEncrypt(int curveId) word32 bench_plainSz = bench_size; int ret, i, count; double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif const char**desc = bench_desc_words[lng_index]; #ifdef WOLFSSL_SMALL_STACK @@ -8921,6 +12236,10 @@ void bench_eccEncrypt(int curveId) msg[i] = (byte)i; } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + bench_stats_start(&count, &start); do { for (i = 0; i < ntimes; i++) { @@ -8931,14 +12250,48 @@ void bench_eccEncrypt(int curveId) printf("wc_ecc_encrypt failed! %d\n", ret); goto exit_enc; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); exit_enc: (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECC [%15s]", wc_ecc_get_name(curveId)); bench_stats_asym_finish(name, keySize * 8, desc[6], 0, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif bench_stats_start(&count, &start); do { @@ -8950,11 +12303,41 @@ exit_enc: printf("wc_ecc_decrypt failed! %d\n", ret); goto exit_dec; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit_dec: bench_stats_asym_finish(name, keySize * 8, desc[7], 0, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif exit: @@ -8988,6 +12371,11 @@ static void bench_sm2_MakeKey(int useDeviceID) ecc_key genKey[BENCH_MAX_PENDING]; char name[BENCH_ECC_NAME_SZ]; double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif const char**desc = bench_desc_words[lng_index]; deviceID = useDeviceID ? devId : INVALID_DEVID; @@ -8995,6 +12383,9 @@ static void bench_sm2_MakeKey(int useDeviceID) /* clear for done cleanup */ XMEMSET(&genKey, 0, sizeof(genKey)); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif /* ECC Make Key */ bench_stats_start(&count, &start); @@ -9022,14 +12413,44 @@ static void bench_sm2_MakeKey(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit: (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECC [%15s]", wc_ecc_get_name(ECC_SM2P256V1)); bench_stats_asym_finish(name, keySize * 8, desc[2], useDeviceID, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif /* cleanup */ for (i = 0; i < BENCH_MAX_PENDING; i++) { @@ -9055,6 +12476,11 @@ void bench_sm2(int useDeviceID) #endif word32 x[BENCH_MAX_PENDING]; double start = 0; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif const char**desc = bench_desc_words[lng_index]; #ifdef HAVE_ECC_DHE @@ -9081,6 +12507,10 @@ void bench_sm2(int useDeviceID) #ifdef HAVE_ECC_DHE XMEMSET(&genKey2, 0, sizeof(genKey2)); #endif +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + keySize = wc_ecc_get_curve_size_from_id(ECC_SM2P256V1); /* init keys */ @@ -9138,15 +12568,45 @@ void bench_sm2(int useDeviceID) } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + PRIVATE_KEY_UNLOCK(); exit_ecdhe: (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECDHE [%15s]", wc_ecc_get_name(ECC_SM2P256V1)); bench_stats_asym_finish(name, keySize * 8, desc[3], useDeviceID, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif if (ret < 0) { goto exit; @@ -9162,6 +12622,13 @@ exit_ecdhe: } } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif + /* ECC Sign */ bench_stats_start(&count, &start); do { @@ -9183,14 +12650,44 @@ exit_ecdhe: } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit_ecdsa_sign: (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECDSA [%15s]", wc_ecc_get_name(ECC_SM2P256V1)); bench_stats_asym_finish(name, keySize * 8, desc[4], useDeviceID, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif if (ret < 0) { goto exit; @@ -9219,14 +12716,45 @@ exit_ecdsa_sign: } } } /* for i */ + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit_ecdsa_verify: (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECDSA [%15s]", wc_ecc_get_name(ECC_SM2P256V1)); bench_stats_asym_finish(name, keySize * 8, desc[5], useDeviceID, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif + #endif /* HAVE_ECC_VERIFY */ #endif /* !NO_ASN && HAVE_ECC_SIGN */ @@ -9265,9 +12793,18 @@ void bench_curve25519KeyGen(int useDeviceID) { curve25519_key genKey; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret = 0, i, count; const char**desc = bench_desc_words[lng_index]; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + /* Key Gen */ bench_stats_start(&count, &start); do { @@ -9285,11 +12822,41 @@ void bench_curve25519KeyGen(int useDeviceID) printf("wc_curve25519_make_key failed: %d\n", ret); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("CURVE", 25519, desc[2], useDeviceID, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } #ifdef HAVE_CURVE25519_SHARED_SECRET @@ -9297,11 +12864,20 @@ void bench_curve25519KeyAgree(int useDeviceID) { curve25519_key genKey, genKey2; double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret, i, count; byte shared[32]; const char**desc = bench_desc_words[lng_index]; word32 x = 0; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + wc_curve25519_init_ex(&genKey, HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); wc_curve25519_init_ex(&genKey2, HEAP_HINT, @@ -9329,12 +12905,42 @@ void bench_curve25519KeyAgree(int useDeviceID) printf("curve25519_shared_secret failed: %d\n", ret); goto exit; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit: bench_stats_asym_finish("CURVE", 25519, desc[3], useDeviceID, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif wc_curve25519_free(&genKey2); wc_curve25519_free(&genKey); @@ -9348,9 +12954,18 @@ void bench_ed25519KeyGen(void) #ifdef HAVE_ED25519_MAKE_KEY ed25519_key genKey; double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count; const char**desc = bench_desc_words[lng_index]; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + /* Key Gen */ bench_stats_start(&count, &start); do { @@ -9358,10 +12973,40 @@ void bench_ed25519KeyGen(void) wc_ed25519_init(&genKey); (void)wc_ed25519_make_key(&gRng, 32, &genKey); wc_ed25519_free(&genKey); + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ED", 25519, desc[2], 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif #endif /* HAVE_ED25519_MAKE_KEY */ } @@ -9374,6 +13019,11 @@ void bench_ed25519KeySign(void) ed25519_key genKey; #ifdef HAVE_ED25519_SIGN double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count; byte sig[ED25519_SIG_SIZE]; byte msg[512]; @@ -9396,6 +13046,10 @@ void bench_ed25519KeySign(void) for (i = 0; i < (int)sizeof(msg); i++) msg[i] = (byte)i; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + bench_stats_start(&count, &start); do { for (i = 0; i < agreeTimes; i++) { @@ -9405,11 +13059,46 @@ void bench_ed25519KeySign(void) printf("ed25519_sign_msg failed\n"); goto exit_ed_sign; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit_ed_sign: bench_stats_asym_finish("ED", 25519, desc[4], 0, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif #ifdef HAVE_ED25519_VERIFY bench_stats_start(&count, &start); @@ -9422,11 +13111,41 @@ exit_ed_sign: printf("ed25519_verify_msg failed\n"); goto exit_ed_verify; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit_ed_verify: bench_stats_asym_finish("ED", 25519, desc[5], 0, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif #endif /* HAVE_ED25519_VERIFY */ #endif /* HAVE_ED25519_SIGN */ @@ -9439,9 +13158,18 @@ void bench_curve448KeyGen(void) { curve448_key genKey; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret = 0, i, count; const char**desc = bench_desc_words[lng_index]; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + /* Key Gen */ bench_stats_start(&count, &start); do { @@ -9452,10 +13180,40 @@ void bench_curve448KeyGen(void) printf("wc_curve448_make_key failed: %d\n", ret); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("CURVE", 448, desc[2], 0, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } #ifdef HAVE_CURVE448_SHARED_SECRET @@ -9463,11 +13221,20 @@ void bench_curve448KeyAgree(void) { curve448_key genKey, genKey2; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int ret, i, count; byte shared[56]; const char**desc = bench_desc_words[lng_index]; word32 x = 0; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + wc_curve448_init(&genKey); wc_curve448_init(&genKey2); @@ -9493,11 +13260,41 @@ void bench_curve448KeyAgree(void) printf("curve448_shared_secret failed: %d\n", ret); goto exit; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit: bench_stats_asym_finish("CURVE", 448, desc[3], 0, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif wc_curve448_free(&genKey2); wc_curve448_free(&genKey); @@ -9510,9 +13307,18 @@ void bench_ed448KeyGen(void) { ed448_key genKey; double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count; const char**desc = bench_desc_words[lng_index]; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + /* Key Gen */ bench_stats_start(&count, &start); do { @@ -9520,10 +13326,40 @@ void bench_ed448KeyGen(void) wc_ed448_init(&genKey); (void)wc_ed448_make_key(&gRng, ED448_KEY_SIZE, &genKey); wc_ed448_free(&genKey); + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ED", 448, desc[2], 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } @@ -9533,6 +13369,11 @@ void bench_ed448KeySign(void) ed448_key genKey; #ifdef HAVE_ED448_SIGN double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count; byte sig[ED448_SIG_SIZE]; byte msg[512]; @@ -9553,6 +13394,10 @@ void bench_ed448KeySign(void) for (i = 0; i < (int)sizeof(msg); i++) msg[i] = (byte)i; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + bench_stats_start(&count, &start); do { for (i = 0; i < agreeTimes; i++) { @@ -9563,11 +13408,46 @@ void bench_ed448KeySign(void) printf("ed448_sign_msg failed\n"); goto exit_ed_sign; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit_ed_sign: bench_stats_asym_finish("ED", 448, desc[4], 0, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif #ifdef HAVE_ED448_VERIFY bench_stats_start(&count, &start); @@ -9580,11 +13460,41 @@ exit_ed_sign: printf("ed448_verify_msg failed\n"); goto exit_ed_verify; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + exit_ed_verify: bench_stats_asym_finish("ED", 448, desc[5], 0, count, start, ret); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif #endif /* HAVE_ED448_VERIFY */ #endif /* HAVE_ED448_SIGN */ @@ -9598,10 +13508,19 @@ void bench_eccsiKeyGen(void) { EccsiKey genKey; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count; const char**desc = bench_desc_words[lng_index]; int ret; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + /* Key Gen */ bench_stats_start(&count, &start); do { @@ -9613,16 +13532,51 @@ void bench_eccsiKeyGen(void) break; } wc_FreeEccsiKey(&genKey); + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ECCSI", 256, desc[2], 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } void bench_eccsiPairGen(void) { EccsiKey genKey; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count; const char**desc = bench_desc_words[lng_index]; mp_int ssk; @@ -9635,6 +13589,10 @@ void bench_eccsiPairGen(void) wc_InitEccsiKey(&genKey, NULL, INVALID_DEVID); (void)wc_MakeEccsiKey(&genKey, &gRng); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + /* RSK Gen */ bench_stats_start(&count, &start); do { @@ -9645,10 +13603,40 @@ void bench_eccsiPairGen(void) printf("wc_MakeEccsiPair failed: %d\n", ret); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ECCSI", 256, desc[12], 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif wc_FreeEccsiKey(&genKey); wc_ecc_del_point(pvt); @@ -9661,6 +13649,11 @@ void bench_eccsiValidate(void) { EccsiKey genKey; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count; const char**desc = bench_desc_words[lng_index]; mp_int ssk; @@ -9669,6 +13662,10 @@ void bench_eccsiValidate(void) int valid; int ret; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + (void)mp_init(&ssk); pvt = wc_ecc_new_point(); wc_InitEccsiKey(&genKey, NULL, INVALID_DEVID); @@ -9687,10 +13684,40 @@ void bench_eccsiValidate(void) valid); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ECCSI", 256, desc[11], 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif wc_FreeEccsiKey(&genKey); wc_ecc_del_point(pvt); @@ -9701,6 +13728,11 @@ void bench_eccsi(void) { EccsiKey genKey; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count; const char**desc = bench_desc_words[lng_index]; mp_int ssk; @@ -9714,6 +13746,10 @@ void bench_eccsi(void) int ret; int verified; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + (void)mp_init(&ssk); pvt = wc_ecc_new_point(); (void)wc_InitEccsiKey(&genKey, NULL, INVALID_DEVID); @@ -9735,10 +13771,45 @@ void bench_eccsi(void) printf("wc_SignEccsiHash failed: %d\n", ret); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ECCSI", 256, desc[4], 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif /* Derive */ bench_stats_start(&count, &start); @@ -9752,10 +13823,40 @@ void bench_eccsi(void) verified); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ECCSI", 256, desc[5], 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif wc_FreeEccsiKey(&genKey); wc_ecc_del_point(pvt); @@ -9769,10 +13870,19 @@ void bench_sakkeKeyGen(void) { SakkeKey genKey; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count; const char**desc = bench_desc_words[lng_index]; int ret; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + /* Key Gen */ bench_stats_start(&count, &start); do { @@ -9784,22 +13894,61 @@ void bench_sakkeKeyGen(void) break; } wc_FreeSakkeKey(&genKey); + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("SAKKE", 1024, desc[2], 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif } void bench_sakkeRskGen(void) { SakkeKey genKey; double start; + #ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count; const char**desc = bench_desc_words[lng_index]; ecc_point* rsk; static const byte id[] = { 0x01, 0x23, 0x34, 0x45 }; int ret; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + rsk = wc_ecc_new_point(); wc_InitSakkeKey_ex(&genKey, 128, ECC_SAKKE_1, NULL, INVALID_DEVID); (void)wc_MakeSakkeKey(&genKey, &gRng); @@ -9813,10 +13962,40 @@ void bench_sakkeRskGen(void) printf("wc_MakeSakkeRsk failed: %d\n", ret); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("SAKKE", 1024, desc[8], 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif wc_FreeSakkeKey(&genKey); wc_ecc_del_point(rsk); @@ -9828,6 +14007,11 @@ void bench_sakkeValidate(void) { SakkeKey genKey; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count; const char**desc = bench_desc_words[lng_index]; ecc_point* rsk; @@ -9835,6 +14019,10 @@ void bench_sakkeValidate(void) int valid; int ret; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + rsk = wc_ecc_new_point(); (void)wc_InitSakkeKey_ex(&genKey, 128, ECC_SAKKE_1, NULL, INVALID_DEVID); (void)wc_MakeSakkeKey(&genKey, &gRng); @@ -9851,10 +14039,40 @@ void bench_sakkeValidate(void) valid); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("SAKKE", 1024, desc[11], 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif wc_FreeSakkeKey(&genKey); wc_ecc_del_point(rsk); @@ -9864,6 +14082,11 @@ void bench_sakke(void) { SakkeKey genKey; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count; const char**desc = bench_desc_words[lng_index]; ecc_point* rsk; @@ -9880,6 +14103,9 @@ void bench_sakke(void) word32 iTableLen = 0; XMEMCPY(ssv, ssv_init, sizeof ssv); +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif rsk = wc_ecc_new_point(); (void)wc_InitSakkeKey_ex(&genKey, 128, ECC_SAKKE_1, NULL, INVALID_DEVID); @@ -9899,12 +14125,46 @@ void bench_sakke(void) printf("wc_MakeSakkeEncapsulatedSSV failed: %d\n", ret); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } /* for */ count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); bench_stats_asym_finish_ex("SAKKE", 1024, desc[9], "-1", 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif /* Derive */ bench_stats_start(&count, &start); @@ -9917,12 +14177,42 @@ void bench_sakke(void) printf("wc_DeriveSakkeSSV failed: %d\n", ret); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } if (ret != 0) break; count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish_ex("SAKKE", 1024, desc[10], "-1", 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif /* Calculate Point I and generate table. */ (void)wc_MakeSakkePointI(&genKey, id, sizeof(id)); @@ -9944,12 +14234,46 @@ void bench_sakke(void) printf("wc_MakeSakkeEncapsulatedSSV failed: %d\n", ret); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); bench_stats_asym_finish_ex("SAKKE", 1024, desc[9], "-2", 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif (void)wc_SetSakkeRsk(&genKey, rsk, table, len); @@ -9964,13 +14288,47 @@ void bench_sakke(void) printf("wc_DeriveSakkeSSV failed: %d\n", ret); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } if (ret != 0) break; count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); bench_stats_asym_finish_ex("SAKKE", 1024, desc[10], "-2", 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif len = 0; (void)wc_GenerateSakkeRskTable(&genKey, rsk, NULL, &len); @@ -9991,12 +14349,47 @@ void bench_sakke(void) printf("wc_DeriveSakkeSSV failed: %d\n", ret); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } if (ret != 0) break; count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish_ex("SAKKE", 1024, desc[10], "-3", 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif wc_ClearSakkePointITable(&genKey); /* Derive with RSK table */ @@ -10010,12 +14403,42 @@ void bench_sakke(void) printf("wc_DeriveSakkeSSV failed: %d\n", ret); break; } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } if (ret != 0) break; count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish_ex("SAKKE", 1024, desc[10], "-4", 0, count, start, 0); +#ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); +#endif wc_FreeSakkeKey(&genKey); wc_ecc_del_point(rsk); @@ -10030,6 +14453,11 @@ void bench_falconKeySign(byte level) int ret = 0; falcon_key key; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count; byte sig[FALCON_MAX_SIG_SIZE]; byte msg[512]; @@ -10085,14 +14513,49 @@ void bench_falconKeySign(byte level) printf("wc_falcon_sign_msg failed\n"); } } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); if (ret == 0) { bench_stats_asym_finish("FALCON", level, desc[4], 0, count, start, ret); + #ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + #endif } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif bench_stats_start(&count, &start); do { @@ -10107,13 +14570,42 @@ void bench_falconKeySign(byte level) ret = -1; } } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); if (ret == 0) { bench_stats_asym_finish("FALCON", level, desc[5], 0, count, start, ret); + #ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + #endif } wc_falcon_free(&key); @@ -10126,12 +14618,21 @@ void bench_dilithiumKeySign(byte level) int ret = 0; dilithium_key key; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count; byte sig[DILITHIUM_MAX_SIG_SIZE]; byte msg[512]; word32 x = 0; const char**desc = bench_desc_words[lng_index]; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + ret = wc_dilithium_init(&key); if (ret != 0) { printf("wc_dilithium_init failed %d\n", ret); @@ -10187,14 +14688,49 @@ void bench_dilithiumKeySign(byte level) printf("wc_dilithium_sign_msg failed\n"); } } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); if (ret == 0) { bench_stats_asym_finish("DILITHIUM", level, desc[4], 0, count, start, ret); + #ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + #endif } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif bench_stats_start(&count, &start); do { @@ -10210,13 +14746,42 @@ void bench_dilithiumKeySign(byte level) ret = -1; } } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); if (ret == 0) { bench_stats_asym_finish("DILITHIUM", level, desc[5], 0, count, start, ret); + #ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + #endif } wc_dilithium_free(&key); @@ -10229,12 +14794,21 @@ void bench_sphincsKeySign(byte level, byte optim) int ret = 0; sphincs_key key; double start; +#ifdef ADVANCED_STATS + double deltas[MAX_SAMPLE_RUNS]; + double max = 0, min = 0, sum = 0, prev = 0, delta; + int runs = 0; +#endif int i, count; byte sig[SPHINCS_MAX_SIG_SIZE]; byte msg[512]; word32 x = 0; const char**desc = bench_desc_words[lng_index]; +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); +#endif + ret = wc_sphincs_init(&key); if (ret != 0) { printf("wc_sphincs_init failed %d\n", ret); @@ -10314,9 +14888,35 @@ void bench_sphincsKeySign(byte level, byte optim) printf("wc_sphincs_sign_msg failed\n"); } } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); if (ret == 0) { if (optim == FAST_VARIANT) { @@ -10327,8 +14927,18 @@ void bench_sphincsKeySign(byte level, byte optim) bench_stats_asym_finish("SPHINCS-SMALL", level, desc[4], 0, count, start, ret); } + #ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + #endif } +#ifdef ADVANCED_STATS + XMEMSET(deltas, 0, sizeof(deltas)); + prev = 0; + runs = 0; + sum = 0; +#endif + bench_stats_start(&count, &start); do { for (i = 0; i < agreeTimes; i++) { @@ -10343,9 +14953,35 @@ void bench_sphincsKeySign(byte level, byte optim) ret = -1; } } + #ifdef ADVANCED_STATS + if (runs == 0) { + delta = current_time(0) - start; + min = delta; + max = delta; + } + else { + delta = current_time(0) - prev; + if (max < delta) + max = delta; + else if (min > delta) + min = delta; + } + + if (runs < MAX_SAMPLE_RUNS) { + deltas[runs] = delta; + sum += delta; + runs++; + } + + prev = current_time(0); + #endif } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef ADVANCED_STATS + || runs < minimum_runs +#endif + ); if (ret == 0) { if (optim == FAST_VARIANT) { @@ -10356,6 +14992,9 @@ void bench_sphincsKeySign(byte level, byte optim) bench_stats_asym_finish("SPHINCS-SMALL", level, desc[5], 0, count, start, ret); } + #ifdef ADVANCED_STATS + bench_advanced_stats(deltas, max, min, sum, runs); + #endif } wc_sphincs_free(&key); @@ -10817,6 +15456,14 @@ static void Usage(void) e++; #ifdef WC_BENCH_TRACK_STATS printf("%s", bench_Usage_msg1[lng_index][e]); /* option -print */ +#endif + e++; + printf("%s", bench_Usage_msg1[lng_index][e]); /* option -hash_input */ + e++; + printf("%s", bench_Usage_msg1[lng_index][e]); /* option -cipher_input */ +#ifdef ADVANCED_STATS + e++; + printf("%s", bench_Usage_msg1[lng_index][e]); /* option -cipher_input */ #endif } @@ -10995,6 +15642,32 @@ int wolfcrypt_benchmark_main(int argc, char** argv) if (argc > 1) numBlocks = XATOI(argv[1]); } + else if (string_matches(argv[1], "-hash_input")) { + argc--; + argv++; + if (argc > 1) + hash_input = argv[1]; + } + else if (string_matches(argv[1], "-cipher_input")) { + argc--; + argv++; + if (argc > 1) + cipher_input = argv[1]; + } +#ifdef ADVANCED_STATS + else if (string_matches(argv[1], "-min_runs")) { + argc--; + argv++; + if (argc > 1) { + minimum_runs = XATOI(argv[1]); + if (minimum_runs > MAX_SAMPLE_RUNS) { + printf("\nINFO: Specified runs is larger than compiled " + "MAX_SAMPLE_RUNS. Using %d runs.\n\n", MAX_SAMPLE_RUNS); + minimum_runs = MAX_SAMPLE_RUNS; + } + } + } +#endif else if (argv[1][0] == '-') { optMatched = 0; #ifndef WOLFSSL_BENCHMARK_ALL