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