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
115 #include <openssl/bn.h>
116 #ifndef OPENSSL_NO_DES
117 #include <openssl/des.h>
119 #ifndef OPENSSL_NO_AES
120 #include <openssl/aes.h>
122 #ifndef OPENSSL_NO_CAMELLIA
123 #include <openssl/camellia.h>
125 #ifndef OPENSSL_NO_MD2
126 #include <openssl/md2.h>
128 #ifndef OPENSSL_NO_MDC2
129 #include <openssl/mdc2.h>
131 #ifndef OPENSSL_NO_MD4
132 #include <openssl/md4.h>
134 #ifndef OPENSSL_NO_MD5
135 #include <openssl/md5.h>
137 #ifndef OPENSSL_NO_HMAC
138 #include <openssl/hmac.h>
140 #include <openssl/evp.h>
141 #ifndef OPENSSL_NO_SHA
142 #include <openssl/sha.h>
144 #ifndef OPENSSL_NO_RIPEMD
145 #include <openssl/ripemd.h>
147 #ifndef OPENSSL_NO_WHIRLPOOL
148 #include <openssl/whrlpool.h>
150 #ifndef OPENSSL_NO_RC4
151 #include <openssl/rc4.h>
153 #ifndef OPENSSL_NO_RC5
154 #include <openssl/rc5.h>
156 #ifndef OPENSSL_NO_RC2
157 #include <openssl/rc2.h>
159 #ifndef OPENSSL_NO_IDEA
160 #include <openssl/idea.h>
162 #ifndef OPENSSL_NO_SEED
163 #include <openssl/seed.h>
165 #ifndef OPENSSL_NO_BF
166 #include <openssl/blowfish.h>
168 #ifndef OPENSSL_NO_CAST
169 #include <openssl/cast.h>
171 #ifndef OPENSSL_NO_RSA
172 #include <openssl/rsa.h>
173 #include "./testrsa.h"
175 #include <openssl/x509.h>
176 #ifndef OPENSSL_NO_DSA
177 #include <openssl/dsa.h>
178 #include "./testdsa.h"
180 #ifndef OPENSSL_NO_ECDSA
181 #include <openssl/ecdsa.h>
183 #ifndef OPENSSL_NO_ECDH
184 #include <openssl/ecdh.h>
186 #include <openssl/modes.h>
189 # if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_NETWARE)
203 #define BUFSIZE ((long)1024*8+1)
207 static int usertime=1;
209 static double Time_F(int s);
210 static void print_message(const char *s,long num,int length);
211 static void pkey_print_message(const char *str, const char *str2,
212 long num, int bits, int sec);
213 static void print_result(int alg,int run_no,int count,double time_used);
215 static int do_multi(int multi);
224 #define MAX_ECDH_SIZE 256
226 static const char *names[ALGOR_NUM]={
227 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
228 "des cbc","des ede3","idea cbc","seed cbc",
229 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
230 "aes-128 cbc","aes-192 cbc","aes-256 cbc",
231 "camellia-128 cbc","camellia-192 cbc","camellia-256 cbc",
232 "evp","sha256","sha512","whirlpool",
233 "aes-128 ige","aes-192 ige","aes-256 ige","ghash" };
234 static double results[ALGOR_NUM][SIZE_NUM];
235 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
236 #ifndef OPENSSL_NO_RSA
237 static double rsa_results[RSA_NUM][2];
239 #ifndef OPENSSL_NO_DSA
240 static double dsa_results[DSA_NUM][2];
242 #ifndef OPENSSL_NO_ECDSA
243 static double ecdsa_results[EC_NUM][2];
245 #ifndef OPENSSL_NO_ECDH
246 static double ecdh_results[EC_NUM][1];
249 #if defined(OPENSSL_NO_DSA) && !(defined(OPENSSL_NO_ECDSA) && defined(OPENSSL_NO_ECDH))
250 static const char rnd_seed[] = "string to make the random number generator think it has entropy";
251 static int rnd_fake = 0;
255 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
256 #define SIGRETTYPE void
258 #define SIGRETTYPE int
261 static SIGRETTYPE sig_done(int sig);
262 static SIGRETTYPE sig_done(int sig)
264 signal(SIGALRM,sig_done);
278 static unsigned int lapse,schlock;
279 static void alarm(unsigned int secs) { lapse = secs*1000; }
281 static DWORD WINAPI sleepy(VOID *arg)
289 static double Time_F(int s)
297 thr = CreateThread(NULL,4096,sleepy,NULL,0,NULL);
300 DWORD ret=GetLastError();
301 BIO_printf(bio_err,"unable to CreateThread (%d)",ret);
304 while (!schlock) Sleep(0); /* scheduler spinlock */
305 ret = app_tminterval(s,usertime);
309 ret = app_tminterval(s,usertime);
310 if (run) TerminateThread(thr,0);
318 static double Time_F(int s)
320 double ret = app_tminterval(s,usertime);
321 if (s == STOP) alarm(0);
327 #ifndef OPENSSL_NO_ECDH
328 static const int KDF1_SHA1_len = 20;
329 static void *KDF1_SHA1(const void *in, size_t inlen, void *out, size_t *outlen)
331 #ifndef OPENSSL_NO_SHA
332 if (*outlen < SHA_DIGEST_LENGTH)
335 *outlen = SHA_DIGEST_LENGTH;
336 return SHA1(in, inlen, out);
339 #endif /* OPENSSL_NO_SHA */
341 #endif /* OPENSSL_NO_ECDH */
344 int MAIN(int, char **);
346 int MAIN(int argc, char **argv)
348 unsigned char *buf=NULL,*buf2=NULL;
350 long count=0,save_count=0;
352 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
355 #ifndef OPENSSL_NO_RSA
358 unsigned char md[EVP_MAX_MD_SIZE];
359 #ifndef OPENSSL_NO_MD2
360 unsigned char md2[MD2_DIGEST_LENGTH];
362 #ifndef OPENSSL_NO_MDC2
363 unsigned char mdc2[MDC2_DIGEST_LENGTH];
365 #ifndef OPENSSL_NO_MD4
366 unsigned char md4[MD4_DIGEST_LENGTH];
368 #ifndef OPENSSL_NO_MD5
369 unsigned char md5[MD5_DIGEST_LENGTH];
370 unsigned char hmac[MD5_DIGEST_LENGTH];
372 #ifndef OPENSSL_NO_SHA
373 unsigned char sha[SHA_DIGEST_LENGTH];
374 #ifndef OPENSSL_NO_SHA256
375 unsigned char sha256[SHA256_DIGEST_LENGTH];
377 #ifndef OPENSSL_NO_SHA512
378 unsigned char sha512[SHA512_DIGEST_LENGTH];
381 #ifndef OPENSSL_NO_WHIRLPOOL
382 unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
384 #ifndef OPENSSL_NO_RIPEMD
385 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
387 #ifndef OPENSSL_NO_RC4
390 #ifndef OPENSSL_NO_RC5
393 #ifndef OPENSSL_NO_RC2
396 #ifndef OPENSSL_NO_IDEA
397 IDEA_KEY_SCHEDULE idea_ks;
399 #ifndef OPENSSL_NO_SEED
400 SEED_KEY_SCHEDULE seed_ks;
402 #ifndef OPENSSL_NO_BF
405 #ifndef OPENSSL_NO_CAST
408 static const unsigned char key16[16]=
409 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
410 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
411 #ifndef OPENSSL_NO_AES
412 static const unsigned char key24[24]=
413 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
414 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
415 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
416 static const unsigned char key32[32]=
417 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
418 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
419 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
420 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
422 #ifndef OPENSSL_NO_CAMELLIA
423 static const unsigned char ckey24[24]=
424 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
425 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
426 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
427 static const unsigned char ckey32[32]=
428 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
429 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
430 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
431 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
433 #ifndef OPENSSL_NO_AES
434 #define MAX_BLOCK_SIZE 128
436 #define MAX_BLOCK_SIZE 64
438 unsigned char DES_iv[8];
439 unsigned char iv[2*MAX_BLOCK_SIZE/8];
440 #ifndef OPENSSL_NO_DES
441 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
442 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
443 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
444 DES_key_schedule sch;
445 DES_key_schedule sch2;
446 DES_key_schedule sch3;
448 #ifndef OPENSSL_NO_AES
449 AES_KEY aes_ks1, aes_ks2, aes_ks3;
451 #ifndef OPENSSL_NO_CAMELLIA
452 CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3;
464 #define D_CBC_IDEA 10
465 #define D_CBC_SEED 11
469 #define D_CBC_CAST 15
470 #define D_CBC_128_AES 16
471 #define D_CBC_192_AES 17
472 #define D_CBC_256_AES 18
473 #define D_CBC_128_CML 19
474 #define D_CBC_192_CML 20
475 #define D_CBC_256_CML 21
479 #define D_WHIRLPOOL 25
480 #define D_IGE_128_AES 26
481 #define D_IGE_192_AES 27
482 #define D_IGE_256_AES 28
485 long c[ALGOR_NUM][SIZE_NUM];
511 #ifndef OPENSSL_NO_RSA
512 RSA *rsa_key[RSA_NUM];
513 long rsa_c[RSA_NUM][2];
514 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
515 static unsigned char *rsa_data[RSA_NUM]=
516 {test512,test1024,test2048,test4096};
517 static int rsa_data_length[RSA_NUM]={
518 sizeof(test512),sizeof(test1024),
519 sizeof(test2048),sizeof(test4096)};
521 #ifndef OPENSSL_NO_DSA
522 DSA *dsa_key[DSA_NUM];
523 long dsa_c[DSA_NUM][2];
524 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
526 #ifndef OPENSSL_NO_EC
527 /* We only test over the following curves as they are representative,
528 * To add tests over more curves, simply add the curve NID
529 * and curve name to the following arrays and increase the
530 * EC_NUM value accordingly.
532 static unsigned int test_curves[EC_NUM] =
536 NID_X9_62_prime192v1,
538 NID_X9_62_prime256v1,
553 static const char * test_curves_names[EC_NUM] =
574 static int test_curves_bits[EC_NUM] =
576 160, 192, 224, 256, 384, 521,
577 163, 233, 283, 409, 571,
578 163, 233, 283, 409, 571
583 #ifndef OPENSSL_NO_ECDSA
584 unsigned char ecdsasig[256];
585 unsigned int ecdsasiglen;
586 EC_KEY *ecdsa[EC_NUM];
587 long ecdsa_c[EC_NUM][2];
590 #ifndef OPENSSL_NO_ECDH
591 EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
592 unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
593 int secret_size_a, secret_size_b;
596 long ecdh_c[EC_NUM][2];
599 int rsa_doit[RSA_NUM];
600 int dsa_doit[DSA_NUM];
601 #ifndef OPENSSL_NO_ECDSA
602 int ecdsa_doit[EC_NUM];
604 #ifndef OPENSSL_NO_ECDH
605 int ecdh_doit[EC_NUM];
609 const EVP_CIPHER *evp_cipher=NULL;
610 const EVP_MD *evp_md=NULL;
621 memset(results, 0, sizeof(results));
622 #ifndef OPENSSL_NO_DSA
623 memset(dsa_key,0,sizeof(dsa_key));
625 #ifndef OPENSSL_NO_ECDSA
626 for (i=0; i<EC_NUM; i++) ecdsa[i] = NULL;
628 #ifndef OPENSSL_NO_ECDH
629 for (i=0; i<EC_NUM; i++)
638 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
639 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
641 if (!load_config(bio_err, NULL))
644 #ifndef OPENSSL_NO_RSA
645 memset(rsa_key,0,sizeof(rsa_key));
646 for (i=0; i<RSA_NUM; i++)
650 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
652 BIO_printf(bio_err,"out of memory\n");
655 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
657 BIO_printf(bio_err,"out of memory\n");
661 memset(c,0,sizeof(c));
662 memset(DES_iv,0,sizeof(DES_iv));
663 memset(iv,0,sizeof(iv));
665 for (i=0; i<ALGOR_NUM; i++)
667 for (i=0; i<RSA_NUM; i++)
669 for (i=0; i<DSA_NUM; i++)
671 #ifndef OPENSSL_NO_ECDSA
672 for (i=0; i<EC_NUM; i++)
675 #ifndef OPENSSL_NO_ECDH
676 for (i=0; i<EC_NUM; i++)
686 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
689 j--; /* Otherwise, -elapsed gets confused with
692 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
698 BIO_printf(bio_err,"no EVP given\n");
701 evp_cipher=EVP_get_cipherbyname(*argv);
704 evp_md=EVP_get_digestbyname(*argv);
706 if(!evp_cipher && !evp_md)
708 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
713 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
716 j--; /* Otherwise, -elapsed gets confused with
719 #ifndef OPENSSL_NO_ENGINE
720 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
726 BIO_printf(bio_err,"no engine given\n");
729 setup_engine(bio_err, *argv, 0);
730 /* j will be increased again further down. We just
731 don't want speed to confuse an engine with an
732 algorithm, especially when none is given (which
733 means all of them should be run) */
738 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
744 BIO_printf(bio_err,"no multi count given\n");
750 BIO_printf(bio_err,"bad multi count\n");
753 j--; /* Otherwise, -mr gets confused with
757 else if (argc > 0 && !strcmp(*argv,"-mr"))
760 j--; /* Otherwise, -mr gets confused with
764 #ifndef OPENSSL_NO_MD2
765 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
768 #ifndef OPENSSL_NO_MDC2
769 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
772 #ifndef OPENSSL_NO_MD4
773 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
776 #ifndef OPENSSL_NO_MD5
777 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
780 #ifndef OPENSSL_NO_MD5
781 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
784 #ifndef OPENSSL_NO_SHA
785 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
787 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1,
791 #ifndef OPENSSL_NO_SHA256
792 if (strcmp(*argv,"sha256") == 0) doit[D_SHA256]=1;
795 #ifndef OPENSSL_NO_SHA512
796 if (strcmp(*argv,"sha512") == 0) doit[D_SHA512]=1;
800 #ifndef OPENSSL_NO_WHIRLPOOL
801 if (strcmp(*argv,"whirlpool") == 0) doit[D_WHIRLPOOL]=1;
804 #ifndef OPENSSL_NO_RIPEMD
805 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
807 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
809 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
812 #ifndef OPENSSL_NO_RC4
813 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
816 #ifndef OPENSSL_NO_DES
817 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
818 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
821 #ifndef OPENSSL_NO_AES
822 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
823 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
824 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
825 else if (strcmp(*argv,"aes-128-ige") == 0) doit[D_IGE_128_AES]=1;
826 else if (strcmp(*argv,"aes-192-ige") == 0) doit[D_IGE_192_AES]=1;
827 else if (strcmp(*argv,"aes-256-ige") == 0) doit[D_IGE_256_AES]=1;
830 #ifndef OPENSSL_NO_CAMELLIA
831 if (strcmp(*argv,"camellia-128-cbc") == 0) doit[D_CBC_128_CML]=1;
832 else if (strcmp(*argv,"camellia-192-cbc") == 0) doit[D_CBC_192_CML]=1;
833 else if (strcmp(*argv,"camellia-256-cbc") == 0) doit[D_CBC_256_CML]=1;
836 #ifndef OPENSSL_NO_RSA
837 #if 0 /* was: #ifdef RSAref */
838 if (strcmp(*argv,"rsaref") == 0)
840 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
846 if (strcmp(*argv,"openssl") == 0)
848 RSA_set_default_method(RSA_PKCS1_SSLeay());
853 #endif /* !OPENSSL_NO_RSA */
854 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
855 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
856 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
857 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
858 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
859 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
860 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
862 #ifndef OPENSSL_NO_RC2
863 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
864 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
867 #ifndef OPENSSL_NO_RC5
868 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
869 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
872 #ifndef OPENSSL_NO_IDEA
873 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
874 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
877 #ifndef OPENSSL_NO_SEED
878 if (strcmp(*argv,"seed-cbc") == 0) doit[D_CBC_SEED]=1;
879 else if (strcmp(*argv,"seed") == 0) doit[D_CBC_SEED]=1;
882 #ifndef OPENSSL_NO_BF
883 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
884 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
885 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
888 #ifndef OPENSSL_NO_CAST
889 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
890 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
891 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
894 #ifndef OPENSSL_NO_DES
895 if (strcmp(*argv,"des") == 0)
902 #ifndef OPENSSL_NO_AES
903 if (strcmp(*argv,"aes") == 0)
905 doit[D_CBC_128_AES]=1;
906 doit[D_CBC_192_AES]=1;
907 doit[D_CBC_256_AES]=1;
909 else if (strcmp(*argv,"ghash") == 0)
915 #ifndef OPENSSL_NO_CAMELLIA
916 if (strcmp(*argv,"camellia") == 0)
918 doit[D_CBC_128_CML]=1;
919 doit[D_CBC_192_CML]=1;
920 doit[D_CBC_256_CML]=1;
924 #ifndef OPENSSL_NO_RSA
925 if (strcmp(*argv,"rsa") == 0)
927 rsa_doit[R_RSA_512]=1;
928 rsa_doit[R_RSA_1024]=1;
929 rsa_doit[R_RSA_2048]=1;
930 rsa_doit[R_RSA_4096]=1;
934 #ifndef OPENSSL_NO_DSA
935 if (strcmp(*argv,"dsa") == 0)
937 dsa_doit[R_DSA_512]=1;
938 dsa_doit[R_DSA_1024]=1;
939 dsa_doit[R_DSA_2048]=1;
943 #ifndef OPENSSL_NO_ECDSA
944 if (strcmp(*argv,"ecdsap160") == 0) ecdsa_doit[R_EC_P160]=2;
945 else if (strcmp(*argv,"ecdsap192") == 0) ecdsa_doit[R_EC_P192]=2;
946 else if (strcmp(*argv,"ecdsap224") == 0) ecdsa_doit[R_EC_P224]=2;
947 else if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2;
948 else if (strcmp(*argv,"ecdsap384") == 0) ecdsa_doit[R_EC_P384]=2;
949 else if (strcmp(*argv,"ecdsap521") == 0) ecdsa_doit[R_EC_P521]=2;
950 else if (strcmp(*argv,"ecdsak163") == 0) ecdsa_doit[R_EC_K163]=2;
951 else if (strcmp(*argv,"ecdsak233") == 0) ecdsa_doit[R_EC_K233]=2;
952 else if (strcmp(*argv,"ecdsak283") == 0) ecdsa_doit[R_EC_K283]=2;
953 else if (strcmp(*argv,"ecdsak409") == 0) ecdsa_doit[R_EC_K409]=2;
954 else if (strcmp(*argv,"ecdsak571") == 0) ecdsa_doit[R_EC_K571]=2;
955 else if (strcmp(*argv,"ecdsab163") == 0) ecdsa_doit[R_EC_B163]=2;
956 else if (strcmp(*argv,"ecdsab233") == 0) ecdsa_doit[R_EC_B233]=2;
957 else if (strcmp(*argv,"ecdsab283") == 0) ecdsa_doit[R_EC_B283]=2;
958 else if (strcmp(*argv,"ecdsab409") == 0) ecdsa_doit[R_EC_B409]=2;
959 else if (strcmp(*argv,"ecdsab571") == 0) ecdsa_doit[R_EC_B571]=2;
960 else if (strcmp(*argv,"ecdsa") == 0)
962 for (i=0; i < EC_NUM; i++)
967 #ifndef OPENSSL_NO_ECDH
968 if (strcmp(*argv,"ecdhp160") == 0) ecdh_doit[R_EC_P160]=2;
969 else if (strcmp(*argv,"ecdhp192") == 0) ecdh_doit[R_EC_P192]=2;
970 else if (strcmp(*argv,"ecdhp224") == 0) ecdh_doit[R_EC_P224]=2;
971 else if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2;
972 else if (strcmp(*argv,"ecdhp384") == 0) ecdh_doit[R_EC_P384]=2;
973 else if (strcmp(*argv,"ecdhp521") == 0) ecdh_doit[R_EC_P521]=2;
974 else if (strcmp(*argv,"ecdhk163") == 0) ecdh_doit[R_EC_K163]=2;
975 else if (strcmp(*argv,"ecdhk233") == 0) ecdh_doit[R_EC_K233]=2;
976 else if (strcmp(*argv,"ecdhk283") == 0) ecdh_doit[R_EC_K283]=2;
977 else if (strcmp(*argv,"ecdhk409") == 0) ecdh_doit[R_EC_K409]=2;
978 else if (strcmp(*argv,"ecdhk571") == 0) ecdh_doit[R_EC_K571]=2;
979 else if (strcmp(*argv,"ecdhb163") == 0) ecdh_doit[R_EC_B163]=2;
980 else if (strcmp(*argv,"ecdhb233") == 0) ecdh_doit[R_EC_B233]=2;
981 else if (strcmp(*argv,"ecdhb283") == 0) ecdh_doit[R_EC_B283]=2;
982 else if (strcmp(*argv,"ecdhb409") == 0) ecdh_doit[R_EC_B409]=2;
983 else if (strcmp(*argv,"ecdhb571") == 0) ecdh_doit[R_EC_B571]=2;
984 else if (strcmp(*argv,"ecdh") == 0)
986 for (i=0; i < EC_NUM; i++)
992 BIO_printf(bio_err,"Error: bad option or value\n");
993 BIO_printf(bio_err,"\n");
994 BIO_printf(bio_err,"Available values:\n");
995 #ifndef OPENSSL_NO_MD2
996 BIO_printf(bio_err,"md2 ");
998 #ifndef OPENSSL_NO_MDC2
999 BIO_printf(bio_err,"mdc2 ");
1001 #ifndef OPENSSL_NO_MD4
1002 BIO_printf(bio_err,"md4 ");
1004 #ifndef OPENSSL_NO_MD5
1005 BIO_printf(bio_err,"md5 ");
1006 #ifndef OPENSSL_NO_HMAC
1007 BIO_printf(bio_err,"hmac ");
1010 #ifndef OPENSSL_NO_SHA1
1011 BIO_printf(bio_err,"sha1 ");
1013 #ifndef OPENSSL_NO_SHA256
1014 BIO_printf(bio_err,"sha256 ");
1016 #ifndef OPENSSL_NO_SHA512
1017 BIO_printf(bio_err,"sha512 ");
1019 #ifndef OPENSSL_NO_WHIRLPOOL
1020 BIO_printf(bio_err,"whirlpool");
1022 #ifndef OPENSSL_NO_RIPEMD160
1023 BIO_printf(bio_err,"rmd160");
1025 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
1026 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
1027 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160) || \
1028 !defined(OPENSSL_NO_WHIRLPOOL)
1029 BIO_printf(bio_err,"\n");
1032 #ifndef OPENSSL_NO_IDEA
1033 BIO_printf(bio_err,"idea-cbc ");
1035 #ifndef OPENSSL_NO_SEED
1036 BIO_printf(bio_err,"seed-cbc ");
1038 #ifndef OPENSSL_NO_RC2
1039 BIO_printf(bio_err,"rc2-cbc ");
1041 #ifndef OPENSSL_NO_RC5
1042 BIO_printf(bio_err,"rc5-cbc ");
1044 #ifndef OPENSSL_NO_BF
1045 BIO_printf(bio_err,"bf-cbc");
1047 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_SEED) || !defined(OPENSSL_NO_RC2) || \
1048 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
1049 BIO_printf(bio_err,"\n");
1051 #ifndef OPENSSL_NO_DES
1052 BIO_printf(bio_err,"des-cbc des-ede3 ");
1054 #ifndef OPENSSL_NO_AES
1055 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
1056 BIO_printf(bio_err,"aes-128-ige aes-192-ige aes-256-ige ");
1058 #ifndef OPENSSL_NO_CAMELLIA
1059 BIO_printf(bio_err,"\n");
1060 BIO_printf(bio_err,"camellia-128-cbc camellia-192-cbc camellia-256-cbc ");
1062 #ifndef OPENSSL_NO_RC4
1063 BIO_printf(bio_err,"rc4");
1065 BIO_printf(bio_err,"\n");
1067 #ifndef OPENSSL_NO_RSA
1068 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
1071 #ifndef OPENSSL_NO_DSA
1072 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
1074 #ifndef OPENSSL_NO_ECDSA
1075 BIO_printf(bio_err,"ecdsap160 ecdsap192 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
1076 BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n");
1077 BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n");
1078 BIO_printf(bio_err,"ecdsa\n");
1080 #ifndef OPENSSL_NO_ECDH
1081 BIO_printf(bio_err,"ecdhp160 ecdhp192 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n");
1082 BIO_printf(bio_err,"ecdhk163 ecdhk233 ecdhk283 ecdhk409 ecdhk571\n");
1083 BIO_printf(bio_err,"ecdhb163 ecdhb233 ecdhb283 ecdhb409 ecdhb571\n");
1084 BIO_printf(bio_err,"ecdh\n");
1087 #ifndef OPENSSL_NO_IDEA
1088 BIO_printf(bio_err,"idea ");
1090 #ifndef OPENSSL_NO_SEED
1091 BIO_printf(bio_err,"seed ");
1093 #ifndef OPENSSL_NO_RC2
1094 BIO_printf(bio_err,"rc2 ");
1096 #ifndef OPENSSL_NO_DES
1097 BIO_printf(bio_err,"des ");
1099 #ifndef OPENSSL_NO_AES
1100 BIO_printf(bio_err,"aes ");
1102 #ifndef OPENSSL_NO_CAMELLIA
1103 BIO_printf(bio_err,"camellia ");
1105 #ifndef OPENSSL_NO_RSA
1106 BIO_printf(bio_err,"rsa ");
1108 #ifndef OPENSSL_NO_BF
1109 BIO_printf(bio_err,"blowfish");
1111 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_SEED) || \
1112 !defined(OPENSSL_NO_RC2) || !defined(OPENSSL_NO_DES) || \
1113 !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_BF) || \
1114 !defined(OPENSSL_NO_AES) || !defined(OPENSSL_NO_CAMELLIA)
1115 BIO_printf(bio_err,"\n");
1118 BIO_printf(bio_err,"\n");
1119 BIO_printf(bio_err,"Available options:\n");
1120 #if defined(TIMES) || defined(USE_TOD)
1121 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
1123 #ifndef OPENSSL_NO_ENGINE
1124 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
1126 BIO_printf(bio_err,"-evp e use EVP e.\n");
1127 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
1128 BIO_printf(bio_err,"-mr produce machine readable output.\n");
1130 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
1140 if(multi && do_multi(multi))
1146 for (i=0; i<ALGOR_NUM; i++)
1151 for (i=0; i<RSA_NUM; i++)
1153 for (i=0; i<DSA_NUM; i++)
1155 #ifndef OPENSSL_NO_ECDSA
1156 for (i=0; i<EC_NUM; i++)
1159 #ifndef OPENSSL_NO_ECDH
1160 for (i=0; i<EC_NUM; i++)
1164 for (i=0; i<ALGOR_NUM; i++)
1165 if (doit[i]) pr_header++;
1167 if (usertime == 0 && !mr)
1168 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
1170 #ifndef OPENSSL_NO_RSA
1171 for (i=0; i<RSA_NUM; i++)
1173 const unsigned char *p;
1176 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
1177 if (rsa_key[i] == NULL)
1179 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
1185 BIO_printf(bio_err,mr ? "+RK:%d:"
1186 : "Loaded RSA key, %d bit modulus and e= 0x",
1187 BN_num_bits(rsa_key[i]->n));
1188 BN_print(bio_err,rsa_key[i]->e);
1189 BIO_printf(bio_err,"\n");
1195 #ifndef OPENSSL_NO_DSA
1196 dsa_key[0]=get_dsa512();
1197 dsa_key[1]=get_dsa1024();
1198 dsa_key[2]=get_dsa2048();
1201 #ifndef OPENSSL_NO_DES
1202 DES_set_key_unchecked(&key,&sch);
1203 DES_set_key_unchecked(&key2,&sch2);
1204 DES_set_key_unchecked(&key3,&sch3);
1206 #ifndef OPENSSL_NO_AES
1207 AES_set_encrypt_key(key16,128,&aes_ks1);
1208 AES_set_encrypt_key(key24,192,&aes_ks2);
1209 AES_set_encrypt_key(key32,256,&aes_ks3);
1211 #ifndef OPENSSL_NO_CAMELLIA
1212 Camellia_set_key(key16,128,&camellia_ks1);
1213 Camellia_set_key(ckey24,192,&camellia_ks2);
1214 Camellia_set_key(ckey32,256,&camellia_ks3);
1216 #ifndef OPENSSL_NO_IDEA
1217 idea_set_encrypt_key(key16,&idea_ks);
1219 #ifndef OPENSSL_NO_SEED
1220 SEED_set_key(key16,&seed_ks);
1222 #ifndef OPENSSL_NO_RC4
1223 RC4_set_key(&rc4_ks,16,key16);
1225 #ifndef OPENSSL_NO_RC2
1226 RC2_set_key(&rc2_ks,16,key16,128);
1228 #ifndef OPENSSL_NO_RC5
1229 RC5_32_set_key(&rc5_ks,16,key16,12);
1231 #ifndef OPENSSL_NO_BF
1232 BF_set_key(&bf_ks,16,key16);
1234 #ifndef OPENSSL_NO_CAST
1235 CAST_set_key(&cast_ks,16,key16);
1237 #ifndef OPENSSL_NO_RSA
1238 memset(rsa_c,0,sizeof(rsa_c));
1241 #ifndef OPENSSL_NO_DES
1242 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
1248 for (it=count; it; it--)
1249 DES_ecb_encrypt((DES_cblock *)buf,
1255 c[D_MD2][0]=count/10;
1256 c[D_MDC2][0]=count/10;
1261 c[D_RMD160][0]=count;
1262 c[D_RC4][0]=count*5;
1263 c[D_CBC_DES][0]=count;
1264 c[D_EDE3_DES][0]=count/3;
1265 c[D_CBC_IDEA][0]=count;
1266 c[D_CBC_SEED][0]=count;
1267 c[D_CBC_RC2][0]=count;
1268 c[D_CBC_RC5][0]=count;
1269 c[D_CBC_BF][0]=count;
1270 c[D_CBC_CAST][0]=count;
1271 c[D_CBC_128_AES][0]=count;
1272 c[D_CBC_192_AES][0]=count;
1273 c[D_CBC_256_AES][0]=count;
1274 c[D_CBC_128_CML][0]=count;
1275 c[D_CBC_192_CML][0]=count;
1276 c[D_CBC_256_CML][0]=count;
1277 c[D_SHA256][0]=count;
1278 c[D_SHA512][0]=count;
1279 c[D_WHIRLPOOL][0]=count;
1280 c[D_IGE_128_AES][0]=count;
1281 c[D_IGE_192_AES][0]=count;
1282 c[D_IGE_256_AES][0]=count;
1283 c[D_GHASH][0]=count;
1285 for (i=1; i<SIZE_NUM; i++)
1287 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1288 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1289 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1290 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1291 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1292 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1293 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1294 c[D_SHA256][i]=c[D_SHA256][0]*4*lengths[0]/lengths[i];
1295 c[D_SHA512][i]=c[D_SHA512][0]*4*lengths[0]/lengths[i];
1296 c[D_WHIRLPOOL][i]=c[D_WHIRLPOOL][0]*4*lengths[0]/lengths[i];
1298 for (i=1; i<SIZE_NUM; i++)
1302 l0=(long)lengths[i-1];
1303 l1=(long)lengths[i];
1304 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1305 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1306 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1307 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1308 c[D_CBC_SEED][i]=c[D_CBC_SEED][i-1]*l0/l1;
1309 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1310 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1311 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1312 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1313 c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
1314 c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
1315 c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
1316 c[D_CBC_128_CML][i]=c[D_CBC_128_CML][i-1]*l0/l1;
1317 c[D_CBC_192_CML][i]=c[D_CBC_192_CML][i-1]*l0/l1;
1318 c[D_CBC_256_CML][i]=c[D_CBC_256_CML][i-1]*l0/l1;
1319 c[D_IGE_128_AES][i]=c[D_IGE_128_AES][i-1]*l0/l1;
1320 c[D_IGE_192_AES][i]=c[D_IGE_192_AES][i-1]*l0/l1;
1321 c[D_IGE_256_AES][i]=c[D_IGE_256_AES][i-1]*l0/l1;
1323 #ifndef OPENSSL_NO_RSA
1324 rsa_c[R_RSA_512][0]=count/2000;
1325 rsa_c[R_RSA_512][1]=count/400;
1326 for (i=1; i<RSA_NUM; i++)
1328 rsa_c[i][0]=rsa_c[i-1][0]/8;
1329 rsa_c[i][1]=rsa_c[i-1][1]/4;
1330 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1334 if (rsa_c[i][0] == 0)
1343 #ifndef OPENSSL_NO_DSA
1344 dsa_c[R_DSA_512][0]=count/1000;
1345 dsa_c[R_DSA_512][1]=count/1000/2;
1346 for (i=1; i<DSA_NUM; i++)
1348 dsa_c[i][0]=dsa_c[i-1][0]/4;
1349 dsa_c[i][1]=dsa_c[i-1][1]/4;
1350 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1363 #ifndef OPENSSL_NO_ECDSA
1364 ecdsa_c[R_EC_P160][0]=count/1000;
1365 ecdsa_c[R_EC_P160][1]=count/1000/2;
1366 for (i=R_EC_P192; i<=R_EC_P521; i++)
1368 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1369 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1370 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1374 if (ecdsa_c[i] == 0)
1381 ecdsa_c[R_EC_K163][0]=count/1000;
1382 ecdsa_c[R_EC_K163][1]=count/1000/2;
1383 for (i=R_EC_K233; i<=R_EC_K571; i++)
1385 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1386 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1387 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1391 if (ecdsa_c[i] == 0)
1398 ecdsa_c[R_EC_B163][0]=count/1000;
1399 ecdsa_c[R_EC_B163][1]=count/1000/2;
1400 for (i=R_EC_B233; i<=R_EC_B571; i++)
1402 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1403 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1404 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1408 if (ecdsa_c[i] == 0)
1417 #ifndef OPENSSL_NO_ECDH
1418 ecdh_c[R_EC_P160][0]=count/1000;
1419 ecdh_c[R_EC_P160][1]=count/1000;
1420 for (i=R_EC_P192; i<=R_EC_P521; i++)
1422 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1423 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1424 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1435 ecdh_c[R_EC_K163][0]=count/1000;
1436 ecdh_c[R_EC_K163][1]=count/1000;
1437 for (i=R_EC_K233; i<=R_EC_K571; i++)
1439 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1440 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1441 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1452 ecdh_c[R_EC_B163][0]=count/1000;
1453 ecdh_c[R_EC_B163][1]=count/1000;
1454 for (i=R_EC_B233; i<=R_EC_B571; i++)
1456 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1457 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1458 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1471 #define COND(d) (count < (d))
1472 #define COUNT(d) (d)
1474 /* not worth fixing */
1475 # error "You cannot disable DES on systems without SIGALRM."
1476 #endif /* OPENSSL_NO_DES */
1478 #define COND(c) (run && count<0x7fffffff)
1479 #define COUNT(d) (count)
1481 signal(SIGALRM,sig_done);
1483 #endif /* SIGALRM */
1485 #ifndef OPENSSL_NO_MD2
1488 for (j=0; j<SIZE_NUM; j++)
1490 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1492 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1493 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1495 print_result(D_MD2,j,count,d);
1499 #ifndef OPENSSL_NO_MDC2
1502 for (j=0; j<SIZE_NUM; j++)
1504 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1506 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1507 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1509 print_result(D_MDC2,j,count,d);
1514 #ifndef OPENSSL_NO_MD4
1517 for (j=0; j<SIZE_NUM; j++)
1519 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1521 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1522 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1524 print_result(D_MD4,j,count,d);
1529 #ifndef OPENSSL_NO_MD5
1532 for (j=0; j<SIZE_NUM; j++)
1534 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1536 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1537 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1539 print_result(D_MD5,j,count,d);
1544 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1549 HMAC_CTX_init(&hctx);
1550 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1551 16,EVP_md5(), NULL);
1553 for (j=0; j<SIZE_NUM; j++)
1555 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1557 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1559 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1560 HMAC_Update(&hctx,buf,lengths[j]);
1561 HMAC_Final(&hctx,&(hmac[0]),NULL);
1564 print_result(D_HMAC,j,count,d);
1566 HMAC_CTX_cleanup(&hctx);
1569 #ifndef OPENSSL_NO_SHA
1572 for (j=0; j<SIZE_NUM; j++)
1574 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1576 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1578 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1580 SHA1(buf,lengths[j],sha);
1583 print_result(D_SHA1,j,count,d);
1587 #ifndef OPENSSL_NO_SHA256
1590 for (j=0; j<SIZE_NUM; j++)
1592 print_message(names[D_SHA256],c[D_SHA256][j],lengths[j]);
1594 for (count=0,run=1; COND(c[D_SHA256][j]); count++)
1595 SHA256(buf,lengths[j],sha256);
1597 print_result(D_SHA256,j,count,d);
1602 #ifndef OPENSSL_NO_SHA512
1605 for (j=0; j<SIZE_NUM; j++)
1607 print_message(names[D_SHA512],c[D_SHA512][j],lengths[j]);
1609 for (count=0,run=1; COND(c[D_SHA512][j]); count++)
1610 SHA512(buf,lengths[j],sha512);
1612 print_result(D_SHA512,j,count,d);
1618 #ifndef OPENSSL_NO_WHIRLPOOL
1619 if (doit[D_WHIRLPOOL])
1621 for (j=0; j<SIZE_NUM; j++)
1623 print_message(names[D_WHIRLPOOL],c[D_WHIRLPOOL][j],lengths[j]);
1625 for (count=0,run=1; COND(c[D_WHIRLPOOL][j]); count++)
1626 WHIRLPOOL(buf,lengths[j],whirlpool);
1628 print_result(D_WHIRLPOOL,j,count,d);
1633 #ifndef OPENSSL_NO_RIPEMD
1636 for (j=0; j<SIZE_NUM; j++)
1638 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1640 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1641 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1643 print_result(D_RMD160,j,count,d);
1647 #ifndef OPENSSL_NO_RC4
1650 for (j=0; j<SIZE_NUM; j++)
1652 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1654 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1655 RC4(&rc4_ks,(unsigned int)lengths[j],
1658 print_result(D_RC4,j,count,d);
1662 #ifndef OPENSSL_NO_DES
1663 if (doit[D_CBC_DES])
1665 for (j=0; j<SIZE_NUM; j++)
1667 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1669 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1670 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1671 &DES_iv,DES_ENCRYPT);
1673 print_result(D_CBC_DES,j,count,d);
1677 if (doit[D_EDE3_DES])
1679 for (j=0; j<SIZE_NUM; j++)
1681 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1683 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1684 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1686 &DES_iv,DES_ENCRYPT);
1688 print_result(D_EDE3_DES,j,count,d);
1692 #ifndef OPENSSL_NO_AES
1693 if (doit[D_CBC_128_AES])
1695 for (j=0; j<SIZE_NUM; j++)
1697 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1699 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1700 AES_cbc_encrypt(buf,buf,
1701 (unsigned long)lengths[j],&aes_ks1,
1704 print_result(D_CBC_128_AES,j,count,d);
1707 if (doit[D_CBC_192_AES])
1709 for (j=0; j<SIZE_NUM; j++)
1711 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1713 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1714 AES_cbc_encrypt(buf,buf,
1715 (unsigned long)lengths[j],&aes_ks2,
1718 print_result(D_CBC_192_AES,j,count,d);
1721 if (doit[D_CBC_256_AES])
1723 for (j=0; j<SIZE_NUM; j++)
1725 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1727 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1728 AES_cbc_encrypt(buf,buf,
1729 (unsigned long)lengths[j],&aes_ks3,
1732 print_result(D_CBC_256_AES,j,count,d);
1736 if (doit[D_IGE_128_AES])
1738 for (j=0; j<SIZE_NUM; j++)
1740 print_message(names[D_IGE_128_AES],c[D_IGE_128_AES][j],lengths[j]);
1742 for (count=0,run=1; COND(c[D_IGE_128_AES][j]); count++)
1743 AES_ige_encrypt(buf,buf2,
1744 (unsigned long)lengths[j],&aes_ks1,
1747 print_result(D_IGE_128_AES,j,count,d);
1750 if (doit[D_IGE_192_AES])
1752 for (j=0; j<SIZE_NUM; j++)
1754 print_message(names[D_IGE_192_AES],c[D_IGE_192_AES][j],lengths[j]);
1756 for (count=0,run=1; COND(c[D_IGE_192_AES][j]); count++)
1757 AES_ige_encrypt(buf,buf2,
1758 (unsigned long)lengths[j],&aes_ks2,
1761 print_result(D_IGE_192_AES,j,count,d);
1764 if (doit[D_IGE_256_AES])
1766 for (j=0; j<SIZE_NUM; j++)
1768 print_message(names[D_IGE_256_AES],c[D_IGE_256_AES][j],lengths[j]);
1770 for (count=0,run=1; COND(c[D_IGE_256_AES][j]); count++)
1771 AES_ige_encrypt(buf,buf2,
1772 (unsigned long)lengths[j],&aes_ks3,
1775 print_result(D_IGE_256_AES,j,count,d);
1780 GCM128_CONTEXT *ctx = CRYPTO_gcm128_new(&aes_ks1,(block128_f)AES_encrypt);
1781 CRYPTO_gcm128_setiv (ctx,(unsigned char *)"0123456789ab",12);
1783 for (j=0; j<SIZE_NUM; j++)
1785 print_message(names[D_GHASH],c[D_GHASH][j],lengths[j]);
1787 for (count=0,run=1; COND(c[D_GHASH][j]); count++)
1788 CRYPTO_gcm128_aad(ctx,buf,lengths[j]);
1790 print_result(D_GHASH,j,count,d);
1792 CRYPTO_gcm128_release(ctx);
1796 #ifndef OPENSSL_NO_CAMELLIA
1797 if (doit[D_CBC_128_CML])
1799 for (j=0; j<SIZE_NUM; j++)
1801 print_message(names[D_CBC_128_CML],c[D_CBC_128_CML][j],lengths[j]);
1803 for (count=0,run=1; COND(c[D_CBC_128_CML][j]); count++)
1804 Camellia_cbc_encrypt(buf,buf,
1805 (unsigned long)lengths[j],&camellia_ks1,
1806 iv,CAMELLIA_ENCRYPT);
1808 print_result(D_CBC_128_CML,j,count,d);
1811 if (doit[D_CBC_192_CML])
1813 for (j=0; j<SIZE_NUM; j++)
1815 print_message(names[D_CBC_192_CML],c[D_CBC_192_CML][j],lengths[j]);
1817 for (count=0,run=1; COND(c[D_CBC_192_CML][j]); count++)
1818 Camellia_cbc_encrypt(buf,buf,
1819 (unsigned long)lengths[j],&camellia_ks2,
1820 iv,CAMELLIA_ENCRYPT);
1822 print_result(D_CBC_192_CML,j,count,d);
1825 if (doit[D_CBC_256_CML])
1827 for (j=0; j<SIZE_NUM; j++)
1829 print_message(names[D_CBC_256_CML],c[D_CBC_256_CML][j],lengths[j]);
1831 for (count=0,run=1; COND(c[D_CBC_256_CML][j]); count++)
1832 Camellia_cbc_encrypt(buf,buf,
1833 (unsigned long)lengths[j],&camellia_ks3,
1834 iv,CAMELLIA_ENCRYPT);
1836 print_result(D_CBC_256_CML,j,count,d);
1841 #ifndef OPENSSL_NO_IDEA
1842 if (doit[D_CBC_IDEA])
1844 for (j=0; j<SIZE_NUM; j++)
1846 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1848 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1849 idea_cbc_encrypt(buf,buf,
1850 (unsigned long)lengths[j],&idea_ks,
1853 print_result(D_CBC_IDEA,j,count,d);
1857 #ifndef OPENSSL_NO_SEED
1858 if (doit[D_CBC_SEED])
1860 for (j=0; j<SIZE_NUM; j++)
1862 print_message(names[D_CBC_SEED],c[D_CBC_SEED][j],lengths[j]);
1864 for (count=0,run=1; COND(c[D_CBC_SEED][j]); count++)
1865 SEED_cbc_encrypt(buf,buf,
1866 (unsigned long)lengths[j],&seed_ks,iv,1);
1868 print_result(D_CBC_SEED,j,count,d);
1872 #ifndef OPENSSL_NO_RC2
1873 if (doit[D_CBC_RC2])
1875 for (j=0; j<SIZE_NUM; j++)
1877 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1879 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1880 RC2_cbc_encrypt(buf,buf,
1881 (unsigned long)lengths[j],&rc2_ks,
1884 print_result(D_CBC_RC2,j,count,d);
1888 #ifndef OPENSSL_NO_RC5
1889 if (doit[D_CBC_RC5])
1891 for (j=0; j<SIZE_NUM; j++)
1893 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1895 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1896 RC5_32_cbc_encrypt(buf,buf,
1897 (unsigned long)lengths[j],&rc5_ks,
1900 print_result(D_CBC_RC5,j,count,d);
1904 #ifndef OPENSSL_NO_BF
1907 for (j=0; j<SIZE_NUM; j++)
1909 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1911 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1912 BF_cbc_encrypt(buf,buf,
1913 (unsigned long)lengths[j],&bf_ks,
1916 print_result(D_CBC_BF,j,count,d);
1920 #ifndef OPENSSL_NO_CAST
1921 if (doit[D_CBC_CAST])
1923 for (j=0; j<SIZE_NUM; j++)
1925 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1927 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1928 CAST_cbc_encrypt(buf,buf,
1929 (unsigned long)lengths[j],&cast_ks,
1932 print_result(D_CBC_CAST,j,count,d);
1939 for (j=0; j<SIZE_NUM; j++)
1946 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1947 /* -O3 -fschedule-insns messes up an
1948 * optimization here! names[D_EVP]
1949 * somehow becomes NULL */
1950 print_message(names[D_EVP],save_count,
1953 EVP_CIPHER_CTX_init(&ctx);
1955 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1957 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1958 EVP_CIPHER_CTX_set_padding(&ctx, 0);
1962 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1963 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1965 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1966 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1968 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1970 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1972 EVP_CIPHER_CTX_cleanup(&ctx);
1976 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1977 print_message(names[D_EVP],save_count,
1981 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1982 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1986 print_result(D_EVP,j,count,d);
1990 RAND_pseudo_bytes(buf,36);
1991 #ifndef OPENSSL_NO_RSA
1992 for (j=0; j<RSA_NUM; j++)
1995 if (!rsa_doit[j]) continue;
1996 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1999 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
2000 ERR_print_errors(bio_err);
2005 pkey_print_message("private","rsa",
2006 rsa_c[j][0],rsa_bits[j],
2008 /* RSA_blinding_on(rsa_key[j],NULL); */
2010 for (count=0,run=1; COND(rsa_c[j][0]); count++)
2012 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
2013 &rsa_num, rsa_key[j]);
2017 "RSA sign failure\n");
2018 ERR_print_errors(bio_err);
2024 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
2025 : "%ld %d bit private RSA's in %.2fs\n",
2026 count,rsa_bits[j],d);
2027 rsa_results[j][0]=d/(double)count;
2032 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
2035 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
2036 ERR_print_errors(bio_err);
2041 pkey_print_message("public","rsa",
2042 rsa_c[j][1],rsa_bits[j],
2045 for (count=0,run=1; COND(rsa_c[j][1]); count++)
2047 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
2048 rsa_num, rsa_key[j]);
2052 "RSA verify failure\n");
2053 ERR_print_errors(bio_err);
2059 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
2060 : "%ld %d bit public RSA's in %.2fs\n",
2061 count,rsa_bits[j],d);
2062 rsa_results[j][1]=d/(double)count;
2068 /* if longer than 10s, don't do any more */
2069 for (j++; j<RSA_NUM; j++)
2075 RAND_pseudo_bytes(buf,20);
2076 #ifndef OPENSSL_NO_DSA
2077 if (RAND_status() != 1)
2079 RAND_seed(rnd_seed, sizeof rnd_seed);
2082 for (j=0; j<DSA_NUM; j++)
2087 if (!dsa_doit[j]) continue;
2088 /* DSA_generate_key(dsa_key[j]); */
2089 /* DSA_sign_setup(dsa_key[j],NULL); */
2090 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
2094 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
2095 ERR_print_errors(bio_err);
2100 pkey_print_message("sign","dsa",
2101 dsa_c[j][0],dsa_bits[j],
2104 for (count=0,run=1; COND(dsa_c[j][0]); count++)
2106 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
2111 "DSA sign failure\n");
2112 ERR_print_errors(bio_err);
2118 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
2119 : "%ld %d bit DSA signs in %.2fs\n",
2120 count,dsa_bits[j],d);
2121 dsa_results[j][0]=d/(double)count;
2125 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
2129 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
2130 ERR_print_errors(bio_err);
2135 pkey_print_message("verify","dsa",
2136 dsa_c[j][1],dsa_bits[j],
2139 for (count=0,run=1; COND(dsa_c[j][1]); count++)
2141 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
2146 "DSA verify failure\n");
2147 ERR_print_errors(bio_err);
2153 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
2154 : "%ld %d bit DSA verify in %.2fs\n",
2155 count,dsa_bits[j],d);
2156 dsa_results[j][1]=d/(double)count;
2161 /* if longer than 10s, don't do any more */
2162 for (j++; j<DSA_NUM; j++)
2166 if (rnd_fake) RAND_cleanup();
2169 #ifndef OPENSSL_NO_ECDSA
2170 if (RAND_status() != 1)
2172 RAND_seed(rnd_seed, sizeof rnd_seed);
2175 for (j=0; j<EC_NUM; j++)
2179 if (!ecdsa_doit[j]) continue; /* Ignore Curve */
2180 ecdsa[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2181 if (ecdsa[j] == NULL)
2183 BIO_printf(bio_err,"ECDSA failure.\n");
2184 ERR_print_errors(bio_err);
2190 EC_KEY_precompute_mult(ecdsa[j], NULL);
2192 /* Perform ECDSA signature test */
2193 EC_KEY_generate_key(ecdsa[j]);
2194 ret = ECDSA_sign(0, buf, 20, ecdsasig,
2195 &ecdsasiglen, ecdsa[j]);
2198 BIO_printf(bio_err,"ECDSA sign failure. No ECDSA sign will be done.\n");
2199 ERR_print_errors(bio_err);
2204 pkey_print_message("sign","ecdsa",
2206 test_curves_bits[j],
2210 for (count=0,run=1; COND(ecdsa_c[j][0]);
2213 ret=ECDSA_sign(0, buf, 20,
2214 ecdsasig, &ecdsasiglen,
2218 BIO_printf(bio_err, "ECDSA sign failure\n");
2219 ERR_print_errors(bio_err);
2226 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
2227 "%ld %d bit ECDSA signs in %.2fs \n",
2228 count, test_curves_bits[j], d);
2229 ecdsa_results[j][0]=d/(double)count;
2233 /* Perform ECDSA verification test */
2234 ret=ECDSA_verify(0, buf, 20, ecdsasig,
2235 ecdsasiglen, ecdsa[j]);
2238 BIO_printf(bio_err,"ECDSA verify failure. No ECDSA verify will be done.\n");
2239 ERR_print_errors(bio_err);
2244 pkey_print_message("verify","ecdsa",
2246 test_curves_bits[j],
2249 for (count=0,run=1; COND(ecdsa_c[j][1]); count++)
2251 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
2254 BIO_printf(bio_err, "ECDSA verify failure\n");
2255 ERR_print_errors(bio_err);
2261 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
2262 : "%ld %d bit ECDSA verify in %.2fs\n",
2263 count, test_curves_bits[j], d);
2264 ecdsa_results[j][1]=d/(double)count;
2269 /* if longer than 10s, don't do any more */
2270 for (j++; j<EC_NUM; j++)
2275 if (rnd_fake) RAND_cleanup();
2278 #ifndef OPENSSL_NO_ECDH
2279 if (RAND_status() != 1)
2281 RAND_seed(rnd_seed, sizeof rnd_seed);
2284 for (j=0; j<EC_NUM; j++)
2286 if (!ecdh_doit[j]) continue;
2287 ecdh_a[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2288 ecdh_b[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2289 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2291 BIO_printf(bio_err,"ECDH failure.\n");
2292 ERR_print_errors(bio_err);
2297 /* generate two ECDH key pairs */
2298 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2299 !EC_KEY_generate_key(ecdh_b[j]))
2301 BIO_printf(bio_err,"ECDH key generation failure.\n");
2302 ERR_print_errors(bio_err);
2307 /* If field size is not more than 24 octets, then use SHA-1 hash of result;
2308 * otherwise, use result (see section 4.8 of draft-ietf-tls-ecc-03.txt).
2310 int field_size, outlen;
2311 void *(*kdf)(const void *in, size_t inlen, void *out, size_t *xoutlen);
2312 field_size = EC_GROUP_get_degree(EC_KEY_get0_group(ecdh_a[j]));
2313 if (field_size <= 24 * 8)
2315 outlen = KDF1_SHA1_len;
2320 outlen = (field_size+7)/8;
2323 secret_size_a = ECDH_compute_key(secret_a, outlen,
2324 EC_KEY_get0_public_key(ecdh_b[j]),
2326 secret_size_b = ECDH_compute_key(secret_b, outlen,
2327 EC_KEY_get0_public_key(ecdh_a[j]),
2329 if (secret_size_a != secret_size_b)
2334 for (secret_idx = 0;
2335 (secret_idx < secret_size_a)
2336 && (ecdh_checks == 1);
2339 if (secret_a[secret_idx] != secret_b[secret_idx])
2343 if (ecdh_checks == 0)
2345 BIO_printf(bio_err,"ECDH computations don't match.\n");
2346 ERR_print_errors(bio_err);
2350 pkey_print_message("","ecdh",
2352 test_curves_bits[j],
2355 for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2357 ECDH_compute_key(secret_a, outlen,
2358 EC_KEY_get0_public_key(ecdh_b[j]),
2362 BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2363 count, test_curves_bits[j], d);
2364 ecdh_results[j][0]=d/(double)count;
2372 /* if longer than 10s, don't do any more */
2373 for (j++; j<EC_NUM; j++)
2377 if (rnd_fake) RAND_cleanup();
2384 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
2385 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
2387 printf("%s ",BN_options());
2388 #ifndef OPENSSL_NO_MD2
2389 printf("%s ",MD2_options());
2391 #ifndef OPENSSL_NO_RC4
2392 printf("%s ",RC4_options());
2394 #ifndef OPENSSL_NO_DES
2395 printf("%s ",DES_options());
2397 #ifndef OPENSSL_NO_AES
2398 printf("%s ",AES_options());
2400 #ifndef OPENSSL_NO_IDEA
2401 printf("%s ",idea_options());
2403 #ifndef OPENSSL_NO_BF
2404 printf("%s ",BF_options());
2406 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2412 fprintf(stdout,"+H");
2415 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
2416 fprintf(stdout,"type ");
2418 for (j=0; j<SIZE_NUM; j++)
2419 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
2420 fprintf(stdout,"\n");
2423 for (k=0; k<ALGOR_NUM; k++)
2425 if (!doit[k]) continue;
2427 fprintf(stdout,"+F:%d:%s",k,names[k]);
2429 fprintf(stdout,"%-13s",names[k]);
2430 for (j=0; j<SIZE_NUM; j++)
2432 if (results[k][j] > 10000 && !mr)
2433 fprintf(stdout," %11.2fk",results[k][j]/1e3);
2435 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
2437 fprintf(stdout,"\n");
2439 #ifndef OPENSSL_NO_RSA
2441 for (k=0; k<RSA_NUM; k++)
2443 if (!rsa_doit[k]) continue;
2446 printf("%18ssign verify sign/s verify/s\n"," ");
2450 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2451 k,rsa_bits[k],rsa_results[k][0],
2454 fprintf(stdout,"rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2455 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2456 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
2459 #ifndef OPENSSL_NO_DSA
2461 for (k=0; k<DSA_NUM; k++)
2463 if (!dsa_doit[k]) continue;
2466 printf("%18ssign verify sign/s verify/s\n"," ");
2470 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2471 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2473 fprintf(stdout,"dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2474 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2475 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
2478 #ifndef OPENSSL_NO_ECDSA
2480 for (k=0; k<EC_NUM; k++)
2482 if (!ecdsa_doit[k]) continue;
2485 printf("%30ssign verify sign/s verify/s\n"," ");
2490 fprintf(stdout,"+F4:%u:%u:%f:%f\n",
2491 k, test_curves_bits[k],
2492 ecdsa_results[k][0],ecdsa_results[k][1]);
2495 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2496 test_curves_bits[k],
2497 test_curves_names[k],
2498 ecdsa_results[k][0],ecdsa_results[k][1],
2499 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2504 #ifndef OPENSSL_NO_ECDH
2506 for (k=0; k<EC_NUM; k++)
2508 if (!ecdh_doit[k]) continue;
2511 printf("%30sop op/s\n"," ");
2515 fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2516 k, test_curves_bits[k],
2517 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2520 fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2521 test_curves_bits[k],
2522 test_curves_names[k],
2523 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2530 ERR_print_errors(bio_err);
2531 if (buf != NULL) OPENSSL_free(buf);
2532 if (buf2 != NULL) OPENSSL_free(buf2);
2533 #ifndef OPENSSL_NO_RSA
2534 for (i=0; i<RSA_NUM; i++)
2535 if (rsa_key[i] != NULL)
2536 RSA_free(rsa_key[i]);
2538 #ifndef OPENSSL_NO_DSA
2539 for (i=0; i<DSA_NUM; i++)
2540 if (dsa_key[i] != NULL)
2541 DSA_free(dsa_key[i]);
2544 #ifndef OPENSSL_NO_ECDSA
2545 for (i=0; i<EC_NUM; i++)
2546 if (ecdsa[i] != NULL)
2547 EC_KEY_free(ecdsa[i]);
2549 #ifndef OPENSSL_NO_ECDH
2550 for (i=0; i<EC_NUM; i++)
2552 if (ecdh_a[i] != NULL)
2553 EC_KEY_free(ecdh_a[i]);
2554 if (ecdh_b[i] != NULL)
2555 EC_KEY_free(ecdh_b[i]);
2563 static void print_message(const char *s, long num, int length)
2566 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2567 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
2568 (void)BIO_flush(bio_err);
2571 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2572 : "Doing %s %ld times on %d size blocks: ",s,num,length);
2573 (void)BIO_flush(bio_err);
2580 static void pkey_print_message(const char *str, const char *str2, long num,
2584 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2585 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
2586 (void)BIO_flush(bio_err);
2589 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2590 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
2591 (void)BIO_flush(bio_err);
2598 static void print_result(int alg,int run_no,int count,double time_used)
2600 BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n"
2601 : "%d %s's in %.2fs\n",count,names[alg],time_used);
2602 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2606 static char *sstrsep(char **string, const char *delim)
2609 char *token = *string;
2614 memset(isdelim, 0, sizeof isdelim);
2619 isdelim[(unsigned char)(*delim)] = 1;
2623 while (!isdelim[(unsigned char)(**string)])
2637 static int do_multi(int multi)
2642 static char sep[]=":";
2644 fds=malloc(multi*sizeof *fds);
2645 for(n=0 ; n < multi ; ++n)
2666 printf("Forked child %d\n",n);
2669 /* for now, assume the pipe is long enough to take all the output */
2670 for(n=0 ; n < multi ; ++n)
2676 f=fdopen(fds[n],"r");
2677 while(fgets(buf,sizeof buf,f))
2684 fprintf(stderr,"Don't understand line '%s' from child %d\n",
2688 printf("Got: %s from %d\n",buf,n);
2689 if(!strncmp(buf,"+F:",3))
2695 alg=atoi(sstrsep(&p,sep));
2697 for(j=0 ; j < SIZE_NUM ; ++j)
2698 results[alg][j]+=atof(sstrsep(&p,sep));
2700 else if(!strncmp(buf,"+F2:",4))
2706 k=atoi(sstrsep(&p,sep));
2709 d=atof(sstrsep(&p,sep));
2711 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2713 rsa_results[k][0]=d;
2715 d=atof(sstrsep(&p,sep));
2717 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2719 rsa_results[k][1]=d;
2721 else if(!strncmp(buf,"+F2:",4))
2727 k=atoi(sstrsep(&p,sep));
2730 d=atof(sstrsep(&p,sep));
2732 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2734 rsa_results[k][0]=d;
2736 d=atof(sstrsep(&p,sep));
2738 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2740 rsa_results[k][1]=d;
2742 #ifndef OPENSSL_NO_DSA
2743 else if(!strncmp(buf,"+F3:",4))
2749 k=atoi(sstrsep(&p,sep));
2752 d=atof(sstrsep(&p,sep));
2754 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2756 dsa_results[k][0]=d;
2758 d=atof(sstrsep(&p,sep));
2760 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2762 dsa_results[k][1]=d;
2765 #ifndef OPENSSL_NO_ECDSA
2766 else if(!strncmp(buf,"+F4:",4))
2772 k=atoi(sstrsep(&p,sep));
2775 d=atof(sstrsep(&p,sep));
2777 ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2779 ecdsa_results[k][0]=d;
2781 d=atof(sstrsep(&p,sep));
2783 ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2785 ecdsa_results[k][1]=d;
2789 #ifndef OPENSSL_NO_ECDH
2790 else if(!strncmp(buf,"+F5:",4))
2796 k=atoi(sstrsep(&p,sep));
2799 d=atof(sstrsep(&p,sep));
2801 ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2803 ecdh_results[k][0]=d;
2808 else if(!strncmp(buf,"+H:",3))
2812 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);