Rename all getters to use get/get0 in name
[openssl.git] / apps / speed.c
1 /*
2  * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
3  * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
4  *
5  * Licensed under the Apache License 2.0 (the "License").  You may not use
6  * this file except in compliance with the License.  You can obtain a copy
7  * in the file LICENSE in the source distribution or at
8  * https://www.openssl.org/source/license.html
9  */
10
11 #undef SECONDS
12 #define SECONDS          3
13 #define PKEY_SECONDS    10
14
15 #define RSA_SECONDS     PKEY_SECONDS
16 #define DSA_SECONDS     PKEY_SECONDS
17 #define ECDSA_SECONDS   PKEY_SECONDS
18 #define ECDH_SECONDS    PKEY_SECONDS
19 #define EdDSA_SECONDS   PKEY_SECONDS
20 #define SM2_SECONDS     PKEY_SECONDS
21 #define FFDH_SECONDS    PKEY_SECONDS
22
23 /* We need to use some deprecated APIs */
24 #define OPENSSL_SUPPRESS_DEPRECATED
25
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <math.h>
30 #include "apps.h"
31 #include "progs.h"
32 #include <openssl/crypto.h>
33 #include <openssl/rand.h>
34 #include <openssl/err.h>
35 #include <openssl/evp.h>
36 #include <openssl/objects.h>
37 #include <openssl/core_names.h>
38 #include <openssl/async.h>
39 #if !defined(OPENSSL_SYS_MSDOS)
40 # include <unistd.h>
41 #endif
42
43 #if defined(__TANDEM)
44 # if defined(OPENSSL_TANDEM_FLOSS)
45 #  include <floss.h(floss_fork)>
46 # endif
47 #endif
48
49 #if defined(_WIN32)
50 # include <windows.h>
51 #endif
52
53 #include <openssl/bn.h>
54 #include <openssl/rsa.h>
55 #include "./testrsa.h"
56 #ifndef OPENSSL_NO_DH
57 # include <openssl/dh.h>
58 #endif
59 #include <openssl/x509.h>
60 #include <openssl/dsa.h>
61 #include "./testdsa.h"
62 #include <openssl/modes.h>
63
64 #ifndef HAVE_FORK
65 # if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_VXWORKS)
66 #  define HAVE_FORK 0
67 # else
68 #  define HAVE_FORK 1
69 # endif
70 #endif
71
72 #if HAVE_FORK
73 # undef NO_FORK
74 #else
75 # define NO_FORK
76 #endif
77
78 #define MAX_MISALIGNMENT 63
79 #define MAX_ECDH_SIZE   256
80 #define MISALIGN        64
81 #define MAX_FFDH_SIZE 1024
82
83 #ifndef RSA_DEFAULT_PRIME_NUM
84 # define RSA_DEFAULT_PRIME_NUM 2
85 #endif
86
87 typedef struct openssl_speed_sec_st {
88     int sym;
89     int rsa;
90     int dsa;
91     int ecdsa;
92     int ecdh;
93     int eddsa;
94     int sm2;
95     int ffdh;
96 } openssl_speed_sec_t;
97
98 static volatile int run = 0;
99
100 static int mr = 0;  /* machine-readeable output format to merge fork results */
101 static int usertime = 1;
102
103 static double Time_F(int s);
104 static void print_message(const char *s, long num, int length, int tm);
105 static void pkey_print_message(const char *str, const char *str2,
106                                long num, unsigned int bits, int sec);
107 static void print_result(int alg, int run_no, int count, double time_used);
108 #ifndef NO_FORK
109 static int do_multi(int multi, int size_num);
110 #endif
111
112 static const int lengths_list[] = {
113     16, 64, 256, 1024, 8 * 1024, 16 * 1024
114 };
115 #define SIZE_NUM         OSSL_NELEM(lengths_list)
116 static const int *lengths = lengths_list;
117
118 static const int aead_lengths_list[] = {
119     2, 31, 136, 1024, 8 * 1024, 16 * 1024
120 };
121
122 #define START   0
123 #define STOP    1
124
125 #ifdef SIGALRM
126
127 static void alarmed(int sig)
128 {
129     signal(SIGALRM, alarmed);
130     run = 0;
131 }
132
133 static double Time_F(int s)
134 {
135     double ret = app_tminterval(s, usertime);
136     if (s == STOP)
137         alarm(0);
138     return ret;
139 }
140
141 #elif defined(_WIN32)
142
143 # define SIGALRM -1
144
145 static unsigned int lapse;
146 static volatile unsigned int schlock;
147 static void alarm_win32(unsigned int secs)
148 {
149     lapse = secs * 1000;
150 }
151
152 # define alarm alarm_win32
153
154 static DWORD WINAPI sleepy(VOID * arg)
155 {
156     schlock = 1;
157     Sleep(lapse);
158     run = 0;
159     return 0;
160 }
161
162 static double Time_F(int s)
163 {
164     double ret;
165     static HANDLE thr;
166
167     if (s == START) {
168         schlock = 0;
169         thr = CreateThread(NULL, 4096, sleepy, NULL, 0, NULL);
170         if (thr == NULL) {
171             DWORD err = GetLastError();
172             BIO_printf(bio_err, "unable to CreateThread (%lu)", err);
173             ExitProcess(err);
174         }
175         while (!schlock)
176             Sleep(0);           /* scheduler spinlock */
177         ret = app_tminterval(s, usertime);
178     } else {
179         ret = app_tminterval(s, usertime);
180         if (run)
181             TerminateThread(thr, 0);
182         CloseHandle(thr);
183     }
184
185     return ret;
186 }
187 #else
188 # error "SIGALRM not defined and the platform is not Windows"
189 #endif
190
191 static void multiblock_speed(const EVP_CIPHER *evp_cipher, int lengths_single,
192                              const openssl_speed_sec_t *seconds);
193
194 static int opt_found(const char *name, unsigned int *result,
195                      const OPT_PAIR pairs[], unsigned int nbelem)
196 {
197     unsigned int idx;
198
199     for (idx = 0; idx < nbelem; ++idx, pairs++)
200         if (strcmp(name, pairs->name) == 0) {
201             *result = pairs->retval;
202             return 1;
203         }
204     return 0;
205 }
206 #define opt_found(value, pairs, result)\
207     opt_found(value, result, pairs, OSSL_NELEM(pairs))
208
209 typedef enum OPTION_choice {
210     OPT_COMMON,
211     OPT_ELAPSED, OPT_EVP, OPT_HMAC, OPT_DECRYPT, OPT_ENGINE, OPT_MULTI,
212     OPT_MR, OPT_MB, OPT_MISALIGN, OPT_ASYNCJOBS, OPT_R_ENUM, OPT_PROV_ENUM,
213     OPT_PRIMES, OPT_SECONDS, OPT_BYTES, OPT_AEAD, OPT_CMAC
214 } OPTION_CHOICE;
215
216 const OPTIONS speed_options[] = {
217     {OPT_HELP_STR, 1, '-', "Usage: %s [options] [algorithm...]\n"},
218
219     OPT_SECTION("General"),
220     {"help", OPT_HELP, '-', "Display this summary"},
221     {"mb", OPT_MB, '-',
222      "Enable (tls1>=1) multi-block mode on EVP-named cipher"},
223     {"mr", OPT_MR, '-', "Produce machine readable output"},
224 #ifndef NO_FORK
225     {"multi", OPT_MULTI, 'p', "Run benchmarks in parallel"},
226 #endif
227 #ifndef OPENSSL_NO_ASYNC
228     {"async_jobs", OPT_ASYNCJOBS, 'p',
229      "Enable async mode and start specified number of jobs"},
230 #endif
231 #ifndef OPENSSL_NO_ENGINE
232     {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
233 #endif
234     {"primes", OPT_PRIMES, 'p', "Specify number of primes (for RSA only)"},
235
236     OPT_SECTION("Selection"),
237     {"evp", OPT_EVP, 's', "Use EVP-named cipher or digest"},
238     {"hmac", OPT_HMAC, 's', "HMAC using EVP-named digest"},
239     {"cmac", OPT_CMAC, 's', "CMAC using EVP-named cipher"},
240     {"decrypt", OPT_DECRYPT, '-',
241      "Time decryption instead of encryption (only EVP)"},
242     {"aead", OPT_AEAD, '-',
243      "Benchmark EVP-named AEAD cipher in TLS-like sequence"},
244
245     OPT_SECTION("Timing"),
246     {"elapsed", OPT_ELAPSED, '-',
247      "Use wall-clock time instead of CPU user time as divisor"},
248     {"seconds", OPT_SECONDS, 'p',
249      "Run benchmarks for specified amount of seconds"},
250     {"bytes", OPT_BYTES, 'p',
251      "Run [non-PKI] benchmarks on custom-sized buffer"},
252     {"misalign", OPT_MISALIGN, 'p',
253      "Use specified offset to mis-align buffers"},
254
255     OPT_R_OPTIONS,
256     OPT_PROV_OPTIONS,
257
258     OPT_PARAMETERS(),
259     {"algorithm", 0, 0, "Algorithm(s) to test (optional; otherwise tests all)"},
260     {NULL}
261 };
262
263 enum {
264     D_MD2, D_MDC2, D_MD4, D_MD5, D_SHA1, D_RMD160,
265     D_SHA256, D_SHA512, D_WHIRLPOOL, D_HMAC,
266     D_CBC_DES, D_EDE3_DES, D_RC4, D_CBC_IDEA, D_CBC_SEED,
267     D_CBC_RC2, D_CBC_RC5, D_CBC_BF, D_CBC_CAST,
268     D_CBC_128_AES, D_CBC_192_AES, D_CBC_256_AES,
269     D_CBC_128_CML, D_CBC_192_CML, D_CBC_256_CML,
270     D_EVP, D_GHASH, D_RAND, D_EVP_CMAC, ALGOR_NUM
271 };
272 /* name of algorithms to test. MUST BE KEEP IN SYNC with above enum ! */
273 static const char *names[ALGOR_NUM] = {
274     "md2", "mdc2", "md4", "md5", "sha1", "rmd160",
275     "sha256", "sha512", "whirlpool", "hmac(md5)",
276     "des-cbc", "des-ede3", "rc4", "idea-cbc", "seed-cbc",
277     "rc2-cbc", "rc5-cbc", "blowfish", "cast-cbc",
278     "aes-128-cbc", "aes-192-cbc", "aes-256-cbc",
279     "camellia-128-cbc", "camellia-192-cbc", "camellia-256-cbc",
280     "evp", "ghash", "rand", "cmac"
281 };
282
283 /* list of configured algorithm (remaining), with some few alias */
284 static const OPT_PAIR doit_choices[] = {
285     {"md2", D_MD2},
286     {"mdc2", D_MDC2},
287     {"md4", D_MD4},
288     {"md5", D_MD5},
289     {"hmac", D_HMAC},
290     {"sha1", D_SHA1},
291     {"sha256", D_SHA256},
292     {"sha512", D_SHA512},
293     {"whirlpool", D_WHIRLPOOL},
294     {"ripemd", D_RMD160},
295     {"rmd160", D_RMD160},
296     {"ripemd160", D_RMD160},
297     {"rc4", D_RC4},
298     {"des-cbc", D_CBC_DES},
299     {"des-ede3", D_EDE3_DES},
300     {"aes-128-cbc", D_CBC_128_AES},
301     {"aes-192-cbc", D_CBC_192_AES},
302     {"aes-256-cbc", D_CBC_256_AES},
303     {"camellia-128-cbc", D_CBC_128_CML},
304     {"camellia-192-cbc", D_CBC_192_CML},
305     {"camellia-256-cbc", D_CBC_256_CML},
306     {"rc2-cbc", D_CBC_RC2},
307     {"rc2", D_CBC_RC2},
308     {"rc5-cbc", D_CBC_RC5},
309     {"rc5", D_CBC_RC5},
310     {"idea-cbc", D_CBC_IDEA},
311     {"idea", D_CBC_IDEA},
312     {"seed-cbc", D_CBC_SEED},
313     {"seed", D_CBC_SEED},
314     {"bf-cbc", D_CBC_BF},
315     {"blowfish", D_CBC_BF},
316     {"bf", D_CBC_BF},
317     {"cast-cbc", D_CBC_CAST},
318     {"cast", D_CBC_CAST},
319     {"cast5", D_CBC_CAST},
320     {"ghash", D_GHASH},
321     {"rand", D_RAND}
322 };
323
324 static double results[ALGOR_NUM][SIZE_NUM];
325
326 enum { R_DSA_512, R_DSA_1024, R_DSA_2048, DSA_NUM };
327 static const OPT_PAIR dsa_choices[DSA_NUM] = {
328     {"dsa512", R_DSA_512},
329     {"dsa1024", R_DSA_1024},
330     {"dsa2048", R_DSA_2048}
331 };
332 static double dsa_results[DSA_NUM][2];  /* 2 ops: sign then verify */
333
334 enum {
335     R_RSA_512, R_RSA_1024, R_RSA_2048, R_RSA_3072, R_RSA_4096, R_RSA_7680,
336     R_RSA_15360, RSA_NUM
337 };
338 static const OPT_PAIR rsa_choices[RSA_NUM] = {
339     {"rsa512", R_RSA_512},
340     {"rsa1024", R_RSA_1024},
341     {"rsa2048", R_RSA_2048},
342     {"rsa3072", R_RSA_3072},
343     {"rsa4096", R_RSA_4096},
344     {"rsa7680", R_RSA_7680},
345     {"rsa15360", R_RSA_15360}
346 };
347
348 static double rsa_results[RSA_NUM][2];  /* 2 ops: sign then verify */
349
350 #ifndef OPENSSL_NO_DH
351 enum ff_params_t {
352     R_FFDH_2048, R_FFDH_3072, R_FFDH_4096, R_FFDH_6144, R_FFDH_8192, FFDH_NUM
353 };
354
355 static const OPT_PAIR ffdh_choices[FFDH_NUM] = {
356     {"ffdh2048", R_FFDH_2048},
357     {"ffdh3072", R_FFDH_3072},
358     {"ffdh4096", R_FFDH_4096},
359     {"ffdh6144", R_FFDH_6144},
360     {"ffdh8192", R_FFDH_8192},
361 };
362
363 static double ffdh_results[FFDH_NUM][1];  /* 1 op: derivation */
364 #endif /* OPENSSL_NO_DH */
365
366 enum ec_curves_t {
367     R_EC_P160, R_EC_P192, R_EC_P224, R_EC_P256, R_EC_P384, R_EC_P521,
368 #ifndef OPENSSL_NO_EC2M
369     R_EC_K163, R_EC_K233, R_EC_K283, R_EC_K409, R_EC_K571,
370     R_EC_B163, R_EC_B233, R_EC_B283, R_EC_B409, R_EC_B571,
371 #endif
372     R_EC_BRP256R1, R_EC_BRP256T1, R_EC_BRP384R1, R_EC_BRP384T1,
373     R_EC_BRP512R1, R_EC_BRP512T1, ECDSA_NUM
374 };
375 /* list of ecdsa curves */
376 static const OPT_PAIR ecdsa_choices[ECDSA_NUM] = {
377     {"ecdsap160", R_EC_P160},
378     {"ecdsap192", R_EC_P192},
379     {"ecdsap224", R_EC_P224},
380     {"ecdsap256", R_EC_P256},
381     {"ecdsap384", R_EC_P384},
382     {"ecdsap521", R_EC_P521},
383 #ifndef OPENSSL_NO_EC2M
384     {"ecdsak163", R_EC_K163},
385     {"ecdsak233", R_EC_K233},
386     {"ecdsak283", R_EC_K283},
387     {"ecdsak409", R_EC_K409},
388     {"ecdsak571", R_EC_K571},
389     {"ecdsab163", R_EC_B163},
390     {"ecdsab233", R_EC_B233},
391     {"ecdsab283", R_EC_B283},
392     {"ecdsab409", R_EC_B409},
393     {"ecdsab571", R_EC_B571},
394 #endif
395     {"ecdsabrp256r1", R_EC_BRP256R1},
396     {"ecdsabrp256t1", R_EC_BRP256T1},
397     {"ecdsabrp384r1", R_EC_BRP384R1},
398     {"ecdsabrp384t1", R_EC_BRP384T1},
399     {"ecdsabrp512r1", R_EC_BRP512R1},
400     {"ecdsabrp512t1", R_EC_BRP512T1}
401 };
402 enum { R_EC_X25519 = ECDSA_NUM, R_EC_X448, EC_NUM };
403 /* list of ecdh curves, extension of |ecdsa_choices| list above */
404 static const OPT_PAIR ecdh_choices[EC_NUM] = {
405     {"ecdhp160", R_EC_P160},
406     {"ecdhp192", R_EC_P192},
407     {"ecdhp224", R_EC_P224},
408     {"ecdhp256", R_EC_P256},
409     {"ecdhp384", R_EC_P384},
410     {"ecdhp521", R_EC_P521},
411 #ifndef OPENSSL_NO_EC2M
412     {"ecdhk163", R_EC_K163},
413     {"ecdhk233", R_EC_K233},
414     {"ecdhk283", R_EC_K283},
415     {"ecdhk409", R_EC_K409},
416     {"ecdhk571", R_EC_K571},
417     {"ecdhb163", R_EC_B163},
418     {"ecdhb233", R_EC_B233},
419     {"ecdhb283", R_EC_B283},
420     {"ecdhb409", R_EC_B409},
421     {"ecdhb571", R_EC_B571},
422 #endif
423     {"ecdhbrp256r1", R_EC_BRP256R1},
424     {"ecdhbrp256t1", R_EC_BRP256T1},
425     {"ecdhbrp384r1", R_EC_BRP384R1},
426     {"ecdhbrp384t1", R_EC_BRP384T1},
427     {"ecdhbrp512r1", R_EC_BRP512R1},
428     {"ecdhbrp512t1", R_EC_BRP512T1},
429     {"ecdhx25519", R_EC_X25519},
430     {"ecdhx448", R_EC_X448}
431 };
432
433 static double ecdh_results[EC_NUM][1];      /* 1 op: derivation */
434 static double ecdsa_results[ECDSA_NUM][2];  /* 2 ops: sign then verify */
435
436 enum { R_EC_Ed25519, R_EC_Ed448, EdDSA_NUM };
437 static const OPT_PAIR eddsa_choices[EdDSA_NUM] = {
438     {"ed25519", R_EC_Ed25519},
439     {"ed448", R_EC_Ed448}
440
441 };
442 static double eddsa_results[EdDSA_NUM][2];    /* 2 ops: sign then verify */
443
444 #ifndef OPENSSL_NO_SM2
445 enum { R_EC_CURVESM2, SM2_NUM };
446 static const OPT_PAIR sm2_choices[SM2_NUM] = {
447     {"curveSM2", R_EC_CURVESM2}
448 };
449 # define SM2_ID        "TLSv1.3+GM+Cipher+Suite"
450 # define SM2_ID_LEN    sizeof("TLSv1.3+GM+Cipher+Suite") - 1
451 static double sm2_results[SM2_NUM][2];    /* 2 ops: sign then verify */
452 #endif /* OPENSSL_NO_SM2 */
453
454 #define COND(unused_cond) (run && count < 0x7fffffff)
455 #define COUNT(d) (count)
456
457 typedef struct loopargs_st {
458     ASYNC_JOB *inprogress_job;
459     ASYNC_WAIT_CTX *wait_ctx;
460     unsigned char *buf;
461     unsigned char *buf2;
462     unsigned char *buf_malloc;
463     unsigned char *buf2_malloc;
464     unsigned char *key;
465     size_t sigsize;
466     EVP_PKEY_CTX *rsa_sign_ctx[RSA_NUM];
467     EVP_PKEY_CTX *rsa_verify_ctx[RSA_NUM];
468     EVP_PKEY_CTX *dsa_sign_ctx[DSA_NUM];
469     EVP_PKEY_CTX *dsa_verify_ctx[DSA_NUM];
470     EVP_PKEY_CTX *ecdsa_sign_ctx[ECDSA_NUM];
471     EVP_PKEY_CTX *ecdsa_verify_ctx[ECDSA_NUM];
472     EVP_PKEY_CTX *ecdh_ctx[EC_NUM];
473     EVP_MD_CTX *eddsa_ctx[EdDSA_NUM];
474     EVP_MD_CTX *eddsa_ctx2[EdDSA_NUM];
475 #ifndef OPENSSL_NO_SM2
476     EVP_MD_CTX *sm2_ctx[SM2_NUM];
477     EVP_MD_CTX *sm2_vfy_ctx[SM2_NUM];
478     EVP_PKEY *sm2_pkey[SM2_NUM];
479 #endif
480     unsigned char *secret_a;
481     unsigned char *secret_b;
482     size_t outlen[EC_NUM];
483 #ifndef OPENSSL_NO_DH
484     EVP_PKEY_CTX *ffdh_ctx[FFDH_NUM];
485     unsigned char *secret_ff_a;
486     unsigned char *secret_ff_b;
487 #endif
488     EVP_CIPHER_CTX *ctx;
489     EVP_MAC_CTX *mctx;
490 } loopargs_t;
491 static int run_benchmark(int async_jobs, int (*loop_function) (void *),
492                          loopargs_t * loopargs);
493
494 static unsigned int testnum;
495
496 /* Nb of iterations to do per algorithm and key-size */
497 static long c[ALGOR_NUM][SIZE_NUM];
498
499 static char *evp_mac_mdname = "md5";
500 static char *evp_hmac_name = NULL;
501 static const char *evp_md_name = NULL;
502 static char *evp_mac_ciphername = "aes-128-cbc";
503 static char *evp_cmac_name = NULL;
504
505 static int have_md(const char *name)
506 {
507     int ret = 0;
508     EVP_MD *md = NULL;
509
510     if (opt_md_silent(name, &md)) {
511         EVP_MD_CTX *ctx = EVP_MD_CTX_new();
512
513         if (ctx != NULL && EVP_DigestInit(ctx, md) > 0)
514             ret = 1;
515         EVP_MD_CTX_free(ctx);
516         EVP_MD_free(md);
517     }
518     return ret;
519 }
520
521 static int have_cipher(const char *name)
522 {
523     int ret = 0;
524     EVP_CIPHER *cipher = NULL;
525
526     if (opt_cipher_silent(name, &cipher)) {
527         EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
528
529         if (ctx != NULL
530             && EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, 1) > 0)
531             ret = 1;
532         EVP_CIPHER_CTX_free(ctx);
533         EVP_CIPHER_free(cipher);
534     }
535     return ret;
536 }
537
538 static int EVP_Digest_loop(const char *mdname, int algindex, void *args)
539 {
540     loopargs_t *tempargs = *(loopargs_t **) args;
541     unsigned char *buf = tempargs->buf;
542     unsigned char digest[EVP_MAX_MD_SIZE];
543     int count;
544     EVP_MD *md = NULL;
545
546     if (!opt_md_silent(mdname, &md))
547         return -1;
548     for (count = 0; COND(c[algindex][testnum]); count++) {
549         if (!EVP_Digest(buf, (size_t)lengths[testnum], digest, NULL, md,
550                         NULL)) {
551             count = -1;
552             break;
553         }
554     }
555     EVP_MD_free(md);
556     return count;
557 }
558
559 static int EVP_Digest_md_loop(void *args)
560 {
561     return EVP_Digest_loop(evp_md_name, D_EVP, args);
562 }
563
564 static int EVP_Digest_MD2_loop(void *args)
565 {
566     return EVP_Digest_loop("md2", D_MD2, args);
567 }
568
569 static int EVP_Digest_MDC2_loop(void *args)
570 {
571     return EVP_Digest_loop("mdc2", D_MDC2, args);
572 }
573
574 static int EVP_Digest_MD4_loop(void *args)
575 {
576     return EVP_Digest_loop("md4", D_MD4, args);
577 }
578
579 static int MD5_loop(void *args)
580 {
581     return EVP_Digest_loop("md5", D_MD5, args);
582 }
583
584 static int EVP_MAC_loop(int algindex, void *args)
585 {
586     loopargs_t *tempargs = *(loopargs_t **) args;
587     unsigned char *buf = tempargs->buf;
588     EVP_MAC_CTX *mctx = tempargs->mctx;
589     unsigned char mac[EVP_MAX_MD_SIZE];
590     int count;
591
592     for (count = 0; COND(c[algindex][testnum]); count++) {
593         size_t outl;
594
595         if (!EVP_MAC_init(mctx, NULL, 0, NULL)
596             || !EVP_MAC_update(mctx, buf, lengths[testnum])
597             || !EVP_MAC_final(mctx, mac, &outl, sizeof(mac)))
598             return -1;
599     }
600     return count;
601 }
602
603 static int HMAC_loop(void *args)
604 {
605     return EVP_MAC_loop(D_HMAC, args);
606 }
607
608 static int CMAC_loop(void *args)
609 {
610     return EVP_MAC_loop(D_EVP_CMAC, args);
611 }
612
613 static int SHA1_loop(void *args)
614 {
615     return EVP_Digest_loop("sha1", D_SHA1, args);
616 }
617
618 static int SHA256_loop(void *args)
619 {
620     return EVP_Digest_loop("sha256", D_SHA256, args);
621 }
622
623 static int SHA512_loop(void *args)
624 {
625     return EVP_Digest_loop("sha512", D_SHA512, args);
626 }
627
628 static int WHIRLPOOL_loop(void *args)
629 {
630     return EVP_Digest_loop("whirlpool", D_WHIRLPOOL, args);
631 }
632
633 static int EVP_Digest_RMD160_loop(void *args)
634 {
635     return EVP_Digest_loop("ripemd160", D_RMD160, args);
636 }
637
638 static int algindex;
639
640 static int EVP_Cipher_loop(void *args)
641 {
642     loopargs_t *tempargs = *(loopargs_t **) args;
643     unsigned char *buf = tempargs->buf;
644     int count;
645
646     if (tempargs->ctx == NULL)
647         return -1;
648     for (count = 0; COND(c[algindex][testnum]); count++)
649         if (EVP_Cipher(tempargs->ctx, buf, buf, (size_t)lengths[testnum]) <= 0)
650             return -1;
651     return count;
652 }
653
654 static int GHASH_loop(void *args)
655 {
656     loopargs_t *tempargs = *(loopargs_t **) args;
657     unsigned char *buf = tempargs->buf;
658     EVP_MAC_CTX *mctx = tempargs->mctx;
659     int count;
660
661     /* just do the update in the loop to be comparable with 1.1.1 */
662     for (count = 0; COND(c[D_GHASH][testnum]); count++) {
663         if (!EVP_MAC_update(mctx, buf, lengths[testnum]))
664             return -1;
665     }
666     return count;
667 }
668
669 #define MAX_BLOCK_SIZE 128
670
671 static unsigned char iv[2 * MAX_BLOCK_SIZE / 8];
672
673 static EVP_CIPHER_CTX *init_evp_cipher_ctx(const char *ciphername,
674                                            const unsigned char *key,
675                                            int keylen)
676 {
677     EVP_CIPHER_CTX *ctx = NULL;
678     EVP_CIPHER *cipher = NULL;
679
680     if (!opt_cipher_silent(ciphername, &cipher))
681         return NULL;
682
683     if ((ctx = EVP_CIPHER_CTX_new()) == NULL)
684         goto end;
685
686     if (!EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, 1)) {
687         EVP_CIPHER_CTX_free(ctx);
688         ctx = NULL;
689         goto end;
690     }
691
692     if (!EVP_CIPHER_CTX_set_key_length(ctx, keylen)) {
693         EVP_CIPHER_CTX_free(ctx);
694         ctx = NULL;
695         goto end;
696     }
697
698     if (!EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, 1)) {
699         EVP_CIPHER_CTX_free(ctx);
700         ctx = NULL;
701         goto end;
702     }
703
704 end:
705     EVP_CIPHER_free(cipher);
706     return ctx;
707 }
708
709 static int RAND_bytes_loop(void *args)
710 {
711     loopargs_t *tempargs = *(loopargs_t **) args;
712     unsigned char *buf = tempargs->buf;
713     int count;
714
715     for (count = 0; COND(c[D_RAND][testnum]); count++)
716         RAND_bytes(buf, lengths[testnum]);
717     return count;
718 }
719
720 static int decrypt = 0;
721 static int EVP_Update_loop(void *args)
722 {
723     loopargs_t *tempargs = *(loopargs_t **) args;
724     unsigned char *buf = tempargs->buf;
725     EVP_CIPHER_CTX *ctx = tempargs->ctx;
726     int outl, count, rc;
727
728     if (decrypt) {
729         for (count = 0; COND(c[D_EVP][testnum]); count++) {
730             rc = EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
731             if (rc != 1) {
732                 /* reset iv in case of counter overflow */
733                 EVP_CipherInit_ex(ctx, NULL, NULL, NULL, iv, -1);
734             }
735         }
736     } else {
737         for (count = 0; COND(c[D_EVP][testnum]); count++) {
738             rc = EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
739             if (rc != 1) {
740                 /* reset iv in case of counter overflow */
741                 EVP_CipherInit_ex(ctx, NULL, NULL, NULL, iv, -1);
742             }
743         }
744     }
745     if (decrypt)
746         EVP_DecryptFinal_ex(ctx, buf, &outl);
747     else
748         EVP_EncryptFinal_ex(ctx, buf, &outl);
749     return count;
750 }
751
752 /*
753  * CCM does not support streaming. For the purpose of performance measurement,
754  * each message is encrypted using the same (key,iv)-pair. Do not use this
755  * code in your application.
756  */
757 static int EVP_Update_loop_ccm(void *args)
758 {
759     loopargs_t *tempargs = *(loopargs_t **) args;
760     unsigned char *buf = tempargs->buf;
761     EVP_CIPHER_CTX *ctx = tempargs->ctx;
762     int outl, count;
763     unsigned char tag[12];
764
765     if (decrypt) {
766         for (count = 0; COND(c[D_EVP][testnum]); count++) {
767             EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, sizeof(tag), tag);
768             /* reset iv */
769             EVP_DecryptInit_ex(ctx, NULL, NULL, NULL, iv);
770             /* counter is reset on every update */
771             EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
772         }
773     } else {
774         for (count = 0; COND(c[D_EVP][testnum]); count++) {
775             /* restore iv length field */
776             EVP_EncryptUpdate(ctx, NULL, &outl, NULL, lengths[testnum]);
777             /* counter is reset on every update */
778             EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
779         }
780     }
781     if (decrypt)
782         EVP_DecryptFinal_ex(ctx, buf, &outl);
783     else
784         EVP_EncryptFinal_ex(ctx, buf, &outl);
785     return count;
786 }
787
788 /*
789  * To make AEAD benchmarking more relevant perform TLS-like operations,
790  * 13-byte AAD followed by payload. But don't use TLS-formatted AAD, as
791  * payload length is not actually limited by 16KB...
792  */
793 static int EVP_Update_loop_aead(void *args)
794 {
795     loopargs_t *tempargs = *(loopargs_t **) args;
796     unsigned char *buf = tempargs->buf;
797     EVP_CIPHER_CTX *ctx = tempargs->ctx;
798     int outl, count;
799     unsigned char aad[13] = { 0xcc };
800     unsigned char faketag[16] = { 0xcc };
801
802     if (decrypt) {
803         for (count = 0; COND(c[D_EVP][testnum]); count++) {
804             (void)EVP_DecryptInit_ex(ctx, NULL, NULL, NULL, iv);
805             (void)EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG,
806                                       sizeof(faketag), faketag);
807             (void)EVP_DecryptUpdate(ctx, NULL, &outl, aad, sizeof(aad));
808             (void)EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
809             (void)EVP_DecryptFinal_ex(ctx, buf + outl, &outl);
810         }
811     } else {
812         for (count = 0; COND(c[D_EVP][testnum]); count++) {
813             (void)EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, iv);
814             (void)EVP_EncryptUpdate(ctx, NULL, &outl, aad, sizeof(aad));
815             (void)EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
816             (void)EVP_EncryptFinal_ex(ctx, buf + outl, &outl);
817         }
818     }
819     return count;
820 }
821
822 static long rsa_c[RSA_NUM][2];  /* # RSA iteration test */
823
824 static int RSA_sign_loop(void *args)
825 {
826     loopargs_t *tempargs = *(loopargs_t **) args;
827     unsigned char *buf = tempargs->buf;
828     unsigned char *buf2 = tempargs->buf2;
829     size_t *rsa_num = &tempargs->sigsize;
830     EVP_PKEY_CTX **rsa_sign_ctx = tempargs->rsa_sign_ctx;
831     int ret, count;
832
833     for (count = 0; COND(rsa_c[testnum][0]); count++) {
834         ret = EVP_PKEY_sign(rsa_sign_ctx[testnum], buf2, rsa_num, buf, 36);
835         if (ret <= 0) {
836             BIO_printf(bio_err, "RSA sign failure\n");
837             ERR_print_errors(bio_err);
838             count = -1;
839             break;
840         }
841     }
842     return count;
843 }
844
845 static int RSA_verify_loop(void *args)
846 {
847     loopargs_t *tempargs = *(loopargs_t **) args;
848     unsigned char *buf = tempargs->buf;
849     unsigned char *buf2 = tempargs->buf2;
850     size_t rsa_num = tempargs->sigsize;
851     EVP_PKEY_CTX **rsa_verify_ctx = tempargs->rsa_verify_ctx;
852     int ret, count;
853
854     for (count = 0; COND(rsa_c[testnum][1]); count++) {
855         ret = EVP_PKEY_verify(rsa_verify_ctx[testnum], buf2, rsa_num, buf, 36);
856         if (ret <= 0) {
857             BIO_printf(bio_err, "RSA verify failure\n");
858             ERR_print_errors(bio_err);
859             count = -1;
860             break;
861         }
862     }
863     return count;
864 }
865
866 #ifndef OPENSSL_NO_DH
867 static long ffdh_c[FFDH_NUM][1];
868
869 static int FFDH_derive_key_loop(void *args)
870 {
871     loopargs_t *tempargs = *(loopargs_t **) args;
872     EVP_PKEY_CTX *ffdh_ctx = tempargs->ffdh_ctx[testnum];
873     unsigned char *derived_secret = tempargs->secret_ff_a;
874     size_t outlen = MAX_FFDH_SIZE;
875     int count;
876
877     for (count = 0; COND(ffdh_c[testnum][0]); count++)
878         EVP_PKEY_derive(ffdh_ctx, derived_secret, &outlen);
879     return count;
880 }
881 #endif /* OPENSSL_NO_DH */
882
883 static long dsa_c[DSA_NUM][2];
884 static int DSA_sign_loop(void *args)
885 {
886     loopargs_t *tempargs = *(loopargs_t **) args;
887     unsigned char *buf = tempargs->buf;
888     unsigned char *buf2 = tempargs->buf2;
889     size_t *dsa_num = &tempargs->sigsize;
890     EVP_PKEY_CTX **dsa_sign_ctx = tempargs->dsa_sign_ctx;
891     int ret, count;
892
893     for (count = 0; COND(dsa_c[testnum][0]); count++) {
894         ret = EVP_PKEY_sign(dsa_sign_ctx[testnum], buf2, dsa_num, buf, 20);
895         if (ret <= 0) {
896             BIO_printf(bio_err, "DSA sign failure\n");
897             ERR_print_errors(bio_err);
898             count = -1;
899             break;
900         }
901     }
902     return count;
903 }
904
905 static int DSA_verify_loop(void *args)
906 {
907     loopargs_t *tempargs = *(loopargs_t **) args;
908     unsigned char *buf = tempargs->buf;
909     unsigned char *buf2 = tempargs->buf2;
910     size_t dsa_num = tempargs->sigsize;
911     EVP_PKEY_CTX **dsa_verify_ctx = tempargs->dsa_verify_ctx;
912     int ret, count;
913
914     for (count = 0; COND(dsa_c[testnum][1]); count++) {
915         ret = EVP_PKEY_verify(dsa_verify_ctx[testnum], buf2, dsa_num, buf, 20);
916         if (ret <= 0) {
917             BIO_printf(bio_err, "DSA verify failure\n");
918             ERR_print_errors(bio_err);
919             count = -1;
920             break;
921         }
922     }
923     return count;
924 }
925
926 static long ecdsa_c[ECDSA_NUM][2];
927 static int ECDSA_sign_loop(void *args)
928 {
929     loopargs_t *tempargs = *(loopargs_t **) args;
930     unsigned char *buf = tempargs->buf;
931     unsigned char *buf2 = tempargs->buf2;
932     size_t *ecdsa_num = &tempargs->sigsize;
933     EVP_PKEY_CTX **ecdsa_sign_ctx = tempargs->ecdsa_sign_ctx;
934     int ret, count;
935
936     for (count = 0; COND(ecdsa_c[testnum][0]); count++) {
937         ret = EVP_PKEY_sign(ecdsa_sign_ctx[testnum], buf2, ecdsa_num, buf, 20);
938         if (ret <= 0) {
939             BIO_printf(bio_err, "ECDSA sign failure\n");
940             ERR_print_errors(bio_err);
941             count = -1;
942             break;
943         }
944     }
945     return count;
946 }
947
948 static int ECDSA_verify_loop(void *args)
949 {
950     loopargs_t *tempargs = *(loopargs_t **) args;
951     unsigned char *buf = tempargs->buf;
952     unsigned char *buf2 = tempargs->buf2;
953     size_t ecdsa_num = tempargs->sigsize;
954     EVP_PKEY_CTX **ecdsa_verify_ctx = tempargs->ecdsa_verify_ctx;
955     int ret, count;
956
957     for (count = 0; COND(ecdsa_c[testnum][1]); count++) {
958         ret = EVP_PKEY_verify(ecdsa_verify_ctx[testnum], buf2, ecdsa_num,
959                               buf, 20);
960         if (ret <= 0) {
961             BIO_printf(bio_err, "ECDSA verify failure\n");
962             ERR_print_errors(bio_err);
963             count = -1;
964             break;
965         }
966     }
967     return count;
968 }
969
970 /* ******************************************************************** */
971 static long ecdh_c[EC_NUM][1];
972
973 static int ECDH_EVP_derive_key_loop(void *args)
974 {
975     loopargs_t *tempargs = *(loopargs_t **) args;
976     EVP_PKEY_CTX *ctx = tempargs->ecdh_ctx[testnum];
977     unsigned char *derived_secret = tempargs->secret_a;
978     int count;
979     size_t *outlen = &(tempargs->outlen[testnum]);
980
981     for (count = 0; COND(ecdh_c[testnum][0]); count++)
982         EVP_PKEY_derive(ctx, derived_secret, outlen);
983
984     return count;
985 }
986
987 static long eddsa_c[EdDSA_NUM][2];
988 static int EdDSA_sign_loop(void *args)
989 {
990     loopargs_t *tempargs = *(loopargs_t **) args;
991     unsigned char *buf = tempargs->buf;
992     EVP_MD_CTX **edctx = tempargs->eddsa_ctx;
993     unsigned char *eddsasig = tempargs->buf2;
994     size_t *eddsasigsize = &tempargs->sigsize;
995     int ret, count;
996
997     for (count = 0; COND(eddsa_c[testnum][0]); count++) {
998         ret = EVP_DigestSign(edctx[testnum], eddsasig, eddsasigsize, buf, 20);
999         if (ret == 0) {
1000             BIO_printf(bio_err, "EdDSA sign failure\n");
1001             ERR_print_errors(bio_err);
1002             count = -1;
1003             break;
1004         }
1005     }
1006     return count;
1007 }
1008
1009 static int EdDSA_verify_loop(void *args)
1010 {
1011     loopargs_t *tempargs = *(loopargs_t **) args;
1012     unsigned char *buf = tempargs->buf;
1013     EVP_MD_CTX **edctx = tempargs->eddsa_ctx2;
1014     unsigned char *eddsasig = tempargs->buf2;
1015     size_t eddsasigsize = tempargs->sigsize;
1016     int ret, count;
1017
1018     for (count = 0; COND(eddsa_c[testnum][1]); count++) {
1019         ret = EVP_DigestVerify(edctx[testnum], eddsasig, eddsasigsize, buf, 20);
1020         if (ret != 1) {
1021             BIO_printf(bio_err, "EdDSA verify failure\n");
1022             ERR_print_errors(bio_err);
1023             count = -1;
1024             break;
1025         }
1026     }
1027     return count;
1028 }
1029
1030 #ifndef OPENSSL_NO_SM2
1031 static long sm2_c[SM2_NUM][2];
1032 static int SM2_sign_loop(void *args)
1033 {
1034     loopargs_t *tempargs = *(loopargs_t **) args;
1035     unsigned char *buf = tempargs->buf;
1036     EVP_MD_CTX **sm2ctx = tempargs->sm2_ctx;
1037     unsigned char *sm2sig = tempargs->buf2;
1038     size_t sm2sigsize;
1039     int ret, count;
1040     EVP_PKEY **sm2_pkey = tempargs->sm2_pkey;
1041     const size_t max_size = EVP_PKEY_get_size(sm2_pkey[testnum]);
1042
1043     for (count = 0; COND(sm2_c[testnum][0]); count++) {
1044         sm2sigsize = max_size;
1045
1046         if (!EVP_DigestSignInit(sm2ctx[testnum], NULL, EVP_sm3(),
1047                                 NULL, sm2_pkey[testnum])) {
1048             BIO_printf(bio_err, "SM2 init sign failure\n");
1049             ERR_print_errors(bio_err);
1050             count = -1;
1051             break;
1052         }
1053         ret = EVP_DigestSign(sm2ctx[testnum], sm2sig, &sm2sigsize,
1054                              buf, 20);
1055         if (ret == 0) {
1056             BIO_printf(bio_err, "SM2 sign failure\n");
1057             ERR_print_errors(bio_err);
1058             count = -1;
1059             break;
1060         }
1061         /* update the latest returned size and always use the fixed buffer size */
1062         tempargs->sigsize = sm2sigsize;
1063     }
1064
1065     return count;
1066 }
1067
1068 static int SM2_verify_loop(void *args)
1069 {
1070     loopargs_t *tempargs = *(loopargs_t **) args;
1071     unsigned char *buf = tempargs->buf;
1072     EVP_MD_CTX **sm2ctx = tempargs->sm2_vfy_ctx;
1073     unsigned char *sm2sig = tempargs->buf2;
1074     size_t sm2sigsize = tempargs->sigsize;
1075     int ret, count;
1076     EVP_PKEY **sm2_pkey = tempargs->sm2_pkey;
1077
1078     for (count = 0; COND(sm2_c[testnum][1]); count++) {
1079         if (!EVP_DigestVerifyInit(sm2ctx[testnum], NULL, EVP_sm3(),
1080                                   NULL, sm2_pkey[testnum])) {
1081             BIO_printf(bio_err, "SM2 verify init failure\n");
1082             ERR_print_errors(bio_err);
1083             count = -1;
1084             break;
1085         }
1086         ret = EVP_DigestVerify(sm2ctx[testnum], sm2sig, sm2sigsize,
1087                                buf, 20);
1088         if (ret != 1) {
1089             BIO_printf(bio_err, "SM2 verify failure\n");
1090             ERR_print_errors(bio_err);
1091             count = -1;
1092             break;
1093         }
1094     }
1095     return count;
1096 }
1097 #endif                         /* OPENSSL_NO_SM2 */
1098
1099 static int run_benchmark(int async_jobs,
1100                          int (*loop_function) (void *), loopargs_t * loopargs)
1101 {
1102     int job_op_count = 0;
1103     int total_op_count = 0;
1104     int num_inprogress = 0;
1105     int error = 0, i = 0, ret = 0;
1106     OSSL_ASYNC_FD job_fd = 0;
1107     size_t num_job_fds = 0;
1108
1109     if (async_jobs == 0) {
1110         return loop_function((void *)&loopargs);
1111     }
1112
1113     for (i = 0; i < async_jobs && !error; i++) {
1114         loopargs_t *looparg_item = loopargs + i;
1115
1116         /* Copy pointer content (looparg_t item address) into async context */
1117         ret = ASYNC_start_job(&loopargs[i].inprogress_job, loopargs[i].wait_ctx,
1118                               &job_op_count, loop_function,
1119                               (void *)&looparg_item, sizeof(looparg_item));
1120         switch (ret) {
1121         case ASYNC_PAUSE:
1122             ++num_inprogress;
1123             break;
1124         case ASYNC_FINISH:
1125             if (job_op_count == -1) {
1126                 error = 1;
1127             } else {
1128                 total_op_count += job_op_count;
1129             }
1130             break;
1131         case ASYNC_NO_JOBS:
1132         case ASYNC_ERR:
1133             BIO_printf(bio_err, "Failure in the job\n");
1134             ERR_print_errors(bio_err);
1135             error = 1;
1136             break;
1137         }
1138     }
1139
1140     while (num_inprogress > 0) {
1141 #if defined(OPENSSL_SYS_WINDOWS)
1142         DWORD avail = 0;
1143 #elif defined(OPENSSL_SYS_UNIX)
1144         int select_result = 0;
1145         OSSL_ASYNC_FD max_fd = 0;
1146         fd_set waitfdset;
1147
1148         FD_ZERO(&waitfdset);
1149
1150         for (i = 0; i < async_jobs && num_inprogress > 0; i++) {
1151             if (loopargs[i].inprogress_job == NULL)
1152                 continue;
1153
1154             if (!ASYNC_WAIT_CTX_get_all_fds
1155                 (loopargs[i].wait_ctx, NULL, &num_job_fds)
1156                 || num_job_fds > 1) {
1157                 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1158                 ERR_print_errors(bio_err);
1159                 error = 1;
1160                 break;
1161             }
1162             ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd,
1163                                        &num_job_fds);
1164             FD_SET(job_fd, &waitfdset);
1165             if (job_fd > max_fd)
1166                 max_fd = job_fd;
1167         }
1168
1169         if (max_fd >= (OSSL_ASYNC_FD)FD_SETSIZE) {
1170             BIO_printf(bio_err,
1171                        "Error: max_fd (%d) must be smaller than FD_SETSIZE (%d). "
1172                        "Decrease the value of async_jobs\n",
1173                        max_fd, FD_SETSIZE);
1174             ERR_print_errors(bio_err);
1175             error = 1;
1176             break;
1177         }
1178
1179         select_result = select(max_fd + 1, &waitfdset, NULL, NULL, NULL);
1180         if (select_result == -1 && errno == EINTR)
1181             continue;
1182
1183         if (select_result == -1) {
1184             BIO_printf(bio_err, "Failure in the select\n");
1185             ERR_print_errors(bio_err);
1186             error = 1;
1187             break;
1188         }
1189
1190         if (select_result == 0)
1191             continue;
1192 #endif
1193
1194         for (i = 0; i < async_jobs; i++) {
1195             if (loopargs[i].inprogress_job == NULL)
1196                 continue;
1197
1198             if (!ASYNC_WAIT_CTX_get_all_fds
1199                 (loopargs[i].wait_ctx, NULL, &num_job_fds)
1200                 || num_job_fds > 1) {
1201                 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1202                 ERR_print_errors(bio_err);
1203                 error = 1;
1204                 break;
1205             }
1206             ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd,
1207                                        &num_job_fds);
1208
1209 #if defined(OPENSSL_SYS_UNIX)
1210             if (num_job_fds == 1 && !FD_ISSET(job_fd, &waitfdset))
1211                 continue;
1212 #elif defined(OPENSSL_SYS_WINDOWS)
1213             if (num_job_fds == 1
1214                 && !PeekNamedPipe(job_fd, NULL, 0, NULL, &avail, NULL)
1215                 && avail > 0)
1216                 continue;
1217 #endif
1218
1219             ret = ASYNC_start_job(&loopargs[i].inprogress_job,
1220                                   loopargs[i].wait_ctx, &job_op_count,
1221                                   loop_function, (void *)(loopargs + i),
1222                                   sizeof(loopargs_t));
1223             switch (ret) {
1224             case ASYNC_PAUSE:
1225                 break;
1226             case ASYNC_FINISH:
1227                 if (job_op_count == -1) {
1228                     error = 1;
1229                 } else {
1230                     total_op_count += job_op_count;
1231                 }
1232                 --num_inprogress;
1233                 loopargs[i].inprogress_job = NULL;
1234                 break;
1235             case ASYNC_NO_JOBS:
1236             case ASYNC_ERR:
1237                 --num_inprogress;
1238                 loopargs[i].inprogress_job = NULL;
1239                 BIO_printf(bio_err, "Failure in the job\n");
1240                 ERR_print_errors(bio_err);
1241                 error = 1;
1242                 break;
1243             }
1244         }
1245     }
1246
1247     return error ? -1 : total_op_count;
1248 }
1249
1250 typedef struct ec_curve_st {
1251     const char *name;
1252     unsigned int nid;
1253     unsigned int bits;
1254     size_t sigsize; /* only used for EdDSA curves */
1255 } EC_CURVE;
1256
1257 static EVP_PKEY *get_ecdsa(const EC_CURVE *curve)
1258 {
1259     EVP_PKEY_CTX *kctx = NULL;
1260     EVP_PKEY *key = NULL;
1261
1262     /* Ensure that the error queue is empty */
1263     if (ERR_peek_error()) {
1264         BIO_printf(bio_err,
1265                    "WARNING: the error queue contains previous unhandled errors.\n");
1266         ERR_print_errors(bio_err);
1267     }
1268
1269     /*
1270      * Let's try to create a ctx directly from the NID: this works for
1271      * curves like Curve25519 that are not implemented through the low
1272      * level EC interface.
1273      * If this fails we try creating a EVP_PKEY_EC generic param ctx,
1274      * then we set the curve by NID before deriving the actual keygen
1275      * ctx for that specific curve.
1276      */
1277     kctx = EVP_PKEY_CTX_new_id(curve->nid, NULL);
1278     if (kctx == NULL) {
1279         EVP_PKEY_CTX *pctx = NULL;
1280         EVP_PKEY *params = NULL;
1281         /*
1282          * If we reach this code EVP_PKEY_CTX_new_id() failed and a
1283          * "int_ctx_new:unsupported algorithm" error was added to the
1284          * error queue.
1285          * We remove it from the error queue as we are handling it.
1286          */
1287         unsigned long error = ERR_peek_error();
1288
1289         if (error == ERR_peek_last_error() /* oldest and latest errors match */
1290             /* check that the error origin matches */
1291             && ERR_GET_LIB(error) == ERR_LIB_EVP
1292             && (ERR_GET_REASON(error) == EVP_R_UNSUPPORTED_ALGORITHM
1293                 || ERR_GET_REASON(error) == ERR_R_UNSUPPORTED))
1294             ERR_get_error(); /* pop error from queue */
1295         if (ERR_peek_error()) {
1296             BIO_printf(bio_err,
1297                        "Unhandled error in the error queue during EC key setup.\n");
1298             ERR_print_errors(bio_err);
1299             return NULL;
1300         }
1301
1302         /* Create the context for parameter generation */
1303         if ((pctx = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL)) == NULL
1304             || EVP_PKEY_paramgen_init(pctx) <= 0
1305             || EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx,
1306                                                       curve->nid) <= 0
1307             || EVP_PKEY_paramgen(pctx, &params) <= 0) {
1308             BIO_printf(bio_err, "EC params init failure.\n");
1309             ERR_print_errors(bio_err);
1310             EVP_PKEY_CTX_free(pctx);
1311             return NULL;
1312         }
1313         EVP_PKEY_CTX_free(pctx);
1314
1315         /* Create the context for the key generation */
1316         kctx = EVP_PKEY_CTX_new(params, NULL);
1317         EVP_PKEY_free(params);
1318     }
1319     if (kctx == NULL
1320         || EVP_PKEY_keygen_init(kctx) <= 0
1321         || EVP_PKEY_keygen(kctx, &key) <= 0) {
1322         BIO_printf(bio_err, "EC key generation failure.\n");
1323         ERR_print_errors(bio_err);
1324         key = NULL;
1325     }
1326     EVP_PKEY_CTX_free(kctx);
1327     return key;
1328 }
1329
1330 #define stop_it(do_it, test_num)\
1331     memset(do_it + test_num, 0, OSSL_NELEM(do_it) - test_num);
1332
1333 int speed_main(int argc, char **argv)
1334 {
1335     ENGINE *e = NULL;
1336     loopargs_t *loopargs = NULL;
1337     const char *prog;
1338     const char *engine_id = NULL;
1339     EVP_CIPHER *evp_cipher = NULL;
1340     double d = 0.0;
1341     OPTION_CHOICE o;
1342     int async_init = 0, multiblock = 0, pr_header = 0;
1343     uint8_t doit[ALGOR_NUM] = { 0 };
1344     int ret = 1, misalign = 0, lengths_single = 0, aead = 0;
1345     long count = 0;
1346     unsigned int size_num = SIZE_NUM;
1347     unsigned int i, k, loopargs_len = 0, async_jobs = 0;
1348     int keylen;
1349     int buflen;
1350     BIGNUM *bn = NULL;
1351     EVP_PKEY_CTX *genctx = NULL;
1352 #ifndef NO_FORK
1353     int multi = 0;
1354 #endif
1355     long op_count = 1;
1356     openssl_speed_sec_t seconds = { SECONDS, RSA_SECONDS, DSA_SECONDS,
1357                                     ECDSA_SECONDS, ECDH_SECONDS,
1358                                     EdDSA_SECONDS, SM2_SECONDS,
1359                                     FFDH_SECONDS };
1360
1361     static const unsigned char key32[32] = {
1362         0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1363         0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1364         0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
1365         0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
1366     };
1367     static const unsigned char deskey[] = {
1368         0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, /* key1 */
1369         0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, /* key2 */
1370         0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34  /* key3 */
1371     };
1372     static const struct {
1373         const unsigned char *data;
1374         unsigned int length;
1375         unsigned int bits;
1376     } rsa_keys[] = {
1377         {   test512,   sizeof(test512),   512 },
1378         {  test1024,  sizeof(test1024),  1024 },
1379         {  test2048,  sizeof(test2048),  2048 },
1380         {  test3072,  sizeof(test3072),  3072 },
1381         {  test4096,  sizeof(test4096),  4096 },
1382         {  test7680,  sizeof(test7680),  7680 },
1383         { test15360, sizeof(test15360), 15360 }
1384     };
1385     uint8_t rsa_doit[RSA_NUM] = { 0 };
1386     int primes = RSA_DEFAULT_PRIME_NUM;
1387 #ifndef OPENSSL_NO_DH
1388     typedef struct ffdh_params_st {
1389         const char *name;
1390         unsigned int nid;
1391         unsigned int bits;
1392     } FFDH_PARAMS;
1393
1394     static const FFDH_PARAMS ffdh_params[FFDH_NUM] = {
1395         {"ffdh2048", NID_ffdhe2048, 2048},
1396         {"ffdh3072", NID_ffdhe3072, 3072},
1397         {"ffdh4096", NID_ffdhe4096, 4096},
1398         {"ffdh6144", NID_ffdhe6144, 6144},
1399         {"ffdh8192", NID_ffdhe8192, 8192}
1400     };
1401     uint8_t ffdh_doit[FFDH_NUM] = { 0 };
1402
1403 #endif /* OPENSSL_NO_DH */
1404     static const unsigned int dsa_bits[DSA_NUM] = { 512, 1024, 2048 };
1405     uint8_t dsa_doit[DSA_NUM] = { 0 };
1406     /*
1407      * We only test over the following curves as they are representative, To
1408      * add tests over more curves, simply add the curve NID and curve name to
1409      * the following arrays and increase the |ecdh_choices| and |ecdsa_choices|
1410      * lists accordingly.
1411      */
1412     static const EC_CURVE ec_curves[EC_NUM] = {
1413         /* Prime Curves */
1414         {"secp160r1", NID_secp160r1, 160},
1415         {"nistp192", NID_X9_62_prime192v1, 192},
1416         {"nistp224", NID_secp224r1, 224},
1417         {"nistp256", NID_X9_62_prime256v1, 256},
1418         {"nistp384", NID_secp384r1, 384},
1419         {"nistp521", NID_secp521r1, 521},
1420 #ifndef OPENSSL_NO_EC2M
1421         /* Binary Curves */
1422         {"nistk163", NID_sect163k1, 163},
1423         {"nistk233", NID_sect233k1, 233},
1424         {"nistk283", NID_sect283k1, 283},
1425         {"nistk409", NID_sect409k1, 409},
1426         {"nistk571", NID_sect571k1, 571},
1427         {"nistb163", NID_sect163r2, 163},
1428         {"nistb233", NID_sect233r1, 233},
1429         {"nistb283", NID_sect283r1, 283},
1430         {"nistb409", NID_sect409r1, 409},
1431         {"nistb571", NID_sect571r1, 571},
1432 #endif
1433         {"brainpoolP256r1", NID_brainpoolP256r1, 256},
1434         {"brainpoolP256t1", NID_brainpoolP256t1, 256},
1435         {"brainpoolP384r1", NID_brainpoolP384r1, 384},
1436         {"brainpoolP384t1", NID_brainpoolP384t1, 384},
1437         {"brainpoolP512r1", NID_brainpoolP512r1, 512},
1438         {"brainpoolP512t1", NID_brainpoolP512t1, 512},
1439         /* Other and ECDH only ones */
1440         {"X25519", NID_X25519, 253},
1441         {"X448", NID_X448, 448}
1442     };
1443     static const EC_CURVE ed_curves[EdDSA_NUM] = {
1444         /* EdDSA */
1445         {"Ed25519", NID_ED25519, 253, 64},
1446         {"Ed448", NID_ED448, 456, 114}
1447     };
1448 #ifndef OPENSSL_NO_SM2
1449     static const EC_CURVE sm2_curves[SM2_NUM] = {
1450         /* SM2 */
1451         {"CurveSM2", NID_sm2, 256}
1452     };
1453     uint8_t sm2_doit[SM2_NUM] = { 0 };
1454 #endif
1455     uint8_t ecdsa_doit[ECDSA_NUM] = { 0 };
1456     uint8_t ecdh_doit[EC_NUM] = { 0 };
1457     uint8_t eddsa_doit[EdDSA_NUM] = { 0 };
1458
1459     /* checks declarated curves against choices list. */
1460     OPENSSL_assert(ed_curves[EdDSA_NUM - 1].nid == NID_ED448);
1461     OPENSSL_assert(strcmp(eddsa_choices[EdDSA_NUM - 1].name, "ed448") == 0);
1462
1463     OPENSSL_assert(ec_curves[EC_NUM - 1].nid == NID_X448);
1464     OPENSSL_assert(strcmp(ecdh_choices[EC_NUM - 1].name, "ecdhx448") == 0);
1465
1466     OPENSSL_assert(ec_curves[ECDSA_NUM - 1].nid == NID_brainpoolP512t1);
1467     OPENSSL_assert(strcmp(ecdsa_choices[ECDSA_NUM - 1].name, "ecdsabrp512t1") == 0);
1468
1469 #ifndef OPENSSL_NO_SM2
1470     OPENSSL_assert(sm2_curves[SM2_NUM - 1].nid == NID_sm2);
1471     OPENSSL_assert(strcmp(sm2_choices[SM2_NUM - 1].name, "curveSM2") == 0);
1472 #endif
1473
1474     prog = opt_init(argc, argv, speed_options);
1475     while ((o = opt_next()) != OPT_EOF) {
1476         switch (o) {
1477         case OPT_EOF:
1478         case OPT_ERR:
1479  opterr:
1480             BIO_printf(bio_err, "%s: Use -help for summary.\n", prog);
1481             goto end;
1482         case OPT_HELP:
1483             opt_help(speed_options);
1484             ret = 0;
1485             goto end;
1486         case OPT_ELAPSED:
1487             usertime = 0;
1488             break;
1489         case OPT_EVP:
1490             if (doit[D_EVP]) {
1491                 BIO_printf(bio_err, "%s: -evp option cannot be used more than once\n", prog);
1492                 goto opterr;
1493             }
1494             ERR_set_mark();
1495             if (!opt_cipher_silent(opt_arg(), &evp_cipher)) {
1496                 if (have_md(opt_arg()))
1497                     evp_md_name = opt_arg();
1498             }
1499             if (evp_cipher == NULL && evp_md_name == NULL) {
1500                 ERR_clear_last_mark();
1501                 BIO_printf(bio_err,
1502                            "%s: %s is an unknown cipher or digest\n",
1503                            prog, opt_arg());
1504                 goto end;
1505             }
1506             ERR_pop_to_mark();
1507             doit[D_EVP] = 1;
1508             break;
1509         case OPT_HMAC:
1510             if (!have_md(opt_arg())) {
1511                 BIO_printf(bio_err, "%s: %s is an unknown digest\n",
1512                            prog, opt_arg());
1513                 goto end;
1514             }
1515             evp_mac_mdname = opt_arg();
1516             doit[D_HMAC] = 1;
1517             break;
1518         case OPT_CMAC:
1519             if (!have_cipher(opt_arg())) {
1520                 BIO_printf(bio_err, "%s: %s is an unknown cipher\n",
1521                            prog, opt_arg());
1522                 goto end;
1523             }
1524             evp_mac_ciphername = opt_arg();
1525             doit[D_EVP_CMAC] = 1;
1526             break;
1527         case OPT_DECRYPT:
1528             decrypt = 1;
1529             break;
1530         case OPT_ENGINE:
1531             /*
1532              * In a forked execution, an engine might need to be
1533              * initialised by each child process, not by the parent.
1534              * So store the name here and run setup_engine() later on.
1535              */
1536             engine_id = opt_arg();
1537             break;
1538         case OPT_MULTI:
1539 #ifndef NO_FORK
1540             multi = atoi(opt_arg());
1541 #endif
1542             break;
1543         case OPT_ASYNCJOBS:
1544 #ifndef OPENSSL_NO_ASYNC
1545             async_jobs = atoi(opt_arg());
1546             if (!ASYNC_is_capable()) {
1547                 BIO_printf(bio_err,
1548                            "%s: async_jobs specified but async not supported\n",
1549                            prog);
1550                 goto opterr;
1551             }
1552             if (async_jobs > 99999) {
1553                 BIO_printf(bio_err, "%s: too many async_jobs\n", prog);
1554                 goto opterr;
1555             }
1556 #endif
1557             break;
1558         case OPT_MISALIGN:
1559             misalign = opt_int_arg();
1560             if (misalign > MISALIGN) {
1561                 BIO_printf(bio_err,
1562                            "%s: Maximum offset is %d\n", prog, MISALIGN);
1563                 goto opterr;
1564             }
1565             break;
1566         case OPT_MR:
1567             mr = 1;
1568             break;
1569         case OPT_MB:
1570             multiblock = 1;
1571 #ifdef OPENSSL_NO_MULTIBLOCK
1572             BIO_printf(bio_err,
1573                        "%s: -mb specified but multi-block support is disabled\n",
1574                        prog);
1575             goto end;
1576 #endif
1577             break;
1578         case OPT_R_CASES:
1579             if (!opt_rand(o))
1580                 goto end;
1581             break;
1582         case OPT_PROV_CASES:
1583             if (!opt_provider(o))
1584                 goto end;
1585             break;
1586         case OPT_PRIMES:
1587             primes = opt_int_arg();
1588             break;
1589         case OPT_SECONDS:
1590             seconds.sym = seconds.rsa = seconds.dsa = seconds.ecdsa
1591                         = seconds.ecdh = seconds.eddsa
1592                         = seconds.sm2 = seconds.ffdh = atoi(opt_arg());
1593             break;
1594         case OPT_BYTES:
1595             lengths_single = atoi(opt_arg());
1596             lengths = &lengths_single;
1597             size_num = 1;
1598             break;
1599         case OPT_AEAD:
1600             aead = 1;
1601             break;
1602         }
1603     }
1604
1605     /* Remaining arguments are algorithms. */
1606     argc = opt_num_rest();
1607     argv = opt_rest();
1608
1609     if (!app_RAND_load())
1610         goto end;
1611
1612     for (; *argv; argv++) {
1613         const char *algo = *argv;
1614
1615         if (opt_found(algo, doit_choices, &i)) {
1616             doit[i] = 1;
1617             continue;
1618         }
1619         if (strcmp(algo, "des") == 0) {
1620             doit[D_CBC_DES] = doit[D_EDE3_DES] = 1;
1621             continue;
1622         }
1623         if (strcmp(algo, "sha") == 0) {
1624             doit[D_SHA1] = doit[D_SHA256] = doit[D_SHA512] = 1;
1625             continue;
1626         }
1627 #ifndef OPENSSL_NO_DEPRECATED_3_0
1628         if (strcmp(algo, "openssl") == 0) /* just for compatibility */
1629             continue;
1630 #endif
1631         if (strncmp(algo, "rsa", 3) == 0) {
1632             if (algo[3] == '\0') {
1633                 memset(rsa_doit, 1, sizeof(rsa_doit));
1634                 continue;
1635             }
1636             if (opt_found(algo, rsa_choices, &i)) {
1637                 rsa_doit[i] = 1;
1638                 continue;
1639             }
1640         }
1641 #ifndef OPENSSL_NO_DH
1642         if (strncmp(algo, "ffdh", 4) == 0) {
1643             if (algo[4] == '\0') {
1644                 memset(ffdh_doit, 1, sizeof(ffdh_doit));
1645                 continue;
1646             }
1647             if (opt_found(algo, ffdh_choices, &i)) {
1648                 ffdh_doit[i] = 2;
1649                 continue;
1650             }
1651         }
1652 #endif
1653         if (strncmp(algo, "dsa", 3) == 0) {
1654             if (algo[3] == '\0') {
1655                 memset(dsa_doit, 1, sizeof(dsa_doit));
1656                 continue;
1657             }
1658             if (opt_found(algo, dsa_choices, &i)) {
1659                 dsa_doit[i] = 2;
1660                 continue;
1661             }
1662         }
1663         if (strcmp(algo, "aes") == 0) {
1664             doit[D_CBC_128_AES] = doit[D_CBC_192_AES] = doit[D_CBC_256_AES] = 1;
1665             continue;
1666         }
1667         if (strcmp(algo, "camellia") == 0) {
1668             doit[D_CBC_128_CML] = doit[D_CBC_192_CML] = doit[D_CBC_256_CML] = 1;
1669             continue;
1670         }
1671         if (strncmp(algo, "ecdsa", 5) == 0) {
1672             if (algo[5] == '\0') {
1673                 memset(ecdsa_doit, 1, sizeof(ecdsa_doit));
1674                 continue;
1675             }
1676             if (opt_found(algo, ecdsa_choices, &i)) {
1677                 ecdsa_doit[i] = 2;
1678                 continue;
1679             }
1680         }
1681         if (strncmp(algo, "ecdh", 4) == 0) {
1682             if (algo[4] == '\0') {
1683                 memset(ecdh_doit, 1, sizeof(ecdh_doit));
1684                 continue;
1685             }
1686             if (opt_found(algo, ecdh_choices, &i)) {
1687                 ecdh_doit[i] = 2;
1688                 continue;
1689             }
1690         }
1691         if (strcmp(algo, "eddsa") == 0) {
1692             memset(eddsa_doit, 1, sizeof(eddsa_doit));
1693             continue;
1694         }
1695         if (opt_found(algo, eddsa_choices, &i)) {
1696             eddsa_doit[i] = 2;
1697             continue;
1698         }
1699 #ifndef OPENSSL_NO_SM2
1700         if (strcmp(algo, "sm2") == 0) {
1701             memset(sm2_doit, 1, sizeof(sm2_doit));
1702             continue;
1703         }
1704         if (opt_found(algo, sm2_choices, &i)) {
1705             sm2_doit[i] = 2;
1706             continue;
1707         }
1708 #endif
1709         BIO_printf(bio_err, "%s: Unknown algorithm %s\n", prog, algo);
1710         goto end;
1711     }
1712
1713     /* Sanity checks */
1714     if (aead) {
1715         if (evp_cipher == NULL) {
1716             BIO_printf(bio_err, "-aead can be used only with an AEAD cipher\n");
1717             goto end;
1718         } else if (!(EVP_CIPHER_get_flags(evp_cipher) &
1719                      EVP_CIPH_FLAG_AEAD_CIPHER)) {
1720             BIO_printf(bio_err, "%s is not an AEAD cipher\n",
1721                        EVP_CIPHER_get0_name(evp_cipher));
1722             goto end;
1723         }
1724     }
1725     if (multiblock) {
1726         if (evp_cipher == NULL) {
1727             BIO_printf(bio_err, "-mb can be used only with a multi-block"
1728                                 " capable cipher\n");
1729             goto end;
1730         } else if (!(EVP_CIPHER_get_flags(evp_cipher) &
1731                      EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) {
1732             BIO_printf(bio_err, "%s is not a multi-block capable\n",
1733                        EVP_CIPHER_get0_name(evp_cipher));
1734             goto end;
1735         } else if (async_jobs > 0) {
1736             BIO_printf(bio_err, "Async mode is not supported with -mb");
1737             goto end;
1738         }
1739     }
1740
1741     /* Initialize the job pool if async mode is enabled */
1742     if (async_jobs > 0) {
1743         async_init = ASYNC_init_thread(async_jobs, async_jobs);
1744         if (!async_init) {
1745             BIO_printf(bio_err, "Error creating the ASYNC job pool\n");
1746             goto end;
1747         }
1748     }
1749
1750     loopargs_len = (async_jobs == 0 ? 1 : async_jobs);
1751     loopargs =
1752         app_malloc(loopargs_len * sizeof(loopargs_t), "array of loopargs");
1753     memset(loopargs, 0, loopargs_len * sizeof(loopargs_t));
1754
1755     for (i = 0; i < loopargs_len; i++) {
1756         if (async_jobs > 0) {
1757             loopargs[i].wait_ctx = ASYNC_WAIT_CTX_new();
1758             if (loopargs[i].wait_ctx == NULL) {
1759                 BIO_printf(bio_err, "Error creating the ASYNC_WAIT_CTX\n");
1760                 goto end;
1761             }
1762         }
1763
1764         buflen = lengths[size_num - 1];
1765         if (buflen < 36)    /* size of random vector in RSA benchmark */
1766             buflen = 36;
1767         buflen += MAX_MISALIGNMENT + 1;
1768         loopargs[i].buf_malloc = app_malloc(buflen, "input buffer");
1769         loopargs[i].buf2_malloc = app_malloc(buflen, "input buffer");
1770         memset(loopargs[i].buf_malloc, 0, buflen);
1771         memset(loopargs[i].buf2_malloc, 0, buflen);
1772
1773         /* Align the start of buffers on a 64 byte boundary */
1774         loopargs[i].buf = loopargs[i].buf_malloc + misalign;
1775         loopargs[i].buf2 = loopargs[i].buf2_malloc + misalign;
1776         loopargs[i].secret_a = app_malloc(MAX_ECDH_SIZE, "ECDH secret a");
1777         loopargs[i].secret_b = app_malloc(MAX_ECDH_SIZE, "ECDH secret b");
1778 #ifndef OPENSSL_NO_DH
1779         loopargs[i].secret_ff_a = app_malloc(MAX_FFDH_SIZE, "FFDH secret a");
1780         loopargs[i].secret_ff_b = app_malloc(MAX_FFDH_SIZE, "FFDH secret b");
1781 #endif
1782     }
1783
1784 #ifndef NO_FORK
1785     if (multi && do_multi(multi, size_num))
1786         goto show_res;
1787 #endif
1788
1789     /* Initialize the engine after the fork */
1790     e = setup_engine(engine_id, 0);
1791
1792     /* No parameters; turn on everything. */
1793     if (argc == 0 && !doit[D_EVP] && !doit[D_HMAC] && !doit[D_EVP_CMAC]) {
1794         EVP_MAC *mac;
1795
1796         memset(doit, 1, sizeof(doit));
1797         doit[D_EVP] = doit[D_EVP_CMAC] = 0;
1798         ERR_set_mark();
1799         for (i = D_MD2; i <= D_WHIRLPOOL; i++) {
1800             if (!have_md(names[i]))
1801                 doit[i] = 0;
1802         }
1803         for (i = D_CBC_DES; i <= D_CBC_256_CML; i++) {
1804             if (!have_cipher(names[i]))
1805                 doit[i] = 0;
1806         }
1807         if ((mac = EVP_MAC_fetch(NULL, "GMAC", NULL)) != NULL)
1808             EVP_MAC_free(mac);
1809         else
1810             doit[D_GHASH] = 0;
1811         if ((mac = EVP_MAC_fetch(NULL, "HMAC", NULL)) != NULL)
1812             EVP_MAC_free(mac);
1813         else
1814             doit[D_HMAC] = 0;
1815         ERR_pop_to_mark();
1816         memset(rsa_doit, 1, sizeof(rsa_doit));
1817 #ifndef OPENSSL_NO_DH
1818         memset(ffdh_doit, 1, sizeof(ffdh_doit));
1819 #endif
1820         memset(dsa_doit, 1, sizeof(dsa_doit));
1821         memset(ecdsa_doit, 1, sizeof(ecdsa_doit));
1822         memset(ecdh_doit, 1, sizeof(ecdh_doit));
1823         memset(eddsa_doit, 1, sizeof(eddsa_doit));
1824 #ifndef OPENSSL_NO_SM2
1825         memset(sm2_doit, 1, sizeof(sm2_doit));
1826 #endif
1827     }
1828     for (i = 0; i < ALGOR_NUM; i++)
1829         if (doit[i])
1830             pr_header++;
1831
1832     if (usertime == 0 && !mr)
1833         BIO_printf(bio_err,
1834                    "You have chosen to measure elapsed time "
1835                    "instead of user CPU time.\n");
1836
1837 #if SIGALRM > 0
1838     signal(SIGALRM, alarmed);
1839 #endif
1840
1841     if (doit[D_MD2]) {
1842         for (testnum = 0; testnum < size_num; testnum++) {
1843             print_message(names[D_MD2], c[D_MD2][testnum], lengths[testnum],
1844                           seconds.sym);
1845             Time_F(START);
1846             count = run_benchmark(async_jobs, EVP_Digest_MD2_loop, loopargs);
1847             d = Time_F(STOP);
1848             print_result(D_MD2, testnum, count, d);
1849             if (count < 0)
1850                 break;
1851         }
1852     }
1853
1854     if (doit[D_MDC2]) {
1855         for (testnum = 0; testnum < size_num; testnum++) {
1856             print_message(names[D_MDC2], c[D_MDC2][testnum], lengths[testnum],
1857                           seconds.sym);
1858             Time_F(START);
1859             count = run_benchmark(async_jobs, EVP_Digest_MDC2_loop, loopargs);
1860             d = Time_F(STOP);
1861             print_result(D_MDC2, testnum, count, d);
1862             if (count < 0)
1863                 break;
1864         }
1865     }
1866
1867     if (doit[D_MD4]) {
1868         for (testnum = 0; testnum < size_num; testnum++) {
1869             print_message(names[D_MD4], c[D_MD4][testnum], lengths[testnum],
1870                           seconds.sym);
1871             Time_F(START);
1872             count = run_benchmark(async_jobs, EVP_Digest_MD4_loop, loopargs);
1873             d = Time_F(STOP);
1874             print_result(D_MD4, testnum, count, d);
1875             if (count < 0)
1876                 break;
1877         }
1878     }
1879
1880     if (doit[D_MD5]) {
1881         for (testnum = 0; testnum < size_num; testnum++) {
1882             print_message(names[D_MD5], c[D_MD5][testnum], lengths[testnum],
1883                           seconds.sym);
1884             Time_F(START);
1885             count = run_benchmark(async_jobs, MD5_loop, loopargs);
1886             d = Time_F(STOP);
1887             print_result(D_MD5, testnum, count, d);
1888             if (count < 0)
1889                 break;
1890         }
1891     }
1892
1893     if (doit[D_SHA1]) {
1894         for (testnum = 0; testnum < size_num; testnum++) {
1895             print_message(names[D_SHA1], c[D_SHA1][testnum], lengths[testnum],
1896                           seconds.sym);
1897             Time_F(START);
1898             count = run_benchmark(async_jobs, SHA1_loop, loopargs);
1899             d = Time_F(STOP);
1900             print_result(D_SHA1, testnum, count, d);
1901             if (count < 0)
1902                 break;
1903         }
1904     }
1905
1906     if (doit[D_SHA256]) {
1907         for (testnum = 0; testnum < size_num; testnum++) {
1908             print_message(names[D_SHA256], c[D_SHA256][testnum],
1909                           lengths[testnum], seconds.sym);
1910             Time_F(START);
1911             count = run_benchmark(async_jobs, SHA256_loop, loopargs);
1912             d = Time_F(STOP);
1913             print_result(D_SHA256, testnum, count, d);
1914             if (count < 0)
1915                 break;
1916         }
1917     }
1918
1919     if (doit[D_SHA512]) {
1920         for (testnum = 0; testnum < size_num; testnum++) {
1921             print_message(names[D_SHA512], c[D_SHA512][testnum],
1922                           lengths[testnum], seconds.sym);
1923             Time_F(START);
1924             count = run_benchmark(async_jobs, SHA512_loop, loopargs);
1925             d = Time_F(STOP);
1926             print_result(D_SHA512, testnum, count, d);
1927             if (count < 0)
1928                 break;
1929         }
1930     }
1931
1932     if (doit[D_WHIRLPOOL]) {
1933         for (testnum = 0; testnum < size_num; testnum++) {
1934             print_message(names[D_WHIRLPOOL], c[D_WHIRLPOOL][testnum],
1935                           lengths[testnum], seconds.sym);
1936             Time_F(START);
1937             count = run_benchmark(async_jobs, WHIRLPOOL_loop, loopargs);
1938             d = Time_F(STOP);
1939             print_result(D_WHIRLPOOL, testnum, count, d);
1940             if (count < 0)
1941                 break;
1942         }
1943     }
1944
1945     if (doit[D_RMD160]) {
1946         for (testnum = 0; testnum < size_num; testnum++) {
1947             print_message(names[D_RMD160], c[D_RMD160][testnum],
1948                           lengths[testnum], seconds.sym);
1949             Time_F(START);
1950             count = run_benchmark(async_jobs, EVP_Digest_RMD160_loop, loopargs);
1951             d = Time_F(STOP);
1952             print_result(D_RMD160, testnum, count, d);
1953             if (count < 0)
1954                 break;
1955         }
1956     }
1957
1958     if (doit[D_HMAC]) {
1959         static const char hmac_key[] = "This is a key...";
1960         int len = strlen(hmac_key);
1961         EVP_MAC *mac = EVP_MAC_fetch(NULL, "HMAC", NULL);
1962         OSSL_PARAM params[3];
1963
1964         if (mac == NULL || evp_mac_mdname == NULL)
1965             goto end;
1966
1967         evp_hmac_name = app_malloc(sizeof("hmac()") + strlen(evp_mac_mdname),
1968                                    "HMAC name");
1969         sprintf(evp_hmac_name, "hmac(%s)", evp_mac_mdname);
1970         names[D_HMAC] = evp_hmac_name;
1971
1972         params[0] =
1973             OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
1974                                              evp_mac_mdname, 0);
1975         params[1] =
1976             OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_KEY,
1977                                               (char *)hmac_key, len);
1978         params[2] = OSSL_PARAM_construct_end();
1979
1980         for (i = 0; i < loopargs_len; i++) {
1981             loopargs[i].mctx = EVP_MAC_CTX_new(mac);
1982             if (loopargs[i].mctx == NULL)
1983                 goto end;
1984
1985             if (!EVP_MAC_CTX_set_params(loopargs[i].mctx, params))
1986                 goto end;
1987         }
1988         for (testnum = 0; testnum < size_num; testnum++) {
1989             print_message(names[D_HMAC], c[D_HMAC][testnum], lengths[testnum],
1990                           seconds.sym);
1991             Time_F(START);
1992             count = run_benchmark(async_jobs, HMAC_loop, loopargs);
1993             d = Time_F(STOP);
1994             print_result(D_HMAC, testnum, count, d);
1995             if (count < 0)
1996                 break;
1997         }
1998         for (i = 0; i < loopargs_len; i++)
1999             EVP_MAC_CTX_free(loopargs[i].mctx);
2000         EVP_MAC_free(mac);
2001     }
2002
2003     if (doit[D_CBC_DES]) {
2004         int st = 1;
2005
2006         for (i = 0; st && i < loopargs_len; i++) {
2007             loopargs[i].ctx = init_evp_cipher_ctx("des-cbc", deskey,
2008                                                   sizeof(deskey) / 3);
2009             st = loopargs[i].ctx != NULL;
2010         }
2011         algindex = D_CBC_DES;
2012         for (testnum = 0; st && testnum < size_num; testnum++) {
2013             print_message(names[D_CBC_DES], c[D_CBC_DES][testnum],
2014                           lengths[testnum], seconds.sym);
2015             Time_F(START);
2016             count = run_benchmark(async_jobs, EVP_Cipher_loop, loopargs);
2017             d = Time_F(STOP);
2018             print_result(D_CBC_DES, testnum, count, d);
2019         }
2020         for (i = 0; i < loopargs_len; i++)
2021             EVP_CIPHER_CTX_free(loopargs[i].ctx);
2022     }
2023
2024     if (doit[D_EDE3_DES]) {
2025         int st = 1;
2026
2027         for (i = 0; st && i < loopargs_len; i++) {
2028             loopargs[i].ctx = init_evp_cipher_ctx("des-ede3-cbc", deskey,
2029                                                   sizeof(deskey));
2030             st = loopargs[i].ctx != NULL;
2031         }
2032         algindex = D_EDE3_DES;
2033         for (testnum = 0; st && testnum < size_num; testnum++) {
2034             print_message(names[D_EDE3_DES], c[D_EDE3_DES][testnum],
2035                           lengths[testnum], seconds.sym);
2036             Time_F(START);
2037             count =
2038                 run_benchmark(async_jobs, EVP_Cipher_loop, loopargs);
2039             d = Time_F(STOP);
2040             print_result(D_EDE3_DES, testnum, count, d);
2041         }
2042         for (i = 0; i < loopargs_len; i++)
2043             EVP_CIPHER_CTX_free(loopargs[i].ctx);
2044     }
2045
2046     for (k = 0; k < 3; k++) {
2047         algindex = D_CBC_128_AES + k;
2048         if (doit[algindex]) {
2049             int st = 1;
2050
2051             keylen = 16 + k * 8;
2052             for (i = 0; st && i < loopargs_len; i++) {
2053                 loopargs[i].ctx = init_evp_cipher_ctx(names[algindex],
2054                                                       key32, keylen);
2055                 st = loopargs[i].ctx != NULL;
2056             }
2057
2058             for (testnum = 0; st && testnum < size_num; testnum++) {
2059                 print_message(names[algindex], c[algindex][testnum],
2060                               lengths[testnum], seconds.sym);
2061                 Time_F(START);
2062                 count =
2063                     run_benchmark(async_jobs, EVP_Cipher_loop, loopargs);
2064                 d = Time_F(STOP);
2065                 print_result(algindex, testnum, count, d);
2066             }
2067             for (i = 0; i < loopargs_len; i++)
2068                 EVP_CIPHER_CTX_free(loopargs[i].ctx);
2069         }
2070     }
2071
2072     for (k = 0; k < 3; k++) {
2073         algindex = D_CBC_128_CML + k;
2074         if (doit[algindex]) {
2075             int st = 1;
2076
2077             keylen = 16 + k * 8;
2078             for (i = 0; st && i < loopargs_len; i++) {
2079                 loopargs[i].ctx = init_evp_cipher_ctx(names[algindex],
2080                                                       key32, keylen);
2081                 st = loopargs[i].ctx != NULL;
2082             }
2083
2084             for (testnum = 0; st && testnum < size_num; testnum++) {
2085                 print_message(names[algindex], c[algindex][testnum],
2086                               lengths[testnum], seconds.sym);
2087                 Time_F(START);
2088                 count =
2089                     run_benchmark(async_jobs, EVP_Cipher_loop, loopargs);
2090                 d = Time_F(STOP);
2091                 print_result(algindex, testnum, count, d);
2092             }
2093             for (i = 0; i < loopargs_len; i++)
2094                 EVP_CIPHER_CTX_free(loopargs[i].ctx);
2095         }
2096     }
2097
2098     for (algindex = D_RC4; algindex <= D_CBC_CAST; algindex++) {
2099         if (doit[algindex]) {
2100             int st = 1;
2101
2102             keylen = 16;
2103             for (i = 0; st && i < loopargs_len; i++) {
2104                 loopargs[i].ctx = init_evp_cipher_ctx(names[algindex],
2105                                                       key32, keylen);
2106                 st = loopargs[i].ctx != NULL;
2107             }
2108
2109             for (testnum = 0; st && testnum < size_num; testnum++) {
2110                 print_message(names[algindex], c[algindex][testnum],
2111                               lengths[testnum], seconds.sym);
2112                 Time_F(START);
2113                 count =
2114                     run_benchmark(async_jobs, EVP_Cipher_loop, loopargs);
2115                 d = Time_F(STOP);
2116                 print_result(algindex, testnum, count, d);
2117             }
2118             for (i = 0; i < loopargs_len; i++)
2119                 EVP_CIPHER_CTX_free(loopargs[i].ctx);
2120         }
2121     }
2122     if (doit[D_GHASH]) {
2123         static const char gmac_iv[] = "0123456789ab";
2124         EVP_MAC *mac = EVP_MAC_fetch(NULL, "GMAC", NULL);
2125         OSSL_PARAM params[3];
2126
2127         if (mac == NULL)
2128             goto end;
2129
2130         params[0] = OSSL_PARAM_construct_utf8_string(OSSL_ALG_PARAM_CIPHER,
2131                                                      "aes-128-gcm", 0);
2132         params[1] = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_IV,
2133                                                       (char *)gmac_iv,
2134                                                       sizeof(gmac_iv) - 1);
2135         params[2] = OSSL_PARAM_construct_end();
2136
2137         for (i = 0; i < loopargs_len; i++) {
2138             loopargs[i].mctx = EVP_MAC_CTX_new(mac);
2139             if (loopargs[i].mctx == NULL)
2140                 goto end;
2141
2142             if (!EVP_MAC_init(loopargs[i].mctx, key32, 16, params))
2143                 goto end;
2144         }
2145         for (testnum = 0; testnum < size_num; testnum++) {
2146             print_message(names[D_GHASH], c[D_GHASH][testnum], lengths[testnum],
2147                           seconds.sym);
2148             Time_F(START);
2149             count = run_benchmark(async_jobs, GHASH_loop, loopargs);
2150             d = Time_F(STOP);
2151             print_result(D_GHASH, testnum, count, d);
2152             if (count < 0)
2153                 break;
2154         }
2155         for (i = 0; i < loopargs_len; i++)
2156             EVP_MAC_CTX_free(loopargs[i].mctx);
2157         EVP_MAC_free(mac);
2158     }
2159
2160     if (doit[D_RAND]) {
2161         for (testnum = 0; testnum < size_num; testnum++) {
2162             print_message(names[D_RAND], c[D_RAND][testnum], lengths[testnum],
2163                           seconds.sym);
2164             Time_F(START);
2165             count = run_benchmark(async_jobs, RAND_bytes_loop, loopargs);
2166             d = Time_F(STOP);
2167             print_result(D_RAND, testnum, count, d);
2168         }
2169     }
2170
2171     if (doit[D_EVP]) {
2172         if (evp_cipher != NULL) {
2173             int (*loopfunc) (void *) = EVP_Update_loop;
2174
2175             if (multiblock && (EVP_CIPHER_get_flags(evp_cipher) &
2176                                EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) {
2177                 multiblock_speed(evp_cipher, lengths_single, &seconds);
2178                 ret = 0;
2179                 goto end;
2180             }
2181
2182             names[D_EVP] = EVP_CIPHER_get0_name(evp_cipher);
2183
2184             if (EVP_CIPHER_get_mode(evp_cipher) == EVP_CIPH_CCM_MODE) {
2185                 loopfunc = EVP_Update_loop_ccm;
2186             } else if (aead && (EVP_CIPHER_get_flags(evp_cipher) &
2187                                 EVP_CIPH_FLAG_AEAD_CIPHER)) {
2188                 loopfunc = EVP_Update_loop_aead;
2189                 if (lengths == lengths_list) {
2190                     lengths = aead_lengths_list;
2191                     size_num = OSSL_NELEM(aead_lengths_list);
2192                 }
2193             }
2194
2195             for (testnum = 0; testnum < size_num; testnum++) {
2196                 print_message(names[D_EVP], c[D_EVP][testnum], lengths[testnum],
2197                               seconds.sym);
2198
2199                 for (k = 0; k < loopargs_len; k++) {
2200                     loopargs[k].ctx = EVP_CIPHER_CTX_new();
2201                     if (loopargs[k].ctx == NULL) {
2202                         BIO_printf(bio_err, "\nEVP_CIPHER_CTX_new failure\n");
2203                         exit(1);
2204                     }
2205                     if (!EVP_CipherInit_ex(loopargs[k].ctx, evp_cipher, NULL,
2206                                            NULL, iv, decrypt ? 0 : 1)) {
2207                         BIO_printf(bio_err, "\nEVP_CipherInit_ex failure\n");
2208                         ERR_print_errors(bio_err);
2209                         exit(1);
2210                     }
2211
2212                     EVP_CIPHER_CTX_set_padding(loopargs[k].ctx, 0);
2213
2214                     keylen = EVP_CIPHER_CTX_get_key_length(loopargs[k].ctx);
2215                     loopargs[k].key = app_malloc(keylen, "evp_cipher key");
2216                     EVP_CIPHER_CTX_rand_key(loopargs[k].ctx, loopargs[k].key);
2217                     if (!EVP_CipherInit_ex(loopargs[k].ctx, NULL, NULL,
2218                                            loopargs[k].key, NULL, -1)) {
2219                         BIO_printf(bio_err, "\nEVP_CipherInit_ex failure\n");
2220                         ERR_print_errors(bio_err);
2221                         exit(1);
2222                     }
2223                     OPENSSL_clear_free(loopargs[k].key, keylen);
2224
2225                     /* SIV mode only allows for a single Update operation */
2226                     if (EVP_CIPHER_get_mode(evp_cipher) == EVP_CIPH_SIV_MODE)
2227                         EVP_CIPHER_CTX_ctrl(loopargs[k].ctx, EVP_CTRL_SET_SPEED,
2228                                             1, NULL);
2229                 }
2230
2231                 Time_F(START);
2232                 count = run_benchmark(async_jobs, loopfunc, loopargs);
2233                 d = Time_F(STOP);
2234                 for (k = 0; k < loopargs_len; k++)
2235                     EVP_CIPHER_CTX_free(loopargs[k].ctx);
2236                 print_result(D_EVP, testnum, count, d);
2237             }
2238         } else if (evp_md_name != NULL) {
2239             names[D_EVP] = evp_md_name;
2240
2241             for (testnum = 0; testnum < size_num; testnum++) {
2242                 print_message(names[D_EVP], c[D_EVP][testnum], lengths[testnum],
2243                               seconds.sym);
2244                 Time_F(START);
2245                 count = run_benchmark(async_jobs, EVP_Digest_md_loop, loopargs);
2246                 d = Time_F(STOP);
2247                 print_result(D_EVP, testnum, count, d);
2248                 if (count < 0)
2249                     break;
2250             }
2251         }
2252     }
2253
2254     if (doit[D_EVP_CMAC]) {
2255         EVP_MAC *mac = EVP_MAC_fetch(NULL, "CMAC", NULL);
2256         OSSL_PARAM params[3];
2257         EVP_CIPHER *cipher = NULL;
2258
2259         if (mac == NULL || evp_mac_ciphername == NULL)
2260             goto end;
2261         if (!opt_cipher(evp_mac_ciphername, &cipher))
2262             goto end;
2263
2264         keylen = EVP_CIPHER_get_key_length(cipher);
2265         EVP_CIPHER_free(cipher);
2266         if (keylen <= 0 || keylen > (int)sizeof(key32)) {
2267             BIO_printf(bio_err, "\nRequested CMAC cipher with unsupported key length.\n");
2268             goto end;
2269         }
2270         evp_cmac_name = app_malloc(sizeof("cmac()")
2271                                    + strlen(evp_mac_ciphername), "CMAC name");
2272         sprintf(evp_cmac_name, "cmac(%s)", evp_mac_ciphername);
2273         names[D_EVP_CMAC] = evp_cmac_name;
2274
2275         params[0] = OSSL_PARAM_construct_utf8_string(OSSL_ALG_PARAM_CIPHER,
2276                                                      evp_mac_ciphername, 0);
2277         params[1] = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_KEY,
2278                                                       (char *)key32, keylen);
2279         params[2] = OSSL_PARAM_construct_end();
2280
2281         for (i = 0; i < loopargs_len; i++) {
2282             loopargs[i].mctx = EVP_MAC_CTX_new(mac);
2283             if (loopargs[i].mctx == NULL)
2284                 goto end;
2285
2286             if (!EVP_MAC_CTX_set_params(loopargs[i].mctx, params))
2287                 goto end;
2288         }
2289
2290         for (testnum = 0; testnum < size_num; testnum++) {
2291             print_message(names[D_EVP_CMAC], c[D_EVP_CMAC][testnum],
2292                           lengths[testnum], seconds.sym);
2293             Time_F(START);
2294             count = run_benchmark(async_jobs, CMAC_loop, loopargs);
2295             d = Time_F(STOP);
2296             print_result(D_EVP_CMAC, testnum, count, d);
2297             if (count < 0)
2298                 break;
2299         }
2300         for (i = 0; i < loopargs_len; i++)
2301             EVP_MAC_CTX_free(loopargs[i].mctx);
2302         EVP_MAC_free(mac);
2303     }
2304
2305     for (i = 0; i < loopargs_len; i++)
2306         if (RAND_bytes(loopargs[i].buf, 36) <= 0)
2307             goto end;
2308
2309     for (testnum = 0; testnum < RSA_NUM; testnum++) {
2310         EVP_PKEY *rsa_key = NULL;
2311         int st = 0;
2312
2313         if (!rsa_doit[testnum])
2314             continue;
2315
2316         if (primes > RSA_DEFAULT_PRIME_NUM) {
2317             /* we haven't set keys yet,  generate multi-prime RSA keys */
2318             bn = BN_new();
2319             st = bn != NULL
2320                 && BN_set_word(bn, RSA_F4)
2321                 && init_gen_str(&genctx, "RSA", NULL, 0, NULL, NULL)
2322                 && EVP_PKEY_CTX_set_rsa_keygen_bits(genctx, rsa_keys[testnum].bits) > 0
2323                 && EVP_PKEY_CTX_set1_rsa_keygen_pubexp(genctx, bn) > 0
2324                 && EVP_PKEY_CTX_set_rsa_keygen_primes(genctx, primes) > 0
2325                 && EVP_PKEY_keygen(genctx, &rsa_key);
2326             BN_free(bn);
2327             bn = NULL;
2328             EVP_PKEY_CTX_free(genctx);
2329             genctx = NULL;
2330         } else {
2331             const unsigned char *p = rsa_keys[testnum].data;
2332
2333             st = (rsa_key = d2i_PrivateKey(EVP_PKEY_RSA, NULL, &p,
2334                                            rsa_keys[testnum].length)) != NULL;
2335         }
2336
2337         for (i = 0; st && i < loopargs_len; i++) {
2338             loopargs[i].rsa_sign_ctx[testnum] = EVP_PKEY_CTX_new(rsa_key, NULL);
2339             if (loopargs[i].rsa_sign_ctx[testnum] == NULL
2340                 || EVP_PKEY_sign_init(loopargs[i].rsa_sign_ctx[testnum]) <= 0
2341                 || EVP_PKEY_sign(loopargs[i].rsa_sign_ctx[testnum],
2342                                  loopargs[i].buf2,
2343                                  &loopargs[i].sigsize,
2344                                  loopargs[i].buf, 36) <= 0)
2345                 st = 0;
2346         }
2347         if (!st) {
2348             BIO_printf(bio_err,
2349                        "RSA sign setup failure.  No RSA sign will be done.\n");
2350             ERR_print_errors(bio_err);
2351             op_count = 1;
2352         } else {
2353             pkey_print_message("private", "rsa",
2354                                rsa_c[testnum][0], rsa_keys[testnum].bits,
2355                                seconds.rsa);
2356             /* RSA_blinding_on(rsa_key[testnum],NULL); */
2357             Time_F(START);
2358             count = run_benchmark(async_jobs, RSA_sign_loop, loopargs);
2359             d = Time_F(STOP);
2360             BIO_printf(bio_err,
2361                        mr ? "+R1:%ld:%d:%.2f\n"
2362                        : "%ld %u bits private RSA's in %.2fs\n",
2363                        count, rsa_keys[testnum].bits, d);
2364             rsa_results[testnum][0] = (double)count / d;
2365             op_count = count;
2366         }
2367
2368         for (i = 0; st && i < loopargs_len; i++) {
2369             loopargs[i].rsa_verify_ctx[testnum] = EVP_PKEY_CTX_new(rsa_key,
2370                                                                    NULL);
2371             if (loopargs[i].rsa_verify_ctx[testnum] == NULL
2372                 || EVP_PKEY_verify_init(loopargs[i].rsa_verify_ctx[testnum]) <= 0
2373                 || EVP_PKEY_verify(loopargs[i].rsa_verify_ctx[testnum],
2374                                    loopargs[i].buf2,
2375                                    loopargs[i].sigsize,
2376                                    loopargs[i].buf, 36) <= 0)
2377                 st = 0;
2378         }
2379         if (!st) {
2380             BIO_printf(bio_err,
2381                        "RSA verify setup failure.  No RSA verify will be done.\n");
2382             ERR_print_errors(bio_err);
2383             rsa_doit[testnum] = 0;
2384         } else {
2385             pkey_print_message("public", "rsa",
2386                                rsa_c[testnum][1], rsa_keys[testnum].bits,
2387                                seconds.rsa);
2388             Time_F(START);
2389             count = run_benchmark(async_jobs, RSA_verify_loop, loopargs);
2390             d = Time_F(STOP);
2391             BIO_printf(bio_err,
2392                        mr ? "+R2:%ld:%d:%.2f\n"
2393                        : "%ld %u bits public RSA's in %.2fs\n",
2394                        count, rsa_keys[testnum].bits, d);
2395             rsa_results[testnum][1] = (double)count / d;
2396         }
2397
2398         if (op_count <= 1) {
2399             /* if longer than 10s, don't do any more */
2400             stop_it(rsa_doit, testnum);
2401         }
2402         EVP_PKEY_free(rsa_key);
2403     }
2404
2405     for (testnum = 0; testnum < DSA_NUM; testnum++) {
2406         EVP_PKEY *dsa_key = NULL;
2407         int st;
2408
2409         if (!dsa_doit[testnum])
2410             continue;
2411
2412         st = (dsa_key = get_dsa(dsa_bits[testnum])) != NULL;
2413
2414         for (i = 0; st && i < loopargs_len; i++) {
2415             loopargs[i].dsa_sign_ctx[testnum] = EVP_PKEY_CTX_new(dsa_key,
2416                                                                  NULL);
2417             if (loopargs[i].dsa_sign_ctx[testnum] == NULL
2418                 || EVP_PKEY_sign_init(loopargs[i].dsa_sign_ctx[testnum]) <= 0
2419
2420                 || EVP_PKEY_sign(loopargs[i].dsa_sign_ctx[testnum],
2421                                  loopargs[i].buf2,
2422                                  &loopargs[i].sigsize,
2423                                  loopargs[i].buf, 20) <= 0)
2424                 st = 0;
2425         }
2426         if (!st) {
2427             BIO_printf(bio_err,
2428                        "DSA sign setup failure.  No DSA sign will be done.\n");
2429             ERR_print_errors(bio_err);
2430             op_count = 1;
2431         } else {
2432             pkey_print_message("sign", "dsa",
2433                                dsa_c[testnum][0], dsa_bits[testnum],
2434                                seconds.dsa);
2435             Time_F(START);
2436             count = run_benchmark(async_jobs, DSA_sign_loop, loopargs);
2437             d = Time_F(STOP);
2438             BIO_printf(bio_err,
2439                        mr ? "+R3:%ld:%u:%.2f\n"
2440                        : "%ld %u bits DSA signs in %.2fs\n",
2441                        count, dsa_bits[testnum], d);
2442             dsa_results[testnum][0] = (double)count / d;
2443             op_count = count;
2444         }
2445
2446         for (i = 0; st && i < loopargs_len; i++) {
2447             loopargs[i].dsa_verify_ctx[testnum] = EVP_PKEY_CTX_new(dsa_key,
2448                                                                    NULL);
2449             if (loopargs[i].dsa_verify_ctx[testnum] == NULL
2450                 || EVP_PKEY_verify_init(loopargs[i].dsa_verify_ctx[testnum]) <= 0
2451                 || EVP_PKEY_verify(loopargs[i].dsa_verify_ctx[testnum],
2452                                    loopargs[i].buf2,
2453                                    loopargs[i].sigsize,
2454                                    loopargs[i].buf, 36) <= 0)
2455                 st = 0;
2456         }
2457         if (!st) {
2458             BIO_printf(bio_err,
2459                        "DSA verify setup failure.  No DSA verify will be done.\n");
2460             ERR_print_errors(bio_err);
2461             dsa_doit[testnum] = 0;
2462         } else {
2463             pkey_print_message("verify", "dsa",
2464                                dsa_c[testnum][1], dsa_bits[testnum],
2465                                seconds.dsa);
2466             Time_F(START);
2467             count = run_benchmark(async_jobs, DSA_verify_loop, loopargs);
2468             d = Time_F(STOP);
2469             BIO_printf(bio_err,
2470                        mr ? "+R4:%ld:%u:%.2f\n"
2471                        : "%ld %u bits DSA verify in %.2fs\n",
2472                        count, dsa_bits[testnum], d);
2473             dsa_results[testnum][1] = (double)count / d;
2474         }
2475
2476         if (op_count <= 1) {
2477             /* if longer than 10s, don't do any more */
2478             stop_it(dsa_doit, testnum);
2479         }
2480         EVP_PKEY_free(dsa_key);
2481     }
2482
2483     for (testnum = 0; testnum < ECDSA_NUM; testnum++) {
2484         EVP_PKEY *ecdsa_key = NULL;
2485         int st;
2486
2487         if (!ecdsa_doit[testnum])
2488             continue;
2489
2490         st = (ecdsa_key = get_ecdsa(&ec_curves[testnum])) != NULL;
2491
2492         for (i = 0; st && i < loopargs_len; i++) {
2493             loopargs[i].ecdsa_sign_ctx[testnum] = EVP_PKEY_CTX_new(ecdsa_key,
2494                                                                    NULL);
2495             if (loopargs[i].ecdsa_sign_ctx[testnum] == NULL
2496                 || EVP_PKEY_sign_init(loopargs[i].ecdsa_sign_ctx[testnum]) <= 0
2497
2498                 || EVP_PKEY_sign(loopargs[i].ecdsa_sign_ctx[testnum],
2499                                  loopargs[i].buf2,
2500                                  &loopargs[i].sigsize,
2501                                  loopargs[i].buf, 20) <= 0)
2502                 st = 0;
2503         }
2504         if (!st) {
2505             BIO_printf(bio_err,
2506                        "ECDSA sign setup failure.  No ECDSA sign will be done.\n");
2507             ERR_print_errors(bio_err);
2508             op_count = 1;
2509         } else {
2510             pkey_print_message("sign", "ecdsa",
2511                                ecdsa_c[testnum][0], ec_curves[testnum].bits,
2512                                seconds.ecdsa);
2513             Time_F(START);
2514             count = run_benchmark(async_jobs, ECDSA_sign_loop, loopargs);
2515             d = Time_F(STOP);
2516             BIO_printf(bio_err,
2517                        mr ? "+R5:%ld:%u:%.2f\n"
2518                        : "%ld %u bits ECDSA signs in %.2fs\n",
2519                        count, ec_curves[testnum].bits, d);
2520             ecdsa_results[testnum][0] = (double)count / d;
2521             op_count = count;
2522         }
2523
2524         for (i = 0; st && i < loopargs_len; i++) {
2525             loopargs[i].ecdsa_verify_ctx[testnum] = EVP_PKEY_CTX_new(ecdsa_key,
2526                                                                      NULL);
2527             if (loopargs[i].ecdsa_verify_ctx[testnum] == NULL
2528                 || EVP_PKEY_verify_init(loopargs[i].ecdsa_verify_ctx[testnum]) <= 0
2529                 || EVP_PKEY_verify(loopargs[i].ecdsa_verify_ctx[testnum],
2530                                    loopargs[i].buf2,
2531                                    loopargs[i].sigsize,
2532                                    loopargs[i].buf, 20) <= 0)
2533                 st = 0;
2534         }
2535         if (!st) {
2536             BIO_printf(bio_err,
2537                        "ECDSA verify setup failure.  No ECDSA verify will be done.\n");
2538             ERR_print_errors(bio_err);
2539             ecdsa_doit[testnum] = 0;
2540         } else {
2541             pkey_print_message("verify", "ecdsa",
2542                                ecdsa_c[testnum][1], ec_curves[testnum].bits,
2543                                seconds.ecdsa);
2544             Time_F(START);
2545             count = run_benchmark(async_jobs, ECDSA_verify_loop, loopargs);
2546             d = Time_F(STOP);
2547             BIO_printf(bio_err,
2548                        mr ? "+R6:%ld:%u:%.2f\n"
2549                        : "%ld %u bits ECDSA verify in %.2fs\n",
2550                        count, ec_curves[testnum].bits, d);
2551             ecdsa_results[testnum][1] = (double)count / d;
2552         }
2553
2554         if (op_count <= 1) {
2555             /* if longer than 10s, don't do any more */
2556             stop_it(ecdsa_doit, testnum);
2557         }
2558     }
2559
2560     for (testnum = 0; testnum < EC_NUM; testnum++) {
2561         int ecdh_checks = 1;
2562
2563         if (!ecdh_doit[testnum])
2564             continue;
2565
2566         for (i = 0; i < loopargs_len; i++) {
2567             EVP_PKEY_CTX *test_ctx = NULL;
2568             EVP_PKEY_CTX *ctx = NULL;
2569             EVP_PKEY *key_A = NULL;
2570             EVP_PKEY *key_B = NULL;
2571             size_t outlen;
2572             size_t test_outlen;
2573
2574             if ((key_A = get_ecdsa(&ec_curves[testnum])) == NULL /* generate secret key A */
2575                 || (key_B = get_ecdsa(&ec_curves[testnum])) == NULL /* generate secret key B */
2576                 || (ctx = EVP_PKEY_CTX_new(key_A, NULL)) == NULL /* derivation ctx from skeyA */
2577                 || EVP_PKEY_derive_init(ctx) <= 0 /* init derivation ctx */
2578                 || EVP_PKEY_derive_set_peer(ctx, key_B) <= 0 /* set peer pubkey in ctx */
2579                 || EVP_PKEY_derive(ctx, NULL, &outlen) <= 0 /* determine max length */
2580                 || outlen == 0 /* ensure outlen is a valid size */
2581                 || outlen > MAX_ECDH_SIZE /* avoid buffer overflow */) {
2582                 ecdh_checks = 0;
2583                 BIO_printf(bio_err, "ECDH key generation failure.\n");
2584                 ERR_print_errors(bio_err);
2585                 op_count = 1;
2586                 break;
2587             }
2588
2589             /*
2590              * Here we perform a test run, comparing the output of a*B and b*A;
2591              * we try this here and assume that further EVP_PKEY_derive calls
2592              * never fail, so we can skip checks in the actually benchmarked
2593              * code, for maximum performance.
2594              */
2595             if ((test_ctx = EVP_PKEY_CTX_new(key_B, NULL)) == NULL /* test ctx from skeyB */
2596                 || !EVP_PKEY_derive_init(test_ctx) /* init derivation test_ctx */
2597                 || !EVP_PKEY_derive_set_peer(test_ctx, key_A) /* set peer pubkey in test_ctx */
2598                 || !EVP_PKEY_derive(test_ctx, NULL, &test_outlen) /* determine max length */
2599                 || !EVP_PKEY_derive(ctx, loopargs[i].secret_a, &outlen) /* compute a*B */
2600                 || !EVP_PKEY_derive(test_ctx, loopargs[i].secret_b, &test_outlen) /* compute b*A */
2601                 || test_outlen != outlen /* compare output length */) {
2602                 ecdh_checks = 0;
2603                 BIO_printf(bio_err, "ECDH computation failure.\n");
2604                 ERR_print_errors(bio_err);
2605                 op_count = 1;
2606                 break;
2607             }
2608
2609             /* Compare the computation results: CRYPTO_memcmp() returns 0 if equal */
2610             if (CRYPTO_memcmp(loopargs[i].secret_a,
2611                               loopargs[i].secret_b, outlen)) {
2612                 ecdh_checks = 0;
2613                 BIO_printf(bio_err, "ECDH computations don't match.\n");
2614                 ERR_print_errors(bio_err);
2615                 op_count = 1;
2616                 break;
2617             }
2618
2619             loopargs[i].ecdh_ctx[testnum] = ctx;
2620             loopargs[i].outlen[testnum] = outlen;
2621
2622             EVP_PKEY_free(key_A);
2623             EVP_PKEY_free(key_B);
2624             EVP_PKEY_CTX_free(test_ctx);
2625             test_ctx = NULL;
2626         }
2627         if (ecdh_checks != 0) {
2628             pkey_print_message("", "ecdh",
2629                                ecdh_c[testnum][0],
2630                                ec_curves[testnum].bits, seconds.ecdh);
2631             Time_F(START);
2632             count =
2633                 run_benchmark(async_jobs, ECDH_EVP_derive_key_loop, loopargs);
2634             d = Time_F(STOP);
2635             BIO_printf(bio_err,
2636                        mr ? "+R7:%ld:%d:%.2f\n" :
2637                        "%ld %u-bits ECDH ops in %.2fs\n", count,
2638                        ec_curves[testnum].bits, d);
2639             ecdh_results[testnum][0] = (double)count / d;
2640             op_count = count;
2641         }
2642
2643         if (op_count <= 1) {
2644             /* if longer than 10s, don't do any more */
2645             stop_it(ecdh_doit, testnum);
2646         }
2647     }
2648
2649     for (testnum = 0; testnum < EdDSA_NUM; testnum++) {
2650         int st = 1;
2651         EVP_PKEY *ed_pkey = NULL;
2652         EVP_PKEY_CTX *ed_pctx = NULL;
2653
2654         if (!eddsa_doit[testnum])
2655             continue;           /* Ignore Curve */
2656         for (i = 0; i < loopargs_len; i++) {
2657             loopargs[i].eddsa_ctx[testnum] = EVP_MD_CTX_new();
2658             if (loopargs[i].eddsa_ctx[testnum] == NULL) {
2659                 st = 0;
2660                 break;
2661             }
2662             loopargs[i].eddsa_ctx2[testnum] = EVP_MD_CTX_new();
2663             if (loopargs[i].eddsa_ctx2[testnum] == NULL) {
2664                 st = 0;
2665                 break;
2666             }
2667
2668             if ((ed_pctx = EVP_PKEY_CTX_new_id(ed_curves[testnum].nid,
2669                                                NULL)) == NULL
2670                 || EVP_PKEY_keygen_init(ed_pctx) <= 0
2671                 || EVP_PKEY_keygen(ed_pctx, &ed_pkey) <= 0) {
2672                 st = 0;
2673                 EVP_PKEY_CTX_free(ed_pctx);
2674                 break;
2675             }
2676             EVP_PKEY_CTX_free(ed_pctx);
2677
2678             if (!EVP_DigestSignInit(loopargs[i].eddsa_ctx[testnum], NULL, NULL,
2679                                     NULL, ed_pkey)) {
2680                 st = 0;
2681                 EVP_PKEY_free(ed_pkey);
2682                 break;
2683             }
2684             if (!EVP_DigestVerifyInit(loopargs[i].eddsa_ctx2[testnum], NULL,
2685                                       NULL, NULL, ed_pkey)) {
2686                 st = 0;
2687                 EVP_PKEY_free(ed_pkey);
2688                 break;
2689             }
2690
2691             EVP_PKEY_free(ed_pkey);
2692             ed_pkey = NULL;
2693         }
2694         if (st == 0) {
2695             BIO_printf(bio_err, "EdDSA failure.\n");
2696             ERR_print_errors(bio_err);
2697             op_count = 1;
2698         } else {
2699             for (i = 0; i < loopargs_len; i++) {
2700                 /* Perform EdDSA signature test */
2701                 loopargs[i].sigsize = ed_curves[testnum].sigsize;
2702                 st = EVP_DigestSign(loopargs[i].eddsa_ctx[testnum],
2703                                     loopargs[i].buf2, &loopargs[i].sigsize,
2704                                     loopargs[i].buf, 20);
2705                 if (st == 0)
2706                     break;
2707             }
2708             if (st == 0) {
2709                 BIO_printf(bio_err,
2710                            "EdDSA sign failure.  No EdDSA sign will be done.\n");
2711                 ERR_print_errors(bio_err);
2712                 op_count = 1;
2713             } else {
2714                 pkey_print_message("sign", ed_curves[testnum].name,
2715                                    eddsa_c[testnum][0],
2716                                    ed_curves[testnum].bits, seconds.eddsa);
2717                 Time_F(START);
2718                 count = run_benchmark(async_jobs, EdDSA_sign_loop, loopargs);
2719                 d = Time_F(STOP);
2720
2721                 BIO_printf(bio_err,
2722                            mr ? "+R8:%ld:%u:%s:%.2f\n" :
2723                            "%ld %u bits %s signs in %.2fs \n",
2724                            count, ed_curves[testnum].bits,
2725                            ed_curves[testnum].name, d);
2726                 eddsa_results[testnum][0] = (double)count / d;
2727                 op_count = count;
2728             }
2729             /* Perform EdDSA verification test */
2730             for (i = 0; i < loopargs_len; i++) {
2731                 st = EVP_DigestVerify(loopargs[i].eddsa_ctx2[testnum],
2732                                       loopargs[i].buf2, loopargs[i].sigsize,
2733                                       loopargs[i].buf, 20);
2734                 if (st != 1)
2735                     break;
2736             }
2737             if (st != 1) {
2738                 BIO_printf(bio_err,
2739                            "EdDSA verify failure.  No EdDSA verify will be done.\n");
2740                 ERR_print_errors(bio_err);
2741                 eddsa_doit[testnum] = 0;
2742             } else {
2743                 pkey_print_message("verify", ed_curves[testnum].name,
2744                                    eddsa_c[testnum][1],
2745                                    ed_curves[testnum].bits, seconds.eddsa);
2746                 Time_F(START);
2747                 count = run_benchmark(async_jobs, EdDSA_verify_loop, loopargs);
2748                 d = Time_F(STOP);
2749                 BIO_printf(bio_err,
2750                            mr ? "+R9:%ld:%u:%s:%.2f\n"
2751                            : "%ld %u bits %s verify in %.2fs\n",
2752                            count, ed_curves[testnum].bits,
2753                            ed_curves[testnum].name, d);
2754                 eddsa_results[testnum][1] = (double)count / d;
2755             }
2756
2757             if (op_count <= 1) {
2758                 /* if longer than 10s, don't do any more */
2759                 stop_it(eddsa_doit, testnum);
2760             }
2761         }
2762     }
2763
2764 #ifndef OPENSSL_NO_SM2
2765     for (testnum = 0; testnum < SM2_NUM; testnum++) {
2766         int st = 1;
2767         EVP_PKEY *sm2_pkey = NULL;
2768
2769         if (!sm2_doit[testnum])
2770             continue;           /* Ignore Curve */
2771         /* Init signing and verification */
2772         for (i = 0; i < loopargs_len; i++) {
2773             EVP_PKEY_CTX *sm2_pctx = NULL;
2774             EVP_PKEY_CTX *sm2_vfy_pctx = NULL;
2775             EVP_PKEY_CTX *pctx = NULL;
2776             st = 0;
2777
2778             loopargs[i].sm2_ctx[testnum] = EVP_MD_CTX_new();
2779             loopargs[i].sm2_vfy_ctx[testnum] = EVP_MD_CTX_new();
2780             if (loopargs[i].sm2_ctx[testnum] == NULL
2781                     || loopargs[i].sm2_vfy_ctx[testnum] == NULL)
2782                 break;
2783
2784             sm2_pkey = NULL;
2785
2786             st = !((pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_SM2, NULL)) == NULL
2787                 || EVP_PKEY_keygen_init(pctx) <= 0
2788                 || EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx,
2789                     sm2_curves[testnum].nid) <= 0
2790                 || EVP_PKEY_keygen(pctx, &sm2_pkey) <= 0);
2791             EVP_PKEY_CTX_free(pctx);
2792             if (st == 0)
2793                 break;
2794
2795             st = 0; /* set back to zero */
2796             /* attach it sooner to rely on main final cleanup */
2797             loopargs[i].sm2_pkey[testnum] = sm2_pkey;
2798             loopargs[i].sigsize = EVP_PKEY_get_size(sm2_pkey);
2799
2800             sm2_pctx = EVP_PKEY_CTX_new(sm2_pkey, NULL);
2801             sm2_vfy_pctx = EVP_PKEY_CTX_new(sm2_pkey, NULL);
2802             if (sm2_pctx == NULL || sm2_vfy_pctx == NULL) {
2803                 EVP_PKEY_CTX_free(sm2_vfy_pctx);
2804                 break;
2805             }
2806
2807             /* attach them directly to respective ctx */
2808             EVP_MD_CTX_set_pkey_ctx(loopargs[i].sm2_ctx[testnum], sm2_pctx);
2809             EVP_MD_CTX_set_pkey_ctx(loopargs[i].sm2_vfy_ctx[testnum], sm2_vfy_pctx);
2810
2811             /*
2812              * No need to allow user to set an explicit ID here, just use
2813              * the one defined in the 'draft-yang-tls-tl13-sm-suites' I-D.
2814              */
2815             if (EVP_PKEY_CTX_set1_id(sm2_pctx, SM2_ID, SM2_ID_LEN) != 1
2816                 || EVP_PKEY_CTX_set1_id(sm2_vfy_pctx, SM2_ID, SM2_ID_LEN) != 1)
2817                 break;
2818
2819             if (!EVP_DigestSignInit(loopargs[i].sm2_ctx[testnum], NULL,
2820                                     EVP_sm3(), NULL, sm2_pkey))
2821                 break;
2822             if (!EVP_DigestVerifyInit(loopargs[i].sm2_vfy_ctx[testnum], NULL,
2823                                       EVP_sm3(), NULL, sm2_pkey))
2824                 break;
2825             st = 1;         /* mark loop as succeeded */
2826         }
2827         if (st == 0) {
2828             BIO_printf(bio_err, "SM2 init failure.\n");
2829             ERR_print_errors(bio_err);
2830             op_count = 1;
2831         } else {
2832             for (i = 0; i < loopargs_len; i++) {
2833                 /* Perform SM2 signature test */
2834                 st = EVP_DigestSign(loopargs[i].sm2_ctx[testnum],
2835                                     loopargs[i].buf2, &loopargs[i].sigsize,
2836                                     loopargs[i].buf, 20);
2837                 if (st == 0)
2838                     break;
2839             }
2840             if (st == 0) {
2841                 BIO_printf(bio_err,
2842                            "SM2 sign failure.  No SM2 sign will be done.\n");
2843                 ERR_print_errors(bio_err);
2844                 op_count = 1;
2845             } else {
2846                 pkey_print_message("sign", sm2_curves[testnum].name,
2847                                    sm2_c[testnum][0],
2848                                    sm2_curves[testnum].bits, seconds.sm2);
2849                 Time_F(START);
2850                 count = run_benchmark(async_jobs, SM2_sign_loop, loopargs);
2851                 d = Time_F(STOP);
2852
2853                 BIO_printf(bio_err,
2854                            mr ? "+R10:%ld:%u:%s:%.2f\n" :
2855                            "%ld %u bits %s signs in %.2fs \n",
2856                            count, sm2_curves[testnum].bits,
2857                            sm2_curves[testnum].name, d);
2858                 sm2_results[testnum][0] = (double)count / d;
2859                 op_count = count;
2860             }
2861
2862             /* Perform SM2 verification test */
2863             for (i = 0; i < loopargs_len; i++) {
2864                 st = EVP_DigestVerify(loopargs[i].sm2_vfy_ctx[testnum],
2865                                       loopargs[i].buf2, loopargs[i].sigsize,
2866                                       loopargs[i].buf, 20);
2867                 if (st != 1)
2868                     break;
2869             }
2870             if (st != 1) {
2871                 BIO_printf(bio_err,
2872                            "SM2 verify failure.  No SM2 verify will be done.\n");
2873                 ERR_print_errors(bio_err);
2874                 sm2_doit[testnum] = 0;
2875             } else {
2876                 pkey_print_message("verify", sm2_curves[testnum].name,
2877                                    sm2_c[testnum][1],
2878                                    sm2_curves[testnum].bits, seconds.sm2);
2879                 Time_F(START);
2880                 count = run_benchmark(async_jobs, SM2_verify_loop, loopargs);
2881                 d = Time_F(STOP);
2882                 BIO_printf(bio_err,
2883                            mr ? "+R11:%ld:%u:%s:%.2f\n"
2884                            : "%ld %u bits %s verify in %.2fs\n",
2885                            count, sm2_curves[testnum].bits,
2886                            sm2_curves[testnum].name, d);
2887                 sm2_results[testnum][1] = (double)count / d;
2888             }
2889
2890             if (op_count <= 1) {
2891                 /* if longer than 10s, don't do any more */
2892                 for (testnum++; testnum < SM2_NUM; testnum++)
2893                     sm2_doit[testnum] = 0;
2894             }
2895         }
2896     }
2897 #endif                         /* OPENSSL_NO_SM2 */
2898
2899 #ifndef OPENSSL_NO_DH
2900     for (testnum = 0; testnum < FFDH_NUM; testnum++) {
2901         int ffdh_checks = 1;
2902
2903         if (!ffdh_doit[testnum])
2904             continue;
2905
2906         for (i = 0; i < loopargs_len; i++) {
2907             EVP_PKEY *pkey_A = NULL;
2908             EVP_PKEY *pkey_B = NULL;
2909             EVP_PKEY_CTX *ffdh_ctx = NULL;
2910             EVP_PKEY_CTX *test_ctx = NULL;
2911             size_t secret_size;
2912             size_t test_out;
2913
2914             /* Ensure that the error queue is empty */
2915             if (ERR_peek_error()) {
2916                 BIO_printf(bio_err,
2917                            "WARNING: the error queue contains previous unhandled errors.\n");
2918                 ERR_print_errors(bio_err);
2919             }
2920
2921             pkey_A = EVP_PKEY_new();
2922             if (!pkey_A) {
2923                 BIO_printf(bio_err, "Error while initialising EVP_PKEY (out of memory?).\n");
2924                 ERR_print_errors(bio_err);
2925                 op_count = 1;
2926                 ffdh_checks = 0;
2927                 break;
2928             }
2929             pkey_B = EVP_PKEY_new();
2930             if (!pkey_B) {
2931                 BIO_printf(bio_err, "Error while initialising EVP_PKEY (out of memory?).\n");
2932                 ERR_print_errors(bio_err);
2933                 op_count = 1;
2934                 ffdh_checks = 0;
2935                 break;
2936             }
2937
2938             ffdh_ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_DH, NULL);
2939             if (!ffdh_ctx) {
2940                 BIO_printf(bio_err, "Error while allocating EVP_PKEY_CTX.\n");
2941                 ERR_print_errors(bio_err);
2942                 op_count = 1;
2943                 ffdh_checks = 0;
2944                 break;
2945             }
2946
2947             if (EVP_PKEY_keygen_init(ffdh_ctx) <= 0) {
2948                 BIO_printf(bio_err, "Error while initialising EVP_PKEY_CTX.\n");
2949                 ERR_print_errors(bio_err);
2950                 op_count = 1;
2951                 ffdh_checks = 0;
2952                 break;
2953             }
2954             if (EVP_PKEY_CTX_set_dh_nid(ffdh_ctx, ffdh_params[testnum].nid) <= 0) {
2955                 BIO_printf(bio_err, "Error setting DH key size for keygen.\n");
2956                 ERR_print_errors(bio_err);
2957                 op_count = 1;
2958                 ffdh_checks = 0;
2959                 break;
2960             }
2961
2962             if (EVP_PKEY_keygen(ffdh_ctx, &pkey_A) <= 0 ||
2963                 EVP_PKEY_keygen(ffdh_ctx, &pkey_B) <= 0) {
2964                 BIO_printf(bio_err, "FFDH key generation failure.\n");
2965                 ERR_print_errors(bio_err);
2966                 op_count = 1;
2967                 ffdh_checks = 0;
2968                 break;
2969             }
2970
2971             EVP_PKEY_CTX_free(ffdh_ctx);
2972
2973             /*
2974              * check if the derivation works correctly both ways so that
2975              * we know if future derive calls will fail, and we can skip
2976              * error checking in benchmarked code
2977              */
2978             ffdh_ctx = EVP_PKEY_CTX_new(pkey_A, NULL);
2979             if (ffdh_ctx == NULL) {
2980                 BIO_printf(bio_err, "Error while allocating EVP_PKEY_CTX.\n");
2981                 ERR_print_errors(bio_err);
2982                 op_count = 1;
2983                 ffdh_checks = 0;
2984                 break;
2985             }
2986             if (EVP_PKEY_derive_init(ffdh_ctx) <= 0) {
2987                 BIO_printf(bio_err, "FFDH derivation context init failure.\n");
2988                 ERR_print_errors(bio_err);
2989                 op_count = 1;
2990                 ffdh_checks = 0;
2991                 break;
2992             }
2993             if (EVP_PKEY_derive_set_peer(ffdh_ctx, pkey_B) <= 0) {
2994                 BIO_printf(bio_err, "Assigning peer key for derivation failed.\n");
2995                 ERR_print_errors(bio_err);
2996                 op_count = 1;
2997                 ffdh_checks = 0;
2998                 break;
2999             }
3000             if (EVP_PKEY_derive(ffdh_ctx, NULL, &secret_size) <= 0) {
3001                 BIO_printf(bio_err, "Checking size of shared secret failed.\n");
3002                 ERR_print_errors(bio_err);
3003                 op_count = 1;
3004                 ffdh_checks = 0;
3005                 break;
3006             }
3007             if (secret_size > MAX_FFDH_SIZE) {
3008                 BIO_printf(bio_err, "Assertion failure: shared secret too large.\n");
3009                 op_count = 1;
3010                 ffdh_checks = 0;
3011                 break;
3012             }
3013             if (EVP_PKEY_derive(ffdh_ctx,
3014                                 loopargs[i].secret_ff_a,
3015                                 &secret_size) <= 0) {
3016                 BIO_printf(bio_err, "Shared secret derive failure.\n");
3017                 ERR_print_errors(bio_err);
3018                 op_count = 1;
3019                 ffdh_checks = 0;
3020                 break;
3021             }
3022             /* Now check from side B */
3023             test_ctx = EVP_PKEY_CTX_new(pkey_B, NULL);
3024             if (!test_ctx) {
3025                 BIO_printf(bio_err, "Error while allocating EVP_PKEY_CTX.\n");
3026                 ERR_print_errors(bio_err);
3027                 op_count = 1;
3028                 ffdh_checks = 0;
3029                 break;
3030             }
3031             if (!EVP_PKEY_derive_init(test_ctx) ||
3032                 !EVP_PKEY_derive_set_peer(test_ctx, pkey_A) ||
3033                 !EVP_PKEY_derive(test_ctx, NULL, &test_out) ||
3034                 !EVP_PKEY_derive(test_ctx, loopargs[i].secret_ff_b, &test_out) ||
3035                 test_out != secret_size) {
3036                 BIO_printf(bio_err, "FFDH computation failure.\n");
3037                 op_count = 1;
3038                 ffdh_checks = 0;
3039                 break;
3040             }
3041
3042             /* compare the computed secrets */
3043             if (CRYPTO_memcmp(loopargs[i].secret_ff_a,
3044                               loopargs[i].secret_ff_b, secret_size)) {
3045                 BIO_printf(bio_err, "FFDH computations don't match.\n");
3046                 ERR_print_errors(bio_err);
3047                 op_count = 1;
3048                 ffdh_checks = 0;
3049                 break;
3050             }
3051
3052             loopargs[i].ffdh_ctx[testnum] = ffdh_ctx;
3053
3054             EVP_PKEY_free(pkey_A);
3055             pkey_A = NULL;
3056             EVP_PKEY_free(pkey_B);
3057             pkey_B = NULL;
3058             EVP_PKEY_CTX_free(test_ctx);
3059             test_ctx = NULL;
3060         }
3061         if (ffdh_checks != 0) {
3062             pkey_print_message("", "ffdh", ffdh_c[testnum][0],
3063                                ffdh_params[testnum].bits, seconds.ffdh);
3064             Time_F(START);
3065             count =
3066                 run_benchmark(async_jobs, FFDH_derive_key_loop, loopargs);
3067             d = Time_F(STOP);
3068             BIO_printf(bio_err,
3069                        mr ? "+R12:%ld:%d:%.2f\n" :
3070                        "%ld %u-bits FFDH ops in %.2fs\n", count,
3071                        ffdh_params[testnum].bits, d);
3072             ffdh_results[testnum][0] = (double)count / d;
3073             op_count = count;
3074         }
3075         if (op_count <= 1) {
3076             /* if longer than 10s, don't do any more */
3077             stop_it(ffdh_doit, testnum);
3078         }
3079     }
3080 #endif  /* OPENSSL_NO_DH */
3081 #ifndef NO_FORK
3082  show_res:
3083 #endif
3084     if (!mr) {
3085         printf("version: %s\n", OpenSSL_version(OPENSSL_FULL_VERSION_STRING));
3086         printf("built on: %s\n", OpenSSL_version(OPENSSL_BUILT_ON));
3087         printf("options:");
3088         printf("%s ", BN_options());
3089         printf("\n%s\n", OpenSSL_version(OPENSSL_CFLAGS));
3090         printf("%s\n", OpenSSL_version(OPENSSL_CPU_INFO));
3091     }
3092
3093     if (pr_header) {
3094         if (mr) {
3095             printf("+H");
3096         } else {
3097             printf("The 'numbers' are in 1000s of bytes per second processed.\n");
3098             printf("type        ");
3099         }
3100         for (testnum = 0; testnum < size_num; testnum++)
3101             printf(mr ? ":%d" : "%7d bytes", lengths[testnum]);
3102         printf("\n");
3103     }
3104
3105     for (k = 0; k < ALGOR_NUM; k++) {
3106         if (!doit[k])
3107             continue;
3108         if (mr)
3109             printf("+F:%u:%s", k, names[k]);
3110         else
3111             printf("%-13s", names[k]);
3112         for (testnum = 0; testnum < size_num; testnum++) {
3113             if (results[k][testnum] > 10000 && !mr)
3114                 printf(" %11.2fk", results[k][testnum] / 1e3);
3115             else
3116                 printf(mr ? ":%.2f" : " %11.2f ", results[k][testnum]);
3117         }
3118         printf("\n");
3119     }
3120     testnum = 1;
3121     for (k = 0; k < RSA_NUM; k++) {
3122         if (!rsa_doit[k])
3123             continue;
3124         if (testnum && !mr) {
3125             printf("%18ssign    verify    sign/s verify/s\n", " ");
3126             testnum = 0;
3127         }
3128         if (mr)
3129             printf("+F2:%u:%u:%f:%f\n",
3130                    k, rsa_keys[k].bits, rsa_results[k][0], rsa_results[k][1]);
3131         else
3132             printf("rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
3133                    rsa_keys[k].bits, 1.0 / rsa_results[k][0], 1.0 / rsa_results[k][1],
3134                    rsa_results[k][0], rsa_results[k][1]);
3135     }
3136     testnum = 1;
3137     for (k = 0; k < DSA_NUM; k++) {
3138         if (!dsa_doit[k])
3139             continue;
3140         if (testnum && !mr) {
3141             printf("%18ssign    verify    sign/s verify/s\n", " ");
3142             testnum = 0;
3143         }
3144         if (mr)
3145             printf("+F3:%u:%u:%f:%f\n",
3146                    k, dsa_bits[k], dsa_results[k][0], dsa_results[k][1]);
3147         else
3148             printf("dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
3149                    dsa_bits[k], 1.0 / dsa_results[k][0], 1.0 / dsa_results[k][1],
3150                    dsa_results[k][0], dsa_results[k][1]);
3151     }
3152     testnum = 1;
3153     for (k = 0; k < OSSL_NELEM(ecdsa_doit); k++) {
3154         if (!ecdsa_doit[k])
3155             continue;
3156         if (testnum && !mr) {
3157             printf("%30ssign    verify    sign/s verify/s\n", " ");
3158             testnum = 0;
3159         }
3160
3161         if (mr)
3162             printf("+F4:%u:%u:%f:%f\n",
3163                    k, ec_curves[k].bits,
3164                    ecdsa_results[k][0], ecdsa_results[k][1]);
3165         else
3166             printf("%4u bits ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
3167                    ec_curves[k].bits, ec_curves[k].name,
3168                    1.0 / ecdsa_results[k][0], 1.0 / ecdsa_results[k][1],
3169                    ecdsa_results[k][0], ecdsa_results[k][1]);
3170     }
3171
3172     testnum = 1;
3173     for (k = 0; k < EC_NUM; k++) {
3174         if (!ecdh_doit[k])
3175             continue;
3176         if (testnum && !mr) {
3177             printf("%30sop      op/s\n", " ");
3178             testnum = 0;
3179         }
3180         if (mr)
3181             printf("+F5:%u:%u:%f:%f\n",
3182                    k, ec_curves[k].bits,
3183                    ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
3184
3185         else
3186             printf("%4u bits ecdh (%s) %8.4fs %8.1f\n",
3187                    ec_curves[k].bits, ec_curves[k].name,
3188                    1.0 / ecdh_results[k][0], ecdh_results[k][0]);
3189     }
3190
3191     testnum = 1;
3192     for (k = 0; k < OSSL_NELEM(eddsa_doit); k++) {
3193         if (!eddsa_doit[k])
3194             continue;
3195         if (testnum && !mr) {
3196             printf("%30ssign    verify    sign/s verify/s\n", " ");
3197             testnum = 0;
3198         }
3199
3200         if (mr)
3201             printf("+F6:%u:%u:%s:%f:%f\n",
3202                    k, ed_curves[k].bits, ed_curves[k].name,
3203                    eddsa_results[k][0], eddsa_results[k][1]);
3204         else
3205             printf("%4u bits EdDSA (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
3206                    ed_curves[k].bits, ed_curves[k].name,
3207                    1.0 / eddsa_results[k][0], 1.0 / eddsa_results[k][1],
3208                    eddsa_results[k][0], eddsa_results[k][1]);
3209     }
3210
3211 #ifndef OPENSSL_NO_SM2
3212     testnum = 1;
3213     for (k = 0; k < OSSL_NELEM(sm2_doit); k++) {
3214         if (!sm2_doit[k])
3215             continue;
3216         if (testnum && !mr) {
3217             printf("%30ssign    verify    sign/s verify/s\n", " ");
3218             testnum = 0;
3219         }
3220
3221         if (mr)
3222             printf("+F7:%u:%u:%s:%f:%f\n",
3223                    k, sm2_curves[k].bits, sm2_curves[k].name,
3224                    sm2_results[k][0], sm2_results[k][1]);
3225         else
3226             printf("%4u bits SM2 (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
3227                    sm2_curves[k].bits, sm2_curves[k].name,
3228                    1.0 / sm2_results[k][0], 1.0 / sm2_results[k][1],
3229                    sm2_results[k][0], sm2_results[k][1]);
3230     }
3231 #endif
3232 #ifndef OPENSSL_NO_DH
3233     testnum = 1;
3234     for (k = 0; k < FFDH_NUM; k++) {
3235         if (!ffdh_doit[k])
3236             continue;
3237         if (testnum && !mr) {
3238             printf("%23sop     op/s\n", " ");
3239             testnum = 0;
3240         }
3241         if (mr)
3242             printf("+F8:%u:%u:%f:%f\n",
3243                    k, ffdh_params[k].bits,
3244                    ffdh_results[k][0], 1.0 / ffdh_results[k][0]);
3245
3246         else
3247             printf("%4u bits ffdh %8.4fs %8.1f\n",
3248                    ffdh_params[k].bits,
3249                    1.0 / ffdh_results[k][0], ffdh_results[k][0]);
3250     }
3251 #endif /* OPENSSL_NO_DH */
3252
3253     ret = 0;
3254
3255  end:
3256     ERR_print_errors(bio_err);
3257     for (i = 0; i < loopargs_len; i++) {
3258         OPENSSL_free(loopargs[i].buf_malloc);
3259         OPENSSL_free(loopargs[i].buf2_malloc);
3260
3261         BN_free(bn);
3262         EVP_PKEY_CTX_free(genctx);
3263         for (k = 0; k < RSA_NUM; k++) {
3264             EVP_PKEY_CTX_free(loopargs[i].rsa_sign_ctx[k]);
3265             EVP_PKEY_CTX_free(loopargs[i].rsa_verify_ctx[k]);
3266         }
3267 #ifndef OPENSSL_NO_DH
3268         OPENSSL_free(loopargs[i].secret_ff_a);
3269         OPENSSL_free(loopargs[i].secret_ff_b);
3270         for (k = 0; k < FFDH_NUM; k++)
3271             EVP_PKEY_CTX_free(loopargs[i].ffdh_ctx[k]);
3272 #endif
3273         for (k = 0; k < DSA_NUM; k++) {
3274             EVP_PKEY_CTX_free(loopargs[i].dsa_sign_ctx[k]);
3275             EVP_PKEY_CTX_free(loopargs[i].dsa_verify_ctx[k]);
3276         }
3277         for (k = 0; k < ECDSA_NUM; k++) {
3278             EVP_PKEY_CTX_free(loopargs[i].ecdsa_sign_ctx[k]);
3279             EVP_PKEY_CTX_free(loopargs[i].ecdsa_verify_ctx[k]);
3280         }
3281         for (k = 0; k < EC_NUM; k++)
3282             EVP_PKEY_CTX_free(loopargs[i].ecdh_ctx[k]);
3283         for (k = 0; k < EdDSA_NUM; k++) {
3284             EVP_MD_CTX_free(loopargs[i].eddsa_ctx[k]);
3285             EVP_MD_CTX_free(loopargs[i].eddsa_ctx2[k]);
3286         }
3287 #ifndef OPENSSL_NO_SM2
3288         for (k = 0; k < SM2_NUM; k++) {
3289             EVP_PKEY_CTX *pctx = NULL;
3290
3291             /* free signing ctx */
3292             if (loopargs[i].sm2_ctx[k] != NULL
3293                 && (pctx = EVP_MD_CTX_get_pkey_ctx(loopargs[i].sm2_ctx[k])) != NULL)
3294                 EVP_PKEY_CTX_free(pctx);
3295             EVP_MD_CTX_free(loopargs[i].sm2_ctx[k]);
3296             /* free verification ctx */
3297             if (loopargs[i].sm2_vfy_ctx[k] != NULL
3298                 && (pctx = EVP_MD_CTX_get_pkey_ctx(loopargs[i].sm2_vfy_ctx[k])) != NULL)
3299                 EVP_PKEY_CTX_free(pctx);
3300             EVP_MD_CTX_free(loopargs[i].sm2_vfy_ctx[k]);
3301             /* free pkey */
3302             EVP_PKEY_free(loopargs[i].sm2_pkey[k]);
3303         }
3304 #endif
3305         OPENSSL_free(loopargs[i].secret_a);
3306         OPENSSL_free(loopargs[i].secret_b);
3307     }
3308     OPENSSL_free(evp_hmac_name);
3309     OPENSSL_free(evp_cmac_name);
3310
3311     if (async_jobs > 0) {
3312         for (i = 0; i < loopargs_len; i++)
3313             ASYNC_WAIT_CTX_free(loopargs[i].wait_ctx);
3314     }
3315
3316     if (async_init) {
3317         ASYNC_cleanup_thread();
3318     }
3319     OPENSSL_free(loopargs);
3320     release_engine(e);
3321     EVP_CIPHER_free(evp_cipher);
3322     return ret;
3323 }
3324
3325 static void print_message(const char *s, long num, int length, int tm)
3326 {
3327     BIO_printf(bio_err,
3328                mr ? "+DT:%s:%d:%d\n"
3329                : "Doing %s for %ds on %d size blocks: ", s, tm, length);
3330     (void)BIO_flush(bio_err);
3331     run = 1;
3332     alarm(tm);
3333 }
3334
3335 static void pkey_print_message(const char *str, const char *str2, long num,
3336                                unsigned int bits, int tm)
3337 {
3338     BIO_printf(bio_err,
3339                mr ? "+DTP:%d:%s:%s:%d\n"
3340                : "Doing %u bits %s %s's for %ds: ", bits, str, str2, tm);
3341     (void)BIO_flush(bio_err);
3342     run = 1;
3343     alarm(tm);
3344 }
3345
3346 static void print_result(int alg, int run_no, int count, double time_used)
3347 {
3348     if (count == -1) {
3349         BIO_printf(bio_err, "%s error!\n", names[alg]);
3350         ERR_print_errors(bio_err);
3351         return;
3352     }
3353     BIO_printf(bio_err,
3354                mr ? "+R:%d:%s:%f\n"
3355                : "%d %s's in %.2fs\n", count, names[alg], time_used);
3356     results[alg][run_no] = ((double)count) / time_used * lengths[run_no];
3357 }
3358
3359 #ifndef NO_FORK
3360 static char *sstrsep(char **string, const char *delim)
3361 {
3362     char isdelim[256];
3363     char *token = *string;
3364
3365     if (**string == 0)
3366         return NULL;
3367
3368     memset(isdelim, 0, sizeof(isdelim));
3369     isdelim[0] = 1;
3370
3371     while (*delim) {
3372         isdelim[(unsigned char)(*delim)] = 1;
3373         delim++;
3374     }
3375
3376     while (!isdelim[(unsigned char)(**string)])
3377         (*string)++;
3378
3379     if (**string) {
3380         **string = 0;
3381         (*string)++;
3382     }
3383
3384     return token;
3385 }
3386
3387 static int do_multi(int multi, int size_num)
3388 {
3389     int n;
3390     int fd[2];
3391     int *fds;
3392     static char sep[] = ":";
3393
3394     fds = app_malloc(sizeof(*fds) * multi, "fd buffer for do_multi");
3395     for (n = 0; n < multi; ++n) {
3396         if (pipe(fd) == -1) {
3397             BIO_printf(bio_err, "pipe failure\n");
3398             exit(1);
3399         }
3400         fflush(stdout);
3401         (void)BIO_flush(bio_err);
3402         if (fork()) {
3403             close(fd[1]);
3404             fds[n] = fd[0];
3405         } else {
3406             close(fd[0]);
3407             close(1);
3408             if (dup(fd[1]) == -1) {
3409                 BIO_printf(bio_err, "dup failed\n");
3410                 exit(1);
3411             }
3412             close(fd[1]);
3413             mr = 1;
3414             usertime = 0;
3415             OPENSSL_free(fds);
3416             return 0;
3417         }
3418         printf("Forked child %d\n", n);
3419     }
3420
3421     /* for now, assume the pipe is long enough to take all the output */
3422     for (n = 0; n < multi; ++n) {
3423         FILE *f;
3424         char buf[1024];
3425         char *p;
3426
3427         f = fdopen(fds[n], "r");
3428         while (fgets(buf, sizeof(buf), f)) {
3429             p = strchr(buf, '\n');
3430             if (p)
3431                 *p = '\0';
3432             if (buf[0] != '+') {
3433                 BIO_printf(bio_err,
3434                            "Don't understand line '%s' from child %d\n", buf,
3435                            n);
3436                 continue;
3437             }
3438             printf("Got: %s from %d\n", buf, n);
3439             if (strncmp(buf, "+F:", 3) == 0) {
3440                 int alg;
3441                 int j;
3442
3443                 p = buf + 3;
3444                 alg = atoi(sstrsep(&p, sep));
3445                 sstrsep(&p, sep);
3446                 for (j = 0; j < size_num; ++j)
3447                     results[alg][j] += atof(sstrsep(&p, sep));
3448             } else if (strncmp(buf, "+F2:", 4) == 0) {
3449                 int k;
3450                 double d;
3451
3452                 p = buf + 4;
3453                 k = atoi(sstrsep(&p, sep));
3454                 sstrsep(&p, sep);
3455
3456                 d = atof(sstrsep(&p, sep));
3457                 rsa_results[k][0] += d;
3458
3459                 d = atof(sstrsep(&p, sep));
3460                 rsa_results[k][1] += d;
3461             } else if (strncmp(buf, "+F3:", 4) == 0) {
3462                 int k;
3463                 double d;
3464
3465                 p = buf + 4;
3466                 k = atoi(sstrsep(&p, sep));
3467                 sstrsep(&p, sep);
3468
3469                 d = atof(sstrsep(&p, sep));
3470                 dsa_results[k][0] += d;
3471
3472                 d = atof(sstrsep(&p, sep));
3473                 dsa_results[k][1] += d;
3474             } else if (strncmp(buf, "+F4:", 4) == 0) {
3475                 int k;
3476                 double d;
3477
3478                 p = buf + 4;
3479                 k = atoi(sstrsep(&p, sep));
3480                 sstrsep(&p, sep);
3481
3482                 d = atof(sstrsep(&p, sep));
3483                 ecdsa_results[k][0] += d;
3484
3485                 d = atof(sstrsep(&p, sep));
3486                 ecdsa_results[k][1] += d;
3487             } else if (strncmp(buf, "+F5:", 4) == 0) {
3488                 int k;
3489                 double d;
3490
3491                 p = buf + 4;
3492                 k = atoi(sstrsep(&p, sep));
3493                 sstrsep(&p, sep);
3494
3495                 d = atof(sstrsep(&p, sep));
3496                 ecdh_results[k][0] += d;
3497             } else if (strncmp(buf, "+F6:", 4) == 0) {
3498                 int k;
3499                 double d;
3500
3501                 p = buf + 4;
3502                 k = atoi(sstrsep(&p, sep));
3503                 sstrsep(&p, sep);
3504                 sstrsep(&p, sep);
3505
3506                 d = atof(sstrsep(&p, sep));
3507                 eddsa_results[k][0] += d;
3508
3509                 d = atof(sstrsep(&p, sep));
3510                 eddsa_results[k][1] += d;
3511 # ifndef OPENSSL_NO_SM2
3512             } else if (strncmp(buf, "+F7:", 4) == 0) {
3513                 int k;
3514                 double d;
3515
3516                 p = buf + 4;
3517                 k = atoi(sstrsep(&p, sep));
3518                 sstrsep(&p, sep);
3519                 sstrsep(&p, sep);
3520
3521                 d = atof(sstrsep(&p, sep));
3522                 sm2_results[k][0] += d;
3523
3524                 d = atof(sstrsep(&p, sep));
3525                 sm2_results[k][1] += d;
3526 # endif /* OPENSSL_NO_SM2 */
3527 # ifndef OPENSSL_NO_DH
3528             } else if (strncmp(buf, "+F8:", 4) == 0) {
3529                 int k;
3530                 double d;
3531
3532                 p = buf + 4;
3533                 k = atoi(sstrsep(&p, sep));
3534                 sstrsep(&p, sep);
3535
3536                 d = atof(sstrsep(&p, sep));
3537                 ffdh_results[k][0] += d;
3538 # endif /* OPENSSL_NO_DH */
3539             } else if (strncmp(buf, "+H:", 3) == 0) {
3540                 ;
3541             } else {
3542                 BIO_printf(bio_err, "Unknown type '%s' from child %d\n", buf,
3543                            n);
3544             }
3545         }
3546
3547         fclose(f);
3548     }
3549     OPENSSL_free(fds);
3550     return 1;
3551 }
3552 #endif
3553
3554 static void multiblock_speed(const EVP_CIPHER *evp_cipher, int lengths_single,
3555                              const openssl_speed_sec_t *seconds)
3556 {
3557     static const int mblengths_list[] =
3558         { 8 * 1024, 2 * 8 * 1024, 4 * 8 * 1024, 8 * 8 * 1024, 8 * 16 * 1024 };
3559     const int *mblengths = mblengths_list;
3560     int j, count, keylen, num = OSSL_NELEM(mblengths_list);
3561     const char *alg_name;
3562     unsigned char *inp = NULL, *out = NULL, *key, no_key[32], no_iv[16];
3563     EVP_CIPHER_CTX *ctx = NULL;
3564     double d = 0.0;
3565
3566     if (lengths_single) {
3567         mblengths = &lengths_single;
3568         num = 1;
3569     }
3570
3571     inp = app_malloc(mblengths[num - 1], "multiblock input buffer");
3572     out = app_malloc(mblengths[num - 1] + 1024, "multiblock output buffer");
3573     if ((ctx = EVP_CIPHER_CTX_new()) == NULL)
3574         app_bail_out("failed to allocate cipher context\n");
3575     if (!EVP_EncryptInit_ex(ctx, evp_cipher, NULL, NULL, no_iv))
3576         app_bail_out("failed to initialise cipher context\n");
3577
3578     if ((keylen = EVP_CIPHER_CTX_get_key_length(ctx)) < 0) {
3579         BIO_printf(bio_err, "Impossible negative key length: %d\n", keylen);
3580         goto err;
3581     }
3582     key = app_malloc(keylen, "evp_cipher key");
3583     if (!EVP_CIPHER_CTX_rand_key(ctx, key))
3584         app_bail_out("failed to generate random cipher key\n");
3585     if (!EVP_EncryptInit_ex(ctx, NULL, NULL, key, NULL))
3586         app_bail_out("failed to set cipher key\n");
3587     OPENSSL_clear_free(key, keylen);
3588
3589     if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_MAC_KEY,
3590                              sizeof(no_key), no_key))
3591         app_bail_out("failed to set AEAD key\n");
3592     if ((alg_name = EVP_CIPHER_get0_name(evp_cipher)) == NULL)
3593         app_bail_out("failed to get cipher name\n");
3594
3595     for (j = 0; j < num; j++) {
3596         print_message(alg_name, 0, mblengths[j], seconds->sym);
3597         Time_F(START);
3598         for (count = 0; run && count < 0x7fffffff; count++) {
3599             unsigned char aad[EVP_AEAD_TLS1_AAD_LEN];
3600             EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM mb_param;
3601             size_t len = mblengths[j];
3602             int packlen;
3603
3604             memset(aad, 0, 8);  /* avoid uninitialized values */
3605             aad[8] = 23;        /* SSL3_RT_APPLICATION_DATA */
3606             aad[9] = 3;         /* version */
3607             aad[10] = 2;
3608             aad[11] = 0;        /* length */
3609             aad[12] = 0;
3610             mb_param.out = NULL;
3611             mb_param.inp = aad;
3612             mb_param.len = len;
3613             mb_param.interleave = 8;
3614
3615             packlen = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_AAD,
3616                                           sizeof(mb_param), &mb_param);
3617
3618             if (packlen > 0) {
3619                 mb_param.out = out;
3620                 mb_param.inp = inp;
3621                 mb_param.len = len;
3622                 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT,
3623                                     sizeof(mb_param), &mb_param);
3624             } else {
3625                 int pad;
3626
3627                 RAND_bytes(out, 16);
3628                 len += 16;
3629                 aad[11] = (unsigned char)(len >> 8);
3630                 aad[12] = (unsigned char)(len);
3631                 pad = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_TLS1_AAD,
3632                                           EVP_AEAD_TLS1_AAD_LEN, aad);
3633                 EVP_Cipher(ctx, out, inp, len + pad);
3634             }
3635         }
3636         d = Time_F(STOP);
3637         BIO_printf(bio_err, mr ? "+R:%d:%s:%f\n"
3638                    : "%d %s's in %.2fs\n", count, "evp", d);
3639         results[D_EVP][j] = ((double)count) / d * mblengths[j];
3640     }
3641
3642     if (mr) {
3643         fprintf(stdout, "+H");
3644         for (j = 0; j < num; j++)
3645             fprintf(stdout, ":%d", mblengths[j]);
3646         fprintf(stdout, "\n");
3647         fprintf(stdout, "+F:%d:%s", D_EVP, alg_name);
3648         for (j = 0; j < num; j++)
3649             fprintf(stdout, ":%.2f", results[D_EVP][j]);
3650         fprintf(stdout, "\n");
3651     } else {
3652         fprintf(stdout,
3653                 "The 'numbers' are in 1000s of bytes per second processed.\n");
3654         fprintf(stdout, "type                    ");
3655         for (j = 0; j < num; j++)
3656             fprintf(stdout, "%7d bytes", mblengths[j]);
3657         fprintf(stdout, "\n");
3658         fprintf(stdout, "%-24s", alg_name);
3659
3660         for (j = 0; j < num; j++) {
3661             if (results[D_EVP][j] > 10000)
3662                 fprintf(stdout, " %11.2fk", results[D_EVP][j] / 1e3);
3663             else
3664                 fprintf(stdout, " %11.2f ", results[D_EVP][j]);
3665         }
3666         fprintf(stdout, "\n");
3667     }
3668
3669  err:
3670     OPENSSL_free(inp);
3671     OPENSSL_free(out);
3672     EVP_CIPHER_CTX_free(ctx);
3673 }