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>
187 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2) && !defined(OPENSSL_SYS_NETWARE)
192 #define BUFSIZE ((long)1024*8+1)
196 static int usertime=1;
198 static double Time_F(int s);
199 static void print_message(const char *s,long num,int length);
200 static void pkey_print_message(const char *str, const char *str2,
201 long num, int bits, int sec);
202 static void print_result(int alg,int run_no,int count,double time_used);
204 static int do_multi(int multi);
213 #define MAX_ECDH_SIZE 256
215 static const char *names[ALGOR_NUM]={
216 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
217 "des cbc","des ede3","idea cbc","seed cbc",
218 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
219 "aes-128 cbc","aes-192 cbc","aes-256 cbc",
220 "camellia-128 cbc","camellia-192 cbc","camellia-256 cbc",
221 "evp","sha256","sha512","whirlpool",
222 "aes-128 ige","aes-192 ige","aes-256 ige"};
223 static double results[ALGOR_NUM][SIZE_NUM];
224 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
225 static double rsa_results[RSA_NUM][2];
226 static double dsa_results[DSA_NUM][2];
227 #ifndef OPENSSL_NO_ECDSA
228 static double ecdsa_results[EC_NUM][2];
230 #ifndef OPENSSL_NO_ECDH
231 static double ecdh_results[EC_NUM][1];
234 #if defined(OPENSSL_NO_DSA) && !(defined(OPENSSL_NO_ECDSA) && defined(OPENSSL_NO_ECDH))
235 static const char rnd_seed[] = "string to make the random number generator think it has entropy";
236 static int rnd_fake = 0;
240 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
241 #define SIGRETTYPE void
243 #define SIGRETTYPE int
246 static SIGRETTYPE sig_done(int sig);
247 static SIGRETTYPE sig_done(int sig)
249 signal(SIGALRM,sig_done);
263 static unsigned int lapse,schlock;
264 static void alarm(unsigned int secs) { lapse = secs*1000; }
266 static DWORD WINAPI sleepy(VOID *arg)
274 static double Time_F(int s)
280 thr = CreateThread(NULL,4096,sleepy,NULL,0,NULL);
283 DWORD ret=GetLastError();
284 BIO_printf(bio_err,"unable to CreateThread (%d)",ret);
287 CloseHandle(thr); /* detach the thread */
288 while (!schlock) Sleep(0); /* scheduler spinlock */
291 return app_tminterval(s,usertime);
295 static double Time_F(int s)
297 return app_tminterval(s,usertime);
302 #ifndef OPENSSL_NO_ECDH
303 static const int KDF1_SHA1_len = 20;
304 static void *KDF1_SHA1(const void *in, size_t inlen, void *out, size_t *outlen)
306 #ifndef OPENSSL_NO_SHA
307 if (*outlen < SHA_DIGEST_LENGTH)
310 *outlen = SHA_DIGEST_LENGTH;
311 return SHA1(in, inlen, out);
314 #endif /* OPENSSL_NO_SHA */
316 #endif /* OPENSSL_NO_ECDH */
319 int MAIN(int, char **);
321 int MAIN(int argc, char **argv)
323 #ifndef OPENSSL_NO_ENGINE
326 unsigned char *buf=NULL,*buf2=NULL;
328 long count=0,save_count=0;
330 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
333 #ifndef OPENSSL_NO_RSA
336 unsigned char md[EVP_MAX_MD_SIZE];
337 #ifndef OPENSSL_NO_MD2
338 unsigned char md2[MD2_DIGEST_LENGTH];
340 #ifndef OPENSSL_NO_MDC2
341 unsigned char mdc2[MDC2_DIGEST_LENGTH];
343 #ifndef OPENSSL_NO_MD4
344 unsigned char md4[MD4_DIGEST_LENGTH];
346 #ifndef OPENSSL_NO_MD5
347 unsigned char md5[MD5_DIGEST_LENGTH];
348 unsigned char hmac[MD5_DIGEST_LENGTH];
350 #ifndef OPENSSL_NO_SHA
351 unsigned char sha[SHA_DIGEST_LENGTH];
352 #ifndef OPENSSL_NO_SHA256
353 unsigned char sha256[SHA256_DIGEST_LENGTH];
355 #ifndef OPENSSL_NO_SHA512
356 unsigned char sha512[SHA512_DIGEST_LENGTH];
359 #ifndef OPENSSL_NO_WHIRLPOOL
360 unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
362 #ifndef OPENSSL_NO_RIPEMD
363 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
365 #ifndef OPENSSL_NO_RC4
368 #ifndef OPENSSL_NO_RC5
371 #ifndef OPENSSL_NO_RC2
374 #ifndef OPENSSL_NO_IDEA
375 IDEA_KEY_SCHEDULE idea_ks;
377 #ifndef OPENSSL_NO_SEED
378 SEED_KEY_SCHEDULE seed_ks;
380 #ifndef OPENSSL_NO_BF
383 #ifndef OPENSSL_NO_CAST
386 static const unsigned char key16[16]=
387 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
388 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
389 #ifndef OPENSSL_NO_AES
390 static const unsigned char key24[24]=
391 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
392 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
393 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
394 static const unsigned char key32[32]=
395 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
396 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
397 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
398 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
400 #ifndef OPENSSL_NO_CAMELLIA
401 static const unsigned char ckey24[24]=
402 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
403 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
404 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
405 static const unsigned char ckey32[32]=
406 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
407 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
408 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
409 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
411 #ifndef OPENSSL_NO_AES
412 #define MAX_BLOCK_SIZE 128
414 #define MAX_BLOCK_SIZE 64
416 unsigned char DES_iv[8];
417 unsigned char iv[2*MAX_BLOCK_SIZE/8];
418 #ifndef OPENSSL_NO_DES
419 DES_cblock *buf_as_des_cblock = NULL;
420 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
421 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
422 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
423 DES_key_schedule sch;
424 DES_key_schedule sch2;
425 DES_key_schedule sch3;
427 #ifndef OPENSSL_NO_AES
428 AES_KEY aes_ks1, aes_ks2, aes_ks3;
430 #ifndef OPENSSL_NO_CAMELLIA
431 CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3;
443 #define D_CBC_IDEA 10
444 #define D_CBC_SEED 11
448 #define D_CBC_CAST 15
449 #define D_CBC_128_AES 16
450 #define D_CBC_192_AES 17
451 #define D_CBC_256_AES 18
452 #define D_CBC_128_CML 19
453 #define D_CBC_192_CML 20
454 #define D_CBC_256_CML 21
458 #define D_WHIRLPOOL 25
459 #define D_IGE_128_AES 26
460 #define D_IGE_192_AES 27
461 #define D_IGE_256_AES 28
463 long c[ALGOR_NUM][SIZE_NUM];
489 #ifndef OPENSSL_NO_RSA
490 RSA *rsa_key[RSA_NUM];
491 long rsa_c[RSA_NUM][2];
492 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
493 static unsigned char *rsa_data[RSA_NUM]=
494 {test512,test1024,test2048,test4096};
495 static int rsa_data_length[RSA_NUM]={
496 sizeof(test512),sizeof(test1024),
497 sizeof(test2048),sizeof(test4096)};
499 #ifndef OPENSSL_NO_DSA
500 DSA *dsa_key[DSA_NUM];
501 long dsa_c[DSA_NUM][2];
502 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
504 #ifndef OPENSSL_NO_EC
505 /* We only test over the following curves as they are representative,
506 * To add tests over more curves, simply add the curve NID
507 * and curve name to the following arrays and increase the
508 * EC_NUM value accordingly.
510 static unsigned int test_curves[EC_NUM] =
514 NID_X9_62_prime192v1,
516 NID_X9_62_prime256v1,
531 static const char * test_curves_names[EC_NUM] =
552 static int test_curves_bits[EC_NUM] =
554 160, 192, 224, 256, 384, 521,
555 163, 233, 283, 409, 571,
556 163, 233, 283, 409, 571
561 #ifndef OPENSSL_NO_ECDSA
562 unsigned char ecdsasig[256];
563 unsigned int ecdsasiglen;
564 EC_KEY *ecdsa[EC_NUM];
565 long ecdsa_c[EC_NUM][2];
568 #ifndef OPENSSL_NO_ECDH
569 EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
570 unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
571 int secret_size_a, secret_size_b;
574 long ecdh_c[EC_NUM][2];
577 int rsa_doit[RSA_NUM];
578 int dsa_doit[DSA_NUM];
579 #ifndef OPENSSL_NO_ECDSA
580 int ecdsa_doit[EC_NUM];
582 #ifndef OPENSSL_NO_ECDH
583 int ecdh_doit[EC_NUM];
587 const EVP_CIPHER *evp_cipher=NULL;
588 const EVP_MD *evp_md=NULL;
599 memset(results, 0, sizeof(results));
600 #ifndef OPENSSL_NO_DSA
601 memset(dsa_key,0,sizeof(dsa_key));
603 #ifndef OPENSSL_NO_ECDSA
604 for (i=0; i<EC_NUM; i++) ecdsa[i] = NULL;
606 #ifndef OPENSSL_NO_ECDH
607 for (i=0; i<EC_NUM; i++)
616 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
617 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
619 if (!load_config(bio_err, NULL))
622 #ifndef OPENSSL_NO_RSA
623 memset(rsa_key,0,sizeof(rsa_key));
624 for (i=0; i<RSA_NUM; i++)
628 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
630 BIO_printf(bio_err,"out of memory\n");
633 #ifndef OPENSSL_NO_DES
634 buf_as_des_cblock = (DES_cblock *)buf;
636 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
638 BIO_printf(bio_err,"out of memory\n");
642 memset(c,0,sizeof(c));
643 memset(DES_iv,0,sizeof(DES_iv));
644 memset(iv,0,sizeof(iv));
646 for (i=0; i<ALGOR_NUM; i++)
648 for (i=0; i<RSA_NUM; i++)
650 for (i=0; i<DSA_NUM; i++)
652 #ifndef OPENSSL_NO_ECDSA
653 for (i=0; i<EC_NUM; i++)
656 #ifndef OPENSSL_NO_ECDH
657 for (i=0; i<EC_NUM; i++)
667 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
670 j--; /* Otherwise, -elapsed gets confused with
673 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
679 BIO_printf(bio_err,"no EVP given\n");
682 evp_cipher=EVP_get_cipherbyname(*argv);
685 evp_md=EVP_get_digestbyname(*argv);
687 if(!evp_cipher && !evp_md)
689 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
694 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
697 j--; /* Otherwise, -elapsed gets confused with
700 #ifndef OPENSSL_NO_ENGINE
701 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
707 BIO_printf(bio_err,"no engine given\n");
710 e = setup_engine(bio_err, *argv, 0);
711 /* j will be increased again further down. We just
712 don't want speed to confuse an engine with an
713 algorithm, especially when none is given (which
714 means all of them should be run) */
719 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
725 BIO_printf(bio_err,"no multi count given\n");
731 BIO_printf(bio_err,"bad multi count\n");
734 j--; /* Otherwise, -mr gets confused with
738 else if (argc > 0 && !strcmp(*argv,"-mr"))
741 j--; /* Otherwise, -mr gets confused with
745 #ifndef OPENSSL_NO_MD2
746 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
749 #ifndef OPENSSL_NO_MDC2
750 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
753 #ifndef OPENSSL_NO_MD4
754 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
757 #ifndef OPENSSL_NO_MD5
758 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
761 #ifndef OPENSSL_NO_MD5
762 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
765 #ifndef OPENSSL_NO_SHA
766 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
768 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1,
772 #ifndef OPENSSL_NO_SHA256
773 if (strcmp(*argv,"sha256") == 0) doit[D_SHA256]=1;
776 #ifndef OPENSSL_NO_SHA512
777 if (strcmp(*argv,"sha512") == 0) doit[D_SHA512]=1;
781 #ifndef OPENSSL_NO_WHIRLPOOL
782 if (strcmp(*argv,"whirlpool") == 0) doit[D_WHIRLPOOL]=1;
785 #ifndef OPENSSL_NO_RIPEMD
786 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
788 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
790 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
793 #ifndef OPENSSL_NO_RC4
794 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
797 #ifndef OPENSSL_NO_DES
798 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
799 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
802 #ifndef OPENSSL_NO_AES
803 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
804 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
805 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
806 else if (strcmp(*argv,"aes-128-ige") == 0) doit[D_IGE_128_AES]=1;
807 else if (strcmp(*argv,"aes-192-ige") == 0) doit[D_IGE_192_AES]=1;
808 else if (strcmp(*argv,"aes-256-ige") == 0) doit[D_IGE_256_AES]=1;
811 #ifndef OPENSSL_NO_CAMELLIA
812 if (strcmp(*argv,"camellia-128-cbc") == 0) doit[D_CBC_128_CML]=1;
813 else if (strcmp(*argv,"camellia-192-cbc") == 0) doit[D_CBC_192_CML]=1;
814 else if (strcmp(*argv,"camellia-256-cbc") == 0) doit[D_CBC_256_CML]=1;
817 #ifndef OPENSSL_NO_RSA
818 #if 0 /* was: #ifdef RSAref */
819 if (strcmp(*argv,"rsaref") == 0)
821 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
827 if (strcmp(*argv,"openssl") == 0)
829 RSA_set_default_method(RSA_PKCS1_SSLeay());
834 #endif /* !OPENSSL_NO_RSA */
835 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
836 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
837 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
838 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
839 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
840 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
841 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
843 #ifndef OPENSSL_NO_RC2
844 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
845 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
848 #ifndef OPENSSL_NO_RC5
849 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
850 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
853 #ifndef OPENSSL_NO_IDEA
854 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
855 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
858 #ifndef OPENSSL_NO_SEED
859 if (strcmp(*argv,"seed-cbc") == 0) doit[D_CBC_SEED]=1;
860 else if (strcmp(*argv,"seed") == 0) doit[D_CBC_SEED]=1;
863 #ifndef OPENSSL_NO_BF
864 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
865 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
866 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
869 #ifndef OPENSSL_NO_CAST
870 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
871 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
872 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
875 #ifndef OPENSSL_NO_DES
876 if (strcmp(*argv,"des") == 0)
883 #ifndef OPENSSL_NO_AES
884 if (strcmp(*argv,"aes") == 0)
886 doit[D_CBC_128_AES]=1;
887 doit[D_CBC_192_AES]=1;
888 doit[D_CBC_256_AES]=1;
892 #ifndef OPENSSL_NO_CAMELLIA
893 if (strcmp(*argv,"camellia") == 0)
895 doit[D_CBC_128_CML]=1;
896 doit[D_CBC_192_CML]=1;
897 doit[D_CBC_256_CML]=1;
901 #ifndef OPENSSL_NO_RSA
902 if (strcmp(*argv,"rsa") == 0)
904 rsa_doit[R_RSA_512]=1;
905 rsa_doit[R_RSA_1024]=1;
906 rsa_doit[R_RSA_2048]=1;
907 rsa_doit[R_RSA_4096]=1;
911 #ifndef OPENSSL_NO_DSA
912 if (strcmp(*argv,"dsa") == 0)
914 dsa_doit[R_DSA_512]=1;
915 dsa_doit[R_DSA_1024]=1;
916 dsa_doit[R_DSA_2048]=1;
920 #ifndef OPENSSL_NO_ECDSA
921 if (strcmp(*argv,"ecdsap160") == 0) ecdsa_doit[R_EC_P160]=2;
922 else if (strcmp(*argv,"ecdsap192") == 0) ecdsa_doit[R_EC_P192]=2;
923 else if (strcmp(*argv,"ecdsap224") == 0) ecdsa_doit[R_EC_P224]=2;
924 else if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2;
925 else if (strcmp(*argv,"ecdsap384") == 0) ecdsa_doit[R_EC_P384]=2;
926 else if (strcmp(*argv,"ecdsap521") == 0) ecdsa_doit[R_EC_P521]=2;
927 else if (strcmp(*argv,"ecdsak163") == 0) ecdsa_doit[R_EC_K163]=2;
928 else if (strcmp(*argv,"ecdsak233") == 0) ecdsa_doit[R_EC_K233]=2;
929 else if (strcmp(*argv,"ecdsak283") == 0) ecdsa_doit[R_EC_K283]=2;
930 else if (strcmp(*argv,"ecdsak409") == 0) ecdsa_doit[R_EC_K409]=2;
931 else if (strcmp(*argv,"ecdsak571") == 0) ecdsa_doit[R_EC_K571]=2;
932 else if (strcmp(*argv,"ecdsab163") == 0) ecdsa_doit[R_EC_B163]=2;
933 else if (strcmp(*argv,"ecdsab233") == 0) ecdsa_doit[R_EC_B233]=2;
934 else if (strcmp(*argv,"ecdsab283") == 0) ecdsa_doit[R_EC_B283]=2;
935 else if (strcmp(*argv,"ecdsab409") == 0) ecdsa_doit[R_EC_B409]=2;
936 else if (strcmp(*argv,"ecdsab571") == 0) ecdsa_doit[R_EC_B571]=2;
937 else if (strcmp(*argv,"ecdsa") == 0)
939 for (i=0; i < EC_NUM; i++)
944 #ifndef OPENSSL_NO_ECDH
945 if (strcmp(*argv,"ecdhp160") == 0) ecdh_doit[R_EC_P160]=2;
946 else if (strcmp(*argv,"ecdhp192") == 0) ecdh_doit[R_EC_P192]=2;
947 else if (strcmp(*argv,"ecdhp224") == 0) ecdh_doit[R_EC_P224]=2;
948 else if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2;
949 else if (strcmp(*argv,"ecdhp384") == 0) ecdh_doit[R_EC_P384]=2;
950 else if (strcmp(*argv,"ecdhp521") == 0) ecdh_doit[R_EC_P521]=2;
951 else if (strcmp(*argv,"ecdhk163") == 0) ecdh_doit[R_EC_K163]=2;
952 else if (strcmp(*argv,"ecdhk233") == 0) ecdh_doit[R_EC_K233]=2;
953 else if (strcmp(*argv,"ecdhk283") == 0) ecdh_doit[R_EC_K283]=2;
954 else if (strcmp(*argv,"ecdhk409") == 0) ecdh_doit[R_EC_K409]=2;
955 else if (strcmp(*argv,"ecdhk571") == 0) ecdh_doit[R_EC_K571]=2;
956 else if (strcmp(*argv,"ecdhb163") == 0) ecdh_doit[R_EC_B163]=2;
957 else if (strcmp(*argv,"ecdhb233") == 0) ecdh_doit[R_EC_B233]=2;
958 else if (strcmp(*argv,"ecdhb283") == 0) ecdh_doit[R_EC_B283]=2;
959 else if (strcmp(*argv,"ecdhb409") == 0) ecdh_doit[R_EC_B409]=2;
960 else if (strcmp(*argv,"ecdhb571") == 0) ecdh_doit[R_EC_B571]=2;
961 else if (strcmp(*argv,"ecdh") == 0)
963 for (i=0; i < EC_NUM; i++)
969 BIO_printf(bio_err,"Error: bad option or value\n");
970 BIO_printf(bio_err,"\n");
971 BIO_printf(bio_err,"Available values:\n");
972 #ifndef OPENSSL_NO_MD2
973 BIO_printf(bio_err,"md2 ");
975 #ifndef OPENSSL_NO_MDC2
976 BIO_printf(bio_err,"mdc2 ");
978 #ifndef OPENSSL_NO_MD4
979 BIO_printf(bio_err,"md4 ");
981 #ifndef OPENSSL_NO_MD5
982 BIO_printf(bio_err,"md5 ");
983 #ifndef OPENSSL_NO_HMAC
984 BIO_printf(bio_err,"hmac ");
987 #ifndef OPENSSL_NO_SHA1
988 BIO_printf(bio_err,"sha1 ");
990 #ifndef OPENSSL_NO_SHA256
991 BIO_printf(bio_err,"sha256 ");
993 #ifndef OPENSSL_NO_SHA512
994 BIO_printf(bio_err,"sha512 ");
996 #ifndef OPENSSL_NO_WHIRLPOOL
997 BIO_printf(bio_err,"whirlpool");
999 #ifndef OPENSSL_NO_RIPEMD160
1000 BIO_printf(bio_err,"rmd160");
1002 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
1003 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
1004 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160) || \
1005 !defined(OPENSSL_NO_WHIRLPOOL)
1006 BIO_printf(bio_err,"\n");
1009 #ifndef OPENSSL_NO_IDEA
1010 BIO_printf(bio_err,"idea-cbc ");
1012 #ifndef OPENSSL_NO_SEED
1013 BIO_printf(bio_err,"seed-cbc ");
1015 #ifndef OPENSSL_NO_RC2
1016 BIO_printf(bio_err,"rc2-cbc ");
1018 #ifndef OPENSSL_NO_RC5
1019 BIO_printf(bio_err,"rc5-cbc ");
1021 #ifndef OPENSSL_NO_BF
1022 BIO_printf(bio_err,"bf-cbc");
1024 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_SEED) || !defined(OPENSSL_NO_RC2) || \
1025 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
1026 BIO_printf(bio_err,"\n");
1028 #ifndef OPENSSL_NO_DES
1029 BIO_printf(bio_err,"des-cbc des-ede3 ");
1031 #ifndef OPENSSL_NO_AES
1032 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
1033 BIO_printf(bio_err,"aes-128-ige aes-192-ige aes-256-ige ");
1035 #ifndef OPENSSL_NO_CAMELLIA
1036 BIO_printf(bio_err,"\n");
1037 BIO_printf(bio_err,"camellia-128-cbc camellia-192-cbc camellia-256-cbc ");
1039 #ifndef OPENSSL_NO_RC4
1040 BIO_printf(bio_err,"rc4");
1042 BIO_printf(bio_err,"\n");
1044 #ifndef OPENSSL_NO_RSA
1045 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
1048 #ifndef OPENSSL_NO_DSA
1049 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
1051 #ifndef OPENSSL_NO_ECDSA
1052 BIO_printf(bio_err,"ecdsap160 ecdsap192 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
1053 BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n");
1054 BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n");
1055 BIO_printf(bio_err,"ecdsa\n");
1057 #ifndef OPENSSL_NO_ECDH
1058 BIO_printf(bio_err,"ecdhp160 ecdhp192 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n");
1059 BIO_printf(bio_err,"ecdhk163 ecdhk233 ecdhk283 ecdhk409 ecdhk571\n");
1060 BIO_printf(bio_err,"ecdhb163 ecdhb233 ecdhb283 ecdhb409 ecdhb571\n");
1061 BIO_printf(bio_err,"ecdh\n");
1064 #ifndef OPENSSL_NO_IDEA
1065 BIO_printf(bio_err,"idea ");
1067 #ifndef OPENSSL_NO_SEED
1068 BIO_printf(bio_err,"seed ");
1070 #ifndef OPENSSL_NO_RC2
1071 BIO_printf(bio_err,"rc2 ");
1073 #ifndef OPENSSL_NO_DES
1074 BIO_printf(bio_err,"des ");
1076 #ifndef OPENSSL_NO_AES
1077 BIO_printf(bio_err,"aes ");
1079 #ifndef OPENSSL_NO_CAMELLIA
1080 BIO_printf(bio_err,"camellia ");
1082 #ifndef OPENSSL_NO_RSA
1083 BIO_printf(bio_err,"rsa ");
1085 #ifndef OPENSSL_NO_BF
1086 BIO_printf(bio_err,"blowfish");
1088 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_SEED) || \
1089 !defined(OPENSSL_NO_RC2) || !defined(OPENSSL_NO_DES) || \
1090 !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_BF) || \
1091 !defined(OPENSSL_NO_AES) || !defined(OPENSSL_NO_CAMELLIA)
1092 BIO_printf(bio_err,"\n");
1095 BIO_printf(bio_err,"\n");
1096 BIO_printf(bio_err,"Available options:\n");
1097 #if defined(TIMES) || defined(USE_TOD)
1098 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
1100 #ifndef OPENSSL_NO_ENGINE
1101 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
1103 BIO_printf(bio_err,"-evp e use EVP e.\n");
1104 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
1105 BIO_printf(bio_err,"-mr produce machine readable output.\n");
1107 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
1117 if(multi && do_multi(multi))
1123 for (i=0; i<ALGOR_NUM; i++)
1128 for (i=0; i<RSA_NUM; i++)
1130 for (i=0; i<DSA_NUM; i++)
1132 #ifndef OPENSSL_NO_ECDSA
1133 for (i=0; i<EC_NUM; i++)
1136 #ifndef OPENSSL_NO_ECDH
1137 for (i=0; i<EC_NUM; i++)
1141 for (i=0; i<ALGOR_NUM; i++)
1142 if (doit[i]) pr_header++;
1144 if (usertime == 0 && !mr)
1145 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
1147 #ifndef OPENSSL_NO_RSA
1148 for (i=0; i<RSA_NUM; i++)
1150 const unsigned char *p;
1153 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
1154 if (rsa_key[i] == NULL)
1156 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
1162 BIO_printf(bio_err,mr ? "+RK:%d:"
1163 : "Loaded RSA key, %d bit modulus and e= 0x",
1164 BN_num_bits(rsa_key[i]->n));
1165 BN_print(bio_err,rsa_key[i]->e);
1166 BIO_printf(bio_err,"\n");
1172 #ifndef OPENSSL_NO_DSA
1173 dsa_key[0]=get_dsa512();
1174 dsa_key[1]=get_dsa1024();
1175 dsa_key[2]=get_dsa2048();
1178 #ifndef OPENSSL_NO_DES
1179 DES_set_key_unchecked(&key,&sch);
1180 DES_set_key_unchecked(&key2,&sch2);
1181 DES_set_key_unchecked(&key3,&sch3);
1183 #ifndef OPENSSL_NO_AES
1184 AES_set_encrypt_key(key16,128,&aes_ks1);
1185 AES_set_encrypt_key(key24,192,&aes_ks2);
1186 AES_set_encrypt_key(key32,256,&aes_ks3);
1188 #ifndef OPENSSL_NO_CAMELLIA
1189 Camellia_set_key(key16,128,&camellia_ks1);
1190 Camellia_set_key(ckey24,192,&camellia_ks2);
1191 Camellia_set_key(ckey32,256,&camellia_ks3);
1193 #ifndef OPENSSL_NO_IDEA
1194 idea_set_encrypt_key(key16,&idea_ks);
1196 #ifndef OPENSSL_NO_SEED
1197 SEED_set_key(key16,&seed_ks);
1199 #ifndef OPENSSL_NO_RC4
1200 RC4_set_key(&rc4_ks,16,key16);
1202 #ifndef OPENSSL_NO_RC2
1203 RC2_set_key(&rc2_ks,16,key16,128);
1205 #ifndef OPENSSL_NO_RC5
1206 RC5_32_set_key(&rc5_ks,16,key16,12);
1208 #ifndef OPENSSL_NO_BF
1209 BF_set_key(&bf_ks,16,key16);
1211 #ifndef OPENSSL_NO_CAST
1212 CAST_set_key(&cast_ks,16,key16);
1214 #ifndef OPENSSL_NO_RSA
1215 memset(rsa_c,0,sizeof(rsa_c));
1218 #ifndef OPENSSL_NO_DES
1219 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
1225 for (it=count; it; it--)
1226 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
1231 c[D_MD2][0]=count/10;
1232 c[D_MDC2][0]=count/10;
1237 c[D_RMD160][0]=count;
1238 c[D_RC4][0]=count*5;
1239 c[D_CBC_DES][0]=count;
1240 c[D_EDE3_DES][0]=count/3;
1241 c[D_CBC_IDEA][0]=count;
1242 c[D_CBC_SEED][0]=count;
1243 c[D_CBC_RC2][0]=count;
1244 c[D_CBC_RC5][0]=count;
1245 c[D_CBC_BF][0]=count;
1246 c[D_CBC_CAST][0]=count;
1247 c[D_CBC_128_AES][0]=count;
1248 c[D_CBC_192_AES][0]=count;
1249 c[D_CBC_256_AES][0]=count;
1250 c[D_CBC_128_CML][0]=count;
1251 c[D_CBC_192_CML][0]=count;
1252 c[D_CBC_256_CML][0]=count;
1253 c[D_SHA256][0]=count;
1254 c[D_SHA512][0]=count;
1255 c[D_WHIRLPOOL][0]=count;
1256 c[D_IGE_128_AES][0]=count;
1257 c[D_IGE_192_AES][0]=count;
1258 c[D_IGE_256_AES][0]=count;
1260 for (i=1; i<SIZE_NUM; i++)
1262 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1263 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1264 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1265 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1266 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1267 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1268 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1269 c[D_SHA256][i]=c[D_SHA256][0]*4*lengths[0]/lengths[i];
1270 c[D_SHA512][i]=c[D_SHA512][0]*4*lengths[0]/lengths[i];
1271 c[D_WHIRLPOOL][i]=c[D_WHIRLPOOL][0]*4*lengths[0]/lengths[i];
1273 for (i=1; i<SIZE_NUM; i++)
1277 l0=(long)lengths[i-1];
1278 l1=(long)lengths[i];
1279 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1280 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1281 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1282 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1283 c[D_CBC_SEED][i]=c[D_CBC_SEED][i-1]*l0/l1;
1284 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1285 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1286 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1287 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1288 c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
1289 c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
1290 c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
1291 c[D_CBC_128_CML][i]=c[D_CBC_128_CML][i-1]*l0/l1;
1292 c[D_CBC_192_CML][i]=c[D_CBC_192_CML][i-1]*l0/l1;
1293 c[D_CBC_256_CML][i]=c[D_CBC_256_CML][i-1]*l0/l1;
1294 c[D_IGE_128_AES][i]=c[D_IGE_128_AES][i-1]*l0/l1;
1295 c[D_IGE_192_AES][i]=c[D_IGE_192_AES][i-1]*l0/l1;
1296 c[D_IGE_256_AES][i]=c[D_IGE_256_AES][i-1]*l0/l1;
1298 #ifndef OPENSSL_NO_RSA
1299 rsa_c[R_RSA_512][0]=count/2000;
1300 rsa_c[R_RSA_512][1]=count/400;
1301 for (i=1; i<RSA_NUM; i++)
1303 rsa_c[i][0]=rsa_c[i-1][0]/8;
1304 rsa_c[i][1]=rsa_c[i-1][1]/4;
1305 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1309 if (rsa_c[i][0] == 0)
1318 #ifndef OPENSSL_NO_DSA
1319 dsa_c[R_DSA_512][0]=count/1000;
1320 dsa_c[R_DSA_512][1]=count/1000/2;
1321 for (i=1; i<DSA_NUM; i++)
1323 dsa_c[i][0]=dsa_c[i-1][0]/4;
1324 dsa_c[i][1]=dsa_c[i-1][1]/4;
1325 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1338 #ifndef OPENSSL_NO_ECDSA
1339 ecdsa_c[R_EC_P160][0]=count/1000;
1340 ecdsa_c[R_EC_P160][1]=count/1000/2;
1341 for (i=R_EC_P192; i<=R_EC_P521; i++)
1343 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1344 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1345 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1349 if (ecdsa_c[i] == 0)
1356 ecdsa_c[R_EC_K163][0]=count/1000;
1357 ecdsa_c[R_EC_K163][1]=count/1000/2;
1358 for (i=R_EC_K233; i<=R_EC_K571; i++)
1360 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1361 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1362 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1366 if (ecdsa_c[i] == 0)
1373 ecdsa_c[R_EC_B163][0]=count/1000;
1374 ecdsa_c[R_EC_B163][1]=count/1000/2;
1375 for (i=R_EC_B233; i<=R_EC_B571; i++)
1377 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1378 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1379 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1383 if (ecdsa_c[i] == 0)
1392 #ifndef OPENSSL_NO_ECDH
1393 ecdh_c[R_EC_P160][0]=count/1000;
1394 ecdh_c[R_EC_P160][1]=count/1000;
1395 for (i=R_EC_P192; i<=R_EC_P521; i++)
1397 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1398 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1399 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1410 ecdh_c[R_EC_K163][0]=count/1000;
1411 ecdh_c[R_EC_K163][1]=count/1000;
1412 for (i=R_EC_K233; i<=R_EC_K571; i++)
1414 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1415 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1416 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1427 ecdh_c[R_EC_B163][0]=count/1000;
1428 ecdh_c[R_EC_B163][1]=count/1000;
1429 for (i=R_EC_B233; i<=R_EC_B571; i++)
1431 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1432 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1433 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1446 #define COND(d) (count < (d))
1447 #define COUNT(d) (d)
1449 /* not worth fixing */
1450 # error "You cannot disable DES on systems without SIGALRM."
1451 #endif /* OPENSSL_NO_DES */
1453 #define COND(c) (run)
1454 #define COUNT(d) (count)
1456 signal(SIGALRM,sig_done);
1458 #endif /* SIGALRM */
1460 #ifndef OPENSSL_NO_MD2
1463 for (j=0; j<SIZE_NUM; j++)
1465 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1467 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1468 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1470 print_result(D_MD2,j,count,d);
1474 #ifndef OPENSSL_NO_MDC2
1477 for (j=0; j<SIZE_NUM; j++)
1479 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1481 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1482 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1484 print_result(D_MDC2,j,count,d);
1489 #ifndef OPENSSL_NO_MD4
1492 for (j=0; j<SIZE_NUM; j++)
1494 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1496 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1497 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1499 print_result(D_MD4,j,count,d);
1504 #ifndef OPENSSL_NO_MD5
1507 for (j=0; j<SIZE_NUM; j++)
1509 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1511 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1512 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1514 print_result(D_MD5,j,count,d);
1519 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1524 HMAC_CTX_init(&hctx);
1525 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1526 16,EVP_md5(), NULL);
1528 for (j=0; j<SIZE_NUM; j++)
1530 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1532 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1534 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1535 HMAC_Update(&hctx,buf,lengths[j]);
1536 HMAC_Final(&hctx,&(hmac[0]),NULL);
1539 print_result(D_HMAC,j,count,d);
1541 HMAC_CTX_cleanup(&hctx);
1544 #ifndef OPENSSL_NO_SHA
1547 for (j=0; j<SIZE_NUM; j++)
1549 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1551 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1552 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1554 print_result(D_SHA1,j,count,d);
1558 #ifndef OPENSSL_NO_SHA256
1561 for (j=0; j<SIZE_NUM; j++)
1563 print_message(names[D_SHA256],c[D_SHA256][j],lengths[j]);
1565 for (count=0,run=1; COND(c[D_SHA256][j]); count++)
1566 SHA256(buf,lengths[j],sha256);
1568 print_result(D_SHA256,j,count,d);
1573 #ifndef OPENSSL_NO_SHA512
1576 for (j=0; j<SIZE_NUM; j++)
1578 print_message(names[D_SHA512],c[D_SHA512][j],lengths[j]);
1580 for (count=0,run=1; COND(c[D_SHA512][j]); count++)
1581 SHA512(buf,lengths[j],sha512);
1583 print_result(D_SHA512,j,count,d);
1589 #ifndef OPENSSL_NO_WHIRLPOOL
1590 if (doit[D_WHIRLPOOL])
1592 for (j=0; j<SIZE_NUM; j++)
1594 print_message(names[D_WHIRLPOOL],c[D_WHIRLPOOL][j],lengths[j]);
1596 for (count=0,run=1; COND(c[D_WHIRLPOOL][j]); count++)
1597 WHIRLPOOL(buf,lengths[j],whirlpool);
1599 print_result(D_WHIRLPOOL,j,count,d);
1604 #ifndef OPENSSL_NO_RIPEMD
1607 for (j=0; j<SIZE_NUM; j++)
1609 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1611 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1612 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1614 print_result(D_RMD160,j,count,d);
1618 #ifndef OPENSSL_NO_RC4
1621 for (j=0; j<SIZE_NUM; j++)
1623 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1625 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1626 RC4(&rc4_ks,(unsigned int)lengths[j],
1629 print_result(D_RC4,j,count,d);
1633 #ifndef OPENSSL_NO_DES
1634 if (doit[D_CBC_DES])
1636 for (j=0; j<SIZE_NUM; j++)
1638 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1640 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1641 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1642 &DES_iv,DES_ENCRYPT);
1644 print_result(D_CBC_DES,j,count,d);
1648 if (doit[D_EDE3_DES])
1650 for (j=0; j<SIZE_NUM; j++)
1652 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1654 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1655 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1657 &DES_iv,DES_ENCRYPT);
1659 print_result(D_EDE3_DES,j,count,d);
1663 #ifndef OPENSSL_NO_AES
1664 if (doit[D_CBC_128_AES])
1666 for (j=0; j<SIZE_NUM; j++)
1668 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1670 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1671 AES_cbc_encrypt(buf,buf,
1672 (unsigned long)lengths[j],&aes_ks1,
1675 print_result(D_CBC_128_AES,j,count,d);
1678 if (doit[D_CBC_192_AES])
1680 for (j=0; j<SIZE_NUM; j++)
1682 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1684 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1685 AES_cbc_encrypt(buf,buf,
1686 (unsigned long)lengths[j],&aes_ks2,
1689 print_result(D_CBC_192_AES,j,count,d);
1692 if (doit[D_CBC_256_AES])
1694 for (j=0; j<SIZE_NUM; j++)
1696 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1698 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1699 AES_cbc_encrypt(buf,buf,
1700 (unsigned long)lengths[j],&aes_ks3,
1703 print_result(D_CBC_256_AES,j,count,d);
1707 if (doit[D_IGE_128_AES])
1709 for (j=0; j<SIZE_NUM; j++)
1711 print_message(names[D_IGE_128_AES],c[D_IGE_128_AES][j],lengths[j]);
1713 for (count=0,run=1; COND(c[D_IGE_128_AES][j]); count++)
1714 AES_ige_encrypt(buf,buf2,
1715 (unsigned long)lengths[j],&aes_ks1,
1718 print_result(D_IGE_128_AES,j,count,d);
1721 if (doit[D_IGE_192_AES])
1723 for (j=0; j<SIZE_NUM; j++)
1725 print_message(names[D_IGE_192_AES],c[D_IGE_192_AES][j],lengths[j]);
1727 for (count=0,run=1; COND(c[D_IGE_192_AES][j]); count++)
1728 AES_ige_encrypt(buf,buf2,
1729 (unsigned long)lengths[j],&aes_ks2,
1732 print_result(D_IGE_192_AES,j,count,d);
1735 if (doit[D_IGE_256_AES])
1737 for (j=0; j<SIZE_NUM; j++)
1739 print_message(names[D_IGE_256_AES],c[D_IGE_256_AES][j],lengths[j]);
1741 for (count=0,run=1; COND(c[D_IGE_256_AES][j]); count++)
1742 AES_ige_encrypt(buf,buf2,
1743 (unsigned long)lengths[j],&aes_ks3,
1746 print_result(D_IGE_256_AES,j,count,d);
1752 #ifndef OPENSSL_NO_CAMELLIA
1753 if (doit[D_CBC_128_CML])
1755 for (j=0; j<SIZE_NUM; j++)
1757 print_message(names[D_CBC_128_CML],c[D_CBC_128_CML][j],lengths[j]);
1759 for (count=0,run=1; COND(c[D_CBC_128_CML][j]); count++)
1760 Camellia_cbc_encrypt(buf,buf,
1761 (unsigned long)lengths[j],&camellia_ks1,
1762 iv,CAMELLIA_ENCRYPT);
1764 print_result(D_CBC_128_CML,j,count,d);
1767 if (doit[D_CBC_192_CML])
1769 for (j=0; j<SIZE_NUM; j++)
1771 print_message(names[D_CBC_192_CML],c[D_CBC_192_CML][j],lengths[j]);
1773 for (count=0,run=1; COND(c[D_CBC_192_CML][j]); count++)
1774 Camellia_cbc_encrypt(buf,buf,
1775 (unsigned long)lengths[j],&camellia_ks2,
1776 iv,CAMELLIA_ENCRYPT);
1778 print_result(D_CBC_192_CML,j,count,d);
1781 if (doit[D_CBC_256_CML])
1783 for (j=0; j<SIZE_NUM; j++)
1785 print_message(names[D_CBC_256_CML],c[D_CBC_256_CML][j],lengths[j]);
1787 for (count=0,run=1; COND(c[D_CBC_256_CML][j]); count++)
1788 Camellia_cbc_encrypt(buf,buf,
1789 (unsigned long)lengths[j],&camellia_ks3,
1790 iv,CAMELLIA_ENCRYPT);
1792 print_result(D_CBC_256_CML,j,count,d);
1797 #ifndef OPENSSL_NO_IDEA
1798 if (doit[D_CBC_IDEA])
1800 for (j=0; j<SIZE_NUM; j++)
1802 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1804 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1805 idea_cbc_encrypt(buf,buf,
1806 (unsigned long)lengths[j],&idea_ks,
1809 print_result(D_CBC_IDEA,j,count,d);
1813 #ifndef OPENSSL_NO_SEED
1814 if (doit[D_CBC_SEED])
1816 for (j=0; j<SIZE_NUM; j++)
1818 print_message(names[D_CBC_SEED],c[D_CBC_SEED][j],lengths[j]);
1820 for (count=0,run=1; COND(c[D_CBC_SEED][j]); count++)
1821 SEED_cbc_encrypt(buf,buf,
1822 (unsigned long)lengths[j],&seed_ks,iv,1);
1824 print_result(D_CBC_SEED,j,count,d);
1828 #ifndef OPENSSL_NO_RC2
1829 if (doit[D_CBC_RC2])
1831 for (j=0; j<SIZE_NUM; j++)
1833 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1835 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1836 RC2_cbc_encrypt(buf,buf,
1837 (unsigned long)lengths[j],&rc2_ks,
1840 print_result(D_CBC_RC2,j,count,d);
1844 #ifndef OPENSSL_NO_RC5
1845 if (doit[D_CBC_RC5])
1847 for (j=0; j<SIZE_NUM; j++)
1849 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1851 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1852 RC5_32_cbc_encrypt(buf,buf,
1853 (unsigned long)lengths[j],&rc5_ks,
1856 print_result(D_CBC_RC5,j,count,d);
1860 #ifndef OPENSSL_NO_BF
1863 for (j=0; j<SIZE_NUM; j++)
1865 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1867 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1868 BF_cbc_encrypt(buf,buf,
1869 (unsigned long)lengths[j],&bf_ks,
1872 print_result(D_CBC_BF,j,count,d);
1876 #ifndef OPENSSL_NO_CAST
1877 if (doit[D_CBC_CAST])
1879 for (j=0; j<SIZE_NUM; j++)
1881 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1883 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1884 CAST_cbc_encrypt(buf,buf,
1885 (unsigned long)lengths[j],&cast_ks,
1888 print_result(D_CBC_CAST,j,count,d);
1895 for (j=0; j<SIZE_NUM; j++)
1902 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1903 /* -O3 -fschedule-insns messes up an
1904 * optimization here! names[D_EVP]
1905 * somehow becomes NULL */
1906 print_message(names[D_EVP],save_count,
1909 EVP_CIPHER_CTX_init(&ctx);
1911 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1913 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1914 EVP_CIPHER_CTX_set_padding(&ctx, 0);
1918 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1919 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1921 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1922 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1924 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1926 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1928 EVP_CIPHER_CTX_cleanup(&ctx);
1932 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1933 print_message(names[D_EVP],save_count,
1937 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1938 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1942 print_result(D_EVP,j,count,d);
1946 RAND_pseudo_bytes(buf,36);
1947 #ifndef OPENSSL_NO_RSA
1948 for (j=0; j<RSA_NUM; j++)
1951 if (!rsa_doit[j]) continue;
1952 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1955 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1956 ERR_print_errors(bio_err);
1961 pkey_print_message("private","rsa",
1962 rsa_c[j][0],rsa_bits[j],
1964 /* RSA_blinding_on(rsa_key[j],NULL); */
1966 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1968 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1969 &rsa_num, rsa_key[j]);
1973 "RSA sign failure\n");
1974 ERR_print_errors(bio_err);
1980 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1981 : "%ld %d bit private RSA's in %.2fs\n",
1982 count,rsa_bits[j],d);
1983 rsa_results[j][0]=d/(double)count;
1988 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1991 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1992 ERR_print_errors(bio_err);
1997 pkey_print_message("public","rsa",
1998 rsa_c[j][1],rsa_bits[j],
2001 for (count=0,run=1; COND(rsa_c[j][1]); count++)
2003 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
2004 rsa_num, rsa_key[j]);
2008 "RSA verify failure\n");
2009 ERR_print_errors(bio_err);
2015 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
2016 : "%ld %d bit public RSA's in %.2fs\n",
2017 count,rsa_bits[j],d);
2018 rsa_results[j][1]=d/(double)count;
2024 /* if longer than 10s, don't do any more */
2025 for (j++; j<RSA_NUM; j++)
2031 RAND_pseudo_bytes(buf,20);
2032 #ifndef OPENSSL_NO_DSA
2033 if (RAND_status() != 1)
2035 RAND_seed(rnd_seed, sizeof rnd_seed);
2038 for (j=0; j<DSA_NUM; j++)
2043 if (!dsa_doit[j]) continue;
2044 /* DSA_generate_key(dsa_key[j]); */
2045 /* DSA_sign_setup(dsa_key[j],NULL); */
2046 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
2050 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
2051 ERR_print_errors(bio_err);
2056 pkey_print_message("sign","dsa",
2057 dsa_c[j][0],dsa_bits[j],
2060 for (count=0,run=1; COND(dsa_c[j][0]); count++)
2062 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
2067 "DSA sign failure\n");
2068 ERR_print_errors(bio_err);
2074 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
2075 : "%ld %d bit DSA signs in %.2fs\n",
2076 count,dsa_bits[j],d);
2077 dsa_results[j][0]=d/(double)count;
2081 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
2085 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
2086 ERR_print_errors(bio_err);
2091 pkey_print_message("verify","dsa",
2092 dsa_c[j][1],dsa_bits[j],
2095 for (count=0,run=1; COND(dsa_c[j][1]); count++)
2097 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
2102 "DSA verify failure\n");
2103 ERR_print_errors(bio_err);
2109 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
2110 : "%ld %d bit DSA verify in %.2fs\n",
2111 count,dsa_bits[j],d);
2112 dsa_results[j][1]=d/(double)count;
2117 /* if longer than 10s, don't do any more */
2118 for (j++; j<DSA_NUM; j++)
2122 if (rnd_fake) RAND_cleanup();
2125 #ifndef OPENSSL_NO_ECDSA
2126 if (RAND_status() != 1)
2128 RAND_seed(rnd_seed, sizeof rnd_seed);
2131 for (j=0; j<EC_NUM; j++)
2135 if (!ecdsa_doit[j]) continue; /* Ignore Curve */
2136 ecdsa[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2137 if (ecdsa[j] == NULL)
2139 BIO_printf(bio_err,"ECDSA failure.\n");
2140 ERR_print_errors(bio_err);
2146 EC_KEY_precompute_mult(ecdsa[j], NULL);
2148 /* Perform ECDSA signature test */
2149 EC_KEY_generate_key(ecdsa[j]);
2150 ret = ECDSA_sign(0, buf, 20, ecdsasig,
2151 &ecdsasiglen, ecdsa[j]);
2154 BIO_printf(bio_err,"ECDSA sign failure. No ECDSA sign will be done.\n");
2155 ERR_print_errors(bio_err);
2160 pkey_print_message("sign","ecdsa",
2162 test_curves_bits[j],
2166 for (count=0,run=1; COND(ecdsa_c[j][0]);
2169 ret=ECDSA_sign(0, buf, 20,
2170 ecdsasig, &ecdsasiglen,
2174 BIO_printf(bio_err, "ECDSA sign failure\n");
2175 ERR_print_errors(bio_err);
2182 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
2183 "%ld %d bit ECDSA signs in %.2fs \n",
2184 count, test_curves_bits[j], d);
2185 ecdsa_results[j][0]=d/(double)count;
2189 /* Perform ECDSA verification test */
2190 ret=ECDSA_verify(0, buf, 20, ecdsasig,
2191 ecdsasiglen, ecdsa[j]);
2194 BIO_printf(bio_err,"ECDSA verify failure. No ECDSA verify will be done.\n");
2195 ERR_print_errors(bio_err);
2200 pkey_print_message("verify","ecdsa",
2202 test_curves_bits[j],
2205 for (count=0,run=1; COND(ecdsa_c[j][1]); count++)
2207 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
2210 BIO_printf(bio_err, "ECDSA verify failure\n");
2211 ERR_print_errors(bio_err);
2217 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
2218 : "%ld %d bit ECDSA verify in %.2fs\n",
2219 count, test_curves_bits[j], d);
2220 ecdsa_results[j][1]=d/(double)count;
2225 /* if longer than 10s, don't do any more */
2226 for (j++; j<EC_NUM; j++)
2231 if (rnd_fake) RAND_cleanup();
2234 #ifndef OPENSSL_NO_ECDH
2235 if (RAND_status() != 1)
2237 RAND_seed(rnd_seed, sizeof rnd_seed);
2240 for (j=0; j<EC_NUM; j++)
2242 if (!ecdh_doit[j]) continue;
2243 ecdh_a[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2244 ecdh_b[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2245 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2247 BIO_printf(bio_err,"ECDH failure.\n");
2248 ERR_print_errors(bio_err);
2253 /* generate two ECDH key pairs */
2254 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2255 !EC_KEY_generate_key(ecdh_b[j]))
2257 BIO_printf(bio_err,"ECDH key generation failure.\n");
2258 ERR_print_errors(bio_err);
2263 /* If field size is not more than 24 octets, then use SHA-1 hash of result;
2264 * otherwise, use result (see section 4.8 of draft-ietf-tls-ecc-03.txt).
2266 int field_size, outlen;
2267 void *(*kdf)(const void *in, size_t inlen, void *out, size_t *xoutlen);
2268 field_size = EC_GROUP_get_degree(EC_KEY_get0_group(ecdh_a[j]));
2269 if (field_size <= 24 * 8)
2271 outlen = KDF1_SHA1_len;
2276 outlen = (field_size+7)/8;
2279 secret_size_a = ECDH_compute_key(secret_a, outlen,
2280 EC_KEY_get0_public_key(ecdh_b[j]),
2282 secret_size_b = ECDH_compute_key(secret_b, outlen,
2283 EC_KEY_get0_public_key(ecdh_a[j]),
2285 if (secret_size_a != secret_size_b)
2290 for (secret_idx = 0;
2291 (secret_idx < secret_size_a)
2292 && (ecdh_checks == 1);
2295 if (secret_a[secret_idx] != secret_b[secret_idx])
2299 if (ecdh_checks == 0)
2301 BIO_printf(bio_err,"ECDH computations don't match.\n");
2302 ERR_print_errors(bio_err);
2306 pkey_print_message("","ecdh",
2308 test_curves_bits[j],
2311 for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2313 ECDH_compute_key(secret_a, outlen,
2314 EC_KEY_get0_public_key(ecdh_b[j]),
2318 BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2319 count, test_curves_bits[j], d);
2320 ecdh_results[j][0]=d/(double)count;
2328 /* if longer than 10s, don't do any more */
2329 for (j++; j<EC_NUM; j++)
2333 if (rnd_fake) RAND_cleanup();
2340 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
2341 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
2343 printf("%s ",BN_options());
2344 #ifndef OPENSSL_NO_MD2
2345 printf("%s ",MD2_options());
2347 #ifndef OPENSSL_NO_RC4
2348 printf("%s ",RC4_options());
2350 #ifndef OPENSSL_NO_DES
2351 printf("%s ",DES_options());
2353 #ifndef OPENSSL_NO_AES
2354 printf("%s ",AES_options());
2356 #ifndef OPENSSL_NO_IDEA
2357 printf("%s ",idea_options());
2359 #ifndef OPENSSL_NO_BF
2360 printf("%s ",BF_options());
2362 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2368 fprintf(stdout,"+H");
2371 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
2372 fprintf(stdout,"type ");
2374 for (j=0; j<SIZE_NUM; j++)
2375 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
2376 fprintf(stdout,"\n");
2379 for (k=0; k<ALGOR_NUM; k++)
2381 if (!doit[k]) continue;
2383 fprintf(stdout,"+F:%d:%s",k,names[k]);
2385 fprintf(stdout,"%-13s",names[k]);
2386 for (j=0; j<SIZE_NUM; j++)
2388 if (results[k][j] > 10000 && !mr)
2389 fprintf(stdout," %11.2fk",results[k][j]/1e3);
2391 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
2393 fprintf(stdout,"\n");
2395 #ifndef OPENSSL_NO_RSA
2397 for (k=0; k<RSA_NUM; k++)
2399 if (!rsa_doit[k]) continue;
2402 printf("%18ssign verify sign/s verify/s\n"," ");
2406 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2407 k,rsa_bits[k],rsa_results[k][0],
2410 fprintf(stdout,"rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2411 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2412 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
2415 #ifndef OPENSSL_NO_DSA
2417 for (k=0; k<DSA_NUM; k++)
2419 if (!dsa_doit[k]) continue;
2422 printf("%18ssign verify sign/s verify/s\n"," ");
2426 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2427 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2429 fprintf(stdout,"dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2430 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2431 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
2434 #ifndef OPENSSL_NO_ECDSA
2436 for (k=0; k<EC_NUM; k++)
2438 if (!ecdsa_doit[k]) continue;
2441 printf("%30ssign verify sign/s verify/s\n"," ");
2446 fprintf(stdout,"+F4:%u:%u:%f:%f\n",
2447 k, test_curves_bits[k],
2448 ecdsa_results[k][0],ecdsa_results[k][1]);
2451 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2452 test_curves_bits[k],
2453 test_curves_names[k],
2454 ecdsa_results[k][0],ecdsa_results[k][1],
2455 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2460 #ifndef OPENSSL_NO_ECDH
2462 for (k=0; k<EC_NUM; k++)
2464 if (!ecdh_doit[k]) continue;
2467 printf("%30sop op/s\n"," ");
2471 fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2472 k, test_curves_bits[k],
2473 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2476 fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2477 test_curves_bits[k],
2478 test_curves_names[k],
2479 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2486 ERR_print_errors(bio_err);
2487 if (buf != NULL) OPENSSL_free(buf);
2488 if (buf2 != NULL) OPENSSL_free(buf2);
2489 #ifndef OPENSSL_NO_RSA
2490 for (i=0; i<RSA_NUM; i++)
2491 if (rsa_key[i] != NULL)
2492 RSA_free(rsa_key[i]);
2494 #ifndef OPENSSL_NO_DSA
2495 for (i=0; i<DSA_NUM; i++)
2496 if (dsa_key[i] != NULL)
2497 DSA_free(dsa_key[i]);
2500 #ifndef OPENSSL_NO_ECDSA
2501 for (i=0; i<EC_NUM; i++)
2502 if (ecdsa[i] != NULL)
2503 EC_KEY_free(ecdsa[i]);
2505 #ifndef OPENSSL_NO_ECDH
2506 for (i=0; i<EC_NUM; i++)
2508 if (ecdh_a[i] != NULL)
2509 EC_KEY_free(ecdh_a[i]);
2510 if (ecdh_b[i] != NULL)
2511 EC_KEY_free(ecdh_b[i]);
2519 static void print_message(const char *s, long num, int length)
2522 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2523 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
2524 (void)BIO_flush(bio_err);
2527 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2528 : "Doing %s %ld times on %d size blocks: ",s,num,length);
2529 (void)BIO_flush(bio_err);
2536 static void pkey_print_message(const char *str, const char *str2, long num,
2540 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2541 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
2542 (void)BIO_flush(bio_err);
2545 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2546 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
2547 (void)BIO_flush(bio_err);
2554 static void print_result(int alg,int run_no,int count,double time_used)
2556 BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n"
2557 : "%d %s's in %.2fs\n",count,names[alg],time_used);
2558 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2562 static char *sstrsep(char **string, const char *delim)
2565 char *token = *string;
2570 memset(isdelim, 0, sizeof isdelim);
2575 isdelim[(unsigned char)(*delim)] = 1;
2579 while (!isdelim[(unsigned char)(**string)])
2593 static int do_multi(int multi)
2598 static char sep[]=":";
2600 fds=malloc(multi*sizeof *fds);
2601 for(n=0 ; n < multi ; ++n)
2622 printf("Forked child %d\n",n);
2625 /* for now, assume the pipe is long enough to take all the output */
2626 for(n=0 ; n < multi ; ++n)
2632 f=fdopen(fds[n],"r");
2633 while(fgets(buf,sizeof buf,f))
2640 fprintf(stderr,"Don't understand line '%s' from child %d\n",
2644 printf("Got: %s from %d\n",buf,n);
2645 if(!strncmp(buf,"+F:",3))
2651 alg=atoi(sstrsep(&p,sep));
2653 for(j=0 ; j < SIZE_NUM ; ++j)
2654 results[alg][j]+=atof(sstrsep(&p,sep));
2656 else if(!strncmp(buf,"+F2:",4))
2662 k=atoi(sstrsep(&p,sep));
2665 d=atof(sstrsep(&p,sep));
2667 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2669 rsa_results[k][0]=d;
2671 d=atof(sstrsep(&p,sep));
2673 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2675 rsa_results[k][1]=d;
2677 else if(!strncmp(buf,"+F2:",4))
2683 k=atoi(sstrsep(&p,sep));
2686 d=atof(sstrsep(&p,sep));
2688 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2690 rsa_results[k][0]=d;
2692 d=atof(sstrsep(&p,sep));
2694 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2696 rsa_results[k][1]=d;
2698 else if(!strncmp(buf,"+F3:",4))
2704 k=atoi(sstrsep(&p,sep));
2707 d=atof(sstrsep(&p,sep));
2709 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2711 dsa_results[k][0]=d;
2713 d=atof(sstrsep(&p,sep));
2715 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2717 dsa_results[k][1]=d;
2719 #ifndef OPENSSL_NO_ECDSA
2720 else if(!strncmp(buf,"+F4:",4))
2726 k=atoi(sstrsep(&p,sep));
2729 d=atof(sstrsep(&p,sep));
2731 ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2733 ecdsa_results[k][0]=d;
2735 d=atof(sstrsep(&p,sep));
2737 ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2739 ecdsa_results[k][1]=d;
2743 #ifndef OPENSSL_NO_ECDH
2744 else if(!strncmp(buf,"+F5:",4))
2750 k=atoi(sstrsep(&p,sep));
2753 d=atof(sstrsep(&p,sep));
2755 ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2757 ecdh_results[k][0]=d;
2762 else if(!strncmp(buf,"+H:",3))
2766 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);