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 PRIME_SECONDS 10
79 #define RSA_SECONDS 10
80 #define DSA_SECONDS 10
81 #define ECDSA_SECONDS 10
82 #define ECDH_SECONDS 10
84 /* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
85 /* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
88 #define PROG speed_main
96 #ifdef OPENSSL_NO_STDIO
99 #include <openssl/crypto.h>
100 #include <openssl/rand.h>
101 #include <openssl/err.h>
102 #include <openssl/evp.h>
103 #include <openssl/objects.h>
104 #if !defined(OPENSSL_SYS_MSDOS)
105 #include OPENSSL_UNISTD
108 #ifndef OPENSSL_SYS_NETWARE
112 #if defined(_WIN32) || defined(__CYGWIN__)
114 # if defined(__CYGWIN__) && !defined(_WIN32)
115 /* <windows.h> should define _WIN32, which normally is mutually
116 * exclusive with __CYGWIN__, but if it didn't... */
118 /* this is done because Cygwin alarm() fails sometimes. */
122 #include <openssl/bn.h>
123 #ifndef OPENSSL_NO_DES
124 #include <openssl/des.h>
126 #ifndef OPENSSL_NO_AES
127 #include <openssl/aes.h>
129 #ifndef OPENSSL_NO_CAMELLIA
130 #include <openssl/camellia.h>
132 #ifndef OPENSSL_NO_MD2
133 #include <openssl/md2.h>
135 #ifndef OPENSSL_NO_MDC2
136 #include <openssl/mdc2.h>
138 #ifndef OPENSSL_NO_MD4
139 #include <openssl/md4.h>
141 #ifndef OPENSSL_NO_MD5
142 #include <openssl/md5.h>
144 #ifndef OPENSSL_NO_HMAC
145 #include <openssl/hmac.h>
147 #include <openssl/evp.h>
148 #ifndef OPENSSL_NO_SHA
149 #include <openssl/sha.h>
151 #ifndef OPENSSL_NO_RIPEMD
152 #include <openssl/ripemd.h>
154 #ifndef OPENSSL_NO_WHIRLPOOL
155 #include <openssl/whrlpool.h>
157 #ifndef OPENSSL_NO_RC4
158 #include <openssl/rc4.h>
160 #ifndef OPENSSL_NO_RC5
161 #include <openssl/rc5.h>
163 #ifndef OPENSSL_NO_RC2
164 #include <openssl/rc2.h>
166 #ifndef OPENSSL_NO_IDEA
167 #include <openssl/idea.h>
169 #ifndef OPENSSL_NO_SEED
170 #include <openssl/seed.h>
172 #ifndef OPENSSL_NO_BF
173 #include <openssl/blowfish.h>
175 #ifndef OPENSSL_NO_CAST
176 #include <openssl/cast.h>
178 #ifndef OPENSSL_NO_RSA
179 #include <openssl/rsa.h>
180 #include "./testrsa.h"
182 #include <openssl/x509.h>
183 #ifndef OPENSSL_NO_DSA
184 #include <openssl/dsa.h>
185 #include "./testdsa.h"
187 #ifndef OPENSSL_NO_ECDSA
188 #include <openssl/ecdsa.h>
190 #ifndef OPENSSL_NO_ECDH
191 #include <openssl/ecdh.h>
193 #include <openssl/modes.h>
195 #include "../crypto/bn/bn_lcl.h"
198 # if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_NETWARE)
212 #define BUFSIZE ((long)1024*8+1)
216 static int usertime=1;
218 static double Time_F(int s);
219 static void print_message(const char *s,long num,int length);
220 static void prime_print_message(const char *s, long num);
221 static void pkey_print_message(const char *str, const char *str2,
222 long num, int bits, int sec);
223 static void print_result(int alg,int run_no,int count,double time_used);
224 static void prime_print_result(int alg, int count, double time_used);
226 static int do_multi(int multi);
236 #define MAX_ECDH_SIZE 256
238 static const char *names[ALGOR_NUM]={
239 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
240 "des cbc","des ede3","idea cbc","seed cbc",
241 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
242 "aes-128 cbc","aes-192 cbc","aes-256 cbc",
243 "camellia-128 cbc","camellia-192 cbc","camellia-256 cbc",
244 "evp","sha256","sha512","whirlpool",
245 "aes-128 ige","aes-192 ige","aes-256 ige","ghash" };
246 static double results[ALGOR_NUM][SIZE_NUM];
247 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
248 static const char *prime_names[PRIME_NUM]={
249 "prime trial division", "prime trial division retry", "prime coprime" };
250 #ifndef OPENSSL_NO_RSA
251 static double rsa_results[RSA_NUM][2];
253 #ifndef OPENSSL_NO_DSA
254 static double dsa_results[DSA_NUM][2];
256 #ifndef OPENSSL_NO_ECDSA
257 static double ecdsa_results[EC_NUM][2];
259 #ifndef OPENSSL_NO_ECDH
260 static double ecdh_results[EC_NUM][1];
263 #if defined(OPENSSL_NO_DSA) && !(defined(OPENSSL_NO_ECDSA) && defined(OPENSSL_NO_ECDH))
264 static const char rnd_seed[] = "string to make the random number generator think it has entropy";
265 static int rnd_fake = 0;
269 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
270 #define SIGRETTYPE void
272 #define SIGRETTYPE int
275 static SIGRETTYPE sig_done(int sig);
276 static SIGRETTYPE sig_done(int sig)
278 signal(SIGALRM,sig_done);
291 #if !defined(SIGALRM)
294 static unsigned int lapse,schlock;
295 static void alarm_win32(unsigned int secs) { lapse = secs*1000; }
296 #define alarm alarm_win32
298 static DWORD WINAPI sleepy(VOID *arg)
306 static double Time_F(int s)
314 thr = CreateThread(NULL,4096,sleepy,NULL,0,NULL);
317 DWORD ret=GetLastError();
318 BIO_printf(bio_err,"unable to CreateThread (%d)",ret);
321 while (!schlock) Sleep(0); /* scheduler spinlock */
322 ret = app_tminterval(s,usertime);
326 ret = app_tminterval(s,usertime);
327 if (run) TerminateThread(thr,0);
335 static double Time_F(int s)
337 double ret = app_tminterval(s,usertime);
338 if (s == STOP) alarm(0);
344 #ifndef OPENSSL_NO_ECDH
345 static const int KDF1_SHA1_len = 20;
346 static void *KDF1_SHA1(const void *in, size_t inlen, void *out, size_t *outlen)
348 #ifndef OPENSSL_NO_SHA
349 if (*outlen < SHA_DIGEST_LENGTH)
352 *outlen = SHA_DIGEST_LENGTH;
353 return SHA1(in, inlen, out);
356 #endif /* OPENSSL_NO_SHA */
358 #endif /* OPENSSL_NO_ECDH */
361 int MAIN(int, char **);
363 int MAIN(int argc, char **argv)
365 unsigned char *buf=NULL,*buf2=NULL;
367 long count=0,save_count=0;
369 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
372 #ifndef OPENSSL_NO_RSA
375 unsigned char md[EVP_MAX_MD_SIZE];
376 #ifndef OPENSSL_NO_MD2
377 unsigned char md2[MD2_DIGEST_LENGTH];
379 #ifndef OPENSSL_NO_MDC2
380 unsigned char mdc2[MDC2_DIGEST_LENGTH];
382 #ifndef OPENSSL_NO_MD4
383 unsigned char md4[MD4_DIGEST_LENGTH];
385 #ifndef OPENSSL_NO_MD5
386 unsigned char md5[MD5_DIGEST_LENGTH];
387 unsigned char hmac[MD5_DIGEST_LENGTH];
389 #ifndef OPENSSL_NO_SHA
390 unsigned char sha[SHA_DIGEST_LENGTH];
391 #ifndef OPENSSL_NO_SHA256
392 unsigned char sha256[SHA256_DIGEST_LENGTH];
394 #ifndef OPENSSL_NO_SHA512
395 unsigned char sha512[SHA512_DIGEST_LENGTH];
398 #ifndef OPENSSL_NO_WHIRLPOOL
399 unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
401 #ifndef OPENSSL_NO_RIPEMD
402 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
404 #ifndef OPENSSL_NO_RC4
407 #ifndef OPENSSL_NO_RC5
410 #ifndef OPENSSL_NO_RC2
413 #ifndef OPENSSL_NO_IDEA
414 IDEA_KEY_SCHEDULE idea_ks;
416 #ifndef OPENSSL_NO_SEED
417 SEED_KEY_SCHEDULE seed_ks;
419 #ifndef OPENSSL_NO_BF
422 #ifndef OPENSSL_NO_CAST
425 static const unsigned char key16[16]=
426 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
427 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
428 #ifndef OPENSSL_NO_AES
429 static const unsigned char key24[24]=
430 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
431 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
432 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
433 static const unsigned char key32[32]=
434 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
435 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
436 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
437 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
439 #ifndef OPENSSL_NO_CAMELLIA
440 static const unsigned char ckey24[24]=
441 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
442 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
443 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
444 static const unsigned char ckey32[32]=
445 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
446 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
447 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
448 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
450 #ifndef OPENSSL_NO_AES
451 #define MAX_BLOCK_SIZE 128
453 #define MAX_BLOCK_SIZE 64
455 unsigned char DES_iv[8];
456 unsigned char iv[2*MAX_BLOCK_SIZE/8];
457 #ifndef OPENSSL_NO_DES
458 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
459 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
460 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
461 DES_key_schedule sch;
462 DES_key_schedule sch2;
463 DES_key_schedule sch3;
465 #ifndef OPENSSL_NO_AES
466 AES_KEY aes_ks1, aes_ks2, aes_ks3;
468 #ifndef OPENSSL_NO_CAMELLIA
469 CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3;
481 #define D_CBC_IDEA 10
482 #define D_CBC_SEED 11
486 #define D_CBC_CAST 15
487 #define D_CBC_128_AES 16
488 #define D_CBC_192_AES 17
489 #define D_CBC_256_AES 18
490 #define D_CBC_128_CML 19
491 #define D_CBC_192_CML 20
492 #define D_CBC_256_CML 21
496 #define D_WHIRLPOOL 25
497 #define D_IGE_128_AES 26
498 #define D_IGE_192_AES 27
499 #define D_IGE_256_AES 28
502 long c[ALGOR_NUM][SIZE_NUM];
504 #define D_PRIME_TRIAL_DIVISION 0
505 #define D_PRIME_TRIAL_DIVISION_RETRY 1
506 #define D_PRIME_COPRIME 2
507 long prime_c[PRIME_NUM];
518 #define R_RSA_15360 6
537 #ifndef OPENSSL_NO_RSA
538 RSA *rsa_key[RSA_NUM];
539 long rsa_c[RSA_NUM][2];
540 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,3072,4096,7680,15360};
541 static unsigned char *rsa_data[RSA_NUM]=
542 {test512,test1024,test2048,test3072,test4096,test7680,test15360};
543 static int rsa_data_length[RSA_NUM]={
544 sizeof(test512),sizeof(test1024),
545 sizeof(test2048),sizeof(test3072),
546 sizeof(test4096),sizeof(test7680),
549 #ifndef OPENSSL_NO_DSA
550 DSA *dsa_key[DSA_NUM];
551 long dsa_c[DSA_NUM][2];
552 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
554 #ifndef OPENSSL_NO_EC
555 /* We only test over the following curves as they are representative,
556 * To add tests over more curves, simply add the curve NID
557 * and curve name to the following arrays and increase the
558 * EC_NUM value accordingly.
560 static unsigned int test_curves[EC_NUM] =
564 NID_X9_62_prime192v1,
566 NID_X9_62_prime256v1,
581 static const char * test_curves_names[EC_NUM] =
602 static int test_curves_bits[EC_NUM] =
604 160, 192, 224, 256, 384, 521,
605 163, 233, 283, 409, 571,
606 163, 233, 283, 409, 571
611 #ifndef OPENSSL_NO_ECDSA
612 unsigned char ecdsasig[256];
613 unsigned int ecdsasiglen;
614 EC_KEY *ecdsa[EC_NUM];
615 long ecdsa_c[EC_NUM][2];
618 #ifndef OPENSSL_NO_ECDH
619 EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
620 unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
621 int secret_size_a, secret_size_b;
624 long ecdh_c[EC_NUM][2];
627 int prime_doit[PRIME_NUM];
628 int rsa_doit[RSA_NUM];
629 int dsa_doit[DSA_NUM];
630 #ifndef OPENSSL_NO_ECDSA
631 int ecdsa_doit[EC_NUM];
633 #ifndef OPENSSL_NO_ECDH
634 int ecdh_doit[EC_NUM];
638 const EVP_CIPHER *evp_cipher=NULL;
639 const EVP_MD *evp_md=NULL;
650 memset(results, 0, sizeof(results));
651 #ifndef OPENSSL_NO_DSA
652 memset(dsa_key,0,sizeof(dsa_key));
654 #ifndef OPENSSL_NO_ECDSA
655 for (i=0; i<EC_NUM; i++) ecdsa[i] = NULL;
657 #ifndef OPENSSL_NO_ECDH
658 for (i=0; i<EC_NUM; i++)
667 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
668 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
670 if (!load_config(bio_err, NULL))
673 #ifndef OPENSSL_NO_RSA
674 memset(rsa_key,0,sizeof(rsa_key));
675 for (i=0; i<RSA_NUM; i++)
679 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
681 BIO_printf(bio_err,"out of memory\n");
684 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
686 BIO_printf(bio_err,"out of memory\n");
690 memset(c,0,sizeof(c));
691 memset(DES_iv,0,sizeof(DES_iv));
692 memset(iv,0,sizeof(iv));
694 for (i=0; i<ALGOR_NUM; i++)
696 for (i=0; i<RSA_NUM; i++)
698 for (i=0; i<DSA_NUM; i++)
700 #ifndef OPENSSL_NO_ECDSA
701 for (i=0; i<EC_NUM; i++)
704 #ifndef OPENSSL_NO_ECDH
705 for (i=0; i<EC_NUM; i++)
708 for (i=0; i<PRIME_NUM; i++)
717 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
720 j--; /* Otherwise, -elapsed gets confused with
723 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
729 BIO_printf(bio_err,"no EVP given\n");
732 evp_cipher=EVP_get_cipherbyname(*argv);
735 evp_md=EVP_get_digestbyname(*argv);
737 if(!evp_cipher && !evp_md)
739 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
744 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
747 j--; /* Otherwise, -elapsed gets confused with
750 #ifndef OPENSSL_NO_ENGINE
751 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
757 BIO_printf(bio_err,"no engine given\n");
760 setup_engine(bio_err, *argv, 0);
761 /* j will be increased again further down. We just
762 don't want speed to confuse an engine with an
763 algorithm, especially when none is given (which
764 means all of them should be run) */
769 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
775 BIO_printf(bio_err,"no multi count given\n");
781 BIO_printf(bio_err,"bad multi count\n");
784 j--; /* Otherwise, -mr gets confused with
788 else if (argc > 0 && !strcmp(*argv,"-mr"))
791 j--; /* Otherwise, -mr gets confused with
795 #ifndef OPENSSL_NO_MD2
796 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
799 #ifndef OPENSSL_NO_MDC2
800 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
803 #ifndef OPENSSL_NO_MD4
804 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
807 #ifndef OPENSSL_NO_MD5
808 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
811 #ifndef OPENSSL_NO_MD5
812 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
815 #ifndef OPENSSL_NO_SHA
816 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
818 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1,
822 #ifndef OPENSSL_NO_SHA256
823 if (strcmp(*argv,"sha256") == 0) doit[D_SHA256]=1;
826 #ifndef OPENSSL_NO_SHA512
827 if (strcmp(*argv,"sha512") == 0) doit[D_SHA512]=1;
831 #ifndef OPENSSL_NO_WHIRLPOOL
832 if (strcmp(*argv,"whirlpool") == 0) doit[D_WHIRLPOOL]=1;
835 #ifndef OPENSSL_NO_RIPEMD
836 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
838 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
840 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
843 #ifndef OPENSSL_NO_RC4
844 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
847 #ifndef OPENSSL_NO_DES
848 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
849 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
852 #ifndef OPENSSL_NO_AES
853 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
854 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
855 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
856 else if (strcmp(*argv,"aes-128-ige") == 0) doit[D_IGE_128_AES]=1;
857 else if (strcmp(*argv,"aes-192-ige") == 0) doit[D_IGE_192_AES]=1;
858 else if (strcmp(*argv,"aes-256-ige") == 0) doit[D_IGE_256_AES]=1;
861 #ifndef OPENSSL_NO_CAMELLIA
862 if (strcmp(*argv,"camellia-128-cbc") == 0) doit[D_CBC_128_CML]=1;
863 else if (strcmp(*argv,"camellia-192-cbc") == 0) doit[D_CBC_192_CML]=1;
864 else if (strcmp(*argv,"camellia-256-cbc") == 0) doit[D_CBC_256_CML]=1;
867 #ifndef OPENSSL_NO_RSA
868 #if 0 /* was: #ifdef RSAref */
869 if (strcmp(*argv,"rsaref") == 0)
871 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
877 if (strcmp(*argv,"openssl") == 0)
879 RSA_set_default_method(RSA_PKCS1_SSLeay());
884 #endif /* !OPENSSL_NO_RSA */
885 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
886 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
887 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
888 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
889 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
890 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
891 else if (strcmp(*argv,"rsa3072") == 0) rsa_doit[R_RSA_3072]=2;
892 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
893 else if (strcmp(*argv,"rsa7680") == 0) rsa_doit[R_RSA_7680]=2;
894 else if (strcmp(*argv,"rsa15360") == 0) rsa_doit[R_RSA_15360]=2;
896 #ifndef OPENSSL_NO_RC2
897 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
898 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
901 #ifndef OPENSSL_NO_RC5
902 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
903 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
906 #ifndef OPENSSL_NO_IDEA
907 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
908 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
911 #ifndef OPENSSL_NO_SEED
912 if (strcmp(*argv,"seed-cbc") == 0) doit[D_CBC_SEED]=1;
913 else if (strcmp(*argv,"seed") == 0) doit[D_CBC_SEED]=1;
916 #ifndef OPENSSL_NO_BF
917 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
918 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
919 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
922 #ifndef OPENSSL_NO_CAST
923 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
924 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
925 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
928 #ifndef OPENSSL_NO_DES
929 if (strcmp(*argv,"des") == 0)
936 #ifndef OPENSSL_NO_AES
937 if (strcmp(*argv,"aes") == 0)
939 doit[D_CBC_128_AES]=1;
940 doit[D_CBC_192_AES]=1;
941 doit[D_CBC_256_AES]=1;
943 else if (strcmp(*argv,"ghash") == 0)
949 #ifndef OPENSSL_NO_CAMELLIA
950 if (strcmp(*argv,"camellia") == 0)
952 doit[D_CBC_128_CML]=1;
953 doit[D_CBC_192_CML]=1;
954 doit[D_CBC_256_CML]=1;
958 #ifndef OPENSSL_NO_RSA
959 if (strcmp(*argv,"rsa") == 0)
961 rsa_doit[R_RSA_512]=1;
962 rsa_doit[R_RSA_1024]=1;
963 rsa_doit[R_RSA_2048]=1;
964 rsa_doit[R_RSA_3072]=1;
965 rsa_doit[R_RSA_4096]=1;
966 rsa_doit[R_RSA_7680]=1;
967 rsa_doit[R_RSA_15360]=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++)
1028 if (strcmp(*argv,"prime-trial-division") == 0)
1029 prime_doit[D_PRIME_TRIAL_DIVISION] = 1;
1030 else if (strcmp(*argv,"prime-trial-division-retry") == 0)
1031 prime_doit[D_PRIME_TRIAL_DIVISION_RETRY] = 1;
1032 else if (strcmp(*argv,"prime-coprime") == 0)
1033 prime_doit[D_PRIME_COPRIME] = 1;
1034 else if (strcmp(*argv,"prime") == 0)
1036 for (i=0; i < PRIME_NUM; i++)
1041 BIO_printf(bio_err,"Error: bad option or value\n");
1042 BIO_printf(bio_err,"\n");
1043 BIO_printf(bio_err,"Available values:\n");
1044 #ifndef OPENSSL_NO_MD2
1045 BIO_printf(bio_err,"md2 ");
1047 #ifndef OPENSSL_NO_MDC2
1048 BIO_printf(bio_err,"mdc2 ");
1050 #ifndef OPENSSL_NO_MD4
1051 BIO_printf(bio_err,"md4 ");
1053 #ifndef OPENSSL_NO_MD5
1054 BIO_printf(bio_err,"md5 ");
1055 #ifndef OPENSSL_NO_HMAC
1056 BIO_printf(bio_err,"hmac ");
1059 #ifndef OPENSSL_NO_SHA1
1060 BIO_printf(bio_err,"sha1 ");
1062 #ifndef OPENSSL_NO_SHA256
1063 BIO_printf(bio_err,"sha256 ");
1065 #ifndef OPENSSL_NO_SHA512
1066 BIO_printf(bio_err,"sha512 ");
1068 #ifndef OPENSSL_NO_WHIRLPOOL
1069 BIO_printf(bio_err,"whirlpool");
1071 #ifndef OPENSSL_NO_RIPEMD160
1072 BIO_printf(bio_err,"rmd160");
1074 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
1075 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
1076 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160) || \
1077 !defined(OPENSSL_NO_WHIRLPOOL)
1078 BIO_printf(bio_err,"\n");
1081 #ifndef OPENSSL_NO_IDEA
1082 BIO_printf(bio_err,"idea-cbc ");
1084 #ifndef OPENSSL_NO_SEED
1085 BIO_printf(bio_err,"seed-cbc ");
1087 #ifndef OPENSSL_NO_RC2
1088 BIO_printf(bio_err,"rc2-cbc ");
1090 #ifndef OPENSSL_NO_RC5
1091 BIO_printf(bio_err,"rc5-cbc ");
1093 #ifndef OPENSSL_NO_BF
1094 BIO_printf(bio_err,"bf-cbc");
1096 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_SEED) || !defined(OPENSSL_NO_RC2) || \
1097 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
1098 BIO_printf(bio_err,"\n");
1100 #ifndef OPENSSL_NO_DES
1101 BIO_printf(bio_err,"des-cbc des-ede3 ");
1103 #ifndef OPENSSL_NO_AES
1104 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
1105 BIO_printf(bio_err,"aes-128-ige aes-192-ige aes-256-ige ");
1107 #ifndef OPENSSL_NO_CAMELLIA
1108 BIO_printf(bio_err,"\n");
1109 BIO_printf(bio_err,"camellia-128-cbc camellia-192-cbc camellia-256-cbc ");
1111 #ifndef OPENSSL_NO_RC4
1112 BIO_printf(bio_err,"rc4");
1114 BIO_printf(bio_err,"\n");
1116 #ifndef OPENSSL_NO_RSA
1117 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa3072 rsa4096\n");
1118 BIO_printf(bio_err,"rsa7680 rsa15360\n");
1121 #ifndef OPENSSL_NO_DSA
1122 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
1124 #ifndef OPENSSL_NO_ECDSA
1125 BIO_printf(bio_err,"ecdsap160 ecdsap192 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
1126 BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n");
1127 BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n");
1128 BIO_printf(bio_err,"ecdsa\n");
1130 #ifndef OPENSSL_NO_ECDH
1131 BIO_printf(bio_err,"ecdhp160 ecdhp192 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n");
1132 BIO_printf(bio_err,"ecdhk163 ecdhk233 ecdhk283 ecdhk409 ecdhk571\n");
1133 BIO_printf(bio_err,"ecdhb163 ecdhb233 ecdhb283 ecdhb409 ecdhb571\n");
1134 BIO_printf(bio_err,"ecdh\n");
1137 #ifndef OPENSSL_NO_IDEA
1138 BIO_printf(bio_err,"idea ");
1140 #ifndef OPENSSL_NO_SEED
1141 BIO_printf(bio_err,"seed ");
1143 #ifndef OPENSSL_NO_RC2
1144 BIO_printf(bio_err,"rc2 ");
1146 #ifndef OPENSSL_NO_DES
1147 BIO_printf(bio_err,"des ");
1149 #ifndef OPENSSL_NO_AES
1150 BIO_printf(bio_err,"aes ");
1152 #ifndef OPENSSL_NO_CAMELLIA
1153 BIO_printf(bio_err,"camellia ");
1155 #ifndef OPENSSL_NO_RSA
1156 BIO_printf(bio_err,"rsa ");
1158 #ifndef OPENSSL_NO_BF
1159 BIO_printf(bio_err,"blowfish");
1161 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_SEED) || \
1162 !defined(OPENSSL_NO_RC2) || !defined(OPENSSL_NO_DES) || \
1163 !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_BF) || \
1164 !defined(OPENSSL_NO_AES) || !defined(OPENSSL_NO_CAMELLIA)
1165 BIO_printf(bio_err,"\n");
1167 BIO_printf(bio_err,"prime-trial-division prime-coprime\n");
1169 BIO_printf(bio_err,"\n");
1170 BIO_printf(bio_err,"Available options:\n");
1171 #if defined(TIMES) || defined(USE_TOD)
1172 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
1174 #ifndef OPENSSL_NO_ENGINE
1175 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
1177 BIO_printf(bio_err,"-evp e use EVP e.\n");
1178 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
1179 BIO_printf(bio_err,"-mr produce machine readable output.\n");
1181 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
1191 if(multi && do_multi(multi))
1197 for (i=0; i<ALGOR_NUM; i++)
1202 for (i=0; i<RSA_NUM; i++)
1204 for (i=0; i<DSA_NUM; i++)
1206 #ifndef OPENSSL_NO_ECDSA
1207 for (i=0; i<EC_NUM; i++)
1210 #ifndef OPENSSL_NO_ECDH
1211 for (i=0; i<EC_NUM; i++)
1215 for (i=0; i<ALGOR_NUM; i++)
1216 if (doit[i]) pr_header++;
1218 if (usertime == 0 && !mr)
1219 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
1221 #ifndef OPENSSL_NO_RSA
1222 for (i=0; i<RSA_NUM; i++)
1224 const unsigned char *p;
1227 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
1228 if (rsa_key[i] == NULL)
1230 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
1236 BIO_printf(bio_err,mr ? "+RK:%d:"
1237 : "Loaded RSA key, %d bit modulus and e= 0x",
1238 BN_num_bits(rsa_key[i]->n));
1239 BN_print(bio_err,rsa_key[i]->e);
1240 BIO_printf(bio_err,"\n");
1246 #ifndef OPENSSL_NO_DSA
1247 dsa_key[0]=get_dsa512();
1248 dsa_key[1]=get_dsa1024();
1249 dsa_key[2]=get_dsa2048();
1252 #ifndef OPENSSL_NO_DES
1253 DES_set_key_unchecked(&key,&sch);
1254 DES_set_key_unchecked(&key2,&sch2);
1255 DES_set_key_unchecked(&key3,&sch3);
1257 #ifndef OPENSSL_NO_AES
1258 AES_set_encrypt_key(key16,128,&aes_ks1);
1259 AES_set_encrypt_key(key24,192,&aes_ks2);
1260 AES_set_encrypt_key(key32,256,&aes_ks3);
1262 #ifndef OPENSSL_NO_CAMELLIA
1263 Camellia_set_key(key16,128,&camellia_ks1);
1264 Camellia_set_key(ckey24,192,&camellia_ks2);
1265 Camellia_set_key(ckey32,256,&camellia_ks3);
1267 #ifndef OPENSSL_NO_IDEA
1268 idea_set_encrypt_key(key16,&idea_ks);
1270 #ifndef OPENSSL_NO_SEED
1271 SEED_set_key(key16,&seed_ks);
1273 #ifndef OPENSSL_NO_RC4
1274 RC4_set_key(&rc4_ks,16,key16);
1276 #ifndef OPENSSL_NO_RC2
1277 RC2_set_key(&rc2_ks,16,key16,128);
1279 #ifndef OPENSSL_NO_RC5
1280 RC5_32_set_key(&rc5_ks,16,key16,12);
1282 #ifndef OPENSSL_NO_BF
1283 BF_set_key(&bf_ks,16,key16);
1285 #ifndef OPENSSL_NO_CAST
1286 CAST_set_key(&cast_ks,16,key16);
1288 #ifndef OPENSSL_NO_RSA
1289 memset(rsa_c,0,sizeof(rsa_c));
1292 #ifndef OPENSSL_NO_DES
1293 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
1299 for (it=count; it; it--)
1300 DES_ecb_encrypt((DES_cblock *)buf,
1306 c[D_MD2][0]=count/10;
1307 c[D_MDC2][0]=count/10;
1312 c[D_RMD160][0]=count;
1313 c[D_RC4][0]=count*5;
1314 c[D_CBC_DES][0]=count;
1315 c[D_EDE3_DES][0]=count/3;
1316 c[D_CBC_IDEA][0]=count;
1317 c[D_CBC_SEED][0]=count;
1318 c[D_CBC_RC2][0]=count;
1319 c[D_CBC_RC5][0]=count;
1320 c[D_CBC_BF][0]=count;
1321 c[D_CBC_CAST][0]=count;
1322 c[D_CBC_128_AES][0]=count;
1323 c[D_CBC_192_AES][0]=count;
1324 c[D_CBC_256_AES][0]=count;
1325 c[D_CBC_128_CML][0]=count;
1326 c[D_CBC_192_CML][0]=count;
1327 c[D_CBC_256_CML][0]=count;
1328 c[D_SHA256][0]=count;
1329 c[D_SHA512][0]=count;
1330 c[D_WHIRLPOOL][0]=count;
1331 c[D_IGE_128_AES][0]=count;
1332 c[D_IGE_192_AES][0]=count;
1333 c[D_IGE_256_AES][0]=count;
1334 c[D_GHASH][0]=count;
1336 for (i=1; i<SIZE_NUM; i++)
1340 l0=(long)lengths[0];
1341 l1=(long)lengths[i];
1343 c[D_MD2][i]=c[D_MD2][0]*4*l0/l1;
1344 c[D_MDC2][i]=c[D_MDC2][0]*4*l0/l1;
1345 c[D_MD4][i]=c[D_MD4][0]*4*l0/l1;
1346 c[D_MD5][i]=c[D_MD5][0]*4*l0/l1;
1347 c[D_HMAC][i]=c[D_HMAC][0]*4*l0/l1;
1348 c[D_SHA1][i]=c[D_SHA1][0]*4*l0/l1;
1349 c[D_RMD160][i]=c[D_RMD160][0]*4*l0/l1;
1350 c[D_SHA256][i]=c[D_SHA256][0]*4*l0/l1;
1351 c[D_SHA512][i]=c[D_SHA512][0]*4*l0/l1;
1352 c[D_WHIRLPOOL][i]=c[D_WHIRLPOOL][0]*4*l0/l1;
1354 l0=(long)lengths[i-1];
1356 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1357 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1358 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1359 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1360 c[D_CBC_SEED][i]=c[D_CBC_SEED][i-1]*l0/l1;
1361 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1362 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1363 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1364 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1365 c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
1366 c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
1367 c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
1368 c[D_CBC_128_CML][i]=c[D_CBC_128_CML][i-1]*l0/l1;
1369 c[D_CBC_192_CML][i]=c[D_CBC_192_CML][i-1]*l0/l1;
1370 c[D_CBC_256_CML][i]=c[D_CBC_256_CML][i-1]*l0/l1;
1371 c[D_IGE_128_AES][i]=c[D_IGE_128_AES][i-1]*l0/l1;
1372 c[D_IGE_192_AES][i]=c[D_IGE_192_AES][i-1]*l0/l1;
1373 c[D_IGE_256_AES][i]=c[D_IGE_256_AES][i-1]*l0/l1;
1376 prime_c[D_PRIME_TRIAL_DIVISION]=count;
1377 prime_c[D_PRIME_TRIAL_DIVISION_RETRY]=count;
1378 prime_c[D_PRIME_COPRIME]=count;
1380 #ifndef OPENSSL_NO_RSA
1381 rsa_c[R_RSA_512][0]=count/2000;
1382 rsa_c[R_RSA_512][1]=count/400;
1383 for (i=1; i<RSA_NUM; i++)
1385 rsa_c[i][0]=rsa_c[i-1][0]/8;
1386 rsa_c[i][1]=rsa_c[i-1][1]/4;
1387 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1391 if (rsa_c[i][0] == 0)
1400 #ifndef OPENSSL_NO_DSA
1401 dsa_c[R_DSA_512][0]=count/1000;
1402 dsa_c[R_DSA_512][1]=count/1000/2;
1403 for (i=1; i<DSA_NUM; i++)
1405 dsa_c[i][0]=dsa_c[i-1][0]/4;
1406 dsa_c[i][1]=dsa_c[i-1][1]/4;
1407 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1420 #ifndef OPENSSL_NO_ECDSA
1421 ecdsa_c[R_EC_P160][0]=count/1000;
1422 ecdsa_c[R_EC_P160][1]=count/1000/2;
1423 for (i=R_EC_P192; i<=R_EC_P521; i++)
1425 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1426 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1427 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1431 if (ecdsa_c[i] == 0)
1438 ecdsa_c[R_EC_K163][0]=count/1000;
1439 ecdsa_c[R_EC_K163][1]=count/1000/2;
1440 for (i=R_EC_K233; i<=R_EC_K571; i++)
1442 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1443 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1444 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1448 if (ecdsa_c[i] == 0)
1455 ecdsa_c[R_EC_B163][0]=count/1000;
1456 ecdsa_c[R_EC_B163][1]=count/1000/2;
1457 for (i=R_EC_B233; i<=R_EC_B571; i++)
1459 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1460 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1461 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1465 if (ecdsa_c[i] == 0)
1474 #ifndef OPENSSL_NO_ECDH
1475 ecdh_c[R_EC_P160][0]=count/1000;
1476 ecdh_c[R_EC_P160][1]=count/1000;
1477 for (i=R_EC_P192; i<=R_EC_P521; i++)
1479 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1480 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1481 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1492 ecdh_c[R_EC_K163][0]=count/1000;
1493 ecdh_c[R_EC_K163][1]=count/1000;
1494 for (i=R_EC_K233; i<=R_EC_K571; i++)
1496 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1497 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1498 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1509 ecdh_c[R_EC_B163][0]=count/1000;
1510 ecdh_c[R_EC_B163][1]=count/1000;
1511 for (i=R_EC_B233; i<=R_EC_B571; i++)
1513 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1514 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1515 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1528 #define COND(d) (count < (d))
1529 #define COUNT(d) (d)
1531 /* not worth fixing */
1532 # error "You cannot disable DES on systems without SIGALRM."
1533 #endif /* OPENSSL_NO_DES */
1535 #define COND(c) (run && count<0x7fffffff)
1536 #define COUNT(d) (count)
1538 signal(SIGALRM,sig_done);
1540 #endif /* SIGALRM */
1542 #ifndef OPENSSL_NO_MD2
1545 for (j=0; j<SIZE_NUM; j++)
1547 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1549 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1550 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1552 print_result(D_MD2,j,count,d);
1556 #ifndef OPENSSL_NO_MDC2
1559 for (j=0; j<SIZE_NUM; j++)
1561 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1563 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1564 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1566 print_result(D_MDC2,j,count,d);
1571 #ifndef OPENSSL_NO_MD4
1574 for (j=0; j<SIZE_NUM; j++)
1576 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1578 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1579 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1581 print_result(D_MD4,j,count,d);
1586 #ifndef OPENSSL_NO_MD5
1589 for (j=0; j<SIZE_NUM; j++)
1591 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1593 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1594 MD5(buf,lengths[j],md5);
1596 print_result(D_MD5,j,count,d);
1601 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1606 HMAC_CTX_init(&hctx);
1607 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1608 16,EVP_md5(), NULL);
1610 for (j=0; j<SIZE_NUM; j++)
1612 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1614 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1616 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1617 HMAC_Update(&hctx,buf,lengths[j]);
1618 HMAC_Final(&hctx,&(hmac[0]),NULL);
1621 print_result(D_HMAC,j,count,d);
1623 HMAC_CTX_cleanup(&hctx);
1626 #ifndef OPENSSL_NO_SHA
1629 for (j=0; j<SIZE_NUM; j++)
1631 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1633 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1635 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1637 SHA1(buf,lengths[j],sha);
1640 print_result(D_SHA1,j,count,d);
1644 #ifndef OPENSSL_NO_SHA256
1647 for (j=0; j<SIZE_NUM; j++)
1649 print_message(names[D_SHA256],c[D_SHA256][j],lengths[j]);
1651 for (count=0,run=1; COND(c[D_SHA256][j]); count++)
1652 SHA256(buf,lengths[j],sha256);
1654 print_result(D_SHA256,j,count,d);
1659 #ifndef OPENSSL_NO_SHA512
1662 for (j=0; j<SIZE_NUM; j++)
1664 print_message(names[D_SHA512],c[D_SHA512][j],lengths[j]);
1666 for (count=0,run=1; COND(c[D_SHA512][j]); count++)
1667 SHA512(buf,lengths[j],sha512);
1669 print_result(D_SHA512,j,count,d);
1675 #ifndef OPENSSL_NO_WHIRLPOOL
1676 if (doit[D_WHIRLPOOL])
1678 for (j=0; j<SIZE_NUM; j++)
1680 print_message(names[D_WHIRLPOOL],c[D_WHIRLPOOL][j],lengths[j]);
1682 for (count=0,run=1; COND(c[D_WHIRLPOOL][j]); count++)
1683 WHIRLPOOL(buf,lengths[j],whirlpool);
1685 print_result(D_WHIRLPOOL,j,count,d);
1690 #ifndef OPENSSL_NO_RIPEMD
1693 for (j=0; j<SIZE_NUM; j++)
1695 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1697 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1698 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1700 print_result(D_RMD160,j,count,d);
1704 #ifndef OPENSSL_NO_RC4
1707 for (j=0; j<SIZE_NUM; j++)
1709 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1711 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1712 RC4(&rc4_ks,(unsigned int)lengths[j],
1715 print_result(D_RC4,j,count,d);
1719 #ifndef OPENSSL_NO_DES
1720 if (doit[D_CBC_DES])
1722 for (j=0; j<SIZE_NUM; j++)
1724 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1726 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1727 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1728 &DES_iv,DES_ENCRYPT);
1730 print_result(D_CBC_DES,j,count,d);
1734 if (doit[D_EDE3_DES])
1736 for (j=0; j<SIZE_NUM; j++)
1738 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1740 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1741 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1743 &DES_iv,DES_ENCRYPT);
1745 print_result(D_EDE3_DES,j,count,d);
1749 #ifndef OPENSSL_NO_AES
1750 if (doit[D_CBC_128_AES])
1752 for (j=0; j<SIZE_NUM; j++)
1754 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1756 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1757 AES_cbc_encrypt(buf,buf,
1758 (unsigned long)lengths[j],&aes_ks1,
1761 print_result(D_CBC_128_AES,j,count,d);
1764 if (doit[D_CBC_192_AES])
1766 for (j=0; j<SIZE_NUM; j++)
1768 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1770 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1771 AES_cbc_encrypt(buf,buf,
1772 (unsigned long)lengths[j],&aes_ks2,
1775 print_result(D_CBC_192_AES,j,count,d);
1778 if (doit[D_CBC_256_AES])
1780 for (j=0; j<SIZE_NUM; j++)
1782 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1784 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1785 AES_cbc_encrypt(buf,buf,
1786 (unsigned long)lengths[j],&aes_ks3,
1789 print_result(D_CBC_256_AES,j,count,d);
1793 if (doit[D_IGE_128_AES])
1795 for (j=0; j<SIZE_NUM; j++)
1797 print_message(names[D_IGE_128_AES],c[D_IGE_128_AES][j],lengths[j]);
1799 for (count=0,run=1; COND(c[D_IGE_128_AES][j]); count++)
1800 AES_ige_encrypt(buf,buf2,
1801 (unsigned long)lengths[j],&aes_ks1,
1804 print_result(D_IGE_128_AES,j,count,d);
1807 if (doit[D_IGE_192_AES])
1809 for (j=0; j<SIZE_NUM; j++)
1811 print_message(names[D_IGE_192_AES],c[D_IGE_192_AES][j],lengths[j]);
1813 for (count=0,run=1; COND(c[D_IGE_192_AES][j]); count++)
1814 AES_ige_encrypt(buf,buf2,
1815 (unsigned long)lengths[j],&aes_ks2,
1818 print_result(D_IGE_192_AES,j,count,d);
1821 if (doit[D_IGE_256_AES])
1823 for (j=0; j<SIZE_NUM; j++)
1825 print_message(names[D_IGE_256_AES],c[D_IGE_256_AES][j],lengths[j]);
1827 for (count=0,run=1; COND(c[D_IGE_256_AES][j]); count++)
1828 AES_ige_encrypt(buf,buf2,
1829 (unsigned long)lengths[j],&aes_ks3,
1832 print_result(D_IGE_256_AES,j,count,d);
1837 GCM128_CONTEXT *ctx = CRYPTO_gcm128_new(&aes_ks1,(block128_f)AES_encrypt);
1838 CRYPTO_gcm128_setiv (ctx,(unsigned char *)"0123456789ab",12);
1840 for (j=0; j<SIZE_NUM; j++)
1842 print_message(names[D_GHASH],c[D_GHASH][j],lengths[j]);
1844 for (count=0,run=1; COND(c[D_GHASH][j]); count++)
1845 CRYPTO_gcm128_aad(ctx,buf,lengths[j]);
1847 print_result(D_GHASH,j,count,d);
1849 CRYPTO_gcm128_release(ctx);
1853 #ifndef OPENSSL_NO_CAMELLIA
1854 if (doit[D_CBC_128_CML])
1856 for (j=0; j<SIZE_NUM; j++)
1858 print_message(names[D_CBC_128_CML],c[D_CBC_128_CML][j],lengths[j]);
1860 for (count=0,run=1; COND(c[D_CBC_128_CML][j]); count++)
1861 Camellia_cbc_encrypt(buf,buf,
1862 (unsigned long)lengths[j],&camellia_ks1,
1863 iv,CAMELLIA_ENCRYPT);
1865 print_result(D_CBC_128_CML,j,count,d);
1868 if (doit[D_CBC_192_CML])
1870 for (j=0; j<SIZE_NUM; j++)
1872 print_message(names[D_CBC_192_CML],c[D_CBC_192_CML][j],lengths[j]);
1874 for (count=0,run=1; COND(c[D_CBC_192_CML][j]); count++)
1875 Camellia_cbc_encrypt(buf,buf,
1876 (unsigned long)lengths[j],&camellia_ks2,
1877 iv,CAMELLIA_ENCRYPT);
1879 print_result(D_CBC_192_CML,j,count,d);
1882 if (doit[D_CBC_256_CML])
1884 for (j=0; j<SIZE_NUM; j++)
1886 print_message(names[D_CBC_256_CML],c[D_CBC_256_CML][j],lengths[j]);
1888 for (count=0,run=1; COND(c[D_CBC_256_CML][j]); count++)
1889 Camellia_cbc_encrypt(buf,buf,
1890 (unsigned long)lengths[j],&camellia_ks3,
1891 iv,CAMELLIA_ENCRYPT);
1893 print_result(D_CBC_256_CML,j,count,d);
1898 #ifndef OPENSSL_NO_IDEA
1899 if (doit[D_CBC_IDEA])
1901 for (j=0; j<SIZE_NUM; j++)
1903 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1905 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1906 idea_cbc_encrypt(buf,buf,
1907 (unsigned long)lengths[j],&idea_ks,
1910 print_result(D_CBC_IDEA,j,count,d);
1914 #ifndef OPENSSL_NO_SEED
1915 if (doit[D_CBC_SEED])
1917 for (j=0; j<SIZE_NUM; j++)
1919 print_message(names[D_CBC_SEED],c[D_CBC_SEED][j],lengths[j]);
1921 for (count=0,run=1; COND(c[D_CBC_SEED][j]); count++)
1922 SEED_cbc_encrypt(buf,buf,
1923 (unsigned long)lengths[j],&seed_ks,iv,1);
1925 print_result(D_CBC_SEED,j,count,d);
1929 #ifndef OPENSSL_NO_RC2
1930 if (doit[D_CBC_RC2])
1932 for (j=0; j<SIZE_NUM; j++)
1934 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1936 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1937 RC2_cbc_encrypt(buf,buf,
1938 (unsigned long)lengths[j],&rc2_ks,
1941 print_result(D_CBC_RC2,j,count,d);
1945 #ifndef OPENSSL_NO_RC5
1946 if (doit[D_CBC_RC5])
1948 for (j=0; j<SIZE_NUM; j++)
1950 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1952 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1953 RC5_32_cbc_encrypt(buf,buf,
1954 (unsigned long)lengths[j],&rc5_ks,
1957 print_result(D_CBC_RC5,j,count,d);
1961 #ifndef OPENSSL_NO_BF
1964 for (j=0; j<SIZE_NUM; j++)
1966 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1968 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1969 BF_cbc_encrypt(buf,buf,
1970 (unsigned long)lengths[j],&bf_ks,
1973 print_result(D_CBC_BF,j,count,d);
1977 #ifndef OPENSSL_NO_CAST
1978 if (doit[D_CBC_CAST])
1980 for (j=0; j<SIZE_NUM; j++)
1982 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1984 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1985 CAST_cbc_encrypt(buf,buf,
1986 (unsigned long)lengths[j],&cast_ks,
1989 print_result(D_CBC_CAST,j,count,d);
1996 for (j=0; j<SIZE_NUM; j++)
2003 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
2004 /* -O3 -fschedule-insns messes up an
2005 * optimization here! names[D_EVP]
2006 * somehow becomes NULL */
2007 print_message(names[D_EVP],save_count,
2010 EVP_CIPHER_CTX_init(&ctx);
2012 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
2014 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
2015 EVP_CIPHER_CTX_set_padding(&ctx, 0);
2019 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
2020 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
2022 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
2023 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
2025 EVP_DecryptFinal_ex(&ctx,buf,&outl);
2027 EVP_EncryptFinal_ex(&ctx,buf,&outl);
2029 EVP_CIPHER_CTX_cleanup(&ctx);
2033 names[D_EVP]=OBJ_nid2ln(evp_md->type);
2034 print_message(names[D_EVP],save_count,
2038 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
2039 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
2043 print_result(D_EVP,j,count,d);
2047 if (prime_doit[D_PRIME_TRIAL_DIVISION])
2049 BIGNUM *rnd = BN_new();
2050 BIGNUM *add = BN_new();
2051 BN_CTX *ctx = BN_CTX_new();
2053 BN_set_word(add, 2);
2054 prime_print_message(prime_names[D_PRIME_TRIAL_DIVISION],
2055 prime_c[D_PRIME_TRIAL_DIVISION]);
2058 for (count=0, run=1; COND(prime_c[D_PRIME_TRIAL_DIVISION]); count++)
2059 if (!bn_probable_prime_dh(rnd, 1024, add, NULL, ctx)) count--;
2062 prime_print_result(D_PRIME_TRIAL_DIVISION, count, d);
2069 if (prime_doit[D_PRIME_TRIAL_DIVISION_RETRY])
2071 BIGNUM *rnd = BN_new();
2072 BN_CTX *ctx = BN_CTX_new();
2074 prime_print_message(prime_names[D_PRIME_TRIAL_DIVISION_RETRY],
2075 prime_c[D_PRIME_TRIAL_DIVISION_RETRY]);
2078 for (count=0, run=1; COND(prime_c[D_PRIME_TRIAL_DIVISION_RETRY]); count++)
2079 if (!bn_probable_prime_dh_retry(rnd, 1024, ctx)) count--;
2082 prime_print_result(D_PRIME_TRIAL_DIVISION_RETRY, count, d);
2088 if (prime_doit[D_PRIME_COPRIME])
2090 BIGNUM *rnd = BN_new();
2091 BN_CTX *ctx = BN_CTX_new();
2093 prime_print_message(prime_names[D_PRIME_COPRIME],
2094 prime_c[D_PRIME_COPRIME]);
2097 for (count=0, run=1; COND(prime_c[D_PRIME_COPRIME]); count++)
2098 if (!bn_probable_prime_dh_coprime(rnd, 1024, ctx)) count--;
2101 prime_print_result(D_PRIME_COPRIME, count, d);
2107 RAND_pseudo_bytes(buf,36);
2108 #ifndef OPENSSL_NO_RSA
2109 for (j=0; j<RSA_NUM; j++)
2112 if (!rsa_doit[j]) continue;
2113 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
2116 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
2117 ERR_print_errors(bio_err);
2122 pkey_print_message("private","rsa",
2123 rsa_c[j][0],rsa_bits[j],
2125 /* RSA_blinding_on(rsa_key[j],NULL); */
2127 for (count=0,run=1; COND(rsa_c[j][0]); count++)
2129 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
2130 &rsa_num, rsa_key[j]);
2134 "RSA sign failure\n");
2135 ERR_print_errors(bio_err);
2141 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
2142 : "%ld %d bit private RSA's in %.2fs\n",
2143 count,rsa_bits[j],d);
2144 rsa_results[j][0]=d/(double)count;
2149 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
2152 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
2153 ERR_print_errors(bio_err);
2158 pkey_print_message("public","rsa",
2159 rsa_c[j][1],rsa_bits[j],
2162 for (count=0,run=1; COND(rsa_c[j][1]); count++)
2164 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
2165 rsa_num, rsa_key[j]);
2169 "RSA verify failure\n");
2170 ERR_print_errors(bio_err);
2176 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
2177 : "%ld %d bit public RSA's in %.2fs\n",
2178 count,rsa_bits[j],d);
2179 rsa_results[j][1]=d/(double)count;
2185 /* if longer than 10s, don't do any more */
2186 for (j++; j<RSA_NUM; j++)
2192 RAND_pseudo_bytes(buf,20);
2193 #ifndef OPENSSL_NO_DSA
2194 if (RAND_status() != 1)
2196 RAND_seed(rnd_seed, sizeof rnd_seed);
2199 for (j=0; j<DSA_NUM; j++)
2204 if (!dsa_doit[j]) continue;
2205 /* DSA_generate_key(dsa_key[j]); */
2206 /* DSA_sign_setup(dsa_key[j],NULL); */
2207 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
2211 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
2212 ERR_print_errors(bio_err);
2217 pkey_print_message("sign","dsa",
2218 dsa_c[j][0],dsa_bits[j],
2221 for (count=0,run=1; COND(dsa_c[j][0]); count++)
2223 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
2228 "DSA sign failure\n");
2229 ERR_print_errors(bio_err);
2235 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
2236 : "%ld %d bit DSA signs in %.2fs\n",
2237 count,dsa_bits[j],d);
2238 dsa_results[j][0]=d/(double)count;
2242 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
2246 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
2247 ERR_print_errors(bio_err);
2252 pkey_print_message("verify","dsa",
2253 dsa_c[j][1],dsa_bits[j],
2256 for (count=0,run=1; COND(dsa_c[j][1]); count++)
2258 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
2263 "DSA verify failure\n");
2264 ERR_print_errors(bio_err);
2270 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
2271 : "%ld %d bit DSA verify in %.2fs\n",
2272 count,dsa_bits[j],d);
2273 dsa_results[j][1]=d/(double)count;
2278 /* if longer than 10s, don't do any more */
2279 for (j++; j<DSA_NUM; j++)
2283 if (rnd_fake) RAND_cleanup();
2286 #ifndef OPENSSL_NO_ECDSA
2287 if (RAND_status() != 1)
2289 RAND_seed(rnd_seed, sizeof rnd_seed);
2292 for (j=0; j<EC_NUM; j++)
2296 if (!ecdsa_doit[j]) continue; /* Ignore Curve */
2297 ecdsa[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2298 if (ecdsa[j] == NULL)
2300 BIO_printf(bio_err,"ECDSA failure.\n");
2301 ERR_print_errors(bio_err);
2307 EC_KEY_precompute_mult(ecdsa[j], NULL);
2309 /* Perform ECDSA signature test */
2310 EC_KEY_generate_key(ecdsa[j]);
2311 ret = ECDSA_sign(0, buf, 20, ecdsasig,
2312 &ecdsasiglen, ecdsa[j]);
2315 BIO_printf(bio_err,"ECDSA sign failure. No ECDSA sign will be done.\n");
2316 ERR_print_errors(bio_err);
2321 pkey_print_message("sign","ecdsa",
2323 test_curves_bits[j],
2327 for (count=0,run=1; COND(ecdsa_c[j][0]);
2330 ret=ECDSA_sign(0, buf, 20,
2331 ecdsasig, &ecdsasiglen,
2335 BIO_printf(bio_err, "ECDSA sign failure\n");
2336 ERR_print_errors(bio_err);
2343 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
2344 "%ld %d bit ECDSA signs in %.2fs \n",
2345 count, test_curves_bits[j], d);
2346 ecdsa_results[j][0]=d/(double)count;
2350 /* Perform ECDSA verification test */
2351 ret=ECDSA_verify(0, buf, 20, ecdsasig,
2352 ecdsasiglen, ecdsa[j]);
2355 BIO_printf(bio_err,"ECDSA verify failure. No ECDSA verify will be done.\n");
2356 ERR_print_errors(bio_err);
2361 pkey_print_message("verify","ecdsa",
2363 test_curves_bits[j],
2366 for (count=0,run=1; COND(ecdsa_c[j][1]); count++)
2368 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
2371 BIO_printf(bio_err, "ECDSA verify failure\n");
2372 ERR_print_errors(bio_err);
2378 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
2379 : "%ld %d bit ECDSA verify in %.2fs\n",
2380 count, test_curves_bits[j], d);
2381 ecdsa_results[j][1]=d/(double)count;
2386 /* if longer than 10s, don't do any more */
2387 for (j++; j<EC_NUM; j++)
2392 if (rnd_fake) RAND_cleanup();
2395 #ifndef OPENSSL_NO_ECDH
2396 if (RAND_status() != 1)
2398 RAND_seed(rnd_seed, sizeof rnd_seed);
2401 for (j=0; j<EC_NUM; j++)
2403 if (!ecdh_doit[j]) continue;
2404 ecdh_a[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2405 ecdh_b[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2406 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2408 BIO_printf(bio_err,"ECDH failure.\n");
2409 ERR_print_errors(bio_err);
2414 /* generate two ECDH key pairs */
2415 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2416 !EC_KEY_generate_key(ecdh_b[j]))
2418 BIO_printf(bio_err,"ECDH key generation failure.\n");
2419 ERR_print_errors(bio_err);
2424 /* If field size is not more than 24 octets, then use SHA-1 hash of result;
2425 * otherwise, use result (see section 4.8 of draft-ietf-tls-ecc-03.txt).
2427 int field_size, outlen;
2428 void *(*kdf)(const void *in, size_t inlen, void *out, size_t *xoutlen);
2429 field_size = EC_GROUP_get_degree(EC_KEY_get0_group(ecdh_a[j]));
2430 if (field_size <= 24 * 8)
2432 outlen = KDF1_SHA1_len;
2437 outlen = (field_size+7)/8;
2440 secret_size_a = ECDH_compute_key(secret_a, outlen,
2441 EC_KEY_get0_public_key(ecdh_b[j]),
2443 secret_size_b = ECDH_compute_key(secret_b, outlen,
2444 EC_KEY_get0_public_key(ecdh_a[j]),
2446 if (secret_size_a != secret_size_b)
2451 for (secret_idx = 0;
2452 (secret_idx < secret_size_a)
2453 && (ecdh_checks == 1);
2456 if (secret_a[secret_idx] != secret_b[secret_idx])
2460 if (ecdh_checks == 0)
2462 BIO_printf(bio_err,"ECDH computations don't match.\n");
2463 ERR_print_errors(bio_err);
2467 pkey_print_message("","ecdh",
2469 test_curves_bits[j],
2472 for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2474 ECDH_compute_key(secret_a, outlen,
2475 EC_KEY_get0_public_key(ecdh_b[j]),
2479 BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2480 count, test_curves_bits[j], d);
2481 ecdh_results[j][0]=d/(double)count;
2489 /* if longer than 10s, don't do any more */
2490 for (j++; j<EC_NUM; j++)
2494 if (rnd_fake) RAND_cleanup();
2501 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
2502 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
2504 printf("%s ",BN_options());
2505 #ifndef OPENSSL_NO_MD2
2506 printf("%s ",MD2_options());
2508 #ifndef OPENSSL_NO_RC4
2509 printf("%s ",RC4_options());
2511 #ifndef OPENSSL_NO_DES
2512 printf("%s ",DES_options());
2514 #ifndef OPENSSL_NO_AES
2515 printf("%s ",AES_options());
2517 #ifndef OPENSSL_NO_IDEA
2518 printf("%s ",idea_options());
2520 #ifndef OPENSSL_NO_BF
2521 printf("%s ",BF_options());
2523 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2529 fprintf(stdout,"+H");
2532 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
2533 fprintf(stdout,"type ");
2535 for (j=0; j<SIZE_NUM; j++)
2536 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
2537 fprintf(stdout,"\n");
2540 for (k=0; k<ALGOR_NUM; k++)
2542 if (!doit[k]) continue;
2544 fprintf(stdout,"+F:%d:%s",k,names[k]);
2546 fprintf(stdout,"%-13s",names[k]);
2547 for (j=0; j<SIZE_NUM; j++)
2549 if (results[k][j] > 10000 && !mr)
2550 fprintf(stdout," %11.2fk",results[k][j]/1e3);
2552 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
2554 fprintf(stdout,"\n");
2556 #ifndef OPENSSL_NO_RSA
2558 for (k=0; k<RSA_NUM; k++)
2560 if (!rsa_doit[k]) continue;
2563 printf("%18ssign verify sign/s verify/s\n"," ");
2567 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2568 k,rsa_bits[k],rsa_results[k][0],
2571 fprintf(stdout,"rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2572 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2573 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
2576 #ifndef OPENSSL_NO_DSA
2578 for (k=0; k<DSA_NUM; k++)
2580 if (!dsa_doit[k]) continue;
2583 printf("%18ssign verify sign/s verify/s\n"," ");
2587 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2588 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2590 fprintf(stdout,"dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2591 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2592 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
2595 #ifndef OPENSSL_NO_ECDSA
2597 for (k=0; k<EC_NUM; k++)
2599 if (!ecdsa_doit[k]) continue;
2602 printf("%30ssign verify sign/s verify/s\n"," ");
2607 fprintf(stdout,"+F4:%u:%u:%f:%f\n",
2608 k, test_curves_bits[k],
2609 ecdsa_results[k][0],ecdsa_results[k][1]);
2612 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2613 test_curves_bits[k],
2614 test_curves_names[k],
2615 ecdsa_results[k][0],ecdsa_results[k][1],
2616 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2621 #ifndef OPENSSL_NO_ECDH
2623 for (k=0; k<EC_NUM; k++)
2625 if (!ecdh_doit[k]) continue;
2628 printf("%30sop op/s\n"," ");
2632 fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2633 k, test_curves_bits[k],
2634 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2637 fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2638 test_curves_bits[k],
2639 test_curves_names[k],
2640 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2647 ERR_print_errors(bio_err);
2648 if (buf != NULL) OPENSSL_free(buf);
2649 if (buf2 != NULL) OPENSSL_free(buf2);
2650 #ifndef OPENSSL_NO_RSA
2651 for (i=0; i<RSA_NUM; i++)
2652 if (rsa_key[i] != NULL)
2653 RSA_free(rsa_key[i]);
2655 #ifndef OPENSSL_NO_DSA
2656 for (i=0; i<DSA_NUM; i++)
2657 if (dsa_key[i] != NULL)
2658 DSA_free(dsa_key[i]);
2661 #ifndef OPENSSL_NO_ECDSA
2662 for (i=0; i<EC_NUM; i++)
2663 if (ecdsa[i] != NULL)
2664 EC_KEY_free(ecdsa[i]);
2666 #ifndef OPENSSL_NO_ECDH
2667 for (i=0; i<EC_NUM; i++)
2669 if (ecdh_a[i] != NULL)
2670 EC_KEY_free(ecdh_a[i]);
2671 if (ecdh_b[i] != NULL)
2672 EC_KEY_free(ecdh_b[i]);
2680 static void print_message(const char *s, long num, int length)
2683 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2684 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
2685 (void)BIO_flush(bio_err);
2688 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2689 : "Doing %s %ld times on %d size blocks: ",s,num,length);
2690 (void)BIO_flush(bio_err);
2697 static void prime_print_message(const char *s, long num)
2700 BIO_printf(bio_err,mr ? "+DT:%s:%d\n"
2701 : "Doing %s for %ds: ", s, PRIME_SECONDS);
2702 (void)BIO_flush(bio_err);
2703 alarm(PRIME_SECONDS);
2705 BIO_printf(bio_err,mr ? "+DN:%s:%ld\n"
2706 : "Doing %s %ld times: ", s, num);
2707 (void)BIO_flush(bio_err);
2714 static void pkey_print_message(const char *str, const char *str2, long num,
2718 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2719 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
2720 (void)BIO_flush(bio_err);
2723 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2724 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
2725 (void)BIO_flush(bio_err);
2732 static void print_result(int alg,int run_no,int count,double time_used)
2734 BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n"
2735 : "%d %s's in %.2fs\n",count,names[alg],time_used);
2736 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2739 static void prime_print_result(int alg, int count, double time_used)
2742 mr ? "+R:%d:%s:%f:%f\n" : "%d %s's in %.2fs (%.2f microseconds / run)\n",
2743 count, prime_names[alg], time_used,
2744 time_used / ((double)count) * 1000000);
2748 static char *sstrsep(char **string, const char *delim)
2751 char *token = *string;
2756 memset(isdelim, 0, sizeof isdelim);
2761 isdelim[(unsigned char)(*delim)] = 1;
2765 while (!isdelim[(unsigned char)(**string)])
2779 static int do_multi(int multi)
2784 static char sep[]=":";
2786 fds=malloc(multi*sizeof *fds);
2787 for(n=0 ; n < multi ; ++n)
2791 fprintf(stderr, "pipe failure\n");
2805 if (dup(fd[1]) == -1)
2807 fprintf(stderr, "dup failed\n");
2816 printf("Forked child %d\n",n);
2819 /* for now, assume the pipe is long enough to take all the output */
2820 for(n=0 ; n < multi ; ++n)
2826 f=fdopen(fds[n],"r");
2827 while(fgets(buf,sizeof buf,f))
2834 fprintf(stderr,"Don't understand line '%s' from child %d\n",
2838 printf("Got: %s from %d\n",buf,n);
2839 if(!strncmp(buf,"+F:",3))
2845 alg=atoi(sstrsep(&p,sep));
2847 for(j=0 ; j < SIZE_NUM ; ++j)
2848 results[alg][j]+=atof(sstrsep(&p,sep));
2850 else if(!strncmp(buf,"+F2:",4))
2856 k=atoi(sstrsep(&p,sep));
2859 d=atof(sstrsep(&p,sep));
2861 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2863 rsa_results[k][0]=d;
2865 d=atof(sstrsep(&p,sep));
2867 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2869 rsa_results[k][1]=d;
2871 else if(!strncmp(buf,"+F2:",4))
2877 k=atoi(sstrsep(&p,sep));
2880 d=atof(sstrsep(&p,sep));
2882 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2884 rsa_results[k][0]=d;
2886 d=atof(sstrsep(&p,sep));
2888 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2890 rsa_results[k][1]=d;
2892 #ifndef OPENSSL_NO_DSA
2893 else if(!strncmp(buf,"+F3:",4))
2899 k=atoi(sstrsep(&p,sep));
2902 d=atof(sstrsep(&p,sep));
2904 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2906 dsa_results[k][0]=d;
2908 d=atof(sstrsep(&p,sep));
2910 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2912 dsa_results[k][1]=d;
2915 #ifndef OPENSSL_NO_ECDSA
2916 else if(!strncmp(buf,"+F4:",4))
2922 k=atoi(sstrsep(&p,sep));
2925 d=atof(sstrsep(&p,sep));
2927 ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2929 ecdsa_results[k][0]=d;
2931 d=atof(sstrsep(&p,sep));
2933 ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2935 ecdsa_results[k][1]=d;
2939 #ifndef OPENSSL_NO_ECDH
2940 else if(!strncmp(buf,"+F5:",4))
2946 k=atoi(sstrsep(&p,sep));
2949 d=atof(sstrsep(&p,sep));
2951 ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2953 ecdh_results[k][0]=d;
2958 else if(!strncmp(buf,"+H:",3))
2962 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);