2 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 /* ====================================================================
11 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
13 * Portions of the attached software ("Contribution") are developed by
14 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
16 * The Contribution is licensed pursuant to the OpenSSL open source
17 * license provided above.
19 * The ECDH and ECDSA speed test software is originally written by
20 * Sumit Gupta of Sun Microsystems Laboratories.
26 #define PRIME_SECONDS 10
27 #define RSA_SECONDS 10
28 #define DSA_SECONDS 10
29 #define ECDSA_SECONDS 10
30 #define ECDH_SECONDS 10
37 #include <openssl/crypto.h>
38 #include <openssl/rand.h>
39 #include <openssl/err.h>
40 #include <openssl/evp.h>
41 #include <openssl/objects.h>
42 #include <openssl/async.h>
43 #if !defined(OPENSSL_SYS_MSDOS)
44 # include OPENSSL_UNISTD
51 #include <openssl/bn.h>
52 #ifndef OPENSSL_NO_DES
53 # include <openssl/des.h>
55 #include <openssl/aes.h>
56 #ifndef OPENSSL_NO_CAMELLIA
57 # include <openssl/camellia.h>
59 #ifndef OPENSSL_NO_MD2
60 # include <openssl/md2.h>
62 #ifndef OPENSSL_NO_MDC2
63 # include <openssl/mdc2.h>
65 #ifndef OPENSSL_NO_MD4
66 # include <openssl/md4.h>
68 #ifndef OPENSSL_NO_MD5
69 # include <openssl/md5.h>
71 #include <openssl/hmac.h>
72 #include <openssl/sha.h>
73 #ifndef OPENSSL_NO_RMD160
74 # include <openssl/ripemd.h>
76 #ifndef OPENSSL_NO_WHIRLPOOL
77 # include <openssl/whrlpool.h>
79 #ifndef OPENSSL_NO_RC4
80 # include <openssl/rc4.h>
82 #ifndef OPENSSL_NO_RC5
83 # include <openssl/rc5.h>
85 #ifndef OPENSSL_NO_RC2
86 # include <openssl/rc2.h>
88 #ifndef OPENSSL_NO_IDEA
89 # include <openssl/idea.h>
91 #ifndef OPENSSL_NO_SEED
92 # include <openssl/seed.h>
95 # include <openssl/blowfish.h>
97 #ifndef OPENSSL_NO_CAST
98 # include <openssl/cast.h>
100 #ifndef OPENSSL_NO_RSA
101 # include <openssl/rsa.h>
102 # include "./testrsa.h"
104 #include <openssl/x509.h>
105 #ifndef OPENSSL_NO_DSA
106 # include <openssl/dsa.h>
107 # include "./testdsa.h"
109 #ifndef OPENSSL_NO_EC
110 # include <openssl/ec.h>
112 #include <openssl/modes.h>
115 # if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS)
129 #define BUFSIZE (1024*16+1)
130 #define MAX_MISALIGNMENT 63
132 #define MAX_ECDH_SIZE 256
135 static volatile int run = 0;
138 static int usertime = 1;
140 #ifndef OPENSSL_NO_MD2
141 static int EVP_Digest_MD2_loop(void *args);
144 #ifndef OPENSSL_NO_MDC2
145 static int EVP_Digest_MDC2_loop(void *args);
147 #ifndef OPENSSL_NO_MD4
148 static int EVP_Digest_MD4_loop(void *args);
150 #ifndef OPENSSL_NO_MD5
151 static int MD5_loop(void *args);
152 static int HMAC_loop(void *args);
154 static int SHA1_loop(void *args);
155 static int SHA256_loop(void *args);
156 static int SHA512_loop(void *args);
157 #ifndef OPENSSL_NO_WHIRLPOOL
158 static int WHIRLPOOL_loop(void *args);
160 #ifndef OPENSSL_NO_RMD160
161 static int EVP_Digest_RMD160_loop(void *args);
163 #ifndef OPENSSL_NO_RC4
164 static int RC4_loop(void *args);
166 #ifndef OPENSSL_NO_DES
167 static int DES_ncbc_encrypt_loop(void *args);
168 static int DES_ede3_cbc_encrypt_loop(void *args);
170 static int AES_cbc_128_encrypt_loop(void *args);
171 static int AES_cbc_192_encrypt_loop(void *args);
172 static int AES_ige_128_encrypt_loop(void *args);
173 static int AES_cbc_256_encrypt_loop(void *args);
174 static int AES_ige_192_encrypt_loop(void *args);
175 static int AES_ige_256_encrypt_loop(void *args);
176 static int CRYPTO_gcm128_aad_loop(void *args);
177 static int EVP_Update_loop(void *args);
178 static int EVP_Digest_loop(void *args);
179 #ifndef OPENSSL_NO_RSA
180 static int RSA_sign_loop(void *args);
181 static int RSA_verify_loop(void *args);
183 #ifndef OPENSSL_NO_DSA
184 static int DSA_sign_loop(void *args);
185 static int DSA_verify_loop(void *args);
187 #ifndef OPENSSL_NO_EC
188 static int ECDSA_sign_loop(void *args);
189 static int ECDSA_verify_loop(void *args);
190 static int ECDH_compute_key_loop(void *args);
193 static double Time_F(int s);
194 static void print_message(const char *s, long num, int length);
195 static void pkey_print_message(const char *str, const char *str2,
196 long num, int bits, int sec);
197 static void print_result(int alg, int run_no, int count, double time_used);
199 static int do_multi(int multi);
202 static const int lengths[] = {
203 16, 64, 256, 1024, 8 * 1024, 16 * 1024
205 #define SIZE_NUM OSSL_NELEM(lengths)
207 #if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_EC)
208 static const char rnd_seed[] =
209 "string to make the random number generator think it has entropy";
213 # if defined(__STDC__) || defined(sgi) || defined(_AIX)
214 # define SIGRETTYPE void
216 # define SIGRETTYPE int
219 static SIGRETTYPE sig_done(int sig);
220 static SIGRETTYPE sig_done(int sig)
222 signal(SIGALRM, sig_done);
232 # if !defined(SIGALRM)
235 static unsigned int lapse;
236 static volatile unsigned int schlock;
237 static void alarm_win32(unsigned int secs)
242 # define alarm alarm_win32
244 static DWORD WINAPI sleepy(VOID * arg)
252 static double Time_F(int s)
259 thr = CreateThread(NULL, 4096, sleepy, NULL, 0, NULL);
261 DWORD err = GetLastError();
262 BIO_printf(bio_err, "unable to CreateThread (%lu)", err);
266 Sleep(0); /* scheduler spinlock */
267 ret = app_tminterval(s, usertime);
269 ret = app_tminterval(s, usertime);
271 TerminateThread(thr, 0);
279 static double Time_F(int s)
281 double ret = app_tminterval(s, usertime);
288 static void multiblock_speed(const EVP_CIPHER *evp_cipher);
290 #define found(value, pairs, result)\
291 opt_found(value, result, pairs, OSSL_NELEM(pairs))
292 static int opt_found(const char *name, unsigned int *result,
293 const OPT_PAIR pairs[], unsigned int nbelem)
297 for (idx = 0; idx < nbelem; ++idx, pairs++)
298 if (strcmp(name, pairs->name) == 0) {
299 *result = pairs->retval;
305 typedef enum OPTION_choice {
306 OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
307 OPT_ELAPSED, OPT_EVP, OPT_DECRYPT, OPT_ENGINE, OPT_MULTI,
308 OPT_MR, OPT_MB, OPT_MISALIGN, OPT_ASYNCJOBS
311 OPTIONS speed_options[] = {
312 {OPT_HELP_STR, 1, '-', "Usage: %s [options] ciphers...\n"},
313 {OPT_HELP_STR, 1, '-', "Valid options are:\n"},
314 {"help", OPT_HELP, '-', "Display this summary"},
315 {"evp", OPT_EVP, 's', "Use specified EVP cipher"},
316 {"decrypt", OPT_DECRYPT, '-',
317 "Time decryption instead of encryption (only EVP)"},
318 {"mr", OPT_MR, '-', "Produce machine readable output"},
320 "Enable (tls1.1) multi-block mode on evp_cipher requested with -evp"},
321 {"misalign", OPT_MISALIGN, 'n', "Amount to mis-align buffers"},
322 {"elapsed", OPT_ELAPSED, '-',
323 "Measure time in real time instead of CPU user time"},
325 {"multi", OPT_MULTI, 'p', "Run benchmarks in parallel"},
327 #ifndef OPENSSL_NO_ASYNC
328 {"async_jobs", OPT_ASYNCJOBS, 'p',
329 "Enable async mode and start pnum jobs"},
331 #ifndef OPENSSL_NO_ENGINE
332 {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
347 #define D_CBC_IDEA 10
348 #define D_CBC_SEED 11
352 #define D_CBC_CAST 15
353 #define D_CBC_128_AES 16
354 #define D_CBC_192_AES 17
355 #define D_CBC_256_AES 18
356 #define D_CBC_128_CML 19
357 #define D_CBC_192_CML 20
358 #define D_CBC_256_CML 21
362 #define D_WHIRLPOOL 25
363 #define D_IGE_128_AES 26
364 #define D_IGE_192_AES 27
365 #define D_IGE_256_AES 28
367 /* name of algorithms to test */
368 static const char *names[] = {
369 "md2", "mdc2", "md4", "md5", "hmac(md5)", "sha1", "rmd160", "rc4",
370 "des cbc", "des ede3", "idea cbc", "seed cbc",
371 "rc2 cbc", "rc5-32/12 cbc", "blowfish cbc", "cast cbc",
372 "aes-128 cbc", "aes-192 cbc", "aes-256 cbc",
373 "camellia-128 cbc", "camellia-192 cbc", "camellia-256 cbc",
374 "evp", "sha256", "sha512", "whirlpool",
375 "aes-128 ige", "aes-192 ige", "aes-256 ige", "ghash"
377 #define ALGOR_NUM OSSL_NELEM(names)
378 /* list of configured algorithm (remaining) */
379 static const OPT_PAIR doit_choices[] = {
380 #ifndef OPENSSL_NO_MD2
383 #ifndef OPENSSL_NO_MDC2
386 #ifndef OPENSSL_NO_MD4
389 #ifndef OPENSSL_NO_MD5
394 {"sha256", D_SHA256},
395 {"sha512", D_SHA512},
396 #ifndef OPENSSL_NO_WHIRLPOOL
397 {"whirlpool", D_WHIRLPOOL},
399 #ifndef OPENSSL_NO_RMD160
400 {"ripemd", D_RMD160},
401 {"rmd160", D_RMD160},
402 {"ripemd160", D_RMD160},
404 #ifndef OPENSSL_NO_RC4
407 #ifndef OPENSSL_NO_DES
408 {"des-cbc", D_CBC_DES},
409 {"des-ede3", D_EDE3_DES},
411 {"aes-128-cbc", D_CBC_128_AES},
412 {"aes-192-cbc", D_CBC_192_AES},
413 {"aes-256-cbc", D_CBC_256_AES},
414 {"aes-128-ige", D_IGE_128_AES},
415 {"aes-192-ige", D_IGE_192_AES},
416 {"aes-256-ige", D_IGE_256_AES},
417 #ifndef OPENSSL_NO_RC2
418 {"rc2-cbc", D_CBC_RC2},
421 #ifndef OPENSSL_NO_RC5
422 {"rc5-cbc", D_CBC_RC5},
425 #ifndef OPENSSL_NO_IDEA
426 {"idea-cbc", D_CBC_IDEA},
427 {"idea", D_CBC_IDEA},
429 #ifndef OPENSSL_NO_SEED
430 {"seed-cbc", D_CBC_SEED},
431 {"seed", D_CBC_SEED},
433 #ifndef OPENSSL_NO_BF
434 {"bf-cbc", D_CBC_BF},
435 {"blowfish", D_CBC_BF},
438 #ifndef OPENSSL_NO_CAST
439 {"cast-cbc", D_CBC_CAST},
440 {"cast", D_CBC_CAST},
441 {"cast5", D_CBC_CAST},
446 static double results[ALGOR_NUM][SIZE_NUM];
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 static const OPT_PAIR rsa_choices[] = {
470 {"rsa512", R_RSA_512},
471 {"rsa1024", R_RSA_1024},
472 {"rsa2048", R_RSA_2048},
473 {"rsa3072", R_RSA_3072},
474 {"rsa4096", R_RSA_4096},
475 {"rsa7680", R_RSA_7680},
476 {"rsa15360", R_RSA_15360}
478 # define RSA_NUM OSSL_NELEM(rsa_choices)
480 static double rsa_results[RSA_NUM][2]; /* 2 ops: sign then verify */
498 #define R_EC_X25519 16
499 #ifndef OPENSSL_NO_EC
500 static const OPT_PAIR ecdsa_choices[] = {
501 {"ecdsap160", R_EC_P160},
502 {"ecdsap192", R_EC_P192},
503 {"ecdsap224", R_EC_P224},
504 {"ecdsap256", R_EC_P256},
505 {"ecdsap384", R_EC_P384},
506 {"ecdsap521", R_EC_P521},
507 {"ecdsak163", R_EC_K163},
508 {"ecdsak233", R_EC_K233},
509 {"ecdsak283", R_EC_K283},
510 {"ecdsak409", R_EC_K409},
511 {"ecdsak571", R_EC_K571},
512 {"ecdsab163", R_EC_B163},
513 {"ecdsab233", R_EC_B233},
514 {"ecdsab283", R_EC_B283},
515 {"ecdsab409", R_EC_B409},
516 {"ecdsab571", R_EC_B571}
518 # define ECDSA_NUM OSSL_NELEM(ecdsa_choices)
520 static double ecdsa_results[ECDSA_NUM][2]; /* 2 ops: sign then verify */
522 static const OPT_PAIR ecdh_choices[] = {
523 {"ecdhp160", R_EC_P160},
524 {"ecdhp192", R_EC_P192},
525 {"ecdhp224", R_EC_P224},
526 {"ecdhp256", R_EC_P256},
527 {"ecdhp384", R_EC_P384},
528 {"ecdhp521", R_EC_P521},
529 {"ecdhk163", R_EC_K163},
530 {"ecdhk233", R_EC_K233},
531 {"ecdhk283", R_EC_K283},
532 {"ecdhk409", R_EC_K409},
533 {"ecdhk571", R_EC_K571},
534 {"ecdhb163", R_EC_B163},
535 {"ecdhb233", R_EC_B233},
536 {"ecdhb283", R_EC_B283},
537 {"ecdhb409", R_EC_B409},
538 {"ecdhb571", R_EC_B571},
539 {"ecdhx25519", R_EC_X25519},
542 # define EC_NUM OSSL_NELEM(ecdh_choices)
544 static double ecdh_results[EC_NUM][1]; /* 1 op: derivation */
545 #endif /* OPENSSL_NO_EC */
548 # define COND(d) (count < (d))
549 # define COUNT(d) (d)
551 # define COND(unused_cond) (run && count<0x7fffffff)
552 # define COUNT(d) (count)
555 static unsigned int testnum;
556 typedef void *(*kdf_fn) (const void *in, size_t inlen, void *out,
559 typedef struct loopargs_st {
560 ASYNC_JOB *inprogress_job;
561 ASYNC_WAIT_CTX *wait_ctx;
564 unsigned char *buf_malloc;
565 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 EC_KEY *ecdh_a[EC_NUM];
576 EC_KEY *ecdh_b[EC_NUM];
577 unsigned char *secret_a;
578 unsigned char *secret_b;
584 GCM128_CONTEXT *gcm_ctx;
587 static int run_benchmark(int async_jobs, int (*loop_function) (void *),
588 loopargs_t * loopargs);
590 /* Nb of iterations to do per algorithm and key-size */
591 static long c[ALGOR_NUM][SIZE_NUM];
593 #ifndef OPENSSL_NO_MD2
594 static int EVP_Digest_MD2_loop(void *args)
596 loopargs_t *tempargs = *(loopargs_t **)args;
597 unsigned char *buf = tempargs->buf;
598 unsigned char md2[MD2_DIGEST_LENGTH];
601 for (count = 0; COND(c[D_MD2][testnum]); count++) {
602 if (!EVP_Digest(buf, (size_t)lengths[testnum], md2, NULL, EVP_md2(),
610 #ifndef OPENSSL_NO_MDC2
611 static int EVP_Digest_MDC2_loop(void *args)
613 loopargs_t *tempargs = *(loopargs_t **)args;
614 unsigned char *buf = tempargs->buf;
615 unsigned char mdc2[MDC2_DIGEST_LENGTH];
618 for (count = 0; COND(c[D_MDC2][testnum]); count++) {
619 if (!EVP_Digest(buf, (size_t)lengths[testnum], mdc2, NULL, EVP_mdc2(),
627 #ifndef OPENSSL_NO_MD4
628 static int EVP_Digest_MD4_loop(void *args)
630 loopargs_t *tempargs = *(loopargs_t **)args;
631 unsigned char *buf = tempargs->buf;
632 unsigned char md4[MD4_DIGEST_LENGTH];
635 for (count = 0; COND(c[D_MD4][testnum]); count++) {
636 if (!EVP_Digest(buf, (size_t)lengths[testnum], md4, NULL, EVP_md4(),
644 #ifndef OPENSSL_NO_MD5
645 static int MD5_loop(void *args)
647 loopargs_t *tempargs = *(loopargs_t **)args;
648 unsigned char *buf = tempargs->buf;
649 unsigned char md5[MD5_DIGEST_LENGTH];
651 for (count = 0; COND(c[D_MD5][testnum]); count++)
652 MD5(buf, lengths[testnum], md5);
656 static int HMAC_loop(void *args)
658 loopargs_t *tempargs = *(loopargs_t **)args;
659 unsigned char *buf = tempargs->buf;
660 HMAC_CTX *hctx = tempargs->hctx;
661 unsigned char hmac[MD5_DIGEST_LENGTH];
664 for (count = 0; COND(c[D_HMAC][testnum]); count++) {
665 HMAC_Init_ex(hctx, NULL, 0, NULL, NULL);
666 HMAC_Update(hctx, buf, lengths[testnum]);
667 HMAC_Final(hctx, hmac, NULL);
673 static int SHA1_loop(void *args)
675 loopargs_t *tempargs = *(loopargs_t **)args;
676 unsigned char *buf = tempargs->buf;
677 unsigned char sha[SHA_DIGEST_LENGTH];
679 for (count = 0; COND(c[D_SHA1][testnum]); count++)
680 SHA1(buf, lengths[testnum], sha);
684 static int SHA256_loop(void *args)
686 loopargs_t *tempargs = *(loopargs_t **)args;
687 unsigned char *buf = tempargs->buf;
688 unsigned char sha256[SHA256_DIGEST_LENGTH];
690 for (count = 0; COND(c[D_SHA256][testnum]); count++)
691 SHA256(buf, lengths[testnum], sha256);
695 static int SHA512_loop(void *args)
697 loopargs_t *tempargs = *(loopargs_t **)args;
698 unsigned char *buf = tempargs->buf;
699 unsigned char sha512[SHA512_DIGEST_LENGTH];
701 for (count = 0; COND(c[D_SHA512][testnum]); count++)
702 SHA512(buf, lengths[testnum], sha512);
706 #ifndef OPENSSL_NO_WHIRLPOOL
707 static int WHIRLPOOL_loop(void *args)
709 loopargs_t *tempargs = *(loopargs_t **)args;
710 unsigned char *buf = tempargs->buf;
711 unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
713 for (count = 0; COND(c[D_WHIRLPOOL][testnum]); count++)
714 WHIRLPOOL(buf, lengths[testnum], whirlpool);
719 #ifndef OPENSSL_NO_RMD160
720 static int EVP_Digest_RMD160_loop(void *args)
722 loopargs_t *tempargs = *(loopargs_t **)args;
723 unsigned char *buf = tempargs->buf;
724 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
726 for (count = 0; COND(c[D_RMD160][testnum]); count++) {
727 if (!EVP_Digest(buf, (size_t)lengths[testnum], &(rmd160[0]),
728 NULL, EVP_ripemd160(), NULL))
735 #ifndef OPENSSL_NO_RC4
736 static RC4_KEY rc4_ks;
737 static int RC4_loop(void *args)
739 loopargs_t *tempargs = *(loopargs_t **)args;
740 unsigned char *buf = tempargs->buf;
742 for (count = 0; COND(c[D_RC4][testnum]); count++)
743 RC4(&rc4_ks, (size_t)lengths[testnum], buf, buf);
748 #ifndef OPENSSL_NO_DES
749 static unsigned char DES_iv[8];
750 static DES_key_schedule sch;
751 static DES_key_schedule sch2;
752 static DES_key_schedule sch3;
753 static int DES_ncbc_encrypt_loop(void *args)
755 loopargs_t *tempargs = *(loopargs_t **)args;
756 unsigned char *buf = tempargs->buf;
758 for (count = 0; COND(c[D_CBC_DES][testnum]); count++)
759 DES_ncbc_encrypt(buf, buf, lengths[testnum], &sch,
760 &DES_iv, DES_ENCRYPT);
764 static int DES_ede3_cbc_encrypt_loop(void *args)
766 loopargs_t *tempargs = *(loopargs_t **)args;
767 unsigned char *buf = tempargs->buf;
769 for (count = 0; COND(c[D_EDE3_DES][testnum]); count++)
770 DES_ede3_cbc_encrypt(buf, buf, lengths[testnum],
772 &DES_iv, DES_ENCRYPT);
777 #define MAX_BLOCK_SIZE 128
779 static unsigned char iv[2 * MAX_BLOCK_SIZE / 8];
780 static AES_KEY aes_ks1, aes_ks2, aes_ks3;
781 static int AES_cbc_128_encrypt_loop(void *args)
783 loopargs_t *tempargs = *(loopargs_t **)args;
784 unsigned char *buf = tempargs->buf;
786 for (count = 0; COND(c[D_CBC_128_AES][testnum]); count++)
787 AES_cbc_encrypt(buf, buf,
788 (size_t)lengths[testnum], &aes_ks1,
793 static int AES_cbc_192_encrypt_loop(void *args)
795 loopargs_t *tempargs = *(loopargs_t **)args;
796 unsigned char *buf = tempargs->buf;
798 for (count = 0; COND(c[D_CBC_192_AES][testnum]); count++)
799 AES_cbc_encrypt(buf, buf,
800 (size_t)lengths[testnum], &aes_ks2,
805 static int AES_cbc_256_encrypt_loop(void *args)
807 loopargs_t *tempargs = *(loopargs_t **)args;
808 unsigned char *buf = tempargs->buf;
810 for (count = 0; COND(c[D_CBC_256_AES][testnum]); count++)
811 AES_cbc_encrypt(buf, buf,
812 (size_t)lengths[testnum], &aes_ks3,
817 static int AES_ige_128_encrypt_loop(void *args)
819 loopargs_t *tempargs = *(loopargs_t **)args;
820 unsigned char *buf = tempargs->buf;
821 unsigned char *buf2 = tempargs->buf2;
823 for (count = 0; COND(c[D_IGE_128_AES][testnum]); count++)
824 AES_ige_encrypt(buf, buf2,
825 (size_t)lengths[testnum], &aes_ks1,
830 static int AES_ige_192_encrypt_loop(void *args)
832 loopargs_t *tempargs = *(loopargs_t **)args;
833 unsigned char *buf = tempargs->buf;
834 unsigned char *buf2 = tempargs->buf2;
836 for (count = 0; COND(c[D_IGE_192_AES][testnum]); count++)
837 AES_ige_encrypt(buf, buf2,
838 (size_t)lengths[testnum], &aes_ks2,
843 static int AES_ige_256_encrypt_loop(void *args)
845 loopargs_t *tempargs = *(loopargs_t **)args;
846 unsigned char *buf = tempargs->buf;
847 unsigned char *buf2 = tempargs->buf2;
849 for (count = 0; COND(c[D_IGE_256_AES][testnum]); count++)
850 AES_ige_encrypt(buf, buf2,
851 (size_t)lengths[testnum], &aes_ks3,
856 static int CRYPTO_gcm128_aad_loop(void *args)
858 loopargs_t *tempargs = *(loopargs_t **)args;
859 unsigned char *buf = tempargs->buf;
860 GCM128_CONTEXT *gcm_ctx = tempargs->gcm_ctx;
862 for (count = 0; COND(c[D_GHASH][testnum]); count++)
863 CRYPTO_gcm128_aad(gcm_ctx, buf, lengths[testnum]);
867 static long save_count = 0;
868 static int decrypt = 0;
869 static int EVP_Update_loop(void *args)
871 loopargs_t *tempargs = *(loopargs_t **)args;
872 unsigned char *buf = tempargs->buf;
873 EVP_CIPHER_CTX *ctx = tempargs->ctx;
876 int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
879 for (count = 0; COND(nb_iter); count++)
880 EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
882 for (count = 0; COND(nb_iter); count++)
883 EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
885 EVP_DecryptFinal_ex(ctx, buf, &outl);
887 EVP_EncryptFinal_ex(ctx, buf, &outl);
891 static const EVP_MD *evp_md = NULL;
892 static int EVP_Digest_loop(void *args)
894 loopargs_t *tempargs = *(loopargs_t **)args;
895 unsigned char *buf = tempargs->buf;
896 unsigned char md[EVP_MAX_MD_SIZE];
899 int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
902 for (count = 0; COND(nb_iter); count++) {
903 if (!EVP_Digest(buf, lengths[testnum], md, NULL, evp_md, NULL))
909 #ifndef OPENSSL_NO_RSA
910 static long rsa_c[RSA_NUM][2]; /* # RSA iteration test */
912 static int RSA_sign_loop(void *args)
914 loopargs_t *tempargs = *(loopargs_t **)args;
915 unsigned char *buf = tempargs->buf;
916 unsigned char *buf2 = tempargs->buf2;
917 unsigned int *rsa_num = &tempargs->siglen;
918 RSA **rsa_key = tempargs->rsa_key;
920 for (count = 0; COND(rsa_c[testnum][0]); count++) {
921 ret = RSA_sign(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
923 BIO_printf(bio_err, "RSA sign failure\n");
924 ERR_print_errors(bio_err);
932 static int RSA_verify_loop(void *args)
934 loopargs_t *tempargs = *(loopargs_t **)args;
935 unsigned char *buf = tempargs->buf;
936 unsigned char *buf2 = tempargs->buf2;
937 unsigned int rsa_num = tempargs->siglen;
938 RSA **rsa_key = tempargs->rsa_key;
940 for (count = 0; COND(rsa_c[testnum][1]); count++) {
941 ret = RSA_verify(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
943 BIO_printf(bio_err, "RSA verify failure\n");
944 ERR_print_errors(bio_err);
953 #ifndef OPENSSL_NO_DSA
954 static long dsa_c[DSA_NUM][2];
955 static int DSA_sign_loop(void *args)
957 loopargs_t *tempargs = *(loopargs_t **)args;
958 unsigned char *buf = tempargs->buf;
959 unsigned char *buf2 = tempargs->buf2;
960 DSA **dsa_key = tempargs->dsa_key;
961 unsigned int *siglen = &tempargs->siglen;
963 for (count = 0; COND(dsa_c[testnum][0]); count++) {
964 ret = DSA_sign(0, buf, 20, buf2, siglen, dsa_key[testnum]);
966 BIO_printf(bio_err, "DSA sign failure\n");
967 ERR_print_errors(bio_err);
975 static int DSA_verify_loop(void *args)
977 loopargs_t *tempargs = *(loopargs_t **)args;
978 unsigned char *buf = tempargs->buf;
979 unsigned char *buf2 = tempargs->buf2;
980 DSA **dsa_key = tempargs->dsa_key;
981 unsigned int siglen = tempargs->siglen;
983 for (count = 0; COND(dsa_c[testnum][1]); count++) {
984 ret = DSA_verify(0, buf, 20, buf2, siglen, dsa_key[testnum]);
986 BIO_printf(bio_err, "DSA verify failure\n");
987 ERR_print_errors(bio_err);
996 #ifndef OPENSSL_NO_EC
997 static long ecdsa_c[ECDSA_NUM][2];
998 static int ECDSA_sign_loop(void *args)
1000 loopargs_t *tempargs = *(loopargs_t **)args;
1001 unsigned char *buf = tempargs->buf;
1002 EC_KEY **ecdsa = tempargs->ecdsa;
1003 unsigned char *ecdsasig = tempargs->buf2;
1004 unsigned int *ecdsasiglen = &tempargs->siglen;
1006 for (count = 0; COND(ecdsa_c[testnum][0]); count++) {
1007 ret = ECDSA_sign(0, buf, 20,
1008 ecdsasig, ecdsasiglen, ecdsa[testnum]);
1010 BIO_printf(bio_err, "ECDSA sign failure\n");
1011 ERR_print_errors(bio_err);
1019 static int ECDSA_verify_loop(void *args)
1021 loopargs_t *tempargs = *(loopargs_t **)args;
1022 unsigned char *buf = tempargs->buf;
1023 EC_KEY **ecdsa = tempargs->ecdsa;
1024 unsigned char *ecdsasig = tempargs->buf2;
1025 unsigned int ecdsasiglen = tempargs->siglen;
1027 for (count = 0; COND(ecdsa_c[testnum][1]); count++) {
1028 ret = ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen,
1031 BIO_printf(bio_err, "ECDSA verify failure\n");
1032 ERR_print_errors(bio_err);
1040 /* ******************************************************************** */
1041 static long ecdh_c[EC_NUM][1];
1043 static int ECDH_compute_key_loop(void *args)
1045 loopargs_t *tempargs = *(loopargs_t **)args;
1046 EC_KEY **ecdh_a = tempargs->ecdh_a;
1047 EC_KEY **ecdh_b = tempargs->ecdh_b;
1048 unsigned char *secret_a = tempargs->secret_a;
1050 size_t outlen = tempargs->outlen;
1051 kdf_fn kdf = tempargs->kdf;
1053 for (count = 0; COND(ecdh_c[testnum][0]); count++) {
1054 ECDH_compute_key(secret_a, outlen,
1055 EC_KEY_get0_public_key(ecdh_b[testnum]),
1056 ecdh_a[testnum], kdf);
1061 static const size_t KDF1_SHA1_len = 20;
1062 static void *KDF1_SHA1(const void *in, size_t inlen, void *out,
1065 if (*outlen < SHA_DIGEST_LENGTH)
1067 *outlen = SHA_DIGEST_LENGTH;
1068 return SHA1(in, inlen, out);
1070 #endif /* OPENSSL_NO_EC */
1072 static int run_benchmark(int async_jobs,
1073 int (*loop_function)(void *), loopargs_t *loopargs)
1075 int job_op_count = 0;
1076 int total_op_count = 0;
1077 int num_inprogress = 0;
1078 int error = 0, i = 0, ret = 0;
1079 OSSL_ASYNC_FD job_fd = 0;
1080 size_t num_job_fds = 0;
1084 if (async_jobs == 0) {
1085 return loop_function((void *)&loopargs);
1088 for (i = 0; i < async_jobs && !error; i++) {
1089 loopargs_t *looparg_item = loopargs + i;
1091 /* Copy pointer content (looparg_t item address) into async context */
1092 ret = ASYNC_start_job(&loopargs[i].inprogress_job, loopargs[i].wait_ctx,
1093 &job_op_count, loop_function,
1094 (void *)&looparg_item, sizeof(looparg_item));
1100 if (job_op_count == -1) {
1103 total_op_count += job_op_count;
1108 BIO_printf(bio_err, "Failure in the job\n");
1109 ERR_print_errors(bio_err);
1115 while (num_inprogress > 0) {
1116 #if defined(OPENSSL_SYS_WINDOWS)
1118 #elif defined(OPENSSL_SYS_UNIX)
1119 int select_result = 0;
1120 OSSL_ASYNC_FD max_fd = 0;
1123 FD_ZERO(&waitfdset);
1125 for (i = 0; i < async_jobs && num_inprogress > 0; i++) {
1126 if (loopargs[i].inprogress_job == NULL)
1129 if (!ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, NULL, &num_job_fds)
1130 || num_job_fds > 1) {
1131 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1132 ERR_print_errors(bio_err);
1136 ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd, &num_job_fds);
1137 FD_SET(job_fd, &waitfdset);
1138 if (job_fd > max_fd)
1142 if (max_fd >= (OSSL_ASYNC_FD)FD_SETSIZE) {
1144 "Error: max_fd (%d) must be smaller than FD_SETSIZE (%d). "
1145 "Decrease the value of async_jobs\n",
1146 max_fd, FD_SETSIZE);
1147 ERR_print_errors(bio_err);
1152 select_result = select(max_fd + 1, &waitfdset, NULL, NULL, NULL);
1153 if (select_result == -1 && errno == EINTR)
1156 if (select_result == -1) {
1157 BIO_printf(bio_err, "Failure in the select\n");
1158 ERR_print_errors(bio_err);
1163 if (select_result == 0)
1167 for (i = 0; i < async_jobs; i++) {
1168 if (loopargs[i].inprogress_job == NULL)
1171 if (!ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, NULL, &num_job_fds)
1172 || num_job_fds > 1) {
1173 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1174 ERR_print_errors(bio_err);
1178 ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd, &num_job_fds);
1180 #if defined(OPENSSL_SYS_UNIX)
1181 if (num_job_fds == 1 && !FD_ISSET(job_fd, &waitfdset))
1183 #elif defined(OPENSSL_SYS_WINDOWS)
1184 if (num_job_fds == 1
1185 && !PeekNamedPipe(job_fd, NULL, 0, NULL, &avail, NULL)
1190 ret = ASYNC_start_job(&loopargs[i].inprogress_job,
1191 loopargs[i].wait_ctx, &job_op_count, loop_function,
1192 (void *)(loopargs + i), sizeof(loopargs_t));
1197 if (job_op_count == -1) {
1200 total_op_count += job_op_count;
1203 loopargs[i].inprogress_job = NULL;
1208 loopargs[i].inprogress_job = NULL;
1209 BIO_printf(bio_err, "Failure in the job\n");
1210 ERR_print_errors(bio_err);
1217 return error ? -1 : total_op_count;
1220 int speed_main(int argc, char **argv)
1223 loopargs_t *loopargs = NULL;
1225 const char *engine_id = NULL;
1226 const EVP_CIPHER *evp_cipher = NULL;
1229 int async_init = 0, multiblock = 0, pr_header = 0;
1230 int doit[ALGOR_NUM] = { 0 };
1231 int ret = 1, misalign = 0;
1233 unsigned int i, k, loop, loopargs_len = 0, async_jobs = 0;
1237 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) \
1238 || !defined(OPENSSL_NO_EC)
1242 /* What follows are the buffers and key material. */
1243 #ifndef OPENSSL_NO_RC5
1246 #ifndef OPENSSL_NO_RC2
1249 #ifndef OPENSSL_NO_IDEA
1250 IDEA_KEY_SCHEDULE idea_ks;
1252 #ifndef OPENSSL_NO_SEED
1253 SEED_KEY_SCHEDULE seed_ks;
1255 #ifndef OPENSSL_NO_BF
1258 #ifndef OPENSSL_NO_CAST
1261 static const unsigned char key16[16] = {
1262 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1263 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
1265 static const unsigned char key24[24] = {
1266 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1267 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1268 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1270 static const unsigned char key32[32] = {
1271 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1272 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1273 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
1274 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
1276 #ifndef OPENSSL_NO_CAMELLIA
1277 static const unsigned char ckey24[24] = {
1278 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1279 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1280 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1282 static const unsigned char ckey32[32] = {
1283 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1284 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1285 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
1286 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
1288 CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3;
1290 #ifndef OPENSSL_NO_DES
1291 static DES_cblock key = {
1292 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0
1294 static DES_cblock key2 = {
1295 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
1297 static DES_cblock key3 = {
1298 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1301 #ifndef OPENSSL_NO_RSA
1302 static const unsigned int rsa_bits[RSA_NUM] = {
1303 512, 1024, 2048, 3072, 4096, 7680, 15360
1305 static const unsigned char *rsa_data[RSA_NUM] = {
1306 test512, test1024, test2048, test3072, test4096, test7680, test15360
1308 static const int rsa_data_length[RSA_NUM] = {
1309 sizeof(test512), sizeof(test1024),
1310 sizeof(test2048), sizeof(test3072),
1311 sizeof(test4096), sizeof(test7680),
1314 int rsa_doit[RSA_NUM] = { 0 };
1316 #ifndef OPENSSL_NO_DSA
1317 static const unsigned int dsa_bits[DSA_NUM] = { 512, 1024, 2048 };
1318 int dsa_doit[DSA_NUM] = { 0 };
1320 #ifndef OPENSSL_NO_EC
1322 * We only test over the following curves as they are representative, To
1323 * add tests over more curves, simply add the curve NID and curve name to
1324 * the following arrays and increase the |ecdh_choices| list accordingly.
1326 static const unsigned int test_curves[EC_NUM] = {
1328 NID_secp160r1, NID_X9_62_prime192v1, NID_secp224r1,
1329 NID_X9_62_prime256v1, NID_secp384r1, NID_secp521r1,
1331 NID_sect163k1, NID_sect233k1, NID_sect283k1,
1332 NID_sect409k1, NID_sect571k1, NID_sect163r2,
1333 NID_sect233r1, NID_sect283r1, NID_sect409r1,
1338 static const char *test_curves_names[EC_NUM] = {
1340 "secp160r1", "nistp192", "nistp224",
1341 "nistp256", "nistp384", "nistp521",
1343 "nistk163", "nistk233", "nistk283",
1344 "nistk409", "nistk571", "nistb163",
1345 "nistb233", "nistb283", "nistb409",
1350 static const int test_curves_bits[EC_NUM] = {
1356 571, 253 /* X25519 */
1359 int ecdsa_doit[ECDSA_NUM] = { 0 };
1360 int ecdh_doit[EC_NUM] = { 0 };
1361 #endif /* ndef OPENSSL_NO_EC */
1363 prog = opt_init(argc, argv, speed_options);
1364 while ((o = opt_next()) != OPT_EOF) {
1369 BIO_printf(bio_err, "%s: Use -help for summary.\n", prog);
1372 opt_help(speed_options);
1380 evp_cipher = EVP_get_cipherbyname(opt_arg());
1381 if (evp_cipher == NULL)
1382 evp_md = EVP_get_digestbyname(opt_arg());
1383 if (evp_cipher == NULL && evp_md == NULL) {
1385 "%s: %s is an unknown cipher or digest\n",
1396 * In a forked execution, an engine might need to be
1397 * initialised by each child process, not by the parent.
1398 * So store the name here and run setup_engine() later on.
1400 engine_id = opt_arg();
1404 multi = atoi(opt_arg());
1408 #ifndef OPENSSL_NO_ASYNC
1409 async_jobs = atoi(opt_arg());
1410 if (!ASYNC_is_capable()) {
1412 "%s: async_jobs specified but async not supported\n",
1416 if (async_jobs > 99999) {
1417 BIO_printf(bio_err, "%s: too many async_jobs\n", prog);
1423 if (!opt_int(opt_arg(), &misalign))
1425 if (misalign > MISALIGN) {
1427 "%s: Maximum offset is %d\n", prog, MISALIGN);
1436 #ifdef OPENSSL_NO_MULTIBLOCK
1438 "%s: -mb specified but multi-block support is disabled\n",
1445 argc = opt_num_rest();
1448 /* Remaining arguments are algorithms. */
1449 for ( ; *argv; argv++) {
1450 if (found(*argv, doit_choices, &i)) {
1454 #ifndef OPENSSL_NO_DES
1455 if (strcmp(*argv, "des") == 0) {
1456 doit[D_CBC_DES] = doit[D_EDE3_DES] = 1;
1460 if (strcmp(*argv, "sha") == 0) {
1461 doit[D_SHA1] = doit[D_SHA256] = doit[D_SHA512] = 1;
1464 #ifndef OPENSSL_NO_RSA
1465 if (strcmp(*argv, "openssl") == 0)
1467 if (strcmp(*argv, "rsa") == 0) {
1468 for (loop = 0; loop < OSSL_NELEM(rsa_doit); loop++)
1472 if (found(*argv, rsa_choices, &i)) {
1477 #ifndef OPENSSL_NO_DSA
1478 if (strcmp(*argv, "dsa") == 0) {
1479 dsa_doit[R_DSA_512] = dsa_doit[R_DSA_1024] =
1480 dsa_doit[R_DSA_2048] = 1;
1483 if (found(*argv, dsa_choices, &i)) {
1488 if (strcmp(*argv, "aes") == 0) {
1489 doit[D_CBC_128_AES] = doit[D_CBC_192_AES] =
1490 doit[D_CBC_256_AES] = 1;
1493 #ifndef OPENSSL_NO_CAMELLIA
1494 if (strcmp(*argv, "camellia") == 0) {
1495 doit[D_CBC_128_CML] = doit[D_CBC_192_CML] =
1496 doit[D_CBC_256_CML] = 1;
1500 #ifndef OPENSSL_NO_EC
1501 if (strcmp(*argv, "ecdsa") == 0) {
1502 for (loop = 0; loop < OSSL_NELEM(ecdsa_doit); loop++)
1503 ecdsa_doit[loop] = 1;
1506 if (found(*argv, ecdsa_choices, &i)) {
1510 if (strcmp(*argv, "ecdh") == 0) {
1511 for (loop = 0; loop < OSSL_NELEM(ecdh_doit); loop++)
1512 ecdh_doit[loop] = 1;
1515 if (found(*argv, ecdh_choices, &i)) {
1520 BIO_printf(bio_err, "%s: Unknown algorithm %s\n", prog, *argv);
1524 /* Initialize the job pool if async mode is enabled */
1525 if (async_jobs > 0) {
1526 async_init = ASYNC_init_thread(async_jobs, async_jobs);
1528 BIO_printf(bio_err, "Error creating the ASYNC job pool\n");
1533 loopargs_len = (async_jobs == 0 ? 1 : async_jobs);
1534 loopargs = app_malloc(loopargs_len * sizeof(loopargs_t), "array of loopargs");
1535 memset(loopargs, 0, loopargs_len * sizeof(loopargs_t));
1537 for (i = 0; i < loopargs_len; i++) {
1538 if (async_jobs > 0) {
1539 loopargs[i].wait_ctx = ASYNC_WAIT_CTX_new();
1540 if (loopargs[i].wait_ctx == NULL) {
1541 BIO_printf(bio_err, "Error creating the ASYNC_WAIT_CTX\n");
1546 loopargs[i].buf_malloc = app_malloc((int)BUFSIZE + MAX_MISALIGNMENT + 1, "input buffer");
1547 loopargs[i].buf2_malloc = app_malloc((int)BUFSIZE + MAX_MISALIGNMENT + 1, "input buffer");
1548 /* Align the start of buffers on a 64 byte boundary */
1549 loopargs[i].buf = loopargs[i].buf_malloc + misalign;
1550 loopargs[i].buf2 = loopargs[i].buf2_malloc + misalign;
1551 #ifndef OPENSSL_NO_EC
1552 loopargs[i].secret_a = app_malloc(MAX_ECDH_SIZE, "ECDH secret a");
1553 loopargs[i].secret_b = app_malloc(MAX_ECDH_SIZE, "ECDH secret b");
1558 if (multi && do_multi(multi))
1562 /* Initialize the engine after the fork */
1563 e = setup_engine(engine_id, 0);
1565 /* No parameters; turn on everything. */
1566 if ((argc == 0) && !doit[D_EVP]) {
1567 for (i = 0; i < ALGOR_NUM; i++)
1570 #ifndef OPENSSL_NO_RSA
1571 for (i = 0; i < RSA_NUM; i++)
1574 #ifndef OPENSSL_NO_DSA
1575 for (i = 0; i < DSA_NUM; i++)
1578 #ifndef OPENSSL_NO_EC
1579 for (loop = 0; loop < OSSL_NELEM(ecdsa_doit); loop++)
1580 ecdsa_doit[loop] = 1;
1581 for (loop = 0; loop < OSSL_NELEM(ecdh_doit); loop++)
1582 ecdh_doit[loop] = 1;
1585 for (i = 0; i < ALGOR_NUM; i++)
1589 if (usertime == 0 && !mr)
1591 "You have chosen to measure elapsed time "
1592 "instead of user CPU time.\n");
1594 #ifndef OPENSSL_NO_RSA
1595 for (i = 0; i < loopargs_len; i++) {
1596 for (k = 0; k < RSA_NUM; k++) {
1597 const unsigned char *p;
1600 loopargs[i].rsa_key[k] = d2i_RSAPrivateKey(NULL, &p, rsa_data_length[k]);
1601 if (loopargs[i].rsa_key[k] == NULL) {
1602 BIO_printf(bio_err, "internal error loading RSA key number %d\n",
1609 #ifndef OPENSSL_NO_DSA
1610 for (i = 0; i < loopargs_len; i++) {
1611 loopargs[i].dsa_key[0] = get_dsa512();
1612 loopargs[i].dsa_key[1] = get_dsa1024();
1613 loopargs[i].dsa_key[2] = get_dsa2048();
1616 #ifndef OPENSSL_NO_DES
1617 DES_set_key_unchecked(&key, &sch);
1618 DES_set_key_unchecked(&key2, &sch2);
1619 DES_set_key_unchecked(&key3, &sch3);
1621 AES_set_encrypt_key(key16, 128, &aes_ks1);
1622 AES_set_encrypt_key(key24, 192, &aes_ks2);
1623 AES_set_encrypt_key(key32, 256, &aes_ks3);
1624 #ifndef OPENSSL_NO_CAMELLIA
1625 Camellia_set_key(key16, 128, &camellia_ks1);
1626 Camellia_set_key(ckey24, 192, &camellia_ks2);
1627 Camellia_set_key(ckey32, 256, &camellia_ks3);
1629 #ifndef OPENSSL_NO_IDEA
1630 IDEA_set_encrypt_key(key16, &idea_ks);
1632 #ifndef OPENSSL_NO_SEED
1633 SEED_set_key(key16, &seed_ks);
1635 #ifndef OPENSSL_NO_RC4
1636 RC4_set_key(&rc4_ks, 16, key16);
1638 #ifndef OPENSSL_NO_RC2
1639 RC2_set_key(&rc2_ks, 16, key16, 128);
1641 #ifndef OPENSSL_NO_RC5
1642 RC5_32_set_key(&rc5_ks, 16, key16, 12);
1644 #ifndef OPENSSL_NO_BF
1645 BF_set_key(&bf_ks, 16, key16);
1647 #ifndef OPENSSL_NO_CAST
1648 CAST_set_key(&cast_ks, 16, key16);
1651 # ifndef OPENSSL_NO_DES
1652 BIO_printf(bio_err, "First we calculate the approximate speed ...\n");
1658 for (it = count; it; it--)
1659 DES_ecb_encrypt((DES_cblock *)loopargs[0].buf,
1660 (DES_cblock *)loopargs[0].buf, &sch, DES_ENCRYPT);
1664 c[D_MD2][0] = count / 10;
1665 c[D_MDC2][0] = count / 10;
1666 c[D_MD4][0] = count;
1667 c[D_MD5][0] = count;
1668 c[D_HMAC][0] = count;
1669 c[D_SHA1][0] = count;
1670 c[D_RMD160][0] = count;
1671 c[D_RC4][0] = count * 5;
1672 c[D_CBC_DES][0] = count;
1673 c[D_EDE3_DES][0] = count / 3;
1674 c[D_CBC_IDEA][0] = count;
1675 c[D_CBC_SEED][0] = count;
1676 c[D_CBC_RC2][0] = count;
1677 c[D_CBC_RC5][0] = count;
1678 c[D_CBC_BF][0] = count;
1679 c[D_CBC_CAST][0] = count;
1680 c[D_CBC_128_AES][0] = count;
1681 c[D_CBC_192_AES][0] = count;
1682 c[D_CBC_256_AES][0] = count;
1683 c[D_CBC_128_CML][0] = count;
1684 c[D_CBC_192_CML][0] = count;
1685 c[D_CBC_256_CML][0] = count;
1686 c[D_SHA256][0] = count;
1687 c[D_SHA512][0] = count;
1688 c[D_WHIRLPOOL][0] = count;
1689 c[D_IGE_128_AES][0] = count;
1690 c[D_IGE_192_AES][0] = count;
1691 c[D_IGE_256_AES][0] = count;
1692 c[D_GHASH][0] = count;
1694 for (i = 1; i < SIZE_NUM; i++) {
1697 l0 = (long)lengths[0];
1698 l1 = (long)lengths[i];
1700 c[D_MD2][i] = c[D_MD2][0] * 4 * l0 / l1;
1701 c[D_MDC2][i] = c[D_MDC2][0] * 4 * l0 / l1;
1702 c[D_MD4][i] = c[D_MD4][0] * 4 * l0 / l1;
1703 c[D_MD5][i] = c[D_MD5][0] * 4 * l0 / l1;
1704 c[D_HMAC][i] = c[D_HMAC][0] * 4 * l0 / l1;
1705 c[D_SHA1][i] = c[D_SHA1][0] * 4 * l0 / l1;
1706 c[D_RMD160][i] = c[D_RMD160][0] * 4 * l0 / l1;
1707 c[D_SHA256][i] = c[D_SHA256][0] * 4 * l0 / l1;
1708 c[D_SHA512][i] = c[D_SHA512][0] * 4 * l0 / l1;
1709 c[D_WHIRLPOOL][i] = c[D_WHIRLPOOL][0] * 4 * l0 / l1;
1710 c[D_GHASH][i] = c[D_GHASH][0] * 4 * l0 / l1;
1712 l0 = (long)lengths[i - 1];
1714 c[D_RC4][i] = c[D_RC4][i - 1] * l0 / l1;
1715 c[D_CBC_DES][i] = c[D_CBC_DES][i - 1] * l0 / l1;
1716 c[D_EDE3_DES][i] = c[D_EDE3_DES][i - 1] * l0 / l1;
1717 c[D_CBC_IDEA][i] = c[D_CBC_IDEA][i - 1] * l0 / l1;
1718 c[D_CBC_SEED][i] = c[D_CBC_SEED][i - 1] * l0 / l1;
1719 c[D_CBC_RC2][i] = c[D_CBC_RC2][i - 1] * l0 / l1;
1720 c[D_CBC_RC5][i] = c[D_CBC_RC5][i - 1] * l0 / l1;
1721 c[D_CBC_BF][i] = c[D_CBC_BF][i - 1] * l0 / l1;
1722 c[D_CBC_CAST][i] = c[D_CBC_CAST][i - 1] * l0 / l1;
1723 c[D_CBC_128_AES][i] = c[D_CBC_128_AES][i - 1] * l0 / l1;
1724 c[D_CBC_192_AES][i] = c[D_CBC_192_AES][i - 1] * l0 / l1;
1725 c[D_CBC_256_AES][i] = c[D_CBC_256_AES][i - 1] * l0 / l1;
1726 c[D_CBC_128_CML][i] = c[D_CBC_128_CML][i - 1] * l0 / l1;
1727 c[D_CBC_192_CML][i] = c[D_CBC_192_CML][i - 1] * l0 / l1;
1728 c[D_CBC_256_CML][i] = c[D_CBC_256_CML][i - 1] * l0 / l1;
1729 c[D_IGE_128_AES][i] = c[D_IGE_128_AES][i - 1] * l0 / l1;
1730 c[D_IGE_192_AES][i] = c[D_IGE_192_AES][i - 1] * l0 / l1;
1731 c[D_IGE_256_AES][i] = c[D_IGE_256_AES][i - 1] * l0 / l1;
1734 # ifndef OPENSSL_NO_RSA
1735 rsa_c[R_RSA_512][0] = count / 2000;
1736 rsa_c[R_RSA_512][1] = count / 400;
1737 for (i = 1; i < RSA_NUM; i++) {
1738 rsa_c[i][0] = rsa_c[i - 1][0] / 8;
1739 rsa_c[i][1] = rsa_c[i - 1][1] / 4;
1740 if (rsa_doit[i] <= 1 && rsa_c[i][0] == 0)
1743 if (rsa_c[i][0] == 0) {
1744 rsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
1751 # ifndef OPENSSL_NO_DSA
1752 dsa_c[R_DSA_512][0] = count / 1000;
1753 dsa_c[R_DSA_512][1] = count / 1000 / 2;
1754 for (i = 1; i < DSA_NUM; i++) {
1755 dsa_c[i][0] = dsa_c[i - 1][0] / 4;
1756 dsa_c[i][1] = dsa_c[i - 1][1] / 4;
1757 if (dsa_doit[i] <= 1 && dsa_c[i][0] == 0)
1760 if (dsa_c[i][0] == 0) {
1761 dsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
1768 # ifndef OPENSSL_NO_EC
1769 ecdsa_c[R_EC_P160][0] = count / 1000;
1770 ecdsa_c[R_EC_P160][1] = count / 1000 / 2;
1771 for (i = R_EC_P192; i <= R_EC_P521; i++) {
1772 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1773 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1774 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1777 if (ecdsa_c[i][0] == 0) {
1783 ecdsa_c[R_EC_K163][0] = count / 1000;
1784 ecdsa_c[R_EC_K163][1] = count / 1000 / 2;
1785 for (i = R_EC_K233; i <= R_EC_K571; i++) {
1786 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1787 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1788 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1791 if (ecdsa_c[i][0] == 0) {
1797 ecdsa_c[R_EC_B163][0] = count / 1000;
1798 ecdsa_c[R_EC_B163][1] = count / 1000 / 2;
1799 for (i = R_EC_B233; i <= R_EC_B571; i++) {
1800 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1801 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1802 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1805 if (ecdsa_c[i][0] == 0) {
1812 ecdh_c[R_EC_P160][0] = count / 1000;
1813 for (i = R_EC_P192; i <= R_EC_P521; i++) {
1814 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1815 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1818 if (ecdh_c[i][0] == 0) {
1823 ecdh_c[R_EC_K163][0] = count / 1000;
1824 for (i = R_EC_K233; i <= R_EC_K571; i++) {
1825 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1826 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1829 if (ecdh_c[i][0] == 0) {
1834 ecdh_c[R_EC_B163][0] = count / 1000;
1835 for (i = R_EC_B233; i <= R_EC_B571; i++) {
1836 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1837 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1840 if (ecdh_c[i][0] == 0) {
1845 /* default iteration count for the last EC Curve */
1846 ecdh_c[R_EC_X25519][0] = count / 1800;
1850 /* not worth fixing */
1851 # error "You cannot disable DES on systems without SIGALRM."
1852 # endif /* OPENSSL_NO_DES */
1855 signal(SIGALRM, sig_done);
1857 #endif /* SIGALRM */
1859 #ifndef OPENSSL_NO_MD2
1861 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1862 print_message(names[D_MD2], c[D_MD2][testnum], lengths[testnum]);
1864 count = run_benchmark(async_jobs, EVP_Digest_MD2_loop, loopargs);
1866 print_result(D_MD2, testnum, count, d);
1870 #ifndef OPENSSL_NO_MDC2
1872 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1873 print_message(names[D_MDC2], c[D_MDC2][testnum], lengths[testnum]);
1875 count = run_benchmark(async_jobs, EVP_Digest_MDC2_loop, loopargs);
1877 print_result(D_MDC2, testnum, count, d);
1882 #ifndef OPENSSL_NO_MD4
1884 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1885 print_message(names[D_MD4], c[D_MD4][testnum], lengths[testnum]);
1887 count = run_benchmark(async_jobs, EVP_Digest_MD4_loop, loopargs);
1889 print_result(D_MD4, testnum, count, d);
1894 #ifndef OPENSSL_NO_MD5
1896 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1897 print_message(names[D_MD5], c[D_MD5][testnum], lengths[testnum]);
1899 count = run_benchmark(async_jobs, MD5_loop, loopargs);
1901 print_result(D_MD5, testnum, count, d);
1906 static const char hmac_key[] = "This is a key...";
1907 int len = strlen(hmac_key);
1909 for (i = 0; i < loopargs_len; i++) {
1910 loopargs[i].hctx = HMAC_CTX_new();
1911 if (loopargs[i].hctx == NULL) {
1912 BIO_printf(bio_err, "HMAC malloc failure, exiting...");
1916 HMAC_Init_ex(loopargs[i].hctx, hmac_key, len, EVP_md5(), NULL);
1918 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1919 print_message(names[D_HMAC], c[D_HMAC][testnum], lengths[testnum]);
1921 count = run_benchmark(async_jobs, HMAC_loop, loopargs);
1923 print_result(D_HMAC, testnum, count, d);
1925 for (i = 0; i < loopargs_len; i++) {
1926 HMAC_CTX_free(loopargs[i].hctx);
1931 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1932 print_message(names[D_SHA1], c[D_SHA1][testnum], lengths[testnum]);
1934 count = run_benchmark(async_jobs, SHA1_loop, loopargs);
1936 print_result(D_SHA1, testnum, count, d);
1939 if (doit[D_SHA256]) {
1940 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1941 print_message(names[D_SHA256], c[D_SHA256][testnum], lengths[testnum]);
1943 count = run_benchmark(async_jobs, SHA256_loop, loopargs);
1945 print_result(D_SHA256, testnum, count, d);
1948 if (doit[D_SHA512]) {
1949 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1950 print_message(names[D_SHA512], c[D_SHA512][testnum], lengths[testnum]);
1952 count = run_benchmark(async_jobs, SHA512_loop, loopargs);
1954 print_result(D_SHA512, testnum, count, d);
1958 #ifndef OPENSSL_NO_WHIRLPOOL
1959 if (doit[D_WHIRLPOOL]) {
1960 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1961 print_message(names[D_WHIRLPOOL], c[D_WHIRLPOOL][testnum], lengths[testnum]);
1963 count = run_benchmark(async_jobs, WHIRLPOOL_loop, loopargs);
1965 print_result(D_WHIRLPOOL, testnum, count, d);
1970 #ifndef OPENSSL_NO_RMD160
1971 if (doit[D_RMD160]) {
1972 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1973 print_message(names[D_RMD160], c[D_RMD160][testnum], lengths[testnum]);
1975 count = run_benchmark(async_jobs, EVP_Digest_RMD160_loop, loopargs);
1977 print_result(D_RMD160, testnum, count, d);
1981 #ifndef OPENSSL_NO_RC4
1983 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1984 print_message(names[D_RC4], c[D_RC4][testnum], lengths[testnum]);
1986 count = run_benchmark(async_jobs, RC4_loop, loopargs);
1988 print_result(D_RC4, testnum, count, d);
1992 #ifndef OPENSSL_NO_DES
1993 if (doit[D_CBC_DES]) {
1994 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1995 print_message(names[D_CBC_DES], c[D_CBC_DES][testnum], lengths[testnum]);
1997 count = run_benchmark(async_jobs, DES_ncbc_encrypt_loop, loopargs);
1999 print_result(D_CBC_DES, testnum, count, d);
2003 if (doit[D_EDE3_DES]) {
2004 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2005 print_message(names[D_EDE3_DES], c[D_EDE3_DES][testnum], lengths[testnum]);
2007 count = run_benchmark(async_jobs, DES_ede3_cbc_encrypt_loop, loopargs);
2009 print_result(D_EDE3_DES, testnum, count, d);
2014 if (doit[D_CBC_128_AES]) {
2015 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2016 print_message(names[D_CBC_128_AES], c[D_CBC_128_AES][testnum],
2019 count = run_benchmark(async_jobs, AES_cbc_128_encrypt_loop, loopargs);
2021 print_result(D_CBC_128_AES, testnum, count, d);
2024 if (doit[D_CBC_192_AES]) {
2025 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2026 print_message(names[D_CBC_192_AES], c[D_CBC_192_AES][testnum],
2029 count = run_benchmark(async_jobs, AES_cbc_192_encrypt_loop, loopargs);
2031 print_result(D_CBC_192_AES, testnum, count, d);
2034 if (doit[D_CBC_256_AES]) {
2035 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2036 print_message(names[D_CBC_256_AES], c[D_CBC_256_AES][testnum],
2039 count = run_benchmark(async_jobs, AES_cbc_256_encrypt_loop, loopargs);
2041 print_result(D_CBC_256_AES, testnum, count, d);
2045 if (doit[D_IGE_128_AES]) {
2046 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2047 print_message(names[D_IGE_128_AES], c[D_IGE_128_AES][testnum],
2050 count = run_benchmark(async_jobs, AES_ige_128_encrypt_loop, loopargs);
2052 print_result(D_IGE_128_AES, testnum, count, d);
2055 if (doit[D_IGE_192_AES]) {
2056 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2057 print_message(names[D_IGE_192_AES], c[D_IGE_192_AES][testnum],
2060 count = run_benchmark(async_jobs, AES_ige_192_encrypt_loop, loopargs);
2062 print_result(D_IGE_192_AES, testnum, count, d);
2065 if (doit[D_IGE_256_AES]) {
2066 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2067 print_message(names[D_IGE_256_AES], c[D_IGE_256_AES][testnum],
2070 count = run_benchmark(async_jobs, AES_ige_256_encrypt_loop, loopargs);
2072 print_result(D_IGE_256_AES, testnum, count, d);
2075 if (doit[D_GHASH]) {
2076 for (i = 0; i < loopargs_len; i++) {
2077 loopargs[i].gcm_ctx = CRYPTO_gcm128_new(&aes_ks1, (block128_f) AES_encrypt);
2078 CRYPTO_gcm128_setiv(loopargs[i].gcm_ctx, (unsigned char *)"0123456789ab", 12);
2081 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2082 print_message(names[D_GHASH], c[D_GHASH][testnum], lengths[testnum]);
2084 count = run_benchmark(async_jobs, CRYPTO_gcm128_aad_loop, loopargs);
2086 print_result(D_GHASH, testnum, count, d);
2088 for (i = 0; i < loopargs_len; i++)
2089 CRYPTO_gcm128_release(loopargs[i].gcm_ctx);
2092 #ifndef OPENSSL_NO_CAMELLIA
2093 if (doit[D_CBC_128_CML]) {
2094 if (async_jobs > 0) {
2095 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2096 names[D_CBC_128_CML]);
2097 doit[D_CBC_128_CML] = 0;
2099 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2100 print_message(names[D_CBC_128_CML], c[D_CBC_128_CML][testnum],
2103 for (count = 0, run = 1; COND(c[D_CBC_128_CML][testnum]); count++)
2104 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2105 (size_t)lengths[testnum], &camellia_ks1,
2106 iv, CAMELLIA_ENCRYPT);
2108 print_result(D_CBC_128_CML, testnum, count, d);
2111 if (doit[D_CBC_192_CML]) {
2112 if (async_jobs > 0) {
2113 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2114 names[D_CBC_192_CML]);
2115 doit[D_CBC_192_CML] = 0;
2117 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2118 print_message(names[D_CBC_192_CML], c[D_CBC_192_CML][testnum],
2120 if (async_jobs > 0) {
2121 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2125 for (count = 0, run = 1; COND(c[D_CBC_192_CML][testnum]); count++)
2126 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2127 (size_t)lengths[testnum], &camellia_ks2,
2128 iv, CAMELLIA_ENCRYPT);
2130 print_result(D_CBC_192_CML, testnum, count, d);
2133 if (doit[D_CBC_256_CML]) {
2134 if (async_jobs > 0) {
2135 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2136 names[D_CBC_256_CML]);
2137 doit[D_CBC_256_CML] = 0;
2139 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2140 print_message(names[D_CBC_256_CML], c[D_CBC_256_CML][testnum],
2143 for (count = 0, run = 1; COND(c[D_CBC_256_CML][testnum]); count++)
2144 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2145 (size_t)lengths[testnum], &camellia_ks3,
2146 iv, CAMELLIA_ENCRYPT);
2148 print_result(D_CBC_256_CML, testnum, count, d);
2152 #ifndef OPENSSL_NO_IDEA
2153 if (doit[D_CBC_IDEA]) {
2154 if (async_jobs > 0) {
2155 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2157 doit[D_CBC_IDEA] = 0;
2159 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2160 print_message(names[D_CBC_IDEA], c[D_CBC_IDEA][testnum], lengths[testnum]);
2162 for (count = 0, run = 1; COND(c[D_CBC_IDEA][testnum]); count++)
2163 IDEA_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2164 (size_t)lengths[testnum], &idea_ks,
2167 print_result(D_CBC_IDEA, testnum, count, d);
2171 #ifndef OPENSSL_NO_SEED
2172 if (doit[D_CBC_SEED]) {
2173 if (async_jobs > 0) {
2174 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2176 doit[D_CBC_SEED] = 0;
2178 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2179 print_message(names[D_CBC_SEED], c[D_CBC_SEED][testnum], lengths[testnum]);
2181 for (count = 0, run = 1; COND(c[D_CBC_SEED][testnum]); count++)
2182 SEED_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2183 (size_t)lengths[testnum], &seed_ks, iv, 1);
2185 print_result(D_CBC_SEED, testnum, count, d);
2189 #ifndef OPENSSL_NO_RC2
2190 if (doit[D_CBC_RC2]) {
2191 if (async_jobs > 0) {
2192 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2194 doit[D_CBC_RC2] = 0;
2196 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2197 print_message(names[D_CBC_RC2], c[D_CBC_RC2][testnum], lengths[testnum]);
2198 if (async_jobs > 0) {
2199 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2203 for (count = 0, run = 1; COND(c[D_CBC_RC2][testnum]); count++)
2204 RC2_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2205 (size_t)lengths[testnum], &rc2_ks,
2208 print_result(D_CBC_RC2, testnum, count, d);
2212 #ifndef OPENSSL_NO_RC5
2213 if (doit[D_CBC_RC5]) {
2214 if (async_jobs > 0) {
2215 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2217 doit[D_CBC_RC5] = 0;
2219 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2220 print_message(names[D_CBC_RC5], c[D_CBC_RC5][testnum], lengths[testnum]);
2221 if (async_jobs > 0) {
2222 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2226 for (count = 0, run = 1; COND(c[D_CBC_RC5][testnum]); count++)
2227 RC5_32_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2228 (size_t)lengths[testnum], &rc5_ks,
2231 print_result(D_CBC_RC5, testnum, count, d);
2235 #ifndef OPENSSL_NO_BF
2236 if (doit[D_CBC_BF]) {
2237 if (async_jobs > 0) {
2238 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2242 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2243 print_message(names[D_CBC_BF], c[D_CBC_BF][testnum], lengths[testnum]);
2245 for (count = 0, run = 1; COND(c[D_CBC_BF][testnum]); count++)
2246 BF_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2247 (size_t)lengths[testnum], &bf_ks,
2250 print_result(D_CBC_BF, testnum, count, d);
2254 #ifndef OPENSSL_NO_CAST
2255 if (doit[D_CBC_CAST]) {
2256 if (async_jobs > 0) {
2257 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2259 doit[D_CBC_CAST] = 0;
2261 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2262 print_message(names[D_CBC_CAST], c[D_CBC_CAST][testnum], lengths[testnum]);
2264 for (count = 0, run = 1; COND(c[D_CBC_CAST][testnum]); count++)
2265 CAST_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2266 (size_t)lengths[testnum], &cast_ks,
2269 print_result(D_CBC_CAST, testnum, count, d);
2275 if (multiblock && evp_cipher) {
2277 (EVP_CIPHER_flags(evp_cipher) &
2278 EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) {
2279 BIO_printf(bio_err, "%s is not multi-block capable\n",
2280 OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher)));
2283 if (async_jobs > 0) {
2284 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2287 multiblock_speed(evp_cipher);
2291 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2294 names[D_EVP] = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
2296 * -O3 -fschedule-insns messes up an optimization here!
2297 * names[D_EVP] somehow becomes NULL
2299 print_message(names[D_EVP], save_count, lengths[testnum]);
2301 for (k = 0; k < loopargs_len; k++) {
2302 loopargs[k].ctx = EVP_CIPHER_CTX_new();
2304 EVP_DecryptInit_ex(loopargs[k].ctx, evp_cipher, NULL, key16, iv);
2306 EVP_EncryptInit_ex(loopargs[k].ctx, evp_cipher, NULL, key16, iv);
2307 EVP_CIPHER_CTX_set_padding(loopargs[k].ctx, 0);
2311 count = run_benchmark(async_jobs, EVP_Update_loop, loopargs);
2313 for (k = 0; k < loopargs_len; k++) {
2314 EVP_CIPHER_CTX_free(loopargs[k].ctx);
2318 names[D_EVP] = OBJ_nid2ln(EVP_MD_type(evp_md));
2319 print_message(names[D_EVP], save_count, lengths[testnum]);
2321 count = run_benchmark(async_jobs, EVP_Digest_loop, loopargs);
2324 print_result(D_EVP, testnum, count, d);
2328 for (i = 0; i < loopargs_len; i++)
2329 RAND_bytes(loopargs[i].buf, 36);
2331 #ifndef OPENSSL_NO_RSA
2332 for (testnum = 0; testnum < RSA_NUM; testnum++) {
2334 if (!rsa_doit[testnum])
2336 for (i = 0; i < loopargs_len; i++) {
2337 st = RSA_sign(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
2338 &loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
2344 "RSA sign failure. No RSA sign will be done.\n");
2345 ERR_print_errors(bio_err);
2348 pkey_print_message("private", "rsa",
2349 rsa_c[testnum][0], rsa_bits[testnum], RSA_SECONDS);
2350 /* RSA_blinding_on(rsa_key[testnum],NULL); */
2352 count = run_benchmark(async_jobs, RSA_sign_loop, loopargs);
2355 mr ? "+R1:%ld:%d:%.2f\n"
2356 : "%ld %d bit private RSA's in %.2fs\n",
2357 count, rsa_bits[testnum], d);
2358 rsa_results[testnum][0] = d / (double)count;
2362 for (i = 0; i < loopargs_len; i++) {
2363 st = RSA_verify(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
2364 loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
2370 "RSA verify failure. No RSA verify will be done.\n");
2371 ERR_print_errors(bio_err);
2372 rsa_doit[testnum] = 0;
2374 pkey_print_message("public", "rsa",
2375 rsa_c[testnum][1], rsa_bits[testnum], RSA_SECONDS);
2377 count = run_benchmark(async_jobs, RSA_verify_loop, loopargs);
2380 mr ? "+R2:%ld:%d:%.2f\n"
2381 : "%ld %d bit public RSA's in %.2fs\n",
2382 count, rsa_bits[testnum], d);
2383 rsa_results[testnum][1] = d / (double)count;
2386 if (rsa_count <= 1) {
2387 /* if longer than 10s, don't do any more */
2388 for (testnum++; testnum < RSA_NUM; testnum++)
2389 rsa_doit[testnum] = 0;
2392 #endif /* OPENSSL_NO_RSA */
2394 for (i = 0; i < loopargs_len; i++)
2395 RAND_bytes(loopargs[i].buf, 36);
2397 #ifndef OPENSSL_NO_DSA
2398 if (RAND_status() != 1) {
2399 RAND_seed(rnd_seed, sizeof(rnd_seed));
2401 for (testnum = 0; testnum < DSA_NUM; testnum++) {
2403 if (!dsa_doit[testnum])
2406 /* DSA_generate_key(dsa_key[testnum]); */
2407 /* DSA_sign_setup(dsa_key[testnum],NULL); */
2408 for (i = 0; i < loopargs_len; i++) {
2409 st = DSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
2410 &loopargs[i].siglen, loopargs[i].dsa_key[testnum]);
2416 "DSA sign failure. No DSA sign will be done.\n");
2417 ERR_print_errors(bio_err);
2420 pkey_print_message("sign", "dsa",
2421 dsa_c[testnum][0], dsa_bits[testnum], DSA_SECONDS);
2423 count = run_benchmark(async_jobs, DSA_sign_loop, loopargs);
2426 mr ? "+R3:%ld:%d:%.2f\n"
2427 : "%ld %d bit DSA signs in %.2fs\n",
2428 count, dsa_bits[testnum], d);
2429 dsa_results[testnum][0] = d / (double)count;
2433 for (i = 0; i < loopargs_len; i++) {
2434 st = DSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
2435 loopargs[i].siglen, loopargs[i].dsa_key[testnum]);
2441 "DSA verify failure. No DSA verify will be done.\n");
2442 ERR_print_errors(bio_err);
2443 dsa_doit[testnum] = 0;
2445 pkey_print_message("verify", "dsa",
2446 dsa_c[testnum][1], dsa_bits[testnum], DSA_SECONDS);
2448 count = run_benchmark(async_jobs, DSA_verify_loop, loopargs);
2451 mr ? "+R4:%ld:%d:%.2f\n"
2452 : "%ld %d bit DSA verify in %.2fs\n",
2453 count, dsa_bits[testnum], d);
2454 dsa_results[testnum][1] = d / (double)count;
2457 if (rsa_count <= 1) {
2458 /* if longer than 10s, don't do any more */
2459 for (testnum++; testnum < DSA_NUM; testnum++)
2460 dsa_doit[testnum] = 0;
2463 #endif /* OPENSSL_NO_DSA */
2465 #ifndef OPENSSL_NO_EC
2466 if (RAND_status() != 1) {
2467 RAND_seed(rnd_seed, sizeof(rnd_seed));
2469 for (testnum = 0; testnum < ECDSA_NUM; testnum++) {
2472 if (!ecdsa_doit[testnum])
2473 continue; /* Ignore Curve */
2474 for (i = 0; i < loopargs_len; i++) {
2475 loopargs[i].ecdsa[testnum] = EC_KEY_new_by_curve_name(test_curves[testnum]);
2476 if (loopargs[i].ecdsa[testnum] == NULL) {
2482 BIO_printf(bio_err, "ECDSA failure.\n");
2483 ERR_print_errors(bio_err);
2486 for (i = 0; i < loopargs_len; i++) {
2487 EC_KEY_precompute_mult(loopargs[i].ecdsa[testnum], NULL);
2488 /* Perform ECDSA signature test */
2489 EC_KEY_generate_key(loopargs[i].ecdsa[testnum]);
2490 st = ECDSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
2491 &loopargs[i].siglen, loopargs[i].ecdsa[testnum]);
2497 "ECDSA sign failure. No ECDSA sign will be done.\n");
2498 ERR_print_errors(bio_err);
2501 pkey_print_message("sign", "ecdsa",
2502 ecdsa_c[testnum][0],
2503 test_curves_bits[testnum], ECDSA_SECONDS);
2505 count = run_benchmark(async_jobs, ECDSA_sign_loop, loopargs);
2509 mr ? "+R5:%ld:%d:%.2f\n" :
2510 "%ld %d bit ECDSA signs in %.2fs \n",
2511 count, test_curves_bits[testnum], d);
2512 ecdsa_results[testnum][0] = d / (double)count;
2516 /* Perform ECDSA verification test */
2517 for (i = 0; i < loopargs_len; i++) {
2518 st = ECDSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
2519 loopargs[i].siglen, loopargs[i].ecdsa[testnum]);
2525 "ECDSA verify failure. No ECDSA verify will be done.\n");
2526 ERR_print_errors(bio_err);
2527 ecdsa_doit[testnum] = 0;
2529 pkey_print_message("verify", "ecdsa",
2530 ecdsa_c[testnum][1],
2531 test_curves_bits[testnum], ECDSA_SECONDS);
2533 count = run_benchmark(async_jobs, ECDSA_verify_loop, loopargs);
2536 mr ? "+R6:%ld:%d:%.2f\n"
2537 : "%ld %d bit ECDSA verify in %.2fs\n",
2538 count, test_curves_bits[testnum], d);
2539 ecdsa_results[testnum][1] = d / (double)count;
2542 if (rsa_count <= 1) {
2543 /* if longer than 10s, don't do any more */
2544 for (testnum++; testnum < EC_NUM; testnum++)
2545 ecdsa_doit[testnum] = 0;
2550 if (RAND_status() != 1) {
2551 RAND_seed(rnd_seed, sizeof(rnd_seed));
2553 for (testnum = 0; testnum < EC_NUM; testnum++) {
2554 int ecdh_checks = 1;
2556 if (!ecdh_doit[testnum])
2558 for (i = 0; i < loopargs_len; i++) {
2559 loopargs[i].ecdh_a[testnum] = EC_KEY_new_by_curve_name(test_curves[testnum]);
2560 loopargs[i].ecdh_b[testnum] = EC_KEY_new_by_curve_name(test_curves[testnum]);
2561 if (loopargs[i].ecdh_a[testnum] == NULL ||
2562 loopargs[i].ecdh_b[testnum] == NULL) {
2567 if (ecdh_checks == 0) {
2568 BIO_printf(bio_err, "ECDH failure.\n");
2569 ERR_print_errors(bio_err);
2572 for (i = 0; i < loopargs_len; i++) {
2573 /* generate two ECDH key pairs */
2574 if (!EC_KEY_generate_key(loopargs[i].ecdh_a[testnum]) ||
2575 !EC_KEY_generate_key(loopargs[i].ecdh_b[testnum])) {
2576 BIO_printf(bio_err, "ECDH key generation failure.\n");
2577 ERR_print_errors(bio_err);
2581 int secret_size_a, secret_size_b, j;
2583 * If field size is not more than 24 octets, then use SHA-1
2584 * hash of result; otherwise, use result (see section 4.8 of
2585 * draft-ietf-tls-ecc-03.txt).
2587 int field_size = EC_GROUP_get_degree(
2588 EC_KEY_get0_group(loopargs[i].ecdh_a[testnum]));
2590 if (field_size <= 24 * 8) { /* 192 bits */
2591 loopargs[i].outlen = KDF1_SHA1_len;
2592 loopargs[i].kdf = KDF1_SHA1;
2594 loopargs[i].outlen = (field_size + 7) / 8;
2595 loopargs[i].kdf = NULL;
2598 ECDH_compute_key(loopargs[i].secret_a, loopargs[i].outlen,
2599 EC_KEY_get0_public_key(loopargs[i].ecdh_b[testnum]),
2600 loopargs[i].ecdh_a[testnum], loopargs[i].kdf);
2602 ECDH_compute_key(loopargs[i].secret_b, loopargs[i].outlen,
2603 EC_KEY_get0_public_key(loopargs[i].ecdh_a[testnum]),
2604 loopargs[i].ecdh_b[testnum], loopargs[i].kdf);
2605 if (secret_size_a != secret_size_b)
2610 for (j = 0; j < secret_size_a && ecdh_checks == 1; j++) {
2611 if (loopargs[i].secret_a[j] != loopargs[i].secret_b[j])
2615 if (ecdh_checks == 0) {
2616 BIO_printf(bio_err, "ECDH computations don't match.\n");
2617 ERR_print_errors(bio_err);
2623 if (ecdh_checks != 0) {
2624 pkey_print_message("", "ecdh",
2626 test_curves_bits[testnum], ECDH_SECONDS);
2628 count = run_benchmark(async_jobs, ECDH_compute_key_loop, loopargs);
2631 mr ? "+R7:%ld:%d:%.2f\n" :
2632 "%ld %d-bit ECDH ops in %.2fs\n", count,
2633 test_curves_bits[testnum], d);
2634 ecdh_results[testnum][0] = d / (double)count;
2639 if (rsa_count <= 1) {
2640 /* if longer than 10s, don't do any more */
2641 for (testnum++; testnum < OSSL_NELEM(ecdh_doit); testnum++)
2642 ecdh_doit[testnum] = 0;
2645 #endif /* OPENSSL_NO_EC */
2650 printf("%s\n", OpenSSL_version(OPENSSL_VERSION));
2651 printf("%s\n", OpenSSL_version(OPENSSL_BUILT_ON));
2653 printf("%s ", BN_options());
2654 #ifndef OPENSSL_NO_MD2
2655 printf("%s ", MD2_options());
2657 #ifndef OPENSSL_NO_RC4
2658 printf("%s ", RC4_options());
2660 #ifndef OPENSSL_NO_DES
2661 printf("%s ", DES_options());
2663 printf("%s ", AES_options());
2664 #ifndef OPENSSL_NO_IDEA
2665 printf("%s ", IDEA_options());
2667 #ifndef OPENSSL_NO_BF
2668 printf("%s ", BF_options());
2670 printf("\n%s\n", OpenSSL_version(OPENSSL_CFLAGS));
2678 ("The 'numbers' are in 1000s of bytes per second processed.\n");
2681 for (testnum = 0; testnum < SIZE_NUM; testnum++)
2682 printf(mr ? ":%d" : "%7d bytes", lengths[testnum]);
2686 for (k = 0; k < ALGOR_NUM; k++) {
2690 printf("+F:%u:%s", k, names[k]);
2692 printf("%-13s", names[k]);
2693 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2694 if (results[k][testnum] > 10000 && !mr)
2695 printf(" %11.2fk", results[k][testnum] / 1e3);
2697 printf(mr ? ":%.2f" : " %11.2f ", results[k][testnum]);
2701 #ifndef OPENSSL_NO_RSA
2703 for (k = 0; k < RSA_NUM; k++) {
2706 if (testnum && !mr) {
2707 printf("%18ssign verify sign/s verify/s\n", " ");
2711 printf("+F2:%u:%u:%f:%f\n",
2712 k, rsa_bits[k], rsa_results[k][0], rsa_results[k][1]);
2714 printf("rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2715 rsa_bits[k], rsa_results[k][0], rsa_results[k][1],
2716 1.0 / rsa_results[k][0], 1.0 / rsa_results[k][1]);
2719 #ifndef OPENSSL_NO_DSA
2721 for (k = 0; k < DSA_NUM; k++) {
2724 if (testnum && !mr) {
2725 printf("%18ssign verify sign/s verify/s\n", " ");
2729 printf("+F3:%u:%u:%f:%f\n",
2730 k, dsa_bits[k], dsa_results[k][0], dsa_results[k][1]);
2732 printf("dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2733 dsa_bits[k], dsa_results[k][0], dsa_results[k][1],
2734 1.0 / dsa_results[k][0], 1.0 / dsa_results[k][1]);
2737 #ifndef OPENSSL_NO_EC
2739 for (k = 0; k < OSSL_NELEM(ecdsa_doit); k++) {
2742 if (testnum && !mr) {
2743 printf("%30ssign verify sign/s verify/s\n", " ");
2748 printf("+F4:%u:%u:%f:%f\n",
2749 k, test_curves_bits[k],
2750 ecdsa_results[k][0], ecdsa_results[k][1]);
2752 printf("%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2753 test_curves_bits[k],
2754 test_curves_names[k],
2755 ecdsa_results[k][0], ecdsa_results[k][1],
2756 1.0 / ecdsa_results[k][0], 1.0 / ecdsa_results[k][1]);
2760 for (k = 0; k < EC_NUM; k++) {
2763 if (testnum && !mr) {
2764 printf("%30sop op/s\n", " ");
2768 printf("+F5:%u:%u:%f:%f\n",
2769 k, test_curves_bits[k],
2770 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
2773 printf("%4u bit ecdh (%s) %8.4fs %8.1f\n",
2774 test_curves_bits[k],
2775 test_curves_names[k],
2776 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
2783 ERR_print_errors(bio_err);
2784 for (i = 0; i < loopargs_len; i++) {
2785 OPENSSL_free(loopargs[i].buf_malloc);
2786 OPENSSL_free(loopargs[i].buf2_malloc);
2788 #ifndef OPENSSL_NO_RSA
2789 for (k = 0; k < RSA_NUM; k++)
2790 RSA_free(loopargs[i].rsa_key[k]);
2792 #ifndef OPENSSL_NO_DSA
2793 for (k = 0; k < DSA_NUM; k++)
2794 DSA_free(loopargs[i].dsa_key[k]);
2796 #ifndef OPENSSL_NO_EC
2797 for (k = 0; k < ECDSA_NUM; k++)
2798 EC_KEY_free(loopargs[i].ecdsa[k]);
2799 for (k = 0; k < EC_NUM; k++) {
2800 EC_KEY_free(loopargs[i].ecdh_a[k]);
2801 EC_KEY_free(loopargs[i].ecdh_b[k]);
2803 OPENSSL_free(loopargs[i].secret_a);
2804 OPENSSL_free(loopargs[i].secret_b);
2808 if (async_jobs > 0) {
2809 for (i = 0; i < loopargs_len; i++)
2810 ASYNC_WAIT_CTX_free(loopargs[i].wait_ctx);
2814 ASYNC_cleanup_thread();
2816 OPENSSL_free(loopargs);
2821 static void print_message(const char *s, long num, int length)
2825 mr ? "+DT:%s:%d:%d\n"
2826 : "Doing %s for %ds on %d size blocks: ", s, SECONDS, length);
2827 (void)BIO_flush(bio_err);
2831 mr ? "+DN:%s:%ld:%d\n"
2832 : "Doing %s %ld times on %d size blocks: ", s, num, length);
2833 (void)BIO_flush(bio_err);
2837 static void pkey_print_message(const char *str, const char *str2, long num,
2842 mr ? "+DTP:%d:%s:%s:%d\n"
2843 : "Doing %d bit %s %s's for %ds: ", bits, str, str2, tm);
2844 (void)BIO_flush(bio_err);
2848 mr ? "+DNP:%ld:%d:%s:%s\n"
2849 : "Doing %ld %d bit %s %s's: ", num, bits, str, str2);
2850 (void)BIO_flush(bio_err);
2854 static void print_result(int alg, int run_no, int count, double time_used)
2857 BIO_puts(bio_err, "EVP error!\n");
2861 mr ? "+R:%d:%s:%f\n"
2862 : "%d %s's in %.2fs\n", count, names[alg], time_used);
2863 results[alg][run_no] = ((double)count) / time_used * lengths[run_no];
2867 static char *sstrsep(char **string, const char *delim)
2870 char *token = *string;
2875 memset(isdelim, 0, sizeof(isdelim));
2879 isdelim[(unsigned char)(*delim)] = 1;
2883 while (!isdelim[(unsigned char)(**string)]) {
2895 static int do_multi(int multi)
2900 static char sep[] = ":";
2902 fds = malloc(sizeof(*fds) * multi);
2903 for (n = 0; n < multi; ++n) {
2904 if (pipe(fd) == -1) {
2905 BIO_printf(bio_err, "pipe failure\n");
2909 (void)BIO_flush(bio_err);
2916 if (dup(fd[1]) == -1) {
2917 BIO_printf(bio_err, "dup failed\n");
2926 printf("Forked child %d\n", n);
2929 /* for now, assume the pipe is long enough to take all the output */
2930 for (n = 0; n < multi; ++n) {
2935 f = fdopen(fds[n], "r");
2936 while (fgets(buf, sizeof(buf), f)) {
2937 p = strchr(buf, '\n');
2940 if (buf[0] != '+') {
2941 BIO_printf(bio_err, "Don't understand line '%s' from child %d\n",
2945 printf("Got: %s from %d\n", buf, n);
2946 if (strncmp(buf, "+F:", 3) == 0) {
2951 alg = atoi(sstrsep(&p, sep));
2953 for (j = 0; j < SIZE_NUM; ++j)
2954 results[alg][j] += atof(sstrsep(&p, sep));
2955 } else if (strncmp(buf, "+F2:", 4) == 0) {
2960 k = atoi(sstrsep(&p, sep));
2963 d = atof(sstrsep(&p, sep));
2965 rsa_results[k][0] = 1 / (1 / rsa_results[k][0] + 1 / d);
2967 rsa_results[k][0] = d;
2969 d = atof(sstrsep(&p, sep));
2971 rsa_results[k][1] = 1 / (1 / rsa_results[k][1] + 1 / d);
2973 rsa_results[k][1] = d;
2975 # ifndef OPENSSL_NO_DSA
2976 else if (strncmp(buf, "+F3:", 4) == 0) {
2981 k = atoi(sstrsep(&p, sep));
2984 d = atof(sstrsep(&p, sep));
2986 dsa_results[k][0] = 1 / (1 / dsa_results[k][0] + 1 / d);
2988 dsa_results[k][0] = d;
2990 d = atof(sstrsep(&p, sep));
2992 dsa_results[k][1] = 1 / (1 / dsa_results[k][1] + 1 / d);
2994 dsa_results[k][1] = d;
2997 # ifndef OPENSSL_NO_EC
2998 else if (strncmp(buf, "+F4:", 4) == 0) {
3003 k = atoi(sstrsep(&p, sep));
3006 d = atof(sstrsep(&p, sep));
3008 ecdsa_results[k][0] =
3009 1 / (1 / ecdsa_results[k][0] + 1 / d);
3011 ecdsa_results[k][0] = d;
3013 d = atof(sstrsep(&p, sep));
3015 ecdsa_results[k][1] =
3016 1 / (1 / ecdsa_results[k][1] + 1 / d);
3018 ecdsa_results[k][1] = d;
3019 } else if (strncmp(buf, "+F5:", 4) == 0) {
3024 k = atoi(sstrsep(&p, sep));
3027 d = atof(sstrsep(&p, sep));
3029 ecdh_results[k][0] = 1 / (1 / ecdh_results[k][0] + 1 / d);
3031 ecdh_results[k][0] = d;
3036 else if (strncmp(buf, "+H:", 3) == 0) {
3039 BIO_printf(bio_err, "Unknown type '%s' from child %d\n", buf, n);
3049 static void multiblock_speed(const EVP_CIPHER *evp_cipher)
3051 static int mblengths[] =
3052 { 8 * 1024, 2 * 8 * 1024, 4 * 8 * 1024, 8 * 8 * 1024, 8 * 16 * 1024 };
3053 int j, count, num = OSSL_NELEM(mblengths);
3054 const char *alg_name;
3055 unsigned char *inp, *out, no_key[32], no_iv[16];
3056 EVP_CIPHER_CTX *ctx;
3059 inp = app_malloc(mblengths[num - 1], "multiblock input buffer");
3060 out = app_malloc(mblengths[num - 1] + 1024, "multiblock output buffer");
3061 ctx = EVP_CIPHER_CTX_new();
3062 EVP_EncryptInit_ex(ctx, evp_cipher, NULL, no_key, no_iv);
3063 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_MAC_KEY, sizeof(no_key),
3065 alg_name = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
3067 for (j = 0; j < num; j++) {
3068 print_message(alg_name, 0, mblengths[j]);
3070 for (count = 0, run = 1; run && count < 0x7fffffff; count++) {
3071 unsigned char aad[EVP_AEAD_TLS1_AAD_LEN];
3072 EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM mb_param;
3073 size_t len = mblengths[j];
3076 memset(aad, 0, 8); /* avoid uninitialized values */
3077 aad[8] = 23; /* SSL3_RT_APPLICATION_DATA */
3078 aad[9] = 3; /* version */
3080 aad[11] = 0; /* length */
3082 mb_param.out = NULL;
3085 mb_param.interleave = 8;
3087 packlen = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_AAD,
3088 sizeof(mb_param), &mb_param);
3094 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT,
3095 sizeof(mb_param), &mb_param);
3099 RAND_bytes(out, 16);
3103 pad = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_TLS1_AAD,
3104 EVP_AEAD_TLS1_AAD_LEN, aad);
3105 EVP_Cipher(ctx, out, inp, len + pad);
3109 BIO_printf(bio_err, mr ? "+R:%d:%s:%f\n"
3110 : "%d %s's in %.2fs\n", count, "evp", d);
3111 results[D_EVP][j] = ((double)count) / d * mblengths[j];
3115 fprintf(stdout, "+H");
3116 for (j = 0; j < num; j++)
3117 fprintf(stdout, ":%d", mblengths[j]);
3118 fprintf(stdout, "\n");
3119 fprintf(stdout, "+F:%d:%s", D_EVP, alg_name);
3120 for (j = 0; j < num; j++)
3121 fprintf(stdout, ":%.2f", results[D_EVP][j]);
3122 fprintf(stdout, "\n");
3125 "The 'numbers' are in 1000s of bytes per second processed.\n");
3126 fprintf(stdout, "type ");
3127 for (j = 0; j < num; j++)
3128 fprintf(stdout, "%7d bytes", mblengths[j]);
3129 fprintf(stdout, "\n");
3130 fprintf(stdout, "%-24s", alg_name);
3132 for (j = 0; j < num; j++) {
3133 if (results[D_EVP][j] > 10000)
3134 fprintf(stdout, " %11.2fk", results[D_EVP][j] / 1e3);
3136 fprintf(stdout, " %11.2f ", results[D_EVP][j]);
3138 fprintf(stdout, "\n");
3143 EVP_CIPHER_CTX_free(ctx);