VirtualBox

source: vbox/trunk/src/libs/openssl-1.1.1l/apps/speed.c@ 95024

Last change on this file since 95024 was 91772, checked in by vboxsync, 3 years ago

openssl-1.1.1l: Applied and adjusted our OpenSSL changes to 1.1.1l. bugref:10126

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

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette