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) (const void *in, size_t inlen, void *out,
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 EVP_PKEY_CTX *ecdh_ctx[EC_NUM];
167 unsigned char *secret_a;
168 unsigned char *secret_b;
169 size_t outlen[EC_NUM];
174 GCM128_CONTEXT *gcm_ctx;
177 #ifndef OPENSSL_NO_MD2
178 static int EVP_Digest_MD2_loop(void *args);
181 #ifndef OPENSSL_NO_MDC2
182 static int EVP_Digest_MDC2_loop(void *args);
184 #ifndef OPENSSL_NO_MD4
185 static int EVP_Digest_MD4_loop(void *args);
187 #ifndef OPENSSL_NO_MD5
188 static int MD5_loop(void *args);
189 static int HMAC_loop(void *args);
191 static int SHA1_loop(void *args);
192 static int SHA256_loop(void *args);
193 static int SHA512_loop(void *args);
194 #ifndef OPENSSL_NO_WHIRLPOOL
195 static int WHIRLPOOL_loop(void *args);
197 #ifndef OPENSSL_NO_RMD160
198 static int EVP_Digest_RMD160_loop(void *args);
200 #ifndef OPENSSL_NO_RC4
201 static int RC4_loop(void *args);
203 #ifndef OPENSSL_NO_DES
204 static int DES_ncbc_encrypt_loop(void *args);
205 static int DES_ede3_cbc_encrypt_loop(void *args);
207 static int AES_cbc_128_encrypt_loop(void *args);
208 static int AES_cbc_192_encrypt_loop(void *args);
209 static int AES_ige_128_encrypt_loop(void *args);
210 static int AES_cbc_256_encrypt_loop(void *args);
211 static int AES_ige_192_encrypt_loop(void *args);
212 static int AES_ige_256_encrypt_loop(void *args);
213 static int CRYPTO_gcm128_aad_loop(void *args);
214 static int EVP_Update_loop(void *args);
215 static int EVP_Digest_loop(void *args);
216 #ifndef OPENSSL_NO_RSA
217 static int RSA_sign_loop(void *args);
218 static int RSA_verify_loop(void *args);
220 #ifndef OPENSSL_NO_DSA
221 static int DSA_sign_loop(void *args);
222 static int DSA_verify_loop(void *args);
224 #ifndef OPENSSL_NO_EC
225 static int ECDSA_sign_loop(void *args);
226 static int ECDSA_verify_loop(void *args);
228 static int run_benchmark(int async_jobs, int (*loop_function) (void *),
229 loopargs_t * loopargs);
231 static double Time_F(int s);
232 static void print_message(const char *s, long num, int length);
233 static void pkey_print_message(const char *str, const char *str2,
234 long num, int bits, int sec);
235 static void print_result(int alg, int run_no, int count, double time_used);
237 static int do_multi(int multi);
240 static const char *names[ALGOR_NUM] = {
241 "md2", "mdc2", "md4", "md5", "hmac(md5)", "sha1", "rmd160", "rc4",
242 "des cbc", "des ede3", "idea cbc", "seed cbc",
243 "rc2 cbc", "rc5-32/12 cbc", "blowfish cbc", "cast cbc",
244 "aes-128 cbc", "aes-192 cbc", "aes-256 cbc",
245 "camellia-128 cbc", "camellia-192 cbc", "camellia-256 cbc",
246 "evp", "sha256", "sha512", "whirlpool",
247 "aes-128 ige", "aes-192 ige", "aes-256 ige", "ghash"
250 static double results[ALGOR_NUM][SIZE_NUM];
252 static const int lengths[SIZE_NUM] = {
253 16, 64, 256, 1024, 8 * 1024, 16 * 1024
256 #ifndef OPENSSL_NO_RSA
257 static double rsa_results[RSA_NUM][2];
259 #ifndef OPENSSL_NO_DSA
260 static double dsa_results[DSA_NUM][2];
262 #ifndef OPENSSL_NO_EC
263 static double ecdsa_results[EC_NUM][2];
264 static double ecdh_results[EC_NUM][1];
267 #if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_EC)
268 static const char rnd_seed[] =
269 "string to make the random number generator think it has entropy";
273 # if defined(__STDC__) || defined(sgi) || defined(_AIX)
274 # define SIGRETTYPE void
276 # define SIGRETTYPE int
279 static SIGRETTYPE sig_done(int sig);
280 static SIGRETTYPE sig_done(int sig)
282 signal(SIGALRM, sig_done);
292 # if !defined(SIGALRM)
295 static unsigned int lapse, schlock;
296 static void alarm_win32(unsigned int secs)
301 # define alarm alarm_win32
303 static DWORD WINAPI sleepy(VOID * arg)
311 static double Time_F(int s)
318 thr = CreateThread(NULL, 4096, sleepy, NULL, 0, NULL);
320 DWORD err = GetLastError();
321 BIO_printf(bio_err, "unable to CreateThread (%lu)", err);
325 Sleep(0); /* scheduler spinlock */
326 ret = app_tminterval(s, usertime);
328 ret = app_tminterval(s, usertime);
330 TerminateThread(thr, 0);
338 static double Time_F(int s)
340 double ret = app_tminterval(s, usertime);
347 static void multiblock_speed(const EVP_CIPHER *evp_cipher);
349 static int found(const char *name, const OPT_PAIR *pairs, int *result)
351 for (; pairs->name; pairs++)
352 if (strcmp(name, pairs->name) == 0) {
353 *result = pairs->retval;
359 typedef enum OPTION_choice {
360 OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
361 OPT_ELAPSED, OPT_EVP, OPT_DECRYPT, OPT_ENGINE, OPT_MULTI,
362 OPT_MR, OPT_MB, OPT_MISALIGN, OPT_ASYNCJOBS
365 const OPTIONS speed_options[] = {
366 {OPT_HELP_STR, 1, '-', "Usage: %s [options] ciphers...\n"},
367 {OPT_HELP_STR, 1, '-', "Valid options are:\n"},
368 {"help", OPT_HELP, '-', "Display this summary"},
369 {"evp", OPT_EVP, 's', "Use specified EVP cipher"},
370 {"decrypt", OPT_DECRYPT, '-',
371 "Time decryption instead of encryption (only EVP)"},
372 {"mr", OPT_MR, '-', "Produce machine readable output"},
374 "Enable (tls1.1) multi-block mode on evp_cipher requested with -evp"},
375 {"misalign", OPT_MISALIGN, 'n', "Amount to mis-align buffers"},
376 {"elapsed", OPT_ELAPSED, '-',
377 "Measure time in real time instead of CPU user time"},
379 {"multi", OPT_MULTI, 'p', "Run benchmarks in parallel"},
381 #ifndef OPENSSL_NO_ASYNC
382 {"async_jobs", OPT_ASYNCJOBS, 'p',
383 "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
436 {"sha256", D_SHA256},
437 {"sha512", D_SHA512},
438 #ifndef OPENSSL_NO_WHIRLPOOL
439 {"whirlpool", D_WHIRLPOOL},
441 #ifndef OPENSSL_NO_RMD160
442 {"ripemd", D_RMD160},
443 {"rmd160", D_RMD160},
444 {"ripemd160", D_RMD160},
446 #ifndef OPENSSL_NO_RC4
449 #ifndef OPENSSL_NO_DES
450 {"des-cbc", D_CBC_DES},
451 {"des-ede3", D_EDE3_DES},
453 {"aes-128-cbc", D_CBC_128_AES},
454 {"aes-192-cbc", D_CBC_192_AES},
455 {"aes-256-cbc", D_CBC_256_AES},
456 {"aes-128-ige", D_IGE_128_AES},
457 {"aes-192-ige", D_IGE_192_AES},
458 {"aes-256-ige", D_IGE_256_AES},
459 #ifndef OPENSSL_NO_RC2
460 {"rc2-cbc", D_CBC_RC2},
463 #ifndef OPENSSL_NO_RC5
464 {"rc5-cbc", D_CBC_RC5},
467 #ifndef OPENSSL_NO_IDEA
468 {"idea-cbc", D_CBC_IDEA},
469 {"idea", D_CBC_IDEA},
471 #ifndef OPENSSL_NO_SEED
472 {"seed-cbc", D_CBC_SEED},
473 {"seed", D_CBC_SEED},
475 #ifndef OPENSSL_NO_BF
476 {"bf-cbc", D_CBC_BF},
477 {"blowfish", D_CBC_BF},
480 #ifndef OPENSSL_NO_CAST
481 {"cast-cbc", D_CBC_CAST},
482 {"cast", D_CBC_CAST},
483 {"cast5", D_CBC_CAST},
489 #ifndef OPENSSL_NO_DSA
491 # define R_DSA_1024 1
492 # define R_DSA_2048 2
493 static OPT_PAIR dsa_choices[] = {
494 {"dsa512", R_DSA_512},
495 {"dsa1024", R_DSA_1024},
496 {"dsa2048", R_DSA_2048},
507 #define R_RSA_15360 6
508 static OPT_PAIR rsa_choices[] = {
509 {"rsa512", R_RSA_512},
510 {"rsa1024", R_RSA_1024},
511 {"rsa2048", R_RSA_2048},
512 {"rsa3072", R_RSA_3072},
513 {"rsa4096", R_RSA_4096},
514 {"rsa7680", R_RSA_7680},
515 {"rsa15360", R_RSA_15360},
535 #define R_EC_X25519 16
536 #ifndef OPENSSL_NO_EC
537 static OPT_PAIR ecdsa_choices[] = {
538 {"ecdsap160", R_EC_P160},
539 {"ecdsap192", R_EC_P192},
540 {"ecdsap224", R_EC_P224},
541 {"ecdsap256", R_EC_P256},
542 {"ecdsap384", R_EC_P384},
543 {"ecdsap521", R_EC_P521},
544 {"ecdsak163", R_EC_K163},
545 {"ecdsak233", R_EC_K233},
546 {"ecdsak283", R_EC_K283},
547 {"ecdsak409", R_EC_K409},
548 {"ecdsak571", R_EC_K571},
549 {"ecdsab163", R_EC_B163},
550 {"ecdsab233", R_EC_B233},
551 {"ecdsab283", R_EC_B283},
552 {"ecdsab409", R_EC_B409},
553 {"ecdsab571", R_EC_B571},
557 static OPT_PAIR ecdh_choices[] = {
558 {"ecdhp160", R_EC_P160},
559 {"ecdhp192", R_EC_P192},
560 {"ecdhp224", R_EC_P224},
561 {"ecdhp256", R_EC_P256},
562 {"ecdhp384", R_EC_P384},
563 {"ecdhp521", R_EC_P521},
564 {"ecdhk163", R_EC_K163},
565 {"ecdhk233", R_EC_K233},
566 {"ecdhk283", R_EC_K283},
567 {"ecdhk409", R_EC_K409},
568 {"ecdhk571", R_EC_K571},
569 {"ecdhb163", R_EC_B163},
570 {"ecdhb233", R_EC_B233},
571 {"ecdhb283", R_EC_B283},
572 {"ecdhb409", R_EC_B409},
573 {"ecdhb571", R_EC_B571},
574 {"ecdhx25519", R_EC_X25519},
580 # define COND(d) (count < (d))
581 # define COUNT(d) (d)
583 # define COND(unused_cond) (run && count<0x7fffffff)
584 # define COUNT(d) (count)
589 /* Nb of iterations to do per algorithm and key-size */
590 static long c[ALGOR_NUM][SIZE_NUM];
592 #ifndef OPENSSL_NO_MD2
593 static int EVP_Digest_MD2_loop(void *args)
595 loopargs_t *tempargs = *(loopargs_t **) args;
596 unsigned char *buf = tempargs->buf;
597 unsigned char md2[MD2_DIGEST_LENGTH];
600 for (count = 0; COND(c[D_MD2][testnum]); count++) {
601 if (!EVP_Digest(buf, (size_t)lengths[testnum], md2, NULL, EVP_md2(),
609 #ifndef OPENSSL_NO_MDC2
610 static int EVP_Digest_MDC2_loop(void *args)
612 loopargs_t *tempargs = *(loopargs_t **) args;
613 unsigned char *buf = tempargs->buf;
614 unsigned char mdc2[MDC2_DIGEST_LENGTH];
617 for (count = 0; COND(c[D_MDC2][testnum]); count++) {
618 if (!EVP_Digest(buf, (size_t)lengths[testnum], mdc2, NULL, EVP_mdc2(),
626 #ifndef OPENSSL_NO_MD4
627 static int EVP_Digest_MD4_loop(void *args)
629 loopargs_t *tempargs = *(loopargs_t **) args;
630 unsigned char *buf = tempargs->buf;
631 unsigned char md4[MD4_DIGEST_LENGTH];
634 for (count = 0; COND(c[D_MD4][testnum]); count++) {
635 if (!EVP_Digest(buf, (size_t)lengths[testnum], md4, NULL, EVP_md4(),
643 #ifndef OPENSSL_NO_MD5
644 static int MD5_loop(void *args)
646 loopargs_t *tempargs = *(loopargs_t **) args;
647 unsigned char *buf = tempargs->buf;
648 unsigned char md5[MD5_DIGEST_LENGTH];
650 for (count = 0; COND(c[D_MD5][testnum]); count++)
651 MD5(buf, lengths[testnum], md5);
655 static int HMAC_loop(void *args)
657 loopargs_t *tempargs = *(loopargs_t **) args;
658 unsigned char *buf = tempargs->buf;
659 HMAC_CTX *hctx = tempargs->hctx;
660 unsigned char hmac[MD5_DIGEST_LENGTH];
663 for (count = 0; COND(c[D_HMAC][testnum]); count++) {
664 HMAC_Init_ex(hctx, NULL, 0, NULL, NULL);
665 HMAC_Update(hctx, buf, lengths[testnum]);
666 HMAC_Final(hctx, hmac, NULL);
672 static int SHA1_loop(void *args)
674 loopargs_t *tempargs = *(loopargs_t **) args;
675 unsigned char *buf = tempargs->buf;
676 unsigned char sha[SHA_DIGEST_LENGTH];
678 for (count = 0; COND(c[D_SHA1][testnum]); count++)
679 SHA1(buf, lengths[testnum], sha);
683 static int SHA256_loop(void *args)
685 loopargs_t *tempargs = *(loopargs_t **) args;
686 unsigned char *buf = tempargs->buf;
687 unsigned char sha256[SHA256_DIGEST_LENGTH];
689 for (count = 0; COND(c[D_SHA256][testnum]); count++)
690 SHA256(buf, lengths[testnum], sha256);
694 static int SHA512_loop(void *args)
696 loopargs_t *tempargs = *(loopargs_t **) args;
697 unsigned char *buf = tempargs->buf;
698 unsigned char sha512[SHA512_DIGEST_LENGTH];
700 for (count = 0; COND(c[D_SHA512][testnum]); count++)
701 SHA512(buf, lengths[testnum], sha512);
705 #ifndef OPENSSL_NO_WHIRLPOOL
706 static int WHIRLPOOL_loop(void *args)
708 loopargs_t *tempargs = *(loopargs_t **) args;
709 unsigned char *buf = tempargs->buf;
710 unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
712 for (count = 0; COND(c[D_WHIRLPOOL][testnum]); count++)
713 WHIRLPOOL(buf, lengths[testnum], whirlpool);
718 #ifndef OPENSSL_NO_RMD160
719 static int EVP_Digest_RMD160_loop(void *args)
721 loopargs_t *tempargs = *(loopargs_t **) args;
722 unsigned char *buf = tempargs->buf;
723 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
725 for (count = 0; COND(c[D_RMD160][testnum]); count++) {
726 if (!EVP_Digest(buf, (size_t)lengths[testnum], &(rmd160[0]),
727 NULL, EVP_ripemd160(), NULL))
734 #ifndef OPENSSL_NO_RC4
735 static RC4_KEY rc4_ks;
736 static int RC4_loop(void *args)
738 loopargs_t *tempargs = *(loopargs_t **) args;
739 unsigned char *buf = tempargs->buf;
741 for (count = 0; COND(c[D_RC4][testnum]); count++)
742 RC4(&rc4_ks, (size_t)lengths[testnum], buf, buf);
747 #ifndef OPENSSL_NO_DES
748 static unsigned char DES_iv[8];
749 static DES_key_schedule sch;
750 static DES_key_schedule sch2;
751 static DES_key_schedule sch3;
752 static int DES_ncbc_encrypt_loop(void *args)
754 loopargs_t *tempargs = *(loopargs_t **) args;
755 unsigned char *buf = tempargs->buf;
757 for (count = 0; COND(c[D_CBC_DES][testnum]); count++)
758 DES_ncbc_encrypt(buf, buf, lengths[testnum], &sch,
759 &DES_iv, DES_ENCRYPT);
763 static int DES_ede3_cbc_encrypt_loop(void *args)
765 loopargs_t *tempargs = *(loopargs_t **) args;
766 unsigned char *buf = tempargs->buf;
768 for (count = 0; COND(c[D_EDE3_DES][testnum]); count++)
769 DES_ede3_cbc_encrypt(buf, buf, lengths[testnum],
770 &sch, &sch2, &sch3, &DES_iv, DES_ENCRYPT);
775 #define MAX_BLOCK_SIZE 128
777 static unsigned char iv[2 * MAX_BLOCK_SIZE / 8];
778 static AES_KEY aes_ks1, aes_ks2, aes_ks3;
779 static int AES_cbc_128_encrypt_loop(void *args)
781 loopargs_t *tempargs = *(loopargs_t **) args;
782 unsigned char *buf = tempargs->buf;
784 for (count = 0; COND(c[D_CBC_128_AES][testnum]); count++)
785 AES_cbc_encrypt(buf, buf,
786 (size_t)lengths[testnum], &aes_ks1, iv, AES_ENCRYPT);
790 static int AES_cbc_192_encrypt_loop(void *args)
792 loopargs_t *tempargs = *(loopargs_t **) args;
793 unsigned char *buf = tempargs->buf;
795 for (count = 0; COND(c[D_CBC_192_AES][testnum]); count++)
796 AES_cbc_encrypt(buf, buf,
797 (size_t)lengths[testnum], &aes_ks2, iv, AES_ENCRYPT);
801 static int AES_cbc_256_encrypt_loop(void *args)
803 loopargs_t *tempargs = *(loopargs_t **) args;
804 unsigned char *buf = tempargs->buf;
806 for (count = 0; COND(c[D_CBC_256_AES][testnum]); count++)
807 AES_cbc_encrypt(buf, buf,
808 (size_t)lengths[testnum], &aes_ks3, iv, AES_ENCRYPT);
812 static int AES_ige_128_encrypt_loop(void *args)
814 loopargs_t *tempargs = *(loopargs_t **) args;
815 unsigned char *buf = tempargs->buf;
816 unsigned char *buf2 = tempargs->buf2;
818 for (count = 0; COND(c[D_IGE_128_AES][testnum]); count++)
819 AES_ige_encrypt(buf, buf2,
820 (size_t)lengths[testnum], &aes_ks1, iv, AES_ENCRYPT);
824 static int AES_ige_192_encrypt_loop(void *args)
826 loopargs_t *tempargs = *(loopargs_t **) args;
827 unsigned char *buf = tempargs->buf;
828 unsigned char *buf2 = tempargs->buf2;
830 for (count = 0; COND(c[D_IGE_192_AES][testnum]); count++)
831 AES_ige_encrypt(buf, buf2,
832 (size_t)lengths[testnum], &aes_ks2, iv, AES_ENCRYPT);
836 static int AES_ige_256_encrypt_loop(void *args)
838 loopargs_t *tempargs = *(loopargs_t **) args;
839 unsigned char *buf = tempargs->buf;
840 unsigned char *buf2 = tempargs->buf2;
842 for (count = 0; COND(c[D_IGE_256_AES][testnum]); count++)
843 AES_ige_encrypt(buf, buf2,
844 (size_t)lengths[testnum], &aes_ks3, iv, AES_ENCRYPT);
848 static int CRYPTO_gcm128_aad_loop(void *args)
850 loopargs_t *tempargs = *(loopargs_t **) args;
851 unsigned char *buf = tempargs->buf;
852 GCM128_CONTEXT *gcm_ctx = tempargs->gcm_ctx;
854 for (count = 0; COND(c[D_GHASH][testnum]); count++)
855 CRYPTO_gcm128_aad(gcm_ctx, buf, lengths[testnum]);
859 static long save_count = 0;
860 static int decrypt = 0;
861 static int EVP_Update_loop(void *args)
863 loopargs_t *tempargs = *(loopargs_t **) args;
864 unsigned char *buf = tempargs->buf;
865 EVP_CIPHER_CTX *ctx = tempargs->ctx;
868 int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
871 for (count = 0; COND(nb_iter); count++)
872 EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
874 for (count = 0; COND(nb_iter); count++)
875 EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
877 EVP_DecryptFinal_ex(ctx, buf, &outl);
879 EVP_EncryptFinal_ex(ctx, buf, &outl);
883 static const EVP_MD *evp_md = NULL;
884 static int EVP_Digest_loop(void *args)
886 loopargs_t *tempargs = *(loopargs_t **) args;
887 unsigned char *buf = tempargs->buf;
888 unsigned char md[EVP_MAX_MD_SIZE];
891 int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
894 for (count = 0; COND(nb_iter); count++) {
895 if (!EVP_Digest(buf, lengths[testnum], md, NULL, evp_md, NULL))
901 #ifndef OPENSSL_NO_RSA
902 static long rsa_c[RSA_NUM][2]; /* # RSA iteration test */
904 static int RSA_sign_loop(void *args)
906 loopargs_t *tempargs = *(loopargs_t **) args;
907 unsigned char *buf = tempargs->buf;
908 unsigned char *buf2 = tempargs->buf2;
909 unsigned int *rsa_num = &tempargs->siglen;
910 RSA **rsa_key = tempargs->rsa_key;
912 for (count = 0; COND(rsa_c[testnum][0]); count++) {
913 ret = RSA_sign(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
915 BIO_printf(bio_err, "RSA sign failure\n");
916 ERR_print_errors(bio_err);
924 static int RSA_verify_loop(void *args)
926 loopargs_t *tempargs = *(loopargs_t **) args;
927 unsigned char *buf = tempargs->buf;
928 unsigned char *buf2 = tempargs->buf2;
929 unsigned int rsa_num = tempargs->siglen;
930 RSA **rsa_key = tempargs->rsa_key;
932 for (count = 0; COND(rsa_c[testnum][1]); count++) {
934 RSA_verify(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
936 BIO_printf(bio_err, "RSA verify failure\n");
937 ERR_print_errors(bio_err);
946 #ifndef OPENSSL_NO_DSA
947 static long dsa_c[DSA_NUM][2];
948 static int DSA_sign_loop(void *args)
950 loopargs_t *tempargs = *(loopargs_t **) args;
951 unsigned char *buf = tempargs->buf;
952 unsigned char *buf2 = tempargs->buf2;
953 DSA **dsa_key = tempargs->dsa_key;
954 unsigned int *siglen = &tempargs->siglen;
956 for (count = 0; COND(dsa_c[testnum][0]); count++) {
957 ret = DSA_sign(0, buf, 20, buf2, siglen, dsa_key[testnum]);
959 BIO_printf(bio_err, "DSA sign failure\n");
960 ERR_print_errors(bio_err);
968 static int DSA_verify_loop(void *args)
970 loopargs_t *tempargs = *(loopargs_t **) args;
971 unsigned char *buf = tempargs->buf;
972 unsigned char *buf2 = tempargs->buf2;
973 DSA **dsa_key = tempargs->dsa_key;
974 unsigned int siglen = tempargs->siglen;
976 for (count = 0; COND(dsa_c[testnum][1]); count++) {
977 ret = DSA_verify(0, buf, 20, buf2, siglen, dsa_key[testnum]);
979 BIO_printf(bio_err, "DSA verify failure\n");
980 ERR_print_errors(bio_err);
989 #ifndef OPENSSL_NO_EC
990 static long ecdsa_c[EC_NUM][2];
991 static int ECDSA_sign_loop(void *args)
993 loopargs_t *tempargs = *(loopargs_t **) args;
994 unsigned char *buf = tempargs->buf;
995 EC_KEY **ecdsa = tempargs->ecdsa;
996 unsigned char *ecdsasig = tempargs->buf2;
997 unsigned int *ecdsasiglen = &tempargs->siglen;
999 for (count = 0; COND(ecdsa_c[testnum][0]); count++) {
1000 ret = ECDSA_sign(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[testnum]);
1002 BIO_printf(bio_err, "ECDSA sign failure\n");
1003 ERR_print_errors(bio_err);
1011 static int ECDSA_verify_loop(void *args)
1013 loopargs_t *tempargs = *(loopargs_t **) args;
1014 unsigned char *buf = tempargs->buf;
1015 EC_KEY **ecdsa = tempargs->ecdsa;
1016 unsigned char *ecdsasig = tempargs->buf2;
1017 unsigned int ecdsasiglen = tempargs->siglen;
1019 for (count = 0; COND(ecdsa_c[testnum][1]); count++) {
1020 ret = ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[testnum]);
1022 BIO_printf(bio_err, "ECDSA verify failure\n");
1023 ERR_print_errors(bio_err);
1031 /* ******************************************************************** */
1032 static long ecdh_c[EC_NUM][1];
1034 static int ECDH_EVP_derive_key_loop(void *args)
1036 loopargs_t *tempargs = *(loopargs_t **) args;
1037 EVP_PKEY_CTX *ctx = tempargs->ecdh_ctx[testnum];
1038 unsigned char *derived_secret = tempargs->secret_a;
1040 size_t *outlen = &(tempargs->outlen[testnum]);
1042 for (count = 0; COND(ecdh_c[testnum][0]); count++)
1043 if (EVP_PKEY_derive(ctx, derived_secret, outlen) <= 0) {
1044 BIO_printf(bio_err, "ECDH EVP_PKEY_derive failure\n");
1045 ERR_print_errors(bio_err);
1051 #endif /* OPENSSL_NO_EC */
1053 static int run_benchmark(int async_jobs,
1054 int (*loop_function) (void *), loopargs_t * loopargs)
1056 int job_op_count = 0;
1057 int total_op_count = 0;
1058 int num_inprogress = 0;
1059 int error = 0, i = 0, ret = 0;
1060 OSSL_ASYNC_FD job_fd = 0;
1061 size_t num_job_fds = 0;
1065 if (async_jobs == 0) {
1066 return loop_function((void *)&loopargs);
1069 for (i = 0; i < async_jobs && !error; i++) {
1070 loopargs_t *looparg_item = loopargs + i;
1072 /* Copy pointer content (looparg_t item address) into async context */
1073 ret = ASYNC_start_job(&loopargs[i].inprogress_job, loopargs[i].wait_ctx,
1074 &job_op_count, loop_function,
1075 (void *)&looparg_item, sizeof(looparg_item));
1081 if (job_op_count == -1) {
1084 total_op_count += job_op_count;
1089 BIO_printf(bio_err, "Failure in the job\n");
1090 ERR_print_errors(bio_err);
1096 while (num_inprogress > 0) {
1097 #if defined(OPENSSL_SYS_WINDOWS)
1099 #elif defined(OPENSSL_SYS_UNIX)
1100 int select_result = 0;
1101 OSSL_ASYNC_FD max_fd = 0;
1104 FD_ZERO(&waitfdset);
1106 for (i = 0; i < async_jobs && num_inprogress > 0; i++) {
1107 if (loopargs[i].inprogress_job == NULL)
1110 if (!ASYNC_WAIT_CTX_get_all_fds
1111 (loopargs[i].wait_ctx, NULL, &num_job_fds)
1112 || num_job_fds > 1) {
1113 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1114 ERR_print_errors(bio_err);
1118 ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd,
1120 FD_SET(job_fd, &waitfdset);
1121 if (job_fd > max_fd)
1125 if (max_fd >= (OSSL_ASYNC_FD)FD_SETSIZE) {
1127 "Error: max_fd (%d) must be smaller than FD_SETSIZE (%d). "
1128 "Decrease the value of async_jobs\n",
1129 max_fd, FD_SETSIZE);
1130 ERR_print_errors(bio_err);
1135 select_result = select(max_fd + 1, &waitfdset, NULL, NULL, NULL);
1136 if (select_result == -1 && errno == EINTR)
1139 if (select_result == -1) {
1140 BIO_printf(bio_err, "Failure in the select\n");
1141 ERR_print_errors(bio_err);
1146 if (select_result == 0)
1150 for (i = 0; i < async_jobs; i++) {
1151 if (loopargs[i].inprogress_job == NULL)
1154 if (!ASYNC_WAIT_CTX_get_all_fds
1155 (loopargs[i].wait_ctx, NULL, &num_job_fds)
1156 || num_job_fds > 1) {
1157 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1158 ERR_print_errors(bio_err);
1162 ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd,
1165 #if defined(OPENSSL_SYS_UNIX)
1166 if (num_job_fds == 1 && !FD_ISSET(job_fd, &waitfdset))
1168 #elif defined(OPENSSL_SYS_WINDOWS)
1169 if (num_job_fds == 1
1170 && !PeekNamedPipe(job_fd, NULL, 0, NULL, &avail, NULL)
1175 ret = ASYNC_start_job(&loopargs[i].inprogress_job,
1176 loopargs[i].wait_ctx, &job_op_count,
1177 loop_function, (void *)(loopargs + i),
1178 sizeof(loopargs_t));
1183 if (job_op_count == -1) {
1186 total_op_count += job_op_count;
1189 loopargs[i].inprogress_job = NULL;
1194 loopargs[i].inprogress_job = NULL;
1195 BIO_printf(bio_err, "Failure in the job\n");
1196 ERR_print_errors(bio_err);
1203 return error ? -1 : total_op_count;
1206 int speed_main(int argc, char **argv)
1209 loopargs_t *loopargs = NULL;
1211 int loopargs_len = 0;
1213 const char *engine_id = NULL;
1214 const EVP_CIPHER *evp_cipher = NULL;
1217 int multiblock = 0, pr_header = 0;
1218 int doit[ALGOR_NUM] = { 0 };
1219 int ret = 1, i, k, misalign = 0;
1225 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) \
1226 || !defined(OPENSSL_NO_EC)
1230 /* What follows are the buffers and key material. */
1231 #ifndef OPENSSL_NO_RC5
1234 #ifndef OPENSSL_NO_RC2
1237 #ifndef OPENSSL_NO_IDEA
1238 IDEA_KEY_SCHEDULE idea_ks;
1240 #ifndef OPENSSL_NO_SEED
1241 SEED_KEY_SCHEDULE seed_ks;
1243 #ifndef OPENSSL_NO_BF
1246 #ifndef OPENSSL_NO_CAST
1249 static const unsigned char key16[16] = {
1250 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1251 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
1253 static const unsigned char key24[24] = {
1254 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1255 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1256 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1258 static const unsigned char key32[32] = {
1259 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1260 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1261 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
1262 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
1264 #ifndef OPENSSL_NO_CAMELLIA
1265 static const unsigned char ckey24[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 ckey32[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 CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3;
1278 #ifndef OPENSSL_NO_DES
1279 static DES_cblock key = {
1280 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0
1282 static DES_cblock key2 = {
1283 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
1285 static DES_cblock key3 = {
1286 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1289 #ifndef OPENSSL_NO_RSA
1290 static const unsigned int rsa_bits[RSA_NUM] = {
1291 512, 1024, 2048, 3072, 4096, 7680, 15360
1293 static const unsigned char *rsa_data[RSA_NUM] = {
1294 test512, test1024, test2048, test3072, test4096, test7680, test15360
1296 static const int rsa_data_length[RSA_NUM] = {
1297 sizeof(test512), sizeof(test1024),
1298 sizeof(test2048), sizeof(test3072),
1299 sizeof(test4096), sizeof(test7680),
1302 int rsa_doit[RSA_NUM] = { 0 };
1304 #ifndef OPENSSL_NO_DSA
1305 static const unsigned int dsa_bits[DSA_NUM] = { 512, 1024, 2048 };
1306 int dsa_doit[DSA_NUM] = { 0 };
1308 #ifndef OPENSSL_NO_EC
1310 * We only test over the following curves as they are representative, To
1311 * add tests over more curves, simply add the curve NID and curve name to
1312 * the following arrays and increase the EC_NUM value accordingly.
1314 static const unsigned int test_curves[EC_NUM] = {
1316 NID_secp160r1, NID_X9_62_prime192v1, NID_secp224r1,
1317 NID_X9_62_prime256v1, NID_secp384r1, NID_secp521r1,
1319 NID_sect163k1, NID_sect233k1, NID_sect283k1,
1320 NID_sect409k1, NID_sect571k1, NID_sect163r2,
1321 NID_sect233r1, NID_sect283r1, NID_sect409r1,
1326 static const char *test_curves_names[EC_NUM] = {
1328 "secp160r1", "nistp192", "nistp224",
1329 "nistp256", "nistp384", "nistp521",
1331 "nistk163", "nistk233", "nistk283",
1332 "nistk409", "nistk571", "nistb163",
1333 "nistb233", "nistb283", "nistb409",
1338 static const int test_curves_bits[EC_NUM] = {
1344 571, 253 /* X25519 */
1347 int ecdsa_doit[EC_NUM] = { 0 };
1348 int ecdh_doit[EC_NUM] = { 0 };
1349 #endif /* ndef OPENSSL_NO_EC */
1351 prog = opt_init(argc, argv, speed_options);
1352 while ((o = opt_next()) != OPT_EOF) {
1357 BIO_printf(bio_err, "%s: Use -help for summary.\n", prog);
1360 opt_help(speed_options);
1367 evp_cipher = EVP_get_cipherbyname(opt_arg());
1368 if (evp_cipher == NULL)
1369 evp_md = EVP_get_digestbyname(opt_arg());
1370 if (evp_cipher == NULL && evp_md == NULL) {
1372 "%s: %s is an unknown cipher or digest\n",
1383 * In a forked execution, an engine might need to be
1384 * initialised by each child process, not by the parent.
1385 * So store the name here and run setup_engine() later on.
1387 engine_id = opt_arg();
1391 multi = atoi(opt_arg());
1395 #ifndef OPENSSL_NO_ASYNC
1396 async_jobs = atoi(opt_arg());
1397 if (!ASYNC_is_capable()) {
1399 "%s: async_jobs specified but async not supported\n",
1406 if (!opt_int(opt_arg(), &misalign))
1408 if (misalign > MISALIGN) {
1410 "%s: Maximum offset is %d\n", prog, MISALIGN);
1419 #ifdef OPENSSL_NO_MULTIBLOCK
1421 "%s: -mb specified but multi-block support is disabled\n",
1428 argc = opt_num_rest();
1431 /* Remaining arguments are algorithms. */
1432 for (; *argv; argv++) {
1433 if (found(*argv, doit_choices, &i)) {
1437 #ifndef OPENSSL_NO_DES
1438 if (strcmp(*argv, "des") == 0) {
1439 doit[D_CBC_DES] = doit[D_EDE3_DES] = 1;
1443 if (strcmp(*argv, "sha") == 0) {
1444 doit[D_SHA1] = doit[D_SHA256] = doit[D_SHA512] = 1;
1447 #ifndef OPENSSL_NO_RSA
1449 if (strcmp(*argv, "openssl") == 0) {
1450 RSA_set_default_method(RSA_PKCS1_OpenSSL());
1454 if (strcmp(*argv, "rsa") == 0) {
1455 rsa_doit[R_RSA_512] = rsa_doit[R_RSA_1024] =
1456 rsa_doit[R_RSA_2048] = rsa_doit[R_RSA_3072] =
1457 rsa_doit[R_RSA_4096] = rsa_doit[R_RSA_7680] =
1458 rsa_doit[R_RSA_15360] = 1;
1461 if (found(*argv, rsa_choices, &i)) {
1466 #ifndef OPENSSL_NO_DSA
1467 if (strcmp(*argv, "dsa") == 0) {
1468 dsa_doit[R_DSA_512] = dsa_doit[R_DSA_1024] =
1469 dsa_doit[R_DSA_2048] = 1;
1472 if (found(*argv, dsa_choices, &i)) {
1477 if (strcmp(*argv, "aes") == 0) {
1478 doit[D_CBC_128_AES] = doit[D_CBC_192_AES] = doit[D_CBC_256_AES] = 1;
1481 #ifndef OPENSSL_NO_CAMELLIA
1482 if (strcmp(*argv, "camellia") == 0) {
1483 doit[D_CBC_128_CML] = doit[D_CBC_192_CML] = doit[D_CBC_256_CML] = 1;
1487 #ifndef OPENSSL_NO_EC
1488 if (strcmp(*argv, "ecdsa") == 0) {
1489 for (i = 0; i < EC_NUM; i++)
1493 if (found(*argv, ecdsa_choices, &i)) {
1497 if (strcmp(*argv, "ecdh") == 0) {
1498 for (i = 0; i < EC_NUM; i++)
1502 if (found(*argv, ecdh_choices, &i)) {
1507 BIO_printf(bio_err, "%s: Unknown algorithm %s\n", prog, *argv);
1511 /* Initialize the job pool if async mode is enabled */
1512 if (async_jobs > 0) {
1513 async_init = ASYNC_init_thread(async_jobs, async_jobs);
1515 BIO_printf(bio_err, "Error creating the ASYNC job pool\n");
1520 loopargs_len = (async_jobs == 0 ? 1 : async_jobs);
1522 app_malloc(loopargs_len * sizeof(loopargs_t), "array of loopargs");
1523 memset(loopargs, 0, loopargs_len * sizeof(loopargs_t));
1525 for (i = 0; i < loopargs_len; i++) {
1526 if (async_jobs > 0) {
1527 loopargs[i].wait_ctx = ASYNC_WAIT_CTX_new();
1528 if (loopargs[i].wait_ctx == NULL) {
1529 BIO_printf(bio_err, "Error creating the ASYNC_WAIT_CTX\n");
1534 loopargs[i].buf_malloc =
1535 app_malloc((int)BUFSIZE + MAX_MISALIGNMENT + 1, "input buffer");
1536 loopargs[i].buf2_malloc =
1537 app_malloc((int)BUFSIZE + MAX_MISALIGNMENT + 1, "input buffer");
1538 /* Align the start of buffers on a 64 byte boundary */
1539 loopargs[i].buf = loopargs[i].buf_malloc + misalign;
1540 loopargs[i].buf2 = loopargs[i].buf2_malloc + misalign;
1541 #ifndef OPENSSL_NO_EC
1542 loopargs[i].secret_a = app_malloc(MAX_ECDH_SIZE, "ECDH secret a");
1543 loopargs[i].secret_b = app_malloc(MAX_ECDH_SIZE, "ECDH secret b");
1548 if (multi && do_multi(multi))
1552 /* Initialize the engine after the fork */
1553 e = setup_engine(engine_id, 0);
1555 /* No parameters; turn on everything. */
1556 if ((argc == 0) && !doit[D_EVP]) {
1557 for (i = 0; i < ALGOR_NUM; i++)
1560 #ifndef OPENSSL_NO_RSA
1561 for (i = 0; i < RSA_NUM; i++)
1564 #ifndef OPENSSL_NO_DSA
1565 for (i = 0; i < DSA_NUM; i++)
1568 #ifndef OPENSSL_NO_EC
1569 for (i = 0; i < EC_NUM; i++)
1571 for (i = 0; i < EC_NUM; i++)
1575 for (i = 0; i < ALGOR_NUM; i++)
1579 if (usertime == 0 && !mr)
1581 "You have chosen to measure elapsed time "
1582 "instead of user CPU time.\n");
1584 #ifndef OPENSSL_NO_RSA
1585 for (i = 0; i < loopargs_len; i++) {
1586 for (k = 0; k < RSA_NUM; k++) {
1587 const unsigned char *p;
1590 loopargs[i].rsa_key[k] =
1591 d2i_RSAPrivateKey(NULL, &p, rsa_data_length[k]);
1592 if (loopargs[i].rsa_key[k] == NULL) {
1594 "internal error loading RSA key number %d\n", k);
1600 #ifndef OPENSSL_NO_DSA
1601 for (i = 0; i < loopargs_len; i++) {
1602 loopargs[i].dsa_key[0] = get_dsa512();
1603 loopargs[i].dsa_key[1] = get_dsa1024();
1604 loopargs[i].dsa_key[2] = get_dsa2048();
1607 #ifndef OPENSSL_NO_DES
1608 DES_set_key_unchecked(&key, &sch);
1609 DES_set_key_unchecked(&key2, &sch2);
1610 DES_set_key_unchecked(&key3, &sch3);
1612 AES_set_encrypt_key(key16, 128, &aes_ks1);
1613 AES_set_encrypt_key(key24, 192, &aes_ks2);
1614 AES_set_encrypt_key(key32, 256, &aes_ks3);
1615 #ifndef OPENSSL_NO_CAMELLIA
1616 Camellia_set_key(key16, 128, &camellia_ks1);
1617 Camellia_set_key(ckey24, 192, &camellia_ks2);
1618 Camellia_set_key(ckey32, 256, &camellia_ks3);
1620 #ifndef OPENSSL_NO_IDEA
1621 IDEA_set_encrypt_key(key16, &idea_ks);
1623 #ifndef OPENSSL_NO_SEED
1624 SEED_set_key(key16, &seed_ks);
1626 #ifndef OPENSSL_NO_RC4
1627 RC4_set_key(&rc4_ks, 16, key16);
1629 #ifndef OPENSSL_NO_RC2
1630 RC2_set_key(&rc2_ks, 16, key16, 128);
1632 #ifndef OPENSSL_NO_RC5
1633 RC5_32_set_key(&rc5_ks, 16, key16, 12);
1635 #ifndef OPENSSL_NO_BF
1636 BF_set_key(&bf_ks, 16, key16);
1638 #ifndef OPENSSL_NO_CAST
1639 CAST_set_key(&cast_ks, 16, key16);
1642 # ifndef OPENSSL_NO_DES
1643 BIO_printf(bio_err, "First we calculate the approximate speed ...\n");
1649 for (it = count; it; it--)
1650 DES_ecb_encrypt((DES_cblock *)loopargs[0].buf,
1651 (DES_cblock *)loopargs[0].buf, &sch, DES_ENCRYPT);
1655 c[D_MD2][0] = count / 10;
1656 c[D_MDC2][0] = count / 10;
1657 c[D_MD4][0] = count;
1658 c[D_MD5][0] = count;
1659 c[D_HMAC][0] = count;
1660 c[D_SHA1][0] = count;
1661 c[D_RMD160][0] = count;
1662 c[D_RC4][0] = count * 5;
1663 c[D_CBC_DES][0] = count;
1664 c[D_EDE3_DES][0] = count / 3;
1665 c[D_CBC_IDEA][0] = count;
1666 c[D_CBC_SEED][0] = count;
1667 c[D_CBC_RC2][0] = count;
1668 c[D_CBC_RC5][0] = count;
1669 c[D_CBC_BF][0] = count;
1670 c[D_CBC_CAST][0] = count;
1671 c[D_CBC_128_AES][0] = count;
1672 c[D_CBC_192_AES][0] = count;
1673 c[D_CBC_256_AES][0] = count;
1674 c[D_CBC_128_CML][0] = count;
1675 c[D_CBC_192_CML][0] = count;
1676 c[D_CBC_256_CML][0] = count;
1677 c[D_SHA256][0] = count;
1678 c[D_SHA512][0] = count;
1679 c[D_WHIRLPOOL][0] = count;
1680 c[D_IGE_128_AES][0] = count;
1681 c[D_IGE_192_AES][0] = count;
1682 c[D_IGE_256_AES][0] = count;
1683 c[D_GHASH][0] = count;
1685 for (i = 1; i < SIZE_NUM; i++) {
1688 l0 = (long)lengths[0];
1689 l1 = (long)lengths[i];
1691 c[D_MD2][i] = c[D_MD2][0] * 4 * l0 / l1;
1692 c[D_MDC2][i] = c[D_MDC2][0] * 4 * l0 / l1;
1693 c[D_MD4][i] = c[D_MD4][0] * 4 * l0 / l1;
1694 c[D_MD5][i] = c[D_MD5][0] * 4 * l0 / l1;
1695 c[D_HMAC][i] = c[D_HMAC][0] * 4 * l0 / l1;
1696 c[D_SHA1][i] = c[D_SHA1][0] * 4 * l0 / l1;
1697 c[D_RMD160][i] = c[D_RMD160][0] * 4 * l0 / l1;
1698 c[D_SHA256][i] = c[D_SHA256][0] * 4 * l0 / l1;
1699 c[D_SHA512][i] = c[D_SHA512][0] * 4 * l0 / l1;
1700 c[D_WHIRLPOOL][i] = c[D_WHIRLPOOL][0] * 4 * l0 / l1;
1701 c[D_GHASH][i] = c[D_GHASH][0] * 4 * l0 / l1;
1703 l0 = (long)lengths[i - 1];
1705 c[D_RC4][i] = c[D_RC4][i - 1] * l0 / l1;
1706 c[D_CBC_DES][i] = c[D_CBC_DES][i - 1] * l0 / l1;
1707 c[D_EDE3_DES][i] = c[D_EDE3_DES][i - 1] * l0 / l1;
1708 c[D_CBC_IDEA][i] = c[D_CBC_IDEA][i - 1] * l0 / l1;
1709 c[D_CBC_SEED][i] = c[D_CBC_SEED][i - 1] * l0 / l1;
1710 c[D_CBC_RC2][i] = c[D_CBC_RC2][i - 1] * l0 / l1;
1711 c[D_CBC_RC5][i] = c[D_CBC_RC5][i - 1] * l0 / l1;
1712 c[D_CBC_BF][i] = c[D_CBC_BF][i - 1] * l0 / l1;
1713 c[D_CBC_CAST][i] = c[D_CBC_CAST][i - 1] * l0 / l1;
1714 c[D_CBC_128_AES][i] = c[D_CBC_128_AES][i - 1] * l0 / l1;
1715 c[D_CBC_192_AES][i] = c[D_CBC_192_AES][i - 1] * l0 / l1;
1716 c[D_CBC_256_AES][i] = c[D_CBC_256_AES][i - 1] * l0 / l1;
1717 c[D_CBC_128_CML][i] = c[D_CBC_128_CML][i - 1] * l0 / l1;
1718 c[D_CBC_192_CML][i] = c[D_CBC_192_CML][i - 1] * l0 / l1;
1719 c[D_CBC_256_CML][i] = c[D_CBC_256_CML][i - 1] * l0 / l1;
1720 c[D_IGE_128_AES][i] = c[D_IGE_128_AES][i - 1] * l0 / l1;
1721 c[D_IGE_192_AES][i] = c[D_IGE_192_AES][i - 1] * l0 / l1;
1722 c[D_IGE_256_AES][i] = c[D_IGE_256_AES][i - 1] * l0 / l1;
1725 # ifndef OPENSSL_NO_RSA
1726 rsa_c[R_RSA_512][0] = count / 2000;
1727 rsa_c[R_RSA_512][1] = count / 400;
1728 for (i = 1; i < RSA_NUM; i++) {
1729 rsa_c[i][0] = rsa_c[i - 1][0] / 8;
1730 rsa_c[i][1] = rsa_c[i - 1][1] / 4;
1731 if (rsa_doit[i] <= 1 && rsa_c[i][0] == 0)
1734 if (rsa_c[i][0] == 0) {
1735 rsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
1742 # ifndef OPENSSL_NO_DSA
1743 dsa_c[R_DSA_512][0] = count / 1000;
1744 dsa_c[R_DSA_512][1] = count / 1000 / 2;
1745 for (i = 1; i < DSA_NUM; i++) {
1746 dsa_c[i][0] = dsa_c[i - 1][0] / 4;
1747 dsa_c[i][1] = dsa_c[i - 1][1] / 4;
1748 if (dsa_doit[i] <= 1 && dsa_c[i][0] == 0)
1751 if (dsa_c[i][0] == 0) {
1752 dsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
1759 # ifndef OPENSSL_NO_EC
1760 ecdsa_c[R_EC_P160][0] = count / 1000;
1761 ecdsa_c[R_EC_P160][1] = count / 1000 / 2;
1762 for (i = R_EC_P192; i <= R_EC_P521; i++) {
1763 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1764 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1765 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1768 if (ecdsa_c[i][0] == 0) {
1774 ecdsa_c[R_EC_K163][0] = count / 1000;
1775 ecdsa_c[R_EC_K163][1] = count / 1000 / 2;
1776 for (i = R_EC_K233; i <= R_EC_K571; i++) {
1777 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1778 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1779 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1782 if (ecdsa_c[i][0] == 0) {
1788 ecdsa_c[R_EC_B163][0] = count / 1000;
1789 ecdsa_c[R_EC_B163][1] = count / 1000 / 2;
1790 for (i = R_EC_B233; i <= R_EC_B571; i++) {
1791 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1792 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1793 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1796 if (ecdsa_c[i][0] == 0) {
1803 ecdh_c[R_EC_P160][0] = count / 1000;
1804 for (i = R_EC_P192; i <= R_EC_P521; i++) {
1805 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1806 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1809 if (ecdh_c[i][0] == 0) {
1814 ecdh_c[R_EC_K163][0] = count / 1000;
1815 for (i = R_EC_K233; i <= R_EC_K571; 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_B163][0] = count / 1000;
1826 for (i = R_EC_B233; i <= R_EC_B571; 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) {
1839 /* not worth fixing */
1840 # error "You cannot disable DES on systems without SIGALRM."
1841 # endif /* OPENSSL_NO_DES */
1844 signal(SIGALRM, sig_done);
1846 #endif /* SIGALRM */
1848 #ifndef OPENSSL_NO_MD2
1850 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1851 print_message(names[D_MD2], c[D_MD2][testnum], lengths[testnum]);
1853 count = run_benchmark(async_jobs, EVP_Digest_MD2_loop, loopargs);
1855 print_result(D_MD2, testnum, count, d);
1859 #ifndef OPENSSL_NO_MDC2
1861 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1862 print_message(names[D_MDC2], c[D_MDC2][testnum], lengths[testnum]);
1864 count = run_benchmark(async_jobs, EVP_Digest_MDC2_loop, loopargs);
1866 print_result(D_MDC2, testnum, count, d);
1871 #ifndef OPENSSL_NO_MD4
1873 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1874 print_message(names[D_MD4], c[D_MD4][testnum], lengths[testnum]);
1876 count = run_benchmark(async_jobs, EVP_Digest_MD4_loop, loopargs);
1878 print_result(D_MD4, testnum, count, d);
1883 #ifndef OPENSSL_NO_MD5
1885 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1886 print_message(names[D_MD5], c[D_MD5][testnum], lengths[testnum]);
1888 count = run_benchmark(async_jobs, MD5_loop, loopargs);
1890 print_result(D_MD5, testnum, count, d);
1895 static const char hmac_key[] = "This is a key...";
1896 int len = strlen(hmac_key);
1898 for (i = 0; i < loopargs_len; i++) {
1899 loopargs[i].hctx = HMAC_CTX_new();
1900 if (loopargs[i].hctx == NULL) {
1901 BIO_printf(bio_err, "HMAC malloc failure, exiting...");
1905 HMAC_Init_ex(loopargs[i].hctx, hmac_key, len, EVP_md5(), NULL);
1907 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1908 print_message(names[D_HMAC], c[D_HMAC][testnum], lengths[testnum]);
1910 count = run_benchmark(async_jobs, HMAC_loop, loopargs);
1912 print_result(D_HMAC, testnum, count, d);
1914 for (i = 0; i < loopargs_len; i++) {
1915 HMAC_CTX_free(loopargs[i].hctx);
1920 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1921 print_message(names[D_SHA1], c[D_SHA1][testnum], lengths[testnum]);
1923 count = run_benchmark(async_jobs, SHA1_loop, loopargs);
1925 print_result(D_SHA1, testnum, count, d);
1928 if (doit[D_SHA256]) {
1929 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1930 print_message(names[D_SHA256], c[D_SHA256][testnum],
1933 count = run_benchmark(async_jobs, SHA256_loop, loopargs);
1935 print_result(D_SHA256, testnum, count, d);
1938 if (doit[D_SHA512]) {
1939 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1940 print_message(names[D_SHA512], c[D_SHA512][testnum],
1943 count = run_benchmark(async_jobs, SHA512_loop, loopargs);
1945 print_result(D_SHA512, testnum, count, d);
1948 #ifndef OPENSSL_NO_WHIRLPOOL
1949 if (doit[D_WHIRLPOOL]) {
1950 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1951 print_message(names[D_WHIRLPOOL], c[D_WHIRLPOOL][testnum],
1954 count = run_benchmark(async_jobs, WHIRLPOOL_loop, loopargs);
1956 print_result(D_WHIRLPOOL, testnum, count, d);
1961 #ifndef OPENSSL_NO_RMD160
1962 if (doit[D_RMD160]) {
1963 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1964 print_message(names[D_RMD160], c[D_RMD160][testnum],
1967 count = run_benchmark(async_jobs, EVP_Digest_RMD160_loop, loopargs);
1969 print_result(D_RMD160, testnum, count, d);
1973 #ifndef OPENSSL_NO_RC4
1975 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1976 print_message(names[D_RC4], c[D_RC4][testnum], lengths[testnum]);
1978 count = run_benchmark(async_jobs, RC4_loop, loopargs);
1980 print_result(D_RC4, testnum, count, d);
1984 #ifndef OPENSSL_NO_DES
1985 if (doit[D_CBC_DES]) {
1986 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1987 print_message(names[D_CBC_DES], c[D_CBC_DES][testnum],
1990 count = run_benchmark(async_jobs, DES_ncbc_encrypt_loop, loopargs);
1992 print_result(D_CBC_DES, testnum, count, d);
1996 if (doit[D_EDE3_DES]) {
1997 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1998 print_message(names[D_EDE3_DES], c[D_EDE3_DES][testnum],
2002 run_benchmark(async_jobs, DES_ede3_cbc_encrypt_loop, loopargs);
2004 print_result(D_EDE3_DES, testnum, count, d);
2009 if (doit[D_CBC_128_AES]) {
2010 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2011 print_message(names[D_CBC_128_AES], c[D_CBC_128_AES][testnum],
2015 run_benchmark(async_jobs, AES_cbc_128_encrypt_loop, loopargs);
2017 print_result(D_CBC_128_AES, testnum, count, d);
2020 if (doit[D_CBC_192_AES]) {
2021 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2022 print_message(names[D_CBC_192_AES], c[D_CBC_192_AES][testnum],
2026 run_benchmark(async_jobs, AES_cbc_192_encrypt_loop, loopargs);
2028 print_result(D_CBC_192_AES, testnum, count, d);
2031 if (doit[D_CBC_256_AES]) {
2032 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2033 print_message(names[D_CBC_256_AES], c[D_CBC_256_AES][testnum],
2037 run_benchmark(async_jobs, AES_cbc_256_encrypt_loop, loopargs);
2039 print_result(D_CBC_256_AES, testnum, count, d);
2043 if (doit[D_IGE_128_AES]) {
2044 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2045 print_message(names[D_IGE_128_AES], c[D_IGE_128_AES][testnum],
2049 run_benchmark(async_jobs, AES_ige_128_encrypt_loop, loopargs);
2051 print_result(D_IGE_128_AES, testnum, count, d);
2054 if (doit[D_IGE_192_AES]) {
2055 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2056 print_message(names[D_IGE_192_AES], c[D_IGE_192_AES][testnum],
2060 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],
2071 run_benchmark(async_jobs, AES_ige_256_encrypt_loop, loopargs);
2073 print_result(D_IGE_256_AES, testnum, count, d);
2076 if (doit[D_GHASH]) {
2077 for (i = 0; i < loopargs_len; i++) {
2078 loopargs[i].gcm_ctx =
2079 CRYPTO_gcm128_new(&aes_ks1, (block128_f) AES_encrypt);
2080 CRYPTO_gcm128_setiv(loopargs[i].gcm_ctx,
2081 (unsigned char *)"0123456789ab", 12);
2084 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2085 print_message(names[D_GHASH], c[D_GHASH][testnum],
2088 count = run_benchmark(async_jobs, CRYPTO_gcm128_aad_loop, loopargs);
2090 print_result(D_GHASH, testnum, count, d);
2092 for (i = 0; i < loopargs_len; i++)
2093 CRYPTO_gcm128_release(loopargs[i].gcm_ctx);
2095 #ifndef OPENSSL_NO_CAMELLIA
2096 if (doit[D_CBC_128_CML]) {
2097 if (async_jobs > 0) {
2098 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2099 names[D_CBC_128_CML]);
2100 doit[D_CBC_128_CML] = 0;
2102 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2103 print_message(names[D_CBC_128_CML], c[D_CBC_128_CML][testnum],
2106 for (count = 0, run = 1; COND(c[D_CBC_128_CML][testnum]); count++)
2107 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2108 (size_t)lengths[testnum], &camellia_ks1,
2109 iv, CAMELLIA_ENCRYPT);
2111 print_result(D_CBC_128_CML, testnum, count, d);
2114 if (doit[D_CBC_192_CML]) {
2115 if (async_jobs > 0) {
2116 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2117 names[D_CBC_192_CML]);
2118 doit[D_CBC_192_CML] = 0;
2120 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2121 print_message(names[D_CBC_192_CML], c[D_CBC_192_CML][testnum],
2123 if (async_jobs > 0) {
2124 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2128 for (count = 0, run = 1; COND(c[D_CBC_192_CML][testnum]); count++)
2129 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2130 (size_t)lengths[testnum], &camellia_ks2,
2131 iv, CAMELLIA_ENCRYPT);
2133 print_result(D_CBC_192_CML, testnum, count, d);
2136 if (doit[D_CBC_256_CML]) {
2137 if (async_jobs > 0) {
2138 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2139 names[D_CBC_256_CML]);
2140 doit[D_CBC_256_CML] = 0;
2142 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2143 print_message(names[D_CBC_256_CML], c[D_CBC_256_CML][testnum],
2146 for (count = 0, run = 1; COND(c[D_CBC_256_CML][testnum]); count++)
2147 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2148 (size_t)lengths[testnum], &camellia_ks3,
2149 iv, CAMELLIA_ENCRYPT);
2151 print_result(D_CBC_256_CML, testnum, count, d);
2155 #ifndef OPENSSL_NO_IDEA
2156 if (doit[D_CBC_IDEA]) {
2157 if (async_jobs > 0) {
2158 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2160 doit[D_CBC_IDEA] = 0;
2162 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2163 print_message(names[D_CBC_IDEA], c[D_CBC_IDEA][testnum],
2166 for (count = 0, run = 1; COND(c[D_CBC_IDEA][testnum]); count++)
2167 IDEA_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2168 (size_t)lengths[testnum], &idea_ks,
2171 print_result(D_CBC_IDEA, testnum, count, d);
2175 #ifndef OPENSSL_NO_SEED
2176 if (doit[D_CBC_SEED]) {
2177 if (async_jobs > 0) {
2178 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2180 doit[D_CBC_SEED] = 0;
2182 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2183 print_message(names[D_CBC_SEED], c[D_CBC_SEED][testnum],
2186 for (count = 0, run = 1; COND(c[D_CBC_SEED][testnum]); count++)
2187 SEED_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2188 (size_t)lengths[testnum], &seed_ks, iv, 1);
2190 print_result(D_CBC_SEED, testnum, count, d);
2194 #ifndef OPENSSL_NO_RC2
2195 if (doit[D_CBC_RC2]) {
2196 if (async_jobs > 0) {
2197 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2199 doit[D_CBC_RC2] = 0;
2201 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2202 print_message(names[D_CBC_RC2], c[D_CBC_RC2][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_RC2][testnum]); count++)
2210 RC2_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2211 (size_t)lengths[testnum], &rc2_ks,
2214 print_result(D_CBC_RC2, testnum, count, d);
2218 #ifndef OPENSSL_NO_RC5
2219 if (doit[D_CBC_RC5]) {
2220 if (async_jobs > 0) {
2221 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2223 doit[D_CBC_RC5] = 0;
2225 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2226 print_message(names[D_CBC_RC5], c[D_CBC_RC5][testnum],
2228 if (async_jobs > 0) {
2229 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2233 for (count = 0, run = 1; COND(c[D_CBC_RC5][testnum]); count++)
2234 RC5_32_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2235 (size_t)lengths[testnum], &rc5_ks,
2238 print_result(D_CBC_RC5, testnum, count, d);
2242 #ifndef OPENSSL_NO_BF
2243 if (doit[D_CBC_BF]) {
2244 if (async_jobs > 0) {
2245 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2249 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2250 print_message(names[D_CBC_BF], c[D_CBC_BF][testnum],
2253 for (count = 0, run = 1; COND(c[D_CBC_BF][testnum]); count++)
2254 BF_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2255 (size_t)lengths[testnum], &bf_ks,
2258 print_result(D_CBC_BF, testnum, count, d);
2262 #ifndef OPENSSL_NO_CAST
2263 if (doit[D_CBC_CAST]) {
2264 if (async_jobs > 0) {
2265 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2267 doit[D_CBC_CAST] = 0;
2269 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2270 print_message(names[D_CBC_CAST], c[D_CBC_CAST][testnum],
2273 for (count = 0, run = 1; COND(c[D_CBC_CAST][testnum]); count++)
2274 CAST_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2275 (size_t)lengths[testnum], &cast_ks,
2278 print_result(D_CBC_CAST, testnum, count, d);
2284 #ifdef EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK
2285 if (multiblock && evp_cipher) {
2287 (EVP_CIPHER_flags(evp_cipher) &
2288 EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) {
2289 BIO_printf(bio_err, "%s is not multi-block capable\n",
2290 OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher)));
2293 if (async_jobs > 0) {
2294 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2297 multiblock_speed(evp_cipher);
2302 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2305 names[D_EVP] = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
2307 * -O3 -fschedule-insns messes up an optimization here!
2308 * names[D_EVP] somehow becomes NULL
2310 print_message(names[D_EVP], save_count, lengths[testnum]);
2312 for (k = 0; k < loopargs_len; k++) {
2313 loopargs[k].ctx = EVP_CIPHER_CTX_new();
2315 EVP_DecryptInit_ex(loopargs[k].ctx, evp_cipher, NULL,
2318 EVP_EncryptInit_ex(loopargs[k].ctx, evp_cipher, NULL,
2320 EVP_CIPHER_CTX_set_padding(loopargs[k].ctx, 0);
2324 count = run_benchmark(async_jobs, EVP_Update_loop, loopargs);
2326 for (k = 0; k < loopargs_len; k++) {
2327 EVP_CIPHER_CTX_free(loopargs[k].ctx);
2331 names[D_EVP] = OBJ_nid2ln(EVP_MD_type(evp_md));
2332 print_message(names[D_EVP], save_count, lengths[testnum]);
2334 count = run_benchmark(async_jobs, EVP_Digest_loop, loopargs);
2337 print_result(D_EVP, testnum, count, d);
2341 for (i = 0; i < loopargs_len; i++)
2342 RAND_bytes(loopargs[i].buf, 36);
2344 #ifndef OPENSSL_NO_RSA
2345 for (testnum = 0; testnum < RSA_NUM; testnum++) {
2347 if (!rsa_doit[testnum])
2349 for (i = 0; i < loopargs_len; i++) {
2350 st = RSA_sign(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
2351 &loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
2357 "RSA sign failure. No RSA sign will be done.\n");
2358 ERR_print_errors(bio_err);
2361 pkey_print_message("private", "rsa",
2362 rsa_c[testnum][0], rsa_bits[testnum],
2364 /* RSA_blinding_on(rsa_key[testnum],NULL); */
2366 count = run_benchmark(async_jobs, RSA_sign_loop, loopargs);
2369 mr ? "+R1:%ld:%d:%.2f\n"
2370 : "%ld %d bit private RSA's in %.2fs\n",
2371 count, rsa_bits[testnum], d);
2372 rsa_results[testnum][0] = d / (double)count;
2376 for (i = 0; i < loopargs_len; i++) {
2377 st = RSA_verify(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
2378 loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
2384 "RSA verify failure. No RSA verify will be done.\n");
2385 ERR_print_errors(bio_err);
2386 rsa_doit[testnum] = 0;
2388 pkey_print_message("public", "rsa",
2389 rsa_c[testnum][1], rsa_bits[testnum],
2392 count = run_benchmark(async_jobs, RSA_verify_loop, loopargs);
2395 mr ? "+R2:%ld:%d:%.2f\n"
2396 : "%ld %d bit public RSA's in %.2fs\n",
2397 count, rsa_bits[testnum], d);
2398 rsa_results[testnum][1] = d / (double)count;
2401 if (rsa_count <= 1) {
2402 /* if longer than 10s, don't do any more */
2403 for (testnum++; testnum < RSA_NUM; testnum++)
2404 rsa_doit[testnum] = 0;
2407 #endif /* OPENSSL_NO_RSA */
2409 for (i = 0; i < loopargs_len; i++)
2410 RAND_bytes(loopargs[i].buf, 36);
2412 #ifndef OPENSSL_NO_DSA
2413 if (RAND_status() != 1) {
2414 RAND_seed(rnd_seed, sizeof rnd_seed);
2416 for (testnum = 0; testnum < DSA_NUM; testnum++) {
2418 if (!dsa_doit[testnum])
2421 /* DSA_generate_key(dsa_key[testnum]); */
2422 /* DSA_sign_setup(dsa_key[testnum],NULL); */
2423 for (i = 0; i < loopargs_len; i++) {
2424 st = DSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
2425 &loopargs[i].siglen, loopargs[i].dsa_key[testnum]);
2431 "DSA sign failure. No DSA sign will be done.\n");
2432 ERR_print_errors(bio_err);
2435 pkey_print_message("sign", "dsa",
2436 dsa_c[testnum][0], dsa_bits[testnum],
2439 count = run_benchmark(async_jobs, DSA_sign_loop, loopargs);
2442 mr ? "+R3:%ld:%d:%.2f\n"
2443 : "%ld %d bit DSA signs in %.2fs\n",
2444 count, dsa_bits[testnum], d);
2445 dsa_results[testnum][0] = d / (double)count;
2449 for (i = 0; i < loopargs_len; i++) {
2450 st = DSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
2451 loopargs[i].siglen, loopargs[i].dsa_key[testnum]);
2457 "DSA verify failure. No DSA verify will be done.\n");
2458 ERR_print_errors(bio_err);
2459 dsa_doit[testnum] = 0;
2461 pkey_print_message("verify", "dsa",
2462 dsa_c[testnum][1], dsa_bits[testnum],
2465 count = run_benchmark(async_jobs, DSA_verify_loop, loopargs);
2468 mr ? "+R4:%ld:%d:%.2f\n"
2469 : "%ld %d bit DSA verify in %.2fs\n",
2470 count, dsa_bits[testnum], d);
2471 dsa_results[testnum][1] = d / (double)count;
2474 if (rsa_count <= 1) {
2475 /* if longer than 10s, don't do any more */
2476 for (testnum++; testnum < DSA_NUM; testnum++)
2477 dsa_doit[testnum] = 0;
2480 #endif /* OPENSSL_NO_DSA */
2482 #ifndef OPENSSL_NO_EC
2483 if (RAND_status() != 1) {
2484 RAND_seed(rnd_seed, sizeof rnd_seed);
2486 for (testnum = 0; testnum < EC_NUM; testnum++) {
2489 if (!ecdsa_doit[testnum])
2490 continue; /* Ignore Curve */
2491 for (i = 0; i < loopargs_len; i++) {
2492 loopargs[i].ecdsa[testnum] =
2493 EC_KEY_new_by_curve_name(test_curves[testnum]);
2494 if (loopargs[i].ecdsa[testnum] == NULL) {
2500 BIO_printf(bio_err, "ECDSA failure.\n");
2501 ERR_print_errors(bio_err);
2504 for (i = 0; i < loopargs_len; i++) {
2505 EC_KEY_precompute_mult(loopargs[i].ecdsa[testnum], NULL);
2506 /* Perform ECDSA signature test */
2507 EC_KEY_generate_key(loopargs[i].ecdsa[testnum]);
2508 st = ECDSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
2509 &loopargs[i].siglen,
2510 loopargs[i].ecdsa[testnum]);
2516 "ECDSA sign failure. No ECDSA sign will be done.\n");
2517 ERR_print_errors(bio_err);
2520 pkey_print_message("sign", "ecdsa",
2521 ecdsa_c[testnum][0],
2522 test_curves_bits[testnum], ECDSA_SECONDS);
2524 count = run_benchmark(async_jobs, ECDSA_sign_loop, loopargs);
2528 mr ? "+R5:%ld:%d:%.2f\n" :
2529 "%ld %d bit ECDSA signs in %.2fs \n",
2530 count, test_curves_bits[testnum], d);
2531 ecdsa_results[testnum][0] = d / (double)count;
2535 /* Perform ECDSA verification test */
2536 for (i = 0; i < loopargs_len; i++) {
2537 st = ECDSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
2539 loopargs[i].ecdsa[testnum]);
2545 "ECDSA verify failure. No ECDSA verify will be done.\n");
2546 ERR_print_errors(bio_err);
2547 ecdsa_doit[testnum] = 0;
2549 pkey_print_message("verify", "ecdsa",
2550 ecdsa_c[testnum][1],
2551 test_curves_bits[testnum], ECDSA_SECONDS);
2553 count = run_benchmark(async_jobs, ECDSA_verify_loop, loopargs);
2556 mr ? "+R6:%ld:%d:%.2f\n"
2557 : "%ld %d bit ECDSA verify in %.2fs\n",
2558 count, test_curves_bits[testnum], d);
2559 ecdsa_results[testnum][1] = d / (double)count;
2562 if (rsa_count <= 1) {
2563 /* if longer than 10s, don't do any more */
2564 for (testnum++; testnum < EC_NUM; testnum++)
2565 ecdsa_doit[testnum] = 0;
2570 if (RAND_status() != 1) {
2571 RAND_seed(rnd_seed, sizeof rnd_seed);
2573 for (testnum = 0; testnum < EC_NUM; testnum++) {
2574 int ecdh_checks = 1;
2576 if (!ecdh_doit[testnum])
2579 for (i = 0; i < loopargs_len; i++) {
2580 EVP_PKEY_CTX *kctx = NULL;
2581 EVP_PKEY_CTX *ctx = NULL;
2582 EVP_PKEY *key_A = NULL;
2583 EVP_PKEY *key_B = NULL;
2586 if (testnum == R_EC_X25519) {
2587 kctx = EVP_PKEY_CTX_new_id(test_curves[testnum], NULL); /* keygen ctx from NID */
2589 EVP_PKEY_CTX *pctx = NULL;
2590 EVP_PKEY *params = NULL;
2592 if ( /* Create the context for parameter generation */
2593 !(pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL)) ||
2594 /* Initialise the parameter generation */
2595 !EVP_PKEY_paramgen_init(pctx) ||
2596 /* Set the curve by NID */
2597 !EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx,
2600 /* Create the parameter object params */
2601 !EVP_PKEY_paramgen(pctx, ¶ms)) {
2603 BIO_printf(bio_err, "ECDH init failure.\n");
2604 ERR_print_errors(bio_err);
2608 /* Create the context for the key generation */
2609 kctx = EVP_PKEY_CTX_new(params, NULL);
2611 EVP_PKEY_free(params);
2613 EVP_PKEY_CTX_free(pctx);
2616 if (!kctx || /* keygen ctx is not null */
2617 !EVP_PKEY_keygen_init(kctx) /* init keygen ctx */ ) {
2619 BIO_printf(bio_err, "ECDH keygen failure.\n");
2620 ERR_print_errors(bio_err);
2625 if (!EVP_PKEY_keygen(kctx, &key_A) || /* generate secret key A */
2626 !EVP_PKEY_keygen(kctx, &key_B) || /* generate secret key B */
2627 !(ctx = EVP_PKEY_CTX_new(key_A, NULL)) || /* derivation ctx from skeyA */
2628 !EVP_PKEY_derive_init(ctx) || /* init derivation ctx */
2629 !EVP_PKEY_derive_set_peer(ctx, key_B) || /* set peer pubkey in ctx */
2630 !EVP_PKEY_derive(ctx, NULL, &outlen) || /* determine max length */
2631 outlen > MAX_ECDH_SIZE /* avoid buffer overflow */ ) {
2633 BIO_printf(bio_err, "ECDH key generation failure.\n");
2634 ERR_print_errors(bio_err);
2639 loopargs[i].ecdh_ctx[testnum] = ctx;
2640 loopargs[i].outlen[testnum] = outlen;
2642 EVP_PKEY_CTX_free(kctx);
2645 if (ecdh_checks != 0) {
2646 pkey_print_message("", "ecdh",
2648 test_curves_bits[testnum], ECDH_SECONDS);
2651 run_benchmark(async_jobs, ECDH_EVP_derive_key_loop, loopargs);
2654 mr ? "+R7:%ld:%d:%.2f\n" :
2655 "%ld %d-bit ECDH ops in %.2fs\n", count,
2656 test_curves_bits[testnum], d);
2657 ecdh_results[testnum][0] = d / (double)count;
2661 if (rsa_count <= 1) {
2662 /* if longer than 10s, don't do any more */
2663 for (testnum++; testnum < EC_NUM; testnum++)
2664 ecdh_doit[testnum] = 0;
2667 #endif /* OPENSSL_NO_EC */
2672 printf("%s\n", OpenSSL_version(OPENSSL_VERSION));
2673 printf("%s\n", OpenSSL_version(OPENSSL_BUILT_ON));
2675 printf("%s ", BN_options());
2676 #ifndef OPENSSL_NO_MD2
2677 printf("%s ", MD2_options());
2679 #ifndef OPENSSL_NO_RC4
2680 printf("%s ", RC4_options());
2682 #ifndef OPENSSL_NO_DES
2683 printf("%s ", DES_options());
2685 printf("%s ", AES_options());
2686 #ifndef OPENSSL_NO_IDEA
2687 printf("%s ", IDEA_options());
2689 #ifndef OPENSSL_NO_BF
2690 printf("%s ", BF_options());
2692 printf("\n%s\n", OpenSSL_version(OPENSSL_CFLAGS));
2700 ("The 'numbers' are in 1000s of bytes per second processed.\n");
2703 for (testnum = 0; testnum < SIZE_NUM; testnum++)
2704 printf(mr ? ":%d" : "%7d bytes", lengths[testnum]);
2708 for (k = 0; k < ALGOR_NUM; k++) {
2712 printf("+F:%d:%s", k, names[k]);
2714 printf("%-13s", names[k]);
2715 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2716 if (results[k][testnum] > 10000 && !mr)
2717 printf(" %11.2fk", results[k][testnum] / 1e3);
2719 printf(mr ? ":%.2f" : " %11.2f ", results[k][testnum]);
2723 #ifndef OPENSSL_NO_RSA
2725 for (k = 0; k < RSA_NUM; k++) {
2728 if (testnum && !mr) {
2729 printf("%18ssign verify sign/s verify/s\n", " ");
2733 printf("+F2:%u:%u:%f:%f\n",
2734 k, rsa_bits[k], rsa_results[k][0], rsa_results[k][1]);
2736 printf("rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2737 rsa_bits[k], rsa_results[k][0], rsa_results[k][1],
2738 1.0 / rsa_results[k][0], 1.0 / rsa_results[k][1]);
2741 #ifndef OPENSSL_NO_DSA
2743 for (k = 0; k < DSA_NUM; k++) {
2746 if (testnum && !mr) {
2747 printf("%18ssign verify sign/s verify/s\n", " ");
2751 printf("+F3:%u:%u:%f:%f\n",
2752 k, dsa_bits[k], dsa_results[k][0], dsa_results[k][1]);
2754 printf("dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2755 dsa_bits[k], dsa_results[k][0], dsa_results[k][1],
2756 1.0 / dsa_results[k][0], 1.0 / dsa_results[k][1]);
2759 #ifndef OPENSSL_NO_EC
2761 for (k = 0; k < EC_NUM; k++) {
2764 if (testnum && !mr) {
2765 printf("%30ssign verify sign/s verify/s\n", " ");
2770 printf("+F4:%u:%u:%f:%f\n",
2771 k, test_curves_bits[k],
2772 ecdsa_results[k][0], ecdsa_results[k][1]);
2774 printf("%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2775 test_curves_bits[k],
2776 test_curves_names[k],
2777 ecdsa_results[k][0], ecdsa_results[k][1],
2778 1.0 / ecdsa_results[k][0], 1.0 / ecdsa_results[k][1]);
2782 for (k = 0; k < EC_NUM; k++) {
2785 if (testnum && !mr) {
2786 printf("%30sop op/s\n", " ");
2790 printf("+F5:%u:%u:%f:%f\n",
2791 k, test_curves_bits[k],
2792 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
2795 printf("%4u bit ecdh (%s) %8.4fs %8.1f\n",
2796 test_curves_bits[k],
2797 test_curves_names[k],
2798 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
2805 ERR_print_errors(bio_err);
2806 for (i = 0; i < loopargs_len; i++) {
2807 OPENSSL_free(loopargs[i].buf_malloc);
2808 OPENSSL_free(loopargs[i].buf2_malloc);
2810 #ifndef OPENSSL_NO_RSA
2811 for (k = 0; k < RSA_NUM; k++)
2812 RSA_free(loopargs[i].rsa_key[k]);
2814 #ifndef OPENSSL_NO_DSA
2815 for (k = 0; k < DSA_NUM; k++)
2816 DSA_free(loopargs[i].dsa_key[k]);
2818 #ifndef OPENSSL_NO_EC
2819 for (k = 0; k < EC_NUM; k++) {
2820 EC_KEY_free(loopargs[i].ecdsa[k]);
2821 EVP_PKEY_CTX_free(loopargs[i].ecdh_ctx[k]);
2823 OPENSSL_free(loopargs[i].secret_a);
2824 OPENSSL_free(loopargs[i].secret_b);
2828 if (async_jobs > 0) {
2829 for (i = 0; i < loopargs_len; i++)
2830 ASYNC_WAIT_CTX_free(loopargs[i].wait_ctx);
2834 ASYNC_cleanup_thread();
2836 OPENSSL_free(loopargs);
2841 static void print_message(const char *s, long num, int length)
2845 mr ? "+DT:%s:%d:%d\n"
2846 : "Doing %s for %ds on %d size blocks: ", s, SECONDS, length);
2847 (void)BIO_flush(bio_err);
2851 mr ? "+DN:%s:%ld:%d\n"
2852 : "Doing %s %ld times on %d size blocks: ", s, num, length);
2853 (void)BIO_flush(bio_err);
2857 static void pkey_print_message(const char *str, const char *str2, long num,
2862 mr ? "+DTP:%d:%s:%s:%d\n"
2863 : "Doing %d bit %s %s's for %ds: ", bits, str, str2, tm);
2864 (void)BIO_flush(bio_err);
2868 mr ? "+DNP:%ld:%d:%s:%s\n"
2869 : "Doing %ld %d bit %s %s's: ", num, bits, str, str2);
2870 (void)BIO_flush(bio_err);
2874 static void print_result(int alg, int run_no, int count, double time_used)
2877 BIO_puts(bio_err, "EVP error!\n");
2881 mr ? "+R:%d:%s:%f\n"
2882 : "%d %s's in %.2fs\n", count, names[alg], time_used);
2883 results[alg][run_no] = ((double)count) / time_used * lengths[run_no];
2887 static char *sstrsep(char **string, const char *delim)
2890 char *token = *string;
2895 memset(isdelim, 0, sizeof isdelim);
2899 isdelim[(unsigned char)(*delim)] = 1;
2903 while (!isdelim[(unsigned char)(**string)]) {
2915 static int do_multi(int multi)
2920 static char sep[] = ":";
2922 fds = malloc(sizeof(*fds) * multi);
2923 for (n = 0; n < multi; ++n) {
2924 if (pipe(fd) == -1) {
2925 BIO_printf(bio_err, "pipe failure\n");
2929 (void)BIO_flush(bio_err);
2936 if (dup(fd[1]) == -1) {
2937 BIO_printf(bio_err, "dup failed\n");
2946 printf("Forked child %d\n", n);
2949 /* for now, assume the pipe is long enough to take all the output */
2950 for (n = 0; n < multi; ++n) {
2955 f = fdopen(fds[n], "r");
2956 while (fgets(buf, sizeof buf, f)) {
2957 p = strchr(buf, '\n');
2960 if (buf[0] != '+') {
2962 "Don't understand line '%s' from child %d\n", buf,
2966 printf("Got: %s from %d\n", buf, n);
2967 if (strncmp(buf, "+F:", 3) == 0) {
2972 alg = atoi(sstrsep(&p, sep));
2974 for (j = 0; j < SIZE_NUM; ++j)
2975 results[alg][j] += atof(sstrsep(&p, sep));
2976 } else if (strncmp(buf, "+F2:", 4) == 0) {
2981 k = atoi(sstrsep(&p, sep));
2984 d = atof(sstrsep(&p, sep));
2986 rsa_results[k][0] = 1 / (1 / rsa_results[k][0] + 1 / d);
2988 rsa_results[k][0] = d;
2990 d = atof(sstrsep(&p, sep));
2992 rsa_results[k][1] = 1 / (1 / rsa_results[k][1] + 1 / d);
2994 rsa_results[k][1] = d;
2996 # ifndef OPENSSL_NO_DSA
2997 else if (strncmp(buf, "+F3:", 4) == 0) {
3002 k = atoi(sstrsep(&p, sep));
3005 d = atof(sstrsep(&p, sep));
3007 dsa_results[k][0] = 1 / (1 / dsa_results[k][0] + 1 / d);
3009 dsa_results[k][0] = d;
3011 d = atof(sstrsep(&p, sep));
3013 dsa_results[k][1] = 1 / (1 / dsa_results[k][1] + 1 / d);
3015 dsa_results[k][1] = d;
3018 # ifndef OPENSSL_NO_EC
3019 else if (strncmp(buf, "+F4:", 4) == 0) {
3024 k = atoi(sstrsep(&p, sep));
3027 d = atof(sstrsep(&p, sep));
3029 ecdsa_results[k][0] = 1 / (1 / ecdsa_results[k][0] + 1 / d);
3031 ecdsa_results[k][0] = d;
3033 d = atof(sstrsep(&p, sep));
3035 ecdsa_results[k][1] = 1 / (1 / ecdsa_results[k][1] + 1 / d);
3037 ecdsa_results[k][1] = d;
3038 } else if (strncmp(buf, "+F5:", 4) == 0) {
3043 k = atoi(sstrsep(&p, sep));
3046 d = atof(sstrsep(&p, sep));
3048 ecdh_results[k][0] = 1 / (1 / ecdh_results[k][0] + 1 / d);
3050 ecdh_results[k][0] = d;
3055 else if (strncmp(buf, "+H:", 3) == 0) {
3058 BIO_printf(bio_err, "Unknown type '%s' from child %d\n", buf,
3069 static void multiblock_speed(const EVP_CIPHER *evp_cipher)
3071 static int mblengths[] =
3072 { 8 * 1024, 2 * 8 * 1024, 4 * 8 * 1024, 8 * 8 * 1024, 8 * 16 * 1024 };
3073 int j, count, num = OSSL_NELEM(mblengths);
3074 const char *alg_name;
3075 unsigned char *inp, *out, no_key[32], no_iv[16];
3076 EVP_CIPHER_CTX *ctx;
3079 inp = app_malloc(mblengths[num - 1], "multiblock input buffer");
3080 out = app_malloc(mblengths[num - 1] + 1024, "multiblock output buffer");
3081 ctx = EVP_CIPHER_CTX_new();
3082 EVP_EncryptInit_ex(ctx, evp_cipher, NULL, no_key, no_iv);
3083 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_MAC_KEY, sizeof(no_key), no_key);
3084 alg_name = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
3086 for (j = 0; j < num; j++) {
3087 print_message(alg_name, 0, mblengths[j]);
3089 for (count = 0, run = 1; run && count < 0x7fffffff; count++) {
3090 unsigned char aad[EVP_AEAD_TLS1_AAD_LEN];
3091 EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM mb_param;
3092 size_t len = mblengths[j];
3095 memset(aad, 0, 8); /* avoid uninitialized values */
3096 aad[8] = 23; /* SSL3_RT_APPLICATION_DATA */
3097 aad[9] = 3; /* version */
3099 aad[11] = 0; /* length */
3101 mb_param.out = NULL;
3104 mb_param.interleave = 8;
3106 packlen = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_AAD,
3107 sizeof(mb_param), &mb_param);
3113 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT,
3114 sizeof(mb_param), &mb_param);
3118 RAND_bytes(out, 16);
3122 pad = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_TLS1_AAD,
3123 EVP_AEAD_TLS1_AAD_LEN, aad);
3124 EVP_Cipher(ctx, out, inp, len + pad);
3128 BIO_printf(bio_err, mr ? "+R:%d:%s:%f\n"
3129 : "%d %s's in %.2fs\n", count, "evp", d);
3130 results[D_EVP][j] = ((double)count) / d * mblengths[j];
3134 fprintf(stdout, "+H");
3135 for (j = 0; j < num; j++)
3136 fprintf(stdout, ":%d", mblengths[j]);
3137 fprintf(stdout, "\n");
3138 fprintf(stdout, "+F:%d:%s", D_EVP, alg_name);
3139 for (j = 0; j < num; j++)
3140 fprintf(stdout, ":%.2f", results[D_EVP][j]);
3141 fprintf(stdout, "\n");
3144 "The 'numbers' are in 1000s of bytes per second processed.\n");
3145 fprintf(stdout, "type ");
3146 for (j = 0; j < num; j++)
3147 fprintf(stdout, "%7d bytes", mblengths[j]);
3148 fprintf(stdout, "\n");
3149 fprintf(stdout, "%-24s", alg_name);
3151 for (j = 0; j < num; j++) {
3152 if (results[D_EVP][j] > 10000)
3153 fprintf(stdout, " %11.2fk", results[D_EVP][j] / 1e3);
3155 fprintf(stdout, " %11.2f ", results[D_EVP][j]);
3157 fprintf(stdout, "\n");
3162 EVP_CIPHER_CTX_free(ctx);