2 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
3 * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
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
13 #define RSA_SECONDS 10
14 #define DSA_SECONDS 10
15 #define ECDSA_SECONDS 10
16 #define ECDH_SECONDS 10
24 #include <openssl/crypto.h>
25 #include <openssl/rand.h>
26 #include <openssl/err.h>
27 #include <openssl/evp.h>
28 #include <openssl/objects.h>
29 #include <openssl/async.h>
30 #if !defined(OPENSSL_SYS_MSDOS)
31 # include OPENSSL_UNISTD
38 #include <openssl/bn.h>
39 #ifndef OPENSSL_NO_DES
40 # include <openssl/des.h>
42 #include <openssl/aes.h>
43 #ifndef OPENSSL_NO_CAMELLIA
44 # include <openssl/camellia.h>
46 #ifndef OPENSSL_NO_MD2
47 # include <openssl/md2.h>
49 #ifndef OPENSSL_NO_MDC2
50 # include <openssl/mdc2.h>
52 #ifndef OPENSSL_NO_MD4
53 # include <openssl/md4.h>
55 #ifndef OPENSSL_NO_MD5
56 # include <openssl/md5.h>
58 #include <openssl/hmac.h>
59 #include <openssl/sha.h>
60 #ifndef OPENSSL_NO_RMD160
61 # include <openssl/ripemd.h>
63 #ifndef OPENSSL_NO_WHIRLPOOL
64 # include <openssl/whrlpool.h>
66 #ifndef OPENSSL_NO_RC4
67 # include <openssl/rc4.h>
69 #ifndef OPENSSL_NO_RC5
70 # include <openssl/rc5.h>
72 #ifndef OPENSSL_NO_RC2
73 # include <openssl/rc2.h>
75 #ifndef OPENSSL_NO_IDEA
76 # include <openssl/idea.h>
78 #ifndef OPENSSL_NO_SEED
79 # include <openssl/seed.h>
82 # include <openssl/blowfish.h>
84 #ifndef OPENSSL_NO_CAST
85 # include <openssl/cast.h>
87 #ifndef OPENSSL_NO_RSA
88 # include <openssl/rsa.h>
89 # include "./testrsa.h"
91 #include <openssl/x509.h>
92 #ifndef OPENSSL_NO_DSA
93 # include <openssl/dsa.h>
94 # include "./testdsa.h"
97 # include <openssl/ec.h>
99 #include <openssl/modes.h>
102 # if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS)
115 #define MAX_MISALIGNMENT 63
116 #define MAX_ECDH_SIZE 256
119 typedef struct openssl_speed_sec_st {
125 } openssl_speed_sec_t;
127 static volatile int run = 0;
130 static int usertime = 1;
132 #ifndef OPENSSL_NO_MD2
133 static int EVP_Digest_MD2_loop(void *args);
136 #ifndef OPENSSL_NO_MDC2
137 static int EVP_Digest_MDC2_loop(void *args);
139 #ifndef OPENSSL_NO_MD4
140 static int EVP_Digest_MD4_loop(void *args);
142 #ifndef OPENSSL_NO_MD5
143 static int MD5_loop(void *args);
144 static int HMAC_loop(void *args);
146 static int SHA1_loop(void *args);
147 static int SHA256_loop(void *args);
148 static int SHA512_loop(void *args);
149 #ifndef OPENSSL_NO_WHIRLPOOL
150 static int WHIRLPOOL_loop(void *args);
152 #ifndef OPENSSL_NO_RMD160
153 static int EVP_Digest_RMD160_loop(void *args);
155 #ifndef OPENSSL_NO_RC4
156 static int RC4_loop(void *args);
158 #ifndef OPENSSL_NO_DES
159 static int DES_ncbc_encrypt_loop(void *args);
160 static int DES_ede3_cbc_encrypt_loop(void *args);
162 static int AES_cbc_128_encrypt_loop(void *args);
163 static int AES_cbc_192_encrypt_loop(void *args);
164 static int AES_ige_128_encrypt_loop(void *args);
165 static int AES_cbc_256_encrypt_loop(void *args);
166 static int AES_ige_192_encrypt_loop(void *args);
167 static int AES_ige_256_encrypt_loop(void *args);
168 static int CRYPTO_gcm128_aad_loop(void *args);
169 static int RAND_bytes_loop(void *args);
170 static int EVP_Update_loop(void *args);
171 static int EVP_Update_loop_ccm(void *args);
172 static int EVP_Digest_loop(void *args);
173 #ifndef OPENSSL_NO_RSA
174 static int RSA_sign_loop(void *args);
175 static int RSA_verify_loop(void *args);
177 #ifndef OPENSSL_NO_DSA
178 static int DSA_sign_loop(void *args);
179 static int DSA_verify_loop(void *args);
181 #ifndef OPENSSL_NO_EC
182 static int ECDSA_sign_loop(void *args);
183 static int ECDSA_verify_loop(void *args);
186 static double Time_F(int s);
187 static void print_message(const char *s, long num, int length, int tm);
188 static void pkey_print_message(const char *str, const char *str2,
189 long num, unsigned int bits, int sec);
190 static void print_result(int alg, int run_no, int count, double time_used);
192 static int do_multi(int multi, int size_num);
195 static const int lengths_list[] = {
196 16, 64, 256, 1024, 8 * 1024, 16 * 1024
198 static const int *lengths = lengths_list;
201 # if defined(__STDC__) || defined(sgi) || defined(_AIX)
202 # define SIGRETTYPE void
204 # define SIGRETTYPE int
207 static SIGRETTYPE sig_done(int sig);
208 static SIGRETTYPE sig_done(int sig)
210 signal(SIGALRM, sig_done);
220 # if !defined(SIGALRM)
223 static unsigned int lapse;
224 static volatile unsigned int schlock;
225 static void alarm_win32(unsigned int secs)
230 # define alarm alarm_win32
232 static DWORD WINAPI sleepy(VOID * arg)
240 static double Time_F(int s)
247 thr = CreateThread(NULL, 4096, sleepy, NULL, 0, NULL);
249 DWORD err = GetLastError();
250 BIO_printf(bio_err, "unable to CreateThread (%lu)", err);
254 Sleep(0); /* scheduler spinlock */
255 ret = app_tminterval(s, usertime);
257 ret = app_tminterval(s, usertime);
259 TerminateThread(thr, 0);
267 static double Time_F(int s)
269 double ret = app_tminterval(s, usertime);
276 static void multiblock_speed(const EVP_CIPHER *evp_cipher, int lengths_single,
277 const openssl_speed_sec_t *seconds);
279 #define found(value, pairs, result)\
280 opt_found(value, result, pairs, OSSL_NELEM(pairs))
281 static int opt_found(const char *name, unsigned int *result,
282 const OPT_PAIR pairs[], unsigned int nbelem)
286 for (idx = 0; idx < nbelem; ++idx, pairs++)
287 if (strcmp(name, pairs->name) == 0) {
288 *result = pairs->retval;
294 typedef enum OPTION_choice {
295 OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
296 OPT_ELAPSED, OPT_EVP, OPT_DECRYPT, OPT_ENGINE, OPT_MULTI,
297 OPT_MR, OPT_MB, OPT_MISALIGN, OPT_ASYNCJOBS, OPT_R_ENUM,
298 OPT_PRIMES, OPT_SECONDS, OPT_BYTES
301 const OPTIONS speed_options[] = {
302 {OPT_HELP_STR, 1, '-', "Usage: %s [options] ciphers...\n"},
303 {OPT_HELP_STR, 1, '-', "Valid options are:\n"},
304 {"help", OPT_HELP, '-', "Display this summary"},
305 {"evp", OPT_EVP, 's', "Use specified EVP cipher"},
306 {"decrypt", OPT_DECRYPT, '-',
307 "Time decryption instead of encryption (only EVP)"},
308 {"mr", OPT_MR, '-', "Produce machine readable output"},
310 "Enable (tls1.1) multi-block mode on evp_cipher requested with -evp"},
311 {"misalign", OPT_MISALIGN, 'n', "Amount to mis-align buffers"},
312 {"elapsed", OPT_ELAPSED, '-',
313 "Measure time in real time instead of CPU user time"},
315 {"multi", OPT_MULTI, 'p', "Run benchmarks in parallel"},
317 #ifndef OPENSSL_NO_ASYNC
318 {"async_jobs", OPT_ASYNCJOBS, 'p',
319 "Enable async mode and start pnum jobs"},
322 #ifndef OPENSSL_NO_ENGINE
323 {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
325 {"primes", OPT_PRIMES, 'p', "Specify number of primes (for RSA only)"},
326 {"seconds", OPT_SECONDS, 'p',
327 "Run benchmarks for pnum seconds"},
328 {"bytes", OPT_BYTES, 'p',
329 "Run cipher, digest and rand benchmarks on pnum bytes"},
343 #define D_CBC_IDEA 10
344 #define D_CBC_SEED 11
348 #define D_CBC_CAST 15
349 #define D_CBC_128_AES 16
350 #define D_CBC_192_AES 17
351 #define D_CBC_256_AES 18
352 #define D_CBC_128_CML 19
353 #define D_CBC_192_CML 20
354 #define D_CBC_256_CML 21
358 #define D_WHIRLPOOL 25
359 #define D_IGE_128_AES 26
360 #define D_IGE_192_AES 27
361 #define D_IGE_256_AES 28
364 /* name of algorithms to test */
365 static const char *names[] = {
366 "md2", "mdc2", "md4", "md5", "hmac(md5)", "sha1", "rmd160", "rc4",
367 "des cbc", "des ede3", "idea cbc", "seed cbc",
368 "rc2 cbc", "rc5-32/12 cbc", "blowfish cbc", "cast cbc",
369 "aes-128 cbc", "aes-192 cbc", "aes-256 cbc",
370 "camellia-128 cbc", "camellia-192 cbc", "camellia-256 cbc",
371 "evp", "sha256", "sha512", "whirlpool",
372 "aes-128 ige", "aes-192 ige", "aes-256 ige", "ghash",
375 #define ALGOR_NUM OSSL_NELEM(names)
377 /* list of configured algorithm (remaining) */
378 static const OPT_PAIR doit_choices[] = {
379 #ifndef OPENSSL_NO_MD2
382 #ifndef OPENSSL_NO_MDC2
385 #ifndef OPENSSL_NO_MD4
388 #ifndef OPENSSL_NO_MD5
393 {"sha256", D_SHA256},
394 {"sha512", D_SHA512},
395 #ifndef OPENSSL_NO_WHIRLPOOL
396 {"whirlpool", D_WHIRLPOOL},
398 #ifndef OPENSSL_NO_RMD160
399 {"ripemd", D_RMD160},
400 {"rmd160", D_RMD160},
401 {"ripemd160", D_RMD160},
403 #ifndef OPENSSL_NO_RC4
406 #ifndef OPENSSL_NO_DES
407 {"des-cbc", D_CBC_DES},
408 {"des-ede3", D_EDE3_DES},
410 {"aes-128-cbc", D_CBC_128_AES},
411 {"aes-192-cbc", D_CBC_192_AES},
412 {"aes-256-cbc", D_CBC_256_AES},
413 {"aes-128-ige", D_IGE_128_AES},
414 {"aes-192-ige", D_IGE_192_AES},
415 {"aes-256-ige", D_IGE_256_AES},
416 #ifndef OPENSSL_NO_RC2
417 {"rc2-cbc", D_CBC_RC2},
420 #ifndef OPENSSL_NO_RC5
421 {"rc5-cbc", D_CBC_RC5},
424 #ifndef OPENSSL_NO_IDEA
425 {"idea-cbc", D_CBC_IDEA},
426 {"idea", D_CBC_IDEA},
428 #ifndef OPENSSL_NO_SEED
429 {"seed-cbc", D_CBC_SEED},
430 {"seed", D_CBC_SEED},
432 #ifndef OPENSSL_NO_BF
433 {"bf-cbc", D_CBC_BF},
434 {"blowfish", D_CBC_BF},
437 #ifndef OPENSSL_NO_CAST
438 {"cast-cbc", D_CBC_CAST},
439 {"cast", D_CBC_CAST},
440 {"cast5", D_CBC_CAST},
446 static double results[ALGOR_NUM][OSSL_NELEM(lengths_list)];
448 #ifndef OPENSSL_NO_DSA
450 # define R_DSA_1024 1
451 # define R_DSA_2048 2
452 static const OPT_PAIR dsa_choices[] = {
453 {"dsa512", R_DSA_512},
454 {"dsa1024", R_DSA_1024},
455 {"dsa2048", R_DSA_2048}
457 # define DSA_NUM OSSL_NELEM(dsa_choices)
459 static double dsa_results[DSA_NUM][2]; /* 2 ops: sign then verify */
460 #endif /* OPENSSL_NO_DSA */
468 #define R_RSA_15360 6
469 #ifndef OPENSSL_NO_RSA
470 static const OPT_PAIR rsa_choices[] = {
471 {"rsa512", R_RSA_512},
472 {"rsa1024", R_RSA_1024},
473 {"rsa2048", R_RSA_2048},
474 {"rsa3072", R_RSA_3072},
475 {"rsa4096", R_RSA_4096},
476 {"rsa7680", R_RSA_7680},
477 {"rsa15360", R_RSA_15360}
479 # define RSA_NUM OSSL_NELEM(rsa_choices)
481 static double rsa_results[RSA_NUM][2]; /* 2 ops: sign then verify */
482 #endif /* OPENSSL_NO_RSA */
500 #define R_EC_X25519 16
502 #ifndef OPENSSL_NO_EC
503 static OPT_PAIR ecdsa_choices[] = {
504 {"ecdsap160", R_EC_P160},
505 {"ecdsap192", R_EC_P192},
506 {"ecdsap224", R_EC_P224},
507 {"ecdsap256", R_EC_P256},
508 {"ecdsap384", R_EC_P384},
509 {"ecdsap521", R_EC_P521},
510 {"ecdsak163", R_EC_K163},
511 {"ecdsak233", R_EC_K233},
512 {"ecdsak283", R_EC_K283},
513 {"ecdsak409", R_EC_K409},
514 {"ecdsak571", R_EC_K571},
515 {"ecdsab163", R_EC_B163},
516 {"ecdsab233", R_EC_B233},
517 {"ecdsab283", R_EC_B283},
518 {"ecdsab409", R_EC_B409},
519 {"ecdsab571", R_EC_B571}
521 # define ECDSA_NUM OSSL_NELEM(ecdsa_choices)
523 static double ecdsa_results[ECDSA_NUM][2]; /* 2 ops: sign then verify */
525 static const OPT_PAIR ecdh_choices[] = {
526 {"ecdhp160", R_EC_P160},
527 {"ecdhp192", R_EC_P192},
528 {"ecdhp224", R_EC_P224},
529 {"ecdhp256", R_EC_P256},
530 {"ecdhp384", R_EC_P384},
531 {"ecdhp521", R_EC_P521},
532 {"ecdhk163", R_EC_K163},
533 {"ecdhk233", R_EC_K233},
534 {"ecdhk283", R_EC_K283},
535 {"ecdhk409", R_EC_K409},
536 {"ecdhk571", R_EC_K571},
537 {"ecdhb163", R_EC_B163},
538 {"ecdhb233", R_EC_B233},
539 {"ecdhb283", R_EC_B283},
540 {"ecdhb409", R_EC_B409},
541 {"ecdhb571", R_EC_B571},
542 {"ecdhx25519", R_EC_X25519},
543 {"ecdhx448", R_EC_X448}
545 # define EC_NUM OSSL_NELEM(ecdh_choices)
547 static double ecdh_results[EC_NUM][1]; /* 1 op: derivation */
548 #endif /* OPENSSL_NO_EC */
551 # define COND(d) (count < (d))
552 # define COUNT(d) (d)
554 # define COND(unused_cond) (run && count<0x7fffffff)
555 # define COUNT(d) (count)
558 typedef struct loopargs_st {
559 ASYNC_JOB *inprogress_job;
560 ASYNC_WAIT_CTX *wait_ctx;
563 unsigned char *buf_malloc;
564 unsigned char *buf2_malloc;
567 #ifndef OPENSSL_NO_RSA
568 RSA *rsa_key[RSA_NUM];
570 #ifndef OPENSSL_NO_DSA
571 DSA *dsa_key[DSA_NUM];
573 #ifndef OPENSSL_NO_EC
574 EC_KEY *ecdsa[ECDSA_NUM];
575 EVP_PKEY_CTX *ecdh_ctx[EC_NUM];
576 unsigned char *secret_a;
577 unsigned char *secret_b;
578 size_t outlen[EC_NUM];
582 GCM128_CONTEXT *gcm_ctx;
584 static int run_benchmark(int async_jobs, int (*loop_function) (void *),
585 loopargs_t * loopargs);
587 static unsigned int testnum;
589 /* Nb of iterations to do per algorithm and key-size */
590 static long c[ALGOR_NUM][OSSL_NELEM(lengths_list)];
592 #ifndef OPENSSL_NO_MD2
593 static int EVP_Digest_MD2_loop(void *args)
595 loopargs_t *tempargs = *(loopargs_t **) args;
596 unsigned char *buf = tempargs->buf;
597 unsigned char md2[MD2_DIGEST_LENGTH];
600 for (count = 0; COND(c[D_MD2][testnum]); count++) {
601 if (!EVP_Digest(buf, (size_t)lengths[testnum], md2, NULL, EVP_md2(),
609 #ifndef OPENSSL_NO_MDC2
610 static int EVP_Digest_MDC2_loop(void *args)
612 loopargs_t *tempargs = *(loopargs_t **) args;
613 unsigned char *buf = tempargs->buf;
614 unsigned char mdc2[MDC2_DIGEST_LENGTH];
617 for (count = 0; COND(c[D_MDC2][testnum]); count++) {
618 if (!EVP_Digest(buf, (size_t)lengths[testnum], mdc2, NULL, EVP_mdc2(),
626 #ifndef OPENSSL_NO_MD4
627 static int EVP_Digest_MD4_loop(void *args)
629 loopargs_t *tempargs = *(loopargs_t **) args;
630 unsigned char *buf = tempargs->buf;
631 unsigned char md4[MD4_DIGEST_LENGTH];
634 for (count = 0; COND(c[D_MD4][testnum]); count++) {
635 if (!EVP_Digest(buf, (size_t)lengths[testnum], md4, NULL, EVP_md4(),
643 #ifndef OPENSSL_NO_MD5
644 static int MD5_loop(void *args)
646 loopargs_t *tempargs = *(loopargs_t **) args;
647 unsigned char *buf = tempargs->buf;
648 unsigned char md5[MD5_DIGEST_LENGTH];
650 for (count = 0; COND(c[D_MD5][testnum]); count++)
651 MD5(buf, lengths[testnum], md5);
655 static int HMAC_loop(void *args)
657 loopargs_t *tempargs = *(loopargs_t **) args;
658 unsigned char *buf = tempargs->buf;
659 HMAC_CTX *hctx = tempargs->hctx;
660 unsigned char hmac[MD5_DIGEST_LENGTH];
663 for (count = 0; COND(c[D_HMAC][testnum]); count++) {
664 HMAC_Init_ex(hctx, NULL, 0, NULL, NULL);
665 HMAC_Update(hctx, buf, lengths[testnum]);
666 HMAC_Final(hctx, hmac, NULL);
672 static int SHA1_loop(void *args)
674 loopargs_t *tempargs = *(loopargs_t **) args;
675 unsigned char *buf = tempargs->buf;
676 unsigned char sha[SHA_DIGEST_LENGTH];
678 for (count = 0; COND(c[D_SHA1][testnum]); count++)
679 SHA1(buf, lengths[testnum], sha);
683 static int SHA256_loop(void *args)
685 loopargs_t *tempargs = *(loopargs_t **) args;
686 unsigned char *buf = tempargs->buf;
687 unsigned char sha256[SHA256_DIGEST_LENGTH];
689 for (count = 0; COND(c[D_SHA256][testnum]); count++)
690 SHA256(buf, lengths[testnum], sha256);
694 static int SHA512_loop(void *args)
696 loopargs_t *tempargs = *(loopargs_t **) args;
697 unsigned char *buf = tempargs->buf;
698 unsigned char sha512[SHA512_DIGEST_LENGTH];
700 for (count = 0; COND(c[D_SHA512][testnum]); count++)
701 SHA512(buf, lengths[testnum], sha512);
705 #ifndef OPENSSL_NO_WHIRLPOOL
706 static int WHIRLPOOL_loop(void *args)
708 loopargs_t *tempargs = *(loopargs_t **) args;
709 unsigned char *buf = tempargs->buf;
710 unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
712 for (count = 0; COND(c[D_WHIRLPOOL][testnum]); count++)
713 WHIRLPOOL(buf, lengths[testnum], whirlpool);
718 #ifndef OPENSSL_NO_RMD160
719 static int EVP_Digest_RMD160_loop(void *args)
721 loopargs_t *tempargs = *(loopargs_t **) args;
722 unsigned char *buf = tempargs->buf;
723 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
725 for (count = 0; COND(c[D_RMD160][testnum]); count++) {
726 if (!EVP_Digest(buf, (size_t)lengths[testnum], &(rmd160[0]),
727 NULL, EVP_ripemd160(), NULL))
734 #ifndef OPENSSL_NO_RC4
735 static RC4_KEY rc4_ks;
736 static int RC4_loop(void *args)
738 loopargs_t *tempargs = *(loopargs_t **) args;
739 unsigned char *buf = tempargs->buf;
741 for (count = 0; COND(c[D_RC4][testnum]); count++)
742 RC4(&rc4_ks, (size_t)lengths[testnum], buf, buf);
747 #ifndef OPENSSL_NO_DES
748 static unsigned char DES_iv[8];
749 static DES_key_schedule sch;
750 static DES_key_schedule sch2;
751 static DES_key_schedule sch3;
752 static int DES_ncbc_encrypt_loop(void *args)
754 loopargs_t *tempargs = *(loopargs_t **) args;
755 unsigned char *buf = tempargs->buf;
757 for (count = 0; COND(c[D_CBC_DES][testnum]); count++)
758 DES_ncbc_encrypt(buf, buf, lengths[testnum], &sch,
759 &DES_iv, DES_ENCRYPT);
763 static int DES_ede3_cbc_encrypt_loop(void *args)
765 loopargs_t *tempargs = *(loopargs_t **) args;
766 unsigned char *buf = tempargs->buf;
768 for (count = 0; COND(c[D_EDE3_DES][testnum]); count++)
769 DES_ede3_cbc_encrypt(buf, buf, lengths[testnum],
770 &sch, &sch2, &sch3, &DES_iv, DES_ENCRYPT);
775 #define MAX_BLOCK_SIZE 128
777 static unsigned char iv[2 * MAX_BLOCK_SIZE / 8];
778 static AES_KEY aes_ks1, aes_ks2, aes_ks3;
779 static int AES_cbc_128_encrypt_loop(void *args)
781 loopargs_t *tempargs = *(loopargs_t **) args;
782 unsigned char *buf = tempargs->buf;
784 for (count = 0; COND(c[D_CBC_128_AES][testnum]); count++)
785 AES_cbc_encrypt(buf, buf,
786 (size_t)lengths[testnum], &aes_ks1, iv, AES_ENCRYPT);
790 static int AES_cbc_192_encrypt_loop(void *args)
792 loopargs_t *tempargs = *(loopargs_t **) args;
793 unsigned char *buf = tempargs->buf;
795 for (count = 0; COND(c[D_CBC_192_AES][testnum]); count++)
796 AES_cbc_encrypt(buf, buf,
797 (size_t)lengths[testnum], &aes_ks2, iv, AES_ENCRYPT);
801 static int AES_cbc_256_encrypt_loop(void *args)
803 loopargs_t *tempargs = *(loopargs_t **) args;
804 unsigned char *buf = tempargs->buf;
806 for (count = 0; COND(c[D_CBC_256_AES][testnum]); count++)
807 AES_cbc_encrypt(buf, buf,
808 (size_t)lengths[testnum], &aes_ks3, iv, AES_ENCRYPT);
812 static int AES_ige_128_encrypt_loop(void *args)
814 loopargs_t *tempargs = *(loopargs_t **) args;
815 unsigned char *buf = tempargs->buf;
816 unsigned char *buf2 = tempargs->buf2;
818 for (count = 0; COND(c[D_IGE_128_AES][testnum]); count++)
819 AES_ige_encrypt(buf, buf2,
820 (size_t)lengths[testnum], &aes_ks1, iv, AES_ENCRYPT);
824 static int AES_ige_192_encrypt_loop(void *args)
826 loopargs_t *tempargs = *(loopargs_t **) args;
827 unsigned char *buf = tempargs->buf;
828 unsigned char *buf2 = tempargs->buf2;
830 for (count = 0; COND(c[D_IGE_192_AES][testnum]); count++)
831 AES_ige_encrypt(buf, buf2,
832 (size_t)lengths[testnum], &aes_ks2, iv, AES_ENCRYPT);
836 static int AES_ige_256_encrypt_loop(void *args)
838 loopargs_t *tempargs = *(loopargs_t **) args;
839 unsigned char *buf = tempargs->buf;
840 unsigned char *buf2 = tempargs->buf2;
842 for (count = 0; COND(c[D_IGE_256_AES][testnum]); count++)
843 AES_ige_encrypt(buf, buf2,
844 (size_t)lengths[testnum], &aes_ks3, iv, AES_ENCRYPT);
848 static int CRYPTO_gcm128_aad_loop(void *args)
850 loopargs_t *tempargs = *(loopargs_t **) args;
851 unsigned char *buf = tempargs->buf;
852 GCM128_CONTEXT *gcm_ctx = tempargs->gcm_ctx;
854 for (count = 0; COND(c[D_GHASH][testnum]); count++)
855 CRYPTO_gcm128_aad(gcm_ctx, buf, lengths[testnum]);
859 static int RAND_bytes_loop(void *args)
861 loopargs_t *tempargs = *(loopargs_t **) args;
862 unsigned char *buf = tempargs->buf;
865 for (count = 0; COND(c[D_RAND][testnum]); count++)
866 RAND_bytes(buf, lengths[testnum]);
870 static long save_count = 0;
871 static int decrypt = 0;
872 static int EVP_Update_loop(void *args)
874 loopargs_t *tempargs = *(loopargs_t **) args;
875 unsigned char *buf = tempargs->buf;
876 EVP_CIPHER_CTX *ctx = tempargs->ctx;
879 int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
882 for (count = 0; COND(nb_iter); count++) {
883 rc = EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
885 EVP_CipherInit_ex(ctx, NULL, NULL, NULL, iv, -1);
888 for (count = 0; COND(nb_iter); count++) {
889 rc = EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
891 EVP_CipherInit_ex(ctx, NULL, NULL, NULL, iv, -1);
895 EVP_DecryptFinal_ex(ctx, buf, &outl);
897 EVP_EncryptFinal_ex(ctx, buf, &outl);
901 * CCM does not support streaming. For the purpose of performance measurement,
902 * each message is encrypted using the same (key,iv)-pair. Do not use this
903 * code in your application.
905 static int EVP_Update_loop_ccm(void *args)
907 loopargs_t *tempargs = *(loopargs_t **) args;
908 unsigned char *buf = tempargs->buf;
909 EVP_CIPHER_CTX *ctx = tempargs->ctx;
911 unsigned char tag[12];
913 int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
916 for (count = 0; COND(nb_iter); count++) {
917 EVP_DecryptInit_ex(ctx, NULL, NULL, NULL, iv);
918 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, sizeof(tag), tag);
919 EVP_DecryptUpdate(ctx, NULL, &outl, NULL, lengths[testnum]);
920 EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
921 EVP_DecryptFinal_ex(ctx, buf, &outl);
924 for (count = 0; COND(nb_iter); count++) {
925 EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, iv);
926 EVP_EncryptUpdate(ctx, NULL, &outl, NULL, lengths[testnum]);
927 EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
928 EVP_EncryptFinal_ex(ctx, buf, &outl);
934 static const EVP_MD *evp_md = NULL;
935 static int EVP_Digest_loop(void *args)
937 loopargs_t *tempargs = *(loopargs_t **) args;
938 unsigned char *buf = tempargs->buf;
939 unsigned char md[EVP_MAX_MD_SIZE];
942 int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
945 for (count = 0; COND(nb_iter); count++) {
946 if (!EVP_Digest(buf, lengths[testnum], md, NULL, evp_md, NULL))
952 #ifndef OPENSSL_NO_RSA
953 static long rsa_c[RSA_NUM][2]; /* # RSA iteration test */
955 static int RSA_sign_loop(void *args)
957 loopargs_t *tempargs = *(loopargs_t **) args;
958 unsigned char *buf = tempargs->buf;
959 unsigned char *buf2 = tempargs->buf2;
960 unsigned int *rsa_num = &tempargs->siglen;
961 RSA **rsa_key = tempargs->rsa_key;
963 for (count = 0; COND(rsa_c[testnum][0]); count++) {
964 ret = RSA_sign(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
966 BIO_printf(bio_err, "RSA sign failure\n");
967 ERR_print_errors(bio_err);
975 static int RSA_verify_loop(void *args)
977 loopargs_t *tempargs = *(loopargs_t **) args;
978 unsigned char *buf = tempargs->buf;
979 unsigned char *buf2 = tempargs->buf2;
980 unsigned int rsa_num = tempargs->siglen;
981 RSA **rsa_key = tempargs->rsa_key;
983 for (count = 0; COND(rsa_c[testnum][1]); count++) {
985 RSA_verify(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
987 BIO_printf(bio_err, "RSA verify failure\n");
988 ERR_print_errors(bio_err);
997 #ifndef OPENSSL_NO_DSA
998 static long dsa_c[DSA_NUM][2];
999 static int DSA_sign_loop(void *args)
1001 loopargs_t *tempargs = *(loopargs_t **) args;
1002 unsigned char *buf = tempargs->buf;
1003 unsigned char *buf2 = tempargs->buf2;
1004 DSA **dsa_key = tempargs->dsa_key;
1005 unsigned int *siglen = &tempargs->siglen;
1007 for (count = 0; COND(dsa_c[testnum][0]); count++) {
1008 ret = DSA_sign(0, buf, 20, buf2, siglen, dsa_key[testnum]);
1010 BIO_printf(bio_err, "DSA sign failure\n");
1011 ERR_print_errors(bio_err);
1019 static int DSA_verify_loop(void *args)
1021 loopargs_t *tempargs = *(loopargs_t **) args;
1022 unsigned char *buf = tempargs->buf;
1023 unsigned char *buf2 = tempargs->buf2;
1024 DSA **dsa_key = tempargs->dsa_key;
1025 unsigned int siglen = tempargs->siglen;
1027 for (count = 0; COND(dsa_c[testnum][1]); count++) {
1028 ret = DSA_verify(0, buf, 20, buf2, siglen, dsa_key[testnum]);
1030 BIO_printf(bio_err, "DSA verify failure\n");
1031 ERR_print_errors(bio_err);
1040 #ifndef OPENSSL_NO_EC
1041 static long ecdsa_c[ECDSA_NUM][2];
1042 static int ECDSA_sign_loop(void *args)
1044 loopargs_t *tempargs = *(loopargs_t **) args;
1045 unsigned char *buf = tempargs->buf;
1046 EC_KEY **ecdsa = tempargs->ecdsa;
1047 unsigned char *ecdsasig = tempargs->buf2;
1048 unsigned int *ecdsasiglen = &tempargs->siglen;
1050 for (count = 0; COND(ecdsa_c[testnum][0]); count++) {
1051 ret = ECDSA_sign(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[testnum]);
1053 BIO_printf(bio_err, "ECDSA sign failure\n");
1054 ERR_print_errors(bio_err);
1062 static int ECDSA_verify_loop(void *args)
1064 loopargs_t *tempargs = *(loopargs_t **) args;
1065 unsigned char *buf = tempargs->buf;
1066 EC_KEY **ecdsa = tempargs->ecdsa;
1067 unsigned char *ecdsasig = tempargs->buf2;
1068 unsigned int ecdsasiglen = tempargs->siglen;
1070 for (count = 0; COND(ecdsa_c[testnum][1]); count++) {
1071 ret = ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[testnum]);
1073 BIO_printf(bio_err, "ECDSA verify failure\n");
1074 ERR_print_errors(bio_err);
1082 /* ******************************************************************** */
1083 static long ecdh_c[EC_NUM][1];
1085 static int ECDH_EVP_derive_key_loop(void *args)
1087 loopargs_t *tempargs = *(loopargs_t **) args;
1088 EVP_PKEY_CTX *ctx = tempargs->ecdh_ctx[testnum];
1089 unsigned char *derived_secret = tempargs->secret_a;
1091 size_t *outlen = &(tempargs->outlen[testnum]);
1093 for (count = 0; COND(ecdh_c[testnum][0]); count++)
1094 EVP_PKEY_derive(ctx, derived_secret, outlen);
1099 #endif /* OPENSSL_NO_EC */
1101 static int run_benchmark(int async_jobs,
1102 int (*loop_function) (void *), loopargs_t * loopargs)
1104 int job_op_count = 0;
1105 int total_op_count = 0;
1106 int num_inprogress = 0;
1107 int error = 0, i = 0, ret = 0;
1108 OSSL_ASYNC_FD job_fd = 0;
1109 size_t num_job_fds = 0;
1113 if (async_jobs == 0) {
1114 return loop_function((void *)&loopargs);
1117 for (i = 0; i < async_jobs && !error; i++) {
1118 loopargs_t *looparg_item = loopargs + i;
1120 /* Copy pointer content (looparg_t item address) into async context */
1121 ret = ASYNC_start_job(&loopargs[i].inprogress_job, loopargs[i].wait_ctx,
1122 &job_op_count, loop_function,
1123 (void *)&looparg_item, sizeof(looparg_item));
1129 if (job_op_count == -1) {
1132 total_op_count += job_op_count;
1137 BIO_printf(bio_err, "Failure in the job\n");
1138 ERR_print_errors(bio_err);
1144 while (num_inprogress > 0) {
1145 #if defined(OPENSSL_SYS_WINDOWS)
1147 #elif defined(OPENSSL_SYS_UNIX)
1148 int select_result = 0;
1149 OSSL_ASYNC_FD max_fd = 0;
1152 FD_ZERO(&waitfdset);
1154 for (i = 0; i < async_jobs && num_inprogress > 0; i++) {
1155 if (loopargs[i].inprogress_job == NULL)
1158 if (!ASYNC_WAIT_CTX_get_all_fds
1159 (loopargs[i].wait_ctx, NULL, &num_job_fds)
1160 || num_job_fds > 1) {
1161 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1162 ERR_print_errors(bio_err);
1166 ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd,
1168 FD_SET(job_fd, &waitfdset);
1169 if (job_fd > max_fd)
1173 if (max_fd >= (OSSL_ASYNC_FD)FD_SETSIZE) {
1175 "Error: max_fd (%d) must be smaller than FD_SETSIZE (%d). "
1176 "Decrease the value of async_jobs\n",
1177 max_fd, FD_SETSIZE);
1178 ERR_print_errors(bio_err);
1183 select_result = select(max_fd + 1, &waitfdset, NULL, NULL, NULL);
1184 if (select_result == -1 && errno == EINTR)
1187 if (select_result == -1) {
1188 BIO_printf(bio_err, "Failure in the select\n");
1189 ERR_print_errors(bio_err);
1194 if (select_result == 0)
1198 for (i = 0; i < async_jobs; i++) {
1199 if (loopargs[i].inprogress_job == NULL)
1202 if (!ASYNC_WAIT_CTX_get_all_fds
1203 (loopargs[i].wait_ctx, NULL, &num_job_fds)
1204 || num_job_fds > 1) {
1205 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1206 ERR_print_errors(bio_err);
1210 ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd,
1213 #if defined(OPENSSL_SYS_UNIX)
1214 if (num_job_fds == 1 && !FD_ISSET(job_fd, &waitfdset))
1216 #elif defined(OPENSSL_SYS_WINDOWS)
1217 if (num_job_fds == 1
1218 && !PeekNamedPipe(job_fd, NULL, 0, NULL, &avail, NULL)
1223 ret = ASYNC_start_job(&loopargs[i].inprogress_job,
1224 loopargs[i].wait_ctx, &job_op_count,
1225 loop_function, (void *)(loopargs + i),
1226 sizeof(loopargs_t));
1231 if (job_op_count == -1) {
1234 total_op_count += job_op_count;
1237 loopargs[i].inprogress_job = NULL;
1242 loopargs[i].inprogress_job = NULL;
1243 BIO_printf(bio_err, "Failure in the job\n");
1244 ERR_print_errors(bio_err);
1251 return error ? -1 : total_op_count;
1254 int speed_main(int argc, char **argv)
1257 int (*loopfunc)(void *args);
1258 loopargs_t *loopargs = NULL;
1260 const char *engine_id = NULL;
1261 const EVP_CIPHER *evp_cipher = NULL;
1264 int async_init = 0, multiblock = 0, pr_header = 0;
1265 int doit[ALGOR_NUM] = { 0 };
1266 int ret = 1, misalign = 0, lengths_single = 0;
1268 unsigned int size_num = OSSL_NELEM(lengths_list);
1269 unsigned int i, k, loop, loopargs_len = 0, async_jobs = 0;
1275 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) \
1276 || !defined(OPENSSL_NO_EC)
1279 openssl_speed_sec_t seconds = { SECONDS, RSA_SECONDS, DSA_SECONDS,
1280 ECDSA_SECONDS, ECDH_SECONDS };
1282 /* What follows are the buffers and key material. */
1283 #ifndef OPENSSL_NO_RC5
1286 #ifndef OPENSSL_NO_RC2
1289 #ifndef OPENSSL_NO_IDEA
1290 IDEA_KEY_SCHEDULE idea_ks;
1292 #ifndef OPENSSL_NO_SEED
1293 SEED_KEY_SCHEDULE seed_ks;
1295 #ifndef OPENSSL_NO_BF
1298 #ifndef OPENSSL_NO_CAST
1301 static const unsigned char key16[16] = {
1302 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1303 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
1305 static const unsigned char key24[24] = {
1306 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1307 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1308 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1310 static const unsigned char key32[32] = {
1311 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1312 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1313 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
1314 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
1316 #ifndef OPENSSL_NO_CAMELLIA
1317 static const unsigned char ckey24[24] = {
1318 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1319 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1320 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1322 static const unsigned char ckey32[32] = {
1323 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1324 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1325 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
1326 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
1328 CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3;
1330 #ifndef OPENSSL_NO_DES
1331 static DES_cblock key = {
1332 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0
1334 static DES_cblock key2 = {
1335 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
1337 static DES_cblock key3 = {
1338 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1341 #ifndef OPENSSL_NO_RSA
1342 static const unsigned int rsa_bits[RSA_NUM] = {
1343 512, 1024, 2048, 3072, 4096, 7680, 15360
1345 static const unsigned char *rsa_data[RSA_NUM] = {
1346 test512, test1024, test2048, test3072, test4096, test7680, test15360
1348 static const int rsa_data_length[RSA_NUM] = {
1349 sizeof(test512), sizeof(test1024),
1350 sizeof(test2048), sizeof(test3072),
1351 sizeof(test4096), sizeof(test7680),
1354 int rsa_doit[RSA_NUM] = { 0 };
1355 int primes = RSA_DEFAULT_PRIME_NUM;
1357 #ifndef OPENSSL_NO_DSA
1358 static const unsigned int dsa_bits[DSA_NUM] = { 512, 1024, 2048 };
1359 int dsa_doit[DSA_NUM] = { 0 };
1361 #ifndef OPENSSL_NO_EC
1363 * We only test over the following curves as they are representative, To
1364 * add tests over more curves, simply add the curve NID and curve name to
1365 * the following arrays and increase the |ecdh_choices| list accordingly.
1367 static const struct {
1373 {"secp160r1", NID_secp160r1, 160},
1374 {"nistp192", NID_X9_62_prime192v1, 192},
1375 {"nistp224", NID_secp224r1, 224},
1376 {"nistp256", NID_X9_62_prime256v1, 256},
1377 {"nistp384", NID_secp384r1, 384},
1378 {"nistp521", NID_secp521r1, 521},
1380 {"nistk163", NID_sect163k1, 163},
1381 {"nistk233", NID_sect233k1, 233},
1382 {"nistk283", NID_sect283k1, 283},
1383 {"nistk409", NID_sect409k1, 409},
1384 {"nistk571", NID_sect571k1, 571},
1385 {"nistb163", NID_sect163r2, 163},
1386 {"nistb233", NID_sect233r1, 233},
1387 {"nistb283", NID_sect283r1, 283},
1388 {"nistb409", NID_sect409r1, 409},
1389 {"nistb571", NID_sect571r1, 571},
1390 /* Other and ECDH only ones */
1391 {"X25519", NID_X25519, 253},
1392 {"X448", NID_X448, 448}
1394 int ecdsa_doit[ECDSA_NUM] = { 0 };
1395 int ecdh_doit[EC_NUM] = { 0 };
1396 OPENSSL_assert(OSSL_NELEM(test_curves) >= EC_NUM);
1397 #endif /* ndef OPENSSL_NO_EC */
1399 prog = opt_init(argc, argv, speed_options);
1400 while ((o = opt_next()) != OPT_EOF) {
1405 BIO_printf(bio_err, "%s: Use -help for summary.\n", prog);
1408 opt_help(speed_options);
1416 evp_cipher = EVP_get_cipherbyname(opt_arg());
1417 if (evp_cipher == NULL)
1418 evp_md = EVP_get_digestbyname(opt_arg());
1419 if (evp_cipher == NULL && evp_md == NULL) {
1421 "%s: %s is an unknown cipher or digest\n",
1432 * In a forked execution, an engine might need to be
1433 * initialised by each child process, not by the parent.
1434 * So store the name here and run setup_engine() later on.
1436 engine_id = opt_arg();
1440 multi = atoi(opt_arg());
1444 #ifndef OPENSSL_NO_ASYNC
1445 async_jobs = atoi(opt_arg());
1446 if (!ASYNC_is_capable()) {
1448 "%s: async_jobs specified but async not supported\n",
1452 if (async_jobs > 99999) {
1453 BIO_printf(bio_err, "%s: too many async_jobs\n", prog);
1459 if (!opt_int(opt_arg(), &misalign))
1461 if (misalign > MISALIGN) {
1463 "%s: Maximum offset is %d\n", prog, MISALIGN);
1472 #ifdef OPENSSL_NO_MULTIBLOCK
1474 "%s: -mb specified but multi-block support is disabled\n",
1484 if (!opt_int(opt_arg(), &primes))
1488 seconds.sym = seconds.rsa = seconds.dsa = seconds.ecdsa
1489 = seconds.ecdh = atoi(opt_arg());
1492 lengths_single = atoi(opt_arg());
1493 lengths = &lengths_single;
1498 argc = opt_num_rest();
1501 /* Remaining arguments are algorithms. */
1502 for (; *argv; argv++) {
1503 if (found(*argv, doit_choices, &i)) {
1507 #ifndef OPENSSL_NO_DES
1508 if (strcmp(*argv, "des") == 0) {
1509 doit[D_CBC_DES] = doit[D_EDE3_DES] = 1;
1513 if (strcmp(*argv, "sha") == 0) {
1514 doit[D_SHA1] = doit[D_SHA256] = doit[D_SHA512] = 1;
1517 #ifndef OPENSSL_NO_RSA
1518 if (strcmp(*argv, "openssl") == 0)
1520 if (strcmp(*argv, "rsa") == 0) {
1521 for (loop = 0; loop < OSSL_NELEM(rsa_doit); loop++)
1525 if (found(*argv, rsa_choices, &i)) {
1530 #ifndef OPENSSL_NO_DSA
1531 if (strcmp(*argv, "dsa") == 0) {
1532 dsa_doit[R_DSA_512] = dsa_doit[R_DSA_1024] =
1533 dsa_doit[R_DSA_2048] = 1;
1536 if (found(*argv, dsa_choices, &i)) {
1541 if (strcmp(*argv, "aes") == 0) {
1542 doit[D_CBC_128_AES] = doit[D_CBC_192_AES] = doit[D_CBC_256_AES] = 1;
1545 #ifndef OPENSSL_NO_CAMELLIA
1546 if (strcmp(*argv, "camellia") == 0) {
1547 doit[D_CBC_128_CML] = doit[D_CBC_192_CML] = doit[D_CBC_256_CML] = 1;
1551 #ifndef OPENSSL_NO_EC
1552 if (strcmp(*argv, "ecdsa") == 0) {
1553 for (loop = 0; loop < OSSL_NELEM(ecdsa_doit); loop++)
1554 ecdsa_doit[loop] = 1;
1557 if (found(*argv, ecdsa_choices, &i)) {
1561 if (strcmp(*argv, "ecdh") == 0) {
1562 for (loop = 0; loop < OSSL_NELEM(ecdh_doit); loop++)
1563 ecdh_doit[loop] = 1;
1566 if (found(*argv, ecdh_choices, &i)) {
1571 BIO_printf(bio_err, "%s: Unknown algorithm %s\n", prog, *argv);
1575 /* Initialize the job pool if async mode is enabled */
1576 if (async_jobs > 0) {
1577 async_init = ASYNC_init_thread(async_jobs, async_jobs);
1579 BIO_printf(bio_err, "Error creating the ASYNC job pool\n");
1584 loopargs_len = (async_jobs == 0 ? 1 : async_jobs);
1586 app_malloc(loopargs_len * sizeof(loopargs_t), "array of loopargs");
1587 memset(loopargs, 0, loopargs_len * sizeof(loopargs_t));
1589 for (i = 0; i < loopargs_len; i++) {
1590 if (async_jobs > 0) {
1591 loopargs[i].wait_ctx = ASYNC_WAIT_CTX_new();
1592 if (loopargs[i].wait_ctx == NULL) {
1593 BIO_printf(bio_err, "Error creating the ASYNC_WAIT_CTX\n");
1598 buflen = lengths[size_num - 1] + MAX_MISALIGNMENT + 1;
1599 loopargs[i].buf_malloc = app_malloc(buflen, "input buffer");
1600 loopargs[i].buf2_malloc = app_malloc(buflen, "input buffer");
1601 memset(loopargs[i].buf_malloc, 0, buflen);
1602 memset(loopargs[i].buf2_malloc, 0, buflen);
1604 /* Align the start of buffers on a 64 byte boundary */
1605 loopargs[i].buf = loopargs[i].buf_malloc + misalign;
1606 loopargs[i].buf2 = loopargs[i].buf2_malloc + misalign;
1607 #ifndef OPENSSL_NO_EC
1608 loopargs[i].secret_a = app_malloc(MAX_ECDH_SIZE, "ECDH secret a");
1609 loopargs[i].secret_b = app_malloc(MAX_ECDH_SIZE, "ECDH secret b");
1614 if (multi && do_multi(multi, size_num))
1618 /* Initialize the engine after the fork */
1619 e = setup_engine(engine_id, 0);
1621 /* No parameters; turn on everything. */
1622 if ((argc == 0) && !doit[D_EVP]) {
1623 for (i = 0; i < ALGOR_NUM; i++)
1626 #ifndef OPENSSL_NO_RSA
1627 for (i = 0; i < RSA_NUM; i++)
1630 #ifndef OPENSSL_NO_DSA
1631 for (i = 0; i < DSA_NUM; i++)
1634 #ifndef OPENSSL_NO_EC
1635 for (loop = 0; loop < OSSL_NELEM(ecdsa_doit); loop++)
1636 ecdsa_doit[loop] = 1;
1637 for (loop = 0; loop < OSSL_NELEM(ecdh_doit); loop++)
1638 ecdh_doit[loop] = 1;
1641 for (i = 0; i < ALGOR_NUM; i++)
1645 if (usertime == 0 && !mr)
1647 "You have chosen to measure elapsed time "
1648 "instead of user CPU time.\n");
1650 #ifndef OPENSSL_NO_RSA
1651 for (i = 0; i < loopargs_len; i++) {
1652 if (primes > RSA_DEFAULT_PRIME_NUM) {
1653 /* for multi-prime RSA, skip this */
1656 for (k = 0; k < RSA_NUM; k++) {
1657 const unsigned char *p;
1660 loopargs[i].rsa_key[k] =
1661 d2i_RSAPrivateKey(NULL, &p, rsa_data_length[k]);
1662 if (loopargs[i].rsa_key[k] == NULL) {
1664 "internal error loading RSA key number %d\n", k);
1670 #ifndef OPENSSL_NO_DSA
1671 for (i = 0; i < loopargs_len; i++) {
1672 loopargs[i].dsa_key[0] = get_dsa(512);
1673 loopargs[i].dsa_key[1] = get_dsa(1024);
1674 loopargs[i].dsa_key[2] = get_dsa(2048);
1677 #ifndef OPENSSL_NO_DES
1678 DES_set_key_unchecked(&key, &sch);
1679 DES_set_key_unchecked(&key2, &sch2);
1680 DES_set_key_unchecked(&key3, &sch3);
1682 AES_set_encrypt_key(key16, 128, &aes_ks1);
1683 AES_set_encrypt_key(key24, 192, &aes_ks2);
1684 AES_set_encrypt_key(key32, 256, &aes_ks3);
1685 #ifndef OPENSSL_NO_CAMELLIA
1686 Camellia_set_key(key16, 128, &camellia_ks1);
1687 Camellia_set_key(ckey24, 192, &camellia_ks2);
1688 Camellia_set_key(ckey32, 256, &camellia_ks3);
1690 #ifndef OPENSSL_NO_IDEA
1691 IDEA_set_encrypt_key(key16, &idea_ks);
1693 #ifndef OPENSSL_NO_SEED
1694 SEED_set_key(key16, &seed_ks);
1696 #ifndef OPENSSL_NO_RC4
1697 RC4_set_key(&rc4_ks, 16, key16);
1699 #ifndef OPENSSL_NO_RC2
1700 RC2_set_key(&rc2_ks, 16, key16, 128);
1702 #ifndef OPENSSL_NO_RC5
1703 RC5_32_set_key(&rc5_ks, 16, key16, 12);
1705 #ifndef OPENSSL_NO_BF
1706 BF_set_key(&bf_ks, 16, key16);
1708 #ifndef OPENSSL_NO_CAST
1709 CAST_set_key(&cast_ks, 16, key16);
1712 # ifndef OPENSSL_NO_DES
1713 BIO_printf(bio_err, "First we calculate the approximate speed ...\n");
1719 for (it = count; it; it--)
1720 DES_ecb_encrypt((DES_cblock *)loopargs[0].buf,
1721 (DES_cblock *)loopargs[0].buf, &sch, DES_ENCRYPT);
1725 c[D_MD2][0] = count / 10;
1726 c[D_MDC2][0] = count / 10;
1727 c[D_MD4][0] = count;
1728 c[D_MD5][0] = count;
1729 c[D_HMAC][0] = count;
1730 c[D_SHA1][0] = count;
1731 c[D_RMD160][0] = count;
1732 c[D_RC4][0] = count * 5;
1733 c[D_CBC_DES][0] = count;
1734 c[D_EDE3_DES][0] = count / 3;
1735 c[D_CBC_IDEA][0] = count;
1736 c[D_CBC_SEED][0] = count;
1737 c[D_CBC_RC2][0] = count;
1738 c[D_CBC_RC5][0] = count;
1739 c[D_CBC_BF][0] = count;
1740 c[D_CBC_CAST][0] = count;
1741 c[D_CBC_128_AES][0] = count;
1742 c[D_CBC_192_AES][0] = count;
1743 c[D_CBC_256_AES][0] = count;
1744 c[D_CBC_128_CML][0] = count;
1745 c[D_CBC_192_CML][0] = count;
1746 c[D_CBC_256_CML][0] = count;
1747 c[D_SHA256][0] = count;
1748 c[D_SHA512][0] = count;
1749 c[D_WHIRLPOOL][0] = count;
1750 c[D_IGE_128_AES][0] = count;
1751 c[D_IGE_192_AES][0] = count;
1752 c[D_IGE_256_AES][0] = count;
1753 c[D_GHASH][0] = count;
1754 c[D_RAND][0] = count;
1756 for (i = 1; i < size_num; i++) {
1759 l0 = (long)lengths[0];
1760 l1 = (long)lengths[i];
1762 c[D_MD2][i] = c[D_MD2][0] * 4 * l0 / l1;
1763 c[D_MDC2][i] = c[D_MDC2][0] * 4 * l0 / l1;
1764 c[D_MD4][i] = c[D_MD4][0] * 4 * l0 / l1;
1765 c[D_MD5][i] = c[D_MD5][0] * 4 * l0 / l1;
1766 c[D_HMAC][i] = c[D_HMAC][0] * 4 * l0 / l1;
1767 c[D_SHA1][i] = c[D_SHA1][0] * 4 * l0 / l1;
1768 c[D_RMD160][i] = c[D_RMD160][0] * 4 * l0 / l1;
1769 c[D_SHA256][i] = c[D_SHA256][0] * 4 * l0 / l1;
1770 c[D_SHA512][i] = c[D_SHA512][0] * 4 * l0 / l1;
1771 c[D_WHIRLPOOL][i] = c[D_WHIRLPOOL][0] * 4 * l0 / l1;
1772 c[D_GHASH][i] = c[D_GHASH][0] * 4 * l0 / l1;
1773 c[D_RAND][i] = c[D_RAND][0] * 4 * l0 / l1;
1775 l0 = (long)lengths[i - 1];
1777 c[D_RC4][i] = c[D_RC4][i - 1] * l0 / l1;
1778 c[D_CBC_DES][i] = c[D_CBC_DES][i - 1] * l0 / l1;
1779 c[D_EDE3_DES][i] = c[D_EDE3_DES][i - 1] * l0 / l1;
1780 c[D_CBC_IDEA][i] = c[D_CBC_IDEA][i - 1] * l0 / l1;
1781 c[D_CBC_SEED][i] = c[D_CBC_SEED][i - 1] * l0 / l1;
1782 c[D_CBC_RC2][i] = c[D_CBC_RC2][i - 1] * l0 / l1;
1783 c[D_CBC_RC5][i] = c[D_CBC_RC5][i - 1] * l0 / l1;
1784 c[D_CBC_BF][i] = c[D_CBC_BF][i - 1] * l0 / l1;
1785 c[D_CBC_CAST][i] = c[D_CBC_CAST][i - 1] * l0 / l1;
1786 c[D_CBC_128_AES][i] = c[D_CBC_128_AES][i - 1] * l0 / l1;
1787 c[D_CBC_192_AES][i] = c[D_CBC_192_AES][i - 1] * l0 / l1;
1788 c[D_CBC_256_AES][i] = c[D_CBC_256_AES][i - 1] * l0 / l1;
1789 c[D_CBC_128_CML][i] = c[D_CBC_128_CML][i - 1] * l0 / l1;
1790 c[D_CBC_192_CML][i] = c[D_CBC_192_CML][i - 1] * l0 / l1;
1791 c[D_CBC_256_CML][i] = c[D_CBC_256_CML][i - 1] * l0 / l1;
1792 c[D_IGE_128_AES][i] = c[D_IGE_128_AES][i - 1] * l0 / l1;
1793 c[D_IGE_192_AES][i] = c[D_IGE_192_AES][i - 1] * l0 / l1;
1794 c[D_IGE_256_AES][i] = c[D_IGE_256_AES][i - 1] * l0 / l1;
1797 # ifndef OPENSSL_NO_RSA
1798 rsa_c[R_RSA_512][0] = count / 2000;
1799 rsa_c[R_RSA_512][1] = count / 400;
1800 for (i = 1; i < RSA_NUM; i++) {
1801 rsa_c[i][0] = rsa_c[i - 1][0] / 8;
1802 rsa_c[i][1] = rsa_c[i - 1][1] / 4;
1803 if (rsa_doit[i] <= 1 && rsa_c[i][0] == 0)
1806 if (rsa_c[i][0] == 0) {
1807 rsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
1814 # ifndef OPENSSL_NO_DSA
1815 dsa_c[R_DSA_512][0] = count / 1000;
1816 dsa_c[R_DSA_512][1] = count / 1000 / 2;
1817 for (i = 1; i < DSA_NUM; i++) {
1818 dsa_c[i][0] = dsa_c[i - 1][0] / 4;
1819 dsa_c[i][1] = dsa_c[i - 1][1] / 4;
1820 if (dsa_doit[i] <= 1 && dsa_c[i][0] == 0)
1823 if (dsa_c[i][0] == 0) {
1824 dsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
1831 # ifndef OPENSSL_NO_EC
1832 ecdsa_c[R_EC_P160][0] = count / 1000;
1833 ecdsa_c[R_EC_P160][1] = count / 1000 / 2;
1834 for (i = R_EC_P192; i <= R_EC_P521; i++) {
1835 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1836 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1837 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1840 if (ecdsa_c[i][0] == 0) {
1846 ecdsa_c[R_EC_K163][0] = count / 1000;
1847 ecdsa_c[R_EC_K163][1] = count / 1000 / 2;
1848 for (i = R_EC_K233; i <= R_EC_K571; i++) {
1849 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1850 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1851 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1854 if (ecdsa_c[i][0] == 0) {
1860 ecdsa_c[R_EC_B163][0] = count / 1000;
1861 ecdsa_c[R_EC_B163][1] = count / 1000 / 2;
1862 for (i = R_EC_B233; i <= R_EC_B571; i++) {
1863 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1864 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1865 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1868 if (ecdsa_c[i][0] == 0) {
1875 ecdh_c[R_EC_P160][0] = count / 1000;
1876 for (i = R_EC_P192; i <= R_EC_P521; i++) {
1877 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1878 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1881 if (ecdh_c[i][0] == 0) {
1886 ecdh_c[R_EC_K163][0] = count / 1000;
1887 for (i = R_EC_K233; i <= R_EC_K571; i++) {
1888 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1889 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1892 if (ecdh_c[i][0] == 0) {
1897 ecdh_c[R_EC_B163][0] = count / 1000;
1898 for (i = R_EC_B233; i <= R_EC_B571; i++) {
1899 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1900 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1903 if (ecdh_c[i][0] == 0) {
1908 /* repeated code good to factorize */
1909 ecdh_c[R_EC_BRP256R1][0] = count / 1000;
1910 for (i = R_EC_BRP384R1; i <= R_EC_BRP512R1; i += 2) {
1911 ecdh_c[i][0] = ecdh_c[i - 2][0] / 2;
1912 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1915 if (ecdh_c[i][0] == 0) {
1920 ecdh_c[R_EC_BRP256T1][0] = count / 1000;
1921 for (i = R_EC_BRP384T1; i <= R_EC_BRP512T1; i += 2) {
1922 ecdh_c[i][0] = ecdh_c[i - 2][0] / 2;
1923 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1926 if (ecdh_c[i][0] == 0) {
1931 /* default iteration count for the last two EC Curves */
1932 ecdh_c[R_EC_X25519][0] = count / 1800;
1933 ecdh_c[R_EC_X448][0] = count / 7200;
1937 /* not worth fixing */
1938 # error "You cannot disable DES on systems without SIGALRM."
1939 # endif /* OPENSSL_NO_DES */
1942 signal(SIGALRM, sig_done);
1944 #endif /* SIGALRM */
1946 #ifndef OPENSSL_NO_MD2
1948 for (testnum = 0; testnum < size_num; testnum++) {
1949 print_message(names[D_MD2], c[D_MD2][testnum], lengths[testnum],
1952 count = run_benchmark(async_jobs, EVP_Digest_MD2_loop, loopargs);
1954 print_result(D_MD2, testnum, count, d);
1958 #ifndef OPENSSL_NO_MDC2
1960 for (testnum = 0; testnum < size_num; testnum++) {
1961 print_message(names[D_MDC2], c[D_MDC2][testnum], lengths[testnum],
1964 count = run_benchmark(async_jobs, EVP_Digest_MDC2_loop, loopargs);
1966 print_result(D_MDC2, testnum, count, d);
1971 #ifndef OPENSSL_NO_MD4
1973 for (testnum = 0; testnum < size_num; testnum++) {
1974 print_message(names[D_MD4], c[D_MD4][testnum], lengths[testnum],
1977 count = run_benchmark(async_jobs, EVP_Digest_MD4_loop, loopargs);
1979 print_result(D_MD4, testnum, count, d);
1984 #ifndef OPENSSL_NO_MD5
1986 for (testnum = 0; testnum < size_num; testnum++) {
1987 print_message(names[D_MD5], c[D_MD5][testnum], lengths[testnum],
1990 count = run_benchmark(async_jobs, MD5_loop, loopargs);
1992 print_result(D_MD5, testnum, count, d);
1997 static const char hmac_key[] = "This is a key...";
1998 int len = strlen(hmac_key);
2000 for (i = 0; i < loopargs_len; i++) {
2001 loopargs[i].hctx = HMAC_CTX_new();
2002 if (loopargs[i].hctx == NULL) {
2003 BIO_printf(bio_err, "HMAC malloc failure, exiting...");
2007 HMAC_Init_ex(loopargs[i].hctx, hmac_key, len, EVP_md5(), NULL);
2009 for (testnum = 0; testnum < size_num; testnum++) {
2010 print_message(names[D_HMAC], c[D_HMAC][testnum], lengths[testnum],
2013 count = run_benchmark(async_jobs, HMAC_loop, loopargs);
2015 print_result(D_HMAC, testnum, count, d);
2017 for (i = 0; i < loopargs_len; i++) {
2018 HMAC_CTX_free(loopargs[i].hctx);
2023 for (testnum = 0; testnum < size_num; testnum++) {
2024 print_message(names[D_SHA1], c[D_SHA1][testnum], lengths[testnum],
2027 count = run_benchmark(async_jobs, SHA1_loop, loopargs);
2029 print_result(D_SHA1, testnum, count, d);
2032 if (doit[D_SHA256]) {
2033 for (testnum = 0; testnum < size_num; testnum++) {
2034 print_message(names[D_SHA256], c[D_SHA256][testnum],
2035 lengths[testnum], seconds.sym);
2037 count = run_benchmark(async_jobs, SHA256_loop, loopargs);
2039 print_result(D_SHA256, testnum, count, d);
2042 if (doit[D_SHA512]) {
2043 for (testnum = 0; testnum < size_num; testnum++) {
2044 print_message(names[D_SHA512], c[D_SHA512][testnum],
2045 lengths[testnum], seconds.sym);
2047 count = run_benchmark(async_jobs, SHA512_loop, loopargs);
2049 print_result(D_SHA512, testnum, count, d);
2052 #ifndef OPENSSL_NO_WHIRLPOOL
2053 if (doit[D_WHIRLPOOL]) {
2054 for (testnum = 0; testnum < size_num; testnum++) {
2055 print_message(names[D_WHIRLPOOL], c[D_WHIRLPOOL][testnum],
2056 lengths[testnum], seconds.sym);
2058 count = run_benchmark(async_jobs, WHIRLPOOL_loop, loopargs);
2060 print_result(D_WHIRLPOOL, testnum, count, d);
2065 #ifndef OPENSSL_NO_RMD160
2066 if (doit[D_RMD160]) {
2067 for (testnum = 0; testnum < size_num; testnum++) {
2068 print_message(names[D_RMD160], c[D_RMD160][testnum],
2069 lengths[testnum], seconds.sym);
2071 count = run_benchmark(async_jobs, EVP_Digest_RMD160_loop, loopargs);
2073 print_result(D_RMD160, testnum, count, d);
2077 #ifndef OPENSSL_NO_RC4
2079 for (testnum = 0; testnum < size_num; testnum++) {
2080 print_message(names[D_RC4], c[D_RC4][testnum], lengths[testnum],
2083 count = run_benchmark(async_jobs, RC4_loop, loopargs);
2085 print_result(D_RC4, testnum, count, d);
2089 #ifndef OPENSSL_NO_DES
2090 if (doit[D_CBC_DES]) {
2091 for (testnum = 0; testnum < size_num; testnum++) {
2092 print_message(names[D_CBC_DES], c[D_CBC_DES][testnum],
2093 lengths[testnum], seconds.sym);
2095 count = run_benchmark(async_jobs, DES_ncbc_encrypt_loop, loopargs);
2097 print_result(D_CBC_DES, testnum, count, d);
2101 if (doit[D_EDE3_DES]) {
2102 for (testnum = 0; testnum < size_num; testnum++) {
2103 print_message(names[D_EDE3_DES], c[D_EDE3_DES][testnum],
2104 lengths[testnum], seconds.sym);
2107 run_benchmark(async_jobs, DES_ede3_cbc_encrypt_loop, loopargs);
2109 print_result(D_EDE3_DES, testnum, count, d);
2114 if (doit[D_CBC_128_AES]) {
2115 for (testnum = 0; testnum < size_num; testnum++) {
2116 print_message(names[D_CBC_128_AES], c[D_CBC_128_AES][testnum],
2117 lengths[testnum], seconds.sym);
2120 run_benchmark(async_jobs, AES_cbc_128_encrypt_loop, loopargs);
2122 print_result(D_CBC_128_AES, testnum, count, d);
2125 if (doit[D_CBC_192_AES]) {
2126 for (testnum = 0; testnum < size_num; testnum++) {
2127 print_message(names[D_CBC_192_AES], c[D_CBC_192_AES][testnum],
2128 lengths[testnum], seconds.sym);
2131 run_benchmark(async_jobs, AES_cbc_192_encrypt_loop, loopargs);
2133 print_result(D_CBC_192_AES, testnum, count, d);
2136 if (doit[D_CBC_256_AES]) {
2137 for (testnum = 0; testnum < size_num; testnum++) {
2138 print_message(names[D_CBC_256_AES], c[D_CBC_256_AES][testnum],
2139 lengths[testnum], seconds.sym);
2142 run_benchmark(async_jobs, AES_cbc_256_encrypt_loop, loopargs);
2144 print_result(D_CBC_256_AES, testnum, count, d);
2148 if (doit[D_IGE_128_AES]) {
2149 for (testnum = 0; testnum < size_num; testnum++) {
2150 print_message(names[D_IGE_128_AES], c[D_IGE_128_AES][testnum],
2151 lengths[testnum], seconds.sym);
2154 run_benchmark(async_jobs, AES_ige_128_encrypt_loop, loopargs);
2156 print_result(D_IGE_128_AES, testnum, count, d);
2159 if (doit[D_IGE_192_AES]) {
2160 for (testnum = 0; testnum < size_num; testnum++) {
2161 print_message(names[D_IGE_192_AES], c[D_IGE_192_AES][testnum],
2162 lengths[testnum], seconds.sym);
2165 run_benchmark(async_jobs, AES_ige_192_encrypt_loop, loopargs);
2167 print_result(D_IGE_192_AES, testnum, count, d);
2170 if (doit[D_IGE_256_AES]) {
2171 for (testnum = 0; testnum < size_num; testnum++) {
2172 print_message(names[D_IGE_256_AES], c[D_IGE_256_AES][testnum],
2173 lengths[testnum], seconds.sym);
2176 run_benchmark(async_jobs, AES_ige_256_encrypt_loop, loopargs);
2178 print_result(D_IGE_256_AES, testnum, count, d);
2181 if (doit[D_GHASH]) {
2182 for (i = 0; i < loopargs_len; i++) {
2183 loopargs[i].gcm_ctx =
2184 CRYPTO_gcm128_new(&aes_ks1, (block128_f) AES_encrypt);
2185 CRYPTO_gcm128_setiv(loopargs[i].gcm_ctx,
2186 (unsigned char *)"0123456789ab", 12);
2189 for (testnum = 0; testnum < size_num; testnum++) {
2190 print_message(names[D_GHASH], c[D_GHASH][testnum],
2191 lengths[testnum], seconds.sym);
2193 count = run_benchmark(async_jobs, CRYPTO_gcm128_aad_loop, loopargs);
2195 print_result(D_GHASH, testnum, count, d);
2197 for (i = 0; i < loopargs_len; i++)
2198 CRYPTO_gcm128_release(loopargs[i].gcm_ctx);
2200 #ifndef OPENSSL_NO_CAMELLIA
2201 if (doit[D_CBC_128_CML]) {
2202 if (async_jobs > 0) {
2203 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2204 names[D_CBC_128_CML]);
2205 doit[D_CBC_128_CML] = 0;
2207 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2208 print_message(names[D_CBC_128_CML], c[D_CBC_128_CML][testnum],
2209 lengths[testnum], seconds.sym);
2211 for (count = 0, run = 1; COND(c[D_CBC_128_CML][testnum]); count++)
2212 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2213 (size_t)lengths[testnum], &camellia_ks1,
2214 iv, CAMELLIA_ENCRYPT);
2216 print_result(D_CBC_128_CML, testnum, count, d);
2219 if (doit[D_CBC_192_CML]) {
2220 if (async_jobs > 0) {
2221 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2222 names[D_CBC_192_CML]);
2223 doit[D_CBC_192_CML] = 0;
2225 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2226 print_message(names[D_CBC_192_CML], c[D_CBC_192_CML][testnum],
2227 lengths[testnum], seconds.sym);
2228 if (async_jobs > 0) {
2229 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2233 for (count = 0, run = 1; COND(c[D_CBC_192_CML][testnum]); count++)
2234 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2235 (size_t)lengths[testnum], &camellia_ks2,
2236 iv, CAMELLIA_ENCRYPT);
2238 print_result(D_CBC_192_CML, testnum, count, d);
2241 if (doit[D_CBC_256_CML]) {
2242 if (async_jobs > 0) {
2243 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2244 names[D_CBC_256_CML]);
2245 doit[D_CBC_256_CML] = 0;
2247 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2248 print_message(names[D_CBC_256_CML], c[D_CBC_256_CML][testnum],
2249 lengths[testnum], seconds.sym);
2251 for (count = 0, run = 1; COND(c[D_CBC_256_CML][testnum]); count++)
2252 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2253 (size_t)lengths[testnum], &camellia_ks3,
2254 iv, CAMELLIA_ENCRYPT);
2256 print_result(D_CBC_256_CML, testnum, count, d);
2260 #ifndef OPENSSL_NO_IDEA
2261 if (doit[D_CBC_IDEA]) {
2262 if (async_jobs > 0) {
2263 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2265 doit[D_CBC_IDEA] = 0;
2267 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2268 print_message(names[D_CBC_IDEA], c[D_CBC_IDEA][testnum],
2269 lengths[testnum], seconds.sym);
2271 for (count = 0, run = 1; COND(c[D_CBC_IDEA][testnum]); count++)
2272 IDEA_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2273 (size_t)lengths[testnum], &idea_ks,
2276 print_result(D_CBC_IDEA, testnum, count, d);
2280 #ifndef OPENSSL_NO_SEED
2281 if (doit[D_CBC_SEED]) {
2282 if (async_jobs > 0) {
2283 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2285 doit[D_CBC_SEED] = 0;
2287 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2288 print_message(names[D_CBC_SEED], c[D_CBC_SEED][testnum],
2289 lengths[testnum], seconds.sym);
2291 for (count = 0, run = 1; COND(c[D_CBC_SEED][testnum]); count++)
2292 SEED_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2293 (size_t)lengths[testnum], &seed_ks, iv, 1);
2295 print_result(D_CBC_SEED, testnum, count, d);
2299 #ifndef OPENSSL_NO_RC2
2300 if (doit[D_CBC_RC2]) {
2301 if (async_jobs > 0) {
2302 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2304 doit[D_CBC_RC2] = 0;
2306 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2307 print_message(names[D_CBC_RC2], c[D_CBC_RC2][testnum],
2308 lengths[testnum], seconds.sym);
2309 if (async_jobs > 0) {
2310 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2314 for (count = 0, run = 1; COND(c[D_CBC_RC2][testnum]); count++)
2315 RC2_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2316 (size_t)lengths[testnum], &rc2_ks,
2319 print_result(D_CBC_RC2, testnum, count, d);
2323 #ifndef OPENSSL_NO_RC5
2324 if (doit[D_CBC_RC5]) {
2325 if (async_jobs > 0) {
2326 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2328 doit[D_CBC_RC5] = 0;
2330 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2331 print_message(names[D_CBC_RC5], c[D_CBC_RC5][testnum],
2332 lengths[testnum], seconds.sym);
2333 if (async_jobs > 0) {
2334 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2338 for (count = 0, run = 1; COND(c[D_CBC_RC5][testnum]); count++)
2339 RC5_32_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2340 (size_t)lengths[testnum], &rc5_ks,
2343 print_result(D_CBC_RC5, testnum, count, d);
2347 #ifndef OPENSSL_NO_BF
2348 if (doit[D_CBC_BF]) {
2349 if (async_jobs > 0) {
2350 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2354 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2355 print_message(names[D_CBC_BF], c[D_CBC_BF][testnum],
2356 lengths[testnum], seconds.sym);
2358 for (count = 0, run = 1; COND(c[D_CBC_BF][testnum]); count++)
2359 BF_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2360 (size_t)lengths[testnum], &bf_ks,
2363 print_result(D_CBC_BF, testnum, count, d);
2367 #ifndef OPENSSL_NO_CAST
2368 if (doit[D_CBC_CAST]) {
2369 if (async_jobs > 0) {
2370 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2372 doit[D_CBC_CAST] = 0;
2374 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2375 print_message(names[D_CBC_CAST], c[D_CBC_CAST][testnum],
2376 lengths[testnum], seconds.sym);
2378 for (count = 0, run = 1; COND(c[D_CBC_CAST][testnum]); count++)
2379 CAST_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2380 (size_t)lengths[testnum], &cast_ks,
2383 print_result(D_CBC_CAST, testnum, count, d);
2388 for (testnum = 0; testnum < size_num; testnum++) {
2389 print_message(names[D_RAND], c[D_RAND][testnum], lengths[testnum],
2392 count = run_benchmark(async_jobs, RAND_bytes_loop, loopargs);
2394 print_result(D_RAND, testnum, count, d);
2399 if (multiblock && evp_cipher) {
2401 (EVP_CIPHER_flags(evp_cipher) &
2402 EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) {
2403 BIO_printf(bio_err, "%s is not multi-block capable\n",
2404 OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher)));
2407 if (async_jobs > 0) {
2408 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2411 multiblock_speed(evp_cipher, lengths_single, &seconds);
2415 for (testnum = 0; testnum < size_num; testnum++) {
2418 names[D_EVP] = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
2420 * -O3 -fschedule-insns messes up an optimization here!
2421 * names[D_EVP] somehow becomes NULL
2423 print_message(names[D_EVP], save_count, lengths[testnum],
2426 for (k = 0; k < loopargs_len; k++) {
2427 loopargs[k].ctx = EVP_CIPHER_CTX_new();
2428 EVP_CipherInit_ex(loopargs[k].ctx, evp_cipher, NULL, NULL,
2429 iv, decrypt ? 0 : 1);
2431 EVP_CIPHER_CTX_set_padding(loopargs[k].ctx, 0);
2433 keylen = EVP_CIPHER_CTX_key_length(loopargs[k].ctx);
2434 loopargs[k].key = app_malloc(keylen, "evp_cipher key");
2435 EVP_CIPHER_CTX_rand_key(loopargs[k].ctx, loopargs[k].key);
2436 EVP_CipherInit_ex(loopargs[k].ctx, NULL, NULL,
2437 loopargs[k].key, NULL, -1);
2438 OPENSSL_clear_free(loopargs[k].key, keylen);
2440 switch (EVP_CIPHER_mode(evp_cipher)) {
2441 case EVP_CIPH_CCM_MODE:
2442 loopfunc = EVP_Update_loop_ccm;
2445 loopfunc = EVP_Update_loop;
2449 count = run_benchmark(async_jobs, loopfunc, loopargs);
2451 for (k = 0; k < loopargs_len; k++) {
2452 EVP_CIPHER_CTX_free(loopargs[k].ctx);
2456 names[D_EVP] = OBJ_nid2ln(EVP_MD_type(evp_md));
2457 print_message(names[D_EVP], save_count, lengths[testnum],
2460 count = run_benchmark(async_jobs, EVP_Digest_loop, loopargs);
2463 print_result(D_EVP, testnum, count, d);
2467 for (i = 0; i < loopargs_len; i++)
2468 RAND_bytes(loopargs[i].buf, 36);
2470 #ifndef OPENSSL_NO_RSA
2471 for (testnum = 0; testnum < RSA_NUM; testnum++) {
2473 if (!rsa_doit[testnum])
2475 for (i = 0; i < loopargs_len; i++) {
2477 /* we haven't set keys yet, generate multi-prime RSA keys */
2478 BIGNUM *bn = BN_new();
2482 if (!BN_set_word(bn, RSA_F4)) {
2487 BIO_printf(bio_err, "Generate multi-prime RSA key for %s\n",
2488 rsa_choices[testnum].name);
2490 loopargs[i].rsa_key[testnum] = RSA_new();
2491 if (loopargs[i].rsa_key[testnum] == NULL) {
2496 if (!RSA_generate_multi_prime_key(loopargs[i].rsa_key[testnum],
2498 primes, bn, NULL)) {
2504 st = RSA_sign(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
2505 &loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
2511 "RSA sign failure. No RSA sign will be done.\n");
2512 ERR_print_errors(bio_err);
2515 pkey_print_message("private", "rsa",
2516 rsa_c[testnum][0], rsa_bits[testnum],
2518 /* RSA_blinding_on(rsa_key[testnum],NULL); */
2520 count = run_benchmark(async_jobs, RSA_sign_loop, loopargs);
2523 mr ? "+R1:%ld:%d:%.2f\n"
2524 : "%ld %u bits private RSA's in %.2fs\n",
2525 count, rsa_bits[testnum], d);
2526 rsa_results[testnum][0] = (double)count / d;
2530 for (i = 0; i < loopargs_len; i++) {
2531 st = RSA_verify(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
2532 loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
2538 "RSA verify failure. No RSA verify will be done.\n");
2539 ERR_print_errors(bio_err);
2540 rsa_doit[testnum] = 0;
2542 pkey_print_message("public", "rsa",
2543 rsa_c[testnum][1], rsa_bits[testnum],
2546 count = run_benchmark(async_jobs, RSA_verify_loop, loopargs);
2549 mr ? "+R2:%ld:%d:%.2f\n"
2550 : "%ld %u bits public RSA's in %.2fs\n",
2551 count, rsa_bits[testnum], d);
2552 rsa_results[testnum][1] = (double)count / d;
2555 if (rsa_count <= 1) {
2556 /* if longer than 10s, don't do any more */
2557 for (testnum++; testnum < RSA_NUM; testnum++)
2558 rsa_doit[testnum] = 0;
2561 #endif /* OPENSSL_NO_RSA */
2563 for (i = 0; i < loopargs_len; i++)
2564 RAND_bytes(loopargs[i].buf, 36);
2566 #ifndef OPENSSL_NO_DSA
2567 for (testnum = 0; testnum < DSA_NUM; testnum++) {
2569 if (!dsa_doit[testnum])
2572 /* DSA_generate_key(dsa_key[testnum]); */
2573 /* DSA_sign_setup(dsa_key[testnum],NULL); */
2574 for (i = 0; i < loopargs_len; i++) {
2575 st = DSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
2576 &loopargs[i].siglen, loopargs[i].dsa_key[testnum]);
2582 "DSA sign failure. No DSA sign will be done.\n");
2583 ERR_print_errors(bio_err);
2586 pkey_print_message("sign", "dsa",
2587 dsa_c[testnum][0], dsa_bits[testnum],
2590 count = run_benchmark(async_jobs, DSA_sign_loop, loopargs);
2593 mr ? "+R3:%ld:%u:%.2f\n"
2594 : "%ld %u bits DSA signs in %.2fs\n",
2595 count, dsa_bits[testnum], d);
2596 dsa_results[testnum][0] = (double)count / d;
2600 for (i = 0; i < loopargs_len; i++) {
2601 st = DSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
2602 loopargs[i].siglen, loopargs[i].dsa_key[testnum]);
2608 "DSA verify failure. No DSA verify will be done.\n");
2609 ERR_print_errors(bio_err);
2610 dsa_doit[testnum] = 0;
2612 pkey_print_message("verify", "dsa",
2613 dsa_c[testnum][1], dsa_bits[testnum],
2616 count = run_benchmark(async_jobs, DSA_verify_loop, loopargs);
2619 mr ? "+R4:%ld:%u:%.2f\n"
2620 : "%ld %u bits DSA verify in %.2fs\n",
2621 count, dsa_bits[testnum], d);
2622 dsa_results[testnum][1] = (double)count / d;
2625 if (rsa_count <= 1) {
2626 /* if longer than 10s, don't do any more */
2627 for (testnum++; testnum < DSA_NUM; testnum++)
2628 dsa_doit[testnum] = 0;
2631 #endif /* OPENSSL_NO_DSA */
2633 #ifndef OPENSSL_NO_EC
2634 for (testnum = 0; testnum < ECDSA_NUM; testnum++) {
2637 if (!ecdsa_doit[testnum])
2638 continue; /* Ignore Curve */
2639 for (i = 0; i < loopargs_len; i++) {
2640 loopargs[i].ecdsa[testnum] =
2641 EC_KEY_new_by_curve_name(test_curves[testnum].nid);
2642 if (loopargs[i].ecdsa[testnum] == NULL) {
2648 BIO_printf(bio_err, "ECDSA failure.\n");
2649 ERR_print_errors(bio_err);
2652 for (i = 0; i < loopargs_len; i++) {
2653 EC_KEY_precompute_mult(loopargs[i].ecdsa[testnum], NULL);
2654 /* Perform ECDSA signature test */
2655 EC_KEY_generate_key(loopargs[i].ecdsa[testnum]);
2656 st = ECDSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
2657 &loopargs[i].siglen,
2658 loopargs[i].ecdsa[testnum]);
2664 "ECDSA sign failure. No ECDSA sign will be done.\n");
2665 ERR_print_errors(bio_err);
2668 pkey_print_message("sign", "ecdsa",
2669 ecdsa_c[testnum][0],
2670 test_curves[testnum].bits, seconds.ecdsa);
2672 count = run_benchmark(async_jobs, ECDSA_sign_loop, loopargs);
2676 mr ? "+R5:%ld:%u:%.2f\n" :
2677 "%ld %u bits ECDSA signs in %.2fs \n",
2678 count, test_curves[testnum].bits, d);
2679 ecdsa_results[testnum][0] = (double)count / d;
2683 /* Perform ECDSA verification test */
2684 for (i = 0; i < loopargs_len; i++) {
2685 st = ECDSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
2687 loopargs[i].ecdsa[testnum]);
2693 "ECDSA verify failure. No ECDSA verify will be done.\n");
2694 ERR_print_errors(bio_err);
2695 ecdsa_doit[testnum] = 0;
2697 pkey_print_message("verify", "ecdsa",
2698 ecdsa_c[testnum][1],
2699 test_curves[testnum].bits, seconds.ecdsa);
2701 count = run_benchmark(async_jobs, ECDSA_verify_loop, loopargs);
2704 mr ? "+R6:%ld:%u:%.2f\n"
2705 : "%ld %u bits ECDSA verify in %.2fs\n",
2706 count, test_curves[testnum].bits, d);
2707 ecdsa_results[testnum][1] = (double)count / d;
2710 if (rsa_count <= 1) {
2711 /* if longer than 10s, don't do any more */
2712 for (testnum++; testnum < EC_NUM; testnum++)
2713 ecdsa_doit[testnum] = 0;
2718 for (testnum = 0; testnum < EC_NUM; testnum++) {
2719 int ecdh_checks = 1;
2721 if (!ecdh_doit[testnum])
2724 for (i = 0; i < loopargs_len; i++) {
2725 EVP_PKEY_CTX *kctx = NULL;
2726 EVP_PKEY_CTX *test_ctx = NULL;
2727 EVP_PKEY_CTX *ctx = NULL;
2728 EVP_PKEY *key_A = NULL;
2729 EVP_PKEY *key_B = NULL;
2733 /* Ensure that the error queue is empty */
2734 if (ERR_peek_error()) {
2736 "WARNING: the error queue contains previous unhandled errors.\n");
2737 ERR_print_errors(bio_err);
2740 /* Let's try to create a ctx directly from the NID: this works for
2741 * curves like Curve25519 that are not implemented through the low
2742 * level EC interface.
2743 * If this fails we try creating a EVP_PKEY_EC generic param ctx,
2744 * then we set the curve by NID before deriving the actual keygen
2745 * ctx for that specific curve. */
2746 kctx = EVP_PKEY_CTX_new_id(test_curves[testnum].nid, NULL); /* keygen ctx from NID */
2748 EVP_PKEY_CTX *pctx = NULL;
2749 EVP_PKEY *params = NULL;
2751 /* If we reach this code EVP_PKEY_CTX_new_id() failed and a
2752 * "int_ctx_new:unsupported algorithm" error was added to the
2754 * We remove it from the error queue as we are handling it. */
2755 unsigned long error = ERR_peek_error(); /* peek the latest error in the queue */
2756 if (error == ERR_peek_last_error() && /* oldest and latest errors match */
2757 /* check that the error origin matches */
2758 ERR_GET_LIB(error) == ERR_LIB_EVP &&
2759 ERR_GET_FUNC(error) == EVP_F_INT_CTX_NEW &&
2760 ERR_GET_REASON(error) == EVP_R_UNSUPPORTED_ALGORITHM)
2761 ERR_get_error(); /* pop error from queue */
2762 if (ERR_peek_error()) {
2764 "Unhandled error in the error queue during ECDH init.\n");
2765 ERR_print_errors(bio_err);
2770 if ( /* Create the context for parameter generation */
2771 !(pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL)) ||
2772 /* Initialise the parameter generation */
2773 !EVP_PKEY_paramgen_init(pctx) ||
2774 /* Set the curve by NID */
2775 !EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx,
2778 /* Create the parameter object params */
2779 !EVP_PKEY_paramgen(pctx, ¶ms)) {
2781 BIO_printf(bio_err, "ECDH EC params init failure.\n");
2782 ERR_print_errors(bio_err);
2786 /* Create the context for the key generation */
2787 kctx = EVP_PKEY_CTX_new(params, NULL);
2789 EVP_PKEY_free(params);
2791 EVP_PKEY_CTX_free(pctx);
2794 if (kctx == NULL || /* keygen ctx is not null */
2795 !EVP_PKEY_keygen_init(kctx) /* init keygen ctx */ ) {
2797 BIO_printf(bio_err, "ECDH keygen failure.\n");
2798 ERR_print_errors(bio_err);
2803 if (!EVP_PKEY_keygen(kctx, &key_A) || /* generate secret key A */
2804 !EVP_PKEY_keygen(kctx, &key_B) || /* generate secret key B */
2805 !(ctx = EVP_PKEY_CTX_new(key_A, NULL)) || /* derivation ctx from skeyA */
2806 !EVP_PKEY_derive_init(ctx) || /* init derivation ctx */
2807 !EVP_PKEY_derive_set_peer(ctx, key_B) || /* set peer pubkey in ctx */
2808 !EVP_PKEY_derive(ctx, NULL, &outlen) || /* determine max length */
2809 outlen == 0 || /* ensure outlen is a valid size */
2810 outlen > MAX_ECDH_SIZE /* avoid buffer overflow */ ) {
2812 BIO_printf(bio_err, "ECDH key generation failure.\n");
2813 ERR_print_errors(bio_err);
2818 /* Here we perform a test run, comparing the output of a*B and b*A;
2819 * we try this here and assume that further EVP_PKEY_derive calls
2820 * never fail, so we can skip checks in the actually benchmarked
2821 * code, for maximum performance. */
2822 if (!(test_ctx = EVP_PKEY_CTX_new(key_B, NULL)) || /* test ctx from skeyB */
2823 !EVP_PKEY_derive_init(test_ctx) || /* init derivation test_ctx */
2824 !EVP_PKEY_derive_set_peer(test_ctx, key_A) || /* set peer pubkey in test_ctx */
2825 !EVP_PKEY_derive(test_ctx, NULL, &test_outlen) || /* determine max length */
2826 !EVP_PKEY_derive(ctx, loopargs[i].secret_a, &outlen) || /* compute a*B */
2827 !EVP_PKEY_derive(test_ctx, loopargs[i].secret_b, &test_outlen) || /* compute b*A */
2828 test_outlen != outlen /* compare output length */ ) {
2830 BIO_printf(bio_err, "ECDH computation failure.\n");
2831 ERR_print_errors(bio_err);
2836 /* Compare the computation results: CRYPTO_memcmp() returns 0 if equal */
2837 if (CRYPTO_memcmp(loopargs[i].secret_a,
2838 loopargs[i].secret_b, outlen)) {
2840 BIO_printf(bio_err, "ECDH computations don't match.\n");
2841 ERR_print_errors(bio_err);
2846 loopargs[i].ecdh_ctx[testnum] = ctx;
2847 loopargs[i].outlen[testnum] = outlen;
2849 EVP_PKEY_free(key_A);
2850 EVP_PKEY_free(key_B);
2851 EVP_PKEY_CTX_free(kctx);
2853 EVP_PKEY_CTX_free(test_ctx);
2856 if (ecdh_checks != 0) {
2857 pkey_print_message("", "ecdh",
2859 test_curves[testnum].bits, seconds.ecdh);
2862 run_benchmark(async_jobs, ECDH_EVP_derive_key_loop, loopargs);
2865 mr ? "+R7:%ld:%d:%.2f\n" :
2866 "%ld %u-bits ECDH ops in %.2fs\n", count,
2867 test_curves[testnum].bits, d);
2868 ecdh_results[testnum][0] = (double)count / d;
2872 if (rsa_count <= 1) {
2873 /* if longer than 10s, don't do any more */
2874 for (testnum++; testnum < OSSL_NELEM(ecdh_doit); testnum++)
2875 ecdh_doit[testnum] = 0;
2878 #endif /* OPENSSL_NO_EC */
2883 printf("%s\n", OpenSSL_version(OPENSSL_VERSION));
2884 printf("%s\n", OpenSSL_version(OPENSSL_BUILT_ON));
2886 printf("%s ", BN_options());
2887 #ifndef OPENSSL_NO_MD2
2888 printf("%s ", MD2_options());
2890 #ifndef OPENSSL_NO_RC4
2891 printf("%s ", RC4_options());
2893 #ifndef OPENSSL_NO_DES
2894 printf("%s ", DES_options());
2896 printf("%s ", AES_options());
2897 #ifndef OPENSSL_NO_IDEA
2898 printf("%s ", IDEA_options());
2900 #ifndef OPENSSL_NO_BF
2901 printf("%s ", BF_options());
2903 printf("\n%s\n", OpenSSL_version(OPENSSL_CFLAGS));
2911 ("The 'numbers' are in 1000s of bytes per second processed.\n");
2914 for (testnum = 0; testnum < size_num; testnum++)
2915 printf(mr ? ":%d" : "%7d bytes", lengths[testnum]);
2919 for (k = 0; k < ALGOR_NUM; k++) {
2923 printf("+F:%u:%s", k, names[k]);
2925 printf("%-13s", names[k]);
2926 for (testnum = 0; testnum < size_num; testnum++) {
2927 if (results[k][testnum] > 10000 && !mr)
2928 printf(" %11.2fk", results[k][testnum] / 1e3);
2930 printf(mr ? ":%.2f" : " %11.2f ", results[k][testnum]);
2934 #ifndef OPENSSL_NO_RSA
2936 for (k = 0; k < RSA_NUM; k++) {
2939 if (testnum && !mr) {
2940 printf("%18ssign verify sign/s verify/s\n", " ");
2944 printf("+F2:%u:%u:%f:%f\n",
2945 k, rsa_bits[k], rsa_results[k][0], rsa_results[k][1]);
2947 printf("rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2948 rsa_bits[k], 1.0 / rsa_results[k][0], 1.0 / rsa_results[k][1],
2949 rsa_results[k][0], rsa_results[k][1]);
2952 #ifndef OPENSSL_NO_DSA
2954 for (k = 0; k < DSA_NUM; k++) {
2957 if (testnum && !mr) {
2958 printf("%18ssign verify sign/s verify/s\n", " ");
2962 printf("+F3:%u:%u:%f:%f\n",
2963 k, dsa_bits[k], dsa_results[k][0], dsa_results[k][1]);
2965 printf("dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2966 dsa_bits[k], 1.0 / dsa_results[k][0], 1.0 / dsa_results[k][1],
2967 dsa_results[k][0], dsa_results[k][1]);
2970 #ifndef OPENSSL_NO_EC
2972 for (k = 0; k < OSSL_NELEM(ecdsa_doit); k++) {
2975 if (testnum && !mr) {
2976 printf("%30ssign verify sign/s verify/s\n", " ");
2981 printf("+F4:%u:%u:%f:%f\n",
2982 k, test_curves[k].bits,
2983 ecdsa_results[k][0], ecdsa_results[k][1]);
2985 printf("%4u bits ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2986 test_curves[k].bits, test_curves[k].name,
2987 1.0 / ecdsa_results[k][0], 1.0 / ecdsa_results[k][1],
2988 ecdsa_results[k][0], ecdsa_results[k][1]);
2992 for (k = 0; k < EC_NUM; k++) {
2995 if (testnum && !mr) {
2996 printf("%30sop op/s\n", " ");
3000 printf("+F5:%u:%u:%f:%f\n",
3001 k, test_curves[k].bits,
3002 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
3005 printf("%4u bits ecdh (%s) %8.4fs %8.1f\n",
3006 test_curves[k].bits, test_curves[k].name,
3007 1.0 / ecdh_results[k][0], ecdh_results[k][0]);
3014 ERR_print_errors(bio_err);
3015 for (i = 0; i < loopargs_len; i++) {
3016 OPENSSL_free(loopargs[i].buf_malloc);
3017 OPENSSL_free(loopargs[i].buf2_malloc);
3019 #ifndef OPENSSL_NO_RSA
3020 for (k = 0; k < RSA_NUM; k++)
3021 RSA_free(loopargs[i].rsa_key[k]);
3023 #ifndef OPENSSL_NO_DSA
3024 for (k = 0; k < DSA_NUM; k++)
3025 DSA_free(loopargs[i].dsa_key[k]);
3027 #ifndef OPENSSL_NO_EC
3028 for (k = 0; k < ECDSA_NUM; k++)
3029 EC_KEY_free(loopargs[i].ecdsa[k]);
3030 for (k = 0; k < EC_NUM; k++)
3031 EVP_PKEY_CTX_free(loopargs[i].ecdh_ctx[k]);
3032 OPENSSL_free(loopargs[i].secret_a);
3033 OPENSSL_free(loopargs[i].secret_b);
3037 if (async_jobs > 0) {
3038 for (i = 0; i < loopargs_len; i++)
3039 ASYNC_WAIT_CTX_free(loopargs[i].wait_ctx);
3043 ASYNC_cleanup_thread();
3045 OPENSSL_free(loopargs);
3050 static void print_message(const char *s, long num, int length, int tm)
3054 mr ? "+DT:%s:%d:%d\n"
3055 : "Doing %s for %ds on %d size blocks: ", s, tm, length);
3056 (void)BIO_flush(bio_err);
3060 mr ? "+DN:%s:%ld:%d\n"
3061 : "Doing %s %ld times on %d size blocks: ", s, num, length);
3062 (void)BIO_flush(bio_err);
3066 static void pkey_print_message(const char *str, const char *str2, long num,
3067 unsigned int bits, int tm)
3071 mr ? "+DTP:%d:%s:%s:%d\n"
3072 : "Doing %u bits %s %s's for %ds: ", bits, str, str2, tm);
3073 (void)BIO_flush(bio_err);
3077 mr ? "+DNP:%ld:%d:%s:%s\n"
3078 : "Doing %ld %u bits %s %s's: ", num, bits, str, str2);
3079 (void)BIO_flush(bio_err);
3083 static void print_result(int alg, int run_no, int count, double time_used)
3086 BIO_puts(bio_err, "EVP error!\n");
3090 mr ? "+R:%d:%s:%f\n"
3091 : "%d %s's in %.2fs\n", count, names[alg], time_used);
3092 results[alg][run_no] = ((double)count) / time_used * lengths[run_no];
3096 static char *sstrsep(char **string, const char *delim)
3099 char *token = *string;
3104 memset(isdelim, 0, sizeof(isdelim));
3108 isdelim[(unsigned char)(*delim)] = 1;
3112 while (!isdelim[(unsigned char)(**string)]) {
3124 static int do_multi(int multi, int size_num)
3129 static char sep[] = ":";
3131 fds = malloc(sizeof(*fds) * multi);
3132 for (n = 0; n < multi; ++n) {
3133 if (pipe(fd) == -1) {
3134 BIO_printf(bio_err, "pipe failure\n");
3138 (void)BIO_flush(bio_err);
3145 if (dup(fd[1]) == -1) {
3146 BIO_printf(bio_err, "dup failed\n");
3155 printf("Forked child %d\n", n);
3158 /* for now, assume the pipe is long enough to take all the output */
3159 for (n = 0; n < multi; ++n) {
3164 f = fdopen(fds[n], "r");
3165 while (fgets(buf, sizeof(buf), f)) {
3166 p = strchr(buf, '\n');
3169 if (buf[0] != '+') {
3171 "Don't understand line '%s' from child %d\n", buf,
3175 printf("Got: %s from %d\n", buf, n);
3176 if (strncmp(buf, "+F:", 3) == 0) {
3181 alg = atoi(sstrsep(&p, sep));
3183 for (j = 0; j < size_num; ++j)
3184 results[alg][j] += atof(sstrsep(&p, sep));
3185 } else if (strncmp(buf, "+F2:", 4) == 0) {
3190 k = atoi(sstrsep(&p, sep));
3193 d = atof(sstrsep(&p, sep));
3194 rsa_results[k][0] += d;
3196 d = atof(sstrsep(&p, sep));
3197 rsa_results[k][1] += d;
3199 # ifndef OPENSSL_NO_DSA
3200 else if (strncmp(buf, "+F3:", 4) == 0) {
3205 k = atoi(sstrsep(&p, sep));
3208 d = atof(sstrsep(&p, sep));
3209 dsa_results[k][0] += d;
3211 d = atof(sstrsep(&p, sep));
3212 dsa_results[k][1] += d;
3215 # ifndef OPENSSL_NO_EC
3216 else if (strncmp(buf, "+F4:", 4) == 0) {
3221 k = atoi(sstrsep(&p, sep));
3224 d = atof(sstrsep(&p, sep));
3225 ecdsa_results[k][0] += d;
3227 d = atof(sstrsep(&p, sep));
3228 ecdsa_results[k][1] += d;
3229 } else if (strncmp(buf, "+F5:", 4) == 0) {
3234 k = atoi(sstrsep(&p, sep));
3237 d = atof(sstrsep(&p, sep));
3238 ecdh_results[k][0] += d;
3242 else if (strncmp(buf, "+H:", 3) == 0) {
3245 BIO_printf(bio_err, "Unknown type '%s' from child %d\n", buf,
3256 static void multiblock_speed(const EVP_CIPHER *evp_cipher, int lengths_single,
3257 const openssl_speed_sec_t *seconds)
3259 static const int mblengths_list[] =
3260 { 8 * 1024, 2 * 8 * 1024, 4 * 8 * 1024, 8 * 8 * 1024, 8 * 16 * 1024 };
3261 const int *mblengths = mblengths_list;
3262 int j, count, keylen, num = OSSL_NELEM(mblengths_list);
3263 const char *alg_name;
3264 unsigned char *inp, *out, *key, no_key[32], no_iv[16];
3265 EVP_CIPHER_CTX *ctx;
3268 if (lengths_single) {
3269 mblengths = &lengths_single;
3273 inp = app_malloc(mblengths[num - 1], "multiblock input buffer");
3274 out = app_malloc(mblengths[num - 1] + 1024, "multiblock output buffer");
3275 ctx = EVP_CIPHER_CTX_new();
3276 EVP_EncryptInit_ex(ctx, evp_cipher, NULL, NULL, no_iv);
3278 keylen = EVP_CIPHER_CTX_key_length(ctx);
3279 key = app_malloc(keylen, "evp_cipher key");
3280 EVP_CIPHER_CTX_rand_key(ctx, key);
3281 EVP_EncryptInit_ex(ctx, NULL, NULL, key, NULL);
3282 OPENSSL_clear_free(key, keylen);
3284 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_MAC_KEY, sizeof(no_key), no_key);
3285 alg_name = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
3287 for (j = 0; j < num; j++) {
3288 print_message(alg_name, 0, mblengths[j], seconds->sym);
3290 for (count = 0, run = 1; run && count < 0x7fffffff; count++) {
3291 unsigned char aad[EVP_AEAD_TLS1_AAD_LEN];
3292 EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM mb_param;
3293 size_t len = mblengths[j];
3296 memset(aad, 0, 8); /* avoid uninitialized values */
3297 aad[8] = 23; /* SSL3_RT_APPLICATION_DATA */
3298 aad[9] = 3; /* version */
3300 aad[11] = 0; /* length */
3302 mb_param.out = NULL;
3305 mb_param.interleave = 8;
3307 packlen = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_AAD,
3308 sizeof(mb_param), &mb_param);
3314 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT,
3315 sizeof(mb_param), &mb_param);
3319 RAND_bytes(out, 16);
3321 aad[11] = (unsigned char)(len >> 8);
3322 aad[12] = (unsigned char)(len);
3323 pad = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_TLS1_AAD,
3324 EVP_AEAD_TLS1_AAD_LEN, aad);
3325 EVP_Cipher(ctx, out, inp, len + pad);
3329 BIO_printf(bio_err, mr ? "+R:%d:%s:%f\n"
3330 : "%d %s's in %.2fs\n", count, "evp", d);
3331 results[D_EVP][j] = ((double)count) / d * mblengths[j];
3335 fprintf(stdout, "+H");
3336 for (j = 0; j < num; j++)
3337 fprintf(stdout, ":%d", mblengths[j]);
3338 fprintf(stdout, "\n");
3339 fprintf(stdout, "+F:%d:%s", D_EVP, alg_name);
3340 for (j = 0; j < num; j++)
3341 fprintf(stdout, ":%.2f", results[D_EVP][j]);
3342 fprintf(stdout, "\n");
3345 "The 'numbers' are in 1000s of bytes per second processed.\n");
3346 fprintf(stdout, "type ");
3347 for (j = 0; j < num; j++)
3348 fprintf(stdout, "%7d bytes", mblengths[j]);
3349 fprintf(stdout, "\n");
3350 fprintf(stdout, "%-24s", alg_name);
3352 for (j = 0; j < num; j++) {
3353 if (results[D_EVP][j] > 10000)
3354 fprintf(stdout, " %11.2fk", results[D_EVP][j] / 1e3);
3356 fprintf(stdout, " %11.2f ", results[D_EVP][j]);
3358 fprintf(stdout, "\n");
3363 EVP_CIPHER_CTX_free(ctx);