1*1dcdf01fSchristos /*
2*1dcdf01fSchristos  * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
3*1dcdf01fSchristos  * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
460662d10Schristos  *
5*1dcdf01fSchristos  * Licensed under the OpenSSL license (the "License").  You may not use
6*1dcdf01fSchristos  * this file except in compliance with the License.  You can obtain a copy
7*1dcdf01fSchristos  * in the file LICENSE in the source distribution or at
8*1dcdf01fSchristos  * https://www.openssl.org/source/license.html
960662d10Schristos  */
1060662d10Schristos 
1160662d10Schristos #undef SECONDS
1260662d10Schristos #define SECONDS                 3
1360662d10Schristos #define RSA_SECONDS             10
1460662d10Schristos #define DSA_SECONDS             10
1560662d10Schristos #define ECDSA_SECONDS   10
1660662d10Schristos #define ECDH_SECONDS    10
17*1dcdf01fSchristos #define EdDSA_SECONDS   10
1860662d10Schristos 
1960662d10Schristos #include <stdio.h>
2060662d10Schristos #include <stdlib.h>
2160662d10Schristos #include <string.h>
2260662d10Schristos #include <math.h>
2360662d10Schristos #include "apps.h"
24*1dcdf01fSchristos #include "progs.h"
2560662d10Schristos #include <openssl/crypto.h>
2660662d10Schristos #include <openssl/rand.h>
2760662d10Schristos #include <openssl/err.h>
2860662d10Schristos #include <openssl/evp.h>
2960662d10Schristos #include <openssl/objects.h>
30*1dcdf01fSchristos #include <openssl/async.h>
3160662d10Schristos #if !defined(OPENSSL_SYS_MSDOS)
32*1dcdf01fSchristos # include OPENSSL_UNISTD
3360662d10Schristos #endif
3460662d10Schristos 
35*1dcdf01fSchristos #if defined(_WIN32)
3660662d10Schristos # include <windows.h>
3760662d10Schristos #endif
3860662d10Schristos 
3960662d10Schristos #include <openssl/bn.h>
4060662d10Schristos #ifndef OPENSSL_NO_DES
4160662d10Schristos # include <openssl/des.h>
4260662d10Schristos #endif
4360662d10Schristos #include <openssl/aes.h>
4460662d10Schristos #ifndef OPENSSL_NO_CAMELLIA
4560662d10Schristos # include <openssl/camellia.h>
4660662d10Schristos #endif
4760662d10Schristos #ifndef OPENSSL_NO_MD2
4860662d10Schristos # include <openssl/md2.h>
4960662d10Schristos #endif
5060662d10Schristos #ifndef OPENSSL_NO_MDC2
5160662d10Schristos # include <openssl/mdc2.h>
5260662d10Schristos #endif
5360662d10Schristos #ifndef OPENSSL_NO_MD4
5460662d10Schristos # include <openssl/md4.h>
5560662d10Schristos #endif
5660662d10Schristos #ifndef OPENSSL_NO_MD5
5760662d10Schristos # include <openssl/md5.h>
5860662d10Schristos #endif
5960662d10Schristos #include <openssl/hmac.h>
6060662d10Schristos #include <openssl/sha.h>
61*1dcdf01fSchristos #ifndef OPENSSL_NO_RMD160
6260662d10Schristos # include <openssl/ripemd.h>
6360662d10Schristos #endif
6460662d10Schristos #ifndef OPENSSL_NO_WHIRLPOOL
6560662d10Schristos # include <openssl/whrlpool.h>
6660662d10Schristos #endif
6760662d10Schristos #ifndef OPENSSL_NO_RC4
6860662d10Schristos # include <openssl/rc4.h>
6960662d10Schristos #endif
7060662d10Schristos #ifndef OPENSSL_NO_RC5
7160662d10Schristos # include <openssl/rc5.h>
7260662d10Schristos #endif
7360662d10Schristos #ifndef OPENSSL_NO_RC2
7460662d10Schristos # include <openssl/rc2.h>
7560662d10Schristos #endif
7660662d10Schristos #ifndef OPENSSL_NO_IDEA
7760662d10Schristos # include <openssl/idea.h>
7860662d10Schristos #endif
7960662d10Schristos #ifndef OPENSSL_NO_SEED
8060662d10Schristos # include <openssl/seed.h>
8160662d10Schristos #endif
8260662d10Schristos #ifndef OPENSSL_NO_BF
8360662d10Schristos # include <openssl/blowfish.h>
8460662d10Schristos #endif
8560662d10Schristos #ifndef OPENSSL_NO_CAST
8660662d10Schristos # include <openssl/cast.h>
8760662d10Schristos #endif
8860662d10Schristos #ifndef OPENSSL_NO_RSA
8960662d10Schristos # include <openssl/rsa.h>
9060662d10Schristos # include "./testrsa.h"
9160662d10Schristos #endif
9260662d10Schristos #include <openssl/x509.h>
9360662d10Schristos #ifndef OPENSSL_NO_DSA
9460662d10Schristos # include <openssl/dsa.h>
9560662d10Schristos # include "./testdsa.h"
9660662d10Schristos #endif
97*1dcdf01fSchristos #ifndef OPENSSL_NO_EC
98*1dcdf01fSchristos # include <openssl/ec.h>
9960662d10Schristos #endif
10060662d10Schristos #include <openssl/modes.h>
10160662d10Schristos 
10260662d10Schristos #ifndef HAVE_FORK
103*1dcdf01fSchristos # if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_VXWORKS)
10460662d10Schristos #  define HAVE_FORK 0
10560662d10Schristos # else
10660662d10Schristos #  define HAVE_FORK 1
10760662d10Schristos # endif
10860662d10Schristos #endif
10960662d10Schristos 
11060662d10Schristos #if HAVE_FORK
11160662d10Schristos # undef NO_FORK
11260662d10Schristos #else
11360662d10Schristos # define NO_FORK
11460662d10Schristos #endif
11560662d10Schristos 
116*1dcdf01fSchristos #define MAX_MISALIGNMENT 63
117*1dcdf01fSchristos #define MAX_ECDH_SIZE   256
118*1dcdf01fSchristos #define MISALIGN        64
119*1dcdf01fSchristos 
120*1dcdf01fSchristos typedef struct openssl_speed_sec_st {
121*1dcdf01fSchristos     int sym;
122*1dcdf01fSchristos     int rsa;
123*1dcdf01fSchristos     int dsa;
124*1dcdf01fSchristos     int ecdsa;
125*1dcdf01fSchristos     int ecdh;
126*1dcdf01fSchristos     int eddsa;
127*1dcdf01fSchristos } openssl_speed_sec_t;
128*1dcdf01fSchristos 
12960662d10Schristos static volatile int run = 0;
13060662d10Schristos 
13160662d10Schristos static int mr = 0;
13260662d10Schristos static int usertime = 1;
13360662d10Schristos 
134*1dcdf01fSchristos #ifndef OPENSSL_NO_MD2
135*1dcdf01fSchristos static int EVP_Digest_MD2_loop(void *args);
13660662d10Schristos #endif
13760662d10Schristos 
138*1dcdf01fSchristos #ifndef OPENSSL_NO_MDC2
139*1dcdf01fSchristos static int EVP_Digest_MDC2_loop(void *args);
140*1dcdf01fSchristos #endif
141*1dcdf01fSchristos #ifndef OPENSSL_NO_MD4
142*1dcdf01fSchristos static int EVP_Digest_MD4_loop(void *args);
143*1dcdf01fSchristos #endif
144*1dcdf01fSchristos #ifndef OPENSSL_NO_MD5
145*1dcdf01fSchristos static int MD5_loop(void *args);
146*1dcdf01fSchristos static int HMAC_loop(void *args);
147*1dcdf01fSchristos #endif
148*1dcdf01fSchristos static int SHA1_loop(void *args);
149*1dcdf01fSchristos static int SHA256_loop(void *args);
150*1dcdf01fSchristos static int SHA512_loop(void *args);
151*1dcdf01fSchristos #ifndef OPENSSL_NO_WHIRLPOOL
152*1dcdf01fSchristos static int WHIRLPOOL_loop(void *args);
153*1dcdf01fSchristos #endif
154*1dcdf01fSchristos #ifndef OPENSSL_NO_RMD160
155*1dcdf01fSchristos static int EVP_Digest_RMD160_loop(void *args);
156*1dcdf01fSchristos #endif
157*1dcdf01fSchristos #ifndef OPENSSL_NO_RC4
158*1dcdf01fSchristos static int RC4_loop(void *args);
159*1dcdf01fSchristos #endif
160*1dcdf01fSchristos #ifndef OPENSSL_NO_DES
161*1dcdf01fSchristos static int DES_ncbc_encrypt_loop(void *args);
162*1dcdf01fSchristos static int DES_ede3_cbc_encrypt_loop(void *args);
163*1dcdf01fSchristos #endif
164*1dcdf01fSchristos static int AES_cbc_128_encrypt_loop(void *args);
165*1dcdf01fSchristos static int AES_cbc_192_encrypt_loop(void *args);
166*1dcdf01fSchristos static int AES_ige_128_encrypt_loop(void *args);
167*1dcdf01fSchristos static int AES_cbc_256_encrypt_loop(void *args);
168*1dcdf01fSchristos static int AES_ige_192_encrypt_loop(void *args);
169*1dcdf01fSchristos static int AES_ige_256_encrypt_loop(void *args);
170*1dcdf01fSchristos static int CRYPTO_gcm128_aad_loop(void *args);
171*1dcdf01fSchristos static int RAND_bytes_loop(void *args);
172*1dcdf01fSchristos static int EVP_Update_loop(void *args);
173*1dcdf01fSchristos static int EVP_Update_loop_ccm(void *args);
174*1dcdf01fSchristos static int EVP_Update_loop_aead(void *args);
175*1dcdf01fSchristos static int EVP_Digest_loop(void *args);
17660662d10Schristos #ifndef OPENSSL_NO_RSA
177*1dcdf01fSchristos static int RSA_sign_loop(void *args);
178*1dcdf01fSchristos static int RSA_verify_loop(void *args);
17960662d10Schristos #endif
18060662d10Schristos #ifndef OPENSSL_NO_DSA
181*1dcdf01fSchristos static int DSA_sign_loop(void *args);
182*1dcdf01fSchristos static int DSA_verify_loop(void *args);
18360662d10Schristos #endif
184*1dcdf01fSchristos #ifndef OPENSSL_NO_EC
185*1dcdf01fSchristos static int ECDSA_sign_loop(void *args);
186*1dcdf01fSchristos static int ECDSA_verify_loop(void *args);
187*1dcdf01fSchristos static int EdDSA_sign_loop(void *args);
188*1dcdf01fSchristos static int EdDSA_verify_loop(void *args);
18960662d10Schristos #endif
19060662d10Schristos 
191*1dcdf01fSchristos static double Time_F(int s);
192*1dcdf01fSchristos static void print_message(const char *s, long num, int length, int tm);
193*1dcdf01fSchristos static void pkey_print_message(const char *str, const char *str2,
194*1dcdf01fSchristos                                long num, unsigned int bits, int sec);
195*1dcdf01fSchristos static void print_result(int alg, int run_no, int count, double time_used);
196*1dcdf01fSchristos #ifndef NO_FORK
197*1dcdf01fSchristos static int do_multi(int multi, int size_num);
19860662d10Schristos #endif
19960662d10Schristos 
200*1dcdf01fSchristos static const int lengths_list[] = {
201*1dcdf01fSchristos     16, 64, 256, 1024, 8 * 1024, 16 * 1024
202*1dcdf01fSchristos };
203*1dcdf01fSchristos static const int *lengths = lengths_list;
20460662d10Schristos 
205*1dcdf01fSchristos static const int aead_lengths_list[] = {
206*1dcdf01fSchristos     2, 31, 136, 1024, 8 * 1024, 16 * 1024
207*1dcdf01fSchristos };
20860662d10Schristos 
20960662d10Schristos #define START   0
21060662d10Schristos #define STOP    1
21160662d10Schristos 
212*1dcdf01fSchristos #ifdef SIGALRM
21360662d10Schristos 
alarmed(int sig)214*1dcdf01fSchristos static void alarmed(int sig)
215*1dcdf01fSchristos {
216*1dcdf01fSchristos     signal(SIGALRM, alarmed);
217*1dcdf01fSchristos     run = 0;
218*1dcdf01fSchristos }
219*1dcdf01fSchristos 
Time_F(int s)220*1dcdf01fSchristos static double Time_F(int s)
221*1dcdf01fSchristos {
222*1dcdf01fSchristos     double ret = app_tminterval(s, usertime);
223*1dcdf01fSchristos     if (s == STOP)
224*1dcdf01fSchristos         alarm(0);
225*1dcdf01fSchristos     return ret;
226*1dcdf01fSchristos }
227*1dcdf01fSchristos 
228*1dcdf01fSchristos #elif defined(_WIN32)
229*1dcdf01fSchristos 
230*1dcdf01fSchristos # define SIGALRM -1
231*1dcdf01fSchristos 
232*1dcdf01fSchristos static unsigned int lapse;
233*1dcdf01fSchristos static volatile unsigned int schlock;
alarm_win32(unsigned int secs)23460662d10Schristos static void alarm_win32(unsigned int secs)
23560662d10Schristos {
23660662d10Schristos     lapse = secs * 1000;
23760662d10Schristos }
23860662d10Schristos 
23960662d10Schristos # define alarm alarm_win32
24060662d10Schristos 
sleepy(VOID * arg)24160662d10Schristos static DWORD WINAPI sleepy(VOID * arg)
24260662d10Schristos {
24360662d10Schristos     schlock = 1;
24460662d10Schristos     Sleep(lapse);
24560662d10Schristos     run = 0;
24660662d10Schristos     return 0;
24760662d10Schristos }
24860662d10Schristos 
Time_F(int s)24960662d10Schristos static double Time_F(int s)
25060662d10Schristos {
251*1dcdf01fSchristos     double ret;
252*1dcdf01fSchristos     static HANDLE thr;
253*1dcdf01fSchristos 
25460662d10Schristos     if (s == START) {
25560662d10Schristos         schlock = 0;
25660662d10Schristos         thr = CreateThread(NULL, 4096, sleepy, NULL, 0, NULL);
25760662d10Schristos         if (thr == NULL) {
258*1dcdf01fSchristos             DWORD err = GetLastError();
259*1dcdf01fSchristos             BIO_printf(bio_err, "unable to CreateThread (%lu)", err);
260*1dcdf01fSchristos             ExitProcess(err);
26160662d10Schristos         }
26260662d10Schristos         while (!schlock)
26360662d10Schristos             Sleep(0);           /* scheduler spinlock */
264*1dcdf01fSchristos         ret = app_tminterval(s, usertime);
265*1dcdf01fSchristos     } else {
266*1dcdf01fSchristos         ret = app_tminterval(s, usertime);
267*1dcdf01fSchristos         if (run)
268*1dcdf01fSchristos             TerminateThread(thr, 0);
269*1dcdf01fSchristos         CloseHandle(thr);
27060662d10Schristos     }
27160662d10Schristos 
272*1dcdf01fSchristos     return ret;
27360662d10Schristos }
27460662d10Schristos #else
Time_F(int s)27560662d10Schristos static double Time_F(int s)
27660662d10Schristos {
27760662d10Schristos     return app_tminterval(s, usertime);
27860662d10Schristos }
27960662d10Schristos #endif
28060662d10Schristos 
281*1dcdf01fSchristos static void multiblock_speed(const EVP_CIPHER *evp_cipher, int lengths_single,
282*1dcdf01fSchristos                              const openssl_speed_sec_t *seconds);
283*1dcdf01fSchristos 
284*1dcdf01fSchristos #define found(value, pairs, result)\
285*1dcdf01fSchristos     opt_found(value, result, pairs, OSSL_NELEM(pairs))
opt_found(const char * name,unsigned int * result,const OPT_PAIR pairs[],unsigned int nbelem)286*1dcdf01fSchristos static int opt_found(const char *name, unsigned int *result,
287*1dcdf01fSchristos                      const OPT_PAIR pairs[], unsigned int nbelem)
28860662d10Schristos {
289*1dcdf01fSchristos     unsigned int idx;
290*1dcdf01fSchristos 
291*1dcdf01fSchristos     for (idx = 0; idx < nbelem; ++idx, pairs++)
292*1dcdf01fSchristos         if (strcmp(name, pairs->name) == 0) {
293*1dcdf01fSchristos             *result = pairs->retval;
294*1dcdf01fSchristos             return 1;
29560662d10Schristos         }
296*1dcdf01fSchristos     return 0;
297*1dcdf01fSchristos }
29860662d10Schristos 
299*1dcdf01fSchristos typedef enum OPTION_choice {
300*1dcdf01fSchristos     OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
301*1dcdf01fSchristos     OPT_ELAPSED, OPT_EVP, OPT_DECRYPT, OPT_ENGINE, OPT_MULTI,
302*1dcdf01fSchristos     OPT_MR, OPT_MB, OPT_MISALIGN, OPT_ASYNCJOBS, OPT_R_ENUM,
303*1dcdf01fSchristos     OPT_PRIMES, OPT_SECONDS, OPT_BYTES, OPT_AEAD
304*1dcdf01fSchristos } OPTION_CHOICE;
30560662d10Schristos 
306*1dcdf01fSchristos const OPTIONS speed_options[] = {
307*1dcdf01fSchristos     {OPT_HELP_STR, 1, '-', "Usage: %s [options] ciphers...\n"},
308*1dcdf01fSchristos     {OPT_HELP_STR, 1, '-', "Valid options are:\n"},
309*1dcdf01fSchristos     {"help", OPT_HELP, '-', "Display this summary"},
310*1dcdf01fSchristos     {"evp", OPT_EVP, 's', "Use EVP-named cipher or digest"},
311*1dcdf01fSchristos     {"decrypt", OPT_DECRYPT, '-',
312*1dcdf01fSchristos      "Time decryption instead of encryption (only EVP)"},
313*1dcdf01fSchristos     {"aead", OPT_AEAD, '-',
314*1dcdf01fSchristos      "Benchmark EVP-named AEAD cipher in TLS-like sequence"},
315*1dcdf01fSchristos     {"mb", OPT_MB, '-',
316*1dcdf01fSchristos      "Enable (tls1>=1) multi-block mode on EVP-named cipher"},
317*1dcdf01fSchristos     {"mr", OPT_MR, '-', "Produce machine readable output"},
318*1dcdf01fSchristos #ifndef NO_FORK
319*1dcdf01fSchristos     {"multi", OPT_MULTI, 'p', "Run benchmarks in parallel"},
320*1dcdf01fSchristos #endif
321*1dcdf01fSchristos #ifndef OPENSSL_NO_ASYNC
322*1dcdf01fSchristos     {"async_jobs", OPT_ASYNCJOBS, 'p',
323*1dcdf01fSchristos      "Enable async mode and start specified number of jobs"},
324*1dcdf01fSchristos #endif
325*1dcdf01fSchristos     OPT_R_OPTIONS,
326*1dcdf01fSchristos #ifndef OPENSSL_NO_ENGINE
327*1dcdf01fSchristos     {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
328*1dcdf01fSchristos #endif
329*1dcdf01fSchristos     {"elapsed", OPT_ELAPSED, '-',
330*1dcdf01fSchristos      "Use wall-clock time instead of CPU user time as divisor"},
331*1dcdf01fSchristos     {"primes", OPT_PRIMES, 'p', "Specify number of primes (for RSA only)"},
332*1dcdf01fSchristos     {"seconds", OPT_SECONDS, 'p',
333*1dcdf01fSchristos      "Run benchmarks for specified amount of seconds"},
334*1dcdf01fSchristos     {"bytes", OPT_BYTES, 'p',
335*1dcdf01fSchristos      "Run [non-PKI] benchmarks on custom-sized buffer"},
336*1dcdf01fSchristos     {"misalign", OPT_MISALIGN, 'p',
337*1dcdf01fSchristos      "Use specified offset to mis-align buffers"},
338*1dcdf01fSchristos     {NULL}
339*1dcdf01fSchristos };
34060662d10Schristos 
34160662d10Schristos #define D_MD2           0
34260662d10Schristos #define D_MDC2          1
34360662d10Schristos #define D_MD4           2
34460662d10Schristos #define D_MD5           3
34560662d10Schristos #define D_HMAC          4
34660662d10Schristos #define D_SHA1          5
34760662d10Schristos #define D_RMD160        6
34860662d10Schristos #define D_RC4           7
34960662d10Schristos #define D_CBC_DES       8
35060662d10Schristos #define D_EDE3_DES      9
35160662d10Schristos #define D_CBC_IDEA      10
35260662d10Schristos #define D_CBC_SEED      11
35360662d10Schristos #define D_CBC_RC2       12
35460662d10Schristos #define D_CBC_RC5       13
35560662d10Schristos #define D_CBC_BF        14
35660662d10Schristos #define D_CBC_CAST      15
35760662d10Schristos #define D_CBC_128_AES   16
35860662d10Schristos #define D_CBC_192_AES   17
35960662d10Schristos #define D_CBC_256_AES   18
36060662d10Schristos #define D_CBC_128_CML   19
36160662d10Schristos #define D_CBC_192_CML   20
36260662d10Schristos #define D_CBC_256_CML   21
36360662d10Schristos #define D_EVP           22
36460662d10Schristos #define D_SHA256        23
36560662d10Schristos #define D_SHA512        24
36660662d10Schristos #define D_WHIRLPOOL     25
36760662d10Schristos #define D_IGE_128_AES   26
36860662d10Schristos #define D_IGE_192_AES   27
36960662d10Schristos #define D_IGE_256_AES   28
37060662d10Schristos #define D_GHASH         29
371*1dcdf01fSchristos #define D_RAND          30
372*1dcdf01fSchristos /* name of algorithms to test */
373*1dcdf01fSchristos static const char *names[] = {
374*1dcdf01fSchristos     "md2", "mdc2", "md4", "md5", "hmac(md5)", "sha1", "rmd160", "rc4",
375*1dcdf01fSchristos     "des cbc", "des ede3", "idea cbc", "seed cbc",
376*1dcdf01fSchristos     "rc2 cbc", "rc5-32/12 cbc", "blowfish cbc", "cast cbc",
377*1dcdf01fSchristos     "aes-128 cbc", "aes-192 cbc", "aes-256 cbc",
378*1dcdf01fSchristos     "camellia-128 cbc", "camellia-192 cbc", "camellia-256 cbc",
379*1dcdf01fSchristos     "evp", "sha256", "sha512", "whirlpool",
380*1dcdf01fSchristos     "aes-128 ige", "aes-192 ige", "aes-256 ige", "ghash",
381*1dcdf01fSchristos     "rand"
382*1dcdf01fSchristos };
383*1dcdf01fSchristos #define ALGOR_NUM       OSSL_NELEM(names)
384*1dcdf01fSchristos 
385*1dcdf01fSchristos /* list of configured algorithm (remaining) */
386*1dcdf01fSchristos static const OPT_PAIR doit_choices[] = {
387*1dcdf01fSchristos #ifndef OPENSSL_NO_MD2
388*1dcdf01fSchristos     {"md2", D_MD2},
389*1dcdf01fSchristos #endif
390*1dcdf01fSchristos #ifndef OPENSSL_NO_MDC2
391*1dcdf01fSchristos     {"mdc2", D_MDC2},
392*1dcdf01fSchristos #endif
393*1dcdf01fSchristos #ifndef OPENSSL_NO_MD4
394*1dcdf01fSchristos     {"md4", D_MD4},
395*1dcdf01fSchristos #endif
396*1dcdf01fSchristos #ifndef OPENSSL_NO_MD5
397*1dcdf01fSchristos     {"md5", D_MD5},
398*1dcdf01fSchristos     {"hmac", D_HMAC},
399*1dcdf01fSchristos #endif
400*1dcdf01fSchristos     {"sha1", D_SHA1},
401*1dcdf01fSchristos     {"sha256", D_SHA256},
402*1dcdf01fSchristos     {"sha512", D_SHA512},
403*1dcdf01fSchristos #ifndef OPENSSL_NO_WHIRLPOOL
404*1dcdf01fSchristos     {"whirlpool", D_WHIRLPOOL},
405*1dcdf01fSchristos #endif
406*1dcdf01fSchristos #ifndef OPENSSL_NO_RMD160
407*1dcdf01fSchristos     {"ripemd", D_RMD160},
408*1dcdf01fSchristos     {"rmd160", D_RMD160},
409*1dcdf01fSchristos     {"ripemd160", D_RMD160},
410*1dcdf01fSchristos #endif
411*1dcdf01fSchristos #ifndef OPENSSL_NO_RC4
412*1dcdf01fSchristos     {"rc4", D_RC4},
413*1dcdf01fSchristos #endif
414*1dcdf01fSchristos #ifndef OPENSSL_NO_DES
415*1dcdf01fSchristos     {"des-cbc", D_CBC_DES},
416*1dcdf01fSchristos     {"des-ede3", D_EDE3_DES},
417*1dcdf01fSchristos #endif
418*1dcdf01fSchristos     {"aes-128-cbc", D_CBC_128_AES},
419*1dcdf01fSchristos     {"aes-192-cbc", D_CBC_192_AES},
420*1dcdf01fSchristos     {"aes-256-cbc", D_CBC_256_AES},
421*1dcdf01fSchristos     {"aes-128-ige", D_IGE_128_AES},
422*1dcdf01fSchristos     {"aes-192-ige", D_IGE_192_AES},
423*1dcdf01fSchristos     {"aes-256-ige", D_IGE_256_AES},
424*1dcdf01fSchristos #ifndef OPENSSL_NO_RC2
425*1dcdf01fSchristos     {"rc2-cbc", D_CBC_RC2},
426*1dcdf01fSchristos     {"rc2", D_CBC_RC2},
427*1dcdf01fSchristos #endif
428*1dcdf01fSchristos #ifndef OPENSSL_NO_RC5
429*1dcdf01fSchristos     {"rc5-cbc", D_CBC_RC5},
430*1dcdf01fSchristos     {"rc5", D_CBC_RC5},
431*1dcdf01fSchristos #endif
432*1dcdf01fSchristos #ifndef OPENSSL_NO_IDEA
433*1dcdf01fSchristos     {"idea-cbc", D_CBC_IDEA},
434*1dcdf01fSchristos     {"idea", D_CBC_IDEA},
435*1dcdf01fSchristos #endif
436*1dcdf01fSchristos #ifndef OPENSSL_NO_SEED
437*1dcdf01fSchristos     {"seed-cbc", D_CBC_SEED},
438*1dcdf01fSchristos     {"seed", D_CBC_SEED},
439*1dcdf01fSchristos #endif
440*1dcdf01fSchristos #ifndef OPENSSL_NO_BF
441*1dcdf01fSchristos     {"bf-cbc", D_CBC_BF},
442*1dcdf01fSchristos     {"blowfish", D_CBC_BF},
443*1dcdf01fSchristos     {"bf", D_CBC_BF},
444*1dcdf01fSchristos #endif
445*1dcdf01fSchristos #ifndef OPENSSL_NO_CAST
446*1dcdf01fSchristos     {"cast-cbc", D_CBC_CAST},
447*1dcdf01fSchristos     {"cast", D_CBC_CAST},
448*1dcdf01fSchristos     {"cast5", D_CBC_CAST},
449*1dcdf01fSchristos #endif
450*1dcdf01fSchristos     {"ghash", D_GHASH},
451*1dcdf01fSchristos     {"rand", D_RAND}
452*1dcdf01fSchristos };
453*1dcdf01fSchristos 
454*1dcdf01fSchristos static double results[ALGOR_NUM][OSSL_NELEM(lengths_list)];
455*1dcdf01fSchristos 
456*1dcdf01fSchristos #ifndef OPENSSL_NO_DSA
45760662d10Schristos # define R_DSA_512       0
45860662d10Schristos # define R_DSA_1024      1
45960662d10Schristos # define R_DSA_2048      2
460*1dcdf01fSchristos static const OPT_PAIR dsa_choices[] = {
461*1dcdf01fSchristos     {"dsa512", R_DSA_512},
462*1dcdf01fSchristos     {"dsa1024", R_DSA_1024},
463*1dcdf01fSchristos     {"dsa2048", R_DSA_2048}
464*1dcdf01fSchristos };
465*1dcdf01fSchristos # define DSA_NUM         OSSL_NELEM(dsa_choices)
466*1dcdf01fSchristos 
467*1dcdf01fSchristos static double dsa_results[DSA_NUM][2];  /* 2 ops: sign then verify */
468*1dcdf01fSchristos #endif  /* OPENSSL_NO_DSA */
469*1dcdf01fSchristos 
47060662d10Schristos #define R_RSA_512       0
47160662d10Schristos #define R_RSA_1024      1
47260662d10Schristos #define R_RSA_2048      2
473*1dcdf01fSchristos #define R_RSA_3072      3
474*1dcdf01fSchristos #define R_RSA_4096      4
475*1dcdf01fSchristos #define R_RSA_7680      5
476*1dcdf01fSchristos #define R_RSA_15360     6
477*1dcdf01fSchristos #ifndef OPENSSL_NO_RSA
478*1dcdf01fSchristos static const OPT_PAIR rsa_choices[] = {
479*1dcdf01fSchristos     {"rsa512", R_RSA_512},
480*1dcdf01fSchristos     {"rsa1024", R_RSA_1024},
481*1dcdf01fSchristos     {"rsa2048", R_RSA_2048},
482*1dcdf01fSchristos     {"rsa3072", R_RSA_3072},
483*1dcdf01fSchristos     {"rsa4096", R_RSA_4096},
484*1dcdf01fSchristos     {"rsa7680", R_RSA_7680},
485*1dcdf01fSchristos     {"rsa15360", R_RSA_15360}
486*1dcdf01fSchristos };
487*1dcdf01fSchristos # define RSA_NUM OSSL_NELEM(rsa_choices)
48860662d10Schristos 
489*1dcdf01fSchristos static double rsa_results[RSA_NUM][2];  /* 2 ops: sign then verify */
490*1dcdf01fSchristos #endif /* OPENSSL_NO_RSA */
49160662d10Schristos 
492*1dcdf01fSchristos enum {
493*1dcdf01fSchristos     R_EC_P160,
494*1dcdf01fSchristos     R_EC_P192,
495*1dcdf01fSchristos     R_EC_P224,
496*1dcdf01fSchristos     R_EC_P256,
497*1dcdf01fSchristos     R_EC_P384,
498*1dcdf01fSchristos     R_EC_P521,
499*1dcdf01fSchristos #ifndef OPENSSL_NO_EC2M
500*1dcdf01fSchristos     R_EC_K163,
501*1dcdf01fSchristos     R_EC_K233,
502*1dcdf01fSchristos     R_EC_K283,
503*1dcdf01fSchristos     R_EC_K409,
504*1dcdf01fSchristos     R_EC_K571,
505*1dcdf01fSchristos     R_EC_B163,
506*1dcdf01fSchristos     R_EC_B233,
507*1dcdf01fSchristos     R_EC_B283,
508*1dcdf01fSchristos     R_EC_B409,
509*1dcdf01fSchristos     R_EC_B571,
510*1dcdf01fSchristos #endif
511*1dcdf01fSchristos     R_EC_BRP256R1,
512*1dcdf01fSchristos     R_EC_BRP256T1,
513*1dcdf01fSchristos     R_EC_BRP384R1,
514*1dcdf01fSchristos     R_EC_BRP384T1,
515*1dcdf01fSchristos     R_EC_BRP512R1,
516*1dcdf01fSchristos     R_EC_BRP512T1,
517*1dcdf01fSchristos     R_EC_X25519,
518*1dcdf01fSchristos     R_EC_X448
519*1dcdf01fSchristos };
520*1dcdf01fSchristos 
521*1dcdf01fSchristos #ifndef OPENSSL_NO_EC
522*1dcdf01fSchristos static OPT_PAIR ecdsa_choices[] = {
523*1dcdf01fSchristos     {"ecdsap160", R_EC_P160},
524*1dcdf01fSchristos     {"ecdsap192", R_EC_P192},
525*1dcdf01fSchristos     {"ecdsap224", R_EC_P224},
526*1dcdf01fSchristos     {"ecdsap256", R_EC_P256},
527*1dcdf01fSchristos     {"ecdsap384", R_EC_P384},
528*1dcdf01fSchristos     {"ecdsap521", R_EC_P521},
529*1dcdf01fSchristos # ifndef OPENSSL_NO_EC2M
530*1dcdf01fSchristos     {"ecdsak163", R_EC_K163},
531*1dcdf01fSchristos     {"ecdsak233", R_EC_K233},
532*1dcdf01fSchristos     {"ecdsak283", R_EC_K283},
533*1dcdf01fSchristos     {"ecdsak409", R_EC_K409},
534*1dcdf01fSchristos     {"ecdsak571", R_EC_K571},
535*1dcdf01fSchristos     {"ecdsab163", R_EC_B163},
536*1dcdf01fSchristos     {"ecdsab233", R_EC_B233},
537*1dcdf01fSchristos     {"ecdsab283", R_EC_B283},
538*1dcdf01fSchristos     {"ecdsab409", R_EC_B409},
539*1dcdf01fSchristos     {"ecdsab571", R_EC_B571},
540*1dcdf01fSchristos # endif
541*1dcdf01fSchristos     {"ecdsabrp256r1", R_EC_BRP256R1},
542*1dcdf01fSchristos     {"ecdsabrp256t1", R_EC_BRP256T1},
543*1dcdf01fSchristos     {"ecdsabrp384r1", R_EC_BRP384R1},
544*1dcdf01fSchristos     {"ecdsabrp384t1", R_EC_BRP384T1},
545*1dcdf01fSchristos     {"ecdsabrp512r1", R_EC_BRP512R1},
546*1dcdf01fSchristos     {"ecdsabrp512t1", R_EC_BRP512T1}
547*1dcdf01fSchristos };
548*1dcdf01fSchristos # define ECDSA_NUM       OSSL_NELEM(ecdsa_choices)
549*1dcdf01fSchristos 
550*1dcdf01fSchristos static double ecdsa_results[ECDSA_NUM][2];    /* 2 ops: sign then verify */
551*1dcdf01fSchristos 
552*1dcdf01fSchristos static const OPT_PAIR ecdh_choices[] = {
553*1dcdf01fSchristos     {"ecdhp160", R_EC_P160},
554*1dcdf01fSchristos     {"ecdhp192", R_EC_P192},
555*1dcdf01fSchristos     {"ecdhp224", R_EC_P224},
556*1dcdf01fSchristos     {"ecdhp256", R_EC_P256},
557*1dcdf01fSchristos     {"ecdhp384", R_EC_P384},
558*1dcdf01fSchristos     {"ecdhp521", R_EC_P521},
559*1dcdf01fSchristos # ifndef OPENSSL_NO_EC2M
560*1dcdf01fSchristos     {"ecdhk163", R_EC_K163},
561*1dcdf01fSchristos     {"ecdhk233", R_EC_K233},
562*1dcdf01fSchristos     {"ecdhk283", R_EC_K283},
563*1dcdf01fSchristos     {"ecdhk409", R_EC_K409},
564*1dcdf01fSchristos     {"ecdhk571", R_EC_K571},
565*1dcdf01fSchristos     {"ecdhb163", R_EC_B163},
566*1dcdf01fSchristos     {"ecdhb233", R_EC_B233},
567*1dcdf01fSchristos     {"ecdhb283", R_EC_B283},
568*1dcdf01fSchristos     {"ecdhb409", R_EC_B409},
569*1dcdf01fSchristos     {"ecdhb571", R_EC_B571},
570*1dcdf01fSchristos # endif
571*1dcdf01fSchristos     {"ecdhbrp256r1", R_EC_BRP256R1},
572*1dcdf01fSchristos     {"ecdhbrp256t1", R_EC_BRP256T1},
573*1dcdf01fSchristos     {"ecdhbrp384r1", R_EC_BRP384R1},
574*1dcdf01fSchristos     {"ecdhbrp384t1", R_EC_BRP384T1},
575*1dcdf01fSchristos     {"ecdhbrp512r1", R_EC_BRP512R1},
576*1dcdf01fSchristos     {"ecdhbrp512t1", R_EC_BRP512T1},
577*1dcdf01fSchristos     {"ecdhx25519", R_EC_X25519},
578*1dcdf01fSchristos     {"ecdhx448", R_EC_X448}
579*1dcdf01fSchristos };
580*1dcdf01fSchristos # define EC_NUM       OSSL_NELEM(ecdh_choices)
581*1dcdf01fSchristos 
582*1dcdf01fSchristos static double ecdh_results[EC_NUM][1];  /* 1 op: derivation */
583*1dcdf01fSchristos 
584*1dcdf01fSchristos #define R_EC_Ed25519    0
585*1dcdf01fSchristos #define R_EC_Ed448      1
586*1dcdf01fSchristos static OPT_PAIR eddsa_choices[] = {
587*1dcdf01fSchristos     {"ed25519", R_EC_Ed25519},
588*1dcdf01fSchristos     {"ed448", R_EC_Ed448}
589*1dcdf01fSchristos };
590*1dcdf01fSchristos # define EdDSA_NUM       OSSL_NELEM(eddsa_choices)
591*1dcdf01fSchristos 
592*1dcdf01fSchristos static double eddsa_results[EdDSA_NUM][2];    /* 2 ops: sign then verify */
593*1dcdf01fSchristos #endif /* OPENSSL_NO_EC */
594*1dcdf01fSchristos 
595*1dcdf01fSchristos #ifndef SIGALRM
596*1dcdf01fSchristos # define COND(d) (count < (d))
597*1dcdf01fSchristos # define COUNT(d) (d)
598*1dcdf01fSchristos #else
599*1dcdf01fSchristos # define COND(unused_cond) (run && count<0x7fffffff)
600*1dcdf01fSchristos # define COUNT(d) (count)
601*1dcdf01fSchristos #endif                          /* SIGALRM */
602*1dcdf01fSchristos 
603*1dcdf01fSchristos typedef struct loopargs_st {
604*1dcdf01fSchristos     ASYNC_JOB *inprogress_job;
605*1dcdf01fSchristos     ASYNC_WAIT_CTX *wait_ctx;
606*1dcdf01fSchristos     unsigned char *buf;
607*1dcdf01fSchristos     unsigned char *buf2;
608*1dcdf01fSchristos     unsigned char *buf_malloc;
609*1dcdf01fSchristos     unsigned char *buf2_malloc;
610*1dcdf01fSchristos     unsigned char *key;
611*1dcdf01fSchristos     unsigned int siglen;
612*1dcdf01fSchristos     size_t sigsize;
61360662d10Schristos #ifndef OPENSSL_NO_RSA
61460662d10Schristos     RSA *rsa_key[RSA_NUM];
61560662d10Schristos #endif
61660662d10Schristos #ifndef OPENSSL_NO_DSA
61760662d10Schristos     DSA *dsa_key[DSA_NUM];
618*1dcdf01fSchristos #endif
619*1dcdf01fSchristos #ifndef OPENSSL_NO_EC
620*1dcdf01fSchristos     EC_KEY *ecdsa[ECDSA_NUM];
621*1dcdf01fSchristos     EVP_PKEY_CTX *ecdh_ctx[EC_NUM];
622*1dcdf01fSchristos     EVP_MD_CTX *eddsa_ctx[EdDSA_NUM];
623*1dcdf01fSchristos     unsigned char *secret_a;
624*1dcdf01fSchristos     unsigned char *secret_b;
625*1dcdf01fSchristos     size_t outlen[EC_NUM];
626*1dcdf01fSchristos #endif
627*1dcdf01fSchristos     EVP_CIPHER_CTX *ctx;
628*1dcdf01fSchristos     HMAC_CTX *hctx;
629*1dcdf01fSchristos     GCM128_CONTEXT *gcm_ctx;
630*1dcdf01fSchristos } loopargs_t;
631*1dcdf01fSchristos static int run_benchmark(int async_jobs, int (*loop_function) (void *),
632*1dcdf01fSchristos                          loopargs_t * loopargs);
633*1dcdf01fSchristos 
634*1dcdf01fSchristos static unsigned int testnum;
635*1dcdf01fSchristos 
636*1dcdf01fSchristos /* Nb of iterations to do per algorithm and key-size */
637*1dcdf01fSchristos static long c[ALGOR_NUM][OSSL_NELEM(lengths_list)];
638*1dcdf01fSchristos 
639*1dcdf01fSchristos #ifndef OPENSSL_NO_MD2
EVP_Digest_MD2_loop(void * args)640*1dcdf01fSchristos static int EVP_Digest_MD2_loop(void *args)
641*1dcdf01fSchristos {
642*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
643*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
644*1dcdf01fSchristos     unsigned char md2[MD2_DIGEST_LENGTH];
645*1dcdf01fSchristos     int count;
646*1dcdf01fSchristos 
647*1dcdf01fSchristos     for (count = 0; COND(c[D_MD2][testnum]); count++) {
648*1dcdf01fSchristos         if (!EVP_Digest(buf, (size_t)lengths[testnum], md2, NULL, EVP_md2(),
649*1dcdf01fSchristos                         NULL))
650*1dcdf01fSchristos             return -1;
651*1dcdf01fSchristos     }
652*1dcdf01fSchristos     return count;
653*1dcdf01fSchristos }
654*1dcdf01fSchristos #endif
655*1dcdf01fSchristos 
656*1dcdf01fSchristos #ifndef OPENSSL_NO_MDC2
EVP_Digest_MDC2_loop(void * args)657*1dcdf01fSchristos static int EVP_Digest_MDC2_loop(void *args)
658*1dcdf01fSchristos {
659*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
660*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
661*1dcdf01fSchristos     unsigned char mdc2[MDC2_DIGEST_LENGTH];
662*1dcdf01fSchristos     int count;
663*1dcdf01fSchristos 
664*1dcdf01fSchristos     for (count = 0; COND(c[D_MDC2][testnum]); count++) {
665*1dcdf01fSchristos         if (!EVP_Digest(buf, (size_t)lengths[testnum], mdc2, NULL, EVP_mdc2(),
666*1dcdf01fSchristos                         NULL))
667*1dcdf01fSchristos             return -1;
668*1dcdf01fSchristos     }
669*1dcdf01fSchristos     return count;
670*1dcdf01fSchristos }
671*1dcdf01fSchristos #endif
672*1dcdf01fSchristos 
673*1dcdf01fSchristos #ifndef OPENSSL_NO_MD4
EVP_Digest_MD4_loop(void * args)674*1dcdf01fSchristos static int EVP_Digest_MD4_loop(void *args)
675*1dcdf01fSchristos {
676*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
677*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
678*1dcdf01fSchristos     unsigned char md4[MD4_DIGEST_LENGTH];
679*1dcdf01fSchristos     int count;
680*1dcdf01fSchristos 
681*1dcdf01fSchristos     for (count = 0; COND(c[D_MD4][testnum]); count++) {
682*1dcdf01fSchristos         if (!EVP_Digest(buf, (size_t)lengths[testnum], md4, NULL, EVP_md4(),
683*1dcdf01fSchristos                         NULL))
684*1dcdf01fSchristos             return -1;
685*1dcdf01fSchristos     }
686*1dcdf01fSchristos     return count;
687*1dcdf01fSchristos }
688*1dcdf01fSchristos #endif
689*1dcdf01fSchristos 
690*1dcdf01fSchristos #ifndef OPENSSL_NO_MD5
MD5_loop(void * args)691*1dcdf01fSchristos static int MD5_loop(void *args)
692*1dcdf01fSchristos {
693*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
694*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
695*1dcdf01fSchristos     unsigned char md5[MD5_DIGEST_LENGTH];
696*1dcdf01fSchristos     int count;
697*1dcdf01fSchristos     for (count = 0; COND(c[D_MD5][testnum]); count++)
698*1dcdf01fSchristos         MD5(buf, lengths[testnum], md5);
699*1dcdf01fSchristos     return count;
700*1dcdf01fSchristos }
701*1dcdf01fSchristos 
HMAC_loop(void * args)702*1dcdf01fSchristos static int HMAC_loop(void *args)
703*1dcdf01fSchristos {
704*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
705*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
706*1dcdf01fSchristos     HMAC_CTX *hctx = tempargs->hctx;
707*1dcdf01fSchristos     unsigned char hmac[MD5_DIGEST_LENGTH];
708*1dcdf01fSchristos     int count;
709*1dcdf01fSchristos 
710*1dcdf01fSchristos     for (count = 0; COND(c[D_HMAC][testnum]); count++) {
711*1dcdf01fSchristos         HMAC_Init_ex(hctx, NULL, 0, NULL, NULL);
712*1dcdf01fSchristos         HMAC_Update(hctx, buf, lengths[testnum]);
713*1dcdf01fSchristos         HMAC_Final(hctx, hmac, NULL);
714*1dcdf01fSchristos     }
715*1dcdf01fSchristos     return count;
716*1dcdf01fSchristos }
717*1dcdf01fSchristos #endif
718*1dcdf01fSchristos 
SHA1_loop(void * args)719*1dcdf01fSchristos static int SHA1_loop(void *args)
720*1dcdf01fSchristos {
721*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
722*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
723*1dcdf01fSchristos     unsigned char sha[SHA_DIGEST_LENGTH];
724*1dcdf01fSchristos     int count;
725*1dcdf01fSchristos     for (count = 0; COND(c[D_SHA1][testnum]); count++)
726*1dcdf01fSchristos         SHA1(buf, lengths[testnum], sha);
727*1dcdf01fSchristos     return count;
728*1dcdf01fSchristos }
729*1dcdf01fSchristos 
SHA256_loop(void * args)730*1dcdf01fSchristos static int SHA256_loop(void *args)
731*1dcdf01fSchristos {
732*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
733*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
734*1dcdf01fSchristos     unsigned char sha256[SHA256_DIGEST_LENGTH];
735*1dcdf01fSchristos     int count;
736*1dcdf01fSchristos     for (count = 0; COND(c[D_SHA256][testnum]); count++)
737*1dcdf01fSchristos         SHA256(buf, lengths[testnum], sha256);
738*1dcdf01fSchristos     return count;
739*1dcdf01fSchristos }
740*1dcdf01fSchristos 
SHA512_loop(void * args)741*1dcdf01fSchristos static int SHA512_loop(void *args)
742*1dcdf01fSchristos {
743*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
744*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
745*1dcdf01fSchristos     unsigned char sha512[SHA512_DIGEST_LENGTH];
746*1dcdf01fSchristos     int count;
747*1dcdf01fSchristos     for (count = 0; COND(c[D_SHA512][testnum]); count++)
748*1dcdf01fSchristos         SHA512(buf, lengths[testnum], sha512);
749*1dcdf01fSchristos     return count;
750*1dcdf01fSchristos }
751*1dcdf01fSchristos 
752*1dcdf01fSchristos #ifndef OPENSSL_NO_WHIRLPOOL
WHIRLPOOL_loop(void * args)753*1dcdf01fSchristos static int WHIRLPOOL_loop(void *args)
754*1dcdf01fSchristos {
755*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
756*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
757*1dcdf01fSchristos     unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
758*1dcdf01fSchristos     int count;
759*1dcdf01fSchristos     for (count = 0; COND(c[D_WHIRLPOOL][testnum]); count++)
760*1dcdf01fSchristos         WHIRLPOOL(buf, lengths[testnum], whirlpool);
761*1dcdf01fSchristos     return count;
762*1dcdf01fSchristos }
763*1dcdf01fSchristos #endif
764*1dcdf01fSchristos 
765*1dcdf01fSchristos #ifndef OPENSSL_NO_RMD160
EVP_Digest_RMD160_loop(void * args)766*1dcdf01fSchristos static int EVP_Digest_RMD160_loop(void *args)
767*1dcdf01fSchristos {
768*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
769*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
770*1dcdf01fSchristos     unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
771*1dcdf01fSchristos     int count;
772*1dcdf01fSchristos     for (count = 0; COND(c[D_RMD160][testnum]); count++) {
773*1dcdf01fSchristos         if (!EVP_Digest(buf, (size_t)lengths[testnum], &(rmd160[0]),
774*1dcdf01fSchristos                         NULL, EVP_ripemd160(), NULL))
775*1dcdf01fSchristos             return -1;
776*1dcdf01fSchristos     }
777*1dcdf01fSchristos     return count;
778*1dcdf01fSchristos }
779*1dcdf01fSchristos #endif
780*1dcdf01fSchristos 
781*1dcdf01fSchristos #ifndef OPENSSL_NO_RC4
782*1dcdf01fSchristos static RC4_KEY rc4_ks;
RC4_loop(void * args)783*1dcdf01fSchristos static int RC4_loop(void *args)
784*1dcdf01fSchristos {
785*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
786*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
787*1dcdf01fSchristos     int count;
788*1dcdf01fSchristos     for (count = 0; COND(c[D_RC4][testnum]); count++)
789*1dcdf01fSchristos         RC4(&rc4_ks, (size_t)lengths[testnum], buf, buf);
790*1dcdf01fSchristos     return count;
791*1dcdf01fSchristos }
792*1dcdf01fSchristos #endif
793*1dcdf01fSchristos 
794*1dcdf01fSchristos #ifndef OPENSSL_NO_DES
795*1dcdf01fSchristos static unsigned char DES_iv[8];
796*1dcdf01fSchristos static DES_key_schedule sch;
797*1dcdf01fSchristos static DES_key_schedule sch2;
798*1dcdf01fSchristos static DES_key_schedule sch3;
DES_ncbc_encrypt_loop(void * args)799*1dcdf01fSchristos static int DES_ncbc_encrypt_loop(void *args)
800*1dcdf01fSchristos {
801*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
802*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
803*1dcdf01fSchristos     int count;
804*1dcdf01fSchristos     for (count = 0; COND(c[D_CBC_DES][testnum]); count++)
805*1dcdf01fSchristos         DES_ncbc_encrypt(buf, buf, lengths[testnum], &sch,
806*1dcdf01fSchristos                          &DES_iv, DES_ENCRYPT);
807*1dcdf01fSchristos     return count;
808*1dcdf01fSchristos }
809*1dcdf01fSchristos 
DES_ede3_cbc_encrypt_loop(void * args)810*1dcdf01fSchristos static int DES_ede3_cbc_encrypt_loop(void *args)
811*1dcdf01fSchristos {
812*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
813*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
814*1dcdf01fSchristos     int count;
815*1dcdf01fSchristos     for (count = 0; COND(c[D_EDE3_DES][testnum]); count++)
816*1dcdf01fSchristos         DES_ede3_cbc_encrypt(buf, buf, lengths[testnum],
817*1dcdf01fSchristos                              &sch, &sch2, &sch3, &DES_iv, DES_ENCRYPT);
818*1dcdf01fSchristos     return count;
819*1dcdf01fSchristos }
820*1dcdf01fSchristos #endif
821*1dcdf01fSchristos 
822*1dcdf01fSchristos #define MAX_BLOCK_SIZE 128
823*1dcdf01fSchristos 
824*1dcdf01fSchristos static unsigned char iv[2 * MAX_BLOCK_SIZE / 8];
825*1dcdf01fSchristos static AES_KEY aes_ks1, aes_ks2, aes_ks3;
AES_cbc_128_encrypt_loop(void * args)826*1dcdf01fSchristos static int AES_cbc_128_encrypt_loop(void *args)
827*1dcdf01fSchristos {
828*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
829*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
830*1dcdf01fSchristos     int count;
831*1dcdf01fSchristos     for (count = 0; COND(c[D_CBC_128_AES][testnum]); count++)
832*1dcdf01fSchristos         AES_cbc_encrypt(buf, buf,
833*1dcdf01fSchristos                         (size_t)lengths[testnum], &aes_ks1, iv, AES_ENCRYPT);
834*1dcdf01fSchristos     return count;
835*1dcdf01fSchristos }
836*1dcdf01fSchristos 
AES_cbc_192_encrypt_loop(void * args)837*1dcdf01fSchristos static int AES_cbc_192_encrypt_loop(void *args)
838*1dcdf01fSchristos {
839*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
840*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
841*1dcdf01fSchristos     int count;
842*1dcdf01fSchristos     for (count = 0; COND(c[D_CBC_192_AES][testnum]); count++)
843*1dcdf01fSchristos         AES_cbc_encrypt(buf, buf,
844*1dcdf01fSchristos                         (size_t)lengths[testnum], &aes_ks2, iv, AES_ENCRYPT);
845*1dcdf01fSchristos     return count;
846*1dcdf01fSchristos }
847*1dcdf01fSchristos 
AES_cbc_256_encrypt_loop(void * args)848*1dcdf01fSchristos static int AES_cbc_256_encrypt_loop(void *args)
849*1dcdf01fSchristos {
850*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
851*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
852*1dcdf01fSchristos     int count;
853*1dcdf01fSchristos     for (count = 0; COND(c[D_CBC_256_AES][testnum]); count++)
854*1dcdf01fSchristos         AES_cbc_encrypt(buf, buf,
855*1dcdf01fSchristos                         (size_t)lengths[testnum], &aes_ks3, iv, AES_ENCRYPT);
856*1dcdf01fSchristos     return count;
857*1dcdf01fSchristos }
858*1dcdf01fSchristos 
AES_ige_128_encrypt_loop(void * args)859*1dcdf01fSchristos static int AES_ige_128_encrypt_loop(void *args)
860*1dcdf01fSchristos {
861*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
862*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
863*1dcdf01fSchristos     unsigned char *buf2 = tempargs->buf2;
864*1dcdf01fSchristos     int count;
865*1dcdf01fSchristos     for (count = 0; COND(c[D_IGE_128_AES][testnum]); count++)
866*1dcdf01fSchristos         AES_ige_encrypt(buf, buf2,
867*1dcdf01fSchristos                         (size_t)lengths[testnum], &aes_ks1, iv, AES_ENCRYPT);
868*1dcdf01fSchristos     return count;
869*1dcdf01fSchristos }
870*1dcdf01fSchristos 
AES_ige_192_encrypt_loop(void * args)871*1dcdf01fSchristos static int AES_ige_192_encrypt_loop(void *args)
872*1dcdf01fSchristos {
873*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
874*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
875*1dcdf01fSchristos     unsigned char *buf2 = tempargs->buf2;
876*1dcdf01fSchristos     int count;
877*1dcdf01fSchristos     for (count = 0; COND(c[D_IGE_192_AES][testnum]); count++)
878*1dcdf01fSchristos         AES_ige_encrypt(buf, buf2,
879*1dcdf01fSchristos                         (size_t)lengths[testnum], &aes_ks2, iv, AES_ENCRYPT);
880*1dcdf01fSchristos     return count;
881*1dcdf01fSchristos }
882*1dcdf01fSchristos 
AES_ige_256_encrypt_loop(void * args)883*1dcdf01fSchristos static int AES_ige_256_encrypt_loop(void *args)
884*1dcdf01fSchristos {
885*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
886*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
887*1dcdf01fSchristos     unsigned char *buf2 = tempargs->buf2;
888*1dcdf01fSchristos     int count;
889*1dcdf01fSchristos     for (count = 0; COND(c[D_IGE_256_AES][testnum]); count++)
890*1dcdf01fSchristos         AES_ige_encrypt(buf, buf2,
891*1dcdf01fSchristos                         (size_t)lengths[testnum], &aes_ks3, iv, AES_ENCRYPT);
892*1dcdf01fSchristos     return count;
893*1dcdf01fSchristos }
894*1dcdf01fSchristos 
CRYPTO_gcm128_aad_loop(void * args)895*1dcdf01fSchristos static int CRYPTO_gcm128_aad_loop(void *args)
896*1dcdf01fSchristos {
897*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
898*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
899*1dcdf01fSchristos     GCM128_CONTEXT *gcm_ctx = tempargs->gcm_ctx;
900*1dcdf01fSchristos     int count;
901*1dcdf01fSchristos     for (count = 0; COND(c[D_GHASH][testnum]); count++)
902*1dcdf01fSchristos         CRYPTO_gcm128_aad(gcm_ctx, buf, lengths[testnum]);
903*1dcdf01fSchristos     return count;
904*1dcdf01fSchristos }
905*1dcdf01fSchristos 
RAND_bytes_loop(void * args)906*1dcdf01fSchristos static int RAND_bytes_loop(void *args)
907*1dcdf01fSchristos {
908*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
909*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
910*1dcdf01fSchristos     int count;
911*1dcdf01fSchristos 
912*1dcdf01fSchristos     for (count = 0; COND(c[D_RAND][testnum]); count++)
913*1dcdf01fSchristos         RAND_bytes(buf, lengths[testnum]);
914*1dcdf01fSchristos     return count;
915*1dcdf01fSchristos }
916*1dcdf01fSchristos 
917*1dcdf01fSchristos static long save_count = 0;
918*1dcdf01fSchristos static int decrypt = 0;
EVP_Update_loop(void * args)919*1dcdf01fSchristos static int EVP_Update_loop(void *args)
920*1dcdf01fSchristos {
921*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
922*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
923*1dcdf01fSchristos     EVP_CIPHER_CTX *ctx = tempargs->ctx;
924*1dcdf01fSchristos     int outl, count, rc;
925*1dcdf01fSchristos #ifndef SIGALRM
926*1dcdf01fSchristos     int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
927*1dcdf01fSchristos #endif
928*1dcdf01fSchristos     if (decrypt) {
929*1dcdf01fSchristos         for (count = 0; COND(nb_iter); count++) {
930*1dcdf01fSchristos             rc = EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
931*1dcdf01fSchristos             if (rc != 1) {
932*1dcdf01fSchristos                 /* reset iv in case of counter overflow */
933*1dcdf01fSchristos                 EVP_CipherInit_ex(ctx, NULL, NULL, NULL, iv, -1);
934*1dcdf01fSchristos             }
935*1dcdf01fSchristos         }
936*1dcdf01fSchristos     } else {
937*1dcdf01fSchristos         for (count = 0; COND(nb_iter); count++) {
938*1dcdf01fSchristos             rc = EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
939*1dcdf01fSchristos             if (rc != 1) {
940*1dcdf01fSchristos                 /* reset iv in case of counter overflow */
941*1dcdf01fSchristos                 EVP_CipherInit_ex(ctx, NULL, NULL, NULL, iv, -1);
942*1dcdf01fSchristos             }
943*1dcdf01fSchristos         }
944*1dcdf01fSchristos     }
945*1dcdf01fSchristos     if (decrypt)
946*1dcdf01fSchristos         EVP_DecryptFinal_ex(ctx, buf, &outl);
947*1dcdf01fSchristos     else
948*1dcdf01fSchristos         EVP_EncryptFinal_ex(ctx, buf, &outl);
949*1dcdf01fSchristos     return count;
950*1dcdf01fSchristos }
951*1dcdf01fSchristos 
952*1dcdf01fSchristos /*
953*1dcdf01fSchristos  * CCM does not support streaming. For the purpose of performance measurement,
954*1dcdf01fSchristos  * each message is encrypted using the same (key,iv)-pair. Do not use this
955*1dcdf01fSchristos  * code in your application.
956*1dcdf01fSchristos  */
EVP_Update_loop_ccm(void * args)957*1dcdf01fSchristos static int EVP_Update_loop_ccm(void *args)
958*1dcdf01fSchristos {
959*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
960*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
961*1dcdf01fSchristos     EVP_CIPHER_CTX *ctx = tempargs->ctx;
962*1dcdf01fSchristos     int outl, count;
963*1dcdf01fSchristos     unsigned char tag[12];
964*1dcdf01fSchristos #ifndef SIGALRM
965*1dcdf01fSchristos     int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
966*1dcdf01fSchristos #endif
967*1dcdf01fSchristos     if (decrypt) {
968*1dcdf01fSchristos         for (count = 0; COND(nb_iter); count++) {
969*1dcdf01fSchristos             EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, sizeof(tag), tag);
970*1dcdf01fSchristos             /* reset iv */
971*1dcdf01fSchristos             EVP_DecryptInit_ex(ctx, NULL, NULL, NULL, iv);
972*1dcdf01fSchristos             /* counter is reset on every update */
973*1dcdf01fSchristos             EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
974*1dcdf01fSchristos         }
975*1dcdf01fSchristos     } else {
976*1dcdf01fSchristos         for (count = 0; COND(nb_iter); count++) {
977*1dcdf01fSchristos             /* restore iv length field */
978*1dcdf01fSchristos             EVP_EncryptUpdate(ctx, NULL, &outl, NULL, lengths[testnum]);
979*1dcdf01fSchristos             /* counter is reset on every update */
980*1dcdf01fSchristos             EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
981*1dcdf01fSchristos         }
982*1dcdf01fSchristos     }
983*1dcdf01fSchristos     if (decrypt)
984*1dcdf01fSchristos         EVP_DecryptFinal_ex(ctx, buf, &outl);
985*1dcdf01fSchristos     else
986*1dcdf01fSchristos         EVP_EncryptFinal_ex(ctx, buf, &outl);
987*1dcdf01fSchristos     return count;
988*1dcdf01fSchristos }
989*1dcdf01fSchristos 
990*1dcdf01fSchristos /*
991*1dcdf01fSchristos  * To make AEAD benchmarking more relevant perform TLS-like operations,
992*1dcdf01fSchristos  * 13-byte AAD followed by payload. But don't use TLS-formatted AAD, as
993*1dcdf01fSchristos  * payload length is not actually limited by 16KB...
994*1dcdf01fSchristos  */
EVP_Update_loop_aead(void * args)995*1dcdf01fSchristos static int EVP_Update_loop_aead(void *args)
996*1dcdf01fSchristos {
997*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
998*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
999*1dcdf01fSchristos     EVP_CIPHER_CTX *ctx = tempargs->ctx;
1000*1dcdf01fSchristos     int outl, count;
1001*1dcdf01fSchristos     unsigned char aad[13] = { 0xcc };
1002*1dcdf01fSchristos     unsigned char faketag[16] = { 0xcc };
1003*1dcdf01fSchristos #ifndef SIGALRM
1004*1dcdf01fSchristos     int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
1005*1dcdf01fSchristos #endif
1006*1dcdf01fSchristos     if (decrypt) {
1007*1dcdf01fSchristos         for (count = 0; COND(nb_iter); count++) {
1008*1dcdf01fSchristos             EVP_DecryptInit_ex(ctx, NULL, NULL, NULL, iv);
1009*1dcdf01fSchristos             EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG,
1010*1dcdf01fSchristos                                 sizeof(faketag), faketag);
1011*1dcdf01fSchristos             EVP_DecryptUpdate(ctx, NULL, &outl, aad, sizeof(aad));
1012*1dcdf01fSchristos             EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
1013*1dcdf01fSchristos             EVP_DecryptFinal_ex(ctx, buf + outl, &outl);
1014*1dcdf01fSchristos         }
1015*1dcdf01fSchristos     } else {
1016*1dcdf01fSchristos         for (count = 0; COND(nb_iter); count++) {
1017*1dcdf01fSchristos             EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, iv);
1018*1dcdf01fSchristos             EVP_EncryptUpdate(ctx, NULL, &outl, aad, sizeof(aad));
1019*1dcdf01fSchristos             EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
1020*1dcdf01fSchristos             EVP_EncryptFinal_ex(ctx, buf + outl, &outl);
1021*1dcdf01fSchristos         }
1022*1dcdf01fSchristos     }
1023*1dcdf01fSchristos     return count;
1024*1dcdf01fSchristos }
1025*1dcdf01fSchristos 
1026*1dcdf01fSchristos static const EVP_MD *evp_md = NULL;
EVP_Digest_loop(void * args)1027*1dcdf01fSchristos static int EVP_Digest_loop(void *args)
1028*1dcdf01fSchristos {
1029*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
1030*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
1031*1dcdf01fSchristos     unsigned char md[EVP_MAX_MD_SIZE];
1032*1dcdf01fSchristos     int count;
1033*1dcdf01fSchristos #ifndef SIGALRM
1034*1dcdf01fSchristos     int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
1035*1dcdf01fSchristos #endif
1036*1dcdf01fSchristos 
1037*1dcdf01fSchristos     for (count = 0; COND(nb_iter); count++) {
1038*1dcdf01fSchristos         if (!EVP_Digest(buf, lengths[testnum], md, NULL, evp_md, NULL))
1039*1dcdf01fSchristos             return -1;
1040*1dcdf01fSchristos     }
1041*1dcdf01fSchristos     return count;
1042*1dcdf01fSchristos }
1043*1dcdf01fSchristos 
1044*1dcdf01fSchristos #ifndef OPENSSL_NO_RSA
1045*1dcdf01fSchristos static long rsa_c[RSA_NUM][2];  /* # RSA iteration test */
1046*1dcdf01fSchristos 
RSA_sign_loop(void * args)1047*1dcdf01fSchristos static int RSA_sign_loop(void *args)
1048*1dcdf01fSchristos {
1049*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
1050*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
1051*1dcdf01fSchristos     unsigned char *buf2 = tempargs->buf2;
1052*1dcdf01fSchristos     unsigned int *rsa_num = &tempargs->siglen;
1053*1dcdf01fSchristos     RSA **rsa_key = tempargs->rsa_key;
1054*1dcdf01fSchristos     int ret, count;
1055*1dcdf01fSchristos     for (count = 0; COND(rsa_c[testnum][0]); count++) {
1056*1dcdf01fSchristos         ret = RSA_sign(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
1057*1dcdf01fSchristos         if (ret == 0) {
1058*1dcdf01fSchristos             BIO_printf(bio_err, "RSA sign failure\n");
1059*1dcdf01fSchristos             ERR_print_errors(bio_err);
1060*1dcdf01fSchristos             count = -1;
1061*1dcdf01fSchristos             break;
1062*1dcdf01fSchristos         }
1063*1dcdf01fSchristos     }
1064*1dcdf01fSchristos     return count;
1065*1dcdf01fSchristos }
1066*1dcdf01fSchristos 
RSA_verify_loop(void * args)1067*1dcdf01fSchristos static int RSA_verify_loop(void *args)
1068*1dcdf01fSchristos {
1069*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
1070*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
1071*1dcdf01fSchristos     unsigned char *buf2 = tempargs->buf2;
1072*1dcdf01fSchristos     unsigned int rsa_num = tempargs->siglen;
1073*1dcdf01fSchristos     RSA **rsa_key = tempargs->rsa_key;
1074*1dcdf01fSchristos     int ret, count;
1075*1dcdf01fSchristos     for (count = 0; COND(rsa_c[testnum][1]); count++) {
1076*1dcdf01fSchristos         ret =
1077*1dcdf01fSchristos             RSA_verify(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
1078*1dcdf01fSchristos         if (ret <= 0) {
1079*1dcdf01fSchristos             BIO_printf(bio_err, "RSA verify failure\n");
1080*1dcdf01fSchristos             ERR_print_errors(bio_err);
1081*1dcdf01fSchristos             count = -1;
1082*1dcdf01fSchristos             break;
1083*1dcdf01fSchristos         }
1084*1dcdf01fSchristos     }
1085*1dcdf01fSchristos     return count;
1086*1dcdf01fSchristos }
1087*1dcdf01fSchristos #endif
1088*1dcdf01fSchristos 
1089*1dcdf01fSchristos #ifndef OPENSSL_NO_DSA
1090*1dcdf01fSchristos static long dsa_c[DSA_NUM][2];
DSA_sign_loop(void * args)1091*1dcdf01fSchristos static int DSA_sign_loop(void *args)
1092*1dcdf01fSchristos {
1093*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
1094*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
1095*1dcdf01fSchristos     unsigned char *buf2 = tempargs->buf2;
1096*1dcdf01fSchristos     DSA **dsa_key = tempargs->dsa_key;
1097*1dcdf01fSchristos     unsigned int *siglen = &tempargs->siglen;
1098*1dcdf01fSchristos     int ret, count;
1099*1dcdf01fSchristos     for (count = 0; COND(dsa_c[testnum][0]); count++) {
1100*1dcdf01fSchristos         ret = DSA_sign(0, buf, 20, buf2, siglen, dsa_key[testnum]);
1101*1dcdf01fSchristos         if (ret == 0) {
1102*1dcdf01fSchristos             BIO_printf(bio_err, "DSA sign failure\n");
1103*1dcdf01fSchristos             ERR_print_errors(bio_err);
1104*1dcdf01fSchristos             count = -1;
1105*1dcdf01fSchristos             break;
1106*1dcdf01fSchristos         }
1107*1dcdf01fSchristos     }
1108*1dcdf01fSchristos     return count;
1109*1dcdf01fSchristos }
1110*1dcdf01fSchristos 
DSA_verify_loop(void * args)1111*1dcdf01fSchristos static int DSA_verify_loop(void *args)
1112*1dcdf01fSchristos {
1113*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
1114*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
1115*1dcdf01fSchristos     unsigned char *buf2 = tempargs->buf2;
1116*1dcdf01fSchristos     DSA **dsa_key = tempargs->dsa_key;
1117*1dcdf01fSchristos     unsigned int siglen = tempargs->siglen;
1118*1dcdf01fSchristos     int ret, count;
1119*1dcdf01fSchristos     for (count = 0; COND(dsa_c[testnum][1]); count++) {
1120*1dcdf01fSchristos         ret = DSA_verify(0, buf, 20, buf2, siglen, dsa_key[testnum]);
1121*1dcdf01fSchristos         if (ret <= 0) {
1122*1dcdf01fSchristos             BIO_printf(bio_err, "DSA verify failure\n");
1123*1dcdf01fSchristos             ERR_print_errors(bio_err);
1124*1dcdf01fSchristos             count = -1;
1125*1dcdf01fSchristos             break;
1126*1dcdf01fSchristos         }
1127*1dcdf01fSchristos     }
1128*1dcdf01fSchristos     return count;
1129*1dcdf01fSchristos }
1130*1dcdf01fSchristos #endif
1131*1dcdf01fSchristos 
1132*1dcdf01fSchristos #ifndef OPENSSL_NO_EC
1133*1dcdf01fSchristos static long ecdsa_c[ECDSA_NUM][2];
ECDSA_sign_loop(void * args)1134*1dcdf01fSchristos static int ECDSA_sign_loop(void *args)
1135*1dcdf01fSchristos {
1136*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
1137*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
1138*1dcdf01fSchristos     EC_KEY **ecdsa = tempargs->ecdsa;
1139*1dcdf01fSchristos     unsigned char *ecdsasig = tempargs->buf2;
1140*1dcdf01fSchristos     unsigned int *ecdsasiglen = &tempargs->siglen;
1141*1dcdf01fSchristos     int ret, count;
1142*1dcdf01fSchristos     for (count = 0; COND(ecdsa_c[testnum][0]); count++) {
1143*1dcdf01fSchristos         ret = ECDSA_sign(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[testnum]);
1144*1dcdf01fSchristos         if (ret == 0) {
1145*1dcdf01fSchristos             BIO_printf(bio_err, "ECDSA sign failure\n");
1146*1dcdf01fSchristos             ERR_print_errors(bio_err);
1147*1dcdf01fSchristos             count = -1;
1148*1dcdf01fSchristos             break;
1149*1dcdf01fSchristos         }
1150*1dcdf01fSchristos     }
1151*1dcdf01fSchristos     return count;
1152*1dcdf01fSchristos }
1153*1dcdf01fSchristos 
ECDSA_verify_loop(void * args)1154*1dcdf01fSchristos static int ECDSA_verify_loop(void *args)
1155*1dcdf01fSchristos {
1156*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
1157*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
1158*1dcdf01fSchristos     EC_KEY **ecdsa = tempargs->ecdsa;
1159*1dcdf01fSchristos     unsigned char *ecdsasig = tempargs->buf2;
1160*1dcdf01fSchristos     unsigned int ecdsasiglen = tempargs->siglen;
1161*1dcdf01fSchristos     int ret, count;
1162*1dcdf01fSchristos     for (count = 0; COND(ecdsa_c[testnum][1]); count++) {
1163*1dcdf01fSchristos         ret = ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[testnum]);
1164*1dcdf01fSchristos         if (ret != 1) {
1165*1dcdf01fSchristos             BIO_printf(bio_err, "ECDSA verify failure\n");
1166*1dcdf01fSchristos             ERR_print_errors(bio_err);
1167*1dcdf01fSchristos             count = -1;
1168*1dcdf01fSchristos             break;
1169*1dcdf01fSchristos         }
1170*1dcdf01fSchristos     }
1171*1dcdf01fSchristos     return count;
1172*1dcdf01fSchristos }
1173*1dcdf01fSchristos 
1174*1dcdf01fSchristos /* ******************************************************************** */
1175*1dcdf01fSchristos static long ecdh_c[EC_NUM][1];
1176*1dcdf01fSchristos 
ECDH_EVP_derive_key_loop(void * args)1177*1dcdf01fSchristos static int ECDH_EVP_derive_key_loop(void *args)
1178*1dcdf01fSchristos {
1179*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
1180*1dcdf01fSchristos     EVP_PKEY_CTX *ctx = tempargs->ecdh_ctx[testnum];
1181*1dcdf01fSchristos     unsigned char *derived_secret = tempargs->secret_a;
1182*1dcdf01fSchristos     int count;
1183*1dcdf01fSchristos     size_t *outlen = &(tempargs->outlen[testnum]);
1184*1dcdf01fSchristos 
1185*1dcdf01fSchristos     for (count = 0; COND(ecdh_c[testnum][0]); count++)
1186*1dcdf01fSchristos         EVP_PKEY_derive(ctx, derived_secret, outlen);
1187*1dcdf01fSchristos 
1188*1dcdf01fSchristos     return count;
1189*1dcdf01fSchristos }
1190*1dcdf01fSchristos 
1191*1dcdf01fSchristos static long eddsa_c[EdDSA_NUM][2];
EdDSA_sign_loop(void * args)1192*1dcdf01fSchristos static int EdDSA_sign_loop(void *args)
1193*1dcdf01fSchristos {
1194*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
1195*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
1196*1dcdf01fSchristos     EVP_MD_CTX **edctx = tempargs->eddsa_ctx;
1197*1dcdf01fSchristos     unsigned char *eddsasig = tempargs->buf2;
1198*1dcdf01fSchristos     size_t *eddsasigsize = &tempargs->sigsize;
1199*1dcdf01fSchristos     int ret, count;
1200*1dcdf01fSchristos 
1201*1dcdf01fSchristos     for (count = 0; COND(eddsa_c[testnum][0]); count++) {
1202*1dcdf01fSchristos         ret = EVP_DigestSign(edctx[testnum], eddsasig, eddsasigsize, buf, 20);
1203*1dcdf01fSchristos         if (ret == 0) {
1204*1dcdf01fSchristos             BIO_printf(bio_err, "EdDSA sign failure\n");
1205*1dcdf01fSchristos             ERR_print_errors(bio_err);
1206*1dcdf01fSchristos             count = -1;
1207*1dcdf01fSchristos             break;
1208*1dcdf01fSchristos         }
1209*1dcdf01fSchristos     }
1210*1dcdf01fSchristos     return count;
1211*1dcdf01fSchristos }
1212*1dcdf01fSchristos 
EdDSA_verify_loop(void * args)1213*1dcdf01fSchristos static int EdDSA_verify_loop(void *args)
1214*1dcdf01fSchristos {
1215*1dcdf01fSchristos     loopargs_t *tempargs = *(loopargs_t **) args;
1216*1dcdf01fSchristos     unsigned char *buf = tempargs->buf;
1217*1dcdf01fSchristos     EVP_MD_CTX **edctx = tempargs->eddsa_ctx;
1218*1dcdf01fSchristos     unsigned char *eddsasig = tempargs->buf2;
1219*1dcdf01fSchristos     size_t eddsasigsize = tempargs->sigsize;
1220*1dcdf01fSchristos     int ret, count;
1221*1dcdf01fSchristos 
1222*1dcdf01fSchristos     for (count = 0; COND(eddsa_c[testnum][1]); count++) {
1223*1dcdf01fSchristos         ret = EVP_DigestVerify(edctx[testnum], eddsasig, eddsasigsize, buf, 20);
1224*1dcdf01fSchristos         if (ret != 1) {
1225*1dcdf01fSchristos             BIO_printf(bio_err, "EdDSA verify failure\n");
1226*1dcdf01fSchristos             ERR_print_errors(bio_err);
1227*1dcdf01fSchristos             count = -1;
1228*1dcdf01fSchristos             break;
1229*1dcdf01fSchristos         }
1230*1dcdf01fSchristos     }
1231*1dcdf01fSchristos     return count;
1232*1dcdf01fSchristos }
1233*1dcdf01fSchristos #endif                          /* OPENSSL_NO_EC */
1234*1dcdf01fSchristos 
run_benchmark(int async_jobs,int (* loop_function)(void *),loopargs_t * loopargs)1235*1dcdf01fSchristos static int run_benchmark(int async_jobs,
1236*1dcdf01fSchristos                          int (*loop_function) (void *), loopargs_t * loopargs)
1237*1dcdf01fSchristos {
1238*1dcdf01fSchristos     int job_op_count = 0;
1239*1dcdf01fSchristos     int total_op_count = 0;
1240*1dcdf01fSchristos     int num_inprogress = 0;
1241*1dcdf01fSchristos     int error = 0, i = 0, ret = 0;
1242*1dcdf01fSchristos     OSSL_ASYNC_FD job_fd = 0;
1243*1dcdf01fSchristos     size_t num_job_fds = 0;
1244*1dcdf01fSchristos 
1245*1dcdf01fSchristos     if (async_jobs == 0) {
1246*1dcdf01fSchristos         return loop_function((void *)&loopargs);
1247*1dcdf01fSchristos     }
1248*1dcdf01fSchristos 
1249*1dcdf01fSchristos     for (i = 0; i < async_jobs && !error; i++) {
1250*1dcdf01fSchristos         loopargs_t *looparg_item = loopargs + i;
1251*1dcdf01fSchristos 
1252*1dcdf01fSchristos         /* Copy pointer content (looparg_t item address) into async context */
1253*1dcdf01fSchristos         ret = ASYNC_start_job(&loopargs[i].inprogress_job, loopargs[i].wait_ctx,
1254*1dcdf01fSchristos                               &job_op_count, loop_function,
1255*1dcdf01fSchristos                               (void *)&looparg_item, sizeof(looparg_item));
1256*1dcdf01fSchristos         switch (ret) {
1257*1dcdf01fSchristos         case ASYNC_PAUSE:
1258*1dcdf01fSchristos             ++num_inprogress;
1259*1dcdf01fSchristos             break;
1260*1dcdf01fSchristos         case ASYNC_FINISH:
1261*1dcdf01fSchristos             if (job_op_count == -1) {
1262*1dcdf01fSchristos                 error = 1;
1263*1dcdf01fSchristos             } else {
1264*1dcdf01fSchristos                 total_op_count += job_op_count;
1265*1dcdf01fSchristos             }
1266*1dcdf01fSchristos             break;
1267*1dcdf01fSchristos         case ASYNC_NO_JOBS:
1268*1dcdf01fSchristos         case ASYNC_ERR:
1269*1dcdf01fSchristos             BIO_printf(bio_err, "Failure in the job\n");
1270*1dcdf01fSchristos             ERR_print_errors(bio_err);
1271*1dcdf01fSchristos             error = 1;
1272*1dcdf01fSchristos             break;
1273*1dcdf01fSchristos         }
1274*1dcdf01fSchristos     }
1275*1dcdf01fSchristos 
1276*1dcdf01fSchristos     while (num_inprogress > 0) {
1277*1dcdf01fSchristos #if defined(OPENSSL_SYS_WINDOWS)
1278*1dcdf01fSchristos         DWORD avail = 0;
1279*1dcdf01fSchristos #elif defined(OPENSSL_SYS_UNIX)
1280*1dcdf01fSchristos         int select_result = 0;
1281*1dcdf01fSchristos         OSSL_ASYNC_FD max_fd = 0;
1282*1dcdf01fSchristos         fd_set waitfdset;
1283*1dcdf01fSchristos 
1284*1dcdf01fSchristos         FD_ZERO(&waitfdset);
1285*1dcdf01fSchristos 
1286*1dcdf01fSchristos         for (i = 0; i < async_jobs && num_inprogress > 0; i++) {
1287*1dcdf01fSchristos             if (loopargs[i].inprogress_job == NULL)
1288*1dcdf01fSchristos                 continue;
1289*1dcdf01fSchristos 
1290*1dcdf01fSchristos             if (!ASYNC_WAIT_CTX_get_all_fds
1291*1dcdf01fSchristos                 (loopargs[i].wait_ctx, NULL, &num_job_fds)
1292*1dcdf01fSchristos                 || num_job_fds > 1) {
1293*1dcdf01fSchristos                 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1294*1dcdf01fSchristos                 ERR_print_errors(bio_err);
1295*1dcdf01fSchristos                 error = 1;
1296*1dcdf01fSchristos                 break;
1297*1dcdf01fSchristos             }
1298*1dcdf01fSchristos             ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd,
1299*1dcdf01fSchristos                                        &num_job_fds);
1300*1dcdf01fSchristos             FD_SET(job_fd, &waitfdset);
1301*1dcdf01fSchristos             if (job_fd > max_fd)
1302*1dcdf01fSchristos                 max_fd = job_fd;
1303*1dcdf01fSchristos         }
1304*1dcdf01fSchristos 
1305*1dcdf01fSchristos         if (max_fd >= (OSSL_ASYNC_FD)FD_SETSIZE) {
1306*1dcdf01fSchristos             BIO_printf(bio_err,
1307*1dcdf01fSchristos                        "Error: max_fd (%d) must be smaller than FD_SETSIZE (%d). "
1308*1dcdf01fSchristos                        "Decrease the value of async_jobs\n",
1309*1dcdf01fSchristos                        max_fd, FD_SETSIZE);
1310*1dcdf01fSchristos             ERR_print_errors(bio_err);
1311*1dcdf01fSchristos             error = 1;
1312*1dcdf01fSchristos             break;
1313*1dcdf01fSchristos         }
1314*1dcdf01fSchristos 
1315*1dcdf01fSchristos         select_result = select(max_fd + 1, &waitfdset, NULL, NULL, NULL);
1316*1dcdf01fSchristos         if (select_result == -1 && errno == EINTR)
1317*1dcdf01fSchristos             continue;
1318*1dcdf01fSchristos 
1319*1dcdf01fSchristos         if (select_result == -1) {
1320*1dcdf01fSchristos             BIO_printf(bio_err, "Failure in the select\n");
1321*1dcdf01fSchristos             ERR_print_errors(bio_err);
1322*1dcdf01fSchristos             error = 1;
1323*1dcdf01fSchristos             break;
1324*1dcdf01fSchristos         }
1325*1dcdf01fSchristos 
1326*1dcdf01fSchristos         if (select_result == 0)
1327*1dcdf01fSchristos             continue;
1328*1dcdf01fSchristos #endif
1329*1dcdf01fSchristos 
1330*1dcdf01fSchristos         for (i = 0; i < async_jobs; i++) {
1331*1dcdf01fSchristos             if (loopargs[i].inprogress_job == NULL)
1332*1dcdf01fSchristos                 continue;
1333*1dcdf01fSchristos 
1334*1dcdf01fSchristos             if (!ASYNC_WAIT_CTX_get_all_fds
1335*1dcdf01fSchristos                 (loopargs[i].wait_ctx, NULL, &num_job_fds)
1336*1dcdf01fSchristos                 || num_job_fds > 1) {
1337*1dcdf01fSchristos                 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1338*1dcdf01fSchristos                 ERR_print_errors(bio_err);
1339*1dcdf01fSchristos                 error = 1;
1340*1dcdf01fSchristos                 break;
1341*1dcdf01fSchristos             }
1342*1dcdf01fSchristos             ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd,
1343*1dcdf01fSchristos                                        &num_job_fds);
1344*1dcdf01fSchristos 
1345*1dcdf01fSchristos #if defined(OPENSSL_SYS_UNIX)
1346*1dcdf01fSchristos             if (num_job_fds == 1 && !FD_ISSET(job_fd, &waitfdset))
1347*1dcdf01fSchristos                 continue;
1348*1dcdf01fSchristos #elif defined(OPENSSL_SYS_WINDOWS)
1349*1dcdf01fSchristos             if (num_job_fds == 1
1350*1dcdf01fSchristos                 && !PeekNamedPipe(job_fd, NULL, 0, NULL, &avail, NULL)
1351*1dcdf01fSchristos                 && avail > 0)
1352*1dcdf01fSchristos                 continue;
1353*1dcdf01fSchristos #endif
1354*1dcdf01fSchristos 
1355*1dcdf01fSchristos             ret = ASYNC_start_job(&loopargs[i].inprogress_job,
1356*1dcdf01fSchristos                                   loopargs[i].wait_ctx, &job_op_count,
1357*1dcdf01fSchristos                                   loop_function, (void *)(loopargs + i),
1358*1dcdf01fSchristos                                   sizeof(loopargs_t));
1359*1dcdf01fSchristos             switch (ret) {
1360*1dcdf01fSchristos             case ASYNC_PAUSE:
1361*1dcdf01fSchristos                 break;
1362*1dcdf01fSchristos             case ASYNC_FINISH:
1363*1dcdf01fSchristos                 if (job_op_count == -1) {
1364*1dcdf01fSchristos                     error = 1;
1365*1dcdf01fSchristos                 } else {
1366*1dcdf01fSchristos                     total_op_count += job_op_count;
1367*1dcdf01fSchristos                 }
1368*1dcdf01fSchristos                 --num_inprogress;
1369*1dcdf01fSchristos                 loopargs[i].inprogress_job = NULL;
1370*1dcdf01fSchristos                 break;
1371*1dcdf01fSchristos             case ASYNC_NO_JOBS:
1372*1dcdf01fSchristos             case ASYNC_ERR:
1373*1dcdf01fSchristos                 --num_inprogress;
1374*1dcdf01fSchristos                 loopargs[i].inprogress_job = NULL;
1375*1dcdf01fSchristos                 BIO_printf(bio_err, "Failure in the job\n");
1376*1dcdf01fSchristos                 ERR_print_errors(bio_err);
1377*1dcdf01fSchristos                 error = 1;
1378*1dcdf01fSchristos                 break;
1379*1dcdf01fSchristos             }
1380*1dcdf01fSchristos         }
1381*1dcdf01fSchristos     }
1382*1dcdf01fSchristos 
1383*1dcdf01fSchristos     return error ? -1 : total_op_count;
1384*1dcdf01fSchristos }
1385*1dcdf01fSchristos 
speed_main(int argc,char ** argv)1386*1dcdf01fSchristos int speed_main(int argc, char **argv)
1387*1dcdf01fSchristos {
1388*1dcdf01fSchristos     ENGINE *e = NULL;
1389*1dcdf01fSchristos     loopargs_t *loopargs = NULL;
1390*1dcdf01fSchristos     const char *prog;
1391*1dcdf01fSchristos     const char *engine_id = NULL;
1392*1dcdf01fSchristos     const EVP_CIPHER *evp_cipher = NULL;
1393*1dcdf01fSchristos     double d = 0.0;
1394*1dcdf01fSchristos     OPTION_CHOICE o;
1395*1dcdf01fSchristos     int async_init = 0, multiblock = 0, pr_header = 0;
1396*1dcdf01fSchristos     int doit[ALGOR_NUM] = { 0 };
1397*1dcdf01fSchristos     int ret = 1, misalign = 0, lengths_single = 0, aead = 0;
1398*1dcdf01fSchristos     long count = 0;
1399*1dcdf01fSchristos     unsigned int size_num = OSSL_NELEM(lengths_list);
1400*1dcdf01fSchristos     unsigned int i, k, loop, loopargs_len = 0, async_jobs = 0;
1401*1dcdf01fSchristos     int keylen;
1402*1dcdf01fSchristos     int buflen;
1403*1dcdf01fSchristos #ifndef NO_FORK
1404*1dcdf01fSchristos     int multi = 0;
1405*1dcdf01fSchristos #endif
1406*1dcdf01fSchristos #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) \
1407*1dcdf01fSchristos     || !defined(OPENSSL_NO_EC)
1408*1dcdf01fSchristos     long rsa_count = 1;
1409*1dcdf01fSchristos #endif
1410*1dcdf01fSchristos     openssl_speed_sec_t seconds = { SECONDS, RSA_SECONDS, DSA_SECONDS,
1411*1dcdf01fSchristos                                     ECDSA_SECONDS, ECDH_SECONDS,
1412*1dcdf01fSchristos                                     EdDSA_SECONDS };
1413*1dcdf01fSchristos 
1414*1dcdf01fSchristos     /* What follows are the buffers and key material. */
1415*1dcdf01fSchristos #ifndef OPENSSL_NO_RC5
1416*1dcdf01fSchristos     RC5_32_KEY rc5_ks;
1417*1dcdf01fSchristos #endif
1418*1dcdf01fSchristos #ifndef OPENSSL_NO_RC2
1419*1dcdf01fSchristos     RC2_KEY rc2_ks;
1420*1dcdf01fSchristos #endif
1421*1dcdf01fSchristos #ifndef OPENSSL_NO_IDEA
1422*1dcdf01fSchristos     IDEA_KEY_SCHEDULE idea_ks;
1423*1dcdf01fSchristos #endif
1424*1dcdf01fSchristos #ifndef OPENSSL_NO_SEED
1425*1dcdf01fSchristos     SEED_KEY_SCHEDULE seed_ks;
1426*1dcdf01fSchristos #endif
1427*1dcdf01fSchristos #ifndef OPENSSL_NO_BF
1428*1dcdf01fSchristos     BF_KEY bf_ks;
1429*1dcdf01fSchristos #endif
1430*1dcdf01fSchristos #ifndef OPENSSL_NO_CAST
1431*1dcdf01fSchristos     CAST_KEY cast_ks;
1432*1dcdf01fSchristos #endif
1433*1dcdf01fSchristos     static const unsigned char key16[16] = {
1434*1dcdf01fSchristos         0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1435*1dcdf01fSchristos         0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
1436*1dcdf01fSchristos     };
1437*1dcdf01fSchristos     static const unsigned char key24[24] = {
1438*1dcdf01fSchristos         0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1439*1dcdf01fSchristos         0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1440*1dcdf01fSchristos         0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1441*1dcdf01fSchristos     };
1442*1dcdf01fSchristos     static const unsigned char key32[32] = {
1443*1dcdf01fSchristos         0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1444*1dcdf01fSchristos         0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1445*1dcdf01fSchristos         0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
1446*1dcdf01fSchristos         0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
1447*1dcdf01fSchristos     };
1448*1dcdf01fSchristos #ifndef OPENSSL_NO_CAMELLIA
1449*1dcdf01fSchristos     static const unsigned char ckey24[24] = {
1450*1dcdf01fSchristos         0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1451*1dcdf01fSchristos         0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1452*1dcdf01fSchristos         0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1453*1dcdf01fSchristos     };
1454*1dcdf01fSchristos     static const unsigned char ckey32[32] = {
1455*1dcdf01fSchristos         0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1456*1dcdf01fSchristos         0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1457*1dcdf01fSchristos         0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
1458*1dcdf01fSchristos         0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
1459*1dcdf01fSchristos     };
1460*1dcdf01fSchristos     CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3;
1461*1dcdf01fSchristos #endif
1462*1dcdf01fSchristos #ifndef OPENSSL_NO_DES
1463*1dcdf01fSchristos     static DES_cblock key = {
1464*1dcdf01fSchristos         0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0
1465*1dcdf01fSchristos     };
1466*1dcdf01fSchristos     static DES_cblock key2 = {
1467*1dcdf01fSchristos         0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
1468*1dcdf01fSchristos     };
1469*1dcdf01fSchristos     static DES_cblock key3 = {
1470*1dcdf01fSchristos         0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1471*1dcdf01fSchristos     };
1472*1dcdf01fSchristos #endif
1473*1dcdf01fSchristos #ifndef OPENSSL_NO_RSA
1474*1dcdf01fSchristos     static const unsigned int rsa_bits[RSA_NUM] = {
1475*1dcdf01fSchristos         512, 1024, 2048, 3072, 4096, 7680, 15360
1476*1dcdf01fSchristos     };
1477*1dcdf01fSchristos     static const unsigned char *rsa_data[RSA_NUM] = {
1478*1dcdf01fSchristos         test512, test1024, test2048, test3072, test4096, test7680, test15360
1479*1dcdf01fSchristos     };
1480*1dcdf01fSchristos     static const int rsa_data_length[RSA_NUM] = {
1481*1dcdf01fSchristos         sizeof(test512), sizeof(test1024),
1482*1dcdf01fSchristos         sizeof(test2048), sizeof(test3072),
1483*1dcdf01fSchristos         sizeof(test4096), sizeof(test7680),
1484*1dcdf01fSchristos         sizeof(test15360)
1485*1dcdf01fSchristos     };
1486*1dcdf01fSchristos     int rsa_doit[RSA_NUM] = { 0 };
1487*1dcdf01fSchristos     int primes = RSA_DEFAULT_PRIME_NUM;
1488*1dcdf01fSchristos #endif
1489*1dcdf01fSchristos #ifndef OPENSSL_NO_DSA
1490*1dcdf01fSchristos     static const unsigned int dsa_bits[DSA_NUM] = { 512, 1024, 2048 };
1491*1dcdf01fSchristos     int dsa_doit[DSA_NUM] = { 0 };
149260662d10Schristos #endif
149360662d10Schristos #ifndef OPENSSL_NO_EC
149460662d10Schristos     /*
149560662d10Schristos      * We only test over the following curves as they are representative, To
149660662d10Schristos      * add tests over more curves, simply add the curve NID and curve name to
1497*1dcdf01fSchristos      * the following arrays and increase the |ecdh_choices| list accordingly.
149860662d10Schristos      */
1499*1dcdf01fSchristos     static const struct {
1500*1dcdf01fSchristos         const char *name;
1501*1dcdf01fSchristos         unsigned int nid;
1502*1dcdf01fSchristos         unsigned int bits;
1503*1dcdf01fSchristos     } test_curves[] = {
150460662d10Schristos         /* Prime Curves */
1505*1dcdf01fSchristos         {"secp160r1", NID_secp160r1, 160},
1506*1dcdf01fSchristos         {"nistp192", NID_X9_62_prime192v1, 192},
1507*1dcdf01fSchristos         {"nistp224", NID_secp224r1, 224},
1508*1dcdf01fSchristos         {"nistp256", NID_X9_62_prime256v1, 256},
1509*1dcdf01fSchristos         {"nistp384", NID_secp384r1, 384},
1510*1dcdf01fSchristos         {"nistp521", NID_secp521r1, 521},
1511*1dcdf01fSchristos # ifndef OPENSSL_NO_EC2M
151260662d10Schristos         /* Binary Curves */
1513*1dcdf01fSchristos         {"nistk163", NID_sect163k1, 163},
1514*1dcdf01fSchristos         {"nistk233", NID_sect233k1, 233},
1515*1dcdf01fSchristos         {"nistk283", NID_sect283k1, 283},
1516*1dcdf01fSchristos         {"nistk409", NID_sect409k1, 409},
1517*1dcdf01fSchristos         {"nistk571", NID_sect571k1, 571},
1518*1dcdf01fSchristos         {"nistb163", NID_sect163r2, 163},
1519*1dcdf01fSchristos         {"nistb233", NID_sect233r1, 233},
1520*1dcdf01fSchristos         {"nistb283", NID_sect283r1, 283},
1521*1dcdf01fSchristos         {"nistb409", NID_sect409r1, 409},
1522*1dcdf01fSchristos         {"nistb571", NID_sect571r1, 571},
1523*1dcdf01fSchristos # endif
1524*1dcdf01fSchristos         {"brainpoolP256r1", NID_brainpoolP256r1, 256},
1525*1dcdf01fSchristos         {"brainpoolP256t1", NID_brainpoolP256t1, 256},
1526*1dcdf01fSchristos         {"brainpoolP384r1", NID_brainpoolP384r1, 384},
1527*1dcdf01fSchristos         {"brainpoolP384t1", NID_brainpoolP384t1, 384},
1528*1dcdf01fSchristos         {"brainpoolP512r1", NID_brainpoolP512r1, 512},
1529*1dcdf01fSchristos         {"brainpoolP512t1", NID_brainpoolP512t1, 512},
1530*1dcdf01fSchristos         /* Other and ECDH only ones */
1531*1dcdf01fSchristos         {"X25519", NID_X25519, 253},
1532*1dcdf01fSchristos         {"X448", NID_X448, 448}
153360662d10Schristos     };
1534*1dcdf01fSchristos     static const struct {
1535*1dcdf01fSchristos         const char *name;
1536*1dcdf01fSchristos         unsigned int nid;
1537*1dcdf01fSchristos         unsigned int bits;
1538*1dcdf01fSchristos         size_t sigsize;
1539*1dcdf01fSchristos     } test_ed_curves[] = {
1540*1dcdf01fSchristos         /* EdDSA */
1541*1dcdf01fSchristos         {"Ed25519", NID_ED25519, 253, 64},
1542*1dcdf01fSchristos         {"Ed448", NID_ED448, 456, 114}
154360662d10Schristos     };
1544*1dcdf01fSchristos     int ecdsa_doit[ECDSA_NUM] = { 0 };
1545*1dcdf01fSchristos     int ecdh_doit[EC_NUM] = { 0 };
1546*1dcdf01fSchristos     int eddsa_doit[EdDSA_NUM] = { 0 };
1547*1dcdf01fSchristos     OPENSSL_assert(OSSL_NELEM(test_curves) >= EC_NUM);
1548*1dcdf01fSchristos     OPENSSL_assert(OSSL_NELEM(test_ed_curves) >= EdDSA_NUM);
1549*1dcdf01fSchristos #endif                          /* ndef OPENSSL_NO_EC */
155060662d10Schristos 
1551*1dcdf01fSchristos     prog = opt_init(argc, argv, speed_options);
1552*1dcdf01fSchristos     while ((o = opt_next()) != OPT_EOF) {
1553*1dcdf01fSchristos         switch (o) {
1554*1dcdf01fSchristos         case OPT_EOF:
1555*1dcdf01fSchristos         case OPT_ERR:
1556*1dcdf01fSchristos  opterr:
1557*1dcdf01fSchristos             BIO_printf(bio_err, "%s: Use -help for summary.\n", prog);
155860662d10Schristos             goto end;
1559*1dcdf01fSchristos         case OPT_HELP:
1560*1dcdf01fSchristos             opt_help(speed_options);
1561*1dcdf01fSchristos             ret = 0;
156260662d10Schristos             goto end;
1563*1dcdf01fSchristos         case OPT_ELAPSED:
156460662d10Schristos             usertime = 0;
1565*1dcdf01fSchristos             break;
1566*1dcdf01fSchristos         case OPT_EVP:
1567*1dcdf01fSchristos             evp_md = NULL;
1568*1dcdf01fSchristos             evp_cipher = EVP_get_cipherbyname(opt_arg());
1569*1dcdf01fSchristos             if (evp_cipher == NULL)
1570*1dcdf01fSchristos                 evp_md = EVP_get_digestbyname(opt_arg());
1571*1dcdf01fSchristos             if (evp_cipher == NULL && evp_md == NULL) {
1572*1dcdf01fSchristos                 BIO_printf(bio_err,
1573*1dcdf01fSchristos                            "%s: %s is an unknown cipher or digest\n",
1574*1dcdf01fSchristos                            prog, opt_arg());
157560662d10Schristos                 goto end;
157660662d10Schristos             }
157760662d10Schristos             doit[D_EVP] = 1;
1578*1dcdf01fSchristos             break;
1579*1dcdf01fSchristos         case OPT_DECRYPT:
158060662d10Schristos             decrypt = 1;
1581*1dcdf01fSchristos             break;
1582*1dcdf01fSchristos         case OPT_ENGINE:
158360662d10Schristos             /*
1584*1dcdf01fSchristos              * In a forked execution, an engine might need to be
1585*1dcdf01fSchristos              * initialised by each child process, not by the parent.
1586*1dcdf01fSchristos              * So store the name here and run setup_engine() later on.
158760662d10Schristos              */
1588*1dcdf01fSchristos             engine_id = opt_arg();
1589*1dcdf01fSchristos             break;
1590*1dcdf01fSchristos         case OPT_MULTI:
159160662d10Schristos #ifndef NO_FORK
1592*1dcdf01fSchristos             multi = atoi(opt_arg());
1593*1dcdf01fSchristos             if (multi >= INT_MAX / (int)sizeof(int)) {
1594*1dcdf01fSchristos                 BIO_printf(bio_err, "%s: multi argument too large\n", prog);
1595*1dcdf01fSchristos                 return 0;
159660662d10Schristos             }
159760662d10Schristos #endif
1598*1dcdf01fSchristos             break;
1599*1dcdf01fSchristos         case OPT_ASYNCJOBS:
1600*1dcdf01fSchristos #ifndef OPENSSL_NO_ASYNC
1601*1dcdf01fSchristos             async_jobs = atoi(opt_arg());
1602*1dcdf01fSchristos             if (!ASYNC_is_capable()) {
1603*1dcdf01fSchristos                 BIO_printf(bio_err,
1604*1dcdf01fSchristos                            "%s: async_jobs specified but async not supported\n",
1605*1dcdf01fSchristos                            prog);
1606*1dcdf01fSchristos                 goto opterr;
1607*1dcdf01fSchristos             }
1608*1dcdf01fSchristos             if (async_jobs > 99999) {
1609*1dcdf01fSchristos                 BIO_printf(bio_err, "%s: too many async_jobs\n", prog);
1610*1dcdf01fSchristos                 goto opterr;
1611*1dcdf01fSchristos             }
1612*1dcdf01fSchristos #endif
1613*1dcdf01fSchristos             break;
1614*1dcdf01fSchristos         case OPT_MISALIGN:
1615*1dcdf01fSchristos             if (!opt_int(opt_arg(), &misalign))
1616*1dcdf01fSchristos                 goto end;
1617*1dcdf01fSchristos             if (misalign > MISALIGN) {
1618*1dcdf01fSchristos                 BIO_printf(bio_err,
1619*1dcdf01fSchristos                            "%s: Maximum offset is %d\n", prog, MISALIGN);
1620*1dcdf01fSchristos                 goto opterr;
1621*1dcdf01fSchristos             }
1622*1dcdf01fSchristos             break;
1623*1dcdf01fSchristos         case OPT_MR:
162460662d10Schristos             mr = 1;
1625*1dcdf01fSchristos             break;
1626*1dcdf01fSchristos         case OPT_MB:
162760662d10Schristos             multiblock = 1;
1628*1dcdf01fSchristos #ifdef OPENSSL_NO_MULTIBLOCK
1629*1dcdf01fSchristos             BIO_printf(bio_err,
1630*1dcdf01fSchristos                        "%s: -mb specified but multi-block support is disabled\n",
1631*1dcdf01fSchristos                        prog);
1632*1dcdf01fSchristos             goto end;
163360662d10Schristos #endif
1634*1dcdf01fSchristos             break;
1635*1dcdf01fSchristos         case OPT_R_CASES:
1636*1dcdf01fSchristos             if (!opt_rand(o))
1637*1dcdf01fSchristos                 goto end;
1638*1dcdf01fSchristos             break;
1639*1dcdf01fSchristos         case OPT_PRIMES:
1640*1dcdf01fSchristos             if (!opt_int(opt_arg(), &primes))
1641*1dcdf01fSchristos                 goto end;
1642*1dcdf01fSchristos             break;
1643*1dcdf01fSchristos         case OPT_SECONDS:
1644*1dcdf01fSchristos             seconds.sym = seconds.rsa = seconds.dsa = seconds.ecdsa
1645*1dcdf01fSchristos                         = seconds.ecdh = seconds.eddsa = atoi(opt_arg());
1646*1dcdf01fSchristos             break;
1647*1dcdf01fSchristos         case OPT_BYTES:
1648*1dcdf01fSchristos             lengths_single = atoi(opt_arg());
1649*1dcdf01fSchristos             lengths = &lengths_single;
1650*1dcdf01fSchristos             size_num = 1;
1651*1dcdf01fSchristos             break;
1652*1dcdf01fSchristos         case OPT_AEAD:
1653*1dcdf01fSchristos             aead = 1;
1654*1dcdf01fSchristos             break;
1655*1dcdf01fSchristos         }
1656*1dcdf01fSchristos     }
1657*1dcdf01fSchristos     argc = opt_num_rest();
1658*1dcdf01fSchristos     argv = opt_rest();
1659*1dcdf01fSchristos 
1660*1dcdf01fSchristos     /* Remaining arguments are algorithms. */
1661*1dcdf01fSchristos     for (; *argv; argv++) {
1662*1dcdf01fSchristos         if (found(*argv, doit_choices, &i)) {
1663*1dcdf01fSchristos             doit[i] = 1;
1664*1dcdf01fSchristos             continue;
1665*1dcdf01fSchristos         }
166660662d10Schristos #ifndef OPENSSL_NO_DES
166760662d10Schristos         if (strcmp(*argv, "des") == 0) {
1668*1dcdf01fSchristos             doit[D_CBC_DES] = doit[D_EDE3_DES] = 1;
1669*1dcdf01fSchristos             continue;
1670*1dcdf01fSchristos         }
167160662d10Schristos #endif
1672*1dcdf01fSchristos         if (strcmp(*argv, "sha") == 0) {
1673*1dcdf01fSchristos             doit[D_SHA1] = doit[D_SHA256] = doit[D_SHA512] = 1;
1674*1dcdf01fSchristos             continue;
1675*1dcdf01fSchristos         }
167660662d10Schristos #ifndef OPENSSL_NO_RSA
1677*1dcdf01fSchristos         if (strcmp(*argv, "openssl") == 0)
1678*1dcdf01fSchristos             continue;
167960662d10Schristos         if (strcmp(*argv, "rsa") == 0) {
1680*1dcdf01fSchristos             for (loop = 0; loop < OSSL_NELEM(rsa_doit); loop++)
1681*1dcdf01fSchristos                 rsa_doit[loop] = 1;
1682*1dcdf01fSchristos             continue;
1683*1dcdf01fSchristos         }
1684*1dcdf01fSchristos         if (found(*argv, rsa_choices, &i)) {
1685*1dcdf01fSchristos             rsa_doit[i] = 1;
1686*1dcdf01fSchristos             continue;
1687*1dcdf01fSchristos         }
168860662d10Schristos #endif
168960662d10Schristos #ifndef OPENSSL_NO_DSA
169060662d10Schristos         if (strcmp(*argv, "dsa") == 0) {
1691*1dcdf01fSchristos             dsa_doit[R_DSA_512] = dsa_doit[R_DSA_1024] =
169260662d10Schristos                 dsa_doit[R_DSA_2048] = 1;
1693*1dcdf01fSchristos             continue;
1694*1dcdf01fSchristos         }
1695*1dcdf01fSchristos         if (found(*argv, dsa_choices, &i)) {
1696*1dcdf01fSchristos             dsa_doit[i] = 2;
1697*1dcdf01fSchristos             continue;
1698*1dcdf01fSchristos         }
169960662d10Schristos #endif
1700*1dcdf01fSchristos         if (strcmp(*argv, "aes") == 0) {
1701*1dcdf01fSchristos             doit[D_CBC_128_AES] = doit[D_CBC_192_AES] = doit[D_CBC_256_AES] = 1;
1702*1dcdf01fSchristos             continue;
1703*1dcdf01fSchristos         }
170460662d10Schristos #ifndef OPENSSL_NO_CAMELLIA
1705*1dcdf01fSchristos         if (strcmp(*argv, "camellia") == 0) {
1706*1dcdf01fSchristos             doit[D_CBC_128_CML] = doit[D_CBC_192_CML] = doit[D_CBC_256_CML] = 1;
1707*1dcdf01fSchristos             continue;
1708*1dcdf01fSchristos         }
170960662d10Schristos #endif
1710*1dcdf01fSchristos #ifndef OPENSSL_NO_EC
1711*1dcdf01fSchristos         if (strcmp(*argv, "ecdsa") == 0) {
1712*1dcdf01fSchristos             for (loop = 0; loop < OSSL_NELEM(ecdsa_doit); loop++)
1713*1dcdf01fSchristos                 ecdsa_doit[loop] = 1;
1714*1dcdf01fSchristos             continue;
1715*1dcdf01fSchristos         }
1716*1dcdf01fSchristos         if (found(*argv, ecdsa_choices, &i)) {
1717*1dcdf01fSchristos             ecdsa_doit[i] = 2;
1718*1dcdf01fSchristos             continue;
1719*1dcdf01fSchristos         }
1720*1dcdf01fSchristos         if (strcmp(*argv, "ecdh") == 0) {
1721*1dcdf01fSchristos             for (loop = 0; loop < OSSL_NELEM(ecdh_doit); loop++)
1722*1dcdf01fSchristos                 ecdh_doit[loop] = 1;
1723*1dcdf01fSchristos             continue;
1724*1dcdf01fSchristos         }
1725*1dcdf01fSchristos         if (found(*argv, ecdh_choices, &i)) {
1726*1dcdf01fSchristos             ecdh_doit[i] = 2;
1727*1dcdf01fSchristos             continue;
1728*1dcdf01fSchristos         }
1729*1dcdf01fSchristos         if (strcmp(*argv, "eddsa") == 0) {
1730*1dcdf01fSchristos             for (loop = 0; loop < OSSL_NELEM(eddsa_doit); loop++)
1731*1dcdf01fSchristos                 eddsa_doit[loop] = 1;
1732*1dcdf01fSchristos             continue;
1733*1dcdf01fSchristos         }
1734*1dcdf01fSchristos         if (found(*argv, eddsa_choices, &i)) {
1735*1dcdf01fSchristos             eddsa_doit[i] = 2;
1736*1dcdf01fSchristos             continue;
1737*1dcdf01fSchristos         }
173860662d10Schristos #endif
1739*1dcdf01fSchristos         BIO_printf(bio_err, "%s: Unknown algorithm %s\n", prog, *argv);
174060662d10Schristos         goto end;
174160662d10Schristos     }
1742*1dcdf01fSchristos 
1743*1dcdf01fSchristos     /* Sanity checks */
1744*1dcdf01fSchristos     if (aead) {
1745*1dcdf01fSchristos         if (evp_cipher == NULL) {
1746*1dcdf01fSchristos             BIO_printf(bio_err, "-aead can be used only with an AEAD cipher\n");
1747*1dcdf01fSchristos             goto end;
1748*1dcdf01fSchristos         } else if (!(EVP_CIPHER_flags(evp_cipher) &
1749*1dcdf01fSchristos                      EVP_CIPH_FLAG_AEAD_CIPHER)) {
1750*1dcdf01fSchristos             BIO_printf(bio_err, "%s is not an AEAD cipher\n",
1751*1dcdf01fSchristos                        OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher)));
1752*1dcdf01fSchristos             goto end;
1753*1dcdf01fSchristos         }
1754*1dcdf01fSchristos     }
1755*1dcdf01fSchristos     if (multiblock) {
1756*1dcdf01fSchristos         if (evp_cipher == NULL) {
1757*1dcdf01fSchristos             BIO_printf(bio_err,"-mb can be used only with a multi-block"
1758*1dcdf01fSchristos                                " capable cipher\n");
1759*1dcdf01fSchristos             goto end;
1760*1dcdf01fSchristos         } else if (!(EVP_CIPHER_flags(evp_cipher) &
1761*1dcdf01fSchristos                      EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) {
1762*1dcdf01fSchristos             BIO_printf(bio_err, "%s is not a multi-block capable\n",
1763*1dcdf01fSchristos                        OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher)));
1764*1dcdf01fSchristos             goto end;
1765*1dcdf01fSchristos         } else if (async_jobs > 0) {
1766*1dcdf01fSchristos             BIO_printf(bio_err, "Async mode is not supported with -mb");
1767*1dcdf01fSchristos             goto end;
1768*1dcdf01fSchristos         }
1769*1dcdf01fSchristos     }
1770*1dcdf01fSchristos 
1771*1dcdf01fSchristos     /* Initialize the job pool if async mode is enabled */
1772*1dcdf01fSchristos     if (async_jobs > 0) {
1773*1dcdf01fSchristos         async_init = ASYNC_init_thread(async_jobs, async_jobs);
1774*1dcdf01fSchristos         if (!async_init) {
1775*1dcdf01fSchristos             BIO_printf(bio_err, "Error creating the ASYNC job pool\n");
1776*1dcdf01fSchristos             goto end;
1777*1dcdf01fSchristos         }
1778*1dcdf01fSchristos     }
1779*1dcdf01fSchristos 
1780*1dcdf01fSchristos     loopargs_len = (async_jobs == 0 ? 1 : async_jobs);
1781*1dcdf01fSchristos     loopargs =
1782*1dcdf01fSchristos         app_malloc(loopargs_len * sizeof(loopargs_t), "array of loopargs");
1783*1dcdf01fSchristos     memset(loopargs, 0, loopargs_len * sizeof(loopargs_t));
1784*1dcdf01fSchristos 
1785*1dcdf01fSchristos     for (i = 0; i < loopargs_len; i++) {
1786*1dcdf01fSchristos         if (async_jobs > 0) {
1787*1dcdf01fSchristos             loopargs[i].wait_ctx = ASYNC_WAIT_CTX_new();
1788*1dcdf01fSchristos             if (loopargs[i].wait_ctx == NULL) {
1789*1dcdf01fSchristos                 BIO_printf(bio_err, "Error creating the ASYNC_WAIT_CTX\n");
1790*1dcdf01fSchristos                 goto end;
1791*1dcdf01fSchristos             }
1792*1dcdf01fSchristos         }
1793*1dcdf01fSchristos 
1794*1dcdf01fSchristos         buflen = lengths[size_num - 1];
1795*1dcdf01fSchristos         if (buflen < 36)    /* size of random vector in RSA benchmark */
1796*1dcdf01fSchristos             buflen = 36;
1797*1dcdf01fSchristos         buflen += MAX_MISALIGNMENT + 1;
1798*1dcdf01fSchristos         loopargs[i].buf_malloc = app_malloc(buflen, "input buffer");
1799*1dcdf01fSchristos         loopargs[i].buf2_malloc = app_malloc(buflen, "input buffer");
1800*1dcdf01fSchristos         memset(loopargs[i].buf_malloc, 0, buflen);
1801*1dcdf01fSchristos         memset(loopargs[i].buf2_malloc, 0, buflen);
1802*1dcdf01fSchristos 
1803*1dcdf01fSchristos         /* Align the start of buffers on a 64 byte boundary */
1804*1dcdf01fSchristos         loopargs[i].buf = loopargs[i].buf_malloc + misalign;
1805*1dcdf01fSchristos         loopargs[i].buf2 = loopargs[i].buf2_malloc + misalign;
1806*1dcdf01fSchristos #ifndef OPENSSL_NO_EC
1807*1dcdf01fSchristos         loopargs[i].secret_a = app_malloc(MAX_ECDH_SIZE, "ECDH secret a");
1808*1dcdf01fSchristos         loopargs[i].secret_b = app_malloc(MAX_ECDH_SIZE, "ECDH secret b");
1809*1dcdf01fSchristos #endif
181060662d10Schristos     }
181160662d10Schristos 
181260662d10Schristos #ifndef NO_FORK
1813*1dcdf01fSchristos     if (multi && do_multi(multi, size_num))
181460662d10Schristos         goto show_res;
181560662d10Schristos #endif
181660662d10Schristos 
1817*1dcdf01fSchristos     /* Initialize the engine after the fork */
1818*1dcdf01fSchristos     e = setup_engine(engine_id, 0);
1819*1dcdf01fSchristos 
1820*1dcdf01fSchristos     /* No parameters; turn on everything. */
1821*1dcdf01fSchristos     if ((argc == 0) && !doit[D_EVP]) {
1822*1dcdf01fSchristos         for (i = 0; i < ALGOR_NUM; i++)
182360662d10Schristos             if (i != D_EVP)
182460662d10Schristos                 doit[i] = 1;
1825*1dcdf01fSchristos #ifndef OPENSSL_NO_RSA
182660662d10Schristos         for (i = 0; i < RSA_NUM; i++)
182760662d10Schristos             rsa_doit[i] = 1;
1828*1dcdf01fSchristos #endif
1829*1dcdf01fSchristos #ifndef OPENSSL_NO_DSA
183060662d10Schristos         for (i = 0; i < DSA_NUM; i++)
183160662d10Schristos             dsa_doit[i] = 1;
183260662d10Schristos #endif
1833*1dcdf01fSchristos #ifndef OPENSSL_NO_EC
1834*1dcdf01fSchristos         for (loop = 0; loop < OSSL_NELEM(ecdsa_doit); loop++)
1835*1dcdf01fSchristos             ecdsa_doit[loop] = 1;
1836*1dcdf01fSchristos         for (loop = 0; loop < OSSL_NELEM(ecdh_doit); loop++)
1837*1dcdf01fSchristos             ecdh_doit[loop] = 1;
1838*1dcdf01fSchristos         for (loop = 0; loop < OSSL_NELEM(eddsa_doit); loop++)
1839*1dcdf01fSchristos             eddsa_doit[loop] = 1;
184060662d10Schristos #endif
184160662d10Schristos     }
184260662d10Schristos     for (i = 0; i < ALGOR_NUM; i++)
184360662d10Schristos         if (doit[i])
184460662d10Schristos             pr_header++;
184560662d10Schristos 
184660662d10Schristos     if (usertime == 0 && !mr)
184760662d10Schristos         BIO_printf(bio_err,
184860662d10Schristos                    "You have chosen to measure elapsed time "
184960662d10Schristos                    "instead of user CPU time.\n");
185060662d10Schristos 
185160662d10Schristos #ifndef OPENSSL_NO_RSA
1852*1dcdf01fSchristos     for (i = 0; i < loopargs_len; i++) {
1853*1dcdf01fSchristos         if (primes > RSA_DEFAULT_PRIME_NUM) {
1854*1dcdf01fSchristos             /* for multi-prime RSA, skip this */
1855*1dcdf01fSchristos             break;
1856*1dcdf01fSchristos         }
1857*1dcdf01fSchristos         for (k = 0; k < RSA_NUM; k++) {
185860662d10Schristos             const unsigned char *p;
185960662d10Schristos 
1860*1dcdf01fSchristos             p = rsa_data[k];
1861*1dcdf01fSchristos             loopargs[i].rsa_key[k] =
1862*1dcdf01fSchristos                 d2i_RSAPrivateKey(NULL, &p, rsa_data_length[k]);
1863*1dcdf01fSchristos             if (loopargs[i].rsa_key[k] == NULL) {
1864*1dcdf01fSchristos                 BIO_printf(bio_err,
1865*1dcdf01fSchristos                            "internal error loading RSA key number %d\n", k);
186660662d10Schristos                 goto end;
186760662d10Schristos             }
1868*1dcdf01fSchristos         }
186960662d10Schristos     }
187060662d10Schristos #endif
187160662d10Schristos #ifndef OPENSSL_NO_DSA
1872*1dcdf01fSchristos     for (i = 0; i < loopargs_len; i++) {
1873*1dcdf01fSchristos         loopargs[i].dsa_key[0] = get_dsa(512);
1874*1dcdf01fSchristos         loopargs[i].dsa_key[1] = get_dsa(1024);
1875*1dcdf01fSchristos         loopargs[i].dsa_key[2] = get_dsa(2048);
1876*1dcdf01fSchristos     }
187760662d10Schristos #endif
187860662d10Schristos #ifndef OPENSSL_NO_DES
187960662d10Schristos     DES_set_key_unchecked(&key, &sch);
188060662d10Schristos     DES_set_key_unchecked(&key2, &sch2);
188160662d10Schristos     DES_set_key_unchecked(&key3, &sch3);
188260662d10Schristos #endif
188360662d10Schristos     AES_set_encrypt_key(key16, 128, &aes_ks1);
188460662d10Schristos     AES_set_encrypt_key(key24, 192, &aes_ks2);
188560662d10Schristos     AES_set_encrypt_key(key32, 256, &aes_ks3);
188660662d10Schristos #ifndef OPENSSL_NO_CAMELLIA
188760662d10Schristos     Camellia_set_key(key16, 128, &camellia_ks1);
188860662d10Schristos     Camellia_set_key(ckey24, 192, &camellia_ks2);
188960662d10Schristos     Camellia_set_key(ckey32, 256, &camellia_ks3);
189060662d10Schristos #endif
189160662d10Schristos #ifndef OPENSSL_NO_IDEA
1892*1dcdf01fSchristos     IDEA_set_encrypt_key(key16, &idea_ks);
189360662d10Schristos #endif
189460662d10Schristos #ifndef OPENSSL_NO_SEED
189560662d10Schristos     SEED_set_key(key16, &seed_ks);
189660662d10Schristos #endif
189760662d10Schristos #ifndef OPENSSL_NO_RC4
189860662d10Schristos     RC4_set_key(&rc4_ks, 16, key16);
189960662d10Schristos #endif
190060662d10Schristos #ifndef OPENSSL_NO_RC2
190160662d10Schristos     RC2_set_key(&rc2_ks, 16, key16, 128);
190260662d10Schristos #endif
190360662d10Schristos #ifndef OPENSSL_NO_RC5
190460662d10Schristos     RC5_32_set_key(&rc5_ks, 16, key16, 12);
190560662d10Schristos #endif
190660662d10Schristos #ifndef OPENSSL_NO_BF
190760662d10Schristos     BF_set_key(&bf_ks, 16, key16);
190860662d10Schristos #endif
190960662d10Schristos #ifndef OPENSSL_NO_CAST
191060662d10Schristos     CAST_set_key(&cast_ks, 16, key16);
191160662d10Schristos #endif
191260662d10Schristos #ifndef SIGALRM
191360662d10Schristos # ifndef OPENSSL_NO_DES
191460662d10Schristos     BIO_printf(bio_err, "First we calculate the approximate speed ...\n");
191560662d10Schristos     count = 10;
191660662d10Schristos     do {
191760662d10Schristos         long it;
191860662d10Schristos         count *= 2;
191960662d10Schristos         Time_F(START);
192060662d10Schristos         for (it = count; it; it--)
1921*1dcdf01fSchristos             DES_ecb_encrypt((DES_cblock *)loopargs[0].buf,
1922*1dcdf01fSchristos                             (DES_cblock *)loopargs[0].buf, &sch, DES_ENCRYPT);
192360662d10Schristos         d = Time_F(STOP);
192460662d10Schristos     } while (d < 3);
192560662d10Schristos     save_count = count;
192660662d10Schristos     c[D_MD2][0] = count / 10;
192760662d10Schristos     c[D_MDC2][0] = count / 10;
192860662d10Schristos     c[D_MD4][0] = count;
192960662d10Schristos     c[D_MD5][0] = count;
193060662d10Schristos     c[D_HMAC][0] = count;
193160662d10Schristos     c[D_SHA1][0] = count;
193260662d10Schristos     c[D_RMD160][0] = count;
193360662d10Schristos     c[D_RC4][0] = count * 5;
193460662d10Schristos     c[D_CBC_DES][0] = count;
193560662d10Schristos     c[D_EDE3_DES][0] = count / 3;
193660662d10Schristos     c[D_CBC_IDEA][0] = count;
193760662d10Schristos     c[D_CBC_SEED][0] = count;
193860662d10Schristos     c[D_CBC_RC2][0] = count;
193960662d10Schristos     c[D_CBC_RC5][0] = count;
194060662d10Schristos     c[D_CBC_BF][0] = count;
194160662d10Schristos     c[D_CBC_CAST][0] = count;
194260662d10Schristos     c[D_CBC_128_AES][0] = count;
194360662d10Schristos     c[D_CBC_192_AES][0] = count;
194460662d10Schristos     c[D_CBC_256_AES][0] = count;
194560662d10Schristos     c[D_CBC_128_CML][0] = count;
194660662d10Schristos     c[D_CBC_192_CML][0] = count;
194760662d10Schristos     c[D_CBC_256_CML][0] = count;
194860662d10Schristos     c[D_SHA256][0] = count;
194960662d10Schristos     c[D_SHA512][0] = count;
195060662d10Schristos     c[D_WHIRLPOOL][0] = count;
195160662d10Schristos     c[D_IGE_128_AES][0] = count;
195260662d10Schristos     c[D_IGE_192_AES][0] = count;
195360662d10Schristos     c[D_IGE_256_AES][0] = count;
195460662d10Schristos     c[D_GHASH][0] = count;
1955*1dcdf01fSchristos     c[D_RAND][0] = count;
195660662d10Schristos 
1957*1dcdf01fSchristos     for (i = 1; i < size_num; i++) {
195860662d10Schristos         long l0, l1;
195960662d10Schristos 
1960*1dcdf01fSchristos         l0 = (long)lengths[0];
196160662d10Schristos         l1 = (long)lengths[i];
1962*1dcdf01fSchristos 
1963*1dcdf01fSchristos         c[D_MD2][i] = c[D_MD2][0] * 4 * l0 / l1;
1964*1dcdf01fSchristos         c[D_MDC2][i] = c[D_MDC2][0] * 4 * l0 / l1;
1965*1dcdf01fSchristos         c[D_MD4][i] = c[D_MD4][0] * 4 * l0 / l1;
1966*1dcdf01fSchristos         c[D_MD5][i] = c[D_MD5][0] * 4 * l0 / l1;
1967*1dcdf01fSchristos         c[D_HMAC][i] = c[D_HMAC][0] * 4 * l0 / l1;
1968*1dcdf01fSchristos         c[D_SHA1][i] = c[D_SHA1][0] * 4 * l0 / l1;
1969*1dcdf01fSchristos         c[D_RMD160][i] = c[D_RMD160][0] * 4 * l0 / l1;
1970*1dcdf01fSchristos         c[D_SHA256][i] = c[D_SHA256][0] * 4 * l0 / l1;
1971*1dcdf01fSchristos         c[D_SHA512][i] = c[D_SHA512][0] * 4 * l0 / l1;
1972*1dcdf01fSchristos         c[D_WHIRLPOOL][i] = c[D_WHIRLPOOL][0] * 4 * l0 / l1;
1973*1dcdf01fSchristos         c[D_GHASH][i] = c[D_GHASH][0] * 4 * l0 / l1;
1974*1dcdf01fSchristos         c[D_RAND][i] = c[D_RAND][0] * 4 * l0 / l1;
1975*1dcdf01fSchristos 
1976*1dcdf01fSchristos         l0 = (long)lengths[i - 1];
1977*1dcdf01fSchristos 
197860662d10Schristos         c[D_RC4][i] = c[D_RC4][i - 1] * l0 / l1;
197960662d10Schristos         c[D_CBC_DES][i] = c[D_CBC_DES][i - 1] * l0 / l1;
198060662d10Schristos         c[D_EDE3_DES][i] = c[D_EDE3_DES][i - 1] * l0 / l1;
198160662d10Schristos         c[D_CBC_IDEA][i] = c[D_CBC_IDEA][i - 1] * l0 / l1;
198260662d10Schristos         c[D_CBC_SEED][i] = c[D_CBC_SEED][i - 1] * l0 / l1;
198360662d10Schristos         c[D_CBC_RC2][i] = c[D_CBC_RC2][i - 1] * l0 / l1;
198460662d10Schristos         c[D_CBC_RC5][i] = c[D_CBC_RC5][i - 1] * l0 / l1;
198560662d10Schristos         c[D_CBC_BF][i] = c[D_CBC_BF][i - 1] * l0 / l1;
198660662d10Schristos         c[D_CBC_CAST][i] = c[D_CBC_CAST][i - 1] * l0 / l1;
198760662d10Schristos         c[D_CBC_128_AES][i] = c[D_CBC_128_AES][i - 1] * l0 / l1;
198860662d10Schristos         c[D_CBC_192_AES][i] = c[D_CBC_192_AES][i - 1] * l0 / l1;
198960662d10Schristos         c[D_CBC_256_AES][i] = c[D_CBC_256_AES][i - 1] * l0 / l1;
199060662d10Schristos         c[D_CBC_128_CML][i] = c[D_CBC_128_CML][i - 1] * l0 / l1;
199160662d10Schristos         c[D_CBC_192_CML][i] = c[D_CBC_192_CML][i - 1] * l0 / l1;
199260662d10Schristos         c[D_CBC_256_CML][i] = c[D_CBC_256_CML][i - 1] * l0 / l1;
199360662d10Schristos         c[D_IGE_128_AES][i] = c[D_IGE_128_AES][i - 1] * l0 / l1;
199460662d10Schristos         c[D_IGE_192_AES][i] = c[D_IGE_192_AES][i - 1] * l0 / l1;
199560662d10Schristos         c[D_IGE_256_AES][i] = c[D_IGE_256_AES][i - 1] * l0 / l1;
199660662d10Schristos     }
1997*1dcdf01fSchristos 
199860662d10Schristos #  ifndef OPENSSL_NO_RSA
199960662d10Schristos     rsa_c[R_RSA_512][0] = count / 2000;
200060662d10Schristos     rsa_c[R_RSA_512][1] = count / 400;
200160662d10Schristos     for (i = 1; i < RSA_NUM; i++) {
200260662d10Schristos         rsa_c[i][0] = rsa_c[i - 1][0] / 8;
200360662d10Schristos         rsa_c[i][1] = rsa_c[i - 1][1] / 4;
2004*1dcdf01fSchristos         if (rsa_doit[i] <= 1 && rsa_c[i][0] == 0)
200560662d10Schristos             rsa_doit[i] = 0;
200660662d10Schristos         else {
200760662d10Schristos             if (rsa_c[i][0] == 0) {
2008*1dcdf01fSchristos                 rsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
200960662d10Schristos                 rsa_c[i][1] = 20;
201060662d10Schristos             }
201160662d10Schristos         }
201260662d10Schristos     }
201360662d10Schristos #  endif
201460662d10Schristos 
201560662d10Schristos #  ifndef OPENSSL_NO_DSA
201660662d10Schristos     dsa_c[R_DSA_512][0] = count / 1000;
201760662d10Schristos     dsa_c[R_DSA_512][1] = count / 1000 / 2;
201860662d10Schristos     for (i = 1; i < DSA_NUM; i++) {
201960662d10Schristos         dsa_c[i][0] = dsa_c[i - 1][0] / 4;
202060662d10Schristos         dsa_c[i][1] = dsa_c[i - 1][1] / 4;
2021*1dcdf01fSchristos         if (dsa_doit[i] <= 1 && dsa_c[i][0] == 0)
202260662d10Schristos             dsa_doit[i] = 0;
202360662d10Schristos         else {
2024*1dcdf01fSchristos             if (dsa_c[i][0] == 0) {
2025*1dcdf01fSchristos                 dsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
202660662d10Schristos                 dsa_c[i][1] = 1;
202760662d10Schristos             }
202860662d10Schristos         }
202960662d10Schristos     }
203060662d10Schristos #  endif
203160662d10Schristos 
2032*1dcdf01fSchristos #  ifndef OPENSSL_NO_EC
203360662d10Schristos     ecdsa_c[R_EC_P160][0] = count / 1000;
203460662d10Schristos     ecdsa_c[R_EC_P160][1] = count / 1000 / 2;
203560662d10Schristos     for (i = R_EC_P192; i <= R_EC_P521; i++) {
203660662d10Schristos         ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
203760662d10Schristos         ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
2038*1dcdf01fSchristos         if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
203960662d10Schristos             ecdsa_doit[i] = 0;
204060662d10Schristos         else {
2041*1dcdf01fSchristos             if (ecdsa_c[i][0] == 0) {
204260662d10Schristos                 ecdsa_c[i][0] = 1;
204360662d10Schristos                 ecdsa_c[i][1] = 1;
204460662d10Schristos             }
204560662d10Schristos         }
204660662d10Schristos     }
2047*1dcdf01fSchristos #   ifndef OPENSSL_NO_EC2M
204860662d10Schristos     ecdsa_c[R_EC_K163][0] = count / 1000;
204960662d10Schristos     ecdsa_c[R_EC_K163][1] = count / 1000 / 2;
205060662d10Schristos     for (i = R_EC_K233; i <= R_EC_K571; i++) {
205160662d10Schristos         ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
205260662d10Schristos         ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
2053*1dcdf01fSchristos         if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
205460662d10Schristos             ecdsa_doit[i] = 0;
205560662d10Schristos         else {
2056*1dcdf01fSchristos             if (ecdsa_c[i][0] == 0) {
205760662d10Schristos                 ecdsa_c[i][0] = 1;
205860662d10Schristos                 ecdsa_c[i][1] = 1;
205960662d10Schristos             }
206060662d10Schristos         }
206160662d10Schristos     }
206260662d10Schristos     ecdsa_c[R_EC_B163][0] = count / 1000;
206360662d10Schristos     ecdsa_c[R_EC_B163][1] = count / 1000 / 2;
206460662d10Schristos     for (i = R_EC_B233; i <= R_EC_B571; i++) {
206560662d10Schristos         ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
206660662d10Schristos         ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
2067*1dcdf01fSchristos         if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
206860662d10Schristos             ecdsa_doit[i] = 0;
206960662d10Schristos         else {
2070*1dcdf01fSchristos             if (ecdsa_c[i][0] == 0) {
207160662d10Schristos                 ecdsa_c[i][0] = 1;
207260662d10Schristos                 ecdsa_c[i][1] = 1;
207360662d10Schristos             }
207460662d10Schristos         }
207560662d10Schristos     }
207660662d10Schristos #   endif
207760662d10Schristos 
207860662d10Schristos     ecdh_c[R_EC_P160][0] = count / 1000;
207960662d10Schristos     for (i = R_EC_P192; i <= R_EC_P521; i++) {
208060662d10Schristos         ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
2081*1dcdf01fSchristos         if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
208260662d10Schristos             ecdh_doit[i] = 0;
208360662d10Schristos         else {
2084*1dcdf01fSchristos             if (ecdh_c[i][0] == 0) {
208560662d10Schristos                 ecdh_c[i][0] = 1;
208660662d10Schristos             }
208760662d10Schristos         }
208860662d10Schristos     }
2089*1dcdf01fSchristos #   ifndef OPENSSL_NO_EC2M
209060662d10Schristos     ecdh_c[R_EC_K163][0] = count / 1000;
209160662d10Schristos     for (i = R_EC_K233; i <= R_EC_K571; i++) {
209260662d10Schristos         ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
2093*1dcdf01fSchristos         if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
209460662d10Schristos             ecdh_doit[i] = 0;
209560662d10Schristos         else {
2096*1dcdf01fSchristos             if (ecdh_c[i][0] == 0) {
209760662d10Schristos                 ecdh_c[i][0] = 1;
209860662d10Schristos             }
209960662d10Schristos         }
210060662d10Schristos     }
210160662d10Schristos     ecdh_c[R_EC_B163][0] = count / 1000;
210260662d10Schristos     for (i = R_EC_B233; i <= R_EC_B571; i++) {
210360662d10Schristos         ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
2104*1dcdf01fSchristos         if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
210560662d10Schristos             ecdh_doit[i] = 0;
210660662d10Schristos         else {
2107*1dcdf01fSchristos             if (ecdh_c[i][0] == 0) {
210860662d10Schristos                 ecdh_c[i][0] = 1;
210960662d10Schristos             }
211060662d10Schristos         }
211160662d10Schristos     }
211260662d10Schristos #   endif
2113*1dcdf01fSchristos     /* repeated code good to factorize */
2114*1dcdf01fSchristos     ecdh_c[R_EC_BRP256R1][0] = count / 1000;
2115*1dcdf01fSchristos     for (i = R_EC_BRP384R1; i <= R_EC_BRP512R1; i += 2) {
2116*1dcdf01fSchristos         ecdh_c[i][0] = ecdh_c[i - 2][0] / 2;
2117*1dcdf01fSchristos         if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
2118*1dcdf01fSchristos             ecdh_doit[i] = 0;
2119*1dcdf01fSchristos         else {
2120*1dcdf01fSchristos             if (ecdh_c[i][0] == 0) {
2121*1dcdf01fSchristos                 ecdh_c[i][0] = 1;
2122*1dcdf01fSchristos             }
2123*1dcdf01fSchristos         }
2124*1dcdf01fSchristos     }
2125*1dcdf01fSchristos     ecdh_c[R_EC_BRP256T1][0] = count / 1000;
2126*1dcdf01fSchristos     for (i = R_EC_BRP384T1; i <= R_EC_BRP512T1; i += 2) {
2127*1dcdf01fSchristos         ecdh_c[i][0] = ecdh_c[i - 2][0] / 2;
2128*1dcdf01fSchristos         if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
2129*1dcdf01fSchristos             ecdh_doit[i] = 0;
2130*1dcdf01fSchristos         else {
2131*1dcdf01fSchristos             if (ecdh_c[i][0] == 0) {
2132*1dcdf01fSchristos                 ecdh_c[i][0] = 1;
2133*1dcdf01fSchristos             }
2134*1dcdf01fSchristos         }
2135*1dcdf01fSchristos     }
2136*1dcdf01fSchristos     /* default iteration count for the last two EC Curves */
2137*1dcdf01fSchristos     ecdh_c[R_EC_X25519][0] = count / 1800;
2138*1dcdf01fSchristos     ecdh_c[R_EC_X448][0] = count / 7200;
213960662d10Schristos 
2140*1dcdf01fSchristos     eddsa_c[R_EC_Ed25519][0] = count / 1800;
2141*1dcdf01fSchristos     eddsa_c[R_EC_Ed448][0] = count / 7200;
2142*1dcdf01fSchristos #  endif
2143*1dcdf01fSchristos 
214460662d10Schristos # else
214560662d10Schristos /* not worth fixing */
214660662d10Schristos #  error "You cannot disable DES on systems without SIGALRM."
214760662d10Schristos # endif                         /* OPENSSL_NO_DES */
2148*1dcdf01fSchristos #elif SIGALRM > 0
2149*1dcdf01fSchristos     signal(SIGALRM, alarmed);
215060662d10Schristos #endif                          /* SIGALRM */
215160662d10Schristos 
215260662d10Schristos #ifndef OPENSSL_NO_MD2
215360662d10Schristos     if (doit[D_MD2]) {
2154*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2155*1dcdf01fSchristos             print_message(names[D_MD2], c[D_MD2][testnum], lengths[testnum],
2156*1dcdf01fSchristos                           seconds.sym);
215760662d10Schristos             Time_F(START);
2158*1dcdf01fSchristos             count = run_benchmark(async_jobs, EVP_Digest_MD2_loop, loopargs);
215960662d10Schristos             d = Time_F(STOP);
2160*1dcdf01fSchristos             print_result(D_MD2, testnum, count, d);
216160662d10Schristos         }
216260662d10Schristos     }
216360662d10Schristos #endif
216460662d10Schristos #ifndef OPENSSL_NO_MDC2
216560662d10Schristos     if (doit[D_MDC2]) {
2166*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2167*1dcdf01fSchristos             print_message(names[D_MDC2], c[D_MDC2][testnum], lengths[testnum],
2168*1dcdf01fSchristos                           seconds.sym);
216960662d10Schristos             Time_F(START);
2170*1dcdf01fSchristos             count = run_benchmark(async_jobs, EVP_Digest_MDC2_loop, loopargs);
217160662d10Schristos             d = Time_F(STOP);
2172*1dcdf01fSchristos             print_result(D_MDC2, testnum, count, d);
217360662d10Schristos         }
217460662d10Schristos     }
217560662d10Schristos #endif
217660662d10Schristos 
217760662d10Schristos #ifndef OPENSSL_NO_MD4
217860662d10Schristos     if (doit[D_MD4]) {
2179*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2180*1dcdf01fSchristos             print_message(names[D_MD4], c[D_MD4][testnum], lengths[testnum],
2181*1dcdf01fSchristos                           seconds.sym);
218260662d10Schristos             Time_F(START);
2183*1dcdf01fSchristos             count = run_benchmark(async_jobs, EVP_Digest_MD4_loop, loopargs);
218460662d10Schristos             d = Time_F(STOP);
2185*1dcdf01fSchristos             print_result(D_MD4, testnum, count, d);
218660662d10Schristos         }
218760662d10Schristos     }
218860662d10Schristos #endif
218960662d10Schristos 
219060662d10Schristos #ifndef OPENSSL_NO_MD5
219160662d10Schristos     if (doit[D_MD5]) {
2192*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2193*1dcdf01fSchristos             print_message(names[D_MD5], c[D_MD5][testnum], lengths[testnum],
2194*1dcdf01fSchristos                           seconds.sym);
219560662d10Schristos             Time_F(START);
2196*1dcdf01fSchristos             count = run_benchmark(async_jobs, MD5_loop, loopargs);
219760662d10Schristos             d = Time_F(STOP);
2198*1dcdf01fSchristos             print_result(D_MD5, testnum, count, d);
219960662d10Schristos         }
220060662d10Schristos     }
220160662d10Schristos 
220260662d10Schristos     if (doit[D_HMAC]) {
2203*1dcdf01fSchristos         static const char hmac_key[] = "This is a key...";
2204*1dcdf01fSchristos         int len = strlen(hmac_key);
220560662d10Schristos 
2206*1dcdf01fSchristos         for (i = 0; i < loopargs_len; i++) {
2207*1dcdf01fSchristos             loopargs[i].hctx = HMAC_CTX_new();
2208*1dcdf01fSchristos             if (loopargs[i].hctx == NULL) {
2209*1dcdf01fSchristos                 BIO_printf(bio_err, "HMAC malloc failure, exiting...");
2210*1dcdf01fSchristos                 exit(1);
2211*1dcdf01fSchristos             }
221260662d10Schristos 
2213*1dcdf01fSchristos             HMAC_Init_ex(loopargs[i].hctx, hmac_key, len, EVP_md5(), NULL);
2214*1dcdf01fSchristos         }
2215*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2216*1dcdf01fSchristos             print_message(names[D_HMAC], c[D_HMAC][testnum], lengths[testnum],
2217*1dcdf01fSchristos                           seconds.sym);
221860662d10Schristos             Time_F(START);
2219*1dcdf01fSchristos             count = run_benchmark(async_jobs, HMAC_loop, loopargs);
222060662d10Schristos             d = Time_F(STOP);
2221*1dcdf01fSchristos             print_result(D_HMAC, testnum, count, d);
222260662d10Schristos         }
2223*1dcdf01fSchristos         for (i = 0; i < loopargs_len; i++) {
2224*1dcdf01fSchristos             HMAC_CTX_free(loopargs[i].hctx);
2225*1dcdf01fSchristos         }
222660662d10Schristos     }
222760662d10Schristos #endif
222860662d10Schristos     if (doit[D_SHA1]) {
2229*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2230*1dcdf01fSchristos             print_message(names[D_SHA1], c[D_SHA1][testnum], lengths[testnum],
2231*1dcdf01fSchristos                           seconds.sym);
223260662d10Schristos             Time_F(START);
2233*1dcdf01fSchristos             count = run_benchmark(async_jobs, SHA1_loop, loopargs);
223460662d10Schristos             d = Time_F(STOP);
2235*1dcdf01fSchristos             print_result(D_SHA1, testnum, count, d);
223660662d10Schristos         }
223760662d10Schristos     }
223860662d10Schristos     if (doit[D_SHA256]) {
2239*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2240*1dcdf01fSchristos             print_message(names[D_SHA256], c[D_SHA256][testnum],
2241*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
224260662d10Schristos             Time_F(START);
2243*1dcdf01fSchristos             count = run_benchmark(async_jobs, SHA256_loop, loopargs);
224460662d10Schristos             d = Time_F(STOP);
2245*1dcdf01fSchristos             print_result(D_SHA256, testnum, count, d);
224660662d10Schristos         }
224760662d10Schristos     }
224860662d10Schristos     if (doit[D_SHA512]) {
2249*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2250*1dcdf01fSchristos             print_message(names[D_SHA512], c[D_SHA512][testnum],
2251*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
225260662d10Schristos             Time_F(START);
2253*1dcdf01fSchristos             count = run_benchmark(async_jobs, SHA512_loop, loopargs);
225460662d10Schristos             d = Time_F(STOP);
2255*1dcdf01fSchristos             print_result(D_SHA512, testnum, count, d);
225660662d10Schristos         }
225760662d10Schristos     }
225860662d10Schristos #ifndef OPENSSL_NO_WHIRLPOOL
225960662d10Schristos     if (doit[D_WHIRLPOOL]) {
2260*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2261*1dcdf01fSchristos             print_message(names[D_WHIRLPOOL], c[D_WHIRLPOOL][testnum],
2262*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
226360662d10Schristos             Time_F(START);
2264*1dcdf01fSchristos             count = run_benchmark(async_jobs, WHIRLPOOL_loop, loopargs);
226560662d10Schristos             d = Time_F(STOP);
2266*1dcdf01fSchristos             print_result(D_WHIRLPOOL, testnum, count, d);
226760662d10Schristos         }
226860662d10Schristos     }
226960662d10Schristos #endif
227060662d10Schristos 
2271*1dcdf01fSchristos #ifndef OPENSSL_NO_RMD160
227260662d10Schristos     if (doit[D_RMD160]) {
2273*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2274*1dcdf01fSchristos             print_message(names[D_RMD160], c[D_RMD160][testnum],
2275*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
227660662d10Schristos             Time_F(START);
2277*1dcdf01fSchristos             count = run_benchmark(async_jobs, EVP_Digest_RMD160_loop, loopargs);
227860662d10Schristos             d = Time_F(STOP);
2279*1dcdf01fSchristos             print_result(D_RMD160, testnum, count, d);
228060662d10Schristos         }
228160662d10Schristos     }
228260662d10Schristos #endif
228360662d10Schristos #ifndef OPENSSL_NO_RC4
228460662d10Schristos     if (doit[D_RC4]) {
2285*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2286*1dcdf01fSchristos             print_message(names[D_RC4], c[D_RC4][testnum], lengths[testnum],
2287*1dcdf01fSchristos                           seconds.sym);
228860662d10Schristos             Time_F(START);
2289*1dcdf01fSchristos             count = run_benchmark(async_jobs, RC4_loop, loopargs);
229060662d10Schristos             d = Time_F(STOP);
2291*1dcdf01fSchristos             print_result(D_RC4, testnum, count, d);
229260662d10Schristos         }
229360662d10Schristos     }
229460662d10Schristos #endif
229560662d10Schristos #ifndef OPENSSL_NO_DES
229660662d10Schristos     if (doit[D_CBC_DES]) {
2297*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2298*1dcdf01fSchristos             print_message(names[D_CBC_DES], c[D_CBC_DES][testnum],
2299*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
230060662d10Schristos             Time_F(START);
2301*1dcdf01fSchristos             count = run_benchmark(async_jobs, DES_ncbc_encrypt_loop, loopargs);
230260662d10Schristos             d = Time_F(STOP);
2303*1dcdf01fSchristos             print_result(D_CBC_DES, testnum, count, d);
230460662d10Schristos         }
230560662d10Schristos     }
230660662d10Schristos 
230760662d10Schristos     if (doit[D_EDE3_DES]) {
2308*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2309*1dcdf01fSchristos             print_message(names[D_EDE3_DES], c[D_EDE3_DES][testnum],
2310*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
231160662d10Schristos             Time_F(START);
2312*1dcdf01fSchristos             count =
2313*1dcdf01fSchristos                 run_benchmark(async_jobs, DES_ede3_cbc_encrypt_loop, loopargs);
231460662d10Schristos             d = Time_F(STOP);
2315*1dcdf01fSchristos             print_result(D_EDE3_DES, testnum, count, d);
231660662d10Schristos         }
231760662d10Schristos     }
231860662d10Schristos #endif
2319*1dcdf01fSchristos 
232060662d10Schristos     if (doit[D_CBC_128_AES]) {
2321*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2322*1dcdf01fSchristos             print_message(names[D_CBC_128_AES], c[D_CBC_128_AES][testnum],
2323*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
232460662d10Schristos             Time_F(START);
2325*1dcdf01fSchristos             count =
2326*1dcdf01fSchristos                 run_benchmark(async_jobs, AES_cbc_128_encrypt_loop, loopargs);
232760662d10Schristos             d = Time_F(STOP);
2328*1dcdf01fSchristos             print_result(D_CBC_128_AES, testnum, count, d);
232960662d10Schristos         }
233060662d10Schristos     }
233160662d10Schristos     if (doit[D_CBC_192_AES]) {
2332*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2333*1dcdf01fSchristos             print_message(names[D_CBC_192_AES], c[D_CBC_192_AES][testnum],
2334*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
233560662d10Schristos             Time_F(START);
2336*1dcdf01fSchristos             count =
2337*1dcdf01fSchristos                 run_benchmark(async_jobs, AES_cbc_192_encrypt_loop, loopargs);
233860662d10Schristos             d = Time_F(STOP);
2339*1dcdf01fSchristos             print_result(D_CBC_192_AES, testnum, count, d);
234060662d10Schristos         }
234160662d10Schristos     }
234260662d10Schristos     if (doit[D_CBC_256_AES]) {
2343*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2344*1dcdf01fSchristos             print_message(names[D_CBC_256_AES], c[D_CBC_256_AES][testnum],
2345*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
234660662d10Schristos             Time_F(START);
2347*1dcdf01fSchristos             count =
2348*1dcdf01fSchristos                 run_benchmark(async_jobs, AES_cbc_256_encrypt_loop, loopargs);
234960662d10Schristos             d = Time_F(STOP);
2350*1dcdf01fSchristos             print_result(D_CBC_256_AES, testnum, count, d);
235160662d10Schristos         }
235260662d10Schristos     }
235360662d10Schristos 
235460662d10Schristos     if (doit[D_IGE_128_AES]) {
2355*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2356*1dcdf01fSchristos             print_message(names[D_IGE_128_AES], c[D_IGE_128_AES][testnum],
2357*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
235860662d10Schristos             Time_F(START);
2359*1dcdf01fSchristos             count =
2360*1dcdf01fSchristos                 run_benchmark(async_jobs, AES_ige_128_encrypt_loop, loopargs);
236160662d10Schristos             d = Time_F(STOP);
2362*1dcdf01fSchristos             print_result(D_IGE_128_AES, testnum, count, d);
236360662d10Schristos         }
236460662d10Schristos     }
236560662d10Schristos     if (doit[D_IGE_192_AES]) {
2366*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2367*1dcdf01fSchristos             print_message(names[D_IGE_192_AES], c[D_IGE_192_AES][testnum],
2368*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
236960662d10Schristos             Time_F(START);
2370*1dcdf01fSchristos             count =
2371*1dcdf01fSchristos                 run_benchmark(async_jobs, AES_ige_192_encrypt_loop, loopargs);
237260662d10Schristos             d = Time_F(STOP);
2373*1dcdf01fSchristos             print_result(D_IGE_192_AES, testnum, count, d);
237460662d10Schristos         }
237560662d10Schristos     }
237660662d10Schristos     if (doit[D_IGE_256_AES]) {
2377*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2378*1dcdf01fSchristos             print_message(names[D_IGE_256_AES], c[D_IGE_256_AES][testnum],
2379*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
238060662d10Schristos             Time_F(START);
2381*1dcdf01fSchristos             count =
2382*1dcdf01fSchristos                 run_benchmark(async_jobs, AES_ige_256_encrypt_loop, loopargs);
238360662d10Schristos             d = Time_F(STOP);
2384*1dcdf01fSchristos             print_result(D_IGE_256_AES, testnum, count, d);
238560662d10Schristos         }
238660662d10Schristos     }
238760662d10Schristos     if (doit[D_GHASH]) {
2388*1dcdf01fSchristos         for (i = 0; i < loopargs_len; i++) {
2389*1dcdf01fSchristos             loopargs[i].gcm_ctx =
239060662d10Schristos                 CRYPTO_gcm128_new(&aes_ks1, (block128_f) AES_encrypt);
2391*1dcdf01fSchristos             CRYPTO_gcm128_setiv(loopargs[i].gcm_ctx,
2392*1dcdf01fSchristos                                 (unsigned char *)"0123456789ab", 12);
2393*1dcdf01fSchristos         }
239460662d10Schristos 
2395*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2396*1dcdf01fSchristos             print_message(names[D_GHASH], c[D_GHASH][testnum],
2397*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
239860662d10Schristos             Time_F(START);
2399*1dcdf01fSchristos             count = run_benchmark(async_jobs, CRYPTO_gcm128_aad_loop, loopargs);
240060662d10Schristos             d = Time_F(STOP);
2401*1dcdf01fSchristos             print_result(D_GHASH, testnum, count, d);
240260662d10Schristos         }
2403*1dcdf01fSchristos         for (i = 0; i < loopargs_len; i++)
2404*1dcdf01fSchristos             CRYPTO_gcm128_release(loopargs[i].gcm_ctx);
240560662d10Schristos     }
240660662d10Schristos #ifndef OPENSSL_NO_CAMELLIA
240760662d10Schristos     if (doit[D_CBC_128_CML]) {
2408*1dcdf01fSchristos         if (async_jobs > 0) {
2409*1dcdf01fSchristos             BIO_printf(bio_err, "Async mode is not supported with %s\n",
2410*1dcdf01fSchristos                        names[D_CBC_128_CML]);
2411*1dcdf01fSchristos             doit[D_CBC_128_CML] = 0;
2412*1dcdf01fSchristos         }
2413*1dcdf01fSchristos         for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2414*1dcdf01fSchristos             print_message(names[D_CBC_128_CML], c[D_CBC_128_CML][testnum],
2415*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
241660662d10Schristos             Time_F(START);
2417*1dcdf01fSchristos             for (count = 0; COND(c[D_CBC_128_CML][testnum]); count++)
2418*1dcdf01fSchristos                 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2419*1dcdf01fSchristos                                      (size_t)lengths[testnum], &camellia_ks1,
242060662d10Schristos                                      iv, CAMELLIA_ENCRYPT);
242160662d10Schristos             d = Time_F(STOP);
2422*1dcdf01fSchristos             print_result(D_CBC_128_CML, testnum, count, d);
242360662d10Schristos         }
242460662d10Schristos     }
242560662d10Schristos     if (doit[D_CBC_192_CML]) {
2426*1dcdf01fSchristos         if (async_jobs > 0) {
2427*1dcdf01fSchristos             BIO_printf(bio_err, "Async mode is not supported with %s\n",
2428*1dcdf01fSchristos                        names[D_CBC_192_CML]);
2429*1dcdf01fSchristos             doit[D_CBC_192_CML] = 0;
2430*1dcdf01fSchristos         }
2431*1dcdf01fSchristos         for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2432*1dcdf01fSchristos             print_message(names[D_CBC_192_CML], c[D_CBC_192_CML][testnum],
2433*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
2434*1dcdf01fSchristos             if (async_jobs > 0) {
2435*1dcdf01fSchristos                 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2436*1dcdf01fSchristos                 exit(1);
2437*1dcdf01fSchristos             }
243860662d10Schristos             Time_F(START);
2439*1dcdf01fSchristos             for (count = 0; COND(c[D_CBC_192_CML][testnum]); count++)
2440*1dcdf01fSchristos                 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2441*1dcdf01fSchristos                                      (size_t)lengths[testnum], &camellia_ks2,
244260662d10Schristos                                      iv, CAMELLIA_ENCRYPT);
244360662d10Schristos             d = Time_F(STOP);
2444*1dcdf01fSchristos             print_result(D_CBC_192_CML, testnum, count, d);
244560662d10Schristos         }
244660662d10Schristos     }
244760662d10Schristos     if (doit[D_CBC_256_CML]) {
2448*1dcdf01fSchristos         if (async_jobs > 0) {
2449*1dcdf01fSchristos             BIO_printf(bio_err, "Async mode is not supported with %s\n",
2450*1dcdf01fSchristos                        names[D_CBC_256_CML]);
2451*1dcdf01fSchristos             doit[D_CBC_256_CML] = 0;
2452*1dcdf01fSchristos         }
2453*1dcdf01fSchristos         for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2454*1dcdf01fSchristos             print_message(names[D_CBC_256_CML], c[D_CBC_256_CML][testnum],
2455*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
245660662d10Schristos             Time_F(START);
2457*1dcdf01fSchristos             for (count = 0; COND(c[D_CBC_256_CML][testnum]); count++)
2458*1dcdf01fSchristos                 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2459*1dcdf01fSchristos                                      (size_t)lengths[testnum], &camellia_ks3,
246060662d10Schristos                                      iv, CAMELLIA_ENCRYPT);
246160662d10Schristos             d = Time_F(STOP);
2462*1dcdf01fSchristos             print_result(D_CBC_256_CML, testnum, count, d);
246360662d10Schristos         }
246460662d10Schristos     }
246560662d10Schristos #endif
246660662d10Schristos #ifndef OPENSSL_NO_IDEA
246760662d10Schristos     if (doit[D_CBC_IDEA]) {
2468*1dcdf01fSchristos         if (async_jobs > 0) {
2469*1dcdf01fSchristos             BIO_printf(bio_err, "Async mode is not supported with %s\n",
2470*1dcdf01fSchristos                        names[D_CBC_IDEA]);
2471*1dcdf01fSchristos             doit[D_CBC_IDEA] = 0;
2472*1dcdf01fSchristos         }
2473*1dcdf01fSchristos         for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2474*1dcdf01fSchristos             print_message(names[D_CBC_IDEA], c[D_CBC_IDEA][testnum],
2475*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
247660662d10Schristos             Time_F(START);
2477*1dcdf01fSchristos             for (count = 0; COND(c[D_CBC_IDEA][testnum]); count++)
2478*1dcdf01fSchristos                 IDEA_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2479*1dcdf01fSchristos                                  (size_t)lengths[testnum], &idea_ks,
248060662d10Schristos                                  iv, IDEA_ENCRYPT);
248160662d10Schristos             d = Time_F(STOP);
2482*1dcdf01fSchristos             print_result(D_CBC_IDEA, testnum, count, d);
248360662d10Schristos         }
248460662d10Schristos     }
248560662d10Schristos #endif
248660662d10Schristos #ifndef OPENSSL_NO_SEED
248760662d10Schristos     if (doit[D_CBC_SEED]) {
2488*1dcdf01fSchristos         if (async_jobs > 0) {
2489*1dcdf01fSchristos             BIO_printf(bio_err, "Async mode is not supported with %s\n",
2490*1dcdf01fSchristos                        names[D_CBC_SEED]);
2491*1dcdf01fSchristos             doit[D_CBC_SEED] = 0;
2492*1dcdf01fSchristos         }
2493*1dcdf01fSchristos         for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2494*1dcdf01fSchristos             print_message(names[D_CBC_SEED], c[D_CBC_SEED][testnum],
2495*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
249660662d10Schristos             Time_F(START);
2497*1dcdf01fSchristos             for (count = 0; COND(c[D_CBC_SEED][testnum]); count++)
2498*1dcdf01fSchristos                 SEED_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2499*1dcdf01fSchristos                                  (size_t)lengths[testnum], &seed_ks, iv, 1);
250060662d10Schristos             d = Time_F(STOP);
2501*1dcdf01fSchristos             print_result(D_CBC_SEED, testnum, count, d);
250260662d10Schristos         }
250360662d10Schristos     }
250460662d10Schristos #endif
250560662d10Schristos #ifndef OPENSSL_NO_RC2
250660662d10Schristos     if (doit[D_CBC_RC2]) {
2507*1dcdf01fSchristos         if (async_jobs > 0) {
2508*1dcdf01fSchristos             BIO_printf(bio_err, "Async mode is not supported with %s\n",
2509*1dcdf01fSchristos                        names[D_CBC_RC2]);
2510*1dcdf01fSchristos             doit[D_CBC_RC2] = 0;
2511*1dcdf01fSchristos         }
2512*1dcdf01fSchristos         for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2513*1dcdf01fSchristos             print_message(names[D_CBC_RC2], c[D_CBC_RC2][testnum],
2514*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
2515*1dcdf01fSchristos             if (async_jobs > 0) {
2516*1dcdf01fSchristos                 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2517*1dcdf01fSchristos                 exit(1);
2518*1dcdf01fSchristos             }
251960662d10Schristos             Time_F(START);
2520*1dcdf01fSchristos             for (count = 0; COND(c[D_CBC_RC2][testnum]); count++)
2521*1dcdf01fSchristos                 RC2_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2522*1dcdf01fSchristos                                 (size_t)lengths[testnum], &rc2_ks,
252360662d10Schristos                                 iv, RC2_ENCRYPT);
252460662d10Schristos             d = Time_F(STOP);
2525*1dcdf01fSchristos             print_result(D_CBC_RC2, testnum, count, d);
252660662d10Schristos         }
252760662d10Schristos     }
252860662d10Schristos #endif
252960662d10Schristos #ifndef OPENSSL_NO_RC5
253060662d10Schristos     if (doit[D_CBC_RC5]) {
2531*1dcdf01fSchristos         if (async_jobs > 0) {
2532*1dcdf01fSchristos             BIO_printf(bio_err, "Async mode is not supported with %s\n",
2533*1dcdf01fSchristos                        names[D_CBC_RC5]);
2534*1dcdf01fSchristos             doit[D_CBC_RC5] = 0;
2535*1dcdf01fSchristos         }
2536*1dcdf01fSchristos         for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2537*1dcdf01fSchristos             print_message(names[D_CBC_RC5], c[D_CBC_RC5][testnum],
2538*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
2539*1dcdf01fSchristos             if (async_jobs > 0) {
2540*1dcdf01fSchristos                 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2541*1dcdf01fSchristos                 exit(1);
2542*1dcdf01fSchristos             }
254360662d10Schristos             Time_F(START);
2544*1dcdf01fSchristos             for (count = 0; COND(c[D_CBC_RC5][testnum]); count++)
2545*1dcdf01fSchristos                 RC5_32_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2546*1dcdf01fSchristos                                    (size_t)lengths[testnum], &rc5_ks,
254760662d10Schristos                                    iv, RC5_ENCRYPT);
254860662d10Schristos             d = Time_F(STOP);
2549*1dcdf01fSchristos             print_result(D_CBC_RC5, testnum, count, d);
255060662d10Schristos         }
255160662d10Schristos     }
255260662d10Schristos #endif
255360662d10Schristos #ifndef OPENSSL_NO_BF
255460662d10Schristos     if (doit[D_CBC_BF]) {
2555*1dcdf01fSchristos         if (async_jobs > 0) {
2556*1dcdf01fSchristos             BIO_printf(bio_err, "Async mode is not supported with %s\n",
2557*1dcdf01fSchristos                        names[D_CBC_BF]);
2558*1dcdf01fSchristos             doit[D_CBC_BF] = 0;
2559*1dcdf01fSchristos         }
2560*1dcdf01fSchristos         for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2561*1dcdf01fSchristos             print_message(names[D_CBC_BF], c[D_CBC_BF][testnum],
2562*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
256360662d10Schristos             Time_F(START);
2564*1dcdf01fSchristos             for (count = 0; COND(c[D_CBC_BF][testnum]); count++)
2565*1dcdf01fSchristos                 BF_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2566*1dcdf01fSchristos                                (size_t)lengths[testnum], &bf_ks,
256760662d10Schristos                                iv, BF_ENCRYPT);
256860662d10Schristos             d = Time_F(STOP);
2569*1dcdf01fSchristos             print_result(D_CBC_BF, testnum, count, d);
257060662d10Schristos         }
257160662d10Schristos     }
257260662d10Schristos #endif
257360662d10Schristos #ifndef OPENSSL_NO_CAST
257460662d10Schristos     if (doit[D_CBC_CAST]) {
2575*1dcdf01fSchristos         if (async_jobs > 0) {
2576*1dcdf01fSchristos             BIO_printf(bio_err, "Async mode is not supported with %s\n",
2577*1dcdf01fSchristos                        names[D_CBC_CAST]);
2578*1dcdf01fSchristos             doit[D_CBC_CAST] = 0;
2579*1dcdf01fSchristos         }
2580*1dcdf01fSchristos         for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2581*1dcdf01fSchristos             print_message(names[D_CBC_CAST], c[D_CBC_CAST][testnum],
2582*1dcdf01fSchristos                           lengths[testnum], seconds.sym);
258360662d10Schristos             Time_F(START);
2584*1dcdf01fSchristos             for (count = 0; COND(c[D_CBC_CAST][testnum]); count++)
2585*1dcdf01fSchristos                 CAST_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2586*1dcdf01fSchristos                                  (size_t)lengths[testnum], &cast_ks,
258760662d10Schristos                                  iv, CAST_ENCRYPT);
258860662d10Schristos             d = Time_F(STOP);
2589*1dcdf01fSchristos             print_result(D_CBC_CAST, testnum, count, d);
259060662d10Schristos         }
259160662d10Schristos     }
259260662d10Schristos #endif
2593*1dcdf01fSchristos     if (doit[D_RAND]) {
2594*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
2595*1dcdf01fSchristos             print_message(names[D_RAND], c[D_RAND][testnum], lengths[testnum],
2596*1dcdf01fSchristos                           seconds.sym);
2597*1dcdf01fSchristos             Time_F(START);
2598*1dcdf01fSchristos             count = run_benchmark(async_jobs, RAND_bytes_loop, loopargs);
2599*1dcdf01fSchristos             d = Time_F(STOP);
2600*1dcdf01fSchristos             print_result(D_RAND, testnum, count, d);
2601*1dcdf01fSchristos         }
2602*1dcdf01fSchristos     }
260360662d10Schristos 
260460662d10Schristos     if (doit[D_EVP]) {
2605*1dcdf01fSchristos         if (evp_cipher != NULL) {
2606*1dcdf01fSchristos             int (*loopfunc)(void *args) = EVP_Update_loop;
2607*1dcdf01fSchristos 
2608*1dcdf01fSchristos             if (multiblock && (EVP_CIPHER_flags(evp_cipher) &
260960662d10Schristos                                EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) {
2610*1dcdf01fSchristos                 multiblock_speed(evp_cipher, lengths_single, &seconds);
2611*1dcdf01fSchristos                 ret = 0;
261260662d10Schristos                 goto end;
261360662d10Schristos             }
2614*1dcdf01fSchristos 
2615*1dcdf01fSchristos             names[D_EVP] = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
2616*1dcdf01fSchristos 
2617*1dcdf01fSchristos             if (EVP_CIPHER_mode(evp_cipher) == EVP_CIPH_CCM_MODE) {
2618*1dcdf01fSchristos                 loopfunc = EVP_Update_loop_ccm;
2619*1dcdf01fSchristos             } else if (aead && (EVP_CIPHER_flags(evp_cipher) &
2620*1dcdf01fSchristos                                 EVP_CIPH_FLAG_AEAD_CIPHER)) {
2621*1dcdf01fSchristos                 loopfunc = EVP_Update_loop_aead;
2622*1dcdf01fSchristos                 if (lengths == lengths_list) {
2623*1dcdf01fSchristos                     lengths = aead_lengths_list;
2624*1dcdf01fSchristos                     size_num = OSSL_NELEM(aead_lengths_list);
2625*1dcdf01fSchristos                 }
2626*1dcdf01fSchristos             }
2627*1dcdf01fSchristos 
2628*1dcdf01fSchristos             for (testnum = 0; testnum < size_num; testnum++) {
2629*1dcdf01fSchristos                 print_message(names[D_EVP], save_count, lengths[testnum],
2630*1dcdf01fSchristos                               seconds.sym);
2631*1dcdf01fSchristos 
2632*1dcdf01fSchristos                 for (k = 0; k < loopargs_len; k++) {
2633*1dcdf01fSchristos                     loopargs[k].ctx = EVP_CIPHER_CTX_new();
2634*1dcdf01fSchristos                     if (loopargs[k].ctx == NULL) {
2635*1dcdf01fSchristos                         BIO_printf(bio_err, "\nEVP_CIPHER_CTX_new failure\n");
2636*1dcdf01fSchristos                         exit(1);
2637*1dcdf01fSchristos                     }
2638*1dcdf01fSchristos                     if (!EVP_CipherInit_ex(loopargs[k].ctx, evp_cipher, NULL,
2639*1dcdf01fSchristos                                            NULL, iv, decrypt ? 0 : 1)) {
2640*1dcdf01fSchristos                         BIO_printf(bio_err, "\nEVP_CipherInit_ex failure\n");
2641*1dcdf01fSchristos                         ERR_print_errors(bio_err);
2642*1dcdf01fSchristos                         exit(1);
2643*1dcdf01fSchristos                     }
2644*1dcdf01fSchristos 
2645*1dcdf01fSchristos                     EVP_CIPHER_CTX_set_padding(loopargs[k].ctx, 0);
2646*1dcdf01fSchristos 
2647*1dcdf01fSchristos                     keylen = EVP_CIPHER_CTX_key_length(loopargs[k].ctx);
2648*1dcdf01fSchristos                     loopargs[k].key = app_malloc(keylen, "evp_cipher key");
2649*1dcdf01fSchristos                     EVP_CIPHER_CTX_rand_key(loopargs[k].ctx, loopargs[k].key);
2650*1dcdf01fSchristos                     if (!EVP_CipherInit_ex(loopargs[k].ctx, NULL, NULL,
2651*1dcdf01fSchristos                                            loopargs[k].key, NULL, -1)) {
2652*1dcdf01fSchristos                         BIO_printf(bio_err, "\nEVP_CipherInit_ex failure\n");
2653*1dcdf01fSchristos                         ERR_print_errors(bio_err);
2654*1dcdf01fSchristos                         exit(1);
2655*1dcdf01fSchristos                     }
2656*1dcdf01fSchristos                     OPENSSL_clear_free(loopargs[k].key, keylen);
2657*1dcdf01fSchristos                 }
2658*1dcdf01fSchristos 
2659*1dcdf01fSchristos                 Time_F(START);
2660*1dcdf01fSchristos                 count = run_benchmark(async_jobs, loopfunc, loopargs);
2661*1dcdf01fSchristos                 d = Time_F(STOP);
2662*1dcdf01fSchristos                 for (k = 0; k < loopargs_len; k++) {
2663*1dcdf01fSchristos                     EVP_CIPHER_CTX_free(loopargs[k].ctx);
2664*1dcdf01fSchristos                 }
2665*1dcdf01fSchristos                 print_result(D_EVP, testnum, count, d);
2666*1dcdf01fSchristos             }
2667*1dcdf01fSchristos         } else if (evp_md != NULL) {
2668*1dcdf01fSchristos             names[D_EVP] = OBJ_nid2ln(EVP_MD_type(evp_md));
2669*1dcdf01fSchristos 
2670*1dcdf01fSchristos             for (testnum = 0; testnum < size_num; testnum++) {
2671*1dcdf01fSchristos                 print_message(names[D_EVP], save_count, lengths[testnum],
2672*1dcdf01fSchristos                               seconds.sym);
2673*1dcdf01fSchristos                 Time_F(START);
2674*1dcdf01fSchristos                 count = run_benchmark(async_jobs, EVP_Digest_loop, loopargs);
2675*1dcdf01fSchristos                 d = Time_F(STOP);
2676*1dcdf01fSchristos                 print_result(D_EVP, testnum, count, d);
2677*1dcdf01fSchristos             }
2678*1dcdf01fSchristos         }
2679*1dcdf01fSchristos     }
2680*1dcdf01fSchristos 
2681*1dcdf01fSchristos     for (i = 0; i < loopargs_len; i++)
2682*1dcdf01fSchristos         if (RAND_bytes(loopargs[i].buf, 36) <= 0)
268360662d10Schristos             goto end;
268460662d10Schristos 
268560662d10Schristos #ifndef OPENSSL_NO_RSA
2686*1dcdf01fSchristos     for (testnum = 0; testnum < RSA_NUM; testnum++) {
2687*1dcdf01fSchristos         int st = 0;
2688*1dcdf01fSchristos         if (!rsa_doit[testnum])
268960662d10Schristos             continue;
2690*1dcdf01fSchristos         for (i = 0; i < loopargs_len; i++) {
2691*1dcdf01fSchristos             if (primes > 2) {
2692*1dcdf01fSchristos                 /* we haven't set keys yet,  generate multi-prime RSA keys */
2693*1dcdf01fSchristos                 BIGNUM *bn = BN_new();
2694*1dcdf01fSchristos 
2695*1dcdf01fSchristos                 if (bn == NULL)
2696*1dcdf01fSchristos                     goto end;
2697*1dcdf01fSchristos                 if (!BN_set_word(bn, RSA_F4)) {
2698*1dcdf01fSchristos                     BN_free(bn);
2699*1dcdf01fSchristos                     goto end;
2700*1dcdf01fSchristos                 }
2701*1dcdf01fSchristos 
2702*1dcdf01fSchristos                 BIO_printf(bio_err, "Generate multi-prime RSA key for %s\n",
2703*1dcdf01fSchristos                            rsa_choices[testnum].name);
2704*1dcdf01fSchristos 
2705*1dcdf01fSchristos                 loopargs[i].rsa_key[testnum] = RSA_new();
2706*1dcdf01fSchristos                 if (loopargs[i].rsa_key[testnum] == NULL) {
2707*1dcdf01fSchristos                     BN_free(bn);
2708*1dcdf01fSchristos                     goto end;
2709*1dcdf01fSchristos                 }
2710*1dcdf01fSchristos 
2711*1dcdf01fSchristos                 if (!RSA_generate_multi_prime_key(loopargs[i].rsa_key[testnum],
2712*1dcdf01fSchristos                                                   rsa_bits[testnum],
2713*1dcdf01fSchristos                                                   primes, bn, NULL)) {
2714*1dcdf01fSchristos                     BN_free(bn);
2715*1dcdf01fSchristos                     goto end;
2716*1dcdf01fSchristos                 }
2717*1dcdf01fSchristos                 BN_free(bn);
2718*1dcdf01fSchristos             }
2719*1dcdf01fSchristos             st = RSA_sign(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
2720*1dcdf01fSchristos                           &loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
2721*1dcdf01fSchristos             if (st == 0)
2722*1dcdf01fSchristos                 break;
2723*1dcdf01fSchristos         }
2724*1dcdf01fSchristos         if (st == 0) {
272560662d10Schristos             BIO_printf(bio_err,
272660662d10Schristos                        "RSA sign failure.  No RSA sign will be done.\n");
272760662d10Schristos             ERR_print_errors(bio_err);
272860662d10Schristos             rsa_count = 1;
272960662d10Schristos         } else {
273060662d10Schristos             pkey_print_message("private", "rsa",
2731*1dcdf01fSchristos                                rsa_c[testnum][0], rsa_bits[testnum],
2732*1dcdf01fSchristos                                seconds.rsa);
2733*1dcdf01fSchristos             /* RSA_blinding_on(rsa_key[testnum],NULL); */
273460662d10Schristos             Time_F(START);
2735*1dcdf01fSchristos             count = run_benchmark(async_jobs, RSA_sign_loop, loopargs);
273660662d10Schristos             d = Time_F(STOP);
273760662d10Schristos             BIO_printf(bio_err,
273860662d10Schristos                        mr ? "+R1:%ld:%d:%.2f\n"
2739*1dcdf01fSchristos                        : "%ld %u bits private RSA's in %.2fs\n",
2740*1dcdf01fSchristos                        count, rsa_bits[testnum], d);
2741*1dcdf01fSchristos             rsa_results[testnum][0] = (double)count / d;
274260662d10Schristos             rsa_count = count;
274360662d10Schristos         }
274460662d10Schristos 
2745*1dcdf01fSchristos         for (i = 0; i < loopargs_len; i++) {
2746*1dcdf01fSchristos             st = RSA_verify(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
2747*1dcdf01fSchristos                             loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
2748*1dcdf01fSchristos             if (st <= 0)
2749*1dcdf01fSchristos                 break;
2750*1dcdf01fSchristos         }
2751*1dcdf01fSchristos         if (st <= 0) {
275260662d10Schristos             BIO_printf(bio_err,
275360662d10Schristos                        "RSA verify failure.  No RSA verify will be done.\n");
275460662d10Schristos             ERR_print_errors(bio_err);
2755*1dcdf01fSchristos             rsa_doit[testnum] = 0;
275660662d10Schristos         } else {
275760662d10Schristos             pkey_print_message("public", "rsa",
2758*1dcdf01fSchristos                                rsa_c[testnum][1], rsa_bits[testnum],
2759*1dcdf01fSchristos                                seconds.rsa);
276060662d10Schristos             Time_F(START);
2761*1dcdf01fSchristos             count = run_benchmark(async_jobs, RSA_verify_loop, loopargs);
276260662d10Schristos             d = Time_F(STOP);
276360662d10Schristos             BIO_printf(bio_err,
276460662d10Schristos                        mr ? "+R2:%ld:%d:%.2f\n"
2765*1dcdf01fSchristos                        : "%ld %u bits public RSA's in %.2fs\n",
2766*1dcdf01fSchristos                        count, rsa_bits[testnum], d);
2767*1dcdf01fSchristos             rsa_results[testnum][1] = (double)count / d;
276860662d10Schristos         }
276960662d10Schristos 
277060662d10Schristos         if (rsa_count <= 1) {
277160662d10Schristos             /* if longer than 10s, don't do any more */
2772*1dcdf01fSchristos             for (testnum++; testnum < RSA_NUM; testnum++)
2773*1dcdf01fSchristos                 rsa_doit[testnum] = 0;
277460662d10Schristos         }
277560662d10Schristos     }
2776*1dcdf01fSchristos #endif                          /* OPENSSL_NO_RSA */
277760662d10Schristos 
2778*1dcdf01fSchristos     for (i = 0; i < loopargs_len; i++)
2779*1dcdf01fSchristos         if (RAND_bytes(loopargs[i].buf, 36) <= 0)
2780*1dcdf01fSchristos             goto end;
2781*1dcdf01fSchristos 
278260662d10Schristos #ifndef OPENSSL_NO_DSA
2783*1dcdf01fSchristos     for (testnum = 0; testnum < DSA_NUM; testnum++) {
2784*1dcdf01fSchristos         int st = 0;
2785*1dcdf01fSchristos         if (!dsa_doit[testnum])
278660662d10Schristos             continue;
278760662d10Schristos 
2788*1dcdf01fSchristos         /* DSA_generate_key(dsa_key[testnum]); */
2789*1dcdf01fSchristos         /* DSA_sign_setup(dsa_key[testnum],NULL); */
2790*1dcdf01fSchristos         for (i = 0; i < loopargs_len; i++) {
2791*1dcdf01fSchristos             st = DSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
2792*1dcdf01fSchristos                           &loopargs[i].siglen, loopargs[i].dsa_key[testnum]);
2793*1dcdf01fSchristos             if (st == 0)
2794*1dcdf01fSchristos                 break;
2795*1dcdf01fSchristos         }
2796*1dcdf01fSchristos         if (st == 0) {
279760662d10Schristos             BIO_printf(bio_err,
279860662d10Schristos                        "DSA sign failure.  No DSA sign will be done.\n");
279960662d10Schristos             ERR_print_errors(bio_err);
280060662d10Schristos             rsa_count = 1;
280160662d10Schristos         } else {
280260662d10Schristos             pkey_print_message("sign", "dsa",
2803*1dcdf01fSchristos                                dsa_c[testnum][0], dsa_bits[testnum],
2804*1dcdf01fSchristos                                seconds.dsa);
280560662d10Schristos             Time_F(START);
2806*1dcdf01fSchristos             count = run_benchmark(async_jobs, DSA_sign_loop, loopargs);
280760662d10Schristos             d = Time_F(STOP);
280860662d10Schristos             BIO_printf(bio_err,
2809*1dcdf01fSchristos                        mr ? "+R3:%ld:%u:%.2f\n"
2810*1dcdf01fSchristos                        : "%ld %u bits DSA signs in %.2fs\n",
2811*1dcdf01fSchristos                        count, dsa_bits[testnum], d);
2812*1dcdf01fSchristos             dsa_results[testnum][0] = (double)count / d;
281360662d10Schristos             rsa_count = count;
281460662d10Schristos         }
281560662d10Schristos 
2816*1dcdf01fSchristos         for (i = 0; i < loopargs_len; i++) {
2817*1dcdf01fSchristos             st = DSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
2818*1dcdf01fSchristos                             loopargs[i].siglen, loopargs[i].dsa_key[testnum]);
2819*1dcdf01fSchristos             if (st <= 0)
2820*1dcdf01fSchristos                 break;
2821*1dcdf01fSchristos         }
2822*1dcdf01fSchristos         if (st <= 0) {
282360662d10Schristos             BIO_printf(bio_err,
282460662d10Schristos                        "DSA verify failure.  No DSA verify will be done.\n");
282560662d10Schristos             ERR_print_errors(bio_err);
2826*1dcdf01fSchristos             dsa_doit[testnum] = 0;
282760662d10Schristos         } else {
282860662d10Schristos             pkey_print_message("verify", "dsa",
2829*1dcdf01fSchristos                                dsa_c[testnum][1], dsa_bits[testnum],
2830*1dcdf01fSchristos                                seconds.dsa);
283160662d10Schristos             Time_F(START);
2832*1dcdf01fSchristos             count = run_benchmark(async_jobs, DSA_verify_loop, loopargs);
283360662d10Schristos             d = Time_F(STOP);
283460662d10Schristos             BIO_printf(bio_err,
2835*1dcdf01fSchristos                        mr ? "+R4:%ld:%u:%.2f\n"
2836*1dcdf01fSchristos                        : "%ld %u bits DSA verify in %.2fs\n",
2837*1dcdf01fSchristos                        count, dsa_bits[testnum], d);
2838*1dcdf01fSchristos             dsa_results[testnum][1] = (double)count / d;
283960662d10Schristos         }
284060662d10Schristos 
284160662d10Schristos         if (rsa_count <= 1) {
284260662d10Schristos             /* if longer than 10s, don't do any more */
2843*1dcdf01fSchristos             for (testnum++; testnum < DSA_NUM; testnum++)
2844*1dcdf01fSchristos                 dsa_doit[testnum] = 0;
284560662d10Schristos         }
284660662d10Schristos     }
2847*1dcdf01fSchristos #endif                          /* OPENSSL_NO_DSA */
284860662d10Schristos 
2849*1dcdf01fSchristos #ifndef OPENSSL_NO_EC
2850*1dcdf01fSchristos     for (testnum = 0; testnum < ECDSA_NUM; testnum++) {
2851*1dcdf01fSchristos         int st = 1;
285260662d10Schristos 
2853*1dcdf01fSchristos         if (!ecdsa_doit[testnum])
285460662d10Schristos             continue;           /* Ignore Curve */
2855*1dcdf01fSchristos         for (i = 0; i < loopargs_len; i++) {
2856*1dcdf01fSchristos             loopargs[i].ecdsa[testnum] =
2857*1dcdf01fSchristos                 EC_KEY_new_by_curve_name(test_curves[testnum].nid);
2858*1dcdf01fSchristos             if (loopargs[i].ecdsa[testnum] == NULL) {
2859*1dcdf01fSchristos                 st = 0;
2860*1dcdf01fSchristos                 break;
2861*1dcdf01fSchristos             }
2862*1dcdf01fSchristos         }
2863*1dcdf01fSchristos         if (st == 0) {
286460662d10Schristos             BIO_printf(bio_err, "ECDSA failure.\n");
286560662d10Schristos             ERR_print_errors(bio_err);
286660662d10Schristos             rsa_count = 1;
286760662d10Schristos         } else {
2868*1dcdf01fSchristos             for (i = 0; i < loopargs_len; i++) {
2869*1dcdf01fSchristos                 EC_KEY_precompute_mult(loopargs[i].ecdsa[testnum], NULL);
287060662d10Schristos                 /* Perform ECDSA signature test */
2871*1dcdf01fSchristos                 EC_KEY_generate_key(loopargs[i].ecdsa[testnum]);
2872*1dcdf01fSchristos                 st = ECDSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
2873*1dcdf01fSchristos                                 &loopargs[i].siglen,
2874*1dcdf01fSchristos                                 loopargs[i].ecdsa[testnum]);
2875*1dcdf01fSchristos                 if (st == 0)
2876*1dcdf01fSchristos                     break;
2877*1dcdf01fSchristos             }
2878*1dcdf01fSchristos             if (st == 0) {
287960662d10Schristos                 BIO_printf(bio_err,
288060662d10Schristos                            "ECDSA sign failure.  No ECDSA sign will be done.\n");
288160662d10Schristos                 ERR_print_errors(bio_err);
288260662d10Schristos                 rsa_count = 1;
288360662d10Schristos             } else {
288460662d10Schristos                 pkey_print_message("sign", "ecdsa",
2885*1dcdf01fSchristos                                    ecdsa_c[testnum][0],
2886*1dcdf01fSchristos                                    test_curves[testnum].bits, seconds.ecdsa);
288760662d10Schristos                 Time_F(START);
2888*1dcdf01fSchristos                 count = run_benchmark(async_jobs, ECDSA_sign_loop, loopargs);
288960662d10Schristos                 d = Time_F(STOP);
289060662d10Schristos 
289160662d10Schristos                 BIO_printf(bio_err,
2892*1dcdf01fSchristos                            mr ? "+R5:%ld:%u:%.2f\n" :
2893*1dcdf01fSchristos                            "%ld %u bits ECDSA signs in %.2fs \n",
2894*1dcdf01fSchristos                            count, test_curves[testnum].bits, d);
2895*1dcdf01fSchristos                 ecdsa_results[testnum][0] = (double)count / d;
289660662d10Schristos                 rsa_count = count;
289760662d10Schristos             }
289860662d10Schristos 
289960662d10Schristos             /* Perform ECDSA verification test */
2900*1dcdf01fSchristos             for (i = 0; i < loopargs_len; i++) {
2901*1dcdf01fSchristos                 st = ECDSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
2902*1dcdf01fSchristos                                   loopargs[i].siglen,
2903*1dcdf01fSchristos                                   loopargs[i].ecdsa[testnum]);
2904*1dcdf01fSchristos                 if (st != 1)
2905*1dcdf01fSchristos                     break;
2906*1dcdf01fSchristos             }
2907*1dcdf01fSchristos             if (st != 1) {
290860662d10Schristos                 BIO_printf(bio_err,
290960662d10Schristos                            "ECDSA verify failure.  No ECDSA verify will be done.\n");
291060662d10Schristos                 ERR_print_errors(bio_err);
2911*1dcdf01fSchristos                 ecdsa_doit[testnum] = 0;
291260662d10Schristos             } else {
291360662d10Schristos                 pkey_print_message("verify", "ecdsa",
2914*1dcdf01fSchristos                                    ecdsa_c[testnum][1],
2915*1dcdf01fSchristos                                    test_curves[testnum].bits, seconds.ecdsa);
291660662d10Schristos                 Time_F(START);
2917*1dcdf01fSchristos                 count = run_benchmark(async_jobs, ECDSA_verify_loop, loopargs);
291860662d10Schristos                 d = Time_F(STOP);
291960662d10Schristos                 BIO_printf(bio_err,
2920*1dcdf01fSchristos                            mr ? "+R6:%ld:%u:%.2f\n"
2921*1dcdf01fSchristos                            : "%ld %u bits ECDSA verify in %.2fs\n",
2922*1dcdf01fSchristos                            count, test_curves[testnum].bits, d);
2923*1dcdf01fSchristos                 ecdsa_results[testnum][1] = (double)count / d;
292460662d10Schristos             }
292560662d10Schristos 
292660662d10Schristos             if (rsa_count <= 1) {
292760662d10Schristos                 /* if longer than 10s, don't do any more */
2928*1dcdf01fSchristos                 for (testnum++; testnum < ECDSA_NUM; testnum++)
2929*1dcdf01fSchristos                     ecdsa_doit[testnum] = 0;
293060662d10Schristos             }
293160662d10Schristos         }
293260662d10Schristos     }
293360662d10Schristos 
2934*1dcdf01fSchristos     for (testnum = 0; testnum < EC_NUM; testnum++) {
2935*1dcdf01fSchristos         int ecdh_checks = 1;
2936*1dcdf01fSchristos 
2937*1dcdf01fSchristos         if (!ecdh_doit[testnum])
293860662d10Schristos             continue;
2939*1dcdf01fSchristos 
2940*1dcdf01fSchristos         for (i = 0; i < loopargs_len; i++) {
2941*1dcdf01fSchristos             EVP_PKEY_CTX *kctx = NULL;
2942*1dcdf01fSchristos             EVP_PKEY_CTX *test_ctx = NULL;
2943*1dcdf01fSchristos             EVP_PKEY_CTX *ctx = NULL;
2944*1dcdf01fSchristos             EVP_PKEY *key_A = NULL;
2945*1dcdf01fSchristos             EVP_PKEY *key_B = NULL;
2946*1dcdf01fSchristos             size_t outlen;
2947*1dcdf01fSchristos             size_t test_outlen;
2948*1dcdf01fSchristos 
2949*1dcdf01fSchristos             /* Ensure that the error queue is empty */
2950*1dcdf01fSchristos             if (ERR_peek_error()) {
2951*1dcdf01fSchristos                 BIO_printf(bio_err,
2952*1dcdf01fSchristos                            "WARNING: the error queue contains previous unhandled errors.\n");
2953*1dcdf01fSchristos                 ERR_print_errors(bio_err);
2954*1dcdf01fSchristos             }
2955*1dcdf01fSchristos 
2956*1dcdf01fSchristos             /* Let's try to create a ctx directly from the NID: this works for
2957*1dcdf01fSchristos              * curves like Curve25519 that are not implemented through the low
2958*1dcdf01fSchristos              * level EC interface.
2959*1dcdf01fSchristos              * If this fails we try creating a EVP_PKEY_EC generic param ctx,
2960*1dcdf01fSchristos              * then we set the curve by NID before deriving the actual keygen
2961*1dcdf01fSchristos              * ctx for that specific curve. */
2962*1dcdf01fSchristos             kctx = EVP_PKEY_CTX_new_id(test_curves[testnum].nid, NULL); /* keygen ctx from NID */
2963*1dcdf01fSchristos             if (!kctx) {
2964*1dcdf01fSchristos                 EVP_PKEY_CTX *pctx = NULL;
2965*1dcdf01fSchristos                 EVP_PKEY *params = NULL;
2966*1dcdf01fSchristos 
2967*1dcdf01fSchristos                 /* If we reach this code EVP_PKEY_CTX_new_id() failed and a
2968*1dcdf01fSchristos                  * "int_ctx_new:unsupported algorithm" error was added to the
2969*1dcdf01fSchristos                  * error queue.
2970*1dcdf01fSchristos                  * We remove it from the error queue as we are handling it. */
2971*1dcdf01fSchristos                 unsigned long error = ERR_peek_error(); /* peek the latest error in the queue */
2972*1dcdf01fSchristos                 if (error == ERR_peek_last_error() && /* oldest and latest errors match */
2973*1dcdf01fSchristos                     /* check that the error origin matches */
2974*1dcdf01fSchristos                     ERR_GET_LIB(error) == ERR_LIB_EVP &&
2975*1dcdf01fSchristos                     ERR_GET_FUNC(error) == EVP_F_INT_CTX_NEW &&
2976*1dcdf01fSchristos                     ERR_GET_REASON(error) == EVP_R_UNSUPPORTED_ALGORITHM)
2977*1dcdf01fSchristos                     ERR_get_error(); /* pop error from queue */
2978*1dcdf01fSchristos                 if (ERR_peek_error()) {
2979*1dcdf01fSchristos                     BIO_printf(bio_err,
2980*1dcdf01fSchristos                                "Unhandled error in the error queue during ECDH init.\n");
298160662d10Schristos                     ERR_print_errors(bio_err);
298260662d10Schristos                     rsa_count = 1;
2983*1dcdf01fSchristos                     break;
2984*1dcdf01fSchristos                 }
2985*1dcdf01fSchristos 
2986*1dcdf01fSchristos                 if (            /* Create the context for parameter generation */
2987*1dcdf01fSchristos                        !(pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL)) ||
2988*1dcdf01fSchristos                        /* Initialise the parameter generation */
2989*1dcdf01fSchristos                        !EVP_PKEY_paramgen_init(pctx) ||
2990*1dcdf01fSchristos                        /* Set the curve by NID */
2991*1dcdf01fSchristos                        !EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx,
2992*1dcdf01fSchristos                                                                test_curves
2993*1dcdf01fSchristos                                                                [testnum].nid) ||
2994*1dcdf01fSchristos                        /* Create the parameter object params */
2995*1dcdf01fSchristos                        !EVP_PKEY_paramgen(pctx, &params)) {
2996*1dcdf01fSchristos                     ecdh_checks = 0;
2997*1dcdf01fSchristos                     BIO_printf(bio_err, "ECDH EC params init failure.\n");
2998*1dcdf01fSchristos                     ERR_print_errors(bio_err);
2999*1dcdf01fSchristos                     rsa_count = 1;
3000*1dcdf01fSchristos                     break;
3001*1dcdf01fSchristos                 }
3002*1dcdf01fSchristos                 /* Create the context for the key generation */
3003*1dcdf01fSchristos                 kctx = EVP_PKEY_CTX_new(params, NULL);
3004*1dcdf01fSchristos 
3005*1dcdf01fSchristos                 EVP_PKEY_free(params);
3006*1dcdf01fSchristos                 params = NULL;
3007*1dcdf01fSchristos                 EVP_PKEY_CTX_free(pctx);
3008*1dcdf01fSchristos                 pctx = NULL;
3009*1dcdf01fSchristos             }
3010*1dcdf01fSchristos             if (kctx == NULL ||      /* keygen ctx is not null */
3011*1dcdf01fSchristos                 EVP_PKEY_keygen_init(kctx) <= 0/* init keygen ctx */ ) {
3012*1dcdf01fSchristos                 ecdh_checks = 0;
3013*1dcdf01fSchristos                 BIO_printf(bio_err, "ECDH keygen failure.\n");
3014*1dcdf01fSchristos                 ERR_print_errors(bio_err);
3015*1dcdf01fSchristos                 rsa_count = 1;
3016*1dcdf01fSchristos                 break;
3017*1dcdf01fSchristos             }
3018*1dcdf01fSchristos 
3019*1dcdf01fSchristos             if (EVP_PKEY_keygen(kctx, &key_A) <= 0 || /* generate secret key A */
3020*1dcdf01fSchristos                 EVP_PKEY_keygen(kctx, &key_B) <= 0 || /* generate secret key B */
3021*1dcdf01fSchristos                 !(ctx = EVP_PKEY_CTX_new(key_A, NULL)) || /* derivation ctx from skeyA */
3022*1dcdf01fSchristos                 EVP_PKEY_derive_init(ctx) <= 0 || /* init derivation ctx */
3023*1dcdf01fSchristos                 EVP_PKEY_derive_set_peer(ctx, key_B) <= 0 || /* set peer pubkey in ctx */
3024*1dcdf01fSchristos                 EVP_PKEY_derive(ctx, NULL, &outlen) <= 0 || /* determine max length */
3025*1dcdf01fSchristos                 outlen == 0 ||  /* ensure outlen is a valid size */
3026*1dcdf01fSchristos                 outlen > MAX_ECDH_SIZE /* avoid buffer overflow */ ) {
3027*1dcdf01fSchristos                 ecdh_checks = 0;
302860662d10Schristos                 BIO_printf(bio_err, "ECDH key generation failure.\n");
302960662d10Schristos                 ERR_print_errors(bio_err);
303060662d10Schristos                 rsa_count = 1;
3031*1dcdf01fSchristos                 break;
303260662d10Schristos             }
303360662d10Schristos 
3034*1dcdf01fSchristos             /* Here we perform a test run, comparing the output of a*B and b*A;
3035*1dcdf01fSchristos              * we try this here and assume that further EVP_PKEY_derive calls
3036*1dcdf01fSchristos              * never fail, so we can skip checks in the actually benchmarked
3037*1dcdf01fSchristos              * code, for maximum performance. */
3038*1dcdf01fSchristos             if (!(test_ctx = EVP_PKEY_CTX_new(key_B, NULL)) || /* test ctx from skeyB */
3039*1dcdf01fSchristos                 !EVP_PKEY_derive_init(test_ctx) || /* init derivation test_ctx */
3040*1dcdf01fSchristos                 !EVP_PKEY_derive_set_peer(test_ctx, key_A) || /* set peer pubkey in test_ctx */
3041*1dcdf01fSchristos                 !EVP_PKEY_derive(test_ctx, NULL, &test_outlen) || /* determine max length */
3042*1dcdf01fSchristos                 !EVP_PKEY_derive(ctx, loopargs[i].secret_a, &outlen) || /* compute a*B */
3043*1dcdf01fSchristos                 !EVP_PKEY_derive(test_ctx, loopargs[i].secret_b, &test_outlen) || /* compute b*A */
3044*1dcdf01fSchristos                 test_outlen != outlen /* compare output length */ ) {
3045*1dcdf01fSchristos                 ecdh_checks = 0;
3046*1dcdf01fSchristos                 BIO_printf(bio_err, "ECDH computation failure.\n");
3047*1dcdf01fSchristos                 ERR_print_errors(bio_err);
3048*1dcdf01fSchristos                 rsa_count = 1;
3049*1dcdf01fSchristos                 break;
3050*1dcdf01fSchristos             }
3051*1dcdf01fSchristos 
3052*1dcdf01fSchristos             /* Compare the computation results: CRYPTO_memcmp() returns 0 if equal */
3053*1dcdf01fSchristos             if (CRYPTO_memcmp(loopargs[i].secret_a,
3054*1dcdf01fSchristos                               loopargs[i].secret_b, outlen)) {
3055*1dcdf01fSchristos                 ecdh_checks = 0;
305660662d10Schristos                 BIO_printf(bio_err, "ECDH computations don't match.\n");
305760662d10Schristos                 ERR_print_errors(bio_err);
305860662d10Schristos                 rsa_count = 1;
3059*1dcdf01fSchristos                 break;
306060662d10Schristos             }
306160662d10Schristos 
3062*1dcdf01fSchristos             loopargs[i].ecdh_ctx[testnum] = ctx;
3063*1dcdf01fSchristos             loopargs[i].outlen[testnum] = outlen;
3064*1dcdf01fSchristos 
3065*1dcdf01fSchristos             EVP_PKEY_free(key_A);
3066*1dcdf01fSchristos             EVP_PKEY_free(key_B);
3067*1dcdf01fSchristos             EVP_PKEY_CTX_free(kctx);
3068*1dcdf01fSchristos             kctx = NULL;
3069*1dcdf01fSchristos             EVP_PKEY_CTX_free(test_ctx);
3070*1dcdf01fSchristos             test_ctx = NULL;
307160662d10Schristos         }
3072*1dcdf01fSchristos         if (ecdh_checks != 0) {
3073*1dcdf01fSchristos             pkey_print_message("", "ecdh",
3074*1dcdf01fSchristos                                ecdh_c[testnum][0],
3075*1dcdf01fSchristos                                test_curves[testnum].bits, seconds.ecdh);
3076*1dcdf01fSchristos             Time_F(START);
3077*1dcdf01fSchristos             count =
3078*1dcdf01fSchristos                 run_benchmark(async_jobs, ECDH_EVP_derive_key_loop, loopargs);
307960662d10Schristos             d = Time_F(STOP);
308060662d10Schristos             BIO_printf(bio_err,
308160662d10Schristos                        mr ? "+R7:%ld:%d:%.2f\n" :
3082*1dcdf01fSchristos                        "%ld %u-bits ECDH ops in %.2fs\n", count,
3083*1dcdf01fSchristos                        test_curves[testnum].bits, d);
3084*1dcdf01fSchristos             ecdh_results[testnum][0] = (double)count / d;
308560662d10Schristos             rsa_count = count;
308660662d10Schristos         }
308760662d10Schristos 
308860662d10Schristos         if (rsa_count <= 1) {
308960662d10Schristos             /* if longer than 10s, don't do any more */
3090*1dcdf01fSchristos             for (testnum++; testnum < OSSL_NELEM(ecdh_doit); testnum++)
3091*1dcdf01fSchristos                 ecdh_doit[testnum] = 0;
309260662d10Schristos         }
309360662d10Schristos     }
3094*1dcdf01fSchristos 
3095*1dcdf01fSchristos     for (testnum = 0; testnum < EdDSA_NUM; testnum++) {
3096*1dcdf01fSchristos         int st = 1;
3097*1dcdf01fSchristos         EVP_PKEY *ed_pkey = NULL;
3098*1dcdf01fSchristos         EVP_PKEY_CTX *ed_pctx = NULL;
3099*1dcdf01fSchristos 
3100*1dcdf01fSchristos         if (!eddsa_doit[testnum])
3101*1dcdf01fSchristos             continue;           /* Ignore Curve */
3102*1dcdf01fSchristos         for (i = 0; i < loopargs_len; i++) {
3103*1dcdf01fSchristos             loopargs[i].eddsa_ctx[testnum] = EVP_MD_CTX_new();
3104*1dcdf01fSchristos             if (loopargs[i].eddsa_ctx[testnum] == NULL) {
3105*1dcdf01fSchristos                 st = 0;
3106*1dcdf01fSchristos                 break;
3107*1dcdf01fSchristos             }
3108*1dcdf01fSchristos 
3109*1dcdf01fSchristos             if ((ed_pctx = EVP_PKEY_CTX_new_id(test_ed_curves[testnum].nid, NULL))
3110*1dcdf01fSchristos                     == NULL
3111*1dcdf01fSchristos                 || EVP_PKEY_keygen_init(ed_pctx) <= 0
3112*1dcdf01fSchristos                 || EVP_PKEY_keygen(ed_pctx, &ed_pkey) <= 0) {
3113*1dcdf01fSchristos                 st = 0;
3114*1dcdf01fSchristos                 EVP_PKEY_CTX_free(ed_pctx);
3115*1dcdf01fSchristos                 break;
3116*1dcdf01fSchristos             }
3117*1dcdf01fSchristos             EVP_PKEY_CTX_free(ed_pctx);
3118*1dcdf01fSchristos 
3119*1dcdf01fSchristos             if (!EVP_DigestSignInit(loopargs[i].eddsa_ctx[testnum], NULL, NULL,
3120*1dcdf01fSchristos                                     NULL, ed_pkey)) {
3121*1dcdf01fSchristos                 st = 0;
3122*1dcdf01fSchristos                 EVP_PKEY_free(ed_pkey);
3123*1dcdf01fSchristos                 break;
3124*1dcdf01fSchristos             }
3125*1dcdf01fSchristos             EVP_PKEY_free(ed_pkey);
3126*1dcdf01fSchristos         }
3127*1dcdf01fSchristos         if (st == 0) {
3128*1dcdf01fSchristos             BIO_printf(bio_err, "EdDSA failure.\n");
3129*1dcdf01fSchristos             ERR_print_errors(bio_err);
3130*1dcdf01fSchristos             rsa_count = 1;
3131*1dcdf01fSchristos         } else {
3132*1dcdf01fSchristos             for (i = 0; i < loopargs_len; i++) {
3133*1dcdf01fSchristos                 /* Perform EdDSA signature test */
3134*1dcdf01fSchristos                 loopargs[i].sigsize = test_ed_curves[testnum].sigsize;
3135*1dcdf01fSchristos                 st = EVP_DigestSign(loopargs[i].eddsa_ctx[testnum],
3136*1dcdf01fSchristos                                     loopargs[i].buf2, &loopargs[i].sigsize,
3137*1dcdf01fSchristos                                     loopargs[i].buf, 20);
3138*1dcdf01fSchristos                 if (st == 0)
3139*1dcdf01fSchristos                     break;
3140*1dcdf01fSchristos             }
3141*1dcdf01fSchristos             if (st == 0) {
3142*1dcdf01fSchristos                 BIO_printf(bio_err,
3143*1dcdf01fSchristos                            "EdDSA sign failure.  No EdDSA sign will be done.\n");
3144*1dcdf01fSchristos                 ERR_print_errors(bio_err);
3145*1dcdf01fSchristos                 rsa_count = 1;
3146*1dcdf01fSchristos             } else {
3147*1dcdf01fSchristos                 pkey_print_message("sign", test_ed_curves[testnum].name,
3148*1dcdf01fSchristos                                    eddsa_c[testnum][0],
3149*1dcdf01fSchristos                                    test_ed_curves[testnum].bits, seconds.eddsa);
3150*1dcdf01fSchristos                 Time_F(START);
3151*1dcdf01fSchristos                 count = run_benchmark(async_jobs, EdDSA_sign_loop, loopargs);
3152*1dcdf01fSchristos                 d = Time_F(STOP);
3153*1dcdf01fSchristos 
3154*1dcdf01fSchristos                 BIO_printf(bio_err,
3155*1dcdf01fSchristos                            mr ? "+R8:%ld:%u:%s:%.2f\n" :
3156*1dcdf01fSchristos                            "%ld %u bits %s signs in %.2fs \n",
3157*1dcdf01fSchristos                            count, test_ed_curves[testnum].bits,
3158*1dcdf01fSchristos                            test_ed_curves[testnum].name, d);
3159*1dcdf01fSchristos                 eddsa_results[testnum][0] = (double)count / d;
3160*1dcdf01fSchristos                 rsa_count = count;
3161*1dcdf01fSchristos             }
3162*1dcdf01fSchristos 
3163*1dcdf01fSchristos             /* Perform EdDSA verification test */
3164*1dcdf01fSchristos             for (i = 0; i < loopargs_len; i++) {
3165*1dcdf01fSchristos                 st = EVP_DigestVerify(loopargs[i].eddsa_ctx[testnum],
3166*1dcdf01fSchristos                                       loopargs[i].buf2, loopargs[i].sigsize,
3167*1dcdf01fSchristos                                       loopargs[i].buf, 20);
3168*1dcdf01fSchristos                 if (st != 1)
3169*1dcdf01fSchristos                     break;
3170*1dcdf01fSchristos             }
3171*1dcdf01fSchristos             if (st != 1) {
3172*1dcdf01fSchristos                 BIO_printf(bio_err,
3173*1dcdf01fSchristos                            "EdDSA verify failure.  No EdDSA verify will be done.\n");
3174*1dcdf01fSchristos                 ERR_print_errors(bio_err);
3175*1dcdf01fSchristos                 eddsa_doit[testnum] = 0;
3176*1dcdf01fSchristos             } else {
3177*1dcdf01fSchristos                 pkey_print_message("verify", test_ed_curves[testnum].name,
3178*1dcdf01fSchristos                                    eddsa_c[testnum][1],
3179*1dcdf01fSchristos                                    test_ed_curves[testnum].bits, seconds.eddsa);
3180*1dcdf01fSchristos                 Time_F(START);
3181*1dcdf01fSchristos                 count = run_benchmark(async_jobs, EdDSA_verify_loop, loopargs);
3182*1dcdf01fSchristos                 d = Time_F(STOP);
3183*1dcdf01fSchristos                 BIO_printf(bio_err,
3184*1dcdf01fSchristos                            mr ? "+R9:%ld:%u:%s:%.2f\n"
3185*1dcdf01fSchristos                            : "%ld %u bits %s verify in %.2fs\n",
3186*1dcdf01fSchristos                            count, test_ed_curves[testnum].bits,
3187*1dcdf01fSchristos                            test_ed_curves[testnum].name, d);
3188*1dcdf01fSchristos                 eddsa_results[testnum][1] = (double)count / d;
3189*1dcdf01fSchristos             }
3190*1dcdf01fSchristos 
3191*1dcdf01fSchristos             if (rsa_count <= 1) {
3192*1dcdf01fSchristos                 /* if longer than 10s, don't do any more */
3193*1dcdf01fSchristos                 for (testnum++; testnum < EdDSA_NUM; testnum++)
3194*1dcdf01fSchristos                     eddsa_doit[testnum] = 0;
3195*1dcdf01fSchristos             }
3196*1dcdf01fSchristos         }
3197*1dcdf01fSchristos     }
3198*1dcdf01fSchristos 
3199*1dcdf01fSchristos #endif                          /* OPENSSL_NO_EC */
320060662d10Schristos #ifndef NO_FORK
320160662d10Schristos  show_res:
320260662d10Schristos #endif
320360662d10Schristos     if (!mr) {
3204*1dcdf01fSchristos         printf("%s\n", OpenSSL_version(OPENSSL_VERSION));
3205*1dcdf01fSchristos         printf("%s\n", OpenSSL_version(OPENSSL_BUILT_ON));
320660662d10Schristos         printf("options:");
320760662d10Schristos         printf("%s ", BN_options());
320860662d10Schristos #ifndef OPENSSL_NO_MD2
320960662d10Schristos         printf("%s ", MD2_options());
321060662d10Schristos #endif
321160662d10Schristos #ifndef OPENSSL_NO_RC4
321260662d10Schristos         printf("%s ", RC4_options());
321360662d10Schristos #endif
321460662d10Schristos #ifndef OPENSSL_NO_DES
321560662d10Schristos         printf("%s ", DES_options());
321660662d10Schristos #endif
321760662d10Schristos         printf("%s ", AES_options());
321860662d10Schristos #ifndef OPENSSL_NO_IDEA
3219*1dcdf01fSchristos         printf("%s ", IDEA_options());
322060662d10Schristos #endif
322160662d10Schristos #ifndef OPENSSL_NO_BF
322260662d10Schristos         printf("%s ", BF_options());
322360662d10Schristos #endif
3224*1dcdf01fSchristos         printf("\n%s\n", OpenSSL_version(OPENSSL_CFLAGS));
322560662d10Schristos     }
322660662d10Schristos 
322760662d10Schristos     if (pr_header) {
322860662d10Schristos         if (mr)
3229*1dcdf01fSchristos             printf("+H");
323060662d10Schristos         else {
3231*1dcdf01fSchristos             printf
3232*1dcdf01fSchristos                 ("The 'numbers' are in 1000s of bytes per second processed.\n");
3233*1dcdf01fSchristos             printf("type        ");
323460662d10Schristos         }
3235*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++)
3236*1dcdf01fSchristos             printf(mr ? ":%d" : "%7d bytes", lengths[testnum]);
3237*1dcdf01fSchristos         printf("\n");
323860662d10Schristos     }
323960662d10Schristos 
324060662d10Schristos     for (k = 0; k < ALGOR_NUM; k++) {
324160662d10Schristos         if (!doit[k])
324260662d10Schristos             continue;
324360662d10Schristos         if (mr)
3244*1dcdf01fSchristos             printf("+F:%u:%s", k, names[k]);
324560662d10Schristos         else
3246*1dcdf01fSchristos             printf("%-13s", names[k]);
3247*1dcdf01fSchristos         for (testnum = 0; testnum < size_num; testnum++) {
3248*1dcdf01fSchristos             if (results[k][testnum] > 10000 && !mr)
3249*1dcdf01fSchristos                 printf(" %11.2fk", results[k][testnum] / 1e3);
325060662d10Schristos             else
3251*1dcdf01fSchristos                 printf(mr ? ":%.2f" : " %11.2f ", results[k][testnum]);
325260662d10Schristos         }
3253*1dcdf01fSchristos         printf("\n");
325460662d10Schristos     }
325560662d10Schristos #ifndef OPENSSL_NO_RSA
3256*1dcdf01fSchristos     testnum = 1;
325760662d10Schristos     for (k = 0; k < RSA_NUM; k++) {
325860662d10Schristos         if (!rsa_doit[k])
325960662d10Schristos             continue;
3260*1dcdf01fSchristos         if (testnum && !mr) {
326160662d10Schristos             printf("%18ssign    verify    sign/s verify/s\n", " ");
3262*1dcdf01fSchristos             testnum = 0;
326360662d10Schristos         }
326460662d10Schristos         if (mr)
3265*1dcdf01fSchristos             printf("+F2:%u:%u:%f:%f\n",
326660662d10Schristos                    k, rsa_bits[k], rsa_results[k][0], rsa_results[k][1]);
326760662d10Schristos         else
3268*1dcdf01fSchristos             printf("rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
3269*1dcdf01fSchristos                    rsa_bits[k], 1.0 / rsa_results[k][0], 1.0 / rsa_results[k][1],
3270*1dcdf01fSchristos                    rsa_results[k][0], rsa_results[k][1]);
327160662d10Schristos     }
327260662d10Schristos #endif
327360662d10Schristos #ifndef OPENSSL_NO_DSA
3274*1dcdf01fSchristos     testnum = 1;
327560662d10Schristos     for (k = 0; k < DSA_NUM; k++) {
327660662d10Schristos         if (!dsa_doit[k])
327760662d10Schristos             continue;
3278*1dcdf01fSchristos         if (testnum && !mr) {
327960662d10Schristos             printf("%18ssign    verify    sign/s verify/s\n", " ");
3280*1dcdf01fSchristos             testnum = 0;
328160662d10Schristos         }
328260662d10Schristos         if (mr)
3283*1dcdf01fSchristos             printf("+F3:%u:%u:%f:%f\n",
328460662d10Schristos                    k, dsa_bits[k], dsa_results[k][0], dsa_results[k][1]);
328560662d10Schristos         else
3286*1dcdf01fSchristos             printf("dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
3287*1dcdf01fSchristos                    dsa_bits[k], 1.0 / dsa_results[k][0], 1.0 / dsa_results[k][1],
3288*1dcdf01fSchristos                    dsa_results[k][0], dsa_results[k][1]);
328960662d10Schristos     }
329060662d10Schristos #endif
3291*1dcdf01fSchristos #ifndef OPENSSL_NO_EC
3292*1dcdf01fSchristos     testnum = 1;
3293*1dcdf01fSchristos     for (k = 0; k < OSSL_NELEM(ecdsa_doit); k++) {
329460662d10Schristos         if (!ecdsa_doit[k])
329560662d10Schristos             continue;
3296*1dcdf01fSchristos         if (testnum && !mr) {
329760662d10Schristos             printf("%30ssign    verify    sign/s verify/s\n", " ");
3298*1dcdf01fSchristos             testnum = 0;
329960662d10Schristos         }
330060662d10Schristos 
330160662d10Schristos         if (mr)
3302*1dcdf01fSchristos             printf("+F4:%u:%u:%f:%f\n",
3303*1dcdf01fSchristos                    k, test_curves[k].bits,
330460662d10Schristos                    ecdsa_results[k][0], ecdsa_results[k][1]);
330560662d10Schristos         else
3306*1dcdf01fSchristos             printf("%4u bits ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
3307*1dcdf01fSchristos                    test_curves[k].bits, test_curves[k].name,
3308*1dcdf01fSchristos                    1.0 / ecdsa_results[k][0], 1.0 / ecdsa_results[k][1],
3309*1dcdf01fSchristos                    ecdsa_results[k][0], ecdsa_results[k][1]);
331060662d10Schristos     }
331160662d10Schristos 
3312*1dcdf01fSchristos     testnum = 1;
331360662d10Schristos     for (k = 0; k < EC_NUM; k++) {
331460662d10Schristos         if (!ecdh_doit[k])
331560662d10Schristos             continue;
3316*1dcdf01fSchristos         if (testnum && !mr) {
331760662d10Schristos             printf("%30sop      op/s\n", " ");
3318*1dcdf01fSchristos             testnum = 0;
331960662d10Schristos         }
332060662d10Schristos         if (mr)
3321*1dcdf01fSchristos             printf("+F5:%u:%u:%f:%f\n",
3322*1dcdf01fSchristos                    k, test_curves[k].bits,
332360662d10Schristos                    ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
332460662d10Schristos 
332560662d10Schristos         else
3326*1dcdf01fSchristos             printf("%4u bits ecdh (%s) %8.4fs %8.1f\n",
3327*1dcdf01fSchristos                    test_curves[k].bits, test_curves[k].name,
3328*1dcdf01fSchristos                    1.0 / ecdh_results[k][0], ecdh_results[k][0]);
3329*1dcdf01fSchristos     }
3330*1dcdf01fSchristos 
3331*1dcdf01fSchristos     testnum = 1;
3332*1dcdf01fSchristos     for (k = 0; k < OSSL_NELEM(eddsa_doit); k++) {
3333*1dcdf01fSchristos         if (!eddsa_doit[k])
3334*1dcdf01fSchristos             continue;
3335*1dcdf01fSchristos         if (testnum && !mr) {
3336*1dcdf01fSchristos             printf("%30ssign    verify    sign/s verify/s\n", " ");
3337*1dcdf01fSchristos             testnum = 0;
3338*1dcdf01fSchristos         }
3339*1dcdf01fSchristos 
3340*1dcdf01fSchristos         if (mr)
3341*1dcdf01fSchristos             printf("+F6:%u:%u:%s:%f:%f\n",
3342*1dcdf01fSchristos                    k, test_ed_curves[k].bits, test_ed_curves[k].name,
3343*1dcdf01fSchristos                    eddsa_results[k][0], eddsa_results[k][1]);
3344*1dcdf01fSchristos         else
3345*1dcdf01fSchristos             printf("%4u bits EdDSA (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
3346*1dcdf01fSchristos                    test_ed_curves[k].bits, test_ed_curves[k].name,
3347*1dcdf01fSchristos                    1.0 / eddsa_results[k][0], 1.0 / eddsa_results[k][1],
3348*1dcdf01fSchristos                    eddsa_results[k][0], eddsa_results[k][1]);
334960662d10Schristos     }
335060662d10Schristos #endif
335160662d10Schristos 
3352*1dcdf01fSchristos     ret = 0;
335360662d10Schristos 
335460662d10Schristos  end:
335560662d10Schristos     ERR_print_errors(bio_err);
3356*1dcdf01fSchristos     for (i = 0; i < loopargs_len; i++) {
3357*1dcdf01fSchristos         OPENSSL_free(loopargs[i].buf_malloc);
3358*1dcdf01fSchristos         OPENSSL_free(loopargs[i].buf2_malloc);
3359*1dcdf01fSchristos 
336060662d10Schristos #ifndef OPENSSL_NO_RSA
3361*1dcdf01fSchristos         for (k = 0; k < RSA_NUM; k++)
3362*1dcdf01fSchristos             RSA_free(loopargs[i].rsa_key[k]);
336360662d10Schristos #endif
336460662d10Schristos #ifndef OPENSSL_NO_DSA
3365*1dcdf01fSchristos         for (k = 0; k < DSA_NUM; k++)
3366*1dcdf01fSchristos             DSA_free(loopargs[i].dsa_key[k]);
336760662d10Schristos #endif
3368*1dcdf01fSchristos #ifndef OPENSSL_NO_EC
3369*1dcdf01fSchristos         for (k = 0; k < ECDSA_NUM; k++)
3370*1dcdf01fSchristos             EC_KEY_free(loopargs[i].ecdsa[k]);
3371*1dcdf01fSchristos         for (k = 0; k < EC_NUM; k++)
3372*1dcdf01fSchristos             EVP_PKEY_CTX_free(loopargs[i].ecdh_ctx[k]);
3373*1dcdf01fSchristos         for (k = 0; k < EdDSA_NUM; k++)
3374*1dcdf01fSchristos             EVP_MD_CTX_free(loopargs[i].eddsa_ctx[k]);
3375*1dcdf01fSchristos         OPENSSL_free(loopargs[i].secret_a);
3376*1dcdf01fSchristos         OPENSSL_free(loopargs[i].secret_b);
337760662d10Schristos #endif
337860662d10Schristos     }
337960662d10Schristos 
3380*1dcdf01fSchristos     if (async_jobs > 0) {
3381*1dcdf01fSchristos         for (i = 0; i < loopargs_len; i++)
3382*1dcdf01fSchristos             ASYNC_WAIT_CTX_free(loopargs[i].wait_ctx);
3383*1dcdf01fSchristos     }
3384*1dcdf01fSchristos 
3385*1dcdf01fSchristos     if (async_init) {
3386*1dcdf01fSchristos         ASYNC_cleanup_thread();
3387*1dcdf01fSchristos     }
3388*1dcdf01fSchristos     OPENSSL_free(loopargs);
338960662d10Schristos     release_engine(e);
3390*1dcdf01fSchristos     return ret;
339160662d10Schristos }
339260662d10Schristos 
print_message(const char * s,long num,int length,int tm)3393*1dcdf01fSchristos static void print_message(const char *s, long num, int length, int tm)
339460662d10Schristos {
339560662d10Schristos #ifdef SIGALRM
339660662d10Schristos     BIO_printf(bio_err,
339760662d10Schristos                mr ? "+DT:%s:%d:%d\n"
3398*1dcdf01fSchristos                : "Doing %s for %ds on %d size blocks: ", s, tm, length);
339960662d10Schristos     (void)BIO_flush(bio_err);
3400*1dcdf01fSchristos     run = 1;
3401*1dcdf01fSchristos     alarm(tm);
340260662d10Schristos #else
340360662d10Schristos     BIO_printf(bio_err,
340460662d10Schristos                mr ? "+DN:%s:%ld:%d\n"
340560662d10Schristos                : "Doing %s %ld times on %d size blocks: ", s, num, length);
340660662d10Schristos     (void)BIO_flush(bio_err);
340760662d10Schristos #endif
340860662d10Schristos }
340960662d10Schristos 
pkey_print_message(const char * str,const char * str2,long num,unsigned int bits,int tm)341060662d10Schristos static void pkey_print_message(const char *str, const char *str2, long num,
3411*1dcdf01fSchristos                                unsigned int bits, int tm)
341260662d10Schristos {
341360662d10Schristos #ifdef SIGALRM
341460662d10Schristos     BIO_printf(bio_err,
341560662d10Schristos                mr ? "+DTP:%d:%s:%s:%d\n"
3416*1dcdf01fSchristos                : "Doing %u bits %s %s's for %ds: ", bits, str, str2, tm);
341760662d10Schristos     (void)BIO_flush(bio_err);
3418*1dcdf01fSchristos     run = 1;
341960662d10Schristos     alarm(tm);
342060662d10Schristos #else
342160662d10Schristos     BIO_printf(bio_err,
342260662d10Schristos                mr ? "+DNP:%ld:%d:%s:%s\n"
3423*1dcdf01fSchristos                : "Doing %ld %u bits %s %s's: ", num, bits, str, str2);
342460662d10Schristos     (void)BIO_flush(bio_err);
342560662d10Schristos #endif
342660662d10Schristos }
342760662d10Schristos 
print_result(int alg,int run_no,int count,double time_used)342860662d10Schristos static void print_result(int alg, int run_no, int count, double time_used)
342960662d10Schristos {
3430*1dcdf01fSchristos     if (count == -1) {
3431*1dcdf01fSchristos         BIO_puts(bio_err, "EVP error!\n");
3432*1dcdf01fSchristos         exit(1);
3433*1dcdf01fSchristos     }
343460662d10Schristos     BIO_printf(bio_err,
343560662d10Schristos                mr ? "+R:%d:%s:%f\n"
343660662d10Schristos                : "%d %s's in %.2fs\n", count, names[alg], time_used);
343760662d10Schristos     results[alg][run_no] = ((double)count) / time_used * lengths[run_no];
343860662d10Schristos }
343960662d10Schristos 
344060662d10Schristos #ifndef NO_FORK
sstrsep(char ** string,const char * delim)344160662d10Schristos static char *sstrsep(char **string, const char *delim)
344260662d10Schristos {
344360662d10Schristos     char isdelim[256];
344460662d10Schristos     char *token = *string;
344560662d10Schristos 
344660662d10Schristos     if (**string == 0)
344760662d10Schristos         return NULL;
344860662d10Schristos 
3449*1dcdf01fSchristos     memset(isdelim, 0, sizeof(isdelim));
345060662d10Schristos     isdelim[0] = 1;
345160662d10Schristos 
345260662d10Schristos     while (*delim) {
345360662d10Schristos         isdelim[(unsigned char)(*delim)] = 1;
345460662d10Schristos         delim++;
345560662d10Schristos     }
345660662d10Schristos 
345760662d10Schristos     while (!isdelim[(unsigned char)(**string)]) {
345860662d10Schristos         (*string)++;
345960662d10Schristos     }
346060662d10Schristos 
346160662d10Schristos     if (**string) {
346260662d10Schristos         **string = 0;
346360662d10Schristos         (*string)++;
346460662d10Schristos     }
346560662d10Schristos 
346660662d10Schristos     return token;
346760662d10Schristos }
346860662d10Schristos 
do_multi(int multi,int size_num)3469*1dcdf01fSchristos static int do_multi(int multi, int size_num)
347060662d10Schristos {
347160662d10Schristos     int n;
347260662d10Schristos     int fd[2];
347360662d10Schristos     int *fds;
347460662d10Schristos     static char sep[] = ":";
347560662d10Schristos 
3476*1dcdf01fSchristos     fds = app_malloc(sizeof(*fds) * multi, "fd buffer for do_multi");
347760662d10Schristos     for (n = 0; n < multi; ++n) {
347860662d10Schristos         if (pipe(fd) == -1) {
3479*1dcdf01fSchristos             BIO_printf(bio_err, "pipe failure\n");
348060662d10Schristos             exit(1);
348160662d10Schristos         }
348260662d10Schristos         fflush(stdout);
3483*1dcdf01fSchristos         (void)BIO_flush(bio_err);
348460662d10Schristos         if (fork()) {
348560662d10Schristos             close(fd[1]);
348660662d10Schristos             fds[n] = fd[0];
348760662d10Schristos         } else {
348860662d10Schristos             close(fd[0]);
348960662d10Schristos             close(1);
349060662d10Schristos             if (dup(fd[1]) == -1) {
3491*1dcdf01fSchristos                 BIO_printf(bio_err, "dup failed\n");
349260662d10Schristos                 exit(1);
349360662d10Schristos             }
349460662d10Schristos             close(fd[1]);
349560662d10Schristos             mr = 1;
349660662d10Schristos             usertime = 0;
3497*1dcdf01fSchristos             OPENSSL_free(fds);
349860662d10Schristos             return 0;
349960662d10Schristos         }
350060662d10Schristos         printf("Forked child %d\n", n);
350160662d10Schristos     }
350260662d10Schristos 
350360662d10Schristos     /* for now, assume the pipe is long enough to take all the output */
350460662d10Schristos     for (n = 0; n < multi; ++n) {
350560662d10Schristos         FILE *f;
350660662d10Schristos         char buf[1024];
350760662d10Schristos         char *p;
350860662d10Schristos 
350960662d10Schristos         f = fdopen(fds[n], "r");
3510*1dcdf01fSchristos         while (fgets(buf, sizeof(buf), f)) {
351160662d10Schristos             p = strchr(buf, '\n');
351260662d10Schristos             if (p)
351360662d10Schristos                 *p = '\0';
351460662d10Schristos             if (buf[0] != '+') {
3515*1dcdf01fSchristos                 BIO_printf(bio_err,
3516*1dcdf01fSchristos                            "Don't understand line '%s' from child %d\n", buf,
3517*1dcdf01fSchristos                            n);
351860662d10Schristos                 continue;
351960662d10Schristos             }
352060662d10Schristos             printf("Got: %s from %d\n", buf, n);
3521*1dcdf01fSchristos             if (strncmp(buf, "+F:", 3) == 0) {
352260662d10Schristos                 int alg;
352360662d10Schristos                 int j;
352460662d10Schristos 
352560662d10Schristos                 p = buf + 3;
352660662d10Schristos                 alg = atoi(sstrsep(&p, sep));
352760662d10Schristos                 sstrsep(&p, sep);
3528*1dcdf01fSchristos                 for (j = 0; j < size_num; ++j)
352960662d10Schristos                     results[alg][j] += atof(sstrsep(&p, sep));
3530*1dcdf01fSchristos             } else if (strncmp(buf, "+F2:", 4) == 0) {
353160662d10Schristos                 int k;
353260662d10Schristos                 double d;
353360662d10Schristos 
353460662d10Schristos                 p = buf + 4;
353560662d10Schristos                 k = atoi(sstrsep(&p, sep));
353660662d10Schristos                 sstrsep(&p, sep);
353760662d10Schristos 
353860662d10Schristos                 d = atof(sstrsep(&p, sep));
3539*1dcdf01fSchristos                 rsa_results[k][0] += d;
354060662d10Schristos 
354160662d10Schristos                 d = atof(sstrsep(&p, sep));
3542*1dcdf01fSchristos                 rsa_results[k][1] += d;
354360662d10Schristos             }
354460662d10Schristos # ifndef OPENSSL_NO_DSA
3545*1dcdf01fSchristos             else if (strncmp(buf, "+F3:", 4) == 0) {
354660662d10Schristos                 int k;
354760662d10Schristos                 double d;
354860662d10Schristos 
354960662d10Schristos                 p = buf + 4;
355060662d10Schristos                 k = atoi(sstrsep(&p, sep));
355160662d10Schristos                 sstrsep(&p, sep);
355260662d10Schristos 
355360662d10Schristos                 d = atof(sstrsep(&p, sep));
3554*1dcdf01fSchristos                 dsa_results[k][0] += d;
355560662d10Schristos 
355660662d10Schristos                 d = atof(sstrsep(&p, sep));
3557*1dcdf01fSchristos                 dsa_results[k][1] += d;
355860662d10Schristos             }
355960662d10Schristos # endif
3560*1dcdf01fSchristos # ifndef OPENSSL_NO_EC
3561*1dcdf01fSchristos             else if (strncmp(buf, "+F4:", 4) == 0) {
356260662d10Schristos                 int k;
356360662d10Schristos                 double d;
356460662d10Schristos 
356560662d10Schristos                 p = buf + 4;
356660662d10Schristos                 k = atoi(sstrsep(&p, sep));
356760662d10Schristos                 sstrsep(&p, sep);
356860662d10Schristos 
356960662d10Schristos                 d = atof(sstrsep(&p, sep));
3570*1dcdf01fSchristos                 ecdsa_results[k][0] += d;
357160662d10Schristos 
357260662d10Schristos                 d = atof(sstrsep(&p, sep));
3573*1dcdf01fSchristos                 ecdsa_results[k][1] += d;
3574*1dcdf01fSchristos             } else if (strncmp(buf, "+F5:", 4) == 0) {
357560662d10Schristos                 int k;
357660662d10Schristos                 double d;
357760662d10Schristos 
357860662d10Schristos                 p = buf + 4;
357960662d10Schristos                 k = atoi(sstrsep(&p, sep));
358060662d10Schristos                 sstrsep(&p, sep);
358160662d10Schristos 
358260662d10Schristos                 d = atof(sstrsep(&p, sep));
3583*1dcdf01fSchristos                 ecdh_results[k][0] += d;
3584*1dcdf01fSchristos             } else if (strncmp(buf, "+F6:", 4) == 0) {
3585*1dcdf01fSchristos                 int k;
3586*1dcdf01fSchristos                 double d;
358760662d10Schristos 
3588*1dcdf01fSchristos                 p = buf + 4;
3589*1dcdf01fSchristos                 k = atoi(sstrsep(&p, sep));
3590*1dcdf01fSchristos                 sstrsep(&p, sep);
3591*1dcdf01fSchristos                 sstrsep(&p, sep);
3592*1dcdf01fSchristos 
3593*1dcdf01fSchristos                 d = atof(sstrsep(&p, sep));
3594*1dcdf01fSchristos                 eddsa_results[k][0] += d;
3595*1dcdf01fSchristos 
3596*1dcdf01fSchristos                 d = atof(sstrsep(&p, sep));
3597*1dcdf01fSchristos                 eddsa_results[k][1] += d;
359860662d10Schristos             }
359960662d10Schristos # endif
360060662d10Schristos 
3601*1dcdf01fSchristos             else if (strncmp(buf, "+H:", 3) == 0) {
3602*1dcdf01fSchristos                 ;
360360662d10Schristos             } else
3604*1dcdf01fSchristos                 BIO_printf(bio_err, "Unknown type '%s' from child %d\n", buf,
3605*1dcdf01fSchristos                            n);
360660662d10Schristos         }
360760662d10Schristos 
360860662d10Schristos         fclose(f);
360960662d10Schristos     }
3610*1dcdf01fSchristos     OPENSSL_free(fds);
361160662d10Schristos     return 1;
361260662d10Schristos }
361360662d10Schristos #endif
361460662d10Schristos 
multiblock_speed(const EVP_CIPHER * evp_cipher,int lengths_single,const openssl_speed_sec_t * seconds)3615*1dcdf01fSchristos static void multiblock_speed(const EVP_CIPHER *evp_cipher, int lengths_single,
3616*1dcdf01fSchristos                              const openssl_speed_sec_t *seconds)
361760662d10Schristos {
3618*1dcdf01fSchristos     static const int mblengths_list[] =
361960662d10Schristos         { 8 * 1024, 2 * 8 * 1024, 4 * 8 * 1024, 8 * 8 * 1024, 8 * 16 * 1024 };
3620*1dcdf01fSchristos     const int *mblengths = mblengths_list;
3621*1dcdf01fSchristos     int j, count, keylen, num = OSSL_NELEM(mblengths_list);
362260662d10Schristos     const char *alg_name;
3623*1dcdf01fSchristos     unsigned char *inp, *out, *key, no_key[32], no_iv[16];
3624*1dcdf01fSchristos     EVP_CIPHER_CTX *ctx;
362560662d10Schristos     double d = 0.0;
362660662d10Schristos 
3627*1dcdf01fSchristos     if (lengths_single) {
3628*1dcdf01fSchristos         mblengths = &lengths_single;
3629*1dcdf01fSchristos         num = 1;
363060662d10Schristos     }
363160662d10Schristos 
3632*1dcdf01fSchristos     inp = app_malloc(mblengths[num - 1], "multiblock input buffer");
3633*1dcdf01fSchristos     out = app_malloc(mblengths[num - 1] + 1024, "multiblock output buffer");
3634*1dcdf01fSchristos     ctx = EVP_CIPHER_CTX_new();
3635*1dcdf01fSchristos     EVP_EncryptInit_ex(ctx, evp_cipher, NULL, NULL, no_iv);
363660662d10Schristos 
3637*1dcdf01fSchristos     keylen = EVP_CIPHER_CTX_key_length(ctx);
3638*1dcdf01fSchristos     key = app_malloc(keylen, "evp_cipher key");
3639*1dcdf01fSchristos     EVP_CIPHER_CTX_rand_key(ctx, key);
3640*1dcdf01fSchristos     EVP_EncryptInit_ex(ctx, NULL, NULL, key, NULL);
3641*1dcdf01fSchristos     OPENSSL_clear_free(key, keylen);
3642*1dcdf01fSchristos 
3643*1dcdf01fSchristos     EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_MAC_KEY, sizeof(no_key), no_key);
3644*1dcdf01fSchristos     alg_name = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
364560662d10Schristos 
364660662d10Schristos     for (j = 0; j < num; j++) {
3647*1dcdf01fSchristos         print_message(alg_name, 0, mblengths[j], seconds->sym);
364860662d10Schristos         Time_F(START);
3649*1dcdf01fSchristos         for (count = 0; run && count < 0x7fffffff; count++) {
365060662d10Schristos             unsigned char aad[EVP_AEAD_TLS1_AAD_LEN];
365160662d10Schristos             EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM mb_param;
365260662d10Schristos             size_t len = mblengths[j];
365360662d10Schristos             int packlen;
365460662d10Schristos 
365560662d10Schristos             memset(aad, 0, 8);  /* avoid uninitialized values */
365660662d10Schristos             aad[8] = 23;        /* SSL3_RT_APPLICATION_DATA */
365760662d10Schristos             aad[9] = 3;         /* version */
365860662d10Schristos             aad[10] = 2;
365960662d10Schristos             aad[11] = 0;        /* length */
366060662d10Schristos             aad[12] = 0;
366160662d10Schristos             mb_param.out = NULL;
366260662d10Schristos             mb_param.inp = aad;
366360662d10Schristos             mb_param.len = len;
366460662d10Schristos             mb_param.interleave = 8;
366560662d10Schristos 
3666*1dcdf01fSchristos             packlen = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_AAD,
366760662d10Schristos                                           sizeof(mb_param), &mb_param);
366860662d10Schristos 
366960662d10Schristos             if (packlen > 0) {
367060662d10Schristos                 mb_param.out = out;
367160662d10Schristos                 mb_param.inp = inp;
367260662d10Schristos                 mb_param.len = len;
3673*1dcdf01fSchristos                 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT,
367460662d10Schristos                                     sizeof(mb_param), &mb_param);
367560662d10Schristos             } else {
367660662d10Schristos                 int pad;
367760662d10Schristos 
367860662d10Schristos                 RAND_bytes(out, 16);
367960662d10Schristos                 len += 16;
3680*1dcdf01fSchristos                 aad[11] = (unsigned char)(len >> 8);
3681*1dcdf01fSchristos                 aad[12] = (unsigned char)(len);
3682*1dcdf01fSchristos                 pad = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_TLS1_AAD,
368360662d10Schristos                                           EVP_AEAD_TLS1_AAD_LEN, aad);
3684*1dcdf01fSchristos                 EVP_Cipher(ctx, out, inp, len + pad);
368560662d10Schristos             }
368660662d10Schristos         }
368760662d10Schristos         d = Time_F(STOP);
3688*1dcdf01fSchristos         BIO_printf(bio_err, mr ? "+R:%d:%s:%f\n"
368960662d10Schristos                    : "%d %s's in %.2fs\n", count, "evp", d);
369060662d10Schristos         results[D_EVP][j] = ((double)count) / d * mblengths[j];
369160662d10Schristos     }
369260662d10Schristos 
369360662d10Schristos     if (mr) {
369460662d10Schristos         fprintf(stdout, "+H");
369560662d10Schristos         for (j = 0; j < num; j++)
369660662d10Schristos             fprintf(stdout, ":%d", mblengths[j]);
369760662d10Schristos         fprintf(stdout, "\n");
369860662d10Schristos         fprintf(stdout, "+F:%d:%s", D_EVP, alg_name);
369960662d10Schristos         for (j = 0; j < num; j++)
370060662d10Schristos             fprintf(stdout, ":%.2f", results[D_EVP][j]);
370160662d10Schristos         fprintf(stdout, "\n");
370260662d10Schristos     } else {
370360662d10Schristos         fprintf(stdout,
370460662d10Schristos                 "The 'numbers' are in 1000s of bytes per second processed.\n");
370560662d10Schristos         fprintf(stdout, "type                    ");
370660662d10Schristos         for (j = 0; j < num; j++)
370760662d10Schristos             fprintf(stdout, "%7d bytes", mblengths[j]);
370860662d10Schristos         fprintf(stdout, "\n");
370960662d10Schristos         fprintf(stdout, "%-24s", alg_name);
371060662d10Schristos 
371160662d10Schristos         for (j = 0; j < num; j++) {
371260662d10Schristos             if (results[D_EVP][j] > 10000)
371360662d10Schristos                 fprintf(stdout, " %11.2fk", results[D_EVP][j] / 1e3);
371460662d10Schristos             else
371560662d10Schristos                 fprintf(stdout, " %11.2f ", results[D_EVP][j]);
371660662d10Schristos         }
371760662d10Schristos         fprintf(stdout, "\n");
371860662d10Schristos     }
371960662d10Schristos 
372060662d10Schristos     OPENSSL_free(inp);
372160662d10Schristos     OPENSSL_free(out);
3722*1dcdf01fSchristos     EVP_CIPHER_CTX_free(ctx);
372360662d10Schristos }
3724