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