2 * Copyright 1995-2017 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
23 #include <openssl/crypto.h>
24 #include <openssl/rand.h>
25 #include <openssl/err.h>
26 #include <openssl/evp.h>
27 #include <openssl/objects.h>
28 #include <openssl/async.h>
29 #if !defined(OPENSSL_SYS_MSDOS)
30 # include OPENSSL_UNISTD
37 #include <openssl/bn.h>
38 #ifndef OPENSSL_NO_DES
39 # include <openssl/des.h>
41 #include <openssl/aes.h>
42 #ifndef OPENSSL_NO_CAMELLIA
43 # include <openssl/camellia.h>
45 #ifndef OPENSSL_NO_MD2
46 # include <openssl/md2.h>
48 #ifndef OPENSSL_NO_MDC2
49 # include <openssl/mdc2.h>
51 #ifndef OPENSSL_NO_MD4
52 # include <openssl/md4.h>
54 #ifndef OPENSSL_NO_MD5
55 # include <openssl/md5.h>
57 #include <openssl/hmac.h>
58 #include <openssl/sha.h>
59 #ifndef OPENSSL_NO_RMD160
60 # include <openssl/ripemd.h>
62 #ifndef OPENSSL_NO_WHIRLPOOL
63 # include <openssl/whrlpool.h>
65 #ifndef OPENSSL_NO_RC4
66 # include <openssl/rc4.h>
68 #ifndef OPENSSL_NO_RC5
69 # include <openssl/rc5.h>
71 #ifndef OPENSSL_NO_RC2
72 # include <openssl/rc2.h>
74 #ifndef OPENSSL_NO_IDEA
75 # include <openssl/idea.h>
77 #ifndef OPENSSL_NO_SEED
78 # include <openssl/seed.h>
81 # include <openssl/blowfish.h>
83 #ifndef OPENSSL_NO_CAST
84 # include <openssl/cast.h>
86 #ifndef OPENSSL_NO_RSA
87 # include <openssl/rsa.h>
88 # include "./testrsa.h"
90 #include <openssl/x509.h>
91 #ifndef OPENSSL_NO_DSA
92 # include <openssl/dsa.h>
93 # include "./testdsa.h"
96 # include <openssl/ec.h>
98 #include <openssl/modes.h>
101 # if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS)
114 #define MAX_MISALIGNMENT 63
121 #define MAX_ECDH_SIZE 256
124 typedef struct sec_st {
132 static volatile int run = 0;
135 static int usertime = 1;
137 typedef struct loopargs_st {
138 ASYNC_JOB *inprogress_job;
139 ASYNC_WAIT_CTX *wait_ctx;
142 unsigned char *buf_malloc;
143 unsigned char *buf2_malloc;
146 #ifndef OPENSSL_NO_RSA
147 RSA *rsa_key[RSA_NUM];
149 #ifndef OPENSSL_NO_DSA
150 DSA *dsa_key[DSA_NUM];
152 #ifndef OPENSSL_NO_EC
153 EC_KEY *ecdsa[EC_NUM];
154 EVP_PKEY_CTX *ecdh_ctx[EC_NUM];
155 unsigned char *secret_a;
156 unsigned char *secret_b;
157 size_t outlen[EC_NUM];
161 GCM128_CONTEXT *gcm_ctx;
164 #ifndef OPENSSL_NO_MD2
165 static int EVP_Digest_MD2_loop(void *args);
168 #ifndef OPENSSL_NO_MDC2
169 static int EVP_Digest_MDC2_loop(void *args);
171 #ifndef OPENSSL_NO_MD4
172 static int EVP_Digest_MD4_loop(void *args);
174 #ifndef OPENSSL_NO_MD5
175 static int MD5_loop(void *args);
176 static int HMAC_loop(void *args);
178 static int SHA1_loop(void *args);
179 static int SHA256_loop(void *args);
180 static int SHA512_loop(void *args);
181 #ifndef OPENSSL_NO_WHIRLPOOL
182 static int WHIRLPOOL_loop(void *args);
184 #ifndef OPENSSL_NO_RMD160
185 static int EVP_Digest_RMD160_loop(void *args);
187 #ifndef OPENSSL_NO_RC4
188 static int RC4_loop(void *args);
190 #ifndef OPENSSL_NO_DES
191 static int DES_ncbc_encrypt_loop(void *args);
192 static int DES_ede3_cbc_encrypt_loop(void *args);
194 static int AES_cbc_128_encrypt_loop(void *args);
195 static int AES_cbc_192_encrypt_loop(void *args);
196 static int AES_ige_128_encrypt_loop(void *args);
197 static int AES_cbc_256_encrypt_loop(void *args);
198 static int AES_ige_192_encrypt_loop(void *args);
199 static int AES_ige_256_encrypt_loop(void *args);
200 static int CRYPTO_gcm128_aad_loop(void *args);
201 static int RAND_bytes_loop(void *args);
202 static int EVP_Update_loop(void *args);
203 static int EVP_Update_loop_ccm(void *args);
204 static int EVP_Digest_loop(void *args);
205 #ifndef OPENSSL_NO_RSA
206 static int RSA_sign_loop(void *args);
207 static int RSA_verify_loop(void *args);
209 #ifndef OPENSSL_NO_DSA
210 static int DSA_sign_loop(void *args);
211 static int DSA_verify_loop(void *args);
213 #ifndef OPENSSL_NO_EC
214 static int ECDSA_sign_loop(void *args);
215 static int ECDSA_verify_loop(void *args);
217 static int run_benchmark(int async_jobs, int (*loop_function) (void *),
218 loopargs_t * loopargs);
220 static double Time_F(int s);
221 static void print_message(const char *s, long num, int length, int tm);
222 static void pkey_print_message(const char *str, const char *str2,
223 long num, int bits, int sec);
224 static void print_result(int alg, int run_no, int count, double time_used);
226 static int do_multi(int multi, int size_num);
229 static const int lengths_list[] = {
230 16, 64, 256, 1024, 8 * 1024, 16 * 1024
232 static int lengths_single = 0;
234 static const int *lengths = lengths_list;
236 static const char *names[ALGOR_NUM] = {
237 "md2", "mdc2", "md4", "md5", "hmac(md5)", "sha1", "rmd160", "rc4",
238 "des cbc", "des ede3", "idea cbc", "seed cbc",
239 "rc2 cbc", "rc5-32/12 cbc", "blowfish cbc", "cast cbc",
240 "aes-128 cbc", "aes-192 cbc", "aes-256 cbc",
241 "camellia-128 cbc", "camellia-192 cbc", "camellia-256 cbc",
242 "evp", "sha256", "sha512", "whirlpool",
243 "aes-128 ige", "aes-192 ige", "aes-256 ige", "ghash",
247 static double results[ALGOR_NUM][OSSL_NELEM(lengths_list)];
249 #ifndef OPENSSL_NO_RSA
250 static double rsa_results[RSA_NUM][2];
252 #ifndef OPENSSL_NO_DSA
253 static double dsa_results[DSA_NUM][2];
255 #ifndef OPENSSL_NO_EC
256 static double ecdsa_results[EC_NUM][2];
257 static double ecdh_results[EC_NUM][1];
261 # if defined(__STDC__) || defined(sgi) || defined(_AIX)
262 # define SIGRETTYPE void
264 # define SIGRETTYPE int
267 static SIGRETTYPE sig_done(int sig);
268 static SIGRETTYPE sig_done(int sig)
270 signal(SIGALRM, sig_done);
280 # if !defined(SIGALRM)
283 static unsigned int lapse;
284 static volatile unsigned int schlock;
285 static void alarm_win32(unsigned int secs)
290 # define alarm alarm_win32
292 static DWORD WINAPI sleepy(VOID * arg)
300 static double Time_F(int s)
307 thr = CreateThread(NULL, 4096, sleepy, NULL, 0, NULL);
309 DWORD err = GetLastError();
310 BIO_printf(bio_err, "unable to CreateThread (%lu)", err);
314 Sleep(0); /* scheduler spinlock */
315 ret = app_tminterval(s, usertime);
317 ret = app_tminterval(s, usertime);
319 TerminateThread(thr, 0);
327 static double Time_F(int s)
329 double ret = app_tminterval(s, usertime);
336 static void multiblock_speed(const EVP_CIPHER *evp_cipher,
339 static int found(const char *name, const OPT_PAIR *pairs, int *result)
341 for (; pairs->name; pairs++)
342 if (strcmp(name, pairs->name) == 0) {
343 *result = pairs->retval;
349 typedef enum OPTION_choice {
350 OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
351 OPT_ELAPSED, OPT_EVP, OPT_DECRYPT, OPT_ENGINE, OPT_MULTI,
352 OPT_MR, OPT_MB, OPT_MISALIGN, OPT_ASYNCJOBS, OPT_R_ENUM,
353 OPT_PRIMES, OPT_SECONDS, OPT_BYTES
356 const OPTIONS speed_options[] = {
357 {OPT_HELP_STR, 1, '-', "Usage: %s [options] ciphers...\n"},
358 {OPT_HELP_STR, 1, '-', "Valid options are:\n"},
359 {"help", OPT_HELP, '-', "Display this summary"},
360 {"evp", OPT_EVP, 's', "Use specified EVP cipher"},
361 {"decrypt", OPT_DECRYPT, '-',
362 "Time decryption instead of encryption (only EVP)"},
363 {"mr", OPT_MR, '-', "Produce machine readable output"},
365 "Enable (tls1.1) multi-block mode on evp_cipher requested with -evp"},
366 {"misalign", OPT_MISALIGN, 'n', "Amount to mis-align buffers"},
367 {"elapsed", OPT_ELAPSED, '-',
368 "Measure time in real time instead of CPU user time"},
370 {"multi", OPT_MULTI, 'p', "Run benchmarks in parallel"},
372 #ifndef OPENSSL_NO_ASYNC
373 {"async_jobs", OPT_ASYNCJOBS, 'p',
374 "Enable async mode and start pnum jobs"},
377 #ifndef OPENSSL_NO_ENGINE
378 {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
380 {"primes", OPT_PRIMES, 'p', "Specify number of primes (for RSA only)"},
381 {"seconds", OPT_SECONDS, 'p',
382 "Run benchmarks for pnum seconds"},
383 {"bytes", OPT_BYTES, 'p',
384 "Run cipher, digest and rand benchmarks on pnum bytes"},
398 #define D_CBC_IDEA 10
399 #define D_CBC_SEED 11
403 #define D_CBC_CAST 15
404 #define D_CBC_128_AES 16
405 #define D_CBC_192_AES 17
406 #define D_CBC_256_AES 18
407 #define D_CBC_128_CML 19
408 #define D_CBC_192_CML 20
409 #define D_CBC_256_CML 21
413 #define D_WHIRLPOOL 25
414 #define D_IGE_128_AES 26
415 #define D_IGE_192_AES 27
416 #define D_IGE_256_AES 28
419 static OPT_PAIR doit_choices[] = {
420 #ifndef OPENSSL_NO_MD2
423 #ifndef OPENSSL_NO_MDC2
426 #ifndef OPENSSL_NO_MD4
429 #ifndef OPENSSL_NO_MD5
434 {"sha256", D_SHA256},
435 {"sha512", D_SHA512},
436 #ifndef OPENSSL_NO_WHIRLPOOL
437 {"whirlpool", D_WHIRLPOOL},
439 #ifndef OPENSSL_NO_RMD160
440 {"ripemd", D_RMD160},
441 {"rmd160", D_RMD160},
442 {"ripemd160", D_RMD160},
444 #ifndef OPENSSL_NO_RC4
447 #ifndef OPENSSL_NO_DES
448 {"des-cbc", D_CBC_DES},
449 {"des-ede3", D_EDE3_DES},
451 {"aes-128-cbc", D_CBC_128_AES},
452 {"aes-192-cbc", D_CBC_192_AES},
453 {"aes-256-cbc", D_CBC_256_AES},
454 {"aes-128-ige", D_IGE_128_AES},
455 {"aes-192-ige", D_IGE_192_AES},
456 {"aes-256-ige", D_IGE_256_AES},
457 #ifndef OPENSSL_NO_RC2
458 {"rc2-cbc", D_CBC_RC2},
461 #ifndef OPENSSL_NO_RC5
462 {"rc5-cbc", D_CBC_RC5},
465 #ifndef OPENSSL_NO_IDEA
466 {"idea-cbc", D_CBC_IDEA},
467 {"idea", D_CBC_IDEA},
469 #ifndef OPENSSL_NO_SEED
470 {"seed-cbc", D_CBC_SEED},
471 {"seed", D_CBC_SEED},
473 #ifndef OPENSSL_NO_BF
474 {"bf-cbc", D_CBC_BF},
475 {"blowfish", D_CBC_BF},
478 #ifndef OPENSSL_NO_CAST
479 {"cast-cbc", D_CBC_CAST},
480 {"cast", D_CBC_CAST},
481 {"cast5", D_CBC_CAST},
488 #ifndef OPENSSL_NO_DSA
490 # define R_DSA_1024 1
491 # define R_DSA_2048 2
492 static OPT_PAIR dsa_choices[] = {
493 {"dsa512", R_DSA_512},
494 {"dsa1024", R_DSA_1024},
495 {"dsa2048", R_DSA_2048},
506 #define R_RSA_15360 6
507 static OPT_PAIR rsa_choices[] = {
508 {"rsa512", R_RSA_512},
509 {"rsa1024", R_RSA_1024},
510 {"rsa2048", R_RSA_2048},
511 {"rsa3072", R_RSA_3072},
512 {"rsa4096", R_RSA_4096},
513 {"rsa7680", R_RSA_7680},
514 {"rsa15360", R_RSA_15360},
534 #define R_EC_X25519 16
535 #ifndef OPENSSL_NO_EC
536 static OPT_PAIR ecdsa_choices[] = {
537 {"ecdsap160", R_EC_P160},
538 {"ecdsap192", R_EC_P192},
539 {"ecdsap224", R_EC_P224},
540 {"ecdsap256", R_EC_P256},
541 {"ecdsap384", R_EC_P384},
542 {"ecdsap521", R_EC_P521},
543 {"ecdsak163", R_EC_K163},
544 {"ecdsak233", R_EC_K233},
545 {"ecdsak283", R_EC_K283},
546 {"ecdsak409", R_EC_K409},
547 {"ecdsak571", R_EC_K571},
548 {"ecdsab163", R_EC_B163},
549 {"ecdsab233", R_EC_B233},
550 {"ecdsab283", R_EC_B283},
551 {"ecdsab409", R_EC_B409},
552 {"ecdsab571", R_EC_B571},
556 static OPT_PAIR ecdh_choices[] = {
557 {"ecdhp160", R_EC_P160},
558 {"ecdhp192", R_EC_P192},
559 {"ecdhp224", R_EC_P224},
560 {"ecdhp256", R_EC_P256},
561 {"ecdhp384", R_EC_P384},
562 {"ecdhp521", R_EC_P521},
563 {"ecdhk163", R_EC_K163},
564 {"ecdhk233", R_EC_K233},
565 {"ecdhk283", R_EC_K283},
566 {"ecdhk409", R_EC_K409},
567 {"ecdhk571", R_EC_K571},
568 {"ecdhb163", R_EC_B163},
569 {"ecdhb233", R_EC_B233},
570 {"ecdhb283", R_EC_B283},
571 {"ecdhb409", R_EC_B409},
572 {"ecdhb571", R_EC_B571},
573 {"ecdhx25519", R_EC_X25519},
579 # define COND(d) (count < (d))
580 # define COUNT(d) (d)
582 # define COND(unused_cond) (run && count<0x7fffffff)
583 # define COUNT(d) (count)
588 /* Nb of iterations to do per algorithm and key-size */
589 static long c[ALGOR_NUM][OSSL_NELEM(lengths_list)];
591 #ifndef OPENSSL_NO_MD2
592 static int EVP_Digest_MD2_loop(void *args)
594 loopargs_t *tempargs = *(loopargs_t **) args;
595 unsigned char *buf = tempargs->buf;
596 unsigned char md2[MD2_DIGEST_LENGTH];
599 for (count = 0; COND(c[D_MD2][testnum]); count++) {
600 if (!EVP_Digest(buf, (size_t)lengths[testnum], md2, NULL, EVP_md2(),
608 #ifndef OPENSSL_NO_MDC2
609 static int EVP_Digest_MDC2_loop(void *args)
611 loopargs_t *tempargs = *(loopargs_t **) args;
612 unsigned char *buf = tempargs->buf;
613 unsigned char mdc2[MDC2_DIGEST_LENGTH];
616 for (count = 0; COND(c[D_MDC2][testnum]); count++) {
617 if (!EVP_Digest(buf, (size_t)lengths[testnum], mdc2, NULL, EVP_mdc2(),
625 #ifndef OPENSSL_NO_MD4
626 static int EVP_Digest_MD4_loop(void *args)
628 loopargs_t *tempargs = *(loopargs_t **) args;
629 unsigned char *buf = tempargs->buf;
630 unsigned char md4[MD4_DIGEST_LENGTH];
633 for (count = 0; COND(c[D_MD4][testnum]); count++) {
634 if (!EVP_Digest(buf, (size_t)lengths[testnum], md4, NULL, EVP_md4(),
642 #ifndef OPENSSL_NO_MD5
643 static int MD5_loop(void *args)
645 loopargs_t *tempargs = *(loopargs_t **) args;
646 unsigned char *buf = tempargs->buf;
647 unsigned char md5[MD5_DIGEST_LENGTH];
649 for (count = 0; COND(c[D_MD5][testnum]); count++)
650 MD5(buf, lengths[testnum], md5);
654 static int HMAC_loop(void *args)
656 loopargs_t *tempargs = *(loopargs_t **) args;
657 unsigned char *buf = tempargs->buf;
658 HMAC_CTX *hctx = tempargs->hctx;
659 unsigned char hmac[MD5_DIGEST_LENGTH];
662 for (count = 0; COND(c[D_HMAC][testnum]); count++) {
663 HMAC_Init_ex(hctx, NULL, 0, NULL, NULL);
664 HMAC_Update(hctx, buf, lengths[testnum]);
665 HMAC_Final(hctx, hmac, NULL);
671 static int SHA1_loop(void *args)
673 loopargs_t *tempargs = *(loopargs_t **) args;
674 unsigned char *buf = tempargs->buf;
675 unsigned char sha[SHA_DIGEST_LENGTH];
677 for (count = 0; COND(c[D_SHA1][testnum]); count++)
678 SHA1(buf, lengths[testnum], sha);
682 static int SHA256_loop(void *args)
684 loopargs_t *tempargs = *(loopargs_t **) args;
685 unsigned char *buf = tempargs->buf;
686 unsigned char sha256[SHA256_DIGEST_LENGTH];
688 for (count = 0; COND(c[D_SHA256][testnum]); count++)
689 SHA256(buf, lengths[testnum], sha256);
693 static int SHA512_loop(void *args)
695 loopargs_t *tempargs = *(loopargs_t **) args;
696 unsigned char *buf = tempargs->buf;
697 unsigned char sha512[SHA512_DIGEST_LENGTH];
699 for (count = 0; COND(c[D_SHA512][testnum]); count++)
700 SHA512(buf, lengths[testnum], sha512);
704 #ifndef OPENSSL_NO_WHIRLPOOL
705 static int WHIRLPOOL_loop(void *args)
707 loopargs_t *tempargs = *(loopargs_t **) args;
708 unsigned char *buf = tempargs->buf;
709 unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
711 for (count = 0; COND(c[D_WHIRLPOOL][testnum]); count++)
712 WHIRLPOOL(buf, lengths[testnum], whirlpool);
717 #ifndef OPENSSL_NO_RMD160
718 static int EVP_Digest_RMD160_loop(void *args)
720 loopargs_t *tempargs = *(loopargs_t **) args;
721 unsigned char *buf = tempargs->buf;
722 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
724 for (count = 0; COND(c[D_RMD160][testnum]); count++) {
725 if (!EVP_Digest(buf, (size_t)lengths[testnum], &(rmd160[0]),
726 NULL, EVP_ripemd160(), NULL))
733 #ifndef OPENSSL_NO_RC4
734 static RC4_KEY rc4_ks;
735 static int RC4_loop(void *args)
737 loopargs_t *tempargs = *(loopargs_t **) args;
738 unsigned char *buf = tempargs->buf;
740 for (count = 0; COND(c[D_RC4][testnum]); count++)
741 RC4(&rc4_ks, (size_t)lengths[testnum], buf, buf);
746 #ifndef OPENSSL_NO_DES
747 static unsigned char DES_iv[8];
748 static DES_key_schedule sch;
749 static DES_key_schedule sch2;
750 static DES_key_schedule sch3;
751 static int DES_ncbc_encrypt_loop(void *args)
753 loopargs_t *tempargs = *(loopargs_t **) args;
754 unsigned char *buf = tempargs->buf;
756 for (count = 0; COND(c[D_CBC_DES][testnum]); count++)
757 DES_ncbc_encrypt(buf, buf, lengths[testnum], &sch,
758 &DES_iv, DES_ENCRYPT);
762 static int DES_ede3_cbc_encrypt_loop(void *args)
764 loopargs_t *tempargs = *(loopargs_t **) args;
765 unsigned char *buf = tempargs->buf;
767 for (count = 0; COND(c[D_EDE3_DES][testnum]); count++)
768 DES_ede3_cbc_encrypt(buf, buf, lengths[testnum],
769 &sch, &sch2, &sch3, &DES_iv, DES_ENCRYPT);
774 #define MAX_BLOCK_SIZE 128
776 static unsigned char iv[2 * MAX_BLOCK_SIZE / 8];
777 static AES_KEY aes_ks1, aes_ks2, aes_ks3;
778 static int AES_cbc_128_encrypt_loop(void *args)
780 loopargs_t *tempargs = *(loopargs_t **) args;
781 unsigned char *buf = tempargs->buf;
783 for (count = 0; COND(c[D_CBC_128_AES][testnum]); count++)
784 AES_cbc_encrypt(buf, buf,
785 (size_t)lengths[testnum], &aes_ks1, iv, AES_ENCRYPT);
789 static int AES_cbc_192_encrypt_loop(void *args)
791 loopargs_t *tempargs = *(loopargs_t **) args;
792 unsigned char *buf = tempargs->buf;
794 for (count = 0; COND(c[D_CBC_192_AES][testnum]); count++)
795 AES_cbc_encrypt(buf, buf,
796 (size_t)lengths[testnum], &aes_ks2, iv, AES_ENCRYPT);
800 static int AES_cbc_256_encrypt_loop(void *args)
802 loopargs_t *tempargs = *(loopargs_t **) args;
803 unsigned char *buf = tempargs->buf;
805 for (count = 0; COND(c[D_CBC_256_AES][testnum]); count++)
806 AES_cbc_encrypt(buf, buf,
807 (size_t)lengths[testnum], &aes_ks3, iv, AES_ENCRYPT);
811 static int AES_ige_128_encrypt_loop(void *args)
813 loopargs_t *tempargs = *(loopargs_t **) args;
814 unsigned char *buf = tempargs->buf;
815 unsigned char *buf2 = tempargs->buf2;
817 for (count = 0; COND(c[D_IGE_128_AES][testnum]); count++)
818 AES_ige_encrypt(buf, buf2,
819 (size_t)lengths[testnum], &aes_ks1, iv, AES_ENCRYPT);
823 static int AES_ige_192_encrypt_loop(void *args)
825 loopargs_t *tempargs = *(loopargs_t **) args;
826 unsigned char *buf = tempargs->buf;
827 unsigned char *buf2 = tempargs->buf2;
829 for (count = 0; COND(c[D_IGE_192_AES][testnum]); count++)
830 AES_ige_encrypt(buf, buf2,
831 (size_t)lengths[testnum], &aes_ks2, iv, AES_ENCRYPT);
835 static int AES_ige_256_encrypt_loop(void *args)
837 loopargs_t *tempargs = *(loopargs_t **) args;
838 unsigned char *buf = tempargs->buf;
839 unsigned char *buf2 = tempargs->buf2;
841 for (count = 0; COND(c[D_IGE_256_AES][testnum]); count++)
842 AES_ige_encrypt(buf, buf2,
843 (size_t)lengths[testnum], &aes_ks3, iv, AES_ENCRYPT);
847 static int CRYPTO_gcm128_aad_loop(void *args)
849 loopargs_t *tempargs = *(loopargs_t **) args;
850 unsigned char *buf = tempargs->buf;
851 GCM128_CONTEXT *gcm_ctx = tempargs->gcm_ctx;
853 for (count = 0; COND(c[D_GHASH][testnum]); count++)
854 CRYPTO_gcm128_aad(gcm_ctx, buf, lengths[testnum]);
858 static int RAND_bytes_loop(void *args)
860 loopargs_t *tempargs = *(loopargs_t **) args;
861 unsigned char *buf = tempargs->buf;
864 for (count = 0; COND(c[D_RAND][testnum]); count++)
865 RAND_bytes(buf, lengths[testnum]);
869 static long save_count = 0;
870 static int decrypt = 0;
871 static int EVP_Update_loop(void *args)
873 loopargs_t *tempargs = *(loopargs_t **) args;
874 unsigned char *buf = tempargs->buf;
875 EVP_CIPHER_CTX *ctx = tempargs->ctx;
878 int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
881 for (count = 0; COND(nb_iter); count++) {
882 rc = EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
884 EVP_CipherInit_ex(ctx, NULL, NULL, NULL, iv, -1);
887 for (count = 0; COND(nb_iter); count++) {
888 rc = EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
890 EVP_CipherInit_ex(ctx, NULL, NULL, NULL, iv, -1);
894 EVP_DecryptFinal_ex(ctx, buf, &outl);
896 EVP_EncryptFinal_ex(ctx, buf, &outl);
900 * CCM does not support streaming. For the purpose of performance measurement,
901 * each message is encrypted using the same (key,iv)-pair. Do not use this
902 * code in your application.
904 static int EVP_Update_loop_ccm(void *args)
906 loopargs_t *tempargs = *(loopargs_t **) args;
907 unsigned char *buf = tempargs->buf;
908 EVP_CIPHER_CTX *ctx = tempargs->ctx;
910 unsigned char tag[12];
912 int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
915 for (count = 0; COND(nb_iter); count++) {
916 EVP_DecryptInit_ex(ctx, NULL, NULL, NULL, iv);
917 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, sizeof(tag), tag);
918 EVP_DecryptUpdate(ctx, NULL, &outl, NULL, lengths[testnum]);
919 EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
920 EVP_DecryptFinal_ex(ctx, buf, &outl);
923 for (count = 0; COND(nb_iter); count++) {
924 EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, iv);
925 EVP_EncryptUpdate(ctx, NULL, &outl, NULL, lengths[testnum]);
926 EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
927 EVP_EncryptFinal_ex(ctx, buf, &outl);
933 static const EVP_MD *evp_md = NULL;
934 static int EVP_Digest_loop(void *args)
936 loopargs_t *tempargs = *(loopargs_t **) args;
937 unsigned char *buf = tempargs->buf;
938 unsigned char md[EVP_MAX_MD_SIZE];
941 int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
944 for (count = 0; COND(nb_iter); count++) {
945 if (!EVP_Digest(buf, lengths[testnum], md, NULL, evp_md, NULL))
951 #ifndef OPENSSL_NO_RSA
952 static long rsa_c[RSA_NUM][2]; /* # RSA iteration test */
954 static int RSA_sign_loop(void *args)
956 loopargs_t *tempargs = *(loopargs_t **) args;
957 unsigned char *buf = tempargs->buf;
958 unsigned char *buf2 = tempargs->buf2;
959 unsigned int *rsa_num = &tempargs->siglen;
960 RSA **rsa_key = tempargs->rsa_key;
962 for (count = 0; COND(rsa_c[testnum][0]); count++) {
963 ret = RSA_sign(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
965 BIO_printf(bio_err, "RSA sign failure\n");
966 ERR_print_errors(bio_err);
974 static int RSA_verify_loop(void *args)
976 loopargs_t *tempargs = *(loopargs_t **) args;
977 unsigned char *buf = tempargs->buf;
978 unsigned char *buf2 = tempargs->buf2;
979 unsigned int rsa_num = tempargs->siglen;
980 RSA **rsa_key = tempargs->rsa_key;
982 for (count = 0; COND(rsa_c[testnum][1]); count++) {
984 RSA_verify(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
986 BIO_printf(bio_err, "RSA verify failure\n");
987 ERR_print_errors(bio_err);
996 #ifndef OPENSSL_NO_DSA
997 static long dsa_c[DSA_NUM][2];
998 static int DSA_sign_loop(void *args)
1000 loopargs_t *tempargs = *(loopargs_t **) args;
1001 unsigned char *buf = tempargs->buf;
1002 unsigned char *buf2 = tempargs->buf2;
1003 DSA **dsa_key = tempargs->dsa_key;
1004 unsigned int *siglen = &tempargs->siglen;
1006 for (count = 0; COND(dsa_c[testnum][0]); count++) {
1007 ret = DSA_sign(0, buf, 20, buf2, siglen, dsa_key[testnum]);
1009 BIO_printf(bio_err, "DSA sign failure\n");
1010 ERR_print_errors(bio_err);
1018 static int DSA_verify_loop(void *args)
1020 loopargs_t *tempargs = *(loopargs_t **) args;
1021 unsigned char *buf = tempargs->buf;
1022 unsigned char *buf2 = tempargs->buf2;
1023 DSA **dsa_key = tempargs->dsa_key;
1024 unsigned int siglen = tempargs->siglen;
1026 for (count = 0; COND(dsa_c[testnum][1]); count++) {
1027 ret = DSA_verify(0, buf, 20, buf2, siglen, dsa_key[testnum]);
1029 BIO_printf(bio_err, "DSA verify failure\n");
1030 ERR_print_errors(bio_err);
1039 #ifndef OPENSSL_NO_EC
1040 static long ecdsa_c[EC_NUM][2];
1041 static int ECDSA_sign_loop(void *args)
1043 loopargs_t *tempargs = *(loopargs_t **) args;
1044 unsigned char *buf = tempargs->buf;
1045 EC_KEY **ecdsa = tempargs->ecdsa;
1046 unsigned char *ecdsasig = tempargs->buf2;
1047 unsigned int *ecdsasiglen = &tempargs->siglen;
1049 for (count = 0; COND(ecdsa_c[testnum][0]); count++) {
1050 ret = ECDSA_sign(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[testnum]);
1052 BIO_printf(bio_err, "ECDSA sign failure\n");
1053 ERR_print_errors(bio_err);
1061 static int ECDSA_verify_loop(void *args)
1063 loopargs_t *tempargs = *(loopargs_t **) args;
1064 unsigned char *buf = tempargs->buf;
1065 EC_KEY **ecdsa = tempargs->ecdsa;
1066 unsigned char *ecdsasig = tempargs->buf2;
1067 unsigned int ecdsasiglen = tempargs->siglen;
1069 for (count = 0; COND(ecdsa_c[testnum][1]); count++) {
1070 ret = ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[testnum]);
1072 BIO_printf(bio_err, "ECDSA verify failure\n");
1073 ERR_print_errors(bio_err);
1081 /* ******************************************************************** */
1082 static long ecdh_c[EC_NUM][1];
1084 static int ECDH_EVP_derive_key_loop(void *args)
1086 loopargs_t *tempargs = *(loopargs_t **) args;
1087 EVP_PKEY_CTX *ctx = tempargs->ecdh_ctx[testnum];
1088 unsigned char *derived_secret = tempargs->secret_a;
1090 size_t *outlen = &(tempargs->outlen[testnum]);
1092 for (count = 0; COND(ecdh_c[testnum][0]); count++)
1093 EVP_PKEY_derive(ctx, derived_secret, outlen);
1098 #endif /* OPENSSL_NO_EC */
1100 static int run_benchmark(int async_jobs,
1101 int (*loop_function) (void *), loopargs_t * loopargs)
1103 int job_op_count = 0;
1104 int total_op_count = 0;
1105 int num_inprogress = 0;
1106 int error = 0, i = 0, ret = 0;
1107 OSSL_ASYNC_FD job_fd = 0;
1108 size_t num_job_fds = 0;
1112 if (async_jobs == 0) {
1113 return loop_function((void *)&loopargs);
1116 for (i = 0; i < async_jobs && !error; i++) {
1117 loopargs_t *looparg_item = loopargs + i;
1119 /* Copy pointer content (looparg_t item address) into async context */
1120 ret = ASYNC_start_job(&loopargs[i].inprogress_job, loopargs[i].wait_ctx,
1121 &job_op_count, loop_function,
1122 (void *)&looparg_item, sizeof(looparg_item));
1128 if (job_op_count == -1) {
1131 total_op_count += job_op_count;
1136 BIO_printf(bio_err, "Failure in the job\n");
1137 ERR_print_errors(bio_err);
1143 while (num_inprogress > 0) {
1144 #if defined(OPENSSL_SYS_WINDOWS)
1146 #elif defined(OPENSSL_SYS_UNIX)
1147 int select_result = 0;
1148 OSSL_ASYNC_FD max_fd = 0;
1151 FD_ZERO(&waitfdset);
1153 for (i = 0; i < async_jobs && num_inprogress > 0; i++) {
1154 if (loopargs[i].inprogress_job == NULL)
1157 if (!ASYNC_WAIT_CTX_get_all_fds
1158 (loopargs[i].wait_ctx, NULL, &num_job_fds)
1159 || num_job_fds > 1) {
1160 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1161 ERR_print_errors(bio_err);
1165 ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd,
1167 FD_SET(job_fd, &waitfdset);
1168 if (job_fd > max_fd)
1172 if (max_fd >= (OSSL_ASYNC_FD)FD_SETSIZE) {
1174 "Error: max_fd (%d) must be smaller than FD_SETSIZE (%d). "
1175 "Decrease the value of async_jobs\n",
1176 max_fd, FD_SETSIZE);
1177 ERR_print_errors(bio_err);
1182 select_result = select(max_fd + 1, &waitfdset, NULL, NULL, NULL);
1183 if (select_result == -1 && errno == EINTR)
1186 if (select_result == -1) {
1187 BIO_printf(bio_err, "Failure in the select\n");
1188 ERR_print_errors(bio_err);
1193 if (select_result == 0)
1197 for (i = 0; i < async_jobs; i++) {
1198 if (loopargs[i].inprogress_job == NULL)
1201 if (!ASYNC_WAIT_CTX_get_all_fds
1202 (loopargs[i].wait_ctx, NULL, &num_job_fds)
1203 || num_job_fds > 1) {
1204 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1205 ERR_print_errors(bio_err);
1209 ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd,
1212 #if defined(OPENSSL_SYS_UNIX)
1213 if (num_job_fds == 1 && !FD_ISSET(job_fd, &waitfdset))
1215 #elif defined(OPENSSL_SYS_WINDOWS)
1216 if (num_job_fds == 1
1217 && !PeekNamedPipe(job_fd, NULL, 0, NULL, &avail, NULL)
1222 ret = ASYNC_start_job(&loopargs[i].inprogress_job,
1223 loopargs[i].wait_ctx, &job_op_count,
1224 loop_function, (void *)(loopargs + i),
1225 sizeof(loopargs_t));
1230 if (job_op_count == -1) {
1233 total_op_count += job_op_count;
1236 loopargs[i].inprogress_job = NULL;
1241 loopargs[i].inprogress_job = NULL;
1242 BIO_printf(bio_err, "Failure in the job\n");
1243 ERR_print_errors(bio_err);
1250 return error ? -1 : total_op_count;
1253 int speed_main(int argc, char **argv)
1256 int (*loopfunc)(void *args);
1257 loopargs_t *loopargs = NULL;
1259 int loopargs_len = 0;
1261 const char *engine_id = NULL;
1262 const EVP_CIPHER *evp_cipher = NULL;
1265 int multiblock = 0, pr_header = 0;
1266 int doit[ALGOR_NUM] = { 0 };
1267 int ret = 1, i, k, misalign = 0;
1269 int size_num = OSSL_NELEM(lengths_list);
1274 unsigned int async_jobs = 0;
1275 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) \
1276 || !defined(OPENSSL_NO_EC)
1280 /* What follows are the buffers and key material. */
1281 #ifndef OPENSSL_NO_RC5
1284 #ifndef OPENSSL_NO_RC2
1287 #ifndef OPENSSL_NO_IDEA
1288 IDEA_KEY_SCHEDULE idea_ks;
1290 #ifndef OPENSSL_NO_SEED
1291 SEED_KEY_SCHEDULE seed_ks;
1293 #ifndef OPENSSL_NO_BF
1296 #ifndef OPENSSL_NO_CAST
1299 static const unsigned char key16[16] = {
1300 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1301 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
1303 static const unsigned char key24[24] = {
1304 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1305 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1306 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1308 static const unsigned char key32[32] = {
1309 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1310 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1311 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
1312 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
1314 #ifndef OPENSSL_NO_CAMELLIA
1315 static const unsigned char ckey24[24] = {
1316 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1317 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1318 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1320 static const unsigned char ckey32[32] = {
1321 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1322 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1323 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
1324 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
1326 CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3;
1328 #ifndef OPENSSL_NO_DES
1329 static DES_cblock key = {
1330 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0
1332 static DES_cblock key2 = {
1333 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
1335 static DES_cblock key3 = {
1336 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1339 #ifndef OPENSSL_NO_RSA
1340 static const unsigned int rsa_bits[RSA_NUM] = {
1341 512, 1024, 2048, 3072, 4096, 7680, 15360
1343 static const unsigned char *rsa_data[RSA_NUM] = {
1344 test512, test1024, test2048, test3072, test4096, test7680, test15360
1346 static const int rsa_data_length[RSA_NUM] = {
1347 sizeof(test512), sizeof(test1024),
1348 sizeof(test2048), sizeof(test3072),
1349 sizeof(test4096), sizeof(test7680),
1352 int rsa_doit[RSA_NUM] = { 0 };
1353 int primes = RSA_DEFAULT_PRIME_NUM;
1355 #ifndef OPENSSL_NO_DSA
1356 static const unsigned int dsa_bits[DSA_NUM] = { 512, 1024, 2048 };
1357 int dsa_doit[DSA_NUM] = { 0 };
1359 #ifndef OPENSSL_NO_EC
1361 * We only test over the following curves as they are representative, To
1362 * add tests over more curves, simply add the curve NID and curve name to
1363 * the following arrays and increase the EC_NUM value accordingly.
1365 static const unsigned int test_curves[EC_NUM] = {
1367 NID_secp160r1, NID_X9_62_prime192v1, NID_secp224r1,
1368 NID_X9_62_prime256v1, NID_secp384r1, NID_secp521r1,
1370 NID_sect163k1, NID_sect233k1, NID_sect283k1,
1371 NID_sect409k1, NID_sect571k1, NID_sect163r2,
1372 NID_sect233r1, NID_sect283r1, NID_sect409r1,
1377 static const char *test_curves_names[EC_NUM] = {
1379 "secp160r1", "nistp192", "nistp224",
1380 "nistp256", "nistp384", "nistp521",
1382 "nistk163", "nistk233", "nistk283",
1383 "nistk409", "nistk571", "nistb163",
1384 "nistb233", "nistb283", "nistb409",
1389 static const int test_curves_bits[EC_NUM] = {
1395 571, 253 /* X25519 */
1398 int ecdsa_doit[EC_NUM] = { 0 };
1399 int ecdh_doit[EC_NUM] = { 0 };
1400 #endif /* ndef OPENSSL_NO_EC */
1402 SEC seconds = {SECONDS, RSA_SECONDS, DSA_SECONDS, ECDSA_SECONDS,
1405 prog = opt_init(argc, argv, speed_options);
1406 while ((o = opt_next()) != OPT_EOF) {
1411 BIO_printf(bio_err, "%s: Use -help for summary.\n", prog);
1414 opt_help(speed_options);
1422 evp_cipher = EVP_get_cipherbyname(opt_arg());
1423 if (evp_cipher == NULL)
1424 evp_md = EVP_get_digestbyname(opt_arg());
1425 if (evp_cipher == NULL && evp_md == NULL) {
1427 "%s: %s is an unknown cipher or digest\n",
1438 * In a forked execution, an engine might need to be
1439 * initialised by each child process, not by the parent.
1440 * So store the name here and run setup_engine() later on.
1442 engine_id = opt_arg();
1446 multi = atoi(opt_arg());
1450 #ifndef OPENSSL_NO_ASYNC
1451 async_jobs = atoi(opt_arg());
1452 if (!ASYNC_is_capable()) {
1454 "%s: async_jobs specified but async not supported\n",
1458 if (async_jobs > 99999) {
1460 "%s: too many async_jobs\n",
1467 if (!opt_int(opt_arg(), &misalign))
1469 if (misalign > MISALIGN) {
1471 "%s: Maximum offset is %d\n", prog, MISALIGN);
1480 #ifdef OPENSSL_NO_MULTIBLOCK
1482 "%s: -mb specified but multi-block support is disabled\n",
1492 if (!opt_int(opt_arg(), &primes))
1496 seconds.sym = seconds.rsa = seconds.dsa = seconds.ecdsa
1497 = seconds.ecdh = atoi(opt_arg());
1500 lengths_single = atoi(opt_arg());
1501 lengths = &lengths_single;
1506 argc = opt_num_rest();
1509 /* Remaining arguments are algorithms. */
1510 for (; *argv; argv++) {
1511 if (found(*argv, doit_choices, &i)) {
1515 #ifndef OPENSSL_NO_DES
1516 if (strcmp(*argv, "des") == 0) {
1517 doit[D_CBC_DES] = doit[D_EDE3_DES] = 1;
1521 if (strcmp(*argv, "sha") == 0) {
1522 doit[D_SHA1] = doit[D_SHA256] = doit[D_SHA512] = 1;
1525 #ifndef OPENSSL_NO_RSA
1526 if (strcmp(*argv, "openssl") == 0)
1528 if (strcmp(*argv, "rsa") == 0) {
1529 rsa_doit[R_RSA_512] = rsa_doit[R_RSA_1024] =
1530 rsa_doit[R_RSA_2048] = rsa_doit[R_RSA_3072] =
1531 rsa_doit[R_RSA_4096] = rsa_doit[R_RSA_7680] =
1532 rsa_doit[R_RSA_15360] = 1;
1535 if (found(*argv, rsa_choices, &i)) {
1540 #ifndef OPENSSL_NO_DSA
1541 if (strcmp(*argv, "dsa") == 0) {
1542 dsa_doit[R_DSA_512] = dsa_doit[R_DSA_1024] =
1543 dsa_doit[R_DSA_2048] = 1;
1546 if (found(*argv, dsa_choices, &i)) {
1551 if (strcmp(*argv, "aes") == 0) {
1552 doit[D_CBC_128_AES] = doit[D_CBC_192_AES] = doit[D_CBC_256_AES] = 1;
1555 #ifndef OPENSSL_NO_CAMELLIA
1556 if (strcmp(*argv, "camellia") == 0) {
1557 doit[D_CBC_128_CML] = doit[D_CBC_192_CML] = doit[D_CBC_256_CML] = 1;
1561 #ifndef OPENSSL_NO_EC
1562 if (strcmp(*argv, "ecdsa") == 0) {
1563 for (i = 0; i < EC_NUM; i++)
1567 if (found(*argv, ecdsa_choices, &i)) {
1571 if (strcmp(*argv, "ecdh") == 0) {
1572 for (i = 0; i < EC_NUM; i++)
1576 if (found(*argv, ecdh_choices, &i)) {
1581 BIO_printf(bio_err, "%s: Unknown algorithm %s\n", prog, *argv);
1585 /* Initialize the job pool if async mode is enabled */
1586 if (async_jobs > 0) {
1587 async_init = ASYNC_init_thread(async_jobs, async_jobs);
1589 BIO_printf(bio_err, "Error creating the ASYNC job pool\n");
1594 loopargs_len = (async_jobs == 0 ? 1 : async_jobs);
1596 app_malloc(loopargs_len * sizeof(loopargs_t), "array of loopargs");
1597 memset(loopargs, 0, loopargs_len * sizeof(loopargs_t));
1599 for (i = 0; i < loopargs_len; i++) {
1600 if (async_jobs > 0) {
1601 loopargs[i].wait_ctx = ASYNC_WAIT_CTX_new();
1602 if (loopargs[i].wait_ctx == NULL) {
1603 BIO_printf(bio_err, "Error creating the ASYNC_WAIT_CTX\n");
1608 loopargs[i].buf_malloc =
1609 app_malloc(lengths[size_num - 1] + MAX_MISALIGNMENT + 1,
1611 loopargs[i].buf2_malloc =
1612 app_malloc(lengths[size_num - 1] + MAX_MISALIGNMENT + 1,
1614 /* Align the start of buffers on a 64 byte boundary */
1615 loopargs[i].buf = loopargs[i].buf_malloc + misalign;
1616 loopargs[i].buf2 = loopargs[i].buf2_malloc + misalign;
1617 #ifndef OPENSSL_NO_EC
1618 loopargs[i].secret_a = app_malloc(MAX_ECDH_SIZE, "ECDH secret a");
1619 loopargs[i].secret_b = app_malloc(MAX_ECDH_SIZE, "ECDH secret b");
1624 if (multi && do_multi(multi, size_num))
1628 /* Initialize the engine after the fork */
1629 e = setup_engine(engine_id, 0);
1631 /* No parameters; turn on everything. */
1632 if ((argc == 0) && !doit[D_EVP]) {
1633 for (i = 0; i < ALGOR_NUM; i++)
1636 #ifndef OPENSSL_NO_RSA
1637 for (i = 0; i < RSA_NUM; i++)
1640 #ifndef OPENSSL_NO_DSA
1641 for (i = 0; i < DSA_NUM; i++)
1644 #ifndef OPENSSL_NO_EC
1645 for (i = 0; i < EC_NUM; i++)
1647 for (i = 0; i < EC_NUM; i++)
1651 for (i = 0; i < ALGOR_NUM; i++)
1655 if (usertime == 0 && !mr)
1657 "You have chosen to measure elapsed time "
1658 "instead of user CPU time.\n");
1660 #ifndef OPENSSL_NO_RSA
1661 for (i = 0; i < loopargs_len; i++) {
1662 if (primes > RSA_DEFAULT_PRIME_NUM) {
1663 /* for multi-prime RSA, skip this */
1666 for (k = 0; k < RSA_NUM; k++) {
1667 const unsigned char *p;
1670 loopargs[i].rsa_key[k] =
1671 d2i_RSAPrivateKey(NULL, &p, rsa_data_length[k]);
1672 if (loopargs[i].rsa_key[k] == NULL) {
1674 "internal error loading RSA key number %d\n", k);
1680 #ifndef OPENSSL_NO_DSA
1681 for (i = 0; i < loopargs_len; i++) {
1682 loopargs[i].dsa_key[0] = get_dsa(512);
1683 loopargs[i].dsa_key[1] = get_dsa(1024);
1684 loopargs[i].dsa_key[2] = get_dsa(2048);
1687 #ifndef OPENSSL_NO_DES
1688 DES_set_key_unchecked(&key, &sch);
1689 DES_set_key_unchecked(&key2, &sch2);
1690 DES_set_key_unchecked(&key3, &sch3);
1692 AES_set_encrypt_key(key16, 128, &aes_ks1);
1693 AES_set_encrypt_key(key24, 192, &aes_ks2);
1694 AES_set_encrypt_key(key32, 256, &aes_ks3);
1695 #ifndef OPENSSL_NO_CAMELLIA
1696 Camellia_set_key(key16, 128, &camellia_ks1);
1697 Camellia_set_key(ckey24, 192, &camellia_ks2);
1698 Camellia_set_key(ckey32, 256, &camellia_ks3);
1700 #ifndef OPENSSL_NO_IDEA
1701 IDEA_set_encrypt_key(key16, &idea_ks);
1703 #ifndef OPENSSL_NO_SEED
1704 SEED_set_key(key16, &seed_ks);
1706 #ifndef OPENSSL_NO_RC4
1707 RC4_set_key(&rc4_ks, 16, key16);
1709 #ifndef OPENSSL_NO_RC2
1710 RC2_set_key(&rc2_ks, 16, key16, 128);
1712 #ifndef OPENSSL_NO_RC5
1713 RC5_32_set_key(&rc5_ks, 16, key16, 12);
1715 #ifndef OPENSSL_NO_BF
1716 BF_set_key(&bf_ks, 16, key16);
1718 #ifndef OPENSSL_NO_CAST
1719 CAST_set_key(&cast_ks, 16, key16);
1722 # ifndef OPENSSL_NO_DES
1723 BIO_printf(bio_err, "First we calculate the approximate speed ...\n");
1729 for (it = count; it; it--)
1730 DES_ecb_encrypt((DES_cblock *)loopargs[0].buf,
1731 (DES_cblock *)loopargs[0].buf, &sch, DES_ENCRYPT);
1735 c[D_MD2][0] = count / 10;
1736 c[D_MDC2][0] = count / 10;
1737 c[D_MD4][0] = count;
1738 c[D_MD5][0] = count;
1739 c[D_HMAC][0] = count;
1740 c[D_SHA1][0] = count;
1741 c[D_RMD160][0] = count;
1742 c[D_RC4][0] = count * 5;
1743 c[D_CBC_DES][0] = count;
1744 c[D_EDE3_DES][0] = count / 3;
1745 c[D_CBC_IDEA][0] = count;
1746 c[D_CBC_SEED][0] = count;
1747 c[D_CBC_RC2][0] = count;
1748 c[D_CBC_RC5][0] = count;
1749 c[D_CBC_BF][0] = count;
1750 c[D_CBC_CAST][0] = count;
1751 c[D_CBC_128_AES][0] = count;
1752 c[D_CBC_192_AES][0] = count;
1753 c[D_CBC_256_AES][0] = count;
1754 c[D_CBC_128_CML][0] = count;
1755 c[D_CBC_192_CML][0] = count;
1756 c[D_CBC_256_CML][0] = count;
1757 c[D_SHA256][0] = count;
1758 c[D_SHA512][0] = count;
1759 c[D_WHIRLPOOL][0] = count;
1760 c[D_IGE_128_AES][0] = count;
1761 c[D_IGE_192_AES][0] = count;
1762 c[D_IGE_256_AES][0] = count;
1763 c[D_GHASH][0] = count;
1764 c[D_RAND][0] = count;
1766 for (i = 1; i < size_num; i++) {
1769 l0 = (long)lengths[0];
1770 l1 = (long)lengths[i];
1772 c[D_MD2][i] = c[D_MD2][0] * 4 * l0 / l1;
1773 c[D_MDC2][i] = c[D_MDC2][0] * 4 * l0 / l1;
1774 c[D_MD4][i] = c[D_MD4][0] * 4 * l0 / l1;
1775 c[D_MD5][i] = c[D_MD5][0] * 4 * l0 / l1;
1776 c[D_HMAC][i] = c[D_HMAC][0] * 4 * l0 / l1;
1777 c[D_SHA1][i] = c[D_SHA1][0] * 4 * l0 / l1;
1778 c[D_RMD160][i] = c[D_RMD160][0] * 4 * l0 / l1;
1779 c[D_SHA256][i] = c[D_SHA256][0] * 4 * l0 / l1;
1780 c[D_SHA512][i] = c[D_SHA512][0] * 4 * l0 / l1;
1781 c[D_WHIRLPOOL][i] = c[D_WHIRLPOOL][0] * 4 * l0 / l1;
1782 c[D_GHASH][i] = c[D_GHASH][0] * 4 * l0 / l1;
1783 c[D_RAND][i] = c[D_RAND][0] * 4 * l0 / l1;
1785 l0 = (long)lengths[i - 1];
1787 c[D_RC4][i] = c[D_RC4][i - 1] * l0 / l1;
1788 c[D_CBC_DES][i] = c[D_CBC_DES][i - 1] * l0 / l1;
1789 c[D_EDE3_DES][i] = c[D_EDE3_DES][i - 1] * l0 / l1;
1790 c[D_CBC_IDEA][i] = c[D_CBC_IDEA][i - 1] * l0 / l1;
1791 c[D_CBC_SEED][i] = c[D_CBC_SEED][i - 1] * l0 / l1;
1792 c[D_CBC_RC2][i] = c[D_CBC_RC2][i - 1] * l0 / l1;
1793 c[D_CBC_RC5][i] = c[D_CBC_RC5][i - 1] * l0 / l1;
1794 c[D_CBC_BF][i] = c[D_CBC_BF][i - 1] * l0 / l1;
1795 c[D_CBC_CAST][i] = c[D_CBC_CAST][i - 1] * l0 / l1;
1796 c[D_CBC_128_AES][i] = c[D_CBC_128_AES][i - 1] * l0 / l1;
1797 c[D_CBC_192_AES][i] = c[D_CBC_192_AES][i - 1] * l0 / l1;
1798 c[D_CBC_256_AES][i] = c[D_CBC_256_AES][i - 1] * l0 / l1;
1799 c[D_CBC_128_CML][i] = c[D_CBC_128_CML][i - 1] * l0 / l1;
1800 c[D_CBC_192_CML][i] = c[D_CBC_192_CML][i - 1] * l0 / l1;
1801 c[D_CBC_256_CML][i] = c[D_CBC_256_CML][i - 1] * l0 / l1;
1802 c[D_IGE_128_AES][i] = c[D_IGE_128_AES][i - 1] * l0 / l1;
1803 c[D_IGE_192_AES][i] = c[D_IGE_192_AES][i - 1] * l0 / l1;
1804 c[D_IGE_256_AES][i] = c[D_IGE_256_AES][i - 1] * l0 / l1;
1807 # ifndef OPENSSL_NO_RSA
1808 rsa_c[R_RSA_512][0] = count / 2000;
1809 rsa_c[R_RSA_512][1] = count / 400;
1810 for (i = 1; i < RSA_NUM; i++) {
1811 rsa_c[i][0] = rsa_c[i - 1][0] / 8;
1812 rsa_c[i][1] = rsa_c[i - 1][1] / 4;
1813 if (rsa_doit[i] <= 1 && rsa_c[i][0] == 0)
1816 if (rsa_c[i][0] == 0) {
1817 rsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
1824 # ifndef OPENSSL_NO_DSA
1825 dsa_c[R_DSA_512][0] = count / 1000;
1826 dsa_c[R_DSA_512][1] = count / 1000 / 2;
1827 for (i = 1; i < DSA_NUM; i++) {
1828 dsa_c[i][0] = dsa_c[i - 1][0] / 4;
1829 dsa_c[i][1] = dsa_c[i - 1][1] / 4;
1830 if (dsa_doit[i] <= 1 && dsa_c[i][0] == 0)
1833 if (dsa_c[i][0] == 0) {
1834 dsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
1841 # ifndef OPENSSL_NO_EC
1842 ecdsa_c[R_EC_P160][0] = count / 1000;
1843 ecdsa_c[R_EC_P160][1] = count / 1000 / 2;
1844 for (i = R_EC_P192; i <= R_EC_P521; i++) {
1845 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1846 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1847 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1850 if (ecdsa_c[i][0] == 0) {
1856 ecdsa_c[R_EC_K163][0] = count / 1000;
1857 ecdsa_c[R_EC_K163][1] = count / 1000 / 2;
1858 for (i = R_EC_K233; i <= R_EC_K571; i++) {
1859 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1860 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1861 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1864 if (ecdsa_c[i][0] == 0) {
1870 ecdsa_c[R_EC_B163][0] = count / 1000;
1871 ecdsa_c[R_EC_B163][1] = count / 1000 / 2;
1872 for (i = R_EC_B233; i <= R_EC_B571; i++) {
1873 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1874 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1875 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1878 if (ecdsa_c[i][0] == 0) {
1885 ecdh_c[R_EC_P160][0] = count / 1000;
1886 for (i = R_EC_P192; i <= R_EC_P521; i++) {
1887 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1888 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1891 if (ecdh_c[i][0] == 0) {
1896 ecdh_c[R_EC_K163][0] = count / 1000;
1897 for (i = R_EC_K233; i <= R_EC_K571; i++) {
1898 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1899 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1902 if (ecdh_c[i][0] == 0) {
1907 ecdh_c[R_EC_B163][0] = count / 1000;
1908 for (i = R_EC_B233; i <= R_EC_B571; i++) {
1909 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1910 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1913 if (ecdh_c[i][0] == 0) {
1921 /* not worth fixing */
1922 # error "You cannot disable DES on systems without SIGALRM."
1923 # endif /* OPENSSL_NO_DES */
1926 signal(SIGALRM, sig_done);
1928 #endif /* SIGALRM */
1930 #ifndef OPENSSL_NO_MD2
1932 for (testnum = 0; testnum < size_num; testnum++) {
1933 print_message(names[D_MD2], c[D_MD2][testnum], lengths[testnum],
1936 count = run_benchmark(async_jobs, EVP_Digest_MD2_loop, loopargs);
1938 print_result(D_MD2, testnum, count, d);
1942 #ifndef OPENSSL_NO_MDC2
1944 for (testnum = 0; testnum < size_num; testnum++) {
1945 print_message(names[D_MDC2], c[D_MDC2][testnum], lengths[testnum],
1948 count = run_benchmark(async_jobs, EVP_Digest_MDC2_loop, loopargs);
1950 print_result(D_MDC2, testnum, count, d);
1955 #ifndef OPENSSL_NO_MD4
1957 for (testnum = 0; testnum < size_num; testnum++) {
1958 print_message(names[D_MD4], c[D_MD4][testnum], lengths[testnum],
1961 count = run_benchmark(async_jobs, EVP_Digest_MD4_loop, loopargs);
1963 print_result(D_MD4, testnum, count, d);
1968 #ifndef OPENSSL_NO_MD5
1970 for (testnum = 0; testnum < size_num; testnum++) {
1971 print_message(names[D_MD5], c[D_MD5][testnum], lengths[testnum],
1974 count = run_benchmark(async_jobs, MD5_loop, loopargs);
1976 print_result(D_MD5, testnum, count, d);
1981 static const char hmac_key[] = "This is a key...";
1982 int len = strlen(hmac_key);
1984 for (i = 0; i < loopargs_len; i++) {
1985 loopargs[i].hctx = HMAC_CTX_new();
1986 if (loopargs[i].hctx == NULL) {
1987 BIO_printf(bio_err, "HMAC malloc failure, exiting...");
1991 HMAC_Init_ex(loopargs[i].hctx, hmac_key, len, EVP_md5(), NULL);
1993 for (testnum = 0; testnum < size_num; testnum++) {
1994 print_message(names[D_HMAC], c[D_HMAC][testnum], lengths[testnum],
1997 count = run_benchmark(async_jobs, HMAC_loop, loopargs);
1999 print_result(D_HMAC, testnum, count, d);
2001 for (i = 0; i < loopargs_len; i++) {
2002 HMAC_CTX_free(loopargs[i].hctx);
2007 for (testnum = 0; testnum < size_num; testnum++) {
2008 print_message(names[D_SHA1], c[D_SHA1][testnum], lengths[testnum],
2011 count = run_benchmark(async_jobs, SHA1_loop, loopargs);
2013 print_result(D_SHA1, testnum, count, d);
2016 if (doit[D_SHA256]) {
2017 for (testnum = 0; testnum < size_num; testnum++) {
2018 print_message(names[D_SHA256], c[D_SHA256][testnum],
2019 lengths[testnum], seconds.sym);
2021 count = run_benchmark(async_jobs, SHA256_loop, loopargs);
2023 print_result(D_SHA256, testnum, count, d);
2026 if (doit[D_SHA512]) {
2027 for (testnum = 0; testnum < size_num; testnum++) {
2028 print_message(names[D_SHA512], c[D_SHA512][testnum],
2029 lengths[testnum], seconds.sym);
2031 count = run_benchmark(async_jobs, SHA512_loop, loopargs);
2033 print_result(D_SHA512, testnum, count, d);
2036 #ifndef OPENSSL_NO_WHIRLPOOL
2037 if (doit[D_WHIRLPOOL]) {
2038 for (testnum = 0; testnum < size_num; testnum++) {
2039 print_message(names[D_WHIRLPOOL], c[D_WHIRLPOOL][testnum],
2040 lengths[testnum], seconds.sym);
2042 count = run_benchmark(async_jobs, WHIRLPOOL_loop, loopargs);
2044 print_result(D_WHIRLPOOL, testnum, count, d);
2049 #ifndef OPENSSL_NO_RMD160
2050 if (doit[D_RMD160]) {
2051 for (testnum = 0; testnum < size_num; testnum++) {
2052 print_message(names[D_RMD160], c[D_RMD160][testnum],
2053 lengths[testnum], seconds.sym);
2055 count = run_benchmark(async_jobs, EVP_Digest_RMD160_loop, loopargs);
2057 print_result(D_RMD160, testnum, count, d);
2061 #ifndef OPENSSL_NO_RC4
2063 for (testnum = 0; testnum < size_num; testnum++) {
2064 print_message(names[D_RC4], c[D_RC4][testnum], lengths[testnum],
2067 count = run_benchmark(async_jobs, RC4_loop, loopargs);
2069 print_result(D_RC4, testnum, count, d);
2073 #ifndef OPENSSL_NO_DES
2074 if (doit[D_CBC_DES]) {
2075 for (testnum = 0; testnum < size_num; testnum++) {
2076 print_message(names[D_CBC_DES], c[D_CBC_DES][testnum],
2077 lengths[testnum], seconds.sym);
2079 count = run_benchmark(async_jobs, DES_ncbc_encrypt_loop, loopargs);
2081 print_result(D_CBC_DES, testnum, count, d);
2085 if (doit[D_EDE3_DES]) {
2086 for (testnum = 0; testnum < size_num; testnum++) {
2087 print_message(names[D_EDE3_DES], c[D_EDE3_DES][testnum],
2088 lengths[testnum], seconds.sym);
2091 run_benchmark(async_jobs, DES_ede3_cbc_encrypt_loop, loopargs);
2093 print_result(D_EDE3_DES, testnum, count, d);
2098 if (doit[D_CBC_128_AES]) {
2099 for (testnum = 0; testnum < size_num; testnum++) {
2100 print_message(names[D_CBC_128_AES], c[D_CBC_128_AES][testnum],
2101 lengths[testnum], seconds.sym);
2104 run_benchmark(async_jobs, AES_cbc_128_encrypt_loop, loopargs);
2106 print_result(D_CBC_128_AES, testnum, count, d);
2109 if (doit[D_CBC_192_AES]) {
2110 for (testnum = 0; testnum < size_num; testnum++) {
2111 print_message(names[D_CBC_192_AES], c[D_CBC_192_AES][testnum],
2112 lengths[testnum], seconds.sym);
2115 run_benchmark(async_jobs, AES_cbc_192_encrypt_loop, loopargs);
2117 print_result(D_CBC_192_AES, testnum, count, d);
2120 if (doit[D_CBC_256_AES]) {
2121 for (testnum = 0; testnum < size_num; testnum++) {
2122 print_message(names[D_CBC_256_AES], c[D_CBC_256_AES][testnum],
2123 lengths[testnum], seconds.sym);
2126 run_benchmark(async_jobs, AES_cbc_256_encrypt_loop, loopargs);
2128 print_result(D_CBC_256_AES, testnum, count, d);
2132 if (doit[D_IGE_128_AES]) {
2133 for (testnum = 0; testnum < size_num; testnum++) {
2134 print_message(names[D_IGE_128_AES], c[D_IGE_128_AES][testnum],
2135 lengths[testnum], seconds.sym);
2138 run_benchmark(async_jobs, AES_ige_128_encrypt_loop, loopargs);
2140 print_result(D_IGE_128_AES, testnum, count, d);
2143 if (doit[D_IGE_192_AES]) {
2144 for (testnum = 0; testnum < size_num; testnum++) {
2145 print_message(names[D_IGE_192_AES], c[D_IGE_192_AES][testnum],
2146 lengths[testnum], seconds.sym);
2149 run_benchmark(async_jobs, AES_ige_192_encrypt_loop, loopargs);
2151 print_result(D_IGE_192_AES, testnum, count, d);
2154 if (doit[D_IGE_256_AES]) {
2155 for (testnum = 0; testnum < size_num; testnum++) {
2156 print_message(names[D_IGE_256_AES], c[D_IGE_256_AES][testnum],
2157 lengths[testnum], seconds.sym);
2160 run_benchmark(async_jobs, AES_ige_256_encrypt_loop, loopargs);
2162 print_result(D_IGE_256_AES, testnum, count, d);
2165 if (doit[D_GHASH]) {
2166 for (i = 0; i < loopargs_len; i++) {
2167 loopargs[i].gcm_ctx =
2168 CRYPTO_gcm128_new(&aes_ks1, (block128_f) AES_encrypt);
2169 CRYPTO_gcm128_setiv(loopargs[i].gcm_ctx,
2170 (unsigned char *)"0123456789ab", 12);
2173 for (testnum = 0; testnum < size_num; testnum++) {
2174 print_message(names[D_GHASH], c[D_GHASH][testnum],
2175 lengths[testnum], seconds.sym);
2177 count = run_benchmark(async_jobs, CRYPTO_gcm128_aad_loop, loopargs);
2179 print_result(D_GHASH, testnum, count, d);
2181 for (i = 0; i < loopargs_len; i++)
2182 CRYPTO_gcm128_release(loopargs[i].gcm_ctx);
2184 #ifndef OPENSSL_NO_CAMELLIA
2185 if (doit[D_CBC_128_CML]) {
2186 if (async_jobs > 0) {
2187 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2188 names[D_CBC_128_CML]);
2189 doit[D_CBC_128_CML] = 0;
2191 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2192 print_message(names[D_CBC_128_CML], c[D_CBC_128_CML][testnum],
2193 lengths[testnum], seconds.sym);
2195 for (count = 0, run = 1; COND(c[D_CBC_128_CML][testnum]); count++)
2196 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2197 (size_t)lengths[testnum], &camellia_ks1,
2198 iv, CAMELLIA_ENCRYPT);
2200 print_result(D_CBC_128_CML, testnum, count, d);
2203 if (doit[D_CBC_192_CML]) {
2204 if (async_jobs > 0) {
2205 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2206 names[D_CBC_192_CML]);
2207 doit[D_CBC_192_CML] = 0;
2209 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2210 print_message(names[D_CBC_192_CML], c[D_CBC_192_CML][testnum],
2211 lengths[testnum], seconds.sym);
2212 if (async_jobs > 0) {
2213 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2217 for (count = 0, run = 1; COND(c[D_CBC_192_CML][testnum]); count++)
2218 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2219 (size_t)lengths[testnum], &camellia_ks2,
2220 iv, CAMELLIA_ENCRYPT);
2222 print_result(D_CBC_192_CML, testnum, count, d);
2225 if (doit[D_CBC_256_CML]) {
2226 if (async_jobs > 0) {
2227 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2228 names[D_CBC_256_CML]);
2229 doit[D_CBC_256_CML] = 0;
2231 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2232 print_message(names[D_CBC_256_CML], c[D_CBC_256_CML][testnum],
2233 lengths[testnum], seconds.sym);
2235 for (count = 0, run = 1; COND(c[D_CBC_256_CML][testnum]); count++)
2236 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2237 (size_t)lengths[testnum], &camellia_ks3,
2238 iv, CAMELLIA_ENCRYPT);
2240 print_result(D_CBC_256_CML, testnum, count, d);
2244 #ifndef OPENSSL_NO_IDEA
2245 if (doit[D_CBC_IDEA]) {
2246 if (async_jobs > 0) {
2247 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2249 doit[D_CBC_IDEA] = 0;
2251 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2252 print_message(names[D_CBC_IDEA], c[D_CBC_IDEA][testnum],
2253 lengths[testnum], seconds.sym);
2255 for (count = 0, run = 1; COND(c[D_CBC_IDEA][testnum]); count++)
2256 IDEA_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2257 (size_t)lengths[testnum], &idea_ks,
2260 print_result(D_CBC_IDEA, testnum, count, d);
2264 #ifndef OPENSSL_NO_SEED
2265 if (doit[D_CBC_SEED]) {
2266 if (async_jobs > 0) {
2267 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2269 doit[D_CBC_SEED] = 0;
2271 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2272 print_message(names[D_CBC_SEED], c[D_CBC_SEED][testnum],
2273 lengths[testnum], seconds.sym);
2275 for (count = 0, run = 1; COND(c[D_CBC_SEED][testnum]); count++)
2276 SEED_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2277 (size_t)lengths[testnum], &seed_ks, iv, 1);
2279 print_result(D_CBC_SEED, testnum, count, d);
2283 #ifndef OPENSSL_NO_RC2
2284 if (doit[D_CBC_RC2]) {
2285 if (async_jobs > 0) {
2286 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2288 doit[D_CBC_RC2] = 0;
2290 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2291 print_message(names[D_CBC_RC2], c[D_CBC_RC2][testnum],
2292 lengths[testnum], seconds.sym);
2293 if (async_jobs > 0) {
2294 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2298 for (count = 0, run = 1; COND(c[D_CBC_RC2][testnum]); count++)
2299 RC2_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2300 (size_t)lengths[testnum], &rc2_ks,
2303 print_result(D_CBC_RC2, testnum, count, d);
2307 #ifndef OPENSSL_NO_RC5
2308 if (doit[D_CBC_RC5]) {
2309 if (async_jobs > 0) {
2310 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2312 doit[D_CBC_RC5] = 0;
2314 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2315 print_message(names[D_CBC_RC5], c[D_CBC_RC5][testnum],
2316 lengths[testnum], seconds.sym);
2317 if (async_jobs > 0) {
2318 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2322 for (count = 0, run = 1; COND(c[D_CBC_RC5][testnum]); count++)
2323 RC5_32_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2324 (size_t)lengths[testnum], &rc5_ks,
2327 print_result(D_CBC_RC5, testnum, count, d);
2331 #ifndef OPENSSL_NO_BF
2332 if (doit[D_CBC_BF]) {
2333 if (async_jobs > 0) {
2334 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2338 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2339 print_message(names[D_CBC_BF], c[D_CBC_BF][testnum],
2340 lengths[testnum], seconds.sym);
2342 for (count = 0, run = 1; COND(c[D_CBC_BF][testnum]); count++)
2343 BF_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2344 (size_t)lengths[testnum], &bf_ks,
2347 print_result(D_CBC_BF, testnum, count, d);
2351 #ifndef OPENSSL_NO_CAST
2352 if (doit[D_CBC_CAST]) {
2353 if (async_jobs > 0) {
2354 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2356 doit[D_CBC_CAST] = 0;
2358 for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
2359 print_message(names[D_CBC_CAST], c[D_CBC_CAST][testnum],
2360 lengths[testnum], seconds.sym);
2362 for (count = 0, run = 1; COND(c[D_CBC_CAST][testnum]); count++)
2363 CAST_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2364 (size_t)lengths[testnum], &cast_ks,
2367 print_result(D_CBC_CAST, testnum, count, d);
2372 for (testnum = 0; testnum < size_num; testnum++) {
2373 print_message(names[D_RAND], c[D_RAND][testnum], lengths[testnum],
2376 count = run_benchmark(async_jobs, RAND_bytes_loop, loopargs);
2378 print_result(D_RAND, testnum, count, d);
2383 if (multiblock && evp_cipher) {
2385 (EVP_CIPHER_flags(evp_cipher) &
2386 EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) {
2387 BIO_printf(bio_err, "%s is not multi-block capable\n",
2388 OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher)));
2391 if (async_jobs > 0) {
2392 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2395 multiblock_speed(evp_cipher, &seconds);
2399 for (testnum = 0; testnum < size_num; testnum++) {
2402 names[D_EVP] = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
2404 * -O3 -fschedule-insns messes up an optimization here!
2405 * names[D_EVP] somehow becomes NULL
2407 print_message(names[D_EVP], save_count, lengths[testnum],
2410 for (k = 0; k < loopargs_len; k++) {
2411 loopargs[k].ctx = EVP_CIPHER_CTX_new();
2412 EVP_CipherInit_ex(loopargs[k].ctx, evp_cipher, NULL, NULL,
2413 iv, decrypt ? 0 : 1);
2415 EVP_CIPHER_CTX_set_padding(loopargs[k].ctx, 0);
2417 keylen = EVP_CIPHER_CTX_key_length(loopargs[k].ctx);
2418 loopargs[k].key = app_malloc(keylen, "evp_cipher key");
2419 EVP_CIPHER_CTX_rand_key(loopargs[k].ctx, loopargs[k].key);
2420 EVP_CipherInit_ex(loopargs[k].ctx, NULL, NULL,
2421 loopargs[k].key, NULL, -1);
2422 OPENSSL_clear_free(loopargs[k].key, keylen);
2424 switch (EVP_CIPHER_mode(evp_cipher)) {
2425 case EVP_CIPH_CCM_MODE:
2426 loopfunc = EVP_Update_loop_ccm;
2429 loopfunc = EVP_Update_loop;
2433 count = run_benchmark(async_jobs, loopfunc, loopargs);
2435 for (k = 0; k < loopargs_len; k++) {
2436 EVP_CIPHER_CTX_free(loopargs[k].ctx);
2440 names[D_EVP] = OBJ_nid2ln(EVP_MD_type(evp_md));
2441 print_message(names[D_EVP], save_count, lengths[testnum],
2444 count = run_benchmark(async_jobs, EVP_Digest_loop, loopargs);
2447 print_result(D_EVP, testnum, count, d);
2451 for (i = 0; i < loopargs_len; i++)
2452 RAND_bytes(loopargs[i].buf, 36);
2454 #ifndef OPENSSL_NO_RSA
2455 for (testnum = 0; testnum < RSA_NUM; testnum++) {
2457 if (!rsa_doit[testnum])
2459 for (i = 0; i < loopargs_len; i++) {
2461 /* we haven't set keys yet, generate multi-prime RSA keys */
2462 BIGNUM *bn = BN_new();
2466 if (!BN_set_word(bn, RSA_F4)) {
2471 BIO_printf(bio_err, "Generate multi-prime RSA key for %s\n",
2472 rsa_choices[testnum].name);
2474 loopargs[i].rsa_key[testnum] = RSA_new();
2475 if (loopargs[i].rsa_key[testnum] == NULL) {
2480 if (!RSA_generate_multi_prime_key(loopargs[i].rsa_key[testnum],
2482 primes, bn, NULL)) {
2488 st = RSA_sign(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
2489 &loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
2495 "RSA sign failure. No RSA sign will be done.\n");
2496 ERR_print_errors(bio_err);
2499 pkey_print_message("private", "rsa",
2500 rsa_c[testnum][0], rsa_bits[testnum],
2502 /* RSA_blinding_on(rsa_key[testnum],NULL); */
2504 count = run_benchmark(async_jobs, RSA_sign_loop, loopargs);
2507 mr ? "+R1:%ld:%d:%.2f\n"
2508 : "%ld %d bit private RSA's in %.2fs\n",
2509 count, rsa_bits[testnum], d);
2510 rsa_results[testnum][0] = (double)count / d;
2514 for (i = 0; i < loopargs_len; i++) {
2515 st = RSA_verify(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
2516 loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
2522 "RSA verify failure. No RSA verify will be done.\n");
2523 ERR_print_errors(bio_err);
2524 rsa_doit[testnum] = 0;
2526 pkey_print_message("public", "rsa",
2527 rsa_c[testnum][1], rsa_bits[testnum],
2530 count = run_benchmark(async_jobs, RSA_verify_loop, loopargs);
2533 mr ? "+R2:%ld:%d:%.2f\n"
2534 : "%ld %d bit public RSA's in %.2fs\n",
2535 count, rsa_bits[testnum], d);
2536 rsa_results[testnum][1] = (double)count / d;
2539 if (rsa_count <= 1) {
2540 /* if longer than 10s, don't do any more */
2541 for (testnum++; testnum < RSA_NUM; testnum++)
2542 rsa_doit[testnum] = 0;
2545 #endif /* OPENSSL_NO_RSA */
2547 for (i = 0; i < loopargs_len; i++)
2548 RAND_bytes(loopargs[i].buf, 36);
2550 #ifndef OPENSSL_NO_DSA
2551 for (testnum = 0; testnum < DSA_NUM; testnum++) {
2553 if (!dsa_doit[testnum])
2556 /* DSA_generate_key(dsa_key[testnum]); */
2557 /* DSA_sign_setup(dsa_key[testnum],NULL); */
2558 for (i = 0; i < loopargs_len; i++) {
2559 st = DSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
2560 &loopargs[i].siglen, loopargs[i].dsa_key[testnum]);
2566 "DSA sign failure. No DSA sign will be done.\n");
2567 ERR_print_errors(bio_err);
2570 pkey_print_message("sign", "dsa",
2571 dsa_c[testnum][0], dsa_bits[testnum],
2574 count = run_benchmark(async_jobs, DSA_sign_loop, loopargs);
2577 mr ? "+R3:%ld:%d:%.2f\n"
2578 : "%ld %d bit DSA signs in %.2fs\n",
2579 count, dsa_bits[testnum], d);
2580 dsa_results[testnum][0] = (double)count / d;
2584 for (i = 0; i < loopargs_len; i++) {
2585 st = DSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
2586 loopargs[i].siglen, loopargs[i].dsa_key[testnum]);
2592 "DSA verify failure. No DSA verify will be done.\n");
2593 ERR_print_errors(bio_err);
2594 dsa_doit[testnum] = 0;
2596 pkey_print_message("verify", "dsa",
2597 dsa_c[testnum][1], dsa_bits[testnum],
2600 count = run_benchmark(async_jobs, DSA_verify_loop, loopargs);
2603 mr ? "+R4:%ld:%d:%.2f\n"
2604 : "%ld %d bit DSA verify in %.2fs\n",
2605 count, dsa_bits[testnum], d);
2606 dsa_results[testnum][1] = (double)count / d;
2609 if (rsa_count <= 1) {
2610 /* if longer than 10s, don't do any more */
2611 for (testnum++; testnum < DSA_NUM; testnum++)
2612 dsa_doit[testnum] = 0;
2615 #endif /* OPENSSL_NO_DSA */
2617 #ifndef OPENSSL_NO_EC
2618 for (testnum = 0; testnum < EC_NUM; testnum++) {
2621 if (!ecdsa_doit[testnum])
2622 continue; /* Ignore Curve */
2623 for (i = 0; i < loopargs_len; i++) {
2624 loopargs[i].ecdsa[testnum] =
2625 EC_KEY_new_by_curve_name(test_curves[testnum]);
2626 if (loopargs[i].ecdsa[testnum] == NULL) {
2632 BIO_printf(bio_err, "ECDSA failure.\n");
2633 ERR_print_errors(bio_err);
2636 for (i = 0; i < loopargs_len; i++) {
2637 EC_KEY_precompute_mult(loopargs[i].ecdsa[testnum], NULL);
2638 /* Perform ECDSA signature test */
2639 EC_KEY_generate_key(loopargs[i].ecdsa[testnum]);
2640 st = ECDSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
2641 &loopargs[i].siglen,
2642 loopargs[i].ecdsa[testnum]);
2648 "ECDSA sign failure. No ECDSA sign will be done.\n");
2649 ERR_print_errors(bio_err);
2652 pkey_print_message("sign", "ecdsa",
2653 ecdsa_c[testnum][0],
2654 test_curves_bits[testnum],
2657 count = run_benchmark(async_jobs, ECDSA_sign_loop, loopargs);
2661 mr ? "+R5:%ld:%d:%.2f\n" :
2662 "%ld %d bit ECDSA signs in %.2fs \n",
2663 count, test_curves_bits[testnum], d);
2664 ecdsa_results[testnum][0] = (double)count / d;
2668 /* Perform ECDSA verification test */
2669 for (i = 0; i < loopargs_len; i++) {
2670 st = ECDSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
2672 loopargs[i].ecdsa[testnum]);
2678 "ECDSA verify failure. No ECDSA verify will be done.\n");
2679 ERR_print_errors(bio_err);
2680 ecdsa_doit[testnum] = 0;
2682 pkey_print_message("verify", "ecdsa",
2683 ecdsa_c[testnum][1],
2684 test_curves_bits[testnum],
2687 count = run_benchmark(async_jobs, ECDSA_verify_loop, loopargs);
2690 mr ? "+R6:%ld:%d:%.2f\n"
2691 : "%ld %d bit ECDSA verify in %.2fs\n",
2692 count, test_curves_bits[testnum], d);
2693 ecdsa_results[testnum][1] = (double)count / d;
2696 if (rsa_count <= 1) {
2697 /* if longer than 10s, don't do any more */
2698 for (testnum++; testnum < EC_NUM; testnum++)
2699 ecdsa_doit[testnum] = 0;
2704 for (testnum = 0; testnum < EC_NUM; testnum++) {
2705 int ecdh_checks = 1;
2707 if (!ecdh_doit[testnum])
2710 for (i = 0; i < loopargs_len; i++) {
2711 EVP_PKEY_CTX *kctx = NULL;
2712 EVP_PKEY_CTX *test_ctx = NULL;
2713 EVP_PKEY_CTX *ctx = NULL;
2714 EVP_PKEY *key_A = NULL;
2715 EVP_PKEY *key_B = NULL;
2719 /* Ensure that the error queue is empty */
2720 if (ERR_peek_error()) {
2722 "WARNING: the error queue contains previous unhandled errors.\n");
2723 ERR_print_errors(bio_err);
2726 /* Let's try to create a ctx directly from the NID: this works for
2727 * curves like Curve25519 that are not implemented through the low
2728 * level EC interface.
2729 * If this fails we try creating a EVP_PKEY_EC generic param ctx,
2730 * then we set the curve by NID before deriving the actual keygen
2731 * ctx for that specific curve. */
2732 kctx = EVP_PKEY_CTX_new_id(test_curves[testnum], NULL); /* keygen ctx from NID */
2734 EVP_PKEY_CTX *pctx = NULL;
2735 EVP_PKEY *params = NULL;
2737 /* If we reach this code EVP_PKEY_CTX_new_id() failed and a
2738 * "int_ctx_new:unsupported algorithm" error was added to the
2740 * We remove it from the error queue as we are handling it. */
2741 unsigned long error = ERR_peek_error(); /* peek the latest error in the queue */
2742 if (error == ERR_peek_last_error() && /* oldest and latest errors match */
2743 /* check that the error origin matches */
2744 ERR_GET_LIB(error) == ERR_LIB_EVP &&
2745 ERR_GET_FUNC(error) == EVP_F_INT_CTX_NEW &&
2746 ERR_GET_REASON(error) == EVP_R_UNSUPPORTED_ALGORITHM)
2747 ERR_get_error(); /* pop error from queue */
2748 if (ERR_peek_error()) {
2750 "Unhandled error in the error queue during ECDH init.\n");
2751 ERR_print_errors(bio_err);
2756 if ( /* Create the context for parameter generation */
2757 !(pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL)) ||
2758 /* Initialise the parameter generation */
2759 !EVP_PKEY_paramgen_init(pctx) ||
2760 /* Set the curve by NID */
2761 !EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx,
2764 /* Create the parameter object params */
2765 !EVP_PKEY_paramgen(pctx, ¶ms)) {
2767 BIO_printf(bio_err, "ECDH EC params init failure.\n");
2768 ERR_print_errors(bio_err);
2772 /* Create the context for the key generation */
2773 kctx = EVP_PKEY_CTX_new(params, NULL);
2775 EVP_PKEY_free(params);
2777 EVP_PKEY_CTX_free(pctx);
2780 if (kctx == NULL || /* keygen ctx is not null */
2781 !EVP_PKEY_keygen_init(kctx) /* init keygen ctx */ ) {
2783 BIO_printf(bio_err, "ECDH keygen failure.\n");
2784 ERR_print_errors(bio_err);
2789 if (!EVP_PKEY_keygen(kctx, &key_A) || /* generate secret key A */
2790 !EVP_PKEY_keygen(kctx, &key_B) || /* generate secret key B */
2791 !(ctx = EVP_PKEY_CTX_new(key_A, NULL)) || /* derivation ctx from skeyA */
2792 !EVP_PKEY_derive_init(ctx) || /* init derivation ctx */
2793 !EVP_PKEY_derive_set_peer(ctx, key_B) || /* set peer pubkey in ctx */
2794 !EVP_PKEY_derive(ctx, NULL, &outlen) || /* determine max length */
2795 outlen == 0 || /* ensure outlen is a valid size */
2796 outlen > MAX_ECDH_SIZE /* avoid buffer overflow */ ) {
2798 BIO_printf(bio_err, "ECDH key generation failure.\n");
2799 ERR_print_errors(bio_err);
2804 /* Here we perform a test run, comparing the output of a*B and b*A;
2805 * we try this here and assume that further EVP_PKEY_derive calls
2806 * never fail, so we can skip checks in the actually benchmarked
2807 * code, for maximum performance. */
2808 if (!(test_ctx = EVP_PKEY_CTX_new(key_B, NULL)) || /* test ctx from skeyB */
2809 !EVP_PKEY_derive_init(test_ctx) || /* init derivation test_ctx */
2810 !EVP_PKEY_derive_set_peer(test_ctx, key_A) || /* set peer pubkey in test_ctx */
2811 !EVP_PKEY_derive(test_ctx, NULL, &test_outlen) || /* determine max length */
2812 !EVP_PKEY_derive(ctx, loopargs[i].secret_a, &outlen) || /* compute a*B */
2813 !EVP_PKEY_derive(test_ctx, loopargs[i].secret_b, &test_outlen) || /* compute b*A */
2814 test_outlen != outlen /* compare output length */ ) {
2816 BIO_printf(bio_err, "ECDH computation failure.\n");
2817 ERR_print_errors(bio_err);
2822 /* Compare the computation results: CRYPTO_memcmp() returns 0 if equal */
2823 if (CRYPTO_memcmp(loopargs[i].secret_a,
2824 loopargs[i].secret_b, outlen)) {
2826 BIO_printf(bio_err, "ECDH computations don't match.\n");
2827 ERR_print_errors(bio_err);
2832 loopargs[i].ecdh_ctx[testnum] = ctx;
2833 loopargs[i].outlen[testnum] = outlen;
2835 EVP_PKEY_free(key_A);
2836 EVP_PKEY_free(key_B);
2837 EVP_PKEY_CTX_free(kctx);
2839 EVP_PKEY_CTX_free(test_ctx);
2842 if (ecdh_checks != 0) {
2843 pkey_print_message("", "ecdh",
2845 test_curves_bits[testnum],
2849 run_benchmark(async_jobs, ECDH_EVP_derive_key_loop, loopargs);
2852 mr ? "+R7:%ld:%d:%.2f\n" :
2853 "%ld %d-bit ECDH ops in %.2fs\n", count,
2854 test_curves_bits[testnum], d);
2855 ecdh_results[testnum][0] = (double)count / d;
2859 if (rsa_count <= 1) {
2860 /* if longer than 10s, don't do any more */
2861 for (testnum++; testnum < EC_NUM; testnum++)
2862 ecdh_doit[testnum] = 0;
2865 #endif /* OPENSSL_NO_EC */
2870 printf("%s\n", OpenSSL_version(OPENSSL_VERSION));
2871 printf("%s\n", OpenSSL_version(OPENSSL_BUILT_ON));
2873 printf("%s ", BN_options());
2874 #ifndef OPENSSL_NO_MD2
2875 printf("%s ", MD2_options());
2877 #ifndef OPENSSL_NO_RC4
2878 printf("%s ", RC4_options());
2880 #ifndef OPENSSL_NO_DES
2881 printf("%s ", DES_options());
2883 printf("%s ", AES_options());
2884 #ifndef OPENSSL_NO_IDEA
2885 printf("%s ", IDEA_options());
2887 #ifndef OPENSSL_NO_BF
2888 printf("%s ", BF_options());
2890 printf("\n%s\n", OpenSSL_version(OPENSSL_CFLAGS));
2898 ("The 'numbers' are in 1000s of bytes per second processed.\n");
2901 for (testnum = 0; testnum < size_num; testnum++)
2902 printf(mr ? ":%d" : "%7d bytes", lengths[testnum]);
2906 for (k = 0; k < ALGOR_NUM; k++) {
2910 printf("+F:%d:%s", k, names[k]);
2912 printf("%-13s", names[k]);
2913 for (testnum = 0; testnum < size_num; testnum++) {
2914 if (results[k][testnum] > 10000 && !mr)
2915 printf(" %11.2fk", results[k][testnum] / 1e3);
2917 printf(mr ? ":%.2f" : " %11.2f ", results[k][testnum]);
2921 #ifndef OPENSSL_NO_RSA
2923 for (k = 0; k < RSA_NUM; k++) {
2926 if (testnum && !mr) {
2927 printf("%18ssign verify sign/s verify/s\n", " ");
2931 printf("+F2:%u:%u:%f:%f\n",
2932 k, rsa_bits[k], rsa_results[k][0], rsa_results[k][1]);
2934 printf("rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2935 rsa_bits[k], 1.0 / rsa_results[k][0], 1.0 / rsa_results[k][1],
2936 rsa_results[k][0], rsa_results[k][1]);
2939 #ifndef OPENSSL_NO_DSA
2941 for (k = 0; k < DSA_NUM; k++) {
2944 if (testnum && !mr) {
2945 printf("%18ssign verify sign/s verify/s\n", " ");
2949 printf("+F3:%u:%u:%f:%f\n",
2950 k, dsa_bits[k], dsa_results[k][0], dsa_results[k][1]);
2952 printf("dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2953 dsa_bits[k], 1.0 / dsa_results[k][0], 1.0 / dsa_results[k][1],
2954 dsa_results[k][0], dsa_results[k][1]);
2957 #ifndef OPENSSL_NO_EC
2959 for (k = 0; k < EC_NUM; k++) {
2962 if (testnum && !mr) {
2963 printf("%30ssign verify sign/s verify/s\n", " ");
2968 printf("+F4:%u:%u:%f:%f\n",
2969 k, test_curves_bits[k],
2970 ecdsa_results[k][0], ecdsa_results[k][1]);
2972 printf("%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2973 test_curves_bits[k],
2974 test_curves_names[k],
2975 1.0 / ecdsa_results[k][0], 1.0 / ecdsa_results[k][1],
2976 ecdsa_results[k][0], ecdsa_results[k][1]);
2980 for (k = 0; k < EC_NUM; k++) {
2983 if (testnum && !mr) {
2984 printf("%30sop op/s\n", " ");
2988 printf("+F5:%u:%u:%f:%f\n",
2989 k, test_curves_bits[k],
2990 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
2993 printf("%4u bit ecdh (%s) %8.4fs %8.1f\n",
2994 test_curves_bits[k],
2995 test_curves_names[k],
2996 1.0 / ecdh_results[k][0], ecdh_results[k][0]);
3003 ERR_print_errors(bio_err);
3004 for (i = 0; i < loopargs_len; i++) {
3005 OPENSSL_free(loopargs[i].buf_malloc);
3006 OPENSSL_free(loopargs[i].buf2_malloc);
3008 #ifndef OPENSSL_NO_RSA
3009 for (k = 0; k < RSA_NUM; k++)
3010 RSA_free(loopargs[i].rsa_key[k]);
3012 #ifndef OPENSSL_NO_DSA
3013 for (k = 0; k < DSA_NUM; k++)
3014 DSA_free(loopargs[i].dsa_key[k]);
3016 #ifndef OPENSSL_NO_EC
3017 for (k = 0; k < EC_NUM; k++) {
3018 EC_KEY_free(loopargs[i].ecdsa[k]);
3019 EVP_PKEY_CTX_free(loopargs[i].ecdh_ctx[k]);
3021 OPENSSL_free(loopargs[i].secret_a);
3022 OPENSSL_free(loopargs[i].secret_b);
3026 if (async_jobs > 0) {
3027 for (i = 0; i < loopargs_len; i++)
3028 ASYNC_WAIT_CTX_free(loopargs[i].wait_ctx);
3032 ASYNC_cleanup_thread();
3034 OPENSSL_free(loopargs);
3039 static void print_message(const char *s, long num, int length, int tm)
3043 mr ? "+DT:%s:%d:%d\n"
3044 : "Doing %s for %ds on %d size blocks: ", s, tm, length);
3045 (void)BIO_flush(bio_err);
3049 mr ? "+DN:%s:%ld:%d\n"
3050 : "Doing %s %ld times on %d size blocks: ", s, num, length);
3051 (void)BIO_flush(bio_err);
3055 static void pkey_print_message(const char *str, const char *str2, long num,
3060 mr ? "+DTP:%d:%s:%s:%d\n"
3061 : "Doing %d bit %s %s's for %ds: ", bits, str, str2, tm);
3062 (void)BIO_flush(bio_err);
3066 mr ? "+DNP:%ld:%d:%s:%s\n"
3067 : "Doing %ld %d bit %s %s's: ", num, bits, str, str2);
3068 (void)BIO_flush(bio_err);
3072 static void print_result(int alg, int run_no, int count, double time_used)
3075 BIO_puts(bio_err, "EVP error!\n");
3079 mr ? "+R:%d:%s:%f\n"
3080 : "%d %s's in %.2fs\n", count, names[alg], time_used);
3081 results[alg][run_no] = ((double)count) / time_used * lengths[run_no];
3085 static char *sstrsep(char **string, const char *delim)
3088 char *token = *string;
3093 memset(isdelim, 0, sizeof(isdelim));
3097 isdelim[(unsigned char)(*delim)] = 1;
3101 while (!isdelim[(unsigned char)(**string)]) {
3113 static int do_multi(int multi, int size_num)
3118 static char sep[] = ":";
3120 fds = malloc(sizeof(*fds) * multi);
3121 for (n = 0; n < multi; ++n) {
3122 if (pipe(fd) == -1) {
3123 BIO_printf(bio_err, "pipe failure\n");
3127 (void)BIO_flush(bio_err);
3134 if (dup(fd[1]) == -1) {
3135 BIO_printf(bio_err, "dup failed\n");
3144 printf("Forked child %d\n", n);
3147 /* for now, assume the pipe is long enough to take all the output */
3148 for (n = 0; n < multi; ++n) {
3153 f = fdopen(fds[n], "r");
3154 while (fgets(buf, sizeof(buf), f)) {
3155 p = strchr(buf, '\n');
3158 if (buf[0] != '+') {
3160 "Don't understand line '%s' from child %d\n", buf,
3164 printf("Got: %s from %d\n", buf, n);
3165 if (strncmp(buf, "+F:", 3) == 0) {
3170 alg = atoi(sstrsep(&p, sep));
3172 for (j = 0; j < size_num; ++j)
3173 results[alg][j] += atof(sstrsep(&p, sep));
3174 } else if (strncmp(buf, "+F2:", 4) == 0) {
3179 k = atoi(sstrsep(&p, sep));
3182 d = atof(sstrsep(&p, sep));
3183 rsa_results[k][0] += d;
3185 d = atof(sstrsep(&p, sep));
3186 rsa_results[k][1] += d;
3188 # ifndef OPENSSL_NO_DSA
3189 else if (strncmp(buf, "+F3:", 4) == 0) {
3194 k = atoi(sstrsep(&p, sep));
3197 d = atof(sstrsep(&p, sep));
3198 dsa_results[k][0] += d;
3200 d = atof(sstrsep(&p, sep));
3201 dsa_results[k][1] += d;
3204 # ifndef OPENSSL_NO_EC
3205 else if (strncmp(buf, "+F4:", 4) == 0) {
3210 k = atoi(sstrsep(&p, sep));
3213 d = atof(sstrsep(&p, sep));
3214 ecdsa_results[k][0] += d;
3216 d = atof(sstrsep(&p, sep));
3217 ecdsa_results[k][1] += d;
3218 } else if (strncmp(buf, "+F5:", 4) == 0) {
3223 k = atoi(sstrsep(&p, sep));
3226 d = atof(sstrsep(&p, sep));
3227 ecdh_results[k][0] += d;
3231 else if (strncmp(buf, "+H:", 3) == 0) {
3234 BIO_printf(bio_err, "Unknown type '%s' from child %d\n", buf,
3245 static void multiblock_speed(const EVP_CIPHER *evp_cipher, const SEC *seconds)
3247 static const int mblengths_list[] =
3248 { 8 * 1024, 2 * 8 * 1024, 4 * 8 * 1024, 8 * 8 * 1024, 8 * 16 * 1024 };
3249 const int *mblengths = mblengths_list;
3250 int j, count, keylen, num = OSSL_NELEM(mblengths_list);
3251 const char *alg_name;
3252 unsigned char *inp, *out, *key, no_key[32], no_iv[16];
3253 EVP_CIPHER_CTX *ctx;
3256 if (lengths_single) {
3257 mblengths = &lengths_single;
3261 inp = app_malloc(mblengths[num - 1], "multiblock input buffer");
3262 out = app_malloc(mblengths[num - 1] + 1024, "multiblock output buffer");
3263 ctx = EVP_CIPHER_CTX_new();
3264 EVP_EncryptInit_ex(ctx, evp_cipher, NULL, NULL, no_iv);
3266 keylen = EVP_CIPHER_CTX_key_length(ctx);
3267 key = app_malloc(keylen, "evp_cipher key");
3268 EVP_CIPHER_CTX_rand_key(ctx, key);
3269 EVP_EncryptInit_ex(ctx, NULL, NULL, key, NULL);
3270 OPENSSL_clear_free(key, keylen);
3272 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_MAC_KEY, sizeof(no_key), no_key);
3273 alg_name = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
3275 for (j = 0; j < num; j++) {
3276 print_message(alg_name, 0, mblengths[j], seconds->sym);
3278 for (count = 0, run = 1; run && count < 0x7fffffff; count++) {
3279 unsigned char aad[EVP_AEAD_TLS1_AAD_LEN];
3280 EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM mb_param;
3281 size_t len = mblengths[j];
3284 memset(aad, 0, 8); /* avoid uninitialized values */
3285 aad[8] = 23; /* SSL3_RT_APPLICATION_DATA */
3286 aad[9] = 3; /* version */
3288 aad[11] = 0; /* length */
3290 mb_param.out = NULL;
3293 mb_param.interleave = 8;
3295 packlen = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_AAD,
3296 sizeof(mb_param), &mb_param);
3302 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT,
3303 sizeof(mb_param), &mb_param);
3307 RAND_bytes(out, 16);
3309 aad[11] = (unsigned char)(len >> 8);
3310 aad[12] = (unsigned char)(len);
3311 pad = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_TLS1_AAD,
3312 EVP_AEAD_TLS1_AAD_LEN, aad);
3313 EVP_Cipher(ctx, out, inp, len + pad);
3317 BIO_printf(bio_err, mr ? "+R:%d:%s:%f\n"
3318 : "%d %s's in %.2fs\n", count, "evp", d);
3319 results[D_EVP][j] = ((double)count) / d * mblengths[j];
3323 fprintf(stdout, "+H");
3324 for (j = 0; j < num; j++)
3325 fprintf(stdout, ":%d", mblengths[j]);
3326 fprintf(stdout, "\n");
3327 fprintf(stdout, "+F:%d:%s", D_EVP, alg_name);
3328 for (j = 0; j < num; j++)
3329 fprintf(stdout, ":%.2f", results[D_EVP][j]);
3330 fprintf(stdout, "\n");
3333 "The 'numbers' are in 1000s of bytes per second processed.\n");
3334 fprintf(stdout, "type ");
3335 for (j = 0; j < num; j++)
3336 fprintf(stdout, "%7d bytes", mblengths[j]);
3337 fprintf(stdout, "\n");
3338 fprintf(stdout, "%-24s", alg_name);
3340 for (j = 0; j < num; j++) {
3341 if (results[D_EVP][j] > 10000)
3342 fprintf(stdout, " %11.2fk", results[D_EVP][j] / 1e3);
3344 fprintf(stdout, " %11.2f ", results[D_EVP][j]);
3346 fprintf(stdout, "\n");
3351 EVP_CIPHER_CTX_free(ctx);