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