2 * Copyright 1995-2016 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
139 #define MAX_ECDH_SIZE 256
142 static volatile int run = 0;
145 static int usertime = 1;
147 typedef void *(*kdf_fn) (
148 const void *in, size_t inlen, void *out, size_t *xoutlen);
150 typedef struct loopargs_st {
151 ASYNC_JOB *inprogress_job;
152 ASYNC_WAIT_CTX *wait_ctx;
155 unsigned char *buf_malloc;
156 unsigned char *buf2_malloc;
158 #ifndef OPENSSL_NO_RSA
159 RSA *rsa_key[RSA_NUM];
161 #ifndef OPENSSL_NO_DSA
162 DSA *dsa_key[DSA_NUM];
164 #ifndef OPENSSL_NO_EC
165 EC_KEY *ecdsa[EC_NUM];
166 EC_KEY *ecdh_a[EC_NUM];
167 EC_KEY *ecdh_b[EC_NUM];
168 unsigned char *secret_a;
169 unsigned char *secret_b;
175 GCM128_CONTEXT *gcm_ctx;
178 #ifndef OPENSSL_NO_MD2
179 static int EVP_Digest_MD2_loop(void *args);
182 #ifndef OPENSSL_NO_MDC2
183 static int EVP_Digest_MDC2_loop(void *args);
185 #ifndef OPENSSL_NO_MD4
186 static int EVP_Digest_MD4_loop(void *args);
188 #ifndef OPENSSL_NO_MD5
189 static int MD5_loop(void *args);
190 static int HMAC_loop(void *args);
192 static int SHA1_loop(void *args);
193 static int SHA256_loop(void *args);
194 static int SHA512_loop(void *args);
195 #ifndef OPENSSL_NO_WHIRLPOOL
196 static int WHIRLPOOL_loop(void *args);
198 #ifndef OPENSSL_NO_RMD160
199 static int EVP_Digest_RMD160_loop(void *args);
201 #ifndef OPENSSL_NO_RC4
202 static int RC4_loop(void *args);
204 #ifndef OPENSSL_NO_DES
205 static int DES_ncbc_encrypt_loop(void *args);
206 static int DES_ede3_cbc_encrypt_loop(void *args);
208 static int AES_cbc_128_encrypt_loop(void *args);
209 static int AES_cbc_192_encrypt_loop(void *args);
210 static int AES_ige_128_encrypt_loop(void *args);
211 static int AES_cbc_256_encrypt_loop(void *args);
212 static int AES_ige_192_encrypt_loop(void *args);
213 static int AES_ige_256_encrypt_loop(void *args);
214 static int CRYPTO_gcm128_aad_loop(void *args);
215 static int EVP_Update_loop(void *args);
216 static int EVP_Digest_loop(void *args);
217 #ifndef OPENSSL_NO_RSA
218 static int RSA_sign_loop(void *args);
219 static int RSA_verify_loop(void *args);
221 #ifndef OPENSSL_NO_DSA
222 static int DSA_sign_loop(void *args);
223 static int DSA_verify_loop(void *args);
225 #ifndef OPENSSL_NO_EC
226 static int ECDSA_sign_loop(void *args);
227 static int ECDSA_verify_loop(void *args);
228 static int ECDH_compute_key_loop(void *args);
230 static int run_benchmark(int async_jobs, int (*loop_function)(void *), loopargs_t *loopargs);
232 static double Time_F(int s);
233 static void print_message(const char *s, long num, int length);
234 static void pkey_print_message(const char *str, const char *str2,
235 long num, int bits, int sec);
236 static void print_result(int alg, int run_no, int count, double time_used);
238 static int do_multi(int multi);
241 static const char *names[ALGOR_NUM] = {
242 "md2", "mdc2", "md4", "md5", "hmac(md5)", "sha1", "rmd160", "rc4",
243 "des cbc", "des ede3", "idea cbc", "seed cbc",
244 "rc2 cbc", "rc5-32/12 cbc", "blowfish cbc", "cast cbc",
245 "aes-128 cbc", "aes-192 cbc", "aes-256 cbc",
246 "camellia-128 cbc", "camellia-192 cbc", "camellia-256 cbc",
247 "evp", "sha256", "sha512", "whirlpool",
248 "aes-128 ige", "aes-192 ige", "aes-256 ige", "ghash"
251 static double results[ALGOR_NUM][SIZE_NUM];
253 static const int lengths[SIZE_NUM] = {
254 16, 64, 256, 1024, 8 * 1024, 16 * 1024
257 #ifndef OPENSSL_NO_RSA
258 static double rsa_results[RSA_NUM][2];
260 #ifndef OPENSSL_NO_DSA
261 static double dsa_results[DSA_NUM][2];
263 #ifndef OPENSSL_NO_EC
264 static double ecdsa_results[EC_NUM][2];
265 static double ecdh_results[EC_NUM][1];
268 #if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_EC)
269 static const char rnd_seed[] =
270 "string to make the random number generator think it has entropy";
274 # if defined(__STDC__) || defined(sgi) || defined(_AIX)
275 # define SIGRETTYPE void
277 # define SIGRETTYPE int
280 static SIGRETTYPE sig_done(int sig);
281 static SIGRETTYPE sig_done(int sig)
283 signal(SIGALRM, sig_done);
293 # if !defined(SIGALRM)
296 static unsigned int lapse, schlock;
297 static void alarm_win32(unsigned int secs)
302 # define alarm alarm_win32
304 static DWORD WINAPI sleepy(VOID * arg)
312 static double Time_F(int s)
319 thr = CreateThread(NULL, 4096, sleepy, NULL, 0, NULL);
321 DWORD err = GetLastError();
322 BIO_printf(bio_err, "unable to CreateThread (%lu)", err);
326 Sleep(0); /* scheduler spinlock */
327 ret = app_tminterval(s, usertime);
329 ret = app_tminterval(s, usertime);
331 TerminateThread(thr, 0);
339 static double Time_F(int s)
341 double ret = app_tminterval(s, usertime);
348 static void multiblock_speed(const EVP_CIPHER *evp_cipher);
350 static int found(const char *name, const OPT_PAIR * pairs, int *result)
352 for (; pairs->name; pairs++)
353 if (strcmp(name, pairs->name) == 0) {
354 *result = pairs->retval;
360 typedef enum OPTION_choice {
361 OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
362 OPT_ELAPSED, OPT_EVP, OPT_DECRYPT, OPT_ENGINE, OPT_MULTI,
363 OPT_MR, OPT_MB, OPT_MISALIGN, OPT_ASYNCJOBS
366 OPTIONS speed_options[] = {
367 {OPT_HELP_STR, 1, '-', "Usage: %s [options] ciphers...\n"},
368 {OPT_HELP_STR, 1, '-', "Valid options are:\n"},
369 {"help", OPT_HELP, '-', "Display this summary"},
370 {"evp", OPT_EVP, 's', "Use specified EVP cipher"},
371 {"decrypt", OPT_DECRYPT, '-',
372 "Time decryption instead of encryption (only EVP)"},
373 {"mr", OPT_MR, '-', "Produce machine readable output"},
375 "Enable (tls1.1) multi-block mode on evp_cipher requested with -evp"},
376 {"misalign", OPT_MISALIGN, 'n', "Amount to mis-align buffers"},
377 {"elapsed", OPT_ELAPSED, '-',
378 "Measure time in real time instead of CPU user time"},
380 {"multi", OPT_MULTI, 'p', "Run benchmarks in parallel"},
382 #ifndef OPENSSL_NO_ASYNC
383 {"async_jobs", OPT_ASYNCJOBS, 'p', "Enable async mode and start pnum jobs"},
385 #ifndef OPENSSL_NO_ENGINE
386 {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
401 #define D_CBC_IDEA 10
402 #define D_CBC_SEED 11
406 #define D_CBC_CAST 15
407 #define D_CBC_128_AES 16
408 #define D_CBC_192_AES 17
409 #define D_CBC_256_AES 18
410 #define D_CBC_128_CML 19
411 #define D_CBC_192_CML 20
412 #define D_CBC_256_CML 21
416 #define D_WHIRLPOOL 25
417 #define D_IGE_128_AES 26
418 #define D_IGE_192_AES 27
419 #define D_IGE_256_AES 28
421 static OPT_PAIR doit_choices[] = {
422 #ifndef OPENSSL_NO_MD2
425 #ifndef OPENSSL_NO_MDC2
428 #ifndef OPENSSL_NO_MD4
431 #ifndef OPENSSL_NO_MD5
434 #ifndef OPENSSL_NO_MD5
438 {"sha256", D_SHA256},
439 {"sha512", D_SHA512},
440 #ifndef OPENSSL_NO_WHIRLPOOL
441 {"whirlpool", D_WHIRLPOOL},
443 #ifndef OPENSSL_NO_RMD160
444 {"ripemd", D_RMD160},
445 {"rmd160", D_RMD160},
446 {"ripemd160", D_RMD160},
448 #ifndef OPENSSL_NO_RC4
451 #ifndef OPENSSL_NO_DES
452 {"des-cbc", D_CBC_DES},
453 {"des-ede3", D_EDE3_DES},
455 {"aes-128-cbc", D_CBC_128_AES},
456 {"aes-192-cbc", D_CBC_192_AES},
457 {"aes-256-cbc", D_CBC_256_AES},
458 {"aes-128-ige", D_IGE_128_AES},
459 {"aes-192-ige", D_IGE_192_AES},
460 {"aes-256-ige", D_IGE_256_AES},
461 #ifndef OPENSSL_NO_RC2
462 {"rc2-cbc", D_CBC_RC2},
465 #ifndef OPENSSL_NO_RC5
466 {"rc5-cbc", D_CBC_RC5},
469 #ifndef OPENSSL_NO_IDEA
470 {"idea-cbc", D_CBC_IDEA},
471 {"idea", D_CBC_IDEA},
473 #ifndef OPENSSL_NO_SEED
474 {"seed-cbc", D_CBC_SEED},
475 {"seed", D_CBC_SEED},
477 #ifndef OPENSSL_NO_BF
478 {"bf-cbc", D_CBC_BF},
479 {"blowfish", D_CBC_BF},
482 #ifndef OPENSSL_NO_CAST
483 {"cast-cbc", D_CBC_CAST},
484 {"cast", D_CBC_CAST},
485 {"cast5", D_CBC_CAST},
491 #ifndef OPENSSL_NO_DSA
493 # define R_DSA_1024 1
494 # define R_DSA_2048 2
495 static OPT_PAIR dsa_choices[] = {
496 {"dsa512", R_DSA_512},
497 {"dsa1024", R_DSA_1024},
498 {"dsa2048", R_DSA_2048},
509 #define R_RSA_15360 6
510 static OPT_PAIR rsa_choices[] = {
511 {"rsa512", R_RSA_512},
512 {"rsa1024", R_RSA_1024},
513 {"rsa2048", R_RSA_2048},
514 {"rsa3072", R_RSA_3072},
515 {"rsa4096", R_RSA_4096},
516 {"rsa7680", R_RSA_7680},
517 {"rsa15360", R_RSA_15360},
537 #define R_EC_X25519 16
538 #ifndef OPENSSL_NO_EC
539 static OPT_PAIR ecdsa_choices[] = {
540 {"ecdsap160", R_EC_P160},
541 {"ecdsap192", R_EC_P192},
542 {"ecdsap224", R_EC_P224},
543 {"ecdsap256", R_EC_P256},
544 {"ecdsap384", R_EC_P384},
545 {"ecdsap521", R_EC_P521},
546 {"ecdsak163", R_EC_K163},
547 {"ecdsak233", R_EC_K233},
548 {"ecdsak283", R_EC_K283},
549 {"ecdsak409", R_EC_K409},
550 {"ecdsak571", R_EC_K571},
551 {"ecdsab163", R_EC_B163},
552 {"ecdsab233", R_EC_B233},
553 {"ecdsab283", R_EC_B283},
554 {"ecdsab409", R_EC_B409},
555 {"ecdsab571", R_EC_B571},
558 static OPT_PAIR ecdh_choices[] = {
559 {"ecdhp160", R_EC_P160},
560 {"ecdhp192", R_EC_P192},
561 {"ecdhp224", R_EC_P224},
562 {"ecdhp256", R_EC_P256},
563 {"ecdhp384", R_EC_P384},
564 {"ecdhp521", R_EC_P521},
565 {"ecdhk163", R_EC_K163},
566 {"ecdhk233", R_EC_K233},
567 {"ecdhk283", R_EC_K283},
568 {"ecdhk409", R_EC_K409},
569 {"ecdhk571", R_EC_K571},
570 {"ecdhb163", R_EC_B163},
571 {"ecdhb233", R_EC_B233},
572 {"ecdhb283", R_EC_B283},
573 {"ecdhb409", R_EC_B409},
574 {"ecdhb571", R_EC_B571},
575 {"ecdhx25519", R_EC_X25519},
581 # define COND(d) (count < (d))
582 # define COUNT(d) (d)
584 # define COND(unused_cond) (run && count<0x7fffffff)
585 # define COUNT(d) (count)
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[EC_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 /* ndef OPENSSL_NO_EC */
1073 static int run_benchmark(int async_jobs,
1074 int (*loop_function)(void *), loopargs_t *loopargs)
1076 int job_op_count = 0;
1077 int total_op_count = 0;
1078 int num_inprogress = 0;
1079 int error = 0, i = 0, ret = 0;
1080 OSSL_ASYNC_FD job_fd = 0;
1081 size_t num_job_fds = 0;
1085 if (async_jobs == 0) {
1086 return loop_function((void *)loopargs);
1089 for (i = 0; i < async_jobs && !error; i++) {
1090 ret = ASYNC_start_job(&loopargs[i].inprogress_job, loopargs[i].wait_ctx,
1091 &job_op_count, loop_function,
1092 (void *)(loopargs + i), sizeof(loopargs_t));
1098 if (job_op_count == -1) {
1101 total_op_count += job_op_count;
1106 BIO_printf(bio_err, "Failure in the job\n");
1107 ERR_print_errors(bio_err);
1113 while (num_inprogress > 0) {
1114 #if defined(OPENSSL_SYS_WINDOWS)
1116 #elif defined(OPENSSL_SYS_UNIX)
1117 int select_result = 0;
1118 OSSL_ASYNC_FD max_fd = 0;
1121 FD_ZERO(&waitfdset);
1123 for (i = 0; i < async_jobs && num_inprogress > 0; i++) {
1124 if (loopargs[i].inprogress_job == NULL)
1127 if (!ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, NULL, &num_job_fds)
1128 || num_job_fds > 1) {
1129 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1130 ERR_print_errors(bio_err);
1134 ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd, &num_job_fds);
1135 FD_SET(job_fd, &waitfdset);
1136 if (job_fd > max_fd)
1140 if (max_fd >= (OSSL_ASYNC_FD)FD_SETSIZE) {
1142 "Error: max_fd (%d) must be smaller than FD_SETSIZE (%d). "
1143 "Decrease the value of async_jobs\n",
1144 max_fd, FD_SETSIZE);
1145 ERR_print_errors(bio_err);
1150 select_result = select(max_fd + 1, &waitfdset, NULL, NULL, NULL);
1151 if (select_result == -1 && errno == EINTR)
1154 if (select_result == -1) {
1155 BIO_printf(bio_err, "Failure in the select\n");
1156 ERR_print_errors(bio_err);
1161 if (select_result == 0)
1165 for (i = 0; i < async_jobs; i++) {
1166 if (loopargs[i].inprogress_job == NULL)
1169 if (!ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, NULL, &num_job_fds)
1170 || num_job_fds > 1) {
1171 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1172 ERR_print_errors(bio_err);
1176 ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd, &num_job_fds);
1178 #if defined(OPENSSL_SYS_UNIX)
1179 if (num_job_fds == 1 && !FD_ISSET(job_fd, &waitfdset))
1181 #elif defined(OPENSSL_SYS_WINDOWS)
1182 if (num_job_fds == 1
1183 && !PeekNamedPipe(job_fd, NULL, 0, NULL, &avail, NULL)
1188 ret = ASYNC_start_job(&loopargs[i].inprogress_job,
1189 loopargs[i].wait_ctx, &job_op_count, loop_function,
1190 (void *)(loopargs + i), sizeof(loopargs_t));
1195 if (job_op_count == -1) {
1198 total_op_count += job_op_count;
1201 loopargs[i].inprogress_job = NULL;
1206 loopargs[i].inprogress_job = NULL;
1207 BIO_printf(bio_err, "Failure in the job\n");
1208 ERR_print_errors(bio_err);
1215 return error ? -1 : total_op_count;
1218 int speed_main(int argc, char **argv)
1220 loopargs_t *loopargs = NULL;
1222 int loopargs_len = 0;
1224 #ifndef OPENSSL_NO_ENGINE
1225 const char *engine_id = NULL;
1227 const EVP_CIPHER *evp_cipher = NULL;
1230 int multiblock = 0, pr_header = 0;
1231 int doit[ALGOR_NUM] = { 0 };
1232 int ret = 1, i, k, misalign = 0;
1238 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) \
1239 || !defined(OPENSSL_NO_EC)
1243 /* What follows are the buffers and key material. */
1244 #ifndef OPENSSL_NO_RC5
1247 #ifndef OPENSSL_NO_RC2
1250 #ifndef OPENSSL_NO_IDEA
1251 IDEA_KEY_SCHEDULE idea_ks;
1253 #ifndef OPENSSL_NO_SEED
1254 SEED_KEY_SCHEDULE seed_ks;
1256 #ifndef OPENSSL_NO_BF
1259 #ifndef OPENSSL_NO_CAST
1262 static const unsigned char key16[16] = {
1263 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1264 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
1266 static const unsigned char key24[24] = {
1267 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1268 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1269 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1271 static const unsigned char key32[32] = {
1272 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1273 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1274 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
1275 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
1277 #ifndef OPENSSL_NO_CAMELLIA
1278 static const unsigned char ckey24[24] = {
1279 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1280 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1281 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1283 static const unsigned char ckey32[32] = {
1284 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1285 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1286 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
1287 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
1289 CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3;
1291 #ifndef OPENSSL_NO_DES
1292 static DES_cblock key = {
1293 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0
1295 static DES_cblock key2 = {
1296 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
1298 static DES_cblock key3 = {
1299 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1302 #ifndef OPENSSL_NO_RSA
1303 static const unsigned int rsa_bits[RSA_NUM] = {
1304 512, 1024, 2048, 3072, 4096, 7680, 15360
1306 static const unsigned char *rsa_data[RSA_NUM] = {
1307 test512, test1024, test2048, test3072, test4096, test7680, test15360
1309 static const int rsa_data_length[RSA_NUM] = {
1310 sizeof(test512), sizeof(test1024),
1311 sizeof(test2048), sizeof(test3072),
1312 sizeof(test4096), sizeof(test7680),
1315 int rsa_doit[RSA_NUM] = { 0 };
1317 #ifndef OPENSSL_NO_DSA
1318 static const unsigned int dsa_bits[DSA_NUM] = { 512, 1024, 2048 };
1319 int dsa_doit[DSA_NUM] = { 0 };
1321 #ifndef OPENSSL_NO_EC
1323 * We only test over the following curves as they are representative, To
1324 * add tests over more curves, simply add the curve NID and curve name to
1325 * the following arrays and increase the EC_NUM value accordingly.
1327 static const unsigned int test_curves[EC_NUM] = {
1329 NID_secp160r1, NID_X9_62_prime192v1, NID_secp224r1,
1330 NID_X9_62_prime256v1, NID_secp384r1, NID_secp521r1,
1332 NID_sect163k1, NID_sect233k1, NID_sect283k1,
1333 NID_sect409k1, NID_sect571k1, NID_sect163r2,
1334 NID_sect233r1, NID_sect283r1, NID_sect409r1,
1339 static const char *test_curves_names[EC_NUM] = {
1341 "secp160r1", "nistp192", "nistp224",
1342 "nistp256", "nistp384", "nistp521",
1344 "nistk163", "nistk233", "nistk283",
1345 "nistk409", "nistk571", "nistb163",
1346 "nistb233", "nistb283", "nistb409",
1351 static const int test_curves_bits[EC_NUM] = {
1357 571, 253 /* X25519 */
1360 int ecdsa_doit[EC_NUM] = { 0 };
1361 int ecdh_doit[EC_NUM] = { 0 };
1362 #endif /* ndef OPENSSL_NO_EC */
1364 prog = opt_init(argc, argv, speed_options);
1365 while ((o = opt_next()) != OPT_EOF) {
1370 BIO_printf(bio_err, "%s: Use -help for summary.\n", prog);
1373 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 #ifndef OPENSSL_NO_ENGINE
1401 engine_id = opt_arg();
1406 multi = atoi(opt_arg());
1410 #ifndef OPENSSL_NO_ASYNC
1411 async_jobs = atoi(opt_arg());
1412 if (!ASYNC_is_capable()) {
1414 "%s: async_jobs specified but async not supported\n",
1421 if (!opt_int(opt_arg(), &misalign))
1423 if (misalign > MISALIGN) {
1425 "%s: Maximum offset is %d\n", prog, MISALIGN);
1434 #ifdef OPENSSL_NO_MULTIBLOCK
1436 "%s: -mb specified but multi-block support is disabled\n",
1443 argc = opt_num_rest();
1446 /* Remaining arguments are algorithms. */
1447 for ( ; *argv; argv++) {
1448 if (found(*argv, doit_choices, &i)) {
1452 #ifndef OPENSSL_NO_DES
1453 if (strcmp(*argv, "des") == 0) {
1454 doit[D_CBC_DES] = doit[D_EDE3_DES] = 1;
1458 if (strcmp(*argv, "sha") == 0) {
1459 doit[D_SHA1] = doit[D_SHA256] = doit[D_SHA512] = 1;
1462 #ifndef OPENSSL_NO_RSA
1464 if (strcmp(*argv, "openssl") == 0) {
1465 RSA_set_default_method(RSA_PKCS1_OpenSSL());
1469 if (strcmp(*argv, "rsa") == 0) {
1470 rsa_doit[R_RSA_512] = rsa_doit[R_RSA_1024] =
1471 rsa_doit[R_RSA_2048] = rsa_doit[R_RSA_3072] =
1472 rsa_doit[R_RSA_4096] = rsa_doit[R_RSA_7680] =
1473 rsa_doit[R_RSA_15360] = 1;
1476 if (found(*argv, rsa_choices, &i)) {
1481 #ifndef OPENSSL_NO_DSA
1482 if (strcmp(*argv, "dsa") == 0) {
1483 dsa_doit[R_DSA_512] = dsa_doit[R_DSA_1024] =
1484 dsa_doit[R_DSA_2048] = 1;
1487 if (found(*argv, dsa_choices, &i)) {
1492 if (strcmp(*argv, "aes") == 0) {
1493 doit[D_CBC_128_AES] = doit[D_CBC_192_AES] =
1494 doit[D_CBC_256_AES] = 1;
1497 #ifndef OPENSSL_NO_CAMELLIA
1498 if (strcmp(*argv, "camellia") == 0) {
1499 doit[D_CBC_128_CML] = doit[D_CBC_192_CML] =
1500 doit[D_CBC_256_CML] = 1;
1504 #ifndef OPENSSL_NO_EC
1505 if (strcmp(*argv, "ecdsa") == 0) {
1506 for (i = 0; i < EC_NUM; i++)
1510 if (found(*argv, ecdsa_choices, &i)) {
1514 if (strcmp(*argv, "ecdh") == 0) {
1515 for (i = 0; i < EC_NUM; i++)
1519 if (found(*argv, ecdh_choices, &i)) {
1524 BIO_printf(bio_err, "%s: Unknown algorithm %s\n", prog, *argv);
1528 /* Initialize the job pool if async mode is enabled */
1529 if (async_jobs > 0) {
1530 async_init = ASYNC_init_thread(async_jobs, async_jobs);
1532 BIO_printf(bio_err, "Error creating the ASYNC job pool\n");
1537 loopargs_len = (async_jobs == 0 ? 1 : async_jobs);
1538 loopargs = app_malloc(loopargs_len * sizeof(loopargs_t), "array of loopargs");
1539 memset(loopargs, 0, loopargs_len * sizeof(loopargs_t));
1541 for (i = 0; i < loopargs_len; i++) {
1542 if (async_jobs > 0) {
1543 loopargs[i].wait_ctx = ASYNC_WAIT_CTX_new();
1544 if (loopargs[i].wait_ctx == NULL) {
1545 BIO_printf(bio_err, "Error creating the ASYNC_WAIT_CTX\n");
1550 loopargs[i].buf_malloc = app_malloc((int)BUFSIZE + MAX_MISALIGNMENT + 1, "input buffer");
1551 loopargs[i].buf2_malloc = app_malloc((int)BUFSIZE + MAX_MISALIGNMENT + 1, "input buffer");
1552 /* Align the start of buffers on a 64 byte boundary */
1553 loopargs[i].buf = loopargs[i].buf_malloc + misalign;
1554 loopargs[i].buf2 = loopargs[i].buf2_malloc + misalign;
1555 #ifndef OPENSSL_NO_EC
1556 loopargs[i].secret_a = app_malloc(MAX_ECDH_SIZE, "ECDH secret a");
1557 loopargs[i].secret_b = app_malloc(MAX_ECDH_SIZE, "ECDH secret b");
1562 if (multi && do_multi(multi))
1566 /* Initialize the engine after the fork */
1567 (void)setup_engine(engine_id, 0);
1569 /* No parameters; turn on everything. */
1570 if ((argc == 0) && !doit[D_EVP]) {
1571 for (i = 0; i < ALGOR_NUM; i++)
1574 for (i = 0; i < RSA_NUM; i++)
1576 #ifndef OPENSSL_NO_DSA
1577 for (i = 0; i < DSA_NUM; i++)
1580 #ifndef OPENSSL_NO_EC
1581 for (i = 0; i < EC_NUM; i++)
1583 for (i = 0; i < EC_NUM; i++)
1587 for (i = 0; i < ALGOR_NUM; i++)
1591 if (usertime == 0 && !mr)
1593 "You have chosen to measure elapsed time "
1594 "instead of user CPU time.\n");
1596 #ifndef OPENSSL_NO_RSA
1597 for (i = 0; i < loopargs_len; i++) {
1598 for (k = 0; k < RSA_NUM; k++) {
1599 const unsigned char *p;
1602 loopargs[i].rsa_key[k] = d2i_RSAPrivateKey(NULL, &p, rsa_data_length[k]);
1603 if (loopargs[i].rsa_key[k] == NULL) {
1604 BIO_printf(bio_err, "internal error loading RSA key number %d\n",
1611 #ifndef OPENSSL_NO_DSA
1612 for (i = 0; i < loopargs_len; i++) {
1613 loopargs[i].dsa_key[0] = get_dsa512();
1614 loopargs[i].dsa_key[1] = get_dsa1024();
1615 loopargs[i].dsa_key[2] = get_dsa2048();
1618 #ifndef OPENSSL_NO_DES
1619 DES_set_key_unchecked(&key, &sch);
1620 DES_set_key_unchecked(&key2, &sch2);
1621 DES_set_key_unchecked(&key3, &sch3);
1623 AES_set_encrypt_key(key16, 128, &aes_ks1);
1624 AES_set_encrypt_key(key24, 192, &aes_ks2);
1625 AES_set_encrypt_key(key32, 256, &aes_ks3);
1626 #ifndef OPENSSL_NO_CAMELLIA
1627 Camellia_set_key(key16, 128, &camellia_ks1);
1628 Camellia_set_key(ckey24, 192, &camellia_ks2);
1629 Camellia_set_key(ckey32, 256, &camellia_ks3);
1631 #ifndef OPENSSL_NO_IDEA
1632 IDEA_set_encrypt_key(key16, &idea_ks);
1634 #ifndef OPENSSL_NO_SEED
1635 SEED_set_key(key16, &seed_ks);
1637 #ifndef OPENSSL_NO_RC4
1638 RC4_set_key(&rc4_ks, 16, key16);
1640 #ifndef OPENSSL_NO_RC2
1641 RC2_set_key(&rc2_ks, 16, key16, 128);
1643 #ifndef OPENSSL_NO_RC5
1644 RC5_32_set_key(&rc5_ks, 16, key16, 12);
1646 #ifndef OPENSSL_NO_BF
1647 BF_set_key(&bf_ks, 16, key16);
1649 #ifndef OPENSSL_NO_CAST
1650 CAST_set_key(&cast_ks, 16, key16);
1653 # ifndef OPENSSL_NO_DES
1654 BIO_printf(bio_err, "First we calculate the approximate speed ...\n");
1660 for (it = count; it; it--)
1661 DES_ecb_encrypt((DES_cblock *)loopargs[0].buf,
1662 (DES_cblock *)loopargs[0].buf, &sch, DES_ENCRYPT);
1666 c[D_MD2][0] = count / 10;
1667 c[D_MDC2][0] = count / 10;
1668 c[D_MD4][0] = count;
1669 c[D_MD5][0] = count;
1670 c[D_HMAC][0] = count;
1671 c[D_SHA1][0] = count;
1672 c[D_RMD160][0] = count;
1673 c[D_RC4][0] = count * 5;
1674 c[D_CBC_DES][0] = count;
1675 c[D_EDE3_DES][0] = count / 3;
1676 c[D_CBC_IDEA][0] = count;
1677 c[D_CBC_SEED][0] = count;
1678 c[D_CBC_RC2][0] = count;
1679 c[D_CBC_RC5][0] = count;
1680 c[D_CBC_BF][0] = count;
1681 c[D_CBC_CAST][0] = count;
1682 c[D_CBC_128_AES][0] = count;
1683 c[D_CBC_192_AES][0] = count;
1684 c[D_CBC_256_AES][0] = count;
1685 c[D_CBC_128_CML][0] = count;
1686 c[D_CBC_192_CML][0] = count;
1687 c[D_CBC_256_CML][0] = count;
1688 c[D_SHA256][0] = count;
1689 c[D_SHA512][0] = count;
1690 c[D_WHIRLPOOL][0] = count;
1691 c[D_IGE_128_AES][0] = count;
1692 c[D_IGE_192_AES][0] = count;
1693 c[D_IGE_256_AES][0] = count;
1694 c[D_GHASH][0] = count;
1696 for (i = 1; i < SIZE_NUM; i++) {
1699 l0 = (long)lengths[0];
1700 l1 = (long)lengths[i];
1702 c[D_MD2][i] = c[D_MD2][0] * 4 * l0 / l1;
1703 c[D_MDC2][i] = c[D_MDC2][0] * 4 * l0 / l1;
1704 c[D_MD4][i] = c[D_MD4][0] * 4 * l0 / l1;
1705 c[D_MD5][i] = c[D_MD5][0] * 4 * l0 / l1;
1706 c[D_HMAC][i] = c[D_HMAC][0] * 4 * l0 / l1;
1707 c[D_SHA1][i] = c[D_SHA1][0] * 4 * l0 / l1;
1708 c[D_RMD160][i] = c[D_RMD160][0] * 4 * l0 / l1;
1709 c[D_SHA256][i] = c[D_SHA256][0] * 4 * l0 / l1;
1710 c[D_SHA512][i] = c[D_SHA512][0] * 4 * l0 / l1;
1711 c[D_WHIRLPOOL][i] = c[D_WHIRLPOOL][0] * 4 * l0 / l1;
1712 c[D_GHASH][i] = c[D_GHASH][0] * 4 * l0 / l1;
1714 l0 = (long)lengths[i - 1];
1716 c[D_RC4][i] = c[D_RC4][i - 1] * l0 / l1;
1717 c[D_CBC_DES][i] = c[D_CBC_DES][i - 1] * l0 / l1;
1718 c[D_EDE3_DES][i] = c[D_EDE3_DES][i - 1] * l0 / l1;
1719 c[D_CBC_IDEA][i] = c[D_CBC_IDEA][i - 1] * l0 / l1;
1720 c[D_CBC_SEED][i] = c[D_CBC_SEED][i - 1] * l0 / l1;
1721 c[D_CBC_RC2][i] = c[D_CBC_RC2][i - 1] * l0 / l1;
1722 c[D_CBC_RC5][i] = c[D_CBC_RC5][i - 1] * l0 / l1;
1723 c[D_CBC_BF][i] = c[D_CBC_BF][i - 1] * l0 / l1;
1724 c[D_CBC_CAST][i] = c[D_CBC_CAST][i - 1] * l0 / l1;
1725 c[D_CBC_128_AES][i] = c[D_CBC_128_AES][i - 1] * l0 / l1;
1726 c[D_CBC_192_AES][i] = c[D_CBC_192_AES][i - 1] * l0 / l1;
1727 c[D_CBC_256_AES][i] = c[D_CBC_256_AES][i - 1] * l0 / l1;
1728 c[D_CBC_128_CML][i] = c[D_CBC_128_CML][i - 1] * l0 / l1;
1729 c[D_CBC_192_CML][i] = c[D_CBC_192_CML][i - 1] * l0 / l1;
1730 c[D_CBC_256_CML][i] = c[D_CBC_256_CML][i - 1] * l0 / l1;
1731 c[D_IGE_128_AES][i] = c[D_IGE_128_AES][i - 1] * l0 / l1;
1732 c[D_IGE_192_AES][i] = c[D_IGE_192_AES][i - 1] * l0 / l1;
1733 c[D_IGE_256_AES][i] = c[D_IGE_256_AES][i - 1] * l0 / l1;
1736 # ifndef OPENSSL_NO_RSA
1737 rsa_c[R_RSA_512][0] = count / 2000;
1738 rsa_c[R_RSA_512][1] = count / 400;
1739 for (i = 1; i < RSA_NUM; i++) {
1740 rsa_c[i][0] = rsa_c[i - 1][0] / 8;
1741 rsa_c[i][1] = rsa_c[i - 1][1] / 4;
1742 if (rsa_doit[i] <= 1 && rsa_c[i][0] == 0)
1745 if (rsa_c[i][0] == 0) {
1746 rsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
1753 # ifndef OPENSSL_NO_DSA
1754 dsa_c[R_DSA_512][0] = count / 1000;
1755 dsa_c[R_DSA_512][1] = count / 1000 / 2;
1756 for (i = 1; i < DSA_NUM; i++) {
1757 dsa_c[i][0] = dsa_c[i - 1][0] / 4;
1758 dsa_c[i][1] = dsa_c[i - 1][1] / 4;
1759 if (dsa_doit[i] <= 1 && dsa_c[i][0] == 0)
1762 if (dsa_c[i][0] == 0) {
1763 dsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
1770 # ifndef OPENSSL_NO_EC
1771 ecdsa_c[R_EC_P160][0] = count / 1000;
1772 ecdsa_c[R_EC_P160][1] = count / 1000 / 2;
1773 for (i = R_EC_P192; i <= R_EC_P521; i++) {
1774 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1775 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1776 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1779 if (ecdsa_c[i][0] == 0) {
1785 ecdsa_c[R_EC_K163][0] = count / 1000;
1786 ecdsa_c[R_EC_K163][1] = count / 1000 / 2;
1787 for (i = R_EC_K233; i <= R_EC_K571; i++) {
1788 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1789 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1790 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1793 if (ecdsa_c[i][0] == 0) {
1799 ecdsa_c[R_EC_B163][0] = count / 1000;
1800 ecdsa_c[R_EC_B163][1] = count / 1000 / 2;
1801 for (i = R_EC_B233; i <= R_EC_B571; i++) {
1802 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1803 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1804 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1807 if (ecdsa_c[i][0] == 0) {
1814 ecdh_c[R_EC_P160][0] = count / 1000;
1815 for (i = R_EC_P192; i <= R_EC_P521; i++) {
1816 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1817 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1820 if (ecdh_c[i][0] == 0) {
1825 ecdh_c[R_EC_K163][0] = count / 1000;
1826 for (i = R_EC_K233; i <= R_EC_K571; i++) {
1827 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1828 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1831 if (ecdh_c[i][0] == 0) {
1836 ecdh_c[R_EC_B163][0] = count / 1000;
1837 for (i = R_EC_B233; i <= R_EC_B571; i++) {
1838 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1839 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1842 if (ecdh_c[i][0] == 0) {
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 #ifndef OPENSSL_NO_MD5
1908 char hmac_key[] = "This is a key...";
1909 int len = strlen(hmac_key);
1911 for (i = 0; i < loopargs_len; i++) {
1912 loopargs[i].hctx = HMAC_CTX_new();
1913 if (loopargs[i].hctx == NULL) {
1914 BIO_printf(bio_err, "HMAC malloc failure, exiting...");
1918 HMAC_Init_ex(loopargs[i].hctx, hmac_key, len, EVP_md5(), NULL);
1920 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1921 print_message(names[D_HMAC], c[D_HMAC][testnum], lengths[testnum]);
1923 count = run_benchmark(async_jobs, HMAC_loop, loopargs);
1925 print_result(D_HMAC, testnum, count, d);
1927 for (i = 0; i < loopargs_len; i++) {
1928 HMAC_CTX_free(loopargs[i].hctx);
1933 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1934 print_message(names[D_SHA1], c[D_SHA1][testnum], lengths[testnum]);
1936 count = run_benchmark(async_jobs, SHA1_loop, loopargs);
1938 print_result(D_SHA1, testnum, count, d);
1941 if (doit[D_SHA256]) {
1942 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1943 print_message(names[D_SHA256], c[D_SHA256][testnum], lengths[testnum]);
1945 count = run_benchmark(async_jobs, SHA256_loop, loopargs);
1947 print_result(D_SHA256, testnum, count, d);
1950 if (doit[D_SHA512]) {
1951 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1952 print_message(names[D_SHA512], c[D_SHA512][testnum], lengths[testnum]);
1954 count = run_benchmark(async_jobs, SHA512_loop, loopargs);
1956 print_result(D_SHA512, testnum, count, d);
1960 #ifndef OPENSSL_NO_WHIRLPOOL
1961 if (doit[D_WHIRLPOOL]) {
1962 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1963 print_message(names[D_WHIRLPOOL], c[D_WHIRLPOOL][testnum], lengths[testnum]);
1965 count = run_benchmark(async_jobs, WHIRLPOOL_loop, loopargs);
1967 print_result(D_WHIRLPOOL, testnum, count, d);
1972 #ifndef OPENSSL_NO_RMD160
1973 if (doit[D_RMD160]) {
1974 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1975 print_message(names[D_RMD160], c[D_RMD160][testnum], lengths[testnum]);
1977 count = run_benchmark(async_jobs, EVP_Digest_RMD160_loop, loopargs);
1979 print_result(D_RMD160, testnum, count, d);
1983 #ifndef OPENSSL_NO_RC4
1985 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1986 print_message(names[D_RC4], c[D_RC4][testnum], lengths[testnum]);
1988 count = run_benchmark(async_jobs, RC4_loop, loopargs);
1990 print_result(D_RC4, testnum, count, d);
1994 #ifndef OPENSSL_NO_DES
1995 if (doit[D_CBC_DES]) {
1996 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1997 print_message(names[D_CBC_DES], c[D_CBC_DES][testnum], lengths[testnum]);
1999 count = run_benchmark(async_jobs, DES_ncbc_encrypt_loop, loopargs);
2001 print_result(D_CBC_DES, testnum, count, d);
2005 if (doit[D_EDE3_DES]) {
2006 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2007 print_message(names[D_EDE3_DES], c[D_EDE3_DES][testnum], lengths[testnum]);
2009 count = run_benchmark(async_jobs, DES_ede3_cbc_encrypt_loop, loopargs);
2011 print_result(D_EDE3_DES, testnum, count, d);
2016 if (doit[D_CBC_128_AES]) {
2017 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2018 print_message(names[D_CBC_128_AES], c[D_CBC_128_AES][testnum],
2021 count = run_benchmark(async_jobs, AES_cbc_128_encrypt_loop, loopargs);
2023 print_result(D_CBC_128_AES, testnum, count, d);
2026 if (doit[D_CBC_192_AES]) {
2027 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2028 print_message(names[D_CBC_192_AES], c[D_CBC_192_AES][testnum],
2031 count = run_benchmark(async_jobs, AES_cbc_192_encrypt_loop, loopargs);
2033 print_result(D_CBC_192_AES, testnum, count, d);
2036 if (doit[D_CBC_256_AES]) {
2037 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2038 print_message(names[D_CBC_256_AES], c[D_CBC_256_AES][testnum],
2041 count = run_benchmark(async_jobs, AES_cbc_256_encrypt_loop, loopargs);
2043 print_result(D_CBC_256_AES, testnum, count, d);
2047 if (doit[D_IGE_128_AES]) {
2048 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2049 print_message(names[D_IGE_128_AES], c[D_IGE_128_AES][testnum],
2052 count = run_benchmark(async_jobs, AES_ige_128_encrypt_loop, loopargs);
2054 print_result(D_IGE_128_AES, testnum, count, d);
2057 if (doit[D_IGE_192_AES]) {
2058 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2059 print_message(names[D_IGE_192_AES], c[D_IGE_192_AES][testnum],
2062 count = run_benchmark(async_jobs, AES_ige_192_encrypt_loop, loopargs);
2064 print_result(D_IGE_192_AES, testnum, count, d);
2067 if (doit[D_IGE_256_AES]) {
2068 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2069 print_message(names[D_IGE_256_AES], c[D_IGE_256_AES][testnum],
2072 count = run_benchmark(async_jobs, AES_ige_256_encrypt_loop, loopargs);
2074 print_result(D_IGE_256_AES, testnum, count, d);
2077 if (doit[D_GHASH]) {
2078 for (i = 0; i < loopargs_len; i++) {
2079 loopargs[i].gcm_ctx = CRYPTO_gcm128_new(&aes_ks1, (block128_f) AES_encrypt);
2080 CRYPTO_gcm128_setiv(loopargs[i].gcm_ctx, (unsigned char *)"0123456789ab", 12);
2083 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2084 print_message(names[D_GHASH], c[D_GHASH][testnum], lengths[testnum]);
2086 count = run_benchmark(async_jobs, CRYPTO_gcm128_aad_loop, loopargs);
2088 print_result(D_GHASH, testnum, count, d);
2090 for (i = 0; i < loopargs_len; i++)
2091 CRYPTO_gcm128_release(loopargs[i].gcm_ctx);
2094 #ifndef OPENSSL_NO_CAMELLIA
2095 if (doit[D_CBC_128_CML]) {
2096 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2097 print_message(names[D_CBC_128_CML], c[D_CBC_128_CML][testnum],
2099 if (async_jobs > 0) {
2100 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2104 for (count = 0, run = 1; COND(c[D_CBC_128_CML][testnum]); count++)
2105 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2106 (size_t)lengths[testnum], &camellia_ks1,
2107 iv, CAMELLIA_ENCRYPT);
2109 print_result(D_CBC_128_CML, testnum, count, d);
2112 if (doit[D_CBC_192_CML]) {
2113 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2114 print_message(names[D_CBC_192_CML], c[D_CBC_192_CML][testnum],
2116 if (async_jobs > 0) {
2117 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2121 for (count = 0, run = 1; COND(c[D_CBC_192_CML][testnum]); count++)
2122 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2123 (size_t)lengths[testnum], &camellia_ks2,
2124 iv, CAMELLIA_ENCRYPT);
2126 print_result(D_CBC_192_CML, testnum, count, d);
2129 if (doit[D_CBC_256_CML]) {
2130 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2131 print_message(names[D_CBC_256_CML], c[D_CBC_256_CML][testnum],
2133 if (async_jobs > 0) {
2134 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2138 for (count = 0, run = 1; COND(c[D_CBC_256_CML][testnum]); count++)
2139 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2140 (size_t)lengths[testnum], &camellia_ks3,
2141 iv, CAMELLIA_ENCRYPT);
2143 print_result(D_CBC_256_CML, testnum, count, d);
2147 #ifndef OPENSSL_NO_IDEA
2148 if (doit[D_CBC_IDEA]) {
2149 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2150 print_message(names[D_CBC_IDEA], c[D_CBC_IDEA][testnum], lengths[testnum]);
2151 if (async_jobs > 0) {
2152 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2156 for (count = 0, run = 1; COND(c[D_CBC_IDEA][testnum]); count++)
2157 IDEA_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2158 (size_t)lengths[testnum], &idea_ks,
2161 print_result(D_CBC_IDEA, testnum, count, d);
2165 #ifndef OPENSSL_NO_SEED
2166 if (doit[D_CBC_SEED]) {
2167 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2168 print_message(names[D_CBC_SEED], c[D_CBC_SEED][testnum], lengths[testnum]);
2169 if (async_jobs > 0) {
2170 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2174 for (count = 0, run = 1; COND(c[D_CBC_SEED][testnum]); count++)
2175 SEED_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2176 (size_t)lengths[testnum], &seed_ks, iv, 1);
2178 print_result(D_CBC_SEED, testnum, count, d);
2182 #ifndef OPENSSL_NO_RC2
2183 if (doit[D_CBC_RC2]) {
2184 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2185 print_message(names[D_CBC_RC2], c[D_CBC_RC2][testnum], lengths[testnum]);
2186 if (async_jobs > 0) {
2187 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2191 for (count = 0, run = 1; COND(c[D_CBC_RC2][testnum]); count++)
2192 RC2_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2193 (size_t)lengths[testnum], &rc2_ks,
2196 print_result(D_CBC_RC2, testnum, count, d);
2200 #ifndef OPENSSL_NO_RC5
2201 if (doit[D_CBC_RC5]) {
2202 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2203 print_message(names[D_CBC_RC5], c[D_CBC_RC5][testnum], lengths[testnum]);
2204 if (async_jobs > 0) {
2205 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2209 for (count = 0, run = 1; COND(c[D_CBC_RC5][testnum]); count++)
2210 RC5_32_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2211 (size_t)lengths[testnum], &rc5_ks,
2214 print_result(D_CBC_RC5, testnum, count, d);
2218 #ifndef OPENSSL_NO_BF
2219 if (doit[D_CBC_BF]) {
2220 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2221 print_message(names[D_CBC_BF], c[D_CBC_BF][testnum], lengths[testnum]);
2222 if (async_jobs > 0) {
2223 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2227 for (count = 0, run = 1; COND(c[D_CBC_BF][testnum]); count++)
2228 BF_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2229 (size_t)lengths[testnum], &bf_ks,
2232 print_result(D_CBC_BF, testnum, count, d);
2236 #ifndef OPENSSL_NO_CAST
2237 if (doit[D_CBC_CAST]) {
2238 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2239 print_message(names[D_CBC_CAST], c[D_CBC_CAST][testnum], lengths[testnum]);
2240 if (async_jobs > 0) {
2241 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2245 for (count = 0, run = 1; COND(c[D_CBC_CAST][testnum]); count++)
2246 CAST_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2247 (size_t)lengths[testnum], &cast_ks,
2250 print_result(D_CBC_CAST, testnum, count, d);
2256 #ifdef EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK
2257 if (multiblock && evp_cipher) {
2259 (EVP_CIPHER_flags(evp_cipher) &
2260 EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) {
2261 BIO_printf(bio_err, "%s is not multi-block capable\n",
2262 OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher)));
2265 if (async_jobs > 0) {
2266 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2269 multiblock_speed(evp_cipher);
2274 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2277 names[D_EVP] = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
2279 * -O3 -fschedule-insns messes up an optimization here!
2280 * names[D_EVP] somehow becomes NULL
2282 print_message(names[D_EVP], save_count, lengths[testnum]);
2284 for (k = 0; k < loopargs_len; k++) {
2285 loopargs[k].ctx = EVP_CIPHER_CTX_new();
2287 EVP_DecryptInit_ex(loopargs[k].ctx, evp_cipher, NULL, key16, iv);
2289 EVP_EncryptInit_ex(loopargs[k].ctx, evp_cipher, NULL, key16, iv);
2290 EVP_CIPHER_CTX_set_padding(loopargs[k].ctx, 0);
2294 count = run_benchmark(async_jobs, EVP_Update_loop, loopargs);
2296 for (k = 0; k < loopargs_len; k++) {
2297 EVP_CIPHER_CTX_free(loopargs[k].ctx);
2301 names[D_EVP] = OBJ_nid2ln(EVP_MD_type(evp_md));
2302 print_message(names[D_EVP], save_count, lengths[testnum]);
2304 count = run_benchmark(async_jobs, EVP_Digest_loop, loopargs);
2307 print_result(D_EVP, testnum, count, d);
2311 for (i = 0; i < loopargs_len; i++)
2312 RAND_bytes(loopargs[i].buf, 36);
2314 #ifndef OPENSSL_NO_RSA
2315 for (testnum = 0; testnum < RSA_NUM; testnum++) {
2317 if (!rsa_doit[testnum])
2319 for (i = 0; i < loopargs_len; i++) {
2320 st = RSA_sign(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
2321 &loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
2327 "RSA sign failure. No RSA sign will be done.\n");
2328 ERR_print_errors(bio_err);
2331 pkey_print_message("private", "rsa",
2332 rsa_c[testnum][0], rsa_bits[testnum], RSA_SECONDS);
2333 /* RSA_blinding_on(rsa_key[testnum],NULL); */
2335 count = run_benchmark(async_jobs, RSA_sign_loop, loopargs);
2338 mr ? "+R1:%ld:%d:%.2f\n"
2339 : "%ld %d bit private RSA's in %.2fs\n",
2340 count, rsa_bits[testnum], d);
2341 rsa_results[testnum][0] = d / (double)count;
2345 for (i = 0; i < loopargs_len; i++) {
2346 st = RSA_verify(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
2347 loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
2353 "RSA verify failure. No RSA verify will be done.\n");
2354 ERR_print_errors(bio_err);
2355 rsa_doit[testnum] = 0;
2357 pkey_print_message("public", "rsa",
2358 rsa_c[testnum][1], rsa_bits[testnum], RSA_SECONDS);
2360 count = run_benchmark(async_jobs, RSA_verify_loop, loopargs);
2363 mr ? "+R2:%ld:%d:%.2f\n"
2364 : "%ld %d bit public RSA's in %.2fs\n",
2365 count, rsa_bits[testnum], d);
2366 rsa_results[testnum][1] = d / (double)count;
2369 if (rsa_count <= 1) {
2370 /* if longer than 10s, don't do any more */
2371 for (testnum++; testnum < RSA_NUM; testnum++)
2372 rsa_doit[testnum] = 0;
2377 for (i = 0; i < loopargs_len; i++)
2378 RAND_bytes(loopargs[i].buf, 36);
2380 #ifndef OPENSSL_NO_DSA
2381 if (RAND_status() != 1) {
2382 RAND_seed(rnd_seed, sizeof rnd_seed);
2384 for (testnum = 0; testnum < DSA_NUM; testnum++) {
2386 if (!dsa_doit[testnum])
2389 /* DSA_generate_key(dsa_key[testnum]); */
2390 /* DSA_sign_setup(dsa_key[testnum],NULL); */
2391 for (i = 0; i < loopargs_len; i++) {
2392 st = DSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
2393 &loopargs[i].siglen, loopargs[i].dsa_key[testnum]);
2399 "DSA sign failure. No DSA sign will be done.\n");
2400 ERR_print_errors(bio_err);
2403 pkey_print_message("sign", "dsa",
2404 dsa_c[testnum][0], dsa_bits[testnum], DSA_SECONDS);
2406 count = run_benchmark(async_jobs, DSA_sign_loop, loopargs);
2409 mr ? "+R3:%ld:%d:%.2f\n"
2410 : "%ld %d bit DSA signs in %.2fs\n",
2411 count, dsa_bits[testnum], d);
2412 dsa_results[testnum][0] = d / (double)count;
2416 for (i = 0; i < loopargs_len; i++) {
2417 st = DSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
2418 loopargs[i].siglen, loopargs[i].dsa_key[testnum]);
2424 "DSA verify failure. No DSA verify will be done.\n");
2425 ERR_print_errors(bio_err);
2426 dsa_doit[testnum] = 0;
2428 pkey_print_message("verify", "dsa",
2429 dsa_c[testnum][1], dsa_bits[testnum], DSA_SECONDS);
2431 count = run_benchmark(async_jobs, DSA_verify_loop, loopargs);
2434 mr ? "+R4:%ld:%d:%.2f\n"
2435 : "%ld %d bit DSA verify in %.2fs\n",
2436 count, dsa_bits[testnum], d);
2437 dsa_results[testnum][1] = d / (double)count;
2440 if (rsa_count <= 1) {
2441 /* if longer than 10s, don't do any more */
2442 for (testnum++; testnum < DSA_NUM; testnum++)
2443 dsa_doit[testnum] = 0;
2448 #ifndef OPENSSL_NO_EC
2449 if (RAND_status() != 1) {
2450 RAND_seed(rnd_seed, sizeof rnd_seed);
2452 for (testnum = 0; testnum < EC_NUM; testnum++) {
2455 if (!ecdsa_doit[testnum])
2456 continue; /* Ignore Curve */
2457 for (i = 0; i < loopargs_len; i++) {
2458 loopargs[i].ecdsa[testnum] = EC_KEY_new_by_curve_name(test_curves[testnum]);
2459 if (loopargs[i].ecdsa[testnum] == NULL) {
2465 BIO_printf(bio_err, "ECDSA failure.\n");
2466 ERR_print_errors(bio_err);
2469 for (i = 0; i < loopargs_len; i++) {
2470 EC_KEY_precompute_mult(loopargs[i].ecdsa[testnum], NULL);
2471 /* Perform ECDSA signature test */
2472 EC_KEY_generate_key(loopargs[i].ecdsa[testnum]);
2473 st = ECDSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
2474 &loopargs[i].siglen, loopargs[i].ecdsa[testnum]);
2480 "ECDSA sign failure. No ECDSA sign will be done.\n");
2481 ERR_print_errors(bio_err);
2484 pkey_print_message("sign", "ecdsa",
2485 ecdsa_c[testnum][0],
2486 test_curves_bits[testnum], ECDSA_SECONDS);
2488 count = run_benchmark(async_jobs, ECDSA_sign_loop, loopargs);
2492 mr ? "+R5:%ld:%d:%.2f\n" :
2493 "%ld %d bit ECDSA signs in %.2fs \n",
2494 count, test_curves_bits[testnum], d);
2495 ecdsa_results[testnum][0] = d / (double)count;
2499 /* Perform ECDSA verification test */
2500 for (i = 0; i < loopargs_len; i++) {
2501 st = ECDSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
2502 loopargs[i].siglen, loopargs[i].ecdsa[testnum]);
2508 "ECDSA verify failure. No ECDSA verify will be done.\n");
2509 ERR_print_errors(bio_err);
2510 ecdsa_doit[testnum] = 0;
2512 pkey_print_message("verify", "ecdsa",
2513 ecdsa_c[testnum][1],
2514 test_curves_bits[testnum], ECDSA_SECONDS);
2516 count = run_benchmark(async_jobs, ECDSA_verify_loop, loopargs);
2519 mr ? "+R6:%ld:%d:%.2f\n"
2520 : "%ld %d bit ECDSA verify in %.2fs\n",
2521 count, test_curves_bits[testnum], d);
2522 ecdsa_results[testnum][1] = d / (double)count;
2525 if (rsa_count <= 1) {
2526 /* if longer than 10s, don't do any more */
2527 for (testnum++; testnum < EC_NUM; testnum++)
2528 ecdsa_doit[testnum] = 0;
2533 if (RAND_status() != 1) {
2534 RAND_seed(rnd_seed, sizeof rnd_seed);
2536 for (testnum = 0; testnum < EC_NUM; testnum++) {
2537 int ecdh_checks = 1;
2539 if (!ecdh_doit[testnum])
2541 for (i = 0; i < loopargs_len; i++) {
2542 loopargs[i].ecdh_a[testnum] = EC_KEY_new_by_curve_name(test_curves[testnum]);
2543 loopargs[i].ecdh_b[testnum] = EC_KEY_new_by_curve_name(test_curves[testnum]);
2544 if (loopargs[i].ecdh_a[testnum] == NULL ||
2545 loopargs[i].ecdh_b[testnum] == NULL) {
2550 if (ecdh_checks == 0) {
2551 BIO_printf(bio_err, "ECDH failure.\n");
2552 ERR_print_errors(bio_err);
2555 for (i = 0; i < loopargs_len; i++) {
2556 /* generate two ECDH key pairs */
2557 if (!EC_KEY_generate_key(loopargs[i].ecdh_a[testnum]) ||
2558 !EC_KEY_generate_key(loopargs[i].ecdh_b[testnum])) {
2559 BIO_printf(bio_err, "ECDH key generation failure.\n");
2560 ERR_print_errors(bio_err);
2564 int secret_size_a, secret_size_b;
2566 * If field size is not more than 24 octets, then use SHA-1
2567 * hash of result; otherwise, use result (see section 4.8 of
2568 * draft-ietf-tls-ecc-03.txt).
2570 int field_size = EC_GROUP_get_degree(
2571 EC_KEY_get0_group(loopargs[i].ecdh_a[testnum]));
2573 if (field_size <= 24 * 8) { /* 192 bits */
2574 loopargs[i].outlen = KDF1_SHA1_len;
2575 loopargs[i].kdf = KDF1_SHA1;
2577 loopargs[i].outlen = (field_size + 7) / 8;
2578 loopargs[i].kdf = NULL;
2581 ECDH_compute_key(loopargs[i].secret_a, loopargs[i].outlen,
2582 EC_KEY_get0_public_key(loopargs[i].ecdh_b[testnum]),
2583 loopargs[i].ecdh_a[testnum], loopargs[i].kdf);
2585 ECDH_compute_key(loopargs[i].secret_b, loopargs[i].outlen,
2586 EC_KEY_get0_public_key(loopargs[i].ecdh_a[testnum]),
2587 loopargs[i].ecdh_b[testnum], loopargs[i].kdf);
2588 if (secret_size_a != secret_size_b)
2593 for (k = 0; k < secret_size_a && ecdh_checks == 1; k++) {
2594 if (loopargs[i].secret_a[k] != loopargs[i].secret_b[k])
2598 if (ecdh_checks == 0) {
2599 BIO_printf(bio_err, "ECDH computations don't match.\n");
2600 ERR_print_errors(bio_err);
2606 if (ecdh_checks != 0) {
2607 pkey_print_message("", "ecdh",
2609 test_curves_bits[testnum], ECDH_SECONDS);
2611 count = run_benchmark(async_jobs, ECDH_compute_key_loop, loopargs);
2614 mr ? "+R7:%ld:%d:%.2f\n" :
2615 "%ld %d-bit ECDH ops in %.2fs\n", count,
2616 test_curves_bits[testnum], d);
2617 ecdh_results[testnum][0] = d / (double)count;
2622 if (rsa_count <= 1) {
2623 /* if longer than 10s, don't do any more */
2624 for (testnum++; testnum < EC_NUM; testnum++)
2625 ecdh_doit[testnum] = 0;
2633 printf("%s\n", OpenSSL_version(OPENSSL_VERSION));
2634 printf("%s\n", OpenSSL_version(OPENSSL_BUILT_ON));
2636 printf("%s ", BN_options());
2637 #ifndef OPENSSL_NO_MD2
2638 printf("%s ", MD2_options());
2640 #ifndef OPENSSL_NO_RC4
2641 printf("%s ", RC4_options());
2643 #ifndef OPENSSL_NO_DES
2644 printf("%s ", DES_options());
2646 printf("%s ", AES_options());
2647 #ifndef OPENSSL_NO_IDEA
2648 printf("%s ", IDEA_options());
2650 #ifndef OPENSSL_NO_BF
2651 printf("%s ", BF_options());
2653 printf("\n%s\n", OpenSSL_version(OPENSSL_CFLAGS));
2661 ("The 'numbers' are in 1000s of bytes per second processed.\n");
2664 for (testnum = 0; testnum < SIZE_NUM; testnum++)
2665 printf(mr ? ":%d" : "%7d bytes", lengths[testnum]);
2669 for (k = 0; k < ALGOR_NUM; k++) {
2673 printf("+F:%d:%s", k, names[k]);
2675 printf("%-13s", names[k]);
2676 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2677 if (results[k][testnum] > 10000 && !mr)
2678 printf(" %11.2fk", results[k][testnum] / 1e3);
2680 printf(mr ? ":%.2f" : " %11.2f ", results[k][testnum]);
2684 #ifndef OPENSSL_NO_RSA
2686 for (k = 0; k < RSA_NUM; k++) {
2689 if (testnum && !mr) {
2690 printf("%18ssign verify sign/s verify/s\n", " ");
2694 printf("+F2:%u:%u:%f:%f\n",
2695 k, rsa_bits[k], rsa_results[k][0], rsa_results[k][1]);
2697 printf("rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2698 rsa_bits[k], rsa_results[k][0], rsa_results[k][1],
2699 1.0 / rsa_results[k][0], 1.0 / rsa_results[k][1]);
2702 #ifndef OPENSSL_NO_DSA
2704 for (k = 0; k < DSA_NUM; k++) {
2707 if (testnum && !mr) {
2708 printf("%18ssign verify sign/s verify/s\n", " ");
2712 printf("+F3:%u:%u:%f:%f\n",
2713 k, dsa_bits[k], dsa_results[k][0], dsa_results[k][1]);
2715 printf("dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2716 dsa_bits[k], dsa_results[k][0], dsa_results[k][1],
2717 1.0 / dsa_results[k][0], 1.0 / dsa_results[k][1]);
2720 #ifndef OPENSSL_NO_EC
2722 for (k = 0; k < EC_NUM; k++) {
2725 if (testnum && !mr) {
2726 printf("%30ssign verify sign/s verify/s\n", " ");
2731 printf("+F4:%u:%u:%f:%f\n",
2732 k, test_curves_bits[k],
2733 ecdsa_results[k][0], ecdsa_results[k][1]);
2735 printf("%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2736 test_curves_bits[k],
2737 test_curves_names[k],
2738 ecdsa_results[k][0], ecdsa_results[k][1],
2739 1.0 / ecdsa_results[k][0], 1.0 / ecdsa_results[k][1]);
2743 for (k = 0; k < EC_NUM; k++) {
2746 if (testnum && !mr) {
2747 printf("%30sop op/s\n", " ");
2751 printf("+F5:%u:%u:%f:%f\n",
2752 k, test_curves_bits[k],
2753 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
2756 printf("%4u bit ecdh (%s) %8.4fs %8.1f\n",
2757 test_curves_bits[k],
2758 test_curves_names[k],
2759 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
2766 ERR_print_errors(bio_err);
2767 for (i = 0; i < loopargs_len; i++) {
2768 OPENSSL_free(loopargs[i].buf_malloc);
2769 OPENSSL_free(loopargs[i].buf2_malloc);
2771 #ifndef OPENSSL_NO_RSA
2772 for (k = 0; k < RSA_NUM; k++)
2773 RSA_free(loopargs[i].rsa_key[k]);
2775 #ifndef OPENSSL_NO_DSA
2776 for (k = 0; k < DSA_NUM; k++)
2777 DSA_free(loopargs[i].dsa_key[k]);
2779 #ifndef OPENSSL_NO_EC
2780 for (k = 0; k < EC_NUM; k++) {
2781 EC_KEY_free(loopargs[i].ecdsa[k]);
2782 EC_KEY_free(loopargs[i].ecdh_a[k]);
2783 EC_KEY_free(loopargs[i].ecdh_b[k]);
2785 OPENSSL_free(loopargs[i].secret_a);
2786 OPENSSL_free(loopargs[i].secret_b);
2790 if (async_jobs > 0) {
2791 for (i = 0; i < loopargs_len; i++)
2792 ASYNC_WAIT_CTX_free(loopargs[i].wait_ctx);
2796 ASYNC_cleanup_thread();
2798 OPENSSL_free(loopargs);
2802 static void print_message(const char *s, long num, int length)
2806 mr ? "+DT:%s:%d:%d\n"
2807 : "Doing %s for %ds on %d size blocks: ", s, SECONDS, length);
2808 (void)BIO_flush(bio_err);
2812 mr ? "+DN:%s:%ld:%d\n"
2813 : "Doing %s %ld times on %d size blocks: ", s, num, length);
2814 (void)BIO_flush(bio_err);
2818 static void pkey_print_message(const char *str, const char *str2, long num,
2823 mr ? "+DTP:%d:%s:%s:%d\n"
2824 : "Doing %d bit %s %s's for %ds: ", bits, str, str2, tm);
2825 (void)BIO_flush(bio_err);
2829 mr ? "+DNP:%ld:%d:%s:%s\n"
2830 : "Doing %ld %d bit %s %s's: ", num, bits, str, str2);
2831 (void)BIO_flush(bio_err);
2835 static void print_result(int alg, int run_no, int count, double time_used)
2838 BIO_puts(bio_err, "EVP error!\n");
2842 mr ? "+R:%d:%s:%f\n"
2843 : "%d %s's in %.2fs\n", count, names[alg], time_used);
2844 results[alg][run_no] = ((double)count) / time_used * lengths[run_no];
2848 static char *sstrsep(char **string, const char *delim)
2851 char *token = *string;
2856 memset(isdelim, 0, sizeof isdelim);
2860 isdelim[(unsigned char)(*delim)] = 1;
2864 while (!isdelim[(unsigned char)(**string)]) {
2876 static int do_multi(int multi)
2881 static char sep[] = ":";
2883 fds = malloc(sizeof(*fds) * multi);
2884 for (n = 0; n < multi; ++n) {
2885 if (pipe(fd) == -1) {
2886 BIO_printf(bio_err, "pipe failure\n");
2890 (void)BIO_flush(bio_err);
2897 if (dup(fd[1]) == -1) {
2898 BIO_printf(bio_err, "dup failed\n");
2907 printf("Forked child %d\n", n);
2910 /* for now, assume the pipe is long enough to take all the output */
2911 for (n = 0; n < multi; ++n) {
2916 f = fdopen(fds[n], "r");
2917 while (fgets(buf, sizeof buf, f)) {
2918 p = strchr(buf, '\n');
2921 if (buf[0] != '+') {
2922 BIO_printf(bio_err, "Don't understand line '%s' from child %d\n",
2926 printf("Got: %s from %d\n", buf, n);
2927 if (strncmp(buf, "+F:", 3) == 0) {
2932 alg = atoi(sstrsep(&p, sep));
2934 for (j = 0; j < SIZE_NUM; ++j)
2935 results[alg][j] += atof(sstrsep(&p, sep));
2936 } else if (strncmp(buf, "+F2:", 4) == 0) {
2941 k = atoi(sstrsep(&p, sep));
2944 d = atof(sstrsep(&p, sep));
2946 rsa_results[k][0] = 1 / (1 / rsa_results[k][0] + 1 / d);
2948 rsa_results[k][0] = d;
2950 d = atof(sstrsep(&p, sep));
2952 rsa_results[k][1] = 1 / (1 / rsa_results[k][1] + 1 / d);
2954 rsa_results[k][1] = d;
2956 # ifndef OPENSSL_NO_DSA
2957 else if (strncmp(buf, "+F3:", 4) == 0) {
2962 k = atoi(sstrsep(&p, sep));
2965 d = atof(sstrsep(&p, sep));
2967 dsa_results[k][0] = 1 / (1 / dsa_results[k][0] + 1 / d);
2969 dsa_results[k][0] = d;
2971 d = atof(sstrsep(&p, sep));
2973 dsa_results[k][1] = 1 / (1 / dsa_results[k][1] + 1 / d);
2975 dsa_results[k][1] = d;
2978 # ifndef OPENSSL_NO_EC
2979 else if (strncmp(buf, "+F4:", 4) == 0) {
2984 k = atoi(sstrsep(&p, sep));
2987 d = atof(sstrsep(&p, sep));
2989 ecdsa_results[k][0] =
2990 1 / (1 / ecdsa_results[k][0] + 1 / d);
2992 ecdsa_results[k][0] = d;
2994 d = atof(sstrsep(&p, sep));
2996 ecdsa_results[k][1] =
2997 1 / (1 / ecdsa_results[k][1] + 1 / d);
2999 ecdsa_results[k][1] = d;
3003 # ifndef OPENSSL_NO_EC
3004 else if (strncmp(buf, "+F5:", 4) == 0) {
3009 k = atoi(sstrsep(&p, sep));
3012 d = atof(sstrsep(&p, sep));
3014 ecdh_results[k][0] = 1 / (1 / ecdh_results[k][0] + 1 / d);
3016 ecdh_results[k][0] = d;
3021 else if (strncmp(buf, "+H:", 3) == 0) {
3024 BIO_printf(bio_err, "Unknown type '%s' from child %d\n", buf, n);
3034 static void multiblock_speed(const EVP_CIPHER *evp_cipher)
3036 static int mblengths[] =
3037 { 8 * 1024, 2 * 8 * 1024, 4 * 8 * 1024, 8 * 8 * 1024, 8 * 16 * 1024 };
3038 int j, count, num = OSSL_NELEM(mblengths);
3039 const char *alg_name;
3040 unsigned char *inp, *out, no_key[32], no_iv[16];
3041 EVP_CIPHER_CTX *ctx;
3044 inp = app_malloc(mblengths[num - 1], "multiblock input buffer");
3045 out = app_malloc(mblengths[num - 1] + 1024, "multiblock output buffer");
3046 ctx = EVP_CIPHER_CTX_new();
3047 EVP_EncryptInit_ex(ctx, evp_cipher, NULL, no_key, no_iv);
3048 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_MAC_KEY, sizeof(no_key),
3050 alg_name = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
3052 for (j = 0; j < num; j++) {
3053 print_message(alg_name, 0, mblengths[j]);
3055 for (count = 0, run = 1; run && count < 0x7fffffff; count++) {
3056 unsigned char aad[EVP_AEAD_TLS1_AAD_LEN];
3057 EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM mb_param;
3058 size_t len = mblengths[j];
3061 memset(aad, 0, 8); /* avoid uninitialized values */
3062 aad[8] = 23; /* SSL3_RT_APPLICATION_DATA */
3063 aad[9] = 3; /* version */
3065 aad[11] = 0; /* length */
3067 mb_param.out = NULL;
3070 mb_param.interleave = 8;
3072 packlen = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_AAD,
3073 sizeof(mb_param), &mb_param);
3079 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT,
3080 sizeof(mb_param), &mb_param);
3084 RAND_bytes(out, 16);
3088 pad = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_TLS1_AAD,
3089 EVP_AEAD_TLS1_AAD_LEN, aad);
3090 EVP_Cipher(ctx, out, inp, len + pad);
3094 BIO_printf(bio_err, mr ? "+R:%d:%s:%f\n"
3095 : "%d %s's in %.2fs\n", count, "evp", d);
3096 results[D_EVP][j] = ((double)count) / d * mblengths[j];
3100 fprintf(stdout, "+H");
3101 for (j = 0; j < num; j++)
3102 fprintf(stdout, ":%d", mblengths[j]);
3103 fprintf(stdout, "\n");
3104 fprintf(stdout, "+F:%d:%s", D_EVP, alg_name);
3105 for (j = 0; j < num; j++)
3106 fprintf(stdout, ":%.2f", results[D_EVP][j]);
3107 fprintf(stdout, "\n");
3110 "The 'numbers' are in 1000s of bytes per second processed.\n");
3111 fprintf(stdout, "type ");
3112 for (j = 0; j < num; j++)
3113 fprintf(stdout, "%7d bytes", mblengths[j]);
3114 fprintf(stdout, "\n");
3115 fprintf(stdout, "%-24s", alg_name);
3117 for (j = 0; j < num; j++) {
3118 if (results[D_EVP][j] > 10000)
3119 fprintf(stdout, " %11.2fk", results[D_EVP][j] / 1e3);
3121 fprintf(stdout, " %11.2f ", results[D_EVP][j]);
3123 fprintf(stdout, "\n");
3128 EVP_CIPHER_CTX_free(ctx);