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++)
1133 for (i=0; i<ALGOR_NUM; i++)
1134 if (doit[i]) pr_header++;
1136 if (usertime == 0 && !mr)
1137 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
1139 #ifndef OPENSSL_NO_RSA
1140 for (i=0; i<RSA_NUM; i++)
1142 const unsigned char *p;
1145 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
1146 if (rsa_key[i] == NULL)
1148 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
1154 BIO_printf(bio_err,mr ? "+RK:%d:"
1155 : "Loaded RSA key, %d bit modulus and e= 0x",
1156 BN_num_bits(rsa_key[i]->n));
1157 BN_print(bio_err,rsa_key[i]->e);
1158 BIO_printf(bio_err,"\n");
1164 #ifndef OPENSSL_NO_DSA
1165 dsa_key[0]=get_dsa512();
1166 dsa_key[1]=get_dsa1024();
1167 dsa_key[2]=get_dsa2048();
1170 #ifndef OPENSSL_NO_DES
1171 DES_set_key_unchecked(&key,&sch);
1172 DES_set_key_unchecked(&key2,&sch2);
1173 DES_set_key_unchecked(&key3,&sch3);
1175 #ifndef OPENSSL_NO_AES
1176 AES_set_encrypt_key(key16,128,&aes_ks1);
1177 AES_set_encrypt_key(key24,192,&aes_ks2);
1178 AES_set_encrypt_key(key32,256,&aes_ks3);
1180 #ifndef OPENSSL_NO_CAMELLIA
1181 Camellia_set_key(key16,128,&camellia_ks1);
1182 Camellia_set_key(ckey24,192,&camellia_ks2);
1183 Camellia_set_key(ckey32,256,&camellia_ks3);
1185 #ifndef OPENSSL_NO_IDEA
1186 idea_set_encrypt_key(key16,&idea_ks);
1188 #ifndef OPENSSL_NO_SEED
1189 SEED_set_key(key16,&seed_ks);
1191 #ifndef OPENSSL_NO_RC4
1192 RC4_set_key(&rc4_ks,16,key16);
1194 #ifndef OPENSSL_NO_RC2
1195 RC2_set_key(&rc2_ks,16,key16,128);
1197 #ifndef OPENSSL_NO_RC5
1198 RC5_32_set_key(&rc5_ks,16,key16,12);
1200 #ifndef OPENSSL_NO_BF
1201 BF_set_key(&bf_ks,16,key16);
1203 #ifndef OPENSSL_NO_CAST
1204 CAST_set_key(&cast_ks,16,key16);
1206 #ifndef OPENSSL_NO_RSA
1207 memset(rsa_c,0,sizeof(rsa_c));
1210 #ifndef OPENSSL_NO_DES
1211 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
1217 for (it=count; it; it--)
1218 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
1223 c[D_MD2][0]=count/10;
1224 c[D_MDC2][0]=count/10;
1229 c[D_RMD160][0]=count;
1230 c[D_RC4][0]=count*5;
1231 c[D_CBC_DES][0]=count;
1232 c[D_EDE3_DES][0]=count/3;
1233 c[D_CBC_IDEA][0]=count;
1234 c[D_CBC_SEED][0]=count;
1235 c[D_CBC_RC2][0]=count;
1236 c[D_CBC_RC5][0]=count;
1237 c[D_CBC_BF][0]=count;
1238 c[D_CBC_CAST][0]=count;
1239 c[D_CBC_128_AES][0]=count;
1240 c[D_CBC_192_AES][0]=count;
1241 c[D_CBC_256_AES][0]=count;
1242 c[D_CBC_128_CML][0]=count;
1243 c[D_CBC_192_CML][0]=count;
1244 c[D_CBC_256_CML][0]=count;
1245 c[D_SHA256][0]=count;
1246 c[D_SHA512][0]=count;
1247 c[D_WHIRLPOOL][0]=count;
1248 c[D_IGE_128_AES][0]=count;
1249 c[D_IGE_192_AES][0]=count;
1250 c[D_IGE_256_AES][0]=count;
1252 for (i=1; i<SIZE_NUM; i++)
1254 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1255 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1256 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1257 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1258 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1259 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1260 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1261 c[D_SHA256][i]=c[D_SHA256][0]*4*lengths[0]/lengths[i];
1262 c[D_SHA512][i]=c[D_SHA512][0]*4*lengths[0]/lengths[i];
1263 c[D_WHIRLPOOL][i]=c[D_WHIRLPOOL][0]*4*lengths[0]/lengths[i];
1265 for (i=1; i<SIZE_NUM; i++)
1269 l0=(long)lengths[i-1];
1270 l1=(long)lengths[i];
1271 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1272 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1273 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1274 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1275 c[D_CBC_SEED][i]=c[D_CBC_SEED][i-1]*l0/l1;
1276 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1277 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1278 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1279 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1280 c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
1281 c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
1282 c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
1283 c[D_CBC_128_CML][i]=c[D_CBC_128_CML][i-1]*l0/l1;
1284 c[D_CBC_192_CML][i]=c[D_CBC_192_CML][i-1]*l0/l1;
1285 c[D_CBC_256_CML][i]=c[D_CBC_256_CML][i-1]*l0/l1;
1286 c[D_IGE_128_AES][i]=c[D_IGE_128_AES][i-1]*l0/l1;
1287 c[D_IGE_192_AES][i]=c[D_IGE_192_AES][i-1]*l0/l1;
1288 c[D_IGE_256_AES][i]=c[D_IGE_256_AES][i-1]*l0/l1;
1290 #ifndef OPENSSL_NO_RSA
1291 rsa_c[R_RSA_512][0]=count/2000;
1292 rsa_c[R_RSA_512][1]=count/400;
1293 for (i=1; i<RSA_NUM; i++)
1295 rsa_c[i][0]=rsa_c[i-1][0]/8;
1296 rsa_c[i][1]=rsa_c[i-1][1]/4;
1297 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1301 if (rsa_c[i][0] == 0)
1310 #ifndef OPENSSL_NO_DSA
1311 dsa_c[R_DSA_512][0]=count/1000;
1312 dsa_c[R_DSA_512][1]=count/1000/2;
1313 for (i=1; i<DSA_NUM; i++)
1315 dsa_c[i][0]=dsa_c[i-1][0]/4;
1316 dsa_c[i][1]=dsa_c[i-1][1]/4;
1317 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1330 #ifndef OPENSSL_NO_ECDSA
1331 ecdsa_c[R_EC_P160][0]=count/1000;
1332 ecdsa_c[R_EC_P160][1]=count/1000/2;
1333 for (i=R_EC_P192; i<=R_EC_P521; i++)
1335 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1336 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1337 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1341 if (ecdsa_c[i] == 0)
1348 ecdsa_c[R_EC_K163][0]=count/1000;
1349 ecdsa_c[R_EC_K163][1]=count/1000/2;
1350 for (i=R_EC_K233; i<=R_EC_K571; i++)
1352 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1353 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1354 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1358 if (ecdsa_c[i] == 0)
1365 ecdsa_c[R_EC_B163][0]=count/1000;
1366 ecdsa_c[R_EC_B163][1]=count/1000/2;
1367 for (i=R_EC_B233; i<=R_EC_B571; i++)
1369 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1370 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1371 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1375 if (ecdsa_c[i] == 0)
1384 #ifndef OPENSSL_NO_ECDH
1385 ecdh_c[R_EC_P160][0]=count/1000;
1386 ecdh_c[R_EC_P160][1]=count/1000;
1387 for (i=R_EC_P192; i<=R_EC_P521; i++)
1389 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1390 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1391 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1402 ecdh_c[R_EC_K163][0]=count/1000;
1403 ecdh_c[R_EC_K163][1]=count/1000;
1404 for (i=R_EC_K233; i<=R_EC_K571; i++)
1406 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1407 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1408 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1419 ecdh_c[R_EC_B163][0]=count/1000;
1420 ecdh_c[R_EC_B163][1]=count/1000;
1421 for (i=R_EC_B233; i<=R_EC_B571; i++)
1423 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1424 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1425 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1438 #define COND(d) (count < (d))
1439 #define COUNT(d) (d)
1441 /* not worth fixing */
1442 # error "You cannot disable DES on systems without SIGALRM."
1443 #endif /* OPENSSL_NO_DES */
1445 #define COND(c) (run)
1446 #define COUNT(d) (count)
1448 signal(SIGALRM,sig_done);
1450 #endif /* SIGALRM */
1452 #ifndef OPENSSL_NO_MD2
1455 for (j=0; j<SIZE_NUM; j++)
1457 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1459 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1460 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1462 print_result(D_MD2,j,count,d);
1466 #ifndef OPENSSL_NO_MDC2
1469 for (j=0; j<SIZE_NUM; j++)
1471 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1473 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1474 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1476 print_result(D_MDC2,j,count,d);
1481 #ifndef OPENSSL_NO_MD4
1484 for (j=0; j<SIZE_NUM; j++)
1486 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1488 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1489 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1491 print_result(D_MD4,j,count,d);
1496 #ifndef OPENSSL_NO_MD5
1499 for (j=0; j<SIZE_NUM; j++)
1501 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1503 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1504 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1506 print_result(D_MD5,j,count,d);
1511 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1516 HMAC_CTX_init(&hctx);
1517 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1518 16,EVP_md5(), NULL);
1520 for (j=0; j<SIZE_NUM; j++)
1522 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1524 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1526 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1527 HMAC_Update(&hctx,buf,lengths[j]);
1528 HMAC_Final(&hctx,&(hmac[0]),NULL);
1531 print_result(D_HMAC,j,count,d);
1533 HMAC_CTX_cleanup(&hctx);
1536 #ifndef OPENSSL_NO_SHA
1539 for (j=0; j<SIZE_NUM; j++)
1541 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1543 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1544 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1546 print_result(D_SHA1,j,count,d);
1550 #ifndef OPENSSL_NO_SHA256
1553 for (j=0; j<SIZE_NUM; j++)
1555 print_message(names[D_SHA256],c[D_SHA256][j],lengths[j]);
1557 for (count=0,run=1; COND(c[D_SHA256][j]); count++)
1558 SHA256(buf,lengths[j],sha256);
1560 print_result(D_SHA256,j,count,d);
1565 #ifndef OPENSSL_NO_SHA512
1568 for (j=0; j<SIZE_NUM; j++)
1570 print_message(names[D_SHA512],c[D_SHA512][j],lengths[j]);
1572 for (count=0,run=1; COND(c[D_SHA512][j]); count++)
1573 SHA512(buf,lengths[j],sha512);
1575 print_result(D_SHA512,j,count,d);
1581 #ifndef OPENSSL_NO_WHIRLPOOL
1582 if (doit[D_WHIRLPOOL])
1584 for (j=0; j<SIZE_NUM; j++)
1586 print_message(names[D_WHIRLPOOL],c[D_WHIRLPOOL][j],lengths[j]);
1588 for (count=0,run=1; COND(c[D_WHIRLPOOL][j]); count++)
1589 WHIRLPOOL(buf,lengths[j],whirlpool);
1591 print_result(D_WHIRLPOOL,j,count,d);
1596 #ifndef OPENSSL_NO_RIPEMD
1599 for (j=0; j<SIZE_NUM; j++)
1601 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1603 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1604 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1606 print_result(D_RMD160,j,count,d);
1610 #ifndef OPENSSL_NO_RC4
1613 for (j=0; j<SIZE_NUM; j++)
1615 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1617 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1618 RC4(&rc4_ks,(unsigned int)lengths[j],
1621 print_result(D_RC4,j,count,d);
1625 #ifndef OPENSSL_NO_DES
1626 if (doit[D_CBC_DES])
1628 for (j=0; j<SIZE_NUM; j++)
1630 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1632 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1633 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1634 &DES_iv,DES_ENCRYPT);
1636 print_result(D_CBC_DES,j,count,d);
1640 if (doit[D_EDE3_DES])
1642 for (j=0; j<SIZE_NUM; j++)
1644 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1646 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1647 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1649 &DES_iv,DES_ENCRYPT);
1651 print_result(D_EDE3_DES,j,count,d);
1655 #ifndef OPENSSL_NO_AES
1656 if (doit[D_CBC_128_AES])
1658 for (j=0; j<SIZE_NUM; j++)
1660 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1662 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1663 AES_cbc_encrypt(buf,buf,
1664 (unsigned long)lengths[j],&aes_ks1,
1667 print_result(D_CBC_128_AES,j,count,d);
1670 if (doit[D_CBC_192_AES])
1672 for (j=0; j<SIZE_NUM; j++)
1674 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1676 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1677 AES_cbc_encrypt(buf,buf,
1678 (unsigned long)lengths[j],&aes_ks2,
1681 print_result(D_CBC_192_AES,j,count,d);
1684 if (doit[D_CBC_256_AES])
1686 for (j=0; j<SIZE_NUM; j++)
1688 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1690 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1691 AES_cbc_encrypt(buf,buf,
1692 (unsigned long)lengths[j],&aes_ks3,
1695 print_result(D_CBC_256_AES,j,count,d);
1699 if (doit[D_IGE_128_AES])
1701 for (j=0; j<SIZE_NUM; j++)
1703 print_message(names[D_IGE_128_AES],c[D_IGE_128_AES][j],lengths[j]);
1705 for (count=0,run=1; COND(c[D_IGE_128_AES][j]); count++)
1706 AES_ige_encrypt(buf,buf2,
1707 (unsigned long)lengths[j],&aes_ks1,
1710 print_result(D_IGE_128_AES,j,count,d);
1713 if (doit[D_IGE_192_AES])
1715 for (j=0; j<SIZE_NUM; j++)
1717 print_message(names[D_IGE_192_AES],c[D_IGE_192_AES][j],lengths[j]);
1719 for (count=0,run=1; COND(c[D_IGE_192_AES][j]); count++)
1720 AES_ige_encrypt(buf,buf2,
1721 (unsigned long)lengths[j],&aes_ks2,
1724 print_result(D_IGE_192_AES,j,count,d);
1727 if (doit[D_IGE_256_AES])
1729 for (j=0; j<SIZE_NUM; j++)
1731 print_message(names[D_IGE_256_AES],c[D_IGE_256_AES][j],lengths[j]);
1733 for (count=0,run=1; COND(c[D_IGE_256_AES][j]); count++)
1734 AES_ige_encrypt(buf,buf2,
1735 (unsigned long)lengths[j],&aes_ks3,
1738 print_result(D_IGE_256_AES,j,count,d);
1744 #ifndef OPENSSL_NO_CAMELLIA
1745 if (doit[D_CBC_128_CML])
1747 for (j=0; j<SIZE_NUM; j++)
1749 print_message(names[D_CBC_128_CML],c[D_CBC_128_CML][j],lengths[j]);
1751 for (count=0,run=1; COND(c[D_CBC_128_CML][j]); count++)
1752 Camellia_cbc_encrypt(buf,buf,
1753 (unsigned long)lengths[j],&camellia_ks1,
1754 iv,CAMELLIA_ENCRYPT);
1756 print_result(D_CBC_128_CML,j,count,d);
1759 if (doit[D_CBC_192_CML])
1761 for (j=0; j<SIZE_NUM; j++)
1763 print_message(names[D_CBC_192_CML],c[D_CBC_192_CML][j],lengths[j]);
1765 for (count=0,run=1; COND(c[D_CBC_192_CML][j]); count++)
1766 Camellia_cbc_encrypt(buf,buf,
1767 (unsigned long)lengths[j],&camellia_ks2,
1768 iv,CAMELLIA_ENCRYPT);
1770 print_result(D_CBC_192_CML,j,count,d);
1773 if (doit[D_CBC_256_CML])
1775 for (j=0; j<SIZE_NUM; j++)
1777 print_message(names[D_CBC_256_CML],c[D_CBC_256_CML][j],lengths[j]);
1779 for (count=0,run=1; COND(c[D_CBC_256_CML][j]); count++)
1780 Camellia_cbc_encrypt(buf,buf,
1781 (unsigned long)lengths[j],&camellia_ks3,
1782 iv,CAMELLIA_ENCRYPT);
1784 print_result(D_CBC_256_CML,j,count,d);
1789 #ifndef OPENSSL_NO_IDEA
1790 if (doit[D_CBC_IDEA])
1792 for (j=0; j<SIZE_NUM; j++)
1794 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1796 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1797 idea_cbc_encrypt(buf,buf,
1798 (unsigned long)lengths[j],&idea_ks,
1801 print_result(D_CBC_IDEA,j,count,d);
1805 #ifndef OPENSSL_NO_SEED
1806 if (doit[D_CBC_SEED])
1808 for (j=0; j<SIZE_NUM; j++)
1810 print_message(names[D_CBC_SEED],c[D_CBC_SEED][j],lengths[j]);
1812 for (count=0,run=1; COND(c[D_CBC_SEED][j]); count++)
1813 SEED_cbc_encrypt(buf,buf,
1814 (unsigned long)lengths[j],&seed_ks,iv,1);
1816 print_result(D_CBC_SEED,j,count,d);
1820 #ifndef OPENSSL_NO_RC2
1821 if (doit[D_CBC_RC2])
1823 for (j=0; j<SIZE_NUM; j++)
1825 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1827 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1828 RC2_cbc_encrypt(buf,buf,
1829 (unsigned long)lengths[j],&rc2_ks,
1832 print_result(D_CBC_RC2,j,count,d);
1836 #ifndef OPENSSL_NO_RC5
1837 if (doit[D_CBC_RC5])
1839 for (j=0; j<SIZE_NUM; j++)
1841 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1843 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1844 RC5_32_cbc_encrypt(buf,buf,
1845 (unsigned long)lengths[j],&rc5_ks,
1848 print_result(D_CBC_RC5,j,count,d);
1852 #ifndef OPENSSL_NO_BF
1855 for (j=0; j<SIZE_NUM; j++)
1857 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1859 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1860 BF_cbc_encrypt(buf,buf,
1861 (unsigned long)lengths[j],&bf_ks,
1864 print_result(D_CBC_BF,j,count,d);
1868 #ifndef OPENSSL_NO_CAST
1869 if (doit[D_CBC_CAST])
1871 for (j=0; j<SIZE_NUM; j++)
1873 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1875 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1876 CAST_cbc_encrypt(buf,buf,
1877 (unsigned long)lengths[j],&cast_ks,
1880 print_result(D_CBC_CAST,j,count,d);
1887 for (j=0; j<SIZE_NUM; j++)
1894 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1895 /* -O3 -fschedule-insns messes up an
1896 * optimization here! names[D_EVP]
1897 * somehow becomes NULL */
1898 print_message(names[D_EVP],save_count,
1901 EVP_CIPHER_CTX_init(&ctx);
1903 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1905 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1906 EVP_CIPHER_CTX_set_padding(&ctx, 0);
1910 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1911 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1913 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1914 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1916 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1918 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1920 EVP_CIPHER_CTX_cleanup(&ctx);
1924 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1925 print_message(names[D_EVP],save_count,
1929 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1930 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1934 print_result(D_EVP,j,count,d);
1938 RAND_pseudo_bytes(buf,36);
1939 #ifndef OPENSSL_NO_RSA
1940 for (j=0; j<RSA_NUM; j++)
1943 if (!rsa_doit[j]) continue;
1944 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1947 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1948 ERR_print_errors(bio_err);
1953 pkey_print_message("private","rsa",
1954 rsa_c[j][0],rsa_bits[j],
1956 /* RSA_blinding_on(rsa_key[j],NULL); */
1958 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1960 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1961 &rsa_num, rsa_key[j]);
1965 "RSA sign failure\n");
1966 ERR_print_errors(bio_err);
1972 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1973 : "%ld %d bit private RSA's in %.2fs\n",
1974 count,rsa_bits[j],d);
1975 rsa_results[j][0]=d/(double)count;
1980 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1983 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1984 ERR_print_errors(bio_err);
1989 pkey_print_message("public","rsa",
1990 rsa_c[j][1],rsa_bits[j],
1993 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1995 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1996 rsa_num, rsa_key[j]);
2000 "RSA verify failure\n");
2001 ERR_print_errors(bio_err);
2007 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
2008 : "%ld %d bit public RSA's in %.2fs\n",
2009 count,rsa_bits[j],d);
2010 rsa_results[j][1]=d/(double)count;
2016 /* if longer than 10s, don't do any more */
2017 for (j++; j<RSA_NUM; j++)
2023 RAND_pseudo_bytes(buf,20);
2024 #ifndef OPENSSL_NO_DSA
2025 if (RAND_status() != 1)
2027 RAND_seed(rnd_seed, sizeof rnd_seed);
2030 for (j=0; j<DSA_NUM; j++)
2035 if (!dsa_doit[j]) continue;
2036 /* DSA_generate_key(dsa_key[j]); */
2037 /* DSA_sign_setup(dsa_key[j],NULL); */
2038 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
2042 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
2043 ERR_print_errors(bio_err);
2048 pkey_print_message("sign","dsa",
2049 dsa_c[j][0],dsa_bits[j],
2052 for (count=0,run=1; COND(dsa_c[j][0]); count++)
2054 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
2059 "DSA sign failure\n");
2060 ERR_print_errors(bio_err);
2066 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
2067 : "%ld %d bit DSA signs in %.2fs\n",
2068 count,dsa_bits[j],d);
2069 dsa_results[j][0]=d/(double)count;
2073 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
2077 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
2078 ERR_print_errors(bio_err);
2083 pkey_print_message("verify","dsa",
2084 dsa_c[j][1],dsa_bits[j],
2087 for (count=0,run=1; COND(dsa_c[j][1]); count++)
2089 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
2094 "DSA verify failure\n");
2095 ERR_print_errors(bio_err);
2101 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
2102 : "%ld %d bit DSA verify in %.2fs\n",
2103 count,dsa_bits[j],d);
2104 dsa_results[j][1]=d/(double)count;
2109 /* if longer than 10s, don't do any more */
2110 for (j++; j<DSA_NUM; j++)
2114 if (rnd_fake) RAND_cleanup();
2117 #ifndef OPENSSL_NO_ECDSA
2118 if (RAND_status() != 1)
2120 RAND_seed(rnd_seed, sizeof rnd_seed);
2123 for (j=0; j<EC_NUM; j++)
2127 if (!ecdsa_doit[j]) continue; /* Ignore Curve */
2128 ecdsa[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2129 if (ecdsa[j] == NULL)
2131 BIO_printf(bio_err,"ECDSA failure.\n");
2132 ERR_print_errors(bio_err);
2138 EC_KEY_precompute_mult(ecdsa[j], NULL);
2140 /* Perform ECDSA signature test */
2141 EC_KEY_generate_key(ecdsa[j]);
2142 ret = ECDSA_sign(0, buf, 20, ecdsasig,
2143 &ecdsasiglen, ecdsa[j]);
2146 BIO_printf(bio_err,"ECDSA sign failure. No ECDSA sign will be done.\n");
2147 ERR_print_errors(bio_err);
2152 pkey_print_message("sign","ecdsa",
2154 test_curves_bits[j],
2158 for (count=0,run=1; COND(ecdsa_c[j][0]);
2161 ret=ECDSA_sign(0, buf, 20,
2162 ecdsasig, &ecdsasiglen,
2166 BIO_printf(bio_err, "ECDSA sign failure\n");
2167 ERR_print_errors(bio_err);
2174 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
2175 "%ld %d bit ECDSA signs in %.2fs \n",
2176 count, test_curves_bits[j], d);
2177 ecdsa_results[j][0]=d/(double)count;
2181 /* Perform ECDSA verification test */
2182 ret=ECDSA_verify(0, buf, 20, ecdsasig,
2183 ecdsasiglen, ecdsa[j]);
2186 BIO_printf(bio_err,"ECDSA verify failure. No ECDSA verify will be done.\n");
2187 ERR_print_errors(bio_err);
2192 pkey_print_message("verify","ecdsa",
2194 test_curves_bits[j],
2197 for (count=0,run=1; COND(ecdsa_c[j][1]); count++)
2199 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
2202 BIO_printf(bio_err, "ECDSA verify failure\n");
2203 ERR_print_errors(bio_err);
2209 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
2210 : "%ld %d bit ECDSA verify in %.2fs\n",
2211 count, test_curves_bits[j], d);
2212 ecdsa_results[j][1]=d/(double)count;
2217 /* if longer than 10s, don't do any more */
2218 for (j++; j<EC_NUM; j++)
2223 if (rnd_fake) RAND_cleanup();
2226 #ifndef OPENSSL_NO_ECDH
2227 if (RAND_status() != 1)
2229 RAND_seed(rnd_seed, sizeof rnd_seed);
2232 for (j=0; j<EC_NUM; j++)
2234 if (!ecdh_doit[j]) continue;
2235 ecdh_a[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2236 ecdh_b[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2237 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2239 BIO_printf(bio_err,"ECDH failure.\n");
2240 ERR_print_errors(bio_err);
2245 /* generate two ECDH key pairs */
2246 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2247 !EC_KEY_generate_key(ecdh_b[j]))
2249 BIO_printf(bio_err,"ECDH key generation failure.\n");
2250 ERR_print_errors(bio_err);
2255 /* If field size is not more than 24 octets, then use SHA-1 hash of result;
2256 * otherwise, use result (see section 4.8 of draft-ietf-tls-ecc-03.txt).
2258 int field_size, outlen;
2259 void *(*kdf)(const void *in, size_t inlen, void *out, size_t *xoutlen);
2260 field_size = EC_GROUP_get_degree(EC_KEY_get0_group(ecdh_a[j]));
2261 if (field_size <= 24 * 8)
2263 outlen = KDF1_SHA1_len;
2268 outlen = (field_size+7)/8;
2271 secret_size_a = ECDH_compute_key(secret_a, outlen,
2272 EC_KEY_get0_public_key(ecdh_b[j]),
2274 secret_size_b = ECDH_compute_key(secret_b, outlen,
2275 EC_KEY_get0_public_key(ecdh_a[j]),
2277 if (secret_size_a != secret_size_b)
2282 for (secret_idx = 0;
2283 (secret_idx < secret_size_a)
2284 && (ecdh_checks == 1);
2287 if (secret_a[secret_idx] != secret_b[secret_idx])
2291 if (ecdh_checks == 0)
2293 BIO_printf(bio_err,"ECDH computations don't match.\n");
2294 ERR_print_errors(bio_err);
2298 pkey_print_message("","ecdh",
2300 test_curves_bits[j],
2303 for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2305 ECDH_compute_key(secret_a, outlen,
2306 EC_KEY_get0_public_key(ecdh_b[j]),
2310 BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2311 count, test_curves_bits[j], d);
2312 ecdh_results[j][0]=d/(double)count;
2320 /* if longer than 10s, don't do any more */
2321 for (j++; j<EC_NUM; j++)
2325 if (rnd_fake) RAND_cleanup();
2332 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
2333 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
2335 printf("%s ",BN_options());
2336 #ifndef OPENSSL_NO_MD2
2337 printf("%s ",MD2_options());
2339 #ifndef OPENSSL_NO_RC4
2340 printf("%s ",RC4_options());
2342 #ifndef OPENSSL_NO_DES
2343 printf("%s ",DES_options());
2345 #ifndef OPENSSL_NO_AES
2346 printf("%s ",AES_options());
2348 #ifndef OPENSSL_NO_IDEA
2349 printf("%s ",idea_options());
2351 #ifndef OPENSSL_NO_BF
2352 printf("%s ",BF_options());
2354 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2360 fprintf(stdout,"+H");
2363 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
2364 fprintf(stdout,"type ");
2366 for (j=0; j<SIZE_NUM; j++)
2367 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
2368 fprintf(stdout,"\n");
2371 for (k=0; k<ALGOR_NUM; k++)
2373 if (!doit[k]) continue;
2375 fprintf(stdout,"+F:%d:%s",k,names[k]);
2377 fprintf(stdout,"%-13s",names[k]);
2378 for (j=0; j<SIZE_NUM; j++)
2380 if (results[k][j] > 10000 && !mr)
2381 fprintf(stdout," %11.2fk",results[k][j]/1e3);
2383 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
2385 fprintf(stdout,"\n");
2387 #ifndef OPENSSL_NO_RSA
2389 for (k=0; k<RSA_NUM; k++)
2391 if (!rsa_doit[k]) continue;
2394 printf("%18ssign verify sign/s verify/s\n"," ");
2398 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2399 k,rsa_bits[k],rsa_results[k][0],
2402 fprintf(stdout,"rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2403 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2404 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
2407 #ifndef OPENSSL_NO_DSA
2409 for (k=0; k<DSA_NUM; k++)
2411 if (!dsa_doit[k]) continue;
2414 printf("%18ssign verify sign/s verify/s\n"," ");
2418 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2419 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2421 fprintf(stdout,"dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2422 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2423 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
2426 #ifndef OPENSSL_NO_ECDSA
2428 for (k=0; k<EC_NUM; k++)
2430 if (!ecdsa_doit[k]) continue;
2433 printf("%30ssign verify sign/s verify/s\n"," ");
2438 fprintf(stdout,"+F4:%u:%u:%f:%f\n",
2439 k, test_curves_bits[k],
2440 ecdsa_results[k][0],ecdsa_results[k][1]);
2443 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2444 test_curves_bits[k],
2445 test_curves_names[k],
2446 ecdsa_results[k][0],ecdsa_results[k][1],
2447 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2452 #ifndef OPENSSL_NO_ECDH
2454 for (k=0; k<EC_NUM; k++)
2456 if (!ecdh_doit[k]) continue;
2459 printf("%30sop op/s\n"," ");
2463 fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2464 k, test_curves_bits[k],
2465 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2468 fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2469 test_curves_bits[k],
2470 test_curves_names[k],
2471 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2478 ERR_print_errors(bio_err);
2479 if (buf != NULL) OPENSSL_free(buf);
2480 if (buf2 != NULL) OPENSSL_free(buf2);
2481 #ifndef OPENSSL_NO_RSA
2482 for (i=0; i<RSA_NUM; i++)
2483 if (rsa_key[i] != NULL)
2484 RSA_free(rsa_key[i]);
2486 #ifndef OPENSSL_NO_DSA
2487 for (i=0; i<DSA_NUM; i++)
2488 if (dsa_key[i] != NULL)
2489 DSA_free(dsa_key[i]);
2492 #ifndef OPENSSL_NO_ECDSA
2493 for (i=0; i<EC_NUM; i++)
2494 if (ecdsa[i] != NULL)
2495 EC_KEY_free(ecdsa[i]);
2497 #ifndef OPENSSL_NO_ECDH
2498 for (i=0; i<EC_NUM; i++)
2500 if (ecdh_a[i] != NULL)
2501 EC_KEY_free(ecdh_a[i]);
2502 if (ecdh_b[i] != NULL)
2503 EC_KEY_free(ecdh_b[i]);
2511 static void print_message(const char *s, long num, int length)
2514 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2515 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
2516 (void)BIO_flush(bio_err);
2519 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2520 : "Doing %s %ld times on %d size blocks: ",s,num,length);
2521 (void)BIO_flush(bio_err);
2528 static void pkey_print_message(const char *str, const char *str2, long num,
2532 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2533 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
2534 (void)BIO_flush(bio_err);
2537 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2538 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
2539 (void)BIO_flush(bio_err);
2546 static void print_result(int alg,int run_no,int count,double time_used)
2548 BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n"
2549 : "%d %s's in %.2fs\n",count,names[alg],time_used);
2550 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2554 static char *sstrsep(char **string, const char *delim)
2557 char *token = *string;
2562 memset(isdelim, 0, sizeof isdelim);
2567 isdelim[(unsigned char)(*delim)] = 1;
2571 while (!isdelim[(unsigned char)(**string)])
2585 static int do_multi(int multi)
2590 static char sep[]=":";
2592 fds=malloc(multi*sizeof *fds);
2593 for(n=0 ; n < multi ; ++n)
2614 printf("Forked child %d\n",n);
2617 /* for now, assume the pipe is long enough to take all the output */
2618 for(n=0 ; n < multi ; ++n)
2624 f=fdopen(fds[n],"r");
2625 while(fgets(buf,sizeof buf,f))
2632 fprintf(stderr,"Don't understand line '%s' from child %d\n",
2636 printf("Got: %s from %d\n",buf,n);
2637 if(!strncmp(buf,"+F:",3))
2643 alg=atoi(sstrsep(&p,sep));
2645 for(j=0 ; j < SIZE_NUM ; ++j)
2646 results[alg][j]+=atof(sstrsep(&p,sep));
2648 else if(!strncmp(buf,"+F2:",4))
2654 k=atoi(sstrsep(&p,sep));
2657 d=atof(sstrsep(&p,sep));
2659 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2661 rsa_results[k][0]=d;
2663 d=atof(sstrsep(&p,sep));
2665 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2667 rsa_results[k][1]=d;
2669 else if(!strncmp(buf,"+F2:",4))
2675 k=atoi(sstrsep(&p,sep));
2678 d=atof(sstrsep(&p,sep));
2680 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2682 rsa_results[k][0]=d;
2684 d=atof(sstrsep(&p,sep));
2686 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2688 rsa_results[k][1]=d;
2690 else if(!strncmp(buf,"+F3:",4))
2696 k=atoi(sstrsep(&p,sep));
2699 d=atof(sstrsep(&p,sep));
2701 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2703 dsa_results[k][0]=d;
2705 d=atof(sstrsep(&p,sep));
2707 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2709 dsa_results[k][1]=d;
2711 #ifndef OPENSSL_NO_ECDSA
2712 else if(!strncmp(buf,"+F4:",4))
2718 k=atoi(sstrsep(&p,sep));
2721 d=atof(sstrsep(&p,sep));
2723 ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2725 ecdsa_results[k][0]=d;
2727 d=atof(sstrsep(&p,sep));
2729 ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2731 ecdsa_results[k][1]=d;
2735 #ifndef OPENSSL_NO_ECDH
2736 else if(!strncmp(buf,"+F5:",4))
2742 k=atoi(sstrsep(&p,sep));
2745 d=atof(sstrsep(&p,sep));
2747 ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2749 ecdh_results[k][0]=d;
2754 else if(!strncmp(buf,"+H:",3))
2758 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);