1 /* apps/speed.c -*- mode:C; c-file-style: "eay" -*- */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
58 /* ====================================================================
59 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
61 * Portions of the attached software ("Contribution") are developed by
62 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
64 * The Contribution is licensed pursuant to the OpenSSL open source
65 * license provided above.
67 * The ECDH and ECDSA speed test software is originally written by
68 * Sumit Gupta of Sun Microsystems Laboratories.
72 /* most of this code has been pilfered from my libdes speed.c program */
74 #ifndef OPENSSL_NO_SPEED
78 #define RSA_SECONDS 10
79 #define DSA_SECONDS 10
80 #define ECDSA_SECONDS 10
81 #define ECDH_SECONDS 10
83 /* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
84 /* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
87 #define PROG speed_main
95 #ifdef OPENSSL_NO_STDIO
98 #include <openssl/crypto.h>
99 #include <openssl/rand.h>
100 #include <openssl/err.h>
101 #include <openssl/evp.h>
102 #include <openssl/objects.h>
103 #if !defined(OPENSSL_SYS_MSDOS)
104 #include OPENSSL_UNISTD
107 #ifndef OPENSSL_SYS_NETWARE
111 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
113 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
116 #if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_MPE) && !defined(__NetBSD__) && !defined(OPENSSL_SYS_VXWORKS) /* FIXME */
120 #if defined(OPENSSL_SYS_NETWARE)
130 # include <sys/types.h>
131 # include <sys/times.h>
134 # include <sys/time.h>
135 # include <sys/resource.h>
138 /* Depending on the VMS version, the tms structure is perhaps defined.
139 The __TMS macro will show if it was. If it wasn't defined, we should
140 undefine TIMES, since that tells the rest of the program how things
141 should be handled. -- Richard Levitte */
142 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
147 #include <sys/timeb.h>
150 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS) && !defined(OPENSSL_SYS_NETWARE)
151 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
154 #if defined(sun) || defined(__ultrix)
155 #define _POSIX_SOURCE
157 #include <sys/param.h>
160 #include <openssl/bn.h>
161 #ifndef OPENSSL_NO_DES
162 #include <openssl/des.h>
164 #ifndef OPENSSL_NO_AES
165 #include <openssl/aes.h>
167 #ifndef OPENSSL_NO_MD2
168 #include <openssl/md2.h>
170 #ifndef OPENSSL_NO_MDC2
171 #include <openssl/mdc2.h>
173 #ifndef OPENSSL_NO_MD4
174 #include <openssl/md4.h>
176 #ifndef OPENSSL_NO_MD5
177 #include <openssl/md5.h>
179 #ifndef OPENSSL_NO_HMAC
180 #include <openssl/hmac.h>
182 #include <openssl/evp.h>
183 #ifndef OPENSSL_NO_SHA
184 #include <openssl/sha.h>
186 #ifndef OPENSSL_NO_RIPEMD
187 #include <openssl/ripemd.h>
189 #ifndef OPENSSL_NO_RC4
190 #include <openssl/rc4.h>
192 #ifndef OPENSSL_NO_RC5
193 #include <openssl/rc5.h>
195 #ifndef OPENSSL_NO_RC2
196 #include <openssl/rc2.h>
198 #ifndef OPENSSL_NO_IDEA
199 #include <openssl/idea.h>
201 #ifndef OPENSSL_NO_BF
202 #include <openssl/blowfish.h>
204 #ifndef OPENSSL_NO_CAST
205 #include <openssl/cast.h>
207 #ifndef OPENSSL_NO_RSA
208 #include <openssl/rsa.h>
209 #include "./testrsa.h"
211 #include <openssl/x509.h>
212 #ifndef OPENSSL_NO_DSA
213 #include <openssl/dsa.h>
214 #include "./testdsa.h"
216 #ifndef OPENSSL_NO_ECDSA
217 #include <openssl/ecdsa.h>
219 #ifndef OPENSSL_NO_ECDH
220 #include <openssl/ecdh.h>
224 * The following "HZ" timing stuff should be sync'd up with the code in
225 * crypto/tmdiff.[ch]. That appears to try to do the same job, though I think
226 * this code is more up to date than libcrypto's so there may be features to
227 * migrate over first. This is used in two places further down AFAICS.
228 * The point is that nothing in openssl actually *uses* that tmdiff stuff, so
229 * either speed.c should be using it or it should go because it's obviously not
230 * useful enough. Anyone want to do a janitorial job on this?
233 /* The following if from times(3) man page. It may need to be changed */
235 # if defined(_SC_CLK_TCK) \
236 && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000)
237 # define HZ sysconf(_SC_CLK_TCK)
240 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
242 # else /* _BSD_CLK_TCK_ */
243 # define HZ ((double)_BSD_CLK_TCK_)
246 # define HZ ((double)CLK_TCK)
251 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2) && !defined(OPENSSL_SYS_NETWARE)
256 #define BUFSIZE ((long)1024*8+1)
259 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
261 static int usertime=1;
263 static double Time_F(int s);
264 static void print_message(const char *s,long num,int length);
265 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
266 static void print_result(int alg,int run_no,int count,double time_used);
268 static int do_multi(int multi);
277 #define MAX_ECDH_SIZE 256
279 static const char *names[ALGOR_NUM]={
280 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
281 "des cbc","des ede3","idea cbc",
282 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
283 "aes-128 cbc","aes-192 cbc","aes-256 cbc"};
284 static double results[ALGOR_NUM][SIZE_NUM];
285 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
286 static double rsa_results[RSA_NUM][2];
287 static double dsa_results[DSA_NUM][2];
288 static double ecdsa_results[EC_NUM][2];
289 static double ecdh_results[EC_NUM][1];
293 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
294 #define SIGRETTYPE void
296 #define SIGRETTYPE int
299 static SIGRETTYPE sig_done(int sig);
300 static SIGRETTYPE sig_done(int sig)
302 signal(SIGALRM,sig_done);
313 #if defined(OPENSSL_SYS_NETWARE)
315 /* for NetWare the best we can do is use clock() which returns the
316 * time, in hundredths of a second, since the NLM began executing
318 static double Time_F(int s)
322 static clock_t tstart,tend;
332 ret=(double)((double)(tend)-(double)(tstart));
333 return((ret < 0.001)?0.001:ret);
339 static double Time_F(int s)
346 static struct rusage tstart,tend;
351 getrusage(RUSAGE_SELF,&tstart);
358 getrusage(RUSAGE_SELF,&tend);
359 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
360 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
361 +((double)i)/1000000.0;
362 return((ret < 0.001)?0.001:ret);
367 static struct timeval tstart,tend;
370 gettimeofday_used = 1;
373 gettimeofday(&tstart,NULL);
378 gettimeofday(&tend,NULL);
379 i=(long)tend.tv_usec-(long)tstart.tv_usec;
380 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
381 return((ret < 0.001)?0.001:ret);
384 #else /* ndef USE_TOD */
389 static struct tms tstart,tend;
401 ret=(double)(tend.tms_utime-tstart.tms_utime) / ret;
402 return((ret < 1e-3)?1e-3:ret);
405 # endif /* times() */
406 # if defined(TIMES) && defined(TIMEB)
409 # ifdef OPENSSL_SYS_VXWORKS
411 static unsigned long tick_start, tick_end;
415 tick_start = tickGet();
420 tick_end = tickGet();
421 ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
422 return((ret < 0.001)?0.001:ret);
425 # elif defined(TIMEB)
427 static struct timeb tstart,tend;
439 i=(long)tend.millitm-(long)tstart.millitm;
440 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
441 return((ret < 0.001)?0.001:ret);
447 #endif /* if defined(OPENSSL_SYS_NETWARE) */
450 static const int KDF1_SHA1_len = 20;
451 static void *KDF1_SHA1(void *in, size_t inlen, void *out, size_t outlen)
453 #ifndef OPENSSL_NO_SHA
454 if (outlen != SHA_DIGEST_LENGTH)
456 return SHA1(in, inlen, out);
463 int MAIN(int, char **);
465 int MAIN(int argc, char **argv)
467 #ifndef OPENSSL_NO_ENGINE
470 unsigned char *buf=NULL,*buf2=NULL;
472 long count=0,save_count=0;
474 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
477 #ifndef OPENSSL_NO_RSA
480 unsigned char md[EVP_MAX_MD_SIZE];
481 #ifndef OPENSSL_NO_MD2
482 unsigned char md2[MD2_DIGEST_LENGTH];
484 #ifndef OPENSSL_NO_MDC2
485 unsigned char mdc2[MDC2_DIGEST_LENGTH];
487 #ifndef OPENSSL_NO_MD4
488 unsigned char md4[MD4_DIGEST_LENGTH];
490 #ifndef OPENSSL_NO_MD5
491 unsigned char md5[MD5_DIGEST_LENGTH];
492 unsigned char hmac[MD5_DIGEST_LENGTH];
494 #ifndef OPENSSL_NO_SHA
495 unsigned char sha[SHA_DIGEST_LENGTH];
497 #ifndef OPENSSL_NO_RIPEMD
498 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
500 #ifndef OPENSSL_NO_RC4
503 #ifndef OPENSSL_NO_RC5
506 #ifndef OPENSSL_NO_RC2
509 #ifndef OPENSSL_NO_IDEA
510 IDEA_KEY_SCHEDULE idea_ks;
512 #ifndef OPENSSL_NO_BF
515 #ifndef OPENSSL_NO_CAST
518 static const unsigned char key16[16]=
519 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
520 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
521 static const unsigned char key24[24]=
522 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
523 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
524 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
525 static const unsigned char key32[32]=
526 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
527 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
528 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
529 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
530 #ifndef OPENSSL_NO_AES
531 #define MAX_BLOCK_SIZE 128
533 #define MAX_BLOCK_SIZE 64
535 unsigned char DES_iv[8];
536 unsigned char iv[MAX_BLOCK_SIZE/8];
537 #ifndef OPENSSL_NO_DES
538 DES_cblock *buf_as_des_cblock = NULL;
539 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
540 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
541 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
542 DES_key_schedule sch;
543 DES_key_schedule sch2;
544 DES_key_schedule sch3;
546 #ifndef OPENSSL_NO_AES
547 AES_KEY aes_ks1, aes_ks2, aes_ks3;
559 #define D_CBC_IDEA 10
563 #define D_CBC_CAST 14
564 #define D_CBC_128_AES 15
565 #define D_CBC_192_AES 16
566 #define D_CBC_256_AES 17
569 long c[ALGOR_NUM][SIZE_NUM];
595 #ifndef OPENSSL_NO_RSA
596 RSA *rsa_key[RSA_NUM];
597 long rsa_c[RSA_NUM][2];
598 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
599 static unsigned char *rsa_data[RSA_NUM]=
600 {test512,test1024,test2048,test4096};
601 static int rsa_data_length[RSA_NUM]={
602 sizeof(test512),sizeof(test1024),
603 sizeof(test2048),sizeof(test4096)};
605 #ifndef OPENSSL_NO_DSA
606 DSA *dsa_key[DSA_NUM];
607 long dsa_c[DSA_NUM][2];
608 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
610 #ifndef OPENSSL_NO_EC
611 /* We only test over the following curves as they are representative,
612 * To add tests over more curves, simply add the curve NID
613 * and curve name to the following arrays and increase the
614 * EC_NUM value accordingly.
616 static unsigned int test_curves[EC_NUM] =
620 NID_X9_62_prime192v1,
622 NID_X9_62_prime256v1,
637 static char * test_curves_names[EC_NUM] =
658 static int test_curves_bits[EC_NUM] =
660 160, 192, 224, 256, 384, 521,
661 163, 233, 283, 409, 571,
662 163, 233, 283, 409, 571
667 #ifndef OPENSSL_NO_ECDSA
668 unsigned char ecdsasig[256];
669 unsigned int ecdsasiglen;
670 EC_KEY *ecdsa[EC_NUM];
671 long ecdsa_c[EC_NUM][2];
674 #ifndef OPENSSL_NO_ECDH
675 EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
676 unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
677 int secret_size_a, secret_size_b;
680 long ecdh_c[EC_NUM][2];
683 int rsa_doit[RSA_NUM];
684 int dsa_doit[DSA_NUM];
685 int ecdsa_doit[EC_NUM];
686 int ecdh_doit[EC_NUM];
689 const EVP_CIPHER *evp_cipher=NULL;
690 const EVP_MD *evp_md=NULL;
701 memset(results, 0, sizeof(results));
702 #ifndef OPENSSL_NO_DSA
703 memset(dsa_key,0,sizeof(dsa_key));
705 #ifndef OPENSSL_NO_ECDSA
706 for (i=0; i<EC_NUM; i++) ecdsa[i] = NULL;
708 #ifndef OPENSSL_NO_ECDH
709 for (i=0; i<EC_NUM; i++)
718 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
719 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
721 if (!load_config(bio_err, NULL))
724 #ifndef OPENSSL_NO_RSA
725 memset(rsa_key,0,sizeof(rsa_key));
726 for (i=0; i<RSA_NUM; i++)
730 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
732 BIO_printf(bio_err,"out of memory\n");
735 #ifndef OPENSSL_NO_DES
736 buf_as_des_cblock = (DES_cblock *)buf;
738 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
740 BIO_printf(bio_err,"out of memory\n");
744 memset(c,0,sizeof(c));
745 memset(DES_iv,0,sizeof(DES_iv));
746 memset(iv,0,sizeof(iv));
748 for (i=0; i<ALGOR_NUM; i++)
750 for (i=0; i<RSA_NUM; i++)
752 for (i=0; i<DSA_NUM; i++)
754 #ifndef OPENSSL_NO_ECDSA
755 for (i=0; i<EC_NUM; i++)
758 #ifndef OPENSSL_NO_ECDH
759 for (i=0; i<EC_NUM; i++)
769 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
772 j--; /* Otherwise, -elapsed gets confused with
775 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
781 BIO_printf(bio_err,"no EVP given\n");
784 evp_cipher=EVP_get_cipherbyname(*argv);
787 evp_md=EVP_get_digestbyname(*argv);
789 if(!evp_cipher && !evp_md)
791 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
796 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
799 j--; /* Otherwise, -elapsed gets confused with
802 #ifndef OPENSSL_NO_ENGINE
803 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
809 BIO_printf(bio_err,"no engine given\n");
812 e = setup_engine(bio_err, *argv, 0);
813 /* j will be increased again further down. We just
814 don't want speed to confuse an engine with an
815 algorithm, especially when none is given (which
816 means all of them should be run) */
821 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
827 BIO_printf(bio_err,"no multi count given\n");
833 BIO_printf(bio_err,"bad multi count\n");
836 j--; /* Otherwise, -mr gets confused with
840 else if (argc > 0 && !strcmp(*argv,"-mr"))
843 j--; /* Otherwise, -mr gets confused with
847 #ifndef OPENSSL_NO_MD2
848 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
851 #ifndef OPENSSL_NO_MDC2
852 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
855 #ifndef OPENSSL_NO_MD4
856 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
859 #ifndef OPENSSL_NO_MD5
860 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
863 #ifndef OPENSSL_NO_MD5
864 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
867 #ifndef OPENSSL_NO_SHA
868 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
870 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
873 #ifndef OPENSSL_NO_RIPEMD
874 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
876 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
878 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
881 #ifndef OPENSSL_NO_RC4
882 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
885 #ifndef OPENSSL_NO_DES
886 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
887 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
890 #ifndef OPENSSL_NO_AES
891 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
892 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
893 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
896 #ifndef OPENSSL_NO_RSA
897 #if 0 /* was: #ifdef RSAref */
898 if (strcmp(*argv,"rsaref") == 0)
900 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
906 if (strcmp(*argv,"openssl") == 0)
908 RSA_set_default_method(RSA_PKCS1_SSLeay());
913 #endif /* !OPENSSL_NO_RSA */
914 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
915 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
916 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
917 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
918 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
919 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
920 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
922 #ifndef OPENSSL_NO_RC2
923 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
924 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
927 #ifndef OPENSSL_NO_RC5
928 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
929 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
932 #ifndef OPENSSL_NO_IDEA
933 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
934 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
937 #ifndef OPENSSL_NO_BF
938 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
939 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
940 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
943 #ifndef OPENSSL_NO_CAST
944 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
945 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
946 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
949 #ifndef OPENSSL_NO_DES
950 if (strcmp(*argv,"des") == 0)
957 #ifndef OPENSSL_NO_AES
958 if (strcmp(*argv,"aes") == 0)
960 doit[D_CBC_128_AES]=1;
961 doit[D_CBC_192_AES]=1;
962 doit[D_CBC_256_AES]=1;
966 #ifndef OPENSSL_NO_RSA
967 if (strcmp(*argv,"rsa") == 0)
969 rsa_doit[R_RSA_512]=1;
970 rsa_doit[R_RSA_1024]=1;
971 rsa_doit[R_RSA_2048]=1;
972 rsa_doit[R_RSA_4096]=1;
976 #ifndef OPENSSL_NO_DSA
977 if (strcmp(*argv,"dsa") == 0)
979 dsa_doit[R_DSA_512]=1;
980 dsa_doit[R_DSA_1024]=1;
981 dsa_doit[R_DSA_2048]=1;
985 #ifndef OPENSSL_NO_ECDSA
986 if (strcmp(*argv,"ecdsap160") == 0) ecdsa_doit[R_EC_P160]=2;
987 else if (strcmp(*argv,"ecdsap224") == 0) ecdsa_doit[R_EC_P224]=2;
988 else if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2;
989 else if (strcmp(*argv,"ecdsap384") == 0) ecdsa_doit[R_EC_P384]=2;
990 else if (strcmp(*argv,"ecdsap521") == 0) ecdsa_doit[R_EC_P521]=2;
991 else if (strcmp(*argv,"ecdsak163") == 0) ecdsa_doit[R_EC_K163]=2;
992 else if (strcmp(*argv,"ecdsak233") == 0) ecdsa_doit[R_EC_K233]=2;
993 else if (strcmp(*argv,"ecdsak283") == 0) ecdsa_doit[R_EC_K283]=2;
994 else if (strcmp(*argv,"ecdsak409") == 0) ecdsa_doit[R_EC_K409]=2;
995 else if (strcmp(*argv,"ecdsak571") == 0) ecdsa_doit[R_EC_K571]=2;
996 else if (strcmp(*argv,"ecdsab163") == 0) ecdsa_doit[R_EC_B163]=2;
997 else if (strcmp(*argv,"ecdsab233") == 0) ecdsa_doit[R_EC_B233]=2;
998 else if (strcmp(*argv,"ecdsab283") == 0) ecdsa_doit[R_EC_B283]=2;
999 else if (strcmp(*argv,"ecdsab409") == 0) ecdsa_doit[R_EC_B409]=2;
1000 else if (strcmp(*argv,"ecdsab571") == 0) ecdsa_doit[R_EC_B571]=2;
1001 else if (strcmp(*argv,"ecdsa") == 0)
1003 for (i=0; i < EC_NUM; i++)
1008 #ifndef OPENSSL_NO_ECDH
1009 if (strcmp(*argv,"ecdhp160") == 0) ecdh_doit[R_EC_P160]=2;
1010 else if (strcmp(*argv,"ecdhp224") == 0) ecdh_doit[R_EC_P224]=2;
1011 else if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2;
1012 else if (strcmp(*argv,"ecdhp384") == 0) ecdh_doit[R_EC_P384]=2;
1013 else if (strcmp(*argv,"ecdhp521") == 0) ecdh_doit[R_EC_P521]=2;
1014 else if (strcmp(*argv,"ecdhk163") == 0) ecdh_doit[R_EC_K163]=2;
1015 else if (strcmp(*argv,"ecdhk233") == 0) ecdh_doit[R_EC_K233]=2;
1016 else if (strcmp(*argv,"ecdhk283") == 0) ecdh_doit[R_EC_K283]=2;
1017 else if (strcmp(*argv,"ecdhk409") == 0) ecdh_doit[R_EC_K409]=2;
1018 else if (strcmp(*argv,"ecdhk571") == 0) ecdh_doit[R_EC_K571]=2;
1019 else if (strcmp(*argv,"ecdhb163") == 0) ecdh_doit[R_EC_B163]=2;
1020 else if (strcmp(*argv,"ecdhb233") == 0) ecdh_doit[R_EC_B233]=2;
1021 else if (strcmp(*argv,"ecdhb283") == 0) ecdh_doit[R_EC_B283]=2;
1022 else if (strcmp(*argv,"ecdhb409") == 0) ecdh_doit[R_EC_B409]=2;
1023 else if (strcmp(*argv,"ecdhb571") == 0) ecdh_doit[R_EC_B571]=2;
1024 else if (strcmp(*argv,"ecdh") == 0)
1026 for (i=0; i < EC_NUM; i++)
1032 BIO_printf(bio_err,"Error: bad option or value\n");
1033 BIO_printf(bio_err,"\n");
1034 BIO_printf(bio_err,"Available values:\n");
1035 #ifndef OPENSSL_NO_MD2
1036 BIO_printf(bio_err,"md2 ");
1038 #ifndef OPENSSL_NO_MDC2
1039 BIO_printf(bio_err,"mdc2 ");
1041 #ifndef OPENSSL_NO_MD4
1042 BIO_printf(bio_err,"md4 ");
1044 #ifndef OPENSSL_NO_MD5
1045 BIO_printf(bio_err,"md5 ");
1046 #ifndef OPENSSL_NO_HMAC
1047 BIO_printf(bio_err,"hmac ");
1050 #ifndef OPENSSL_NO_SHA1
1051 BIO_printf(bio_err,"sha1 ");
1053 #ifndef OPENSSL_NO_RIPEMD160
1054 BIO_printf(bio_err,"rmd160");
1056 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
1057 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
1058 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
1059 BIO_printf(bio_err,"\n");
1062 #ifndef OPENSSL_NO_IDEA
1063 BIO_printf(bio_err,"idea-cbc ");
1065 #ifndef OPENSSL_NO_RC2
1066 BIO_printf(bio_err,"rc2-cbc ");
1068 #ifndef OPENSSL_NO_RC5
1069 BIO_printf(bio_err,"rc5-cbc ");
1071 #ifndef OPENSSL_NO_BF
1072 BIO_printf(bio_err,"bf-cbc");
1074 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1075 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
1076 BIO_printf(bio_err,"\n");
1078 #ifndef OPENSSL_NO_DES
1079 BIO_printf(bio_err,"des-cbc des-ede3 ");
1081 #ifndef OPENSSL_NO_AES
1082 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
1084 #ifndef OPENSSL_NO_RC4
1085 BIO_printf(bio_err,"rc4");
1087 BIO_printf(bio_err,"\n");
1089 #ifndef OPENSSL_NO_RSA
1090 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
1093 #ifndef OPENSSL_NO_DSA
1094 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
1096 #ifndef OPENSSL_NO_ECDSA
1097 BIO_printf(bio_err,"ecdsap160 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
1098 BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n");
1099 BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n");
1100 BIO_printf(bio_err,"ecdsa\n");
1102 #ifndef OPENSSL_NO_ECDH
1103 BIO_printf(bio_err,"ecdhp160 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n");
1104 BIO_printf(bio_err,"ecdhk163 ecdhk233 ecdhk283 ecdhk409 ecdhk571\n");
1105 BIO_printf(bio_err,"ecdhb163 ecdhb233 ecdhb283 ecdhb409 ecdhb571\n");
1106 BIO_printf(bio_err,"ecdh\n");
1109 #ifndef OPENSSL_NO_IDEA
1110 BIO_printf(bio_err,"idea ");
1112 #ifndef OPENSSL_NO_RC2
1113 BIO_printf(bio_err,"rc2 ");
1115 #ifndef OPENSSL_NO_DES
1116 BIO_printf(bio_err,"des ");
1118 #ifndef OPENSSL_NO_AES
1119 BIO_printf(bio_err,"aes ");
1121 #ifndef OPENSSL_NO_RSA
1122 BIO_printf(bio_err,"rsa ");
1124 #ifndef OPENSSL_NO_BF
1125 BIO_printf(bio_err,"blowfish");
1127 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1128 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
1129 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
1130 BIO_printf(bio_err,"\n");
1133 BIO_printf(bio_err,"\n");
1134 BIO_printf(bio_err,"Available options:\n");
1135 #if defined(TIMES) || defined(USE_TOD)
1136 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
1138 #ifndef OPENSSL_NO_ENGINE
1139 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
1141 BIO_printf(bio_err,"-evp e use EVP e.\n");
1142 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
1143 BIO_printf(bio_err,"-mr produce machine readable output.\n");
1145 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
1155 if(multi && do_multi(multi))
1161 for (i=0; i<ALGOR_NUM; i++)
1166 for (i=0; i<RSA_NUM; i++)
1168 for (i=0; i<DSA_NUM; i++)
1171 for (i=0; i<ALGOR_NUM; i++)
1172 if (doit[i]) pr_header++;
1174 if (usertime == 0 && !mr)
1175 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
1176 if (usertime <= 0 && !mr)
1178 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
1179 BIO_printf(bio_err,"program when this computer is idle.\n");
1182 #ifndef OPENSSL_NO_RSA
1183 for (i=0; i<RSA_NUM; i++)
1185 const unsigned char *p;
1188 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
1189 if (rsa_key[i] == NULL)
1191 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
1197 BIO_printf(bio_err,mr ? "+RK:%d:"
1198 : "Loaded RSA key, %d bit modulus and e= 0x",
1199 BN_num_bits(rsa_key[i]->n));
1200 BN_print(bio_err,rsa_key[i]->e);
1201 BIO_printf(bio_err,"\n");
1207 #ifndef OPENSSL_NO_DSA
1208 dsa_key[0]=get_dsa512();
1209 dsa_key[1]=get_dsa1024();
1210 dsa_key[2]=get_dsa2048();
1213 #ifndef OPENSSL_NO_DES
1214 DES_set_key_unchecked(&key,&sch);
1215 DES_set_key_unchecked(&key2,&sch2);
1216 DES_set_key_unchecked(&key3,&sch3);
1218 #ifndef OPENSSL_NO_AES
1219 AES_set_encrypt_key(key16,128,&aes_ks1);
1220 AES_set_encrypt_key(key24,192,&aes_ks2);
1221 AES_set_encrypt_key(key32,256,&aes_ks3);
1223 #ifndef OPENSSL_NO_IDEA
1224 idea_set_encrypt_key(key16,&idea_ks);
1226 #ifndef OPENSSL_NO_RC4
1227 RC4_set_key(&rc4_ks,16,key16);
1229 #ifndef OPENSSL_NO_RC2
1230 RC2_set_key(&rc2_ks,16,key16,128);
1232 #ifndef OPENSSL_NO_RC5
1233 RC5_32_set_key(&rc5_ks,16,key16,12);
1235 #ifndef OPENSSL_NO_BF
1236 BF_set_key(&bf_ks,16,key16);
1238 #ifndef OPENSSL_NO_CAST
1239 CAST_set_key(&cast_ks,16,key16);
1241 #ifndef OPENSSL_NO_RSA
1242 memset(rsa_c,0,sizeof(rsa_c));
1245 #ifndef OPENSSL_NO_DES
1246 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
1252 for (i=count; i; i--)
1253 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
1258 c[D_MD2][0]=count/10;
1259 c[D_MDC2][0]=count/10;
1264 c[D_RMD160][0]=count;
1265 c[D_RC4][0]=count*5;
1266 c[D_CBC_DES][0]=count;
1267 c[D_EDE3_DES][0]=count/3;
1268 c[D_CBC_IDEA][0]=count;
1269 c[D_CBC_RC2][0]=count;
1270 c[D_CBC_RC5][0]=count;
1271 c[D_CBC_BF][0]=count;
1272 c[D_CBC_CAST][0]=count;
1273 c[D_CBC_128_AES][0]=count;
1274 c[D_CBC_192_AES][0]=count;
1275 c[D_CBC_256_AES][0]=count;
1277 for (i=1; i<SIZE_NUM; i++)
1279 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1280 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1281 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1282 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1283 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1284 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1285 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1287 for (i=1; i<SIZE_NUM; i++)
1291 l0=(long)lengths[i-1];
1292 l1=(long)lengths[i];
1293 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1294 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1295 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1296 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1297 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1298 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1299 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1300 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1301 c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
1302 c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
1303 c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
1305 #ifndef OPENSSL_NO_RSA
1306 rsa_c[R_RSA_512][0]=count/2000;
1307 rsa_c[R_RSA_512][1]=count/400;
1308 for (i=1; i<RSA_NUM; i++)
1310 rsa_c[i][0]=rsa_c[i-1][0]/8;
1311 rsa_c[i][1]=rsa_c[i-1][1]/4;
1312 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1316 if (rsa_c[i][0] == 0)
1325 #ifndef OPENSSL_NO_DSA
1326 dsa_c[R_DSA_512][0]=count/1000;
1327 dsa_c[R_DSA_512][1]=count/1000/2;
1328 for (i=1; i<DSA_NUM; i++)
1330 dsa_c[i][0]=dsa_c[i-1][0]/4;
1331 dsa_c[i][1]=dsa_c[i-1][1]/4;
1332 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1345 #ifndef OPENSSL_NO_ECDSA
1346 ecdsa_c[R_EC_P160][0]=count/1000;
1347 ecdsa_c[R_EC_P160][1]=count/1000/2;
1348 for (i=R_EC_P224; i<=R_EC_P521; i++)
1350 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1351 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1352 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1356 if (ecdsa_c[i] == 0)
1363 ecdsa_c[R_EC_K163][0]=count/1000;
1364 ecdsa_c[R_EC_K163][1]=count/1000/2;
1365 for (i=R_EC_K233; i<=R_EC_K571; i++)
1367 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1368 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1369 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1373 if (ecdsa_c[i] == 0)
1380 ecdsa_c[R_EC_B163][0]=count/1000;
1381 ecdsa_c[R_EC_B163][1]=count/1000/2;
1382 for (i=R_EC_B233; i<=R_EC_B571; i++)
1384 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1385 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1386 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1390 if (ecdsa_c[i] == 0)
1399 #ifndef OPENSSL_NO_ECDH
1400 ecdh_c[R_EC_P160][0]=count/1000;
1401 ecdh_c[R_EC_P160][1]=count/1000;
1402 for (i=R_EC_P224; i<=R_EC_P521; i++)
1404 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1405 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1406 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1417 ecdh_c[R_EC_K163][0]=count/1000;
1418 ecdh_c[R_EC_K163][1]=count/1000;
1419 for (i=R_EC_K233; i<=R_EC_K571; i++)
1421 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1422 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1423 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1434 ecdh_c[R_EC_B163][0]=count/1000;
1435 ecdh_c[R_EC_B163][1]=count/1000;
1436 for (i=R_EC_B233; i<=R_EC_B571; i++)
1438 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1439 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1440 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1453 #define COND(d) (count < (d))
1454 #define COUNT(d) (d)
1456 /* not worth fixing */
1457 # error "You cannot disable DES on systems without SIGALRM."
1458 #endif /* OPENSSL_NO_DES */
1460 #define COND(c) (run)
1461 #define COUNT(d) (count)
1462 signal(SIGALRM,sig_done);
1463 #endif /* SIGALRM */
1465 #ifndef OPENSSL_NO_MD2
1468 for (j=0; j<SIZE_NUM; j++)
1470 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1472 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1473 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1475 print_result(D_MD2,j,count,d);
1479 #ifndef OPENSSL_NO_MDC2
1482 for (j=0; j<SIZE_NUM; j++)
1484 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1486 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1487 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1489 print_result(D_MDC2,j,count,d);
1494 #ifndef OPENSSL_NO_MD4
1497 for (j=0; j<SIZE_NUM; j++)
1499 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1501 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1502 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1504 print_result(D_MD4,j,count,d);
1509 #ifndef OPENSSL_NO_MD5
1512 for (j=0; j<SIZE_NUM; j++)
1514 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1516 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1517 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1519 print_result(D_MD5,j,count,d);
1524 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1529 HMAC_CTX_init(&hctx);
1530 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1531 16,EVP_md5(), NULL);
1533 for (j=0; j<SIZE_NUM; j++)
1535 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1537 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1539 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1540 HMAC_Update(&hctx,buf,lengths[j]);
1541 HMAC_Final(&hctx,&(hmac[0]),NULL);
1544 print_result(D_HMAC,j,count,d);
1546 HMAC_CTX_cleanup(&hctx);
1549 #ifndef OPENSSL_NO_SHA
1552 for (j=0; j<SIZE_NUM; j++)
1554 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1556 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1557 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1559 print_result(D_SHA1,j,count,d);
1563 #ifndef OPENSSL_NO_RIPEMD
1566 for (j=0; j<SIZE_NUM; j++)
1568 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1570 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1571 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1573 print_result(D_RMD160,j,count,d);
1577 #ifndef OPENSSL_NO_RC4
1580 for (j=0; j<SIZE_NUM; j++)
1582 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1584 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1585 RC4(&rc4_ks,(unsigned int)lengths[j],
1588 print_result(D_RC4,j,count,d);
1592 #ifndef OPENSSL_NO_DES
1593 if (doit[D_CBC_DES])
1595 for (j=0; j<SIZE_NUM; j++)
1597 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1599 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1600 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1601 &DES_iv,DES_ENCRYPT);
1603 print_result(D_CBC_DES,j,count,d);
1607 if (doit[D_EDE3_DES])
1609 for (j=0; j<SIZE_NUM; j++)
1611 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1613 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1614 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1616 &DES_iv,DES_ENCRYPT);
1618 print_result(D_EDE3_DES,j,count,d);
1622 #ifndef OPENSSL_NO_AES
1623 if (doit[D_CBC_128_AES])
1625 for (j=0; j<SIZE_NUM; j++)
1627 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1629 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1630 AES_cbc_encrypt(buf,buf,
1631 (unsigned long)lengths[j],&aes_ks1,
1634 print_result(D_CBC_128_AES,j,count,d);
1637 if (doit[D_CBC_192_AES])
1639 for (j=0; j<SIZE_NUM; j++)
1641 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1643 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1644 AES_cbc_encrypt(buf,buf,
1645 (unsigned long)lengths[j],&aes_ks2,
1648 print_result(D_CBC_192_AES,j,count,d);
1651 if (doit[D_CBC_256_AES])
1653 for (j=0; j<SIZE_NUM; j++)
1655 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1657 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1658 AES_cbc_encrypt(buf,buf,
1659 (unsigned long)lengths[j],&aes_ks3,
1662 print_result(D_CBC_256_AES,j,count,d);
1667 #ifndef OPENSSL_NO_IDEA
1668 if (doit[D_CBC_IDEA])
1670 for (j=0; j<SIZE_NUM; j++)
1672 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1674 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1675 idea_cbc_encrypt(buf,buf,
1676 (unsigned long)lengths[j],&idea_ks,
1679 print_result(D_CBC_IDEA,j,count,d);
1683 #ifndef OPENSSL_NO_RC2
1684 if (doit[D_CBC_RC2])
1686 for (j=0; j<SIZE_NUM; j++)
1688 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1690 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1691 RC2_cbc_encrypt(buf,buf,
1692 (unsigned long)lengths[j],&rc2_ks,
1695 print_result(D_CBC_RC2,j,count,d);
1699 #ifndef OPENSSL_NO_RC5
1700 if (doit[D_CBC_RC5])
1702 for (j=0; j<SIZE_NUM; j++)
1704 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1706 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1707 RC5_32_cbc_encrypt(buf,buf,
1708 (unsigned long)lengths[j],&rc5_ks,
1711 print_result(D_CBC_RC5,j,count,d);
1715 #ifndef OPENSSL_NO_BF
1718 for (j=0; j<SIZE_NUM; j++)
1720 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1722 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1723 BF_cbc_encrypt(buf,buf,
1724 (unsigned long)lengths[j],&bf_ks,
1727 print_result(D_CBC_BF,j,count,d);
1731 #ifndef OPENSSL_NO_CAST
1732 if (doit[D_CBC_CAST])
1734 for (j=0; j<SIZE_NUM; j++)
1736 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1738 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1739 CAST_cbc_encrypt(buf,buf,
1740 (unsigned long)lengths[j],&cast_ks,
1743 print_result(D_CBC_CAST,j,count,d);
1750 for (j=0; j<SIZE_NUM; j++)
1757 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1758 /* -O3 -fschedule-insns messes up an
1759 * optimization here! names[D_EVP]
1760 * somehow becomes NULL */
1761 print_message(names[D_EVP],save_count,
1764 EVP_CIPHER_CTX_init(&ctx);
1766 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1768 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1772 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1773 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1775 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1776 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1778 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1780 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1782 EVP_CIPHER_CTX_cleanup(&ctx);
1786 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1787 print_message(names[D_EVP],save_count,
1791 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1792 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1796 print_result(D_EVP,j,count,d);
1800 RAND_pseudo_bytes(buf,36);
1801 #ifndef OPENSSL_NO_RSA
1802 for (j=0; j<RSA_NUM; j++)
1805 if (!rsa_doit[j]) continue;
1806 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1809 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1810 ERR_print_errors(bio_err);
1815 pkey_print_message("private","rsa",
1816 rsa_c[j][0],rsa_bits[j],
1818 /* RSA_blinding_on(rsa_key[j],NULL); */
1820 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1822 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1823 &rsa_num, rsa_key[j]);
1827 "RSA sign failure\n");
1828 ERR_print_errors(bio_err);
1834 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1835 : "%ld %d bit private RSA's in %.2fs\n",
1836 count,rsa_bits[j],d);
1837 rsa_results[j][0]=d/(double)count;
1842 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1845 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1846 ERR_print_errors(bio_err);
1851 pkey_print_message("public","rsa",
1852 rsa_c[j][1],rsa_bits[j],
1855 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1857 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1858 rsa_num, rsa_key[j]);
1862 "RSA verify failure\n");
1863 ERR_print_errors(bio_err);
1869 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1870 : "%ld %d bit public RSA's in %.2fs\n",
1871 count,rsa_bits[j],d);
1872 rsa_results[j][1]=d/(double)count;
1878 /* if longer than 10s, don't do any more */
1879 for (j++; j<RSA_NUM; j++)
1885 RAND_pseudo_bytes(buf,20);
1886 #ifndef OPENSSL_NO_DSA
1887 if (RAND_status() != 1)
1889 RAND_seed(rnd_seed, sizeof rnd_seed);
1892 for (j=0; j<DSA_NUM; j++)
1897 if (!dsa_doit[j]) continue;
1898 /* DSA_generate_key(dsa_key[j]); */
1899 /* DSA_sign_setup(dsa_key[j],NULL); */
1900 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1904 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1905 ERR_print_errors(bio_err);
1910 pkey_print_message("sign","dsa",
1911 dsa_c[j][0],dsa_bits[j],
1914 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1916 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1921 "DSA sign failure\n");
1922 ERR_print_errors(bio_err);
1928 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1929 : "%ld %d bit DSA signs in %.2fs\n",
1930 count,dsa_bits[j],d);
1931 dsa_results[j][0]=d/(double)count;
1935 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1939 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1940 ERR_print_errors(bio_err);
1945 pkey_print_message("verify","dsa",
1946 dsa_c[j][1],dsa_bits[j],
1949 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1951 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1956 "DSA verify failure\n");
1957 ERR_print_errors(bio_err);
1963 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1964 : "%ld %d bit DSA verify in %.2fs\n",
1965 count,dsa_bits[j],d);
1966 dsa_results[j][1]=d/(double)count;
1971 /* if longer than 10s, don't do any more */
1972 for (j++; j<DSA_NUM; j++)
1976 if (rnd_fake) RAND_cleanup();
1979 #ifndef OPENSSL_NO_ECDSA
1980 if (RAND_status() != 1)
1982 RAND_seed(rnd_seed, sizeof rnd_seed);
1985 for (j=0; j<EC_NUM; j++)
1989 if (!ecdsa_doit[j]) continue; /* Ignore Curve */
1990 ecdsa[j] = EC_KEY_new();
1991 if (ecdsa[j] == NULL)
1993 BIO_printf(bio_err,"ECDSA failure.\n");
1994 ERR_print_errors(bio_err);
1999 ecdsa[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
2000 /* Could not obtain group information */
2001 if (ecdsa[j]->group == NULL)
2003 BIO_printf(bio_err,"ECDSA failure.Could not obtain group information\n");
2004 ERR_print_errors(bio_err);
2010 EC_GROUP_precompute_mult(ecdsa[j]->group, NULL);
2012 /* Perform ECDSA signature test */
2013 EC_KEY_generate_key(ecdsa[j]);
2014 ret = ECDSA_sign(0, buf, 20, ecdsasig,
2015 &ecdsasiglen, ecdsa[j]);
2018 BIO_printf(bio_err,"ECDSA sign failure. No ECDSA sign will be done.\n");
2019 ERR_print_errors(bio_err);
2024 pkey_print_message("sign","ecdsa",
2026 test_curves_bits[j],
2030 for (count=0,run=1; COND(ecdsa_c[j][0]);
2033 ret=ECDSA_sign(0, buf, 20,
2034 ecdsasig, &ecdsasiglen,
2038 BIO_printf(bio_err, "ECDSA sign failure\n");
2039 ERR_print_errors(bio_err);
2046 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
2047 "%ld %d bit ECDSA signs in %.2fs \n",
2048 count, test_curves_bits[j], d);
2049 ecdsa_results[j][0]=d/(double)count;
2053 /* Perform ECDSA verification test */
2054 ret=ECDSA_verify(0, buf, 20, ecdsasig,
2055 ecdsasiglen, ecdsa[j]);
2058 BIO_printf(bio_err,"ECDSA verify failure. No ECDSA verify will be done.\n");
2059 ERR_print_errors(bio_err);
2064 pkey_print_message("verify","ecdsa",
2066 test_curves_bits[j],
2069 for (count=0,run=1; COND(ecdsa_c[j][1]); count++)
2071 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
2074 BIO_printf(bio_err, "ECDSA verify failure\n");
2075 ERR_print_errors(bio_err);
2081 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
2082 : "%ld %d bit ECDSA verify in %.2fs\n",
2083 count, test_curves_bits[j], d);
2084 ecdsa_results[j][1]=d/(double)count;
2089 /* if longer than 10s, don't do any more */
2090 for (j++; j<EC_NUM; j++)
2096 if (rnd_fake) RAND_cleanup();
2099 #ifndef OPENSSL_NO_ECDH
2100 if (RAND_status() != 1)
2102 RAND_seed(rnd_seed, sizeof rnd_seed);
2105 for (j=0; j<EC_NUM; j++)
2107 if (!ecdh_doit[j]) continue;
2108 ecdh_a[j] = EC_KEY_new();
2109 ecdh_b[j] = EC_KEY_new();
2110 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2112 BIO_printf(bio_err,"ECDH failure.\n");
2113 ERR_print_errors(bio_err);
2118 ecdh_a[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
2119 if (ecdh_a[j]->group == NULL)
2121 BIO_printf(bio_err,"ECDH failure.\n");
2122 ERR_print_errors(bio_err);
2127 ecdh_b[j]->group = EC_GROUP_dup(ecdh_a[j]->group);
2129 /* generate two ECDH key pairs */
2130 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2131 !EC_KEY_generate_key(ecdh_b[j]))
2133 BIO_printf(bio_err,"ECDH key generation failure.\n");
2134 ERR_print_errors(bio_err);
2139 /* If field size is not more than 24 octets, then use SHA-1 hash of result;
2140 * otherwise, use result (see section 4.8 of draft-ietf-tls-ecc-03.txt).
2142 int field_size, outlen;
2143 void *(*kdf)(void *in, size_t inlen, void *out, size_t xoutlen);
2144 field_size = EC_GROUP_get_degree(ecdh_a[j]->group);
2145 if (field_size <= 24 * 8)
2147 outlen = KDF1_SHA1_len;
2152 outlen = (field_size+7)/8;
2155 secret_size_a = ECDH_compute_key(secret_a, outlen,
2158 secret_size_b = ECDH_compute_key(secret_b, outlen,
2161 if (secret_size_a != secret_size_b)
2166 for (secret_idx = 0;
2167 (secret_idx < secret_size_a)
2168 && (ecdh_checks == 1);
2171 if (secret_a[secret_idx] != secret_b[secret_idx])
2175 if (ecdh_checks == 0)
2177 BIO_printf(bio_err,"ECDH computations don't match.\n");
2178 ERR_print_errors(bio_err);
2182 pkey_print_message("","ecdh",
2184 test_curves_bits[j],
2187 for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2189 ECDH_compute_key(secret_a, outlen,
2194 BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2195 count, test_curves_bits[j], d);
2196 ecdh_results[j][0]=d/(double)count;
2204 /* if longer than 10s, don't do any more */
2205 for (j++; j<EC_NUM; j++)
2209 if (rnd_fake) RAND_cleanup();
2216 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
2217 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
2219 printf("%s ",BN_options());
2220 #ifndef OPENSSL_NO_MD2
2221 printf("%s ",MD2_options());
2223 #ifndef OPENSSL_NO_RC4
2224 printf("%s ",RC4_options());
2226 #ifndef OPENSSL_NO_DES
2227 printf("%s ",DES_options());
2229 #ifndef OPENSSL_NO_AES
2230 printf("%s ",AES_options());
2232 #ifndef OPENSSL_NO_IDEA
2233 printf("%s ",idea_options());
2235 #ifndef OPENSSL_NO_BF
2236 printf("%s ",BF_options());
2238 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2239 printf("available timing options: ");
2250 #define as_string(s) (#s)
2253 printf("HZ=%g", dbl);
2256 printf(" [sysconf value]");
2260 printf("timing function used: %s%s%s%s%s%s%s\n",
2261 (ftime_used ? "ftime" : ""),
2262 (ftime_used + times_used > 1 ? "," : ""),
2263 (times_used ? "times" : ""),
2264 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
2265 (gettimeofday_used ? "gettimeofday" : ""),
2266 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
2267 (getrusage_used ? "getrusage" : ""));
2273 fprintf(stdout,"+H");
2276 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
2277 fprintf(stdout,"type ");
2279 for (j=0; j<SIZE_NUM; j++)
2280 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
2281 fprintf(stdout,"\n");
2284 for (k=0; k<ALGOR_NUM; k++)
2286 if (!doit[k]) continue;
2288 fprintf(stdout,"+F:%d:%s",k,names[k]);
2290 fprintf(stdout,"%-13s",names[k]);
2291 for (j=0; j<SIZE_NUM; j++)
2293 if (results[k][j] > 10000 && !mr)
2294 fprintf(stdout," %11.2fk",results[k][j]/1e3);
2296 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
2298 fprintf(stdout,"\n");
2300 #ifndef OPENSSL_NO_RSA
2302 for (k=0; k<RSA_NUM; k++)
2304 if (!rsa_doit[k]) continue;
2307 printf("%18ssign verify sign/s verify/s\n"," ");
2311 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2312 k,rsa_bits[k],rsa_results[k][0],
2315 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2316 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2317 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
2320 #ifndef OPENSSL_NO_DSA
2322 for (k=0; k<DSA_NUM; k++)
2324 if (!dsa_doit[k]) continue;
2327 printf("%18ssign verify sign/s verify/s\n"," ");
2331 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2332 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2334 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2335 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2336 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
2339 #ifndef OPENSSL_NO_ECDSA
2341 for (k=0; k<EC_NUM; k++)
2343 if (!ecdsa_doit[k]) continue;
2346 printf("%30ssign verify sign/s verify/s\n"," ");
2351 fprintf(stdout,"+F4:%u:%u:%f:%f\n",
2352 k, test_curves_bits[k],
2353 ecdsa_results[k][0],ecdsa_results[k][1]);
2356 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2357 test_curves_bits[k],
2358 test_curves_names[k],
2359 ecdsa_results[k][0],ecdsa_results[k][1],
2360 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2365 #ifndef OPENSSL_NO_ECDH
2367 for (k=0; k<EC_NUM; k++)
2369 if (!ecdh_doit[k]) continue;
2372 printf("%30sop op/s\n"," ");
2376 fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2377 k, test_curves_bits[k],
2378 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2381 fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2382 test_curves_bits[k],
2383 test_curves_names[k],
2384 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2391 ERR_print_errors(bio_err);
2392 if (buf != NULL) OPENSSL_free(buf);
2393 if (buf2 != NULL) OPENSSL_free(buf2);
2394 #ifndef OPENSSL_NO_RSA
2395 for (i=0; i<RSA_NUM; i++)
2396 if (rsa_key[i] != NULL)
2397 RSA_free(rsa_key[i]);
2399 #ifndef OPENSSL_NO_DSA
2400 for (i=0; i<DSA_NUM; i++)
2401 if (dsa_key[i] != NULL)
2402 DSA_free(dsa_key[i]);
2405 #ifndef OPENSSL_NO_ECDSA
2406 for (i=0; i<EC_NUM; i++)
2407 if (ecdsa[i] != NULL)
2408 EC_KEY_free(ecdsa[i]);
2410 #ifndef OPENSSL_NO_ECDH
2411 for (i=0; i<EC_NUM; i++)
2413 if (ecdh_a[i] != NULL)
2414 EC_KEY_free(ecdh_a[i]);
2415 if (ecdh_b[i] != NULL)
2416 EC_KEY_free(ecdh_b[i]);
2424 static void print_message(const char *s, long num, int length)
2427 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2428 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
2429 (void)BIO_flush(bio_err);
2432 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2433 : "Doing %s %ld times on %d size blocks: ",s,num,length);
2434 (void)BIO_flush(bio_err);
2441 static void pkey_print_message(char *str, char *str2, long num, int bits,
2445 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2446 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
2447 (void)BIO_flush(bio_err);
2450 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2451 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
2452 (void)BIO_flush(bio_err);
2459 static void print_result(int alg,int run_no,int count,double time_used)
2461 BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n"
2462 : "%d %s's in %.2fs\n",count,names[alg],time_used);
2463 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2466 static char *sstrsep(char **string, const char *delim)
2469 char *token = *string;
2474 memset(isdelim, 0, sizeof isdelim);
2479 isdelim[(unsigned char)(*delim)] = 1;
2483 while (!isdelim[(unsigned char)(**string)])
2498 static int do_multi(int multi)
2503 static char sep[]=":";
2505 fds=malloc(multi*sizeof *fds);
2506 for(n=0 ; n < multi ; ++n)
2524 printf("Forked child %d\n",n);
2527 /* for now, assume the pipe is long enough to take all the output */
2528 for(n=0 ; n < multi ; ++n)
2534 f=fdopen(fds[n],"r");
2535 while(fgets(buf,sizeof buf,f))
2542 fprintf(stderr,"Don't understand line '%s' from child %d\n",
2546 printf("Got: %s from %d\n",buf,n);
2547 if(!strncmp(buf,"+F:",3))
2553 alg=atoi(sstrsep(&p,sep));
2555 for(j=0 ; j < SIZE_NUM ; ++j)
2556 results[alg][j]+=atof(sstrsep(&p,sep));
2558 else if(!strncmp(buf,"+F2:",4))
2564 k=atoi(sstrsep(&p,sep));
2567 d=atof(sstrsep(&p,sep));
2569 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2571 rsa_results[k][0]=d;
2573 d=atof(sstrsep(&p,sep));
2575 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2577 rsa_results[k][1]=d;
2579 else if(!strncmp(buf,"+F2:",4))
2585 k=atoi(sstrsep(&p,sep));
2588 d=atof(sstrsep(&p,sep));
2590 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2592 rsa_results[k][0]=d;
2594 d=atof(sstrsep(&p,sep));
2596 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2598 rsa_results[k][1]=d;
2600 else if(!strncmp(buf,"+F3:",4))
2606 k=atoi(sstrsep(&p,sep));
2609 d=atof(sstrsep(&p,sep));
2611 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2613 dsa_results[k][0]=d;
2615 d=atof(sstrsep(&p,sep));
2617 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2619 dsa_results[k][1]=d;
2621 #ifndef OPENSSL_NO_ECDSA
2622 else if(!strncmp(buf,"+F4:",4))
2628 k=atoi(sstrsep(&p,sep));
2631 d=atof(sstrsep(&p,sep));
2633 ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2635 ecdsa_results[k][0]=d;
2637 d=atof(sstrsep(&p,sep));
2639 ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2641 ecdsa_results[k][1]=d;
2645 #ifndef OPENSSL_NO_ECDH
2646 else if(!strncmp(buf,"+F5:",4))
2652 k=atoi(sstrsep(&p,sep));
2655 d=atof(sstrsep(&p,sep));
2657 ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2659 ecdh_results[k][0]=d;
2664 else if(!strncmp(buf,"+H:",3))
2668 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);