1 /* apps/speed.c -*- mode:C; c-file-style: "eay" -*- */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
58 /* ====================================================================
59 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
61 * Portions of the attached software ("Contribution") are developed by
62 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
64 * The Contribution is licensed pursuant to the OpenSSL open source
65 * license provided above.
67 * The ECDH and ECDSA speed test software is originally written by
68 * Sumit Gupta of Sun Microsystems Laboratories.
72 /* most of this code has been pilfered from my libdes speed.c program */
74 #ifndef OPENSSL_NO_SPEED
78 #define RSA_SECONDS 10
79 #define DSA_SECONDS 10
80 #define ECDSA_SECONDS 10
81 #define ECDH_SECONDS 10
83 /* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
84 /* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
87 #define PROG speed_main
95 #ifdef OPENSSL_NO_STDIO
98 #include <openssl/crypto.h>
99 #include <openssl/rand.h>
100 #include <openssl/err.h>
101 #include <openssl/evp.h>
102 #include <openssl/objects.h>
103 #if !defined(OPENSSL_SYS_MSDOS)
104 #include OPENSSL_UNISTD
107 #ifndef OPENSSL_SYS_NETWARE
111 #if defined(_WIN32) || defined(__CYGWIN__)
113 # if defined(__CYGWIN__) && !defined(_WIN32)
114 /* <windows.h> should define _WIN32, which normally is mutually
115 * exclusive with __CYGWIN__, but if it didn't... */
117 /* this is done because Cygwin alarm() fails sometimes. */
121 #include <openssl/bn.h>
122 #ifndef OPENSSL_NO_DES
123 #include <openssl/des.h>
125 #ifndef OPENSSL_NO_AES
126 #include <openssl/aes.h>
128 #ifndef OPENSSL_NO_CAMELLIA
129 #include <openssl/camellia.h>
131 #ifndef OPENSSL_NO_MD2
132 #include <openssl/md2.h>
134 #ifndef OPENSSL_NO_MDC2
135 #include <openssl/mdc2.h>
137 #ifndef OPENSSL_NO_MD4
138 #include <openssl/md4.h>
140 #ifndef OPENSSL_NO_MD5
141 #include <openssl/md5.h>
143 #ifndef OPENSSL_NO_HMAC
144 #include <openssl/hmac.h>
146 #include <openssl/evp.h>
147 #ifndef OPENSSL_NO_SHA
148 #include <openssl/sha.h>
150 #ifndef OPENSSL_NO_RIPEMD
151 #include <openssl/ripemd.h>
153 #ifndef OPENSSL_NO_WHIRLPOOL
154 #include <openssl/whrlpool.h>
156 #ifndef OPENSSL_NO_RC4
157 #include <openssl/rc4.h>
159 #ifndef OPENSSL_NO_RC5
160 #include <openssl/rc5.h>
162 #ifndef OPENSSL_NO_RC2
163 #include <openssl/rc2.h>
165 #ifndef OPENSSL_NO_IDEA
166 #include <openssl/idea.h>
168 #ifndef OPENSSL_NO_SEED
169 #include <openssl/seed.h>
171 #ifndef OPENSSL_NO_BF
172 #include <openssl/blowfish.h>
174 #ifndef OPENSSL_NO_CAST
175 #include <openssl/cast.h>
177 #ifndef OPENSSL_NO_RSA
178 #include <openssl/rsa.h>
179 #include "./testrsa.h"
181 #include <openssl/x509.h>
182 #ifndef OPENSSL_NO_DSA
183 #include <openssl/dsa.h>
184 #include "./testdsa.h"
186 #ifndef OPENSSL_NO_ECDSA
187 #include <openssl/ecdsa.h>
189 #ifndef OPENSSL_NO_ECDH
190 #include <openssl/ecdh.h>
192 #include <openssl/modes.h>
195 #ifdef OPENSSL_DOING_MAKEDEPEND
196 #undef AES_set_encrypt_key
197 #undef AES_set_decrypt_key
198 #undef DES_set_key_unchecked
200 #define BF_set_key private_BF_set_key
201 #define CAST_set_key private_CAST_set_key
202 #define idea_set_encrypt_key private_idea_set_encrypt_key
203 #define SEED_set_key private_SEED_set_key
204 #define RC2_set_key private_RC2_set_key
205 #define RC4_set_key private_RC4_set_key
206 #define DES_set_key_unchecked private_DES_set_key_unchecked
207 #define AES_set_encrypt_key private_AES_set_encrypt_key
208 #define AES_set_decrypt_key private_AES_set_decrypt_key
209 #define Camellia_set_key private_Camellia_set_key
213 # if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_NETWARE)
227 #define BUFSIZE ((long)1024*8+64)
231 static int usertime=1;
233 static double Time_F(int s);
234 static void print_message(const char *s,long num,int length);
235 static void pkey_print_message(const char *str, const char *str2,
236 long num, int bits, int sec);
237 static void print_result(int alg,int run_no,int count,double time_used);
239 static int do_multi(int multi);
248 #define MAX_ECDH_SIZE 256
250 static const char *names[ALGOR_NUM]={
251 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
252 "des cbc","des ede3","idea cbc","seed cbc",
253 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
254 "aes-128 cbc","aes-192 cbc","aes-256 cbc",
255 "camellia-128 cbc","camellia-192 cbc","camellia-256 cbc",
256 "evp","sha256","sha512","whirlpool",
257 "aes-128 ige","aes-192 ige","aes-256 ige","ghash",
258 "aes-128 gcm", "aes-256 gcm", "chacha20 poly1305",
260 static double results[ALGOR_NUM][SIZE_NUM];
261 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
262 #ifndef OPENSSL_NO_RSA
263 static double rsa_results[RSA_NUM][2];
265 #ifndef OPENSSL_NO_DSA
266 static double dsa_results[DSA_NUM][2];
268 #ifndef OPENSSL_NO_ECDSA
269 static double ecdsa_results[EC_NUM][2];
271 #ifndef OPENSSL_NO_ECDH
272 static double ecdh_results[EC_NUM][1];
275 #if defined(OPENSSL_NO_DSA) && !(defined(OPENSSL_NO_ECDSA) && defined(OPENSSL_NO_ECDH))
276 static const char rnd_seed[] = "string to make the random number generator think it has entropy";
277 static int rnd_fake = 0;
281 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
282 #define SIGRETTYPE void
284 #define SIGRETTYPE int
287 static SIGRETTYPE sig_done(int sig);
288 static SIGRETTYPE sig_done(int sig)
290 signal(SIGALRM,sig_done);
303 #if !defined(SIGALRM)
306 static unsigned int lapse,schlock;
307 static void alarm_win32(unsigned int secs) { lapse = secs*1000; }
308 #define alarm alarm_win32
310 static DWORD WINAPI sleepy(VOID *arg)
318 static double Time_F(int s)
324 thr = CreateThread(NULL,4096,sleepy,NULL,0,NULL);
327 DWORD ret=GetLastError();
328 BIO_printf(bio_err,"unable to CreateThread (%d)",ret);
331 CloseHandle(thr); /* detach the thread */
332 while (!schlock) Sleep(0); /* scheduler spinlock */
335 return app_tminterval(s,usertime);
339 static double Time_F(int s)
341 return app_tminterval(s,usertime);
346 #ifndef OPENSSL_NO_ECDH
347 static const int KDF1_SHA1_len = 20;
348 static void *KDF1_SHA1(const void *in, size_t inlen, void *out, size_t *outlen)
350 #ifndef OPENSSL_NO_SHA
351 if (*outlen < SHA_DIGEST_LENGTH)
354 *outlen = SHA_DIGEST_LENGTH;
355 return SHA1(in, inlen, out);
358 #endif /* OPENSSL_NO_SHA */
360 #endif /* OPENSSL_NO_ECDH */
363 int MAIN(int, char **);
365 int MAIN(int argc, char **argv)
367 unsigned char *buf=NULL,*buf2=NULL;
369 long count=0,save_count=0;
371 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
374 #ifndef OPENSSL_NO_RSA
377 unsigned char md[EVP_MAX_MD_SIZE];
378 #ifndef OPENSSL_NO_MD2
379 unsigned char md2[MD2_DIGEST_LENGTH];
381 #ifndef OPENSSL_NO_MDC2
382 unsigned char mdc2[MDC2_DIGEST_LENGTH];
384 #ifndef OPENSSL_NO_MD4
385 unsigned char md4[MD4_DIGEST_LENGTH];
387 #ifndef OPENSSL_NO_MD5
388 unsigned char md5[MD5_DIGEST_LENGTH];
389 unsigned char hmac[MD5_DIGEST_LENGTH];
391 #ifndef OPENSSL_NO_SHA
392 unsigned char sha[SHA_DIGEST_LENGTH];
393 #ifndef OPENSSL_NO_SHA256
394 unsigned char sha256[SHA256_DIGEST_LENGTH];
396 #ifndef OPENSSL_NO_SHA512
397 unsigned char sha512[SHA512_DIGEST_LENGTH];
400 #ifndef OPENSSL_NO_WHIRLPOOL
401 unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
403 #ifndef OPENSSL_NO_RIPEMD
404 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
406 #ifndef OPENSSL_NO_RC4
409 #ifndef OPENSSL_NO_RC5
412 #ifndef OPENSSL_NO_RC2
415 #ifndef OPENSSL_NO_IDEA
416 IDEA_KEY_SCHEDULE idea_ks;
418 #ifndef OPENSSL_NO_SEED
419 SEED_KEY_SCHEDULE seed_ks;
421 #ifndef OPENSSL_NO_BF
424 #ifndef OPENSSL_NO_CAST
427 static const unsigned char key16[16]=
428 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
429 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
430 #ifndef OPENSSL_NO_AES
431 static const unsigned char key24[24]=
432 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
433 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
434 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
435 static const unsigned char key32[32]=
436 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
437 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
438 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
439 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
441 #ifndef OPENSSL_NO_CAMELLIA
442 static const unsigned char ckey24[24]=
443 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
444 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
445 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
446 static const unsigned char ckey32[32]=
447 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
448 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
449 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
450 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
452 #ifndef OPENSSL_NO_AES
453 #define MAX_BLOCK_SIZE 128
455 #define MAX_BLOCK_SIZE 64
457 unsigned char DES_iv[8];
458 unsigned char iv[2*MAX_BLOCK_SIZE/8];
459 #ifndef OPENSSL_NO_DES
460 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
461 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
462 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
463 DES_key_schedule sch;
464 DES_key_schedule sch2;
465 DES_key_schedule sch3;
467 #ifndef OPENSSL_NO_AES
468 AES_KEY aes_ks1, aes_ks2, aes_ks3;
470 #ifndef OPENSSL_NO_CAMELLIA
471 CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3;
483 #define D_CBC_IDEA 10
484 #define D_CBC_SEED 11
488 #define D_CBC_CAST 15
489 #define D_CBC_128_AES 16
490 #define D_CBC_192_AES 17
491 #define D_CBC_256_AES 18
492 #define D_CBC_128_CML 19
493 #define D_CBC_192_CML 20
494 #define D_CBC_256_CML 21
498 #define D_WHIRLPOOL 25
499 #define D_IGE_128_AES 26
500 #define D_IGE_192_AES 27
501 #define D_IGE_256_AES 28
503 #define D_AES_128_GCM 30
504 #define D_AES_256_GCM 31
505 #define D_CHACHA20_POLY1305 32
507 long c[ALGOR_NUM][SIZE_NUM];
533 #ifndef OPENSSL_NO_RSA
534 RSA *rsa_key[RSA_NUM];
535 long rsa_c[RSA_NUM][2];
536 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
537 static unsigned char *rsa_data[RSA_NUM]=
538 {test512,test1024,test2048,test4096};
539 static int rsa_data_length[RSA_NUM]={
540 sizeof(test512),sizeof(test1024),
541 sizeof(test2048),sizeof(test4096)};
543 #ifndef OPENSSL_NO_DSA
544 DSA *dsa_key[DSA_NUM];
545 long dsa_c[DSA_NUM][2];
546 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
548 #ifndef OPENSSL_NO_EC
549 /* We only test over the following curves as they are representative,
550 * To add tests over more curves, simply add the curve NID
551 * and curve name to the following arrays and increase the
552 * EC_NUM value accordingly.
554 static unsigned int test_curves[EC_NUM] =
558 NID_X9_62_prime192v1,
560 NID_X9_62_prime256v1,
575 static const char * test_curves_names[EC_NUM] =
596 static int test_curves_bits[EC_NUM] =
598 160, 192, 224, 256, 384, 521,
599 163, 233, 283, 409, 571,
600 163, 233, 283, 409, 571
605 #ifndef OPENSSL_NO_ECDSA
606 unsigned char ecdsasig[256];
607 unsigned int ecdsasiglen;
608 EC_KEY *ecdsa[EC_NUM];
609 long ecdsa_c[EC_NUM][2];
612 #ifndef OPENSSL_NO_ECDH
613 EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
614 unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
615 int secret_size_a, secret_size_b;
618 long ecdh_c[EC_NUM][2];
621 int rsa_doit[RSA_NUM];
622 int dsa_doit[DSA_NUM];
623 #ifndef OPENSSL_NO_ECDSA
624 int ecdsa_doit[EC_NUM];
626 #ifndef OPENSSL_NO_ECDH
627 int ecdh_doit[EC_NUM];
631 const EVP_CIPHER *evp_cipher=NULL;
632 const EVP_MD *evp_md=NULL;
643 memset(results, 0, sizeof(results));
644 #ifndef OPENSSL_NO_DSA
645 memset(dsa_key,0,sizeof(dsa_key));
647 #ifndef OPENSSL_NO_ECDSA
648 for (i=0; i<EC_NUM; i++) ecdsa[i] = NULL;
650 #ifndef OPENSSL_NO_ECDH
651 for (i=0; i<EC_NUM; i++)
660 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
661 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
663 if (!load_config(bio_err, NULL))
666 #ifndef OPENSSL_NO_RSA
667 memset(rsa_key,0,sizeof(rsa_key));
668 for (i=0; i<RSA_NUM; i++)
672 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
674 BIO_printf(bio_err,"out of memory\n");
677 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
679 BIO_printf(bio_err,"out of memory\n");
683 memset(c,0,sizeof(c));
684 memset(DES_iv,0,sizeof(DES_iv));
685 memset(iv,0,sizeof(iv));
687 for (i=0; i<ALGOR_NUM; i++)
689 for (i=0; i<RSA_NUM; i++)
691 for (i=0; i<DSA_NUM; i++)
693 #ifndef OPENSSL_NO_ECDSA
694 for (i=0; i<EC_NUM; i++)
697 #ifndef OPENSSL_NO_ECDH
698 for (i=0; i<EC_NUM; i++)
708 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
711 j--; /* Otherwise, -elapsed gets confused with
714 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
720 BIO_printf(bio_err,"no EVP given\n");
723 evp_cipher=EVP_get_cipherbyname(*argv);
726 evp_md=EVP_get_digestbyname(*argv);
728 if(!evp_cipher && !evp_md)
730 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
735 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
738 j--; /* Otherwise, -elapsed gets confused with
741 #ifndef OPENSSL_NO_ENGINE
742 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
748 BIO_printf(bio_err,"no engine given\n");
751 setup_engine(bio_err, *argv, 0);
752 /* j will be increased again further down. We just
753 don't want speed to confuse an engine with an
754 algorithm, especially when none is given (which
755 means all of them should be run) */
760 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
766 BIO_printf(bio_err,"no multi count given\n");
772 BIO_printf(bio_err,"bad multi count\n");
775 j--; /* Otherwise, -mr gets confused with
779 else if (argc > 0 && !strcmp(*argv,"-mr"))
782 j--; /* Otherwise, -mr gets confused with
786 #ifndef OPENSSL_NO_MD2
787 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
790 #ifndef OPENSSL_NO_MDC2
791 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
794 #ifndef OPENSSL_NO_MD4
795 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
798 #ifndef OPENSSL_NO_MD5
799 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
802 #ifndef OPENSSL_NO_MD5
803 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
806 #ifndef OPENSSL_NO_SHA
807 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
809 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1,
813 #ifndef OPENSSL_NO_SHA256
814 if (strcmp(*argv,"sha256") == 0) doit[D_SHA256]=1;
817 #ifndef OPENSSL_NO_SHA512
818 if (strcmp(*argv,"sha512") == 0) doit[D_SHA512]=1;
822 #ifndef OPENSSL_NO_WHIRLPOOL
823 if (strcmp(*argv,"whirlpool") == 0) doit[D_WHIRLPOOL]=1;
826 #ifndef OPENSSL_NO_RIPEMD
827 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
829 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
831 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
834 #ifndef OPENSSL_NO_RC4
835 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
838 #ifndef OPENSSL_NO_DES
839 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
840 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
843 #ifndef OPENSSL_NO_AES
844 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
845 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
846 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
847 else if (strcmp(*argv,"aes-128-ige") == 0) doit[D_IGE_128_AES]=1;
848 else if (strcmp(*argv,"aes-192-ige") == 0) doit[D_IGE_192_AES]=1;
849 else if (strcmp(*argv,"aes-256-ige") == 0) doit[D_IGE_256_AES]=1;
852 #ifndef OPENSSL_NO_CAMELLIA
853 if (strcmp(*argv,"camellia-128-cbc") == 0) doit[D_CBC_128_CML]=1;
854 else if (strcmp(*argv,"camellia-192-cbc") == 0) doit[D_CBC_192_CML]=1;
855 else if (strcmp(*argv,"camellia-256-cbc") == 0) doit[D_CBC_256_CML]=1;
858 #ifndef OPENSSL_NO_RSA
859 #if 0 /* was: #ifdef RSAref */
860 if (strcmp(*argv,"rsaref") == 0)
862 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
868 if (strcmp(*argv,"openssl") == 0)
870 RSA_set_default_method(RSA_PKCS1_SSLeay());
875 #endif /* !OPENSSL_NO_RSA */
876 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
877 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
878 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
879 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
880 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
881 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
882 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
884 #ifndef OPENSSL_NO_RC2
885 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
886 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
889 #ifndef OPENSSL_NO_RC5
890 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
891 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
894 #ifndef OPENSSL_NO_IDEA
895 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
896 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
899 #ifndef OPENSSL_NO_SEED
900 if (strcmp(*argv,"seed-cbc") == 0) doit[D_CBC_SEED]=1;
901 else if (strcmp(*argv,"seed") == 0) doit[D_CBC_SEED]=1;
904 #ifndef OPENSSL_NO_BF
905 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
906 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
907 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
910 #ifndef OPENSSL_NO_CAST
911 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
912 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
913 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
916 #ifndef OPENSSL_NO_DES
917 if (strcmp(*argv,"des") == 0)
924 #ifndef OPENSSL_NO_AES
925 if (strcmp(*argv,"aes") == 0)
927 doit[D_CBC_128_AES]=1;
928 doit[D_CBC_192_AES]=1;
929 doit[D_CBC_256_AES]=1;
931 else if (strcmp(*argv,"ghash") == 0)
935 else if (strcmp(*argv,"aes-128-gcm") == 0)
937 doit[D_AES_128_GCM]=1;
939 else if (strcmp(*argv,"aes-256-gcm") == 0)
941 doit[D_AES_256_GCM]=1;
945 #ifndef OPENSSL_NO_CAMELLIA
946 if (strcmp(*argv,"camellia") == 0)
948 doit[D_CBC_128_CML]=1;
949 doit[D_CBC_192_CML]=1;
950 doit[D_CBC_256_CML]=1;
954 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
955 if (strcmp(*argv,"chacha20-poly1305") == 0)
957 doit[D_CHACHA20_POLY1305]=1;
961 #ifndef OPENSSL_NO_RSA
962 if (strcmp(*argv,"rsa") == 0)
964 rsa_doit[R_RSA_512]=1;
965 rsa_doit[R_RSA_1024]=1;
966 rsa_doit[R_RSA_2048]=1;
967 rsa_doit[R_RSA_4096]=1;
971 #ifndef OPENSSL_NO_DSA
972 if (strcmp(*argv,"dsa") == 0)
974 dsa_doit[R_DSA_512]=1;
975 dsa_doit[R_DSA_1024]=1;
976 dsa_doit[R_DSA_2048]=1;
980 #ifndef OPENSSL_NO_ECDSA
981 if (strcmp(*argv,"ecdsap160") == 0) ecdsa_doit[R_EC_P160]=2;
982 else if (strcmp(*argv,"ecdsap192") == 0) ecdsa_doit[R_EC_P192]=2;
983 else if (strcmp(*argv,"ecdsap224") == 0) ecdsa_doit[R_EC_P224]=2;
984 else if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2;
985 else if (strcmp(*argv,"ecdsap384") == 0) ecdsa_doit[R_EC_P384]=2;
986 else if (strcmp(*argv,"ecdsap521") == 0) ecdsa_doit[R_EC_P521]=2;
987 else if (strcmp(*argv,"ecdsak163") == 0) ecdsa_doit[R_EC_K163]=2;
988 else if (strcmp(*argv,"ecdsak233") == 0) ecdsa_doit[R_EC_K233]=2;
989 else if (strcmp(*argv,"ecdsak283") == 0) ecdsa_doit[R_EC_K283]=2;
990 else if (strcmp(*argv,"ecdsak409") == 0) ecdsa_doit[R_EC_K409]=2;
991 else if (strcmp(*argv,"ecdsak571") == 0) ecdsa_doit[R_EC_K571]=2;
992 else if (strcmp(*argv,"ecdsab163") == 0) ecdsa_doit[R_EC_B163]=2;
993 else if (strcmp(*argv,"ecdsab233") == 0) ecdsa_doit[R_EC_B233]=2;
994 else if (strcmp(*argv,"ecdsab283") == 0) ecdsa_doit[R_EC_B283]=2;
995 else if (strcmp(*argv,"ecdsab409") == 0) ecdsa_doit[R_EC_B409]=2;
996 else if (strcmp(*argv,"ecdsab571") == 0) ecdsa_doit[R_EC_B571]=2;
997 else if (strcmp(*argv,"ecdsa") == 0)
999 for (i=0; i < EC_NUM; i++)
1004 #ifndef OPENSSL_NO_ECDH
1005 if (strcmp(*argv,"ecdhp160") == 0) ecdh_doit[R_EC_P160]=2;
1006 else if (strcmp(*argv,"ecdhp192") == 0) ecdh_doit[R_EC_P192]=2;
1007 else if (strcmp(*argv,"ecdhp224") == 0) ecdh_doit[R_EC_P224]=2;
1008 else if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2;
1009 else if (strcmp(*argv,"ecdhp384") == 0) ecdh_doit[R_EC_P384]=2;
1010 else if (strcmp(*argv,"ecdhp521") == 0) ecdh_doit[R_EC_P521]=2;
1011 else if (strcmp(*argv,"ecdhk163") == 0) ecdh_doit[R_EC_K163]=2;
1012 else if (strcmp(*argv,"ecdhk233") == 0) ecdh_doit[R_EC_K233]=2;
1013 else if (strcmp(*argv,"ecdhk283") == 0) ecdh_doit[R_EC_K283]=2;
1014 else if (strcmp(*argv,"ecdhk409") == 0) ecdh_doit[R_EC_K409]=2;
1015 else if (strcmp(*argv,"ecdhk571") == 0) ecdh_doit[R_EC_K571]=2;
1016 else if (strcmp(*argv,"ecdhb163") == 0) ecdh_doit[R_EC_B163]=2;
1017 else if (strcmp(*argv,"ecdhb233") == 0) ecdh_doit[R_EC_B233]=2;
1018 else if (strcmp(*argv,"ecdhb283") == 0) ecdh_doit[R_EC_B283]=2;
1019 else if (strcmp(*argv,"ecdhb409") == 0) ecdh_doit[R_EC_B409]=2;
1020 else if (strcmp(*argv,"ecdhb571") == 0) ecdh_doit[R_EC_B571]=2;
1021 else if (strcmp(*argv,"ecdh") == 0)
1023 for (i=0; i < EC_NUM; i++)
1029 BIO_printf(bio_err,"Error: bad option or value\n");
1030 BIO_printf(bio_err,"\n");
1031 BIO_printf(bio_err,"Available values:\n");
1032 #ifndef OPENSSL_NO_MD2
1033 BIO_printf(bio_err,"md2 ");
1035 #ifndef OPENSSL_NO_MDC2
1036 BIO_printf(bio_err,"mdc2 ");
1038 #ifndef OPENSSL_NO_MD4
1039 BIO_printf(bio_err,"md4 ");
1041 #ifndef OPENSSL_NO_MD5
1042 BIO_printf(bio_err,"md5 ");
1043 #ifndef OPENSSL_NO_HMAC
1044 BIO_printf(bio_err,"hmac ");
1047 #ifndef OPENSSL_NO_SHA1
1048 BIO_printf(bio_err,"sha1 ");
1050 #ifndef OPENSSL_NO_SHA256
1051 BIO_printf(bio_err,"sha256 ");
1053 #ifndef OPENSSL_NO_SHA512
1054 BIO_printf(bio_err,"sha512 ");
1056 #ifndef OPENSSL_NO_WHIRLPOOL
1057 BIO_printf(bio_err,"whirlpool");
1059 #ifndef OPENSSL_NO_RIPEMD160
1060 BIO_printf(bio_err,"rmd160");
1062 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
1063 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
1064 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160) || \
1065 !defined(OPENSSL_NO_WHIRLPOOL)
1066 BIO_printf(bio_err,"\n");
1069 #ifndef OPENSSL_NO_IDEA
1070 BIO_printf(bio_err,"idea-cbc ");
1072 #ifndef OPENSSL_NO_SEED
1073 BIO_printf(bio_err,"seed-cbc ");
1075 #ifndef OPENSSL_NO_RC2
1076 BIO_printf(bio_err,"rc2-cbc ");
1078 #ifndef OPENSSL_NO_RC5
1079 BIO_printf(bio_err,"rc5-cbc ");
1081 #ifndef OPENSSL_NO_BF
1082 BIO_printf(bio_err,"bf-cbc");
1084 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_SEED) || !defined(OPENSSL_NO_RC2) || \
1085 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
1086 BIO_printf(bio_err,"\n");
1088 #ifndef OPENSSL_NO_DES
1089 BIO_printf(bio_err,"des-cbc des-ede3 ");
1091 #ifndef OPENSSL_NO_AES
1092 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
1093 BIO_printf(bio_err,"aes-128-ige aes-192-ige aes-256-ige\n");
1094 BIO_printf(bio_err,"aes-128-gcm aes-256-gcm ");
1096 #ifndef OPENSSL_NO_CAMELLIA
1097 BIO_printf(bio_err,"\n");
1098 BIO_printf(bio_err,"camellia-128-cbc camellia-192-cbc camellia-256-cbc ");
1100 #ifndef OPENSSL_NO_RC4
1101 BIO_printf(bio_err,"rc4");
1103 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
1104 BIO_printf(bio_err," chacha20-poly1305");
1106 BIO_printf(bio_err,"\n");
1108 #ifndef OPENSSL_NO_RSA
1109 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
1112 #ifndef OPENSSL_NO_DSA
1113 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
1115 #ifndef OPENSSL_NO_ECDSA
1116 BIO_printf(bio_err,"ecdsap160 ecdsap192 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
1117 BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n");
1118 BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n");
1119 BIO_printf(bio_err,"ecdsa\n");
1121 #ifndef OPENSSL_NO_ECDH
1122 BIO_printf(bio_err,"ecdhp160 ecdhp192 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n");
1123 BIO_printf(bio_err,"ecdhk163 ecdhk233 ecdhk283 ecdhk409 ecdhk571\n");
1124 BIO_printf(bio_err,"ecdhb163 ecdhb233 ecdhb283 ecdhb409 ecdhb571\n");
1125 BIO_printf(bio_err,"ecdh\n");
1128 #ifndef OPENSSL_NO_IDEA
1129 BIO_printf(bio_err,"idea ");
1131 #ifndef OPENSSL_NO_SEED
1132 BIO_printf(bio_err,"seed ");
1134 #ifndef OPENSSL_NO_RC2
1135 BIO_printf(bio_err,"rc2 ");
1137 #ifndef OPENSSL_NO_DES
1138 BIO_printf(bio_err,"des ");
1140 #ifndef OPENSSL_NO_AES
1141 BIO_printf(bio_err,"aes ");
1143 #ifndef OPENSSL_NO_CAMELLIA
1144 BIO_printf(bio_err,"camellia ");
1146 #ifndef OPENSSL_NO_RSA
1147 BIO_printf(bio_err,"rsa ");
1149 #ifndef OPENSSL_NO_BF
1150 BIO_printf(bio_err,"blowfish");
1152 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_SEED) || \
1153 !defined(OPENSSL_NO_RC2) || !defined(OPENSSL_NO_DES) || \
1154 !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_BF) || \
1155 !defined(OPENSSL_NO_AES) || !defined(OPENSSL_NO_CAMELLIA)
1156 BIO_printf(bio_err,"\n");
1159 BIO_printf(bio_err,"\n");
1160 BIO_printf(bio_err,"Available options:\n");
1161 #if defined(TIMES) || defined(USE_TOD)
1162 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
1164 #ifndef OPENSSL_NO_ENGINE
1165 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
1167 BIO_printf(bio_err,"-evp e use EVP e.\n");
1168 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
1169 BIO_printf(bio_err,"-mr produce machine readable output.\n");
1171 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
1181 if(multi && do_multi(multi))
1187 for (i=0; i<ALGOR_NUM; i++)
1192 for (i=0; i<RSA_NUM; i++)
1194 for (i=0; i<DSA_NUM; i++)
1196 #ifndef OPENSSL_NO_ECDSA
1197 for (i=0; i<EC_NUM; i++)
1200 #ifndef OPENSSL_NO_ECDH
1201 for (i=0; i<EC_NUM; i++)
1205 for (i=0; i<ALGOR_NUM; i++)
1206 if (doit[i]) pr_header++;
1208 if (usertime == 0 && !mr)
1209 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
1211 #ifndef OPENSSL_NO_RSA
1212 for (i=0; i<RSA_NUM; i++)
1214 const unsigned char *p;
1217 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
1218 if (rsa_key[i] == NULL)
1220 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
1226 BIO_printf(bio_err,mr ? "+RK:%d:"
1227 : "Loaded RSA key, %d bit modulus and e= 0x",
1228 BN_num_bits(rsa_key[i]->n));
1229 BN_print(bio_err,rsa_key[i]->e);
1230 BIO_printf(bio_err,"\n");
1236 #ifndef OPENSSL_NO_DSA
1237 dsa_key[0]=get_dsa512();
1238 dsa_key[1]=get_dsa1024();
1239 dsa_key[2]=get_dsa2048();
1242 #ifndef OPENSSL_NO_DES
1243 DES_set_key_unchecked(&key,&sch);
1244 DES_set_key_unchecked(&key2,&sch2);
1245 DES_set_key_unchecked(&key3,&sch3);
1247 #ifndef OPENSSL_NO_AES
1248 AES_set_encrypt_key(key16,128,&aes_ks1);
1249 AES_set_encrypt_key(key24,192,&aes_ks2);
1250 AES_set_encrypt_key(key32,256,&aes_ks3);
1252 #ifndef OPENSSL_NO_CAMELLIA
1253 Camellia_set_key(key16,128,&camellia_ks1);
1254 Camellia_set_key(ckey24,192,&camellia_ks2);
1255 Camellia_set_key(ckey32,256,&camellia_ks3);
1257 #ifndef OPENSSL_NO_IDEA
1258 idea_set_encrypt_key(key16,&idea_ks);
1260 #ifndef OPENSSL_NO_SEED
1261 SEED_set_key(key16,&seed_ks);
1263 #ifndef OPENSSL_NO_RC4
1264 RC4_set_key(&rc4_ks,16,key16);
1266 #ifndef OPENSSL_NO_RC2
1267 RC2_set_key(&rc2_ks,16,key16,128);
1269 #ifndef OPENSSL_NO_RC5
1270 RC5_32_set_key(&rc5_ks,16,key16,12);
1272 #ifndef OPENSSL_NO_BF
1273 BF_set_key(&bf_ks,16,key16);
1275 #ifndef OPENSSL_NO_CAST
1276 CAST_set_key(&cast_ks,16,key16);
1278 #ifndef OPENSSL_NO_RSA
1279 memset(rsa_c,0,sizeof(rsa_c));
1282 #ifndef OPENSSL_NO_DES
1283 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
1289 for (it=count; it; it--)
1290 DES_ecb_encrypt((DES_cblock *)buf,
1296 c[D_MD2][0]=count/10;
1297 c[D_MDC2][0]=count/10;
1302 c[D_RMD160][0]=count;
1303 c[D_RC4][0]=count*5;
1304 c[D_CBC_DES][0]=count;
1305 c[D_EDE3_DES][0]=count/3;
1306 c[D_CBC_IDEA][0]=count;
1307 c[D_CBC_SEED][0]=count;
1308 c[D_CBC_RC2][0]=count;
1309 c[D_CBC_RC5][0]=count;
1310 c[D_CBC_BF][0]=count;
1311 c[D_CBC_CAST][0]=count;
1312 c[D_CBC_128_AES][0]=count;
1313 c[D_CBC_192_AES][0]=count;
1314 c[D_CBC_256_AES][0]=count;
1315 c[D_CBC_128_CML][0]=count;
1316 c[D_CBC_192_CML][0]=count;
1317 c[D_CBC_256_CML][0]=count;
1318 c[D_SHA256][0]=count;
1319 c[D_SHA512][0]=count;
1320 c[D_WHIRLPOOL][0]=count;
1321 c[D_IGE_128_AES][0]=count;
1322 c[D_IGE_192_AES][0]=count;
1323 c[D_IGE_256_AES][0]=count;
1324 c[D_GHASH][0]=count;
1325 c[D_AES_128_GCM][0]=count;
1326 c[D_CHACHA20_POLY1305][0]=count;
1328 for (i=1; i<SIZE_NUM; i++)
1330 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1331 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1332 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1333 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1334 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1335 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1336 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1337 c[D_SHA256][i]=c[D_SHA256][0]*4*lengths[0]/lengths[i];
1338 c[D_SHA512][i]=c[D_SHA512][0]*4*lengths[0]/lengths[i];
1339 c[D_WHIRLPOOL][i]=c[D_WHIRLPOOL][0]*4*lengths[0]/lengths[i];
1341 for (i=1; i<SIZE_NUM; i++)
1345 l0=(long)lengths[i-1];
1346 l1=(long)lengths[i];
1347 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1348 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1349 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1350 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1351 c[D_CBC_SEED][i]=c[D_CBC_SEED][i-1]*l0/l1;
1352 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1353 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1354 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1355 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1356 c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
1357 c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
1358 c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
1359 c[D_CBC_128_CML][i]=c[D_CBC_128_CML][i-1]*l0/l1;
1360 c[D_CBC_192_CML][i]=c[D_CBC_192_CML][i-1]*l0/l1;
1361 c[D_CBC_256_CML][i]=c[D_CBC_256_CML][i-1]*l0/l1;
1362 c[D_IGE_128_AES][i]=c[D_IGE_128_AES][i-1]*l0/l1;
1363 c[D_IGE_192_AES][i]=c[D_IGE_192_AES][i-1]*l0/l1;
1364 c[D_IGE_256_AES][i]=c[D_IGE_256_AES][i-1]*l0/l1;
1366 #ifndef OPENSSL_NO_RSA
1367 rsa_c[R_RSA_512][0]=count/2000;
1368 rsa_c[R_RSA_512][1]=count/400;
1369 for (i=1; i<RSA_NUM; i++)
1371 rsa_c[i][0]=rsa_c[i-1][0]/8;
1372 rsa_c[i][1]=rsa_c[i-1][1]/4;
1373 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1377 if (rsa_c[i][0] == 0)
1386 #ifndef OPENSSL_NO_DSA
1387 dsa_c[R_DSA_512][0]=count/1000;
1388 dsa_c[R_DSA_512][1]=count/1000/2;
1389 for (i=1; i<DSA_NUM; i++)
1391 dsa_c[i][0]=dsa_c[i-1][0]/4;
1392 dsa_c[i][1]=dsa_c[i-1][1]/4;
1393 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1406 #ifndef OPENSSL_NO_ECDSA
1407 ecdsa_c[R_EC_P160][0]=count/1000;
1408 ecdsa_c[R_EC_P160][1]=count/1000/2;
1409 for (i=R_EC_P192; i<=R_EC_P521; i++)
1411 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1412 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1413 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1417 if (ecdsa_c[i] == 0)
1424 ecdsa_c[R_EC_K163][0]=count/1000;
1425 ecdsa_c[R_EC_K163][1]=count/1000/2;
1426 for (i=R_EC_K233; i<=R_EC_K571; i++)
1428 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1429 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1430 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1434 if (ecdsa_c[i] == 0)
1441 ecdsa_c[R_EC_B163][0]=count/1000;
1442 ecdsa_c[R_EC_B163][1]=count/1000/2;
1443 for (i=R_EC_B233; i<=R_EC_B571; i++)
1445 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1446 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1447 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1451 if (ecdsa_c[i] == 0)
1460 #ifndef OPENSSL_NO_ECDH
1461 ecdh_c[R_EC_P160][0]=count/1000;
1462 ecdh_c[R_EC_P160][1]=count/1000;
1463 for (i=R_EC_P192; i<=R_EC_P521; i++)
1465 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1466 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1467 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1478 ecdh_c[R_EC_K163][0]=count/1000;
1479 ecdh_c[R_EC_K163][1]=count/1000;
1480 for (i=R_EC_K233; i<=R_EC_K571; i++)
1482 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1483 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1484 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1495 ecdh_c[R_EC_B163][0]=count/1000;
1496 ecdh_c[R_EC_B163][1]=count/1000;
1497 for (i=R_EC_B233; i<=R_EC_B571; i++)
1499 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1500 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1501 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1514 #define COND(d) (count < (d))
1515 #define COUNT(d) (d)
1517 /* not worth fixing */
1518 # error "You cannot disable DES on systems without SIGALRM."
1519 #endif /* OPENSSL_NO_DES */
1521 #define COND(c) (run && count<0x7fffffff)
1522 #define COUNT(d) (count)
1524 signal(SIGALRM,sig_done);
1526 #endif /* SIGALRM */
1528 #ifndef OPENSSL_NO_MD2
1531 for (j=0; j<SIZE_NUM; j++)
1533 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1535 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1536 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1538 print_result(D_MD2,j,count,d);
1542 #ifndef OPENSSL_NO_MDC2
1545 for (j=0; j<SIZE_NUM; j++)
1547 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1549 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1550 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1552 print_result(D_MDC2,j,count,d);
1557 #ifndef OPENSSL_NO_MD4
1560 for (j=0; j<SIZE_NUM; j++)
1562 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1564 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1565 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1567 print_result(D_MD4,j,count,d);
1572 #ifndef OPENSSL_NO_MD5
1575 for (j=0; j<SIZE_NUM; j++)
1577 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1579 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1580 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1582 print_result(D_MD5,j,count,d);
1587 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1592 HMAC_CTX_init(&hctx);
1593 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1594 16,EVP_md5(), NULL);
1596 for (j=0; j<SIZE_NUM; j++)
1598 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1600 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1602 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1603 HMAC_Update(&hctx,buf,lengths[j]);
1604 HMAC_Final(&hctx,&(hmac[0]),NULL);
1607 print_result(D_HMAC,j,count,d);
1609 HMAC_CTX_cleanup(&hctx);
1612 #ifndef OPENSSL_NO_SHA
1615 for (j=0; j<SIZE_NUM; j++)
1617 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1619 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1620 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1622 print_result(D_SHA1,j,count,d);
1626 #ifndef OPENSSL_NO_SHA256
1629 for (j=0; j<SIZE_NUM; j++)
1631 print_message(names[D_SHA256],c[D_SHA256][j],lengths[j]);
1633 for (count=0,run=1; COND(c[D_SHA256][j]); count++)
1634 SHA256(buf,lengths[j],sha256);
1636 print_result(D_SHA256,j,count,d);
1641 #ifndef OPENSSL_NO_SHA512
1644 for (j=0; j<SIZE_NUM; j++)
1646 print_message(names[D_SHA512],c[D_SHA512][j],lengths[j]);
1648 for (count=0,run=1; COND(c[D_SHA512][j]); count++)
1649 SHA512(buf,lengths[j],sha512);
1651 print_result(D_SHA512,j,count,d);
1657 #ifndef OPENSSL_NO_WHIRLPOOL
1658 if (doit[D_WHIRLPOOL])
1660 for (j=0; j<SIZE_NUM; j++)
1662 print_message(names[D_WHIRLPOOL],c[D_WHIRLPOOL][j],lengths[j]);
1664 for (count=0,run=1; COND(c[D_WHIRLPOOL][j]); count++)
1665 WHIRLPOOL(buf,lengths[j],whirlpool);
1667 print_result(D_WHIRLPOOL,j,count,d);
1672 #ifndef OPENSSL_NO_RIPEMD
1675 for (j=0; j<SIZE_NUM; j++)
1677 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1679 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1680 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1682 print_result(D_RMD160,j,count,d);
1686 #ifndef OPENSSL_NO_RC4
1689 for (j=0; j<SIZE_NUM; j++)
1691 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1693 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1694 RC4(&rc4_ks,(unsigned int)lengths[j],
1697 print_result(D_RC4,j,count,d);
1701 #ifndef OPENSSL_NO_DES
1702 if (doit[D_CBC_DES])
1704 for (j=0; j<SIZE_NUM; j++)
1706 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1708 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1709 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1710 &DES_iv,DES_ENCRYPT);
1712 print_result(D_CBC_DES,j,count,d);
1716 if (doit[D_EDE3_DES])
1718 for (j=0; j<SIZE_NUM; j++)
1720 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1722 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1723 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1725 &DES_iv,DES_ENCRYPT);
1727 print_result(D_EDE3_DES,j,count,d);
1731 #ifndef OPENSSL_NO_AES
1732 if (doit[D_CBC_128_AES])
1734 for (j=0; j<SIZE_NUM; j++)
1736 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1738 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1739 AES_cbc_encrypt(buf,buf,
1740 (unsigned long)lengths[j],&aes_ks1,
1743 print_result(D_CBC_128_AES,j,count,d);
1746 if (doit[D_CBC_192_AES])
1748 for (j=0; j<SIZE_NUM; j++)
1750 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1752 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1753 AES_cbc_encrypt(buf,buf,
1754 (unsigned long)lengths[j],&aes_ks2,
1757 print_result(D_CBC_192_AES,j,count,d);
1760 if (doit[D_CBC_256_AES])
1762 for (j=0; j<SIZE_NUM; j++)
1764 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1766 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1767 AES_cbc_encrypt(buf,buf,
1768 (unsigned long)lengths[j],&aes_ks3,
1771 print_result(D_CBC_256_AES,j,count,d);
1775 if (doit[D_IGE_128_AES])
1777 for (j=0; j<SIZE_NUM; j++)
1779 print_message(names[D_IGE_128_AES],c[D_IGE_128_AES][j],lengths[j]);
1781 for (count=0,run=1; COND(c[D_IGE_128_AES][j]); count++)
1782 AES_ige_encrypt(buf,buf2,
1783 (unsigned long)lengths[j],&aes_ks1,
1786 print_result(D_IGE_128_AES,j,count,d);
1789 if (doit[D_IGE_192_AES])
1791 for (j=0; j<SIZE_NUM; j++)
1793 print_message(names[D_IGE_192_AES],c[D_IGE_192_AES][j],lengths[j]);
1795 for (count=0,run=1; COND(c[D_IGE_192_AES][j]); count++)
1796 AES_ige_encrypt(buf,buf2,
1797 (unsigned long)lengths[j],&aes_ks2,
1800 print_result(D_IGE_192_AES,j,count,d);
1803 if (doit[D_IGE_256_AES])
1805 for (j=0; j<SIZE_NUM; j++)
1807 print_message(names[D_IGE_256_AES],c[D_IGE_256_AES][j],lengths[j]);
1809 for (count=0,run=1; COND(c[D_IGE_256_AES][j]); count++)
1810 AES_ige_encrypt(buf,buf2,
1811 (unsigned long)lengths[j],&aes_ks3,
1814 print_result(D_IGE_256_AES,j,count,d);
1819 GCM128_CONTEXT *ctx = CRYPTO_gcm128_new(&aes_ks1,(block128_f)AES_encrypt);
1820 CRYPTO_gcm128_setiv (ctx,(unsigned char *)"0123456789ab",12);
1822 for (j=0; j<SIZE_NUM; j++)
1824 print_message(names[D_GHASH],c[D_GHASH][j],lengths[j]);
1826 for (count=0,run=1; COND(c[D_GHASH][j]); count++)
1827 CRYPTO_gcm128_aad(ctx,buf,lengths[j]);
1829 print_result(D_GHASH,j,count,d);
1831 CRYPTO_gcm128_release(ctx);
1834 if (doit[D_AES_128_GCM])
1836 const EVP_AEAD *aead = EVP_aead_aes_128_gcm();
1837 static const unsigned char nonce[32] = {0};
1841 EVP_AEAD_CTX_init(&ctx, aead, key32, EVP_AEAD_key_length(aead),
1842 EVP_AEAD_DEFAULT_TAG_LENGTH, NULL);
1843 nonce_len = EVP_AEAD_nonce_length(aead);
1845 for (j=0; j<SIZE_NUM; j++)
1847 print_message(names[D_AES_128_GCM], c[D_AES_128_GCM][j],
1850 for (count=0,run=1; COND(c[D_AES_128_GCM][j]); count++)
1851 EVP_AEAD_CTX_seal(&ctx, buf, BUFSIZE, nonce,
1852 nonce_len, buf, lengths[j],
1855 print_result(D_AES_128_GCM,j,count,d);
1857 EVP_AEAD_CTX_cleanup(&ctx);
1860 if (doit[D_AES_256_GCM])
1862 const EVP_AEAD *aead = EVP_aead_aes_256_gcm();
1863 static const unsigned char nonce[32] = {0};
1867 EVP_AEAD_CTX_init(&ctx, aead, key32, EVP_AEAD_key_length(aead),
1868 EVP_AEAD_DEFAULT_TAG_LENGTH, NULL);
1869 nonce_len = EVP_AEAD_nonce_length(aead);
1871 for (j=0; j<SIZE_NUM; j++)
1873 print_message(names[D_AES_256_GCM], c[D_AES_256_GCM][j],
1876 for (count=0,run=1; COND(c[D_AES_256_GCM][j]); count++)
1877 EVP_AEAD_CTX_seal(&ctx, buf, BUFSIZE, nonce,
1878 nonce_len, buf, lengths[j],
1881 print_result(D_AES_256_GCM,j,count,d);
1883 EVP_AEAD_CTX_cleanup(&ctx);
1887 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
1888 if (doit[D_CHACHA20_POLY1305])
1890 const EVP_AEAD *aead = EVP_aead_chacha20_poly1305();
1891 static const unsigned char nonce[32] = {0};
1895 EVP_AEAD_CTX_init(&ctx, aead, key32, EVP_AEAD_key_length(aead),
1896 EVP_AEAD_DEFAULT_TAG_LENGTH, NULL);
1897 nonce_len = EVP_AEAD_nonce_length(aead);
1899 for (j=0; j<SIZE_NUM; j++)
1901 print_message(names[D_CHACHA20_POLY1305],
1902 c[D_CHACHA20_POLY1305][j], lengths[j]);
1904 for (count=0,run=1; COND(c[D_CHACHA20_POLY1305][j]);
1906 EVP_AEAD_CTX_seal(&ctx, buf, BUFSIZE, nonce,
1907 nonce_len, buf, lengths[j],
1910 print_result(D_CHACHA20_POLY1305,j,count,d);
1912 EVP_AEAD_CTX_cleanup(&ctx);
1916 #ifndef OPENSSL_NO_CAMELLIA
1917 if (doit[D_CBC_128_CML])
1919 for (j=0; j<SIZE_NUM; j++)
1921 print_message(names[D_CBC_128_CML],c[D_CBC_128_CML][j],lengths[j]);
1923 for (count=0,run=1; COND(c[D_CBC_128_CML][j]); count++)
1924 Camellia_cbc_encrypt(buf,buf,
1925 (unsigned long)lengths[j],&camellia_ks1,
1926 iv,CAMELLIA_ENCRYPT);
1928 print_result(D_CBC_128_CML,j,count,d);
1931 if (doit[D_CBC_192_CML])
1933 for (j=0; j<SIZE_NUM; j++)
1935 print_message(names[D_CBC_192_CML],c[D_CBC_192_CML][j],lengths[j]);
1937 for (count=0,run=1; COND(c[D_CBC_192_CML][j]); count++)
1938 Camellia_cbc_encrypt(buf,buf,
1939 (unsigned long)lengths[j],&camellia_ks2,
1940 iv,CAMELLIA_ENCRYPT);
1942 print_result(D_CBC_192_CML,j,count,d);
1945 if (doit[D_CBC_256_CML])
1947 for (j=0; j<SIZE_NUM; j++)
1949 print_message(names[D_CBC_256_CML],c[D_CBC_256_CML][j],lengths[j]);
1951 for (count=0,run=1; COND(c[D_CBC_256_CML][j]); count++)
1952 Camellia_cbc_encrypt(buf,buf,
1953 (unsigned long)lengths[j],&camellia_ks3,
1954 iv,CAMELLIA_ENCRYPT);
1956 print_result(D_CBC_256_CML,j,count,d);
1961 #ifndef OPENSSL_NO_IDEA
1962 if (doit[D_CBC_IDEA])
1964 for (j=0; j<SIZE_NUM; j++)
1966 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1968 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1969 idea_cbc_encrypt(buf,buf,
1970 (unsigned long)lengths[j],&idea_ks,
1973 print_result(D_CBC_IDEA,j,count,d);
1977 #ifndef OPENSSL_NO_SEED
1978 if (doit[D_CBC_SEED])
1980 for (j=0; j<SIZE_NUM; j++)
1982 print_message(names[D_CBC_SEED],c[D_CBC_SEED][j],lengths[j]);
1984 for (count=0,run=1; COND(c[D_CBC_SEED][j]); count++)
1985 SEED_cbc_encrypt(buf,buf,
1986 (unsigned long)lengths[j],&seed_ks,iv,1);
1988 print_result(D_CBC_SEED,j,count,d);
1992 #ifndef OPENSSL_NO_RC2
1993 if (doit[D_CBC_RC2])
1995 for (j=0; j<SIZE_NUM; j++)
1997 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1999 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
2000 RC2_cbc_encrypt(buf,buf,
2001 (unsigned long)lengths[j],&rc2_ks,
2004 print_result(D_CBC_RC2,j,count,d);
2008 #ifndef OPENSSL_NO_RC5
2009 if (doit[D_CBC_RC5])
2011 for (j=0; j<SIZE_NUM; j++)
2013 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
2015 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
2016 RC5_32_cbc_encrypt(buf,buf,
2017 (unsigned long)lengths[j],&rc5_ks,
2020 print_result(D_CBC_RC5,j,count,d);
2024 #ifndef OPENSSL_NO_BF
2027 for (j=0; j<SIZE_NUM; j++)
2029 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
2031 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
2032 BF_cbc_encrypt(buf,buf,
2033 (unsigned long)lengths[j],&bf_ks,
2036 print_result(D_CBC_BF,j,count,d);
2040 #ifndef OPENSSL_NO_CAST
2041 if (doit[D_CBC_CAST])
2043 for (j=0; j<SIZE_NUM; j++)
2045 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
2047 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
2048 CAST_cbc_encrypt(buf,buf,
2049 (unsigned long)lengths[j],&cast_ks,
2052 print_result(D_CBC_CAST,j,count,d);
2059 for (j=0; j<SIZE_NUM; j++)
2066 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
2067 /* -O3 -fschedule-insns messes up an
2068 * optimization here! names[D_EVP]
2069 * somehow becomes NULL */
2070 print_message(names[D_EVP],save_count,
2073 EVP_CIPHER_CTX_init(&ctx);
2075 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
2077 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
2078 EVP_CIPHER_CTX_set_padding(&ctx, 0);
2082 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
2083 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
2085 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
2086 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
2088 EVP_DecryptFinal_ex(&ctx,buf,&outl);
2090 EVP_EncryptFinal_ex(&ctx,buf,&outl);
2092 EVP_CIPHER_CTX_cleanup(&ctx);
2096 names[D_EVP]=OBJ_nid2ln(evp_md->type);
2097 print_message(names[D_EVP],save_count,
2101 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
2102 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
2106 print_result(D_EVP,j,count,d);
2110 RAND_pseudo_bytes(buf,36);
2111 #ifndef OPENSSL_NO_RSA
2112 for (j=0; j<RSA_NUM; j++)
2115 if (!rsa_doit[j]) continue;
2116 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
2119 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
2120 ERR_print_errors(bio_err);
2125 pkey_print_message("private","rsa",
2126 rsa_c[j][0],rsa_bits[j],
2128 /* RSA_blinding_on(rsa_key[j],NULL); */
2130 for (count=0,run=1; COND(rsa_c[j][0]); count++)
2132 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
2133 &rsa_num, rsa_key[j]);
2137 "RSA sign failure\n");
2138 ERR_print_errors(bio_err);
2144 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
2145 : "%ld %d bit private RSA's in %.2fs\n",
2146 count,rsa_bits[j],d);
2147 rsa_results[j][0]=d/(double)count;
2152 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
2155 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
2156 ERR_print_errors(bio_err);
2161 pkey_print_message("public","rsa",
2162 rsa_c[j][1],rsa_bits[j],
2165 for (count=0,run=1; COND(rsa_c[j][1]); count++)
2167 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
2168 rsa_num, rsa_key[j]);
2172 "RSA verify failure\n");
2173 ERR_print_errors(bio_err);
2179 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
2180 : "%ld %d bit public RSA's in %.2fs\n",
2181 count,rsa_bits[j],d);
2182 rsa_results[j][1]=d/(double)count;
2188 /* if longer than 10s, don't do any more */
2189 for (j++; j<RSA_NUM; j++)
2195 RAND_pseudo_bytes(buf,20);
2196 #ifndef OPENSSL_NO_DSA
2197 if (RAND_status() != 1)
2199 RAND_seed(rnd_seed, sizeof rnd_seed);
2202 for (j=0; j<DSA_NUM; j++)
2207 if (!dsa_doit[j]) continue;
2208 /* DSA_generate_key(dsa_key[j]); */
2209 /* DSA_sign_setup(dsa_key[j],NULL); */
2210 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
2214 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
2215 ERR_print_errors(bio_err);
2220 pkey_print_message("sign","dsa",
2221 dsa_c[j][0],dsa_bits[j],
2224 for (count=0,run=1; COND(dsa_c[j][0]); count++)
2226 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
2231 "DSA sign failure\n");
2232 ERR_print_errors(bio_err);
2238 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
2239 : "%ld %d bit DSA signs in %.2fs\n",
2240 count,dsa_bits[j],d);
2241 dsa_results[j][0]=d/(double)count;
2245 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
2249 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
2250 ERR_print_errors(bio_err);
2255 pkey_print_message("verify","dsa",
2256 dsa_c[j][1],dsa_bits[j],
2259 for (count=0,run=1; COND(dsa_c[j][1]); count++)
2261 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
2266 "DSA verify failure\n");
2267 ERR_print_errors(bio_err);
2273 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
2274 : "%ld %d bit DSA verify in %.2fs\n",
2275 count,dsa_bits[j],d);
2276 dsa_results[j][1]=d/(double)count;
2281 /* if longer than 10s, don't do any more */
2282 for (j++; j<DSA_NUM; j++)
2286 if (rnd_fake) RAND_cleanup();
2289 #ifndef OPENSSL_NO_ECDSA
2290 if (RAND_status() != 1)
2292 RAND_seed(rnd_seed, sizeof rnd_seed);
2295 for (j=0; j<EC_NUM; j++)
2299 if (!ecdsa_doit[j]) continue; /* Ignore Curve */
2300 ecdsa[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2301 if (ecdsa[j] == NULL)
2303 BIO_printf(bio_err,"ECDSA failure.\n");
2304 ERR_print_errors(bio_err);
2310 EC_KEY_precompute_mult(ecdsa[j], NULL);
2312 /* Perform ECDSA signature test */
2313 EC_KEY_generate_key(ecdsa[j]);
2314 ret = ECDSA_sign(0, buf, 20, ecdsasig,
2315 &ecdsasiglen, ecdsa[j]);
2318 BIO_printf(bio_err,"ECDSA sign failure. No ECDSA sign will be done.\n");
2319 ERR_print_errors(bio_err);
2324 pkey_print_message("sign","ecdsa",
2326 test_curves_bits[j],
2330 for (count=0,run=1; COND(ecdsa_c[j][0]);
2333 ret=ECDSA_sign(0, buf, 20,
2334 ecdsasig, &ecdsasiglen,
2338 BIO_printf(bio_err, "ECDSA sign failure\n");
2339 ERR_print_errors(bio_err);
2346 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
2347 "%ld %d bit ECDSA signs in %.2fs \n",
2348 count, test_curves_bits[j], d);
2349 ecdsa_results[j][0]=d/(double)count;
2353 /* Perform ECDSA verification test */
2354 ret=ECDSA_verify(0, buf, 20, ecdsasig,
2355 ecdsasiglen, ecdsa[j]);
2358 BIO_printf(bio_err,"ECDSA verify failure. No ECDSA verify will be done.\n");
2359 ERR_print_errors(bio_err);
2364 pkey_print_message("verify","ecdsa",
2366 test_curves_bits[j],
2369 for (count=0,run=1; COND(ecdsa_c[j][1]); count++)
2371 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
2374 BIO_printf(bio_err, "ECDSA verify failure\n");
2375 ERR_print_errors(bio_err);
2381 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
2382 : "%ld %d bit ECDSA verify in %.2fs\n",
2383 count, test_curves_bits[j], d);
2384 ecdsa_results[j][1]=d/(double)count;
2389 /* if longer than 10s, don't do any more */
2390 for (j++; j<EC_NUM; j++)
2395 if (rnd_fake) RAND_cleanup();
2398 #ifndef OPENSSL_NO_ECDH
2399 if (RAND_status() != 1)
2401 RAND_seed(rnd_seed, sizeof rnd_seed);
2404 for (j=0; j<EC_NUM; j++)
2406 if (!ecdh_doit[j]) continue;
2407 ecdh_a[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2408 ecdh_b[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2409 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2411 BIO_printf(bio_err,"ECDH failure.\n");
2412 ERR_print_errors(bio_err);
2417 /* generate two ECDH key pairs */
2418 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2419 !EC_KEY_generate_key(ecdh_b[j]))
2421 BIO_printf(bio_err,"ECDH key generation failure.\n");
2422 ERR_print_errors(bio_err);
2427 /* If field size is not more than 24 octets, then use SHA-1 hash of result;
2428 * otherwise, use result (see section 4.8 of draft-ietf-tls-ecc-03.txt).
2430 int field_size, outlen;
2431 void *(*kdf)(const void *in, size_t inlen, void *out, size_t *xoutlen);
2432 field_size = EC_GROUP_get_degree(EC_KEY_get0_group(ecdh_a[j]));
2433 if (field_size <= 24 * 8)
2435 outlen = KDF1_SHA1_len;
2440 outlen = (field_size+7)/8;
2443 secret_size_a = ECDH_compute_key(secret_a, outlen,
2444 EC_KEY_get0_public_key(ecdh_b[j]),
2446 secret_size_b = ECDH_compute_key(secret_b, outlen,
2447 EC_KEY_get0_public_key(ecdh_a[j]),
2449 if (secret_size_a != secret_size_b)
2454 for (secret_idx = 0;
2455 (secret_idx < secret_size_a)
2456 && (ecdh_checks == 1);
2459 if (secret_a[secret_idx] != secret_b[secret_idx])
2463 if (ecdh_checks == 0)
2465 BIO_printf(bio_err,"ECDH computations don't match.\n");
2466 ERR_print_errors(bio_err);
2470 pkey_print_message("","ecdh",
2472 test_curves_bits[j],
2475 for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2477 ECDH_compute_key(secret_a, outlen,
2478 EC_KEY_get0_public_key(ecdh_b[j]),
2482 BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2483 count, test_curves_bits[j], d);
2484 ecdh_results[j][0]=d/(double)count;
2492 /* if longer than 10s, don't do any more */
2493 for (j++; j<EC_NUM; j++)
2497 if (rnd_fake) RAND_cleanup();
2504 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
2505 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
2507 printf("%s ",BN_options());
2508 #ifndef OPENSSL_NO_MD2
2509 printf("%s ",MD2_options());
2511 #ifndef OPENSSL_NO_RC4
2512 printf("%s ",RC4_options());
2514 #ifndef OPENSSL_NO_DES
2515 printf("%s ",DES_options());
2517 #ifndef OPENSSL_NO_AES
2518 printf("%s ",AES_options());
2520 #ifndef OPENSSL_NO_IDEA
2521 printf("%s ",idea_options());
2523 #ifndef OPENSSL_NO_BF
2524 printf("%s ",BF_options());
2526 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2532 fprintf(stdout,"+H");
2535 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
2536 fprintf(stdout,"type ");
2538 for (j=0; j<SIZE_NUM; j++)
2539 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
2540 fprintf(stdout,"\n");
2543 for (k=0; k<ALGOR_NUM; k++)
2545 if (!doit[k]) continue;
2547 fprintf(stdout,"+F:%d:%s",k,names[k]);
2549 fprintf(stdout,"%-13s",names[k]);
2550 for (j=0; j<SIZE_NUM; j++)
2552 if (results[k][j] > 10000 && !mr)
2553 fprintf(stdout," %11.2fk",results[k][j]/1e3);
2555 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
2557 fprintf(stdout,"\n");
2559 #ifndef OPENSSL_NO_RSA
2561 for (k=0; k<RSA_NUM; k++)
2563 if (!rsa_doit[k]) continue;
2566 printf("%18ssign verify sign/s verify/s\n"," ");
2570 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2571 k,rsa_bits[k],rsa_results[k][0],
2574 fprintf(stdout,"rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2575 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2576 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
2579 #ifndef OPENSSL_NO_DSA
2581 for (k=0; k<DSA_NUM; k++)
2583 if (!dsa_doit[k]) continue;
2586 printf("%18ssign verify sign/s verify/s\n"," ");
2590 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2591 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2593 fprintf(stdout,"dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2594 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2595 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
2598 #ifndef OPENSSL_NO_ECDSA
2600 for (k=0; k<EC_NUM; k++)
2602 if (!ecdsa_doit[k]) continue;
2605 printf("%30ssign verify sign/s verify/s\n"," ");
2610 fprintf(stdout,"+F4:%u:%u:%f:%f\n",
2611 k, test_curves_bits[k],
2612 ecdsa_results[k][0],ecdsa_results[k][1]);
2615 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2616 test_curves_bits[k],
2617 test_curves_names[k],
2618 ecdsa_results[k][0],ecdsa_results[k][1],
2619 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2624 #ifndef OPENSSL_NO_ECDH
2626 for (k=0; k<EC_NUM; k++)
2628 if (!ecdh_doit[k]) continue;
2631 printf("%30sop op/s\n"," ");
2635 fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2636 k, test_curves_bits[k],
2637 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2640 fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2641 test_curves_bits[k],
2642 test_curves_names[k],
2643 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2650 ERR_print_errors(bio_err);
2651 if (buf != NULL) OPENSSL_free(buf);
2652 if (buf2 != NULL) OPENSSL_free(buf2);
2653 #ifndef OPENSSL_NO_RSA
2654 for (i=0; i<RSA_NUM; i++)
2655 if (rsa_key[i] != NULL)
2656 RSA_free(rsa_key[i]);
2658 #ifndef OPENSSL_NO_DSA
2659 for (i=0; i<DSA_NUM; i++)
2660 if (dsa_key[i] != NULL)
2661 DSA_free(dsa_key[i]);
2664 #ifndef OPENSSL_NO_ECDSA
2665 for (i=0; i<EC_NUM; i++)
2666 if (ecdsa[i] != NULL)
2667 EC_KEY_free(ecdsa[i]);
2669 #ifndef OPENSSL_NO_ECDH
2670 for (i=0; i<EC_NUM; i++)
2672 if (ecdh_a[i] != NULL)
2673 EC_KEY_free(ecdh_a[i]);
2674 if (ecdh_b[i] != NULL)
2675 EC_KEY_free(ecdh_b[i]);
2683 static void print_message(const char *s, long num, int length)
2686 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2687 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
2688 (void)BIO_flush(bio_err);
2691 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2692 : "Doing %s %ld times on %d size blocks: ",s,num,length);
2693 (void)BIO_flush(bio_err);
2700 static void pkey_print_message(const char *str, const char *str2, long num,
2704 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2705 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
2706 (void)BIO_flush(bio_err);
2709 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2710 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
2711 (void)BIO_flush(bio_err);
2718 static void print_result(int alg,int run_no,int count,double time_used)
2720 BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n"
2721 : "%d %s's in %.2fs\n",count,names[alg],time_used);
2722 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2726 static char *sstrsep(char **string, const char *delim)
2729 char *token = *string;
2734 memset(isdelim, 0, sizeof isdelim);
2739 isdelim[(unsigned char)(*delim)] = 1;
2743 while (!isdelim[(unsigned char)(**string)])
2757 static int do_multi(int multi)
2762 static char sep[]=":";
2764 fds=malloc(multi*sizeof *fds);
2765 for(n=0 ; n < multi ; ++n)
2769 fprintf(stderr, "pipe failure\n");
2783 if (dup(fd[1]) == -1)
2785 fprintf(stderr, "dup failed\n");
2794 printf("Forked child %d\n",n);
2797 /* for now, assume the pipe is long enough to take all the output */
2798 for(n=0 ; n < multi ; ++n)
2804 f=fdopen(fds[n],"r");
2805 while(fgets(buf,sizeof buf,f))
2812 fprintf(stderr,"Don't understand line '%s' from child %d\n",
2816 printf("Got: %s from %d\n",buf,n);
2817 if(!strncmp(buf,"+F:",3))
2823 alg=atoi(sstrsep(&p,sep));
2825 for(j=0 ; j < SIZE_NUM ; ++j)
2826 results[alg][j]+=atof(sstrsep(&p,sep));
2828 else if(!strncmp(buf,"+F2:",4))
2834 k=atoi(sstrsep(&p,sep));
2837 d=atof(sstrsep(&p,sep));
2839 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2841 rsa_results[k][0]=d;
2843 d=atof(sstrsep(&p,sep));
2845 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2847 rsa_results[k][1]=d;
2849 else if(!strncmp(buf,"+F2:",4))
2855 k=atoi(sstrsep(&p,sep));
2858 d=atof(sstrsep(&p,sep));
2860 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2862 rsa_results[k][0]=d;
2864 d=atof(sstrsep(&p,sep));
2866 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2868 rsa_results[k][1]=d;
2870 #ifndef OPENSSL_NO_DSA
2871 else if(!strncmp(buf,"+F3:",4))
2877 k=atoi(sstrsep(&p,sep));
2880 d=atof(sstrsep(&p,sep));
2882 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2884 dsa_results[k][0]=d;
2886 d=atof(sstrsep(&p,sep));
2888 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2890 dsa_results[k][1]=d;
2893 #ifndef OPENSSL_NO_ECDSA
2894 else if(!strncmp(buf,"+F4:",4))
2900 k=atoi(sstrsep(&p,sep));
2903 d=atof(sstrsep(&p,sep));
2905 ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2907 ecdsa_results[k][0]=d;
2909 d=atof(sstrsep(&p,sep));
2911 ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2913 ecdsa_results[k][1]=d;
2917 #ifndef OPENSSL_NO_ECDH
2918 else if(!strncmp(buf,"+F5:",4))
2924 k=atoi(sstrsep(&p,sep));
2927 d=atof(sstrsep(&p,sep));
2929 ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2931 ecdh_results[k][0]=d;
2936 else if(!strncmp(buf,"+H:",3))
2940 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);