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 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
109 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
112 #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 # include <sys/types.h>
121 # include <sys/times.h>
124 # include <sys/time.h>
125 # include <sys/resource.h>
128 /* Depending on the VMS version, the tms structure is perhaps defined.
129 The __TMS macro will show if it was. If it wasn't defined, we should
130 undefine TIMES, since that tells the rest of the program how things
131 should be handled. -- Richard Levitte */
132 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
137 #include <sys/timeb.h>
140 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS)
141 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
144 #if defined(sun) || defined(__ultrix)
145 #define _POSIX_SOURCE
147 #include <sys/param.h>
150 #ifndef OPENSSL_NO_DES
151 #include <openssl/des.h>
153 #ifndef OPENSSL_NO_AES
154 #include <openssl/aes.h>
156 #ifndef OPENSSL_NO_MD2
157 #include <openssl/md2.h>
159 #ifndef OPENSSL_NO_MDC2
160 #include <openssl/mdc2.h>
162 #ifndef OPENSSL_NO_MD4
163 #include <openssl/md4.h>
165 #ifndef OPENSSL_NO_MD5
166 #include <openssl/md5.h>
168 #ifndef OPENSSL_NO_HMAC
169 #include <openssl/hmac.h>
171 #include <openssl/evp.h>
172 #ifndef OPENSSL_NO_SHA
173 #include <openssl/sha.h>
175 #ifndef OPENSSL_NO_RIPEMD
176 #include <openssl/ripemd.h>
178 #ifndef OPENSSL_NO_RC4
179 #include <openssl/rc4.h>
181 #ifndef OPENSSL_NO_RC5
182 #include <openssl/rc5.h>
184 #ifndef OPENSSL_NO_RC2
185 #include <openssl/rc2.h>
187 #ifndef OPENSSL_NO_IDEA
188 #include <openssl/idea.h>
190 #ifndef OPENSSL_NO_BF
191 #include <openssl/blowfish.h>
193 #ifndef OPENSSL_NO_CAST
194 #include <openssl/cast.h>
196 #ifndef OPENSSL_NO_RSA
197 #include <openssl/rsa.h>
198 #include "./testrsa.h"
200 #include <openssl/x509.h>
201 #ifndef OPENSSL_NO_DSA
202 #include "./testdsa.h"
204 #ifndef OPENSSL_NO_ECDSA
205 #include <openssl/ecdsa.h>
207 #ifndef OPENSSL_NO_ECDH
208 #include <openssl/ecdh.h>
211 /* The following if from times(3) man page. It may need to be changed */
213 # if defined(_SC_CLK_TCK) \
214 && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000)
215 # define HZ ((double)sysconf(_SC_CLK_TCK))
218 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
220 # else /* _BSD_CLK_TCK_ */
221 # define HZ ((double)_BSD_CLK_TCK_)
224 # define HZ ((double)CLK_TCK)
229 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
234 #define BUFSIZE ((long)1024*8+1)
237 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
239 static int usertime=1;
241 static double Time_F(int s);
242 static void print_message(const char *s,long num,int length);
243 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
244 static void print_result(int alg,int run_no,int count,double time_used);
246 static int do_multi(int multi);
255 #define MAX_ECDH_SIZE 256
257 static const char *names[ALGOR_NUM]={
258 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
259 "des cbc","des ede3","idea cbc",
260 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
261 "aes-128 cbc","aes-192 cbc","aes-256 cbc"};
262 static double results[ALGOR_NUM][SIZE_NUM];
263 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
264 static double rsa_results[RSA_NUM][2];
265 static double dsa_results[DSA_NUM][2];
266 static double ecdsa_results[EC_NUM][2];
267 static double ecdh_results[EC_NUM][1];
271 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
272 #define SIGRETTYPE void
274 #define SIGRETTYPE int
277 static SIGRETTYPE sig_done(int sig);
278 static SIGRETTYPE sig_done(int sig)
280 signal(SIGALRM,sig_done);
291 static double Time_F(int s)
298 static struct rusage tstart,tend;
303 getrusage(RUSAGE_SELF,&tstart);
310 getrusage(RUSAGE_SELF,&tend);
311 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
312 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
313 +((double)i)/1000000.0;
314 return((ret < 0.001)?0.001:ret);
319 static struct timeval tstart,tend;
322 gettimeofday_used = 1;
325 gettimeofday(&tstart,NULL);
330 gettimeofday(&tend,NULL);
331 i=(long)tend.tv_usec-(long)tstart.tv_usec;
332 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
333 return((ret < 0.001)?0.001:ret);
336 #else /* ndef USE_TOD */
341 static struct tms tstart,tend;
352 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
353 return((ret < 1e-3)?1e-3:ret);
356 # endif /* times() */
357 # if defined(TIMES) && defined(TIMEB)
360 # ifdef OPENSSL_SYS_VXWORKS
362 static unsigned long tick_start, tick_end;
366 tick_start = tickGet();
371 tick_end = tickGet();
372 ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
373 return((ret < 0.001)?0.001:ret);
376 # elif defined(TIMEB)
378 static struct timeb tstart,tend;
390 i=(long)tend.millitm-(long)tstart.millitm;
391 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
392 return((ret < 0.001)?0.001:ret);
400 static const int KDF1_SHA1_len = 20;
401 static void *KDF1_SHA1(void *in, size_t inlen, void *out, size_t outlen)
403 #ifndef OPENSSL_NO_SHA
404 if (outlen != SHA_DIGEST_LENGTH)
406 return SHA1(in, inlen, out);
413 int MAIN(int, char **);
415 int MAIN(int argc, char **argv)
417 #ifndef OPENSSL_NO_ENGINE
420 unsigned char *buf=NULL,*buf2=NULL;
422 long count=0,save_count=0;
424 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
427 #ifndef OPENSSL_NO_RSA
430 unsigned char md[EVP_MAX_MD_SIZE];
431 #ifndef OPENSSL_NO_MD2
432 unsigned char md2[MD2_DIGEST_LENGTH];
434 #ifndef OPENSSL_NO_MDC2
435 unsigned char mdc2[MDC2_DIGEST_LENGTH];
437 #ifndef OPENSSL_NO_MD4
438 unsigned char md4[MD4_DIGEST_LENGTH];
440 #ifndef OPENSSL_NO_MD5
441 unsigned char md5[MD5_DIGEST_LENGTH];
442 unsigned char hmac[MD5_DIGEST_LENGTH];
444 #ifndef OPENSSL_NO_SHA
445 unsigned char sha[SHA_DIGEST_LENGTH];
447 #ifndef OPENSSL_NO_RIPEMD
448 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
450 #ifndef OPENSSL_NO_RC4
453 #ifndef OPENSSL_NO_RC5
456 #ifndef OPENSSL_NO_RC2
459 #ifndef OPENSSL_NO_IDEA
460 IDEA_KEY_SCHEDULE idea_ks;
462 #ifndef OPENSSL_NO_BF
465 #ifndef OPENSSL_NO_CAST
468 static const unsigned char key16[16]=
469 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
470 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
471 static const unsigned char key24[24]=
472 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
473 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
474 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
475 static const unsigned char key32[32]=
476 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
477 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
478 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
479 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
480 #ifndef OPENSSL_NO_AES
481 #define MAX_BLOCK_SIZE 128
483 #define MAX_BLOCK_SIZE 64
485 unsigned char DES_iv[8];
486 unsigned char iv[MAX_BLOCK_SIZE/8];
487 #ifndef OPENSSL_NO_DES
488 DES_cblock *buf_as_des_cblock = NULL;
489 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
490 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
491 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
492 DES_key_schedule sch;
493 DES_key_schedule sch2;
494 DES_key_schedule sch3;
496 #ifndef OPENSSL_NO_AES
497 AES_KEY aes_ks1, aes_ks2, aes_ks3;
509 #define D_CBC_IDEA 10
513 #define D_CBC_CAST 14
514 #define D_CBC_128_AES 15
515 #define D_CBC_192_AES 16
516 #define D_CBC_256_AES 17
519 long c[ALGOR_NUM][SIZE_NUM];
545 #ifndef OPENSSL_NO_RSA
546 RSA *rsa_key[RSA_NUM];
547 long rsa_c[RSA_NUM][2];
548 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
549 static unsigned char *rsa_data[RSA_NUM]=
550 {test512,test1024,test2048,test4096};
551 static int rsa_data_length[RSA_NUM]={
552 sizeof(test512),sizeof(test1024),
553 sizeof(test2048),sizeof(test4096)};
555 #ifndef OPENSSL_NO_DSA
556 DSA *dsa_key[DSA_NUM];
557 long dsa_c[DSA_NUM][2];
558 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
560 #ifndef OPENSSL_NO_EC
561 /* We only test over the following curves as they are representative,
562 * To add tests over more curves, simply add the curve NID
563 * and curve name to the following arrays and increase the
564 * EC_NUM value accordingly.
566 static unsigned int test_curves[EC_NUM] =
570 NID_X9_62_prime192v1,
572 NID_X9_62_prime256v1,
587 static char * test_curves_names[EC_NUM] =
608 static int test_curves_bits[EC_NUM] =
610 160, 192, 224, 256, 384, 521,
611 163, 233, 283, 409, 571,
612 163, 233, 283, 409, 571
617 #ifndef OPENSSL_NO_ECDSA
618 unsigned char ecdsasig[256];
619 unsigned int ecdsasiglen;
620 EC_KEY *ecdsa[EC_NUM];
621 long ecdsa_c[EC_NUM][2];
624 #ifndef OPENSSL_NO_ECDH
625 EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
626 unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
627 int secret_size_a, secret_size_b;
630 long ecdh_c[EC_NUM][2];
633 int rsa_doit[RSA_NUM];
634 int dsa_doit[DSA_NUM];
635 int ecdsa_doit[EC_NUM];
636 int ecdh_doit[EC_NUM];
639 const EVP_CIPHER *evp_cipher=NULL;
640 const EVP_MD *evp_md=NULL;
651 memset(results, 0, sizeof(results));
652 #ifndef OPENSSL_NO_DSA
653 memset(dsa_key,0,sizeof(dsa_key));
655 #ifndef OPENSSL_NO_ECDSA
656 for (i=0; i<EC_NUM; i++) ecdsa[i] = NULL;
658 #ifndef OPENSSL_NO_ECDH
659 for (i=0; i<EC_NUM; i++)
668 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
669 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
671 if (!load_config(bio_err, NULL))
674 #ifndef OPENSSL_NO_RSA
675 memset(rsa_key,0,sizeof(rsa_key));
676 for (i=0; i<RSA_NUM; i++)
680 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
682 BIO_printf(bio_err,"out of memory\n");
685 #ifndef OPENSSL_NO_DES
686 buf_as_des_cblock = (DES_cblock *)buf;
688 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
690 BIO_printf(bio_err,"out of memory\n");
694 memset(c,0,sizeof(c));
695 memset(DES_iv,0,sizeof(DES_iv));
696 memset(iv,0,sizeof(iv));
698 for (i=0; i<ALGOR_NUM; i++)
700 for (i=0; i<RSA_NUM; i++)
702 for (i=0; i<DSA_NUM; i++)
704 #ifndef OPENSSL_NO_ECDSA
705 for (i=0; i<EC_NUM; i++)
708 #ifndef OPENSSL_NO_ECDH
709 for (i=0; i<EC_NUM; i++)
719 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
722 j--; /* Otherwise, -elapsed gets confused with
725 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
731 BIO_printf(bio_err,"no EVP given\n");
734 evp_cipher=EVP_get_cipherbyname(*argv);
737 evp_md=EVP_get_digestbyname(*argv);
739 if(!evp_cipher && !evp_md)
741 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
746 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
749 j--; /* Otherwise, -elapsed gets confused with
752 #ifndef OPENSSL_NO_ENGINE
753 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
759 BIO_printf(bio_err,"no engine given\n");
762 e = setup_engine(bio_err, *argv, 0);
763 /* j will be increased again further down. We just
764 don't want speed to confuse an engine with an
765 algorithm, especially when none is given (which
766 means all of them should be run) */
771 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
777 BIO_printf(bio_err,"no multi count given\n");
783 BIO_printf(bio_err,"bad multi count\n");
786 j--; /* Otherwise, -mr gets confused with
790 else if (argc > 0 && !strcmp(*argv,"-mr"))
793 j--; /* Otherwise, -mr gets confused with
797 #ifndef OPENSSL_NO_MD2
798 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
801 #ifndef OPENSSL_NO_MDC2
802 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
805 #ifndef OPENSSL_NO_MD4
806 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
809 #ifndef OPENSSL_NO_MD5
810 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
813 #ifndef OPENSSL_NO_MD5
814 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
817 #ifndef OPENSSL_NO_SHA
818 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
820 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
823 #ifndef OPENSSL_NO_RIPEMD
824 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
826 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
828 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
831 #ifndef OPENSSL_NO_RC4
832 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
835 #ifndef OPENSSL_NO_DES
836 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
837 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
840 #ifndef OPENSSL_NO_AES
841 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
842 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
843 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
846 #ifndef OPENSSL_NO_RSA
847 #if 0 /* was: #ifdef RSAref */
848 if (strcmp(*argv,"rsaref") == 0)
850 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
856 if (strcmp(*argv,"openssl") == 0)
858 RSA_set_default_method(RSA_PKCS1_SSLeay());
863 #endif /* !OPENSSL_NO_RSA */
864 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
865 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
866 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
867 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
868 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
869 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
870 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
872 #ifndef OPENSSL_NO_RC2
873 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
874 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
877 #ifndef OPENSSL_NO_RC5
878 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
879 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
882 #ifndef OPENSSL_NO_IDEA
883 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
884 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
887 #ifndef OPENSSL_NO_BF
888 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
889 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
890 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
893 #ifndef OPENSSL_NO_CAST
894 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
895 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
896 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
899 #ifndef OPENSSL_NO_DES
900 if (strcmp(*argv,"des") == 0)
907 #ifndef OPENSSL_NO_AES
908 if (strcmp(*argv,"aes") == 0)
910 doit[D_CBC_128_AES]=1;
911 doit[D_CBC_192_AES]=1;
912 doit[D_CBC_256_AES]=1;
916 #ifndef OPENSSL_NO_RSA
917 if (strcmp(*argv,"rsa") == 0)
919 rsa_doit[R_RSA_512]=1;
920 rsa_doit[R_RSA_1024]=1;
921 rsa_doit[R_RSA_2048]=1;
922 rsa_doit[R_RSA_4096]=1;
926 #ifndef OPENSSL_NO_DSA
927 if (strcmp(*argv,"dsa") == 0)
929 dsa_doit[R_DSA_512]=1;
930 dsa_doit[R_DSA_1024]=1;
934 #ifndef OPENSSL_NO_ECDSA
935 if (strcmp(*argv,"ecdsap160") == 0) ecdsa_doit[R_EC_P160]=2;
936 else if (strcmp(*argv,"ecdsap224") == 0) ecdsa_doit[R_EC_P224]=2;
937 else if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2;
938 else if (strcmp(*argv,"ecdsap384") == 0) ecdsa_doit[R_EC_P384]=2;
939 else if (strcmp(*argv,"ecdsap521") == 0) ecdsa_doit[R_EC_P521]=2;
940 else if (strcmp(*argv,"ecdsak163") == 0) ecdsa_doit[R_EC_K163]=2;
941 else if (strcmp(*argv,"ecdsak233") == 0) ecdsa_doit[R_EC_K233]=2;
942 else if (strcmp(*argv,"ecdsak283") == 0) ecdsa_doit[R_EC_K283]=2;
943 else if (strcmp(*argv,"ecdsak409") == 0) ecdsa_doit[R_EC_K409]=2;
944 else if (strcmp(*argv,"ecdsak571") == 0) ecdsa_doit[R_EC_K571]=2;
945 else if (strcmp(*argv,"ecdsab163") == 0) ecdsa_doit[R_EC_B163]=2;
946 else if (strcmp(*argv,"ecdsab233") == 0) ecdsa_doit[R_EC_B233]=2;
947 else if (strcmp(*argv,"ecdsab283") == 0) ecdsa_doit[R_EC_B283]=2;
948 else if (strcmp(*argv,"ecdsab409") == 0) ecdsa_doit[R_EC_B409]=2;
949 else if (strcmp(*argv,"ecdsab571") == 0) ecdsa_doit[R_EC_B571]=2;
950 else if (strcmp(*argv,"ecdsa") == 0)
952 for (i=0; i < EC_NUM; i++)
957 #ifndef OPENSSL_NO_ECDH
958 if (strcmp(*argv,"ecdhp160") == 0) ecdh_doit[R_EC_P160]=2;
959 else if (strcmp(*argv,"ecdhp224") == 0) ecdh_doit[R_EC_P224]=2;
960 else if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2;
961 else if (strcmp(*argv,"ecdhp384") == 0) ecdh_doit[R_EC_P384]=2;
962 else if (strcmp(*argv,"ecdhp521") == 0) ecdh_doit[R_EC_P521]=2;
963 else if (strcmp(*argv,"ecdhk163") == 0) ecdh_doit[R_EC_K163]=2;
964 else if (strcmp(*argv,"ecdhk233") == 0) ecdh_doit[R_EC_K233]=2;
965 else if (strcmp(*argv,"ecdhk283") == 0) ecdh_doit[R_EC_K283]=2;
966 else if (strcmp(*argv,"ecdhk409") == 0) ecdh_doit[R_EC_K409]=2;
967 else if (strcmp(*argv,"ecdhk571") == 0) ecdh_doit[R_EC_K571]=2;
968 else if (strcmp(*argv,"ecdhb163") == 0) ecdh_doit[R_EC_B163]=2;
969 else if (strcmp(*argv,"ecdhb233") == 0) ecdh_doit[R_EC_B233]=2;
970 else if (strcmp(*argv,"ecdhb283") == 0) ecdh_doit[R_EC_B283]=2;
971 else if (strcmp(*argv,"ecdhb409") == 0) ecdh_doit[R_EC_B409]=2;
972 else if (strcmp(*argv,"ecdhb571") == 0) ecdh_doit[R_EC_B571]=2;
973 else if (strcmp(*argv,"ecdh") == 0)
975 for (i=0; i < EC_NUM; i++)
981 BIO_printf(bio_err,"Error: bad option or value\n");
982 BIO_printf(bio_err,"\n");
983 BIO_printf(bio_err,"Available values:\n");
984 #ifndef OPENSSL_NO_MD2
985 BIO_printf(bio_err,"md2 ");
987 #ifndef OPENSSL_NO_MDC2
988 BIO_printf(bio_err,"mdc2 ");
990 #ifndef OPENSSL_NO_MD4
991 BIO_printf(bio_err,"md4 ");
993 #ifndef OPENSSL_NO_MD5
994 BIO_printf(bio_err,"md5 ");
995 #ifndef OPENSSL_NO_HMAC
996 BIO_printf(bio_err,"hmac ");
999 #ifndef OPENSSL_NO_SHA1
1000 BIO_printf(bio_err,"sha1 ");
1002 #ifndef OPENSSL_NO_RIPEMD160
1003 BIO_printf(bio_err,"rmd160");
1005 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
1006 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
1007 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
1008 BIO_printf(bio_err,"\n");
1011 #ifndef OPENSSL_NO_IDEA
1012 BIO_printf(bio_err,"idea-cbc ");
1014 #ifndef OPENSSL_NO_RC2
1015 BIO_printf(bio_err,"rc2-cbc ");
1017 #ifndef OPENSSL_NO_RC5
1018 BIO_printf(bio_err,"rc5-cbc ");
1020 #ifndef OPENSSL_NO_BF
1021 BIO_printf(bio_err,"bf-cbc");
1023 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1024 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
1025 BIO_printf(bio_err,"\n");
1027 #ifndef OPENSSL_NO_DES
1028 BIO_printf(bio_err,"des-cbc des-ede3 ");
1030 #ifndef OPENSSL_NO_AES
1031 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
1033 #ifndef OPENSSL_NO_RC4
1034 BIO_printf(bio_err,"rc4");
1036 BIO_printf(bio_err,"\n");
1038 #ifndef OPENSSL_NO_RSA
1039 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
1042 #ifndef OPENSSL_NO_DSA
1043 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
1045 #ifndef OPENSSL_NO_ECDSA
1046 BIO_printf(bio_err,"ecdsap160 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
1047 BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n");
1048 BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n");
1049 BIO_printf(bio_err,"ecdsa\n");
1051 #ifndef OPENSSL_NO_ECDH
1052 BIO_printf(bio_err,"ecdhp160 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n");
1053 BIO_printf(bio_err,"ecdhk163 ecdhk233 ecdhk283 ecdhk409 ecdhk571\n");
1054 BIO_printf(bio_err,"ecdhb163 ecdhb233 ecdhb283 ecdhb409 ecdhb571\n");
1055 BIO_printf(bio_err,"ecdh\n");
1058 #ifndef OPENSSL_NO_IDEA
1059 BIO_printf(bio_err,"idea ");
1061 #ifndef OPENSSL_NO_RC2
1062 BIO_printf(bio_err,"rc2 ");
1064 #ifndef OPENSSL_NO_DES
1065 BIO_printf(bio_err,"des ");
1067 #ifndef OPENSSL_NO_AES
1068 BIO_printf(bio_err,"aes ");
1070 #ifndef OPENSSL_NO_RSA
1071 BIO_printf(bio_err,"rsa ");
1073 #ifndef OPENSSL_NO_BF
1074 BIO_printf(bio_err,"blowfish");
1076 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1077 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
1078 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
1079 BIO_printf(bio_err,"\n");
1082 BIO_printf(bio_err,"\n");
1083 BIO_printf(bio_err,"Available options:\n");
1084 #if defined(TIMES) || defined(USE_TOD)
1085 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
1087 #ifndef OPENSSL_NO_ENGINE
1088 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
1090 BIO_printf(bio_err,"-evp e use EVP e.\n");
1091 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
1092 BIO_printf(bio_err,"-mr produce machine readable output.\n");
1094 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
1104 if(multi && do_multi(multi))
1110 for (i=0; i<ALGOR_NUM; i++)
1115 for (i=0; i<RSA_NUM; i++)
1117 for (i=0; i<DSA_NUM; i++)
1120 for (i=0; i<ALGOR_NUM; i++)
1121 if (doit[i]) pr_header++;
1123 if (usertime == 0 && !mr)
1124 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
1125 if (usertime <= 0 && !mr)
1127 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
1128 BIO_printf(bio_err,"program when this computer is idle.\n");
1131 #ifndef OPENSSL_NO_RSA
1132 for (i=0; i<RSA_NUM; i++)
1134 const unsigned char *p;
1137 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
1138 if (rsa_key[i] == NULL)
1140 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
1146 BIO_printf(bio_err,mr ? "+RK:%d:"
1147 : "Loaded RSA key, %d bit modulus and e= 0x",
1148 BN_num_bits(rsa_key[i]->n));
1149 BN_print(bio_err,rsa_key[i]->e);
1150 BIO_printf(bio_err,"\n");
1156 #ifndef OPENSSL_NO_DSA
1157 dsa_key[0]=get_dsa512();
1158 dsa_key[1]=get_dsa1024();
1159 dsa_key[2]=get_dsa2048();
1162 #ifndef OPENSSL_NO_DES
1163 DES_set_key_unchecked(&key,&sch);
1164 DES_set_key_unchecked(&key2,&sch2);
1165 DES_set_key_unchecked(&key3,&sch3);
1167 #ifndef OPENSSL_NO_AES
1168 AES_set_encrypt_key(key16,128,&aes_ks1);
1169 AES_set_encrypt_key(key24,192,&aes_ks2);
1170 AES_set_encrypt_key(key32,256,&aes_ks3);
1172 #ifndef OPENSSL_NO_IDEA
1173 idea_set_encrypt_key(key16,&idea_ks);
1175 #ifndef OPENSSL_NO_RC4
1176 RC4_set_key(&rc4_ks,16,key16);
1178 #ifndef OPENSSL_NO_RC2
1179 RC2_set_key(&rc2_ks,16,key16,128);
1181 #ifndef OPENSSL_NO_RC5
1182 RC5_32_set_key(&rc5_ks,16,key16,12);
1184 #ifndef OPENSSL_NO_BF
1185 BF_set_key(&bf_ks,16,key16);
1187 #ifndef OPENSSL_NO_CAST
1188 CAST_set_key(&cast_ks,16,key16);
1190 #ifndef OPENSSL_NO_RSA
1191 memset(rsa_c,0,sizeof(rsa_c));
1194 #ifndef OPENSSL_NO_DES
1195 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
1201 for (i=count; i; i--)
1202 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
1207 c[D_MD2][0]=count/10;
1208 c[D_MDC2][0]=count/10;
1213 c[D_RMD160][0]=count;
1214 c[D_RC4][0]=count*5;
1215 c[D_CBC_DES][0]=count;
1216 c[D_EDE3_DES][0]=count/3;
1217 c[D_CBC_IDEA][0]=count;
1218 c[D_CBC_RC2][0]=count;
1219 c[D_CBC_RC5][0]=count;
1220 c[D_CBC_BF][0]=count;
1221 c[D_CBC_CAST][0]=count;
1223 for (i=1; i<SIZE_NUM; i++)
1225 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1226 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1227 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1228 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1229 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1230 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1231 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1233 for (i=1; i<SIZE_NUM; i++)
1237 l0=(long)lengths[i-1];
1238 l1=(long)lengths[i];
1239 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1240 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1241 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1242 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1243 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1244 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1245 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1246 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1248 #ifndef OPENSSL_NO_RSA
1249 rsa_c[R_RSA_512][0]=count/2000;
1250 rsa_c[R_RSA_512][1]=count/400;
1251 for (i=1; i<RSA_NUM; i++)
1253 rsa_c[i][0]=rsa_c[i-1][0]/8;
1254 rsa_c[i][1]=rsa_c[i-1][1]/4;
1255 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1259 if (rsa_c[i][0] == 0)
1268 #ifndef OPENSSL_NO_DSA
1269 dsa_c[R_DSA_512][0]=count/1000;
1270 dsa_c[R_DSA_512][1]=count/1000/2;
1271 for (i=1; i<DSA_NUM; i++)
1273 dsa_c[i][0]=dsa_c[i-1][0]/4;
1274 dsa_c[i][1]=dsa_c[i-1][1]/4;
1275 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1288 #ifndef OPENSSL_NO_ECDSA
1289 ecdsa_c[R_EC_P160][0]=count/1000;
1290 ecdsa_c[R_EC_P160][1]=count/1000/2;
1291 for (i=R_EC_P224; i<=R_EC_P521; i++)
1293 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1294 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1295 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1299 if (ecdsa_c[i] == 0)
1306 ecdsa_c[R_EC_K163][0]=count/1000;
1307 ecdsa_c[R_EC_K163][1]=count/1000/2;
1308 for (i=R_EC_K233; i<=R_EC_K571; i++)
1310 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1311 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1312 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1316 if (ecdsa_c[i] == 0)
1323 ecdsa_c[R_EC_B163][0]=count/1000;
1324 ecdsa_c[R_EC_B163][1]=count/1000/2;
1325 for (i=R_EC_B233; i<=R_EC_B571; i++)
1327 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1328 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1329 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1333 if (ecdsa_c[i] == 0)
1342 #ifndef OPENSSL_NO_ECDH
1343 ecdh_c[R_EC_P160][0]=count/1000;
1344 ecdh_c[R_EC_P160][1]=count/1000;
1345 for (i=R_EC_P224; i<=R_EC_P521; i++)
1347 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1348 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1349 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1360 ecdh_c[R_EC_K163][0]=count/1000;
1361 ecdh_c[R_EC_K163][1]=count/1000;
1362 for (i=R_EC_K233; i<=R_EC_K571; i++)
1364 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1365 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1366 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1377 ecdh_c[R_EC_B163][0]=count/1000;
1378 ecdh_c[R_EC_B163][1]=count/1000;
1379 for (i=R_EC_B233; i<=R_EC_B571; i++)
1381 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1382 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1383 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1396 #define COND(d) (count < (d))
1397 #define COUNT(d) (d)
1399 /* not worth fixing */
1400 # error "You cannot disable DES on systems without SIGALRM."
1401 #endif /* OPENSSL_NO_DES */
1403 #define COND(c) (run)
1404 #define COUNT(d) (count)
1405 signal(SIGALRM,sig_done);
1406 #endif /* SIGALRM */
1408 #ifndef OPENSSL_NO_MD2
1411 for (j=0; j<SIZE_NUM; j++)
1413 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1415 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1416 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1418 print_result(D_MD2,j,count,d);
1422 #ifndef OPENSSL_NO_MDC2
1425 for (j=0; j<SIZE_NUM; j++)
1427 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1429 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1430 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1432 print_result(D_MDC2,j,count,d);
1437 #ifndef OPENSSL_NO_MD4
1440 for (j=0; j<SIZE_NUM; j++)
1442 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1444 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1445 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1447 print_result(D_MD4,j,count,d);
1452 #ifndef OPENSSL_NO_MD5
1455 for (j=0; j<SIZE_NUM; j++)
1457 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1459 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1460 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1462 print_result(D_MD5,j,count,d);
1467 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1472 HMAC_CTX_init(&hctx);
1473 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1474 16,EVP_md5(), NULL);
1476 for (j=0; j<SIZE_NUM; j++)
1478 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1480 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1482 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1483 HMAC_Update(&hctx,buf,lengths[j]);
1484 HMAC_Final(&hctx,&(hmac[0]),NULL);
1487 print_result(D_HMAC,j,count,d);
1489 HMAC_CTX_cleanup(&hctx);
1492 #ifndef OPENSSL_NO_SHA
1495 for (j=0; j<SIZE_NUM; j++)
1497 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1499 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1500 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1502 print_result(D_SHA1,j,count,d);
1506 #ifndef OPENSSL_NO_RIPEMD
1509 for (j=0; j<SIZE_NUM; j++)
1511 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1513 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1514 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1516 print_result(D_RMD160,j,count,d);
1520 #ifndef OPENSSL_NO_RC4
1523 for (j=0; j<SIZE_NUM; j++)
1525 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1527 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1528 RC4(&rc4_ks,(unsigned int)lengths[j],
1531 print_result(D_RC4,j,count,d);
1535 #ifndef OPENSSL_NO_DES
1536 if (doit[D_CBC_DES])
1538 for (j=0; j<SIZE_NUM; j++)
1540 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1542 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1543 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1544 &DES_iv,DES_ENCRYPT);
1546 print_result(D_CBC_DES,j,count,d);
1550 if (doit[D_EDE3_DES])
1552 for (j=0; j<SIZE_NUM; j++)
1554 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1556 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1557 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1559 &DES_iv,DES_ENCRYPT);
1561 print_result(D_EDE3_DES,j,count,d);
1565 #ifndef OPENSSL_NO_AES
1566 if (doit[D_CBC_128_AES])
1568 for (j=0; j<SIZE_NUM; j++)
1570 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1572 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1573 AES_cbc_encrypt(buf,buf,
1574 (unsigned long)lengths[j],&aes_ks1,
1577 print_result(D_CBC_128_AES,j,count,d);
1580 if (doit[D_CBC_192_AES])
1582 for (j=0; j<SIZE_NUM; j++)
1584 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1586 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1587 AES_cbc_encrypt(buf,buf,
1588 (unsigned long)lengths[j],&aes_ks2,
1591 print_result(D_CBC_192_AES,j,count,d);
1594 if (doit[D_CBC_256_AES])
1596 for (j=0; j<SIZE_NUM; j++)
1598 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1600 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1601 AES_cbc_encrypt(buf,buf,
1602 (unsigned long)lengths[j],&aes_ks3,
1605 print_result(D_CBC_256_AES,j,count,d);
1610 #ifndef OPENSSL_NO_IDEA
1611 if (doit[D_CBC_IDEA])
1613 for (j=0; j<SIZE_NUM; j++)
1615 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1617 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1618 idea_cbc_encrypt(buf,buf,
1619 (unsigned long)lengths[j],&idea_ks,
1622 print_result(D_CBC_IDEA,j,count,d);
1626 #ifndef OPENSSL_NO_RC2
1627 if (doit[D_CBC_RC2])
1629 for (j=0; j<SIZE_NUM; j++)
1631 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1633 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1634 RC2_cbc_encrypt(buf,buf,
1635 (unsigned long)lengths[j],&rc2_ks,
1638 print_result(D_CBC_RC2,j,count,d);
1642 #ifndef OPENSSL_NO_RC5
1643 if (doit[D_CBC_RC5])
1645 for (j=0; j<SIZE_NUM; j++)
1647 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1649 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1650 RC5_32_cbc_encrypt(buf,buf,
1651 (unsigned long)lengths[j],&rc5_ks,
1654 print_result(D_CBC_RC5,j,count,d);
1658 #ifndef OPENSSL_NO_BF
1661 for (j=0; j<SIZE_NUM; j++)
1663 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1665 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1666 BF_cbc_encrypt(buf,buf,
1667 (unsigned long)lengths[j],&bf_ks,
1670 print_result(D_CBC_BF,j,count,d);
1674 #ifndef OPENSSL_NO_CAST
1675 if (doit[D_CBC_CAST])
1677 for (j=0; j<SIZE_NUM; j++)
1679 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1681 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1682 CAST_cbc_encrypt(buf,buf,
1683 (unsigned long)lengths[j],&cast_ks,
1686 print_result(D_CBC_CAST,j,count,d);
1693 for (j=0; j<SIZE_NUM; j++)
1700 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1701 /* -O3 -fschedule-insns messes up an
1702 * optimization here! names[D_EVP]
1703 * somehow becomes NULL */
1704 print_message(names[D_EVP],save_count,
1707 EVP_CIPHER_CTX_init(&ctx);
1709 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1711 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1715 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1716 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1718 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1719 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1721 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1723 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1725 EVP_CIPHER_CTX_cleanup(&ctx);
1729 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1730 print_message(names[D_EVP],save_count,
1734 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1735 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1739 print_result(D_EVP,j,count,d);
1743 RAND_pseudo_bytes(buf,36);
1744 #ifndef OPENSSL_NO_RSA
1745 for (j=0; j<RSA_NUM; j++)
1748 if (!rsa_doit[j]) continue;
1749 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1752 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1753 ERR_print_errors(bio_err);
1758 pkey_print_message("private","rsa",
1759 rsa_c[j][0],rsa_bits[j],
1761 /* RSA_blinding_on(rsa_key[j],NULL); */
1763 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1765 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1766 &rsa_num, rsa_key[j]);
1770 "RSA sign failure\n");
1771 ERR_print_errors(bio_err);
1777 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1778 : "%ld %d bit private RSA's in %.2fs\n",
1779 count,rsa_bits[j],d);
1780 rsa_results[j][0]=d/(double)count;
1785 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1788 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1789 ERR_print_errors(bio_err);
1794 pkey_print_message("public","rsa",
1795 rsa_c[j][1],rsa_bits[j],
1798 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1800 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1801 rsa_num, rsa_key[j]);
1805 "RSA verify failure\n");
1806 ERR_print_errors(bio_err);
1812 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1813 : "%ld %d bit public RSA's in %.2fs\n",
1814 count,rsa_bits[j],d);
1815 rsa_results[j][1]=d/(double)count;
1821 /* if longer than 10s, don't do any more */
1822 for (j++; j<RSA_NUM; j++)
1828 RAND_pseudo_bytes(buf,20);
1829 #ifndef OPENSSL_NO_DSA
1830 if (RAND_status() != 1)
1832 RAND_seed(rnd_seed, sizeof rnd_seed);
1835 for (j=0; j<DSA_NUM; j++)
1840 if (!dsa_doit[j]) continue;
1841 /* DSA_generate_key(dsa_key[j]); */
1842 /* DSA_sign_setup(dsa_key[j],NULL); */
1843 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1847 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1848 ERR_print_errors(bio_err);
1853 pkey_print_message("sign","dsa",
1854 dsa_c[j][0],dsa_bits[j],
1857 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1859 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1864 "DSA sign failure\n");
1865 ERR_print_errors(bio_err);
1871 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1872 : "%ld %d bit DSA signs in %.2fs\n",
1873 count,dsa_bits[j],d);
1874 dsa_results[j][0]=d/(double)count;
1878 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1882 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1883 ERR_print_errors(bio_err);
1888 pkey_print_message("verify","dsa",
1889 dsa_c[j][1],dsa_bits[j],
1892 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1894 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1899 "DSA verify failure\n");
1900 ERR_print_errors(bio_err);
1906 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1907 : "%ld %d bit DSA verify in %.2fs\n",
1908 count,dsa_bits[j],d);
1909 dsa_results[j][1]=d/(double)count;
1914 /* if longer than 10s, don't do any more */
1915 for (j++; j<DSA_NUM; j++)
1919 if (rnd_fake) RAND_cleanup();
1922 #ifndef OPENSSL_NO_ECDSA
1923 if (RAND_status() != 1)
1925 RAND_seed(rnd_seed, sizeof rnd_seed);
1928 for (j=0; j<EC_NUM; j++)
1932 if (!ecdsa_doit[j]) continue; /* Ignore Curve */
1933 ecdsa[j] = EC_KEY_new();
1934 if (ecdsa[j] == NULL)
1936 BIO_printf(bio_err,"ECDSA failure.\n");
1937 ERR_print_errors(bio_err);
1942 ecdsa[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
1943 /* Could not obtain group information */
1944 if (ecdsa[j]->group == NULL)
1946 BIO_printf(bio_err,"ECDSA failure.Could not obtain group information\n");
1947 ERR_print_errors(bio_err);
1953 EC_GROUP_precompute_mult(ecdsa[j]->group, NULL);
1955 /* Perform ECDSA signature test */
1956 EC_KEY_generate_key(ecdsa[j]);
1957 ret = ECDSA_sign(0, buf, 20, ecdsasig,
1958 &ecdsasiglen, ecdsa[j]);
1961 BIO_printf(bio_err,"ECDSA sign failure. No ECDSA sign will be done.\n");
1962 ERR_print_errors(bio_err);
1967 pkey_print_message("sign","ecdsa",
1969 test_curves_bits[j],
1973 for (count=0,run=1; COND(ecdsa_c[j][0]);
1976 ret=ECDSA_sign(0, buf, 20,
1977 ecdsasig, &ecdsasiglen,
1981 BIO_printf(bio_err, "ECDSA sign failure\n");
1982 ERR_print_errors(bio_err);
1989 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
1990 "%ld %d bit ECDSA signs in %.2fs \n",
1991 count, test_curves_bits[j], d);
1992 ecdsa_results[j][0]=d/(double)count;
1996 /* Perform ECDSA verification test */
1997 ret=ECDSA_verify(0, buf, 20, ecdsasig,
1998 ecdsasiglen, ecdsa[j]);
2001 BIO_printf(bio_err,"ECDSA verify failure. No ECDSA verify will be done.\n");
2002 ERR_print_errors(bio_err);
2007 pkey_print_message("verify","ecdsa",
2009 test_curves_bits[j],
2012 for (count=0,run=1; COND(ecdsa_c[j][1]); count++)
2014 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
2017 BIO_printf(bio_err, "ECDSA verify failure\n");
2018 ERR_print_errors(bio_err);
2024 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
2025 : "%ld %d bit ECDSA verify in %.2fs\n",
2026 count, test_curves_bits[j], d);
2027 ecdsa_results[j][1]=d/(double)count;
2032 /* if longer than 10s, don't do any more */
2033 for (j++; j<EC_NUM; j++)
2039 if (rnd_fake) RAND_cleanup();
2042 #ifndef OPENSSL_NO_ECDH
2043 if (RAND_status() != 1)
2045 RAND_seed(rnd_seed, sizeof rnd_seed);
2048 for (j=0; j<EC_NUM; j++)
2050 if (!ecdh_doit[j]) continue;
2051 ecdh_a[j] = EC_KEY_new();
2052 ecdh_b[j] = EC_KEY_new();
2053 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2055 BIO_printf(bio_err,"ECDH failure.\n");
2056 ERR_print_errors(bio_err);
2061 ecdh_a[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
2062 if (ecdh_a[j]->group == NULL)
2064 BIO_printf(bio_err,"ECDH failure.\n");
2065 ERR_print_errors(bio_err);
2070 ecdh_b[j]->group = EC_GROUP_dup(ecdh_a[j]->group);
2072 /* generate two ECDH key pairs */
2073 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2074 !EC_KEY_generate_key(ecdh_b[j]))
2076 BIO_printf(bio_err,"ECDH key generation failure.\n");
2077 ERR_print_errors(bio_err);
2082 secret_size_a = ECDH_compute_key(secret_a, KDF1_SHA1_len,
2084 ecdh_a[j], KDF1_SHA1);
2085 secret_size_b = ECDH_compute_key(secret_b, KDF1_SHA1_len,
2087 ecdh_b[j], KDF1_SHA1);
2088 if (secret_size_a != secret_size_b)
2093 for (secret_idx = 0;
2094 (secret_idx < secret_size_a)
2095 && (ecdh_checks == 1);
2098 if (secret_a[secret_idx] != secret_b[secret_idx])
2102 if (ecdh_checks == 0)
2104 BIO_printf(bio_err,"ECDH computations don't match.\n");
2105 ERR_print_errors(bio_err);
2109 pkey_print_message("","ecdh",
2111 test_curves_bits[j],
2114 for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2116 ECDH_compute_key(secret_a, KDF1_SHA1_len,
2118 ecdh_a[j], KDF1_SHA1);
2121 BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2122 count, test_curves_bits[j], d);
2123 ecdh_results[j][0]=d/(double)count;
2131 /* if longer than 10s, don't do any more */
2132 for (j++; j<EC_NUM; j++)
2136 if (rnd_fake) RAND_cleanup();
2143 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
2144 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
2146 printf("%s ",BN_options());
2147 #ifndef OPENSSL_NO_MD2
2148 printf("%s ",MD2_options());
2150 #ifndef OPENSSL_NO_RC4
2151 printf("%s ",RC4_options());
2153 #ifndef OPENSSL_NO_DES
2154 printf("%s ",DES_options());
2156 #ifndef OPENSSL_NO_AES
2157 printf("%s ",AES_options());
2159 #ifndef OPENSSL_NO_IDEA
2160 printf("%s ",idea_options());
2162 #ifndef OPENSSL_NO_BF
2163 printf("%s ",BF_options());
2165 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2166 printf("available timing options: ");
2177 #define as_string(s) (#s)
2178 printf("HZ=%g", (double)HZ);
2180 printf(" [sysconf value]");
2184 printf("timing function used: %s%s%s%s%s%s%s\n",
2185 (ftime_used ? "ftime" : ""),
2186 (ftime_used + times_used > 1 ? "," : ""),
2187 (times_used ? "times" : ""),
2188 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
2189 (gettimeofday_used ? "gettimeofday" : ""),
2190 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
2191 (getrusage_used ? "getrusage" : ""));
2197 fprintf(stdout,"+H");
2200 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
2201 fprintf(stdout,"type ");
2203 for (j=0; j<SIZE_NUM; j++)
2204 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
2205 fprintf(stdout,"\n");
2208 for (k=0; k<ALGOR_NUM; k++)
2210 if (!doit[k]) continue;
2212 fprintf(stdout,"+F:%d:%s",k,names[k]);
2214 fprintf(stdout,"%-13s",names[k]);
2215 for (j=0; j<SIZE_NUM; j++)
2217 if (results[k][j] > 10000 && !mr)
2218 fprintf(stdout," %11.2fk",results[k][j]/1e3);
2220 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
2222 fprintf(stdout,"\n");
2224 #ifndef OPENSSL_NO_RSA
2226 for (k=0; k<RSA_NUM; k++)
2228 if (!rsa_doit[k]) continue;
2231 printf("%18ssign verify sign/s verify/s\n"," ");
2235 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2236 k,rsa_bits[k],rsa_results[k][0],
2239 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2240 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2241 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
2244 #ifndef OPENSSL_NO_DSA
2246 for (k=0; k<DSA_NUM; k++)
2248 if (!dsa_doit[k]) continue;
2251 printf("%18ssign verify sign/s verify/s\n"," ");
2255 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2256 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2258 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2259 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2260 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
2263 #ifndef OPENSSL_NO_ECDSA
2265 for (k=0; k<EC_NUM; k++)
2267 if (!ecdsa_doit[k]) continue;
2270 printf("%30ssign verify sign/s verify/s\n"," ");
2275 fprintf(stdout,"+F4:%u:%u:%f:%f\n",
2276 k, test_curves_bits[k],
2277 ecdsa_results[k][0],ecdsa_results[k][1]);
2280 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2281 test_curves_bits[k],
2282 test_curves_names[k],
2283 ecdsa_results[k][0],ecdsa_results[k][1],
2284 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2289 #ifndef OPENSSL_NO_ECDH
2291 for (k=0; k<EC_NUM; k++)
2293 if (!ecdh_doit[k]) continue;
2296 printf("%30sop op/s\n"," ");
2300 fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2301 k, test_curves_bits[k],
2302 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2305 fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2306 test_curves_bits[k],
2307 test_curves_names[k],
2308 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2315 ERR_print_errors(bio_err);
2316 if (buf != NULL) OPENSSL_free(buf);
2317 if (buf2 != NULL) OPENSSL_free(buf2);
2318 #ifndef OPENSSL_NO_RSA
2319 for (i=0; i<RSA_NUM; i++)
2320 if (rsa_key[i] != NULL)
2321 RSA_free(rsa_key[i]);
2323 #ifndef OPENSSL_NO_DSA
2324 for (i=0; i<DSA_NUM; i++)
2325 if (dsa_key[i] != NULL)
2326 DSA_free(dsa_key[i]);
2329 #ifndef OPENSSL_NO_ECDSA
2330 for (i=0; i<EC_NUM; i++)
2331 if (ecdsa[i] != NULL)
2332 EC_KEY_free(ecdsa[i]);
2334 #ifndef OPENSSL_NO_ECDH
2335 for (i=0; i<EC_NUM; i++)
2337 if (ecdh_a[i] != NULL)
2338 EC_KEY_free(ecdh_a[i]);
2339 if (ecdh_b[i] != NULL)
2340 EC_KEY_free(ecdh_b[i]);
2348 static void print_message(const char *s, long num, int length)
2351 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2352 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
2353 (void)BIO_flush(bio_err);
2356 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2357 : "Doing %s %ld times on %d size blocks: ",s,num,length);
2358 (void)BIO_flush(bio_err);
2365 static void pkey_print_message(char *str, char *str2, long num, int bits,
2369 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2370 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
2371 (void)BIO_flush(bio_err);
2374 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2375 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
2376 (void)BIO_flush(bio_err);
2383 static void print_result(int alg,int run_no,int count,double time_used)
2385 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
2386 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
2387 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2390 static char *sstrsep(char **string, const char *delim)
2393 char *token = *string;
2398 memset(isdelim, 0, sizeof isdelim);
2403 isdelim[(unsigned char)(*delim)] = 1;
2407 while (!isdelim[(unsigned char)(**string)])
2422 static int do_multi(int multi)
2427 static char sep[]=":";
2429 fds=malloc(multi*sizeof *fds);
2430 for(n=0 ; n < multi ; ++n)
2448 printf("Forked child %d\n",n);
2451 /* for now, assume the pipe is long enough to take all the output */
2452 for(n=0 ; n < multi ; ++n)
2458 f=fdopen(fds[n],"r");
2459 while(fgets(buf,sizeof buf,f))
2466 fprintf(stderr,"Don't understand line '%s' from child %d\n",
2470 printf("Got: %s from %d\n",buf,n);
2471 if(!strncmp(buf,"+F:",3))
2477 alg=atoi(sstrsep(&p,sep));
2479 for(j=0 ; j < SIZE_NUM ; ++j)
2480 results[alg][j]+=atof(sstrsep(&p,sep));
2482 else if(!strncmp(buf,"+F2:",4))
2488 k=atoi(sstrsep(&p,sep));
2491 d=atof(sstrsep(&p,sep));
2493 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2495 rsa_results[k][0]=d;
2497 d=atof(sstrsep(&p,sep));
2499 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2501 rsa_results[k][1]=d;
2503 else if(!strncmp(buf,"+F2:",4))
2509 k=atoi(sstrsep(&p,sep));
2512 d=atof(sstrsep(&p,sep));
2514 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2516 rsa_results[k][0]=d;
2518 d=atof(sstrsep(&p,sep));
2520 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2522 rsa_results[k][1]=d;
2524 else if(!strncmp(buf,"+F3:",4))
2530 k=atoi(sstrsep(&p,sep));
2533 d=atof(sstrsep(&p,sep));
2535 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2537 dsa_results[k][0]=d;
2539 d=atof(sstrsep(&p,sep));
2541 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2543 dsa_results[k][1]=d;
2545 #ifndef OPENSSL_NO_ECDSA
2546 else if(!strncmp(buf,"+F4:",4))
2552 k=atoi(sstrsep(&p,sep));
2555 d=atof(sstrsep(&p,sep));
2557 ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2559 ecdsa_results[k][0]=d;
2561 d=atof(sstrsep(&p,sep));
2563 ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2565 ecdsa_results[k][1]=d;
2569 #ifndef OPENSSL_NO_ECDH
2570 else if(!strncmp(buf,"+F5:",4))
2576 k=atoi(sstrsep(&p,sep));
2579 d=atof(sstrsep(&p,sep));
2581 ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2583 ecdh_results[k][0]=d;
2588 else if(!strncmp(buf,"+H:",3))
2592 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);