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 * In addition, Sun covenants to all licensees who provide a reciprocal
68 * covenant with respect to their own patents if any, not to sue under
69 * current and future patent claims necessarily infringed by the making,
70 * using, practicing, selling, offering for sale and/or otherwise
71 * disposing of the Contribution as delivered hereunder
72 * (or portions thereof), provided that such covenant shall not apply:
73 * 1) for code that a licensee deletes from the Contribution;
74 * 2) separates from the Contribution; or
75 * 3) for infringements caused by:
76 * i) the modification of the Contribution or
77 * ii) the combination of the Contribution with other software or
78 * devices where such combination causes the infringement.
80 * The ECDH and ECDSA speed test software is originally written by
81 * Sumit Gupta of Sun Microsystems Laboratories.
85 /* most of this code has been pilfered from my libdes speed.c program */
89 #define RSA_SECONDS 10
90 #define DSA_SECONDS 10
91 #define ECDSA_SECONDS 10
92 #define ECDH_SECONDS 10
94 /* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
95 /* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
98 #define PROG speed_main
106 #ifdef OPENSSL_NO_STDIO
109 #include <openssl/crypto.h>
110 #include <openssl/rand.h>
111 #include <openssl/err.h>
112 #include <openssl/evp.h>
113 #include <openssl/objects.h>
114 #if !defined(OPENSSL_SYS_MSDOS)
115 #include OPENSSL_UNISTD
118 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
120 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
123 #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 */
131 # include <sys/types.h>
132 # include <sys/times.h>
135 # include <sys/time.h>
136 # include <sys/resource.h>
139 /* Depending on the VMS version, the tms structure is perhaps defined.
140 The __TMS macro will show if it was. If it wasn't defined, we should
141 undefine TIMES, since that tells the rest of the program how things
142 should be handled. -- Richard Levitte */
143 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
148 #include <sys/timeb.h>
151 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS)
152 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
155 #if defined(sun) || defined(__ultrix)
156 #define _POSIX_SOURCE
158 #include <sys/param.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 "./testdsa.h"
215 #ifndef OPENSSL_NO_ECDSA
216 #include <openssl/ecdsa.h>
218 #ifndef OPENSSL_NO_ECDH
219 #include <openssl/ecdh.h>
222 /* The following if from times(3) man page. It may need to be changed */
225 # define HZ ((double)sysconf(_SC_CLK_TCK))
228 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
230 # else /* _BSD_CLK_TCK_ */
231 # define HZ ((double)_BSD_CLK_TCK_)
234 # define HZ ((double)CLK_TCK)
239 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
244 #define BUFSIZE ((long)1024*8+1)
247 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
249 static int usertime=1;
251 static double Time_F(int s);
252 static void print_message(const char *s,long num,int length);
253 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
254 static void print_result(int alg,int run_no,int count,double time_used);
256 static int do_multi(int multi);
265 #define MAX_ECDH_SIZE 256
267 static const char *names[ALGOR_NUM]={
268 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
269 "des cbc","des ede3","idea cbc",
270 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
271 "aes-128 cbc","aes-192 cbc","aes-256 cbc"};
272 static double results[ALGOR_NUM][SIZE_NUM];
273 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
274 static double rsa_results[RSA_NUM][2];
275 static double dsa_results[DSA_NUM][2];
276 static double ecdsa_results[EC_NUM][2];
277 static double ecdh_results[EC_NUM][1];
281 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
282 #define SIGRETTYPE void
284 #define SIGRETTYPE int
287 static SIGRETTYPE sig_done(int sig);
288 static SIGRETTYPE sig_done(int sig)
290 signal(SIGALRM,sig_done);
301 static double Time_F(int s)
308 static struct rusage tstart,tend;
313 getrusage(RUSAGE_SELF,&tstart);
320 getrusage(RUSAGE_SELF,&tend);
321 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
322 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
323 +((double)i)/1000000.0;
324 return((ret < 0.001)?0.001:ret);
329 static struct timeval tstart,tend;
332 gettimeofday_used = 1;
335 gettimeofday(&tstart,NULL);
340 gettimeofday(&tend,NULL);
341 i=(long)tend.tv_usec-(long)tstart.tv_usec;
342 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
343 return((ret < 0.001)?0.001:ret);
346 #else /* ndef USE_TOD */
351 static struct tms tstart,tend;
362 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
363 return((ret < 1e-3)?1e-3:ret);
366 # endif /* times() */
367 # if defined(TIMES) && defined(TIMEB)
370 # ifdef OPENSSL_SYS_VXWORKS
372 static unsigned long tick_start, tick_end;
376 tick_start = tickGet();
381 tick_end = tickGet();
382 ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
383 return((ret < 0.001)?0.001:ret);
386 # elif defined(TIMEB)
388 static struct timeb tstart,tend;
400 i=(long)tend.millitm-(long)tstart.millitm;
401 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
402 return((ret < 0.001)?0.001:ret);
409 int MAIN(int, char **);
411 int MAIN(int argc, char **argv)
414 unsigned char *buf=NULL,*buf2=NULL;
416 long count=0,save_count=0;
418 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
421 #ifndef OPENSSL_NO_RSA
424 unsigned char md[EVP_MAX_MD_SIZE];
425 #ifndef OPENSSL_NO_MD2
426 unsigned char md2[MD2_DIGEST_LENGTH];
428 #ifndef OPENSSL_NO_MDC2
429 unsigned char mdc2[MDC2_DIGEST_LENGTH];
431 #ifndef OPENSSL_NO_MD4
432 unsigned char md4[MD4_DIGEST_LENGTH];
434 #ifndef OPENSSL_NO_MD5
435 unsigned char md5[MD5_DIGEST_LENGTH];
436 unsigned char hmac[MD5_DIGEST_LENGTH];
438 #ifndef OPENSSL_NO_SHA
439 unsigned char sha[SHA_DIGEST_LENGTH];
441 #ifndef OPENSSL_NO_RIPEMD
442 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
444 #ifndef OPENSSL_NO_RC4
447 #ifndef OPENSSL_NO_RC5
450 #ifndef OPENSSL_NO_RC2
453 #ifndef OPENSSL_NO_IDEA
454 IDEA_KEY_SCHEDULE idea_ks;
456 #ifndef OPENSSL_NO_BF
459 #ifndef OPENSSL_NO_CAST
462 static const unsigned char key16[16]=
463 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
464 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
465 static const unsigned char key24[24]=
466 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
467 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
468 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
469 static const unsigned char key32[32]=
470 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
471 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
472 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
473 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
474 #ifndef OPENSSL_NO_AES
475 #define MAX_BLOCK_SIZE 128
477 #define MAX_BLOCK_SIZE 64
479 unsigned char DES_iv[8];
480 unsigned char iv[MAX_BLOCK_SIZE/8];
481 #ifndef OPENSSL_NO_DES
482 DES_cblock *buf_as_des_cblock = NULL;
483 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
484 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
485 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
486 DES_key_schedule sch;
487 DES_key_schedule sch2;
488 DES_key_schedule sch3;
490 #ifndef OPENSSL_NO_AES
491 AES_KEY aes_ks1, aes_ks2, aes_ks3;
503 #define D_CBC_IDEA 10
507 #define D_CBC_CAST 14
508 #define D_CBC_128_AES 15
509 #define D_CBC_192_AES 16
510 #define D_CBC_256_AES 17
513 long c[ALGOR_NUM][SIZE_NUM];
538 #ifndef OPENSSL_NO_RSA
539 RSA *rsa_key[RSA_NUM];
540 long rsa_c[RSA_NUM][2];
541 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
542 static unsigned char *rsa_data[RSA_NUM]=
543 {test512,test1024,test2048,test4096};
544 static int rsa_data_length[RSA_NUM]={
545 sizeof(test512),sizeof(test1024),
546 sizeof(test2048),sizeof(test4096)};
548 #ifndef OPENSSL_NO_DSA
549 DSA *dsa_key[DSA_NUM];
550 long dsa_c[DSA_NUM][2];
551 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
553 #ifndef OPENSSL_NO_EC
554 /* We only test over the following curves as they are representative,
555 * To add tests over more curves, simply add the curve NID
556 * and curve name to the following arrays and increase the
557 * EC_NUM value accordingly.
559 static unsigned int test_curves[EC_NUM] =
562 EC_GROUP_SECG_PRIME_160R1,
563 EC_GROUP_NIST_PRIME_224,
564 EC_GROUP_NIST_PRIME_256,
565 EC_GROUP_NIST_PRIME_384,
566 EC_GROUP_NIST_PRIME_521,
568 EC_GROUP_NIST_CHAR2_K163,
569 EC_GROUP_NIST_CHAR2_K233,
570 EC_GROUP_NIST_CHAR2_K283,
571 EC_GROUP_NIST_CHAR2_K409,
572 EC_GROUP_NIST_CHAR2_K571,
573 EC_GROUP_NIST_CHAR2_B163,
574 EC_GROUP_NIST_CHAR2_B233,
575 EC_GROUP_NIST_CHAR2_B283,
576 EC_GROUP_NIST_CHAR2_B409,
577 EC_GROUP_NIST_CHAR2_B571
579 static char * test_curves_names[EC_NUM] =
599 static int test_curves_bits[EC_NUM] =
601 160, 224, 256, 384, 521,
602 163, 233, 283, 409, 571,
603 163, 233, 283, 409, 571
608 #ifndef OPENSSL_NO_ECDSA
609 unsigned char ecdsasig[256];
610 unsigned int ecdsasiglen;
611 EC_KEY *ecdsa[EC_NUM];
612 long ecdsa_c[EC_NUM][2];
615 #ifndef OPENSSL_NO_ECDH
616 EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
617 unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
618 int secret_size_a, secret_size_b;
621 long ecdh_c[EC_NUM][2];
624 int rsa_doit[RSA_NUM];
625 int dsa_doit[DSA_NUM];
626 int ecdsa_doit[EC_NUM];
627 int ecdh_doit[EC_NUM];
630 const EVP_CIPHER *evp_cipher=NULL;
631 const EVP_MD *evp_md=NULL;
642 memset(results, 0, sizeof(results));
643 #ifndef OPENSSL_NO_DSA
644 memset(dsa_key,0,sizeof(dsa_key));
646 #ifndef OPENSSL_NO_ECDSA
647 for (i=0; i<EC_NUM; i++) ecdsa[i] = NULL;
649 #ifndef OPENSSL_NO_ECDH
650 for (i=0; i<EC_NUM; i++)
659 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
660 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
662 if (!load_config(bio_err, NULL))
665 #ifndef OPENSSL_NO_RSA
666 memset(rsa_key,0,sizeof(rsa_key));
667 for (i=0; i<RSA_NUM; i++)
671 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
673 BIO_printf(bio_err,"out of memory\n");
676 #ifndef OPENSSL_NO_DES
677 buf_as_des_cblock = (DES_cblock *)buf;
679 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
681 BIO_printf(bio_err,"out of memory\n");
685 memset(c,0,sizeof(c));
686 memset(DES_iv,0,sizeof(DES_iv));
687 memset(iv,0,sizeof(iv));
689 for (i=0; i<ALGOR_NUM; i++)
691 for (i=0; i<RSA_NUM; i++)
693 for (i=0; i<DSA_NUM; i++)
695 #ifndef OPENSSL_NO_ECDSA
696 for (i=0; i<EC_NUM; i++)
699 #ifndef OPENSSL_NO_ECDH
700 for (i=0; i<EC_NUM; i++)
710 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
713 j--; /* Otherwise, -elapsed gets confused with
716 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
722 BIO_printf(bio_err,"no EVP given\n");
725 evp_cipher=EVP_get_cipherbyname(*argv);
728 evp_md=EVP_get_digestbyname(*argv);
730 if(!evp_cipher && !evp_md)
732 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
737 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
740 j--; /* Otherwise, -elapsed gets confused with
743 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
749 BIO_printf(bio_err,"no engine given\n");
752 e = setup_engine(bio_err, *argv, 0);
753 /* j will be increased again further down. We just
754 don't want speed to confuse an engine with an
755 algorithm, especially when none is given (which
756 means all of them should be run) */
760 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
766 BIO_printf(bio_err,"no multi count given\n");
772 BIO_printf(bio_err,"bad multi count\n");
775 j--; /* Otherwise, -mr gets confused with
779 else if (argc > 0 && !strcmp(*argv,"-mr"))
782 j--; /* Otherwise, -mr gets confused with
786 #ifndef OPENSSL_NO_MD2
787 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
790 #ifndef OPENSSL_NO_MDC2
791 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
794 #ifndef OPENSSL_NO_MD4
795 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
798 #ifndef OPENSSL_NO_MD5
799 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
802 #ifndef OPENSSL_NO_MD5
803 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
806 #ifndef OPENSSL_NO_SHA
807 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
809 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
812 #ifndef OPENSSL_NO_RIPEMD
813 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
815 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
817 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
820 #ifndef OPENSSL_NO_RC4
821 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
824 #ifndef OPENSSL_NO_DES
825 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
826 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
829 #ifndef OPENSSL_NO_AES
830 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
831 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
832 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
835 #ifndef OPENSSL_NO_RSA
836 #if 0 /* was: #ifdef RSAref */
837 if (strcmp(*argv,"rsaref") == 0)
839 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
845 if (strcmp(*argv,"openssl") == 0)
847 RSA_set_default_method(RSA_PKCS1_SSLeay());
852 #endif /* !OPENSSL_NO_RSA */
853 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
854 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
855 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
856 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
857 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
858 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
859 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
861 #ifndef OPENSSL_NO_RC2
862 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
863 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
866 #ifndef OPENSSL_NO_RC5
867 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
868 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
871 #ifndef OPENSSL_NO_IDEA
872 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
873 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
876 #ifndef OPENSSL_NO_BF
877 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
878 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
879 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
882 #ifndef OPENSSL_NO_CAST
883 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
884 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
885 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
888 #ifndef OPENSSL_NO_DES
889 if (strcmp(*argv,"des") == 0)
896 #ifndef OPENSSL_NO_AES
897 if (strcmp(*argv,"aes") == 0)
899 doit[D_CBC_128_AES]=1;
900 doit[D_CBC_192_AES]=1;
901 doit[D_CBC_256_AES]=1;
905 #ifndef OPENSSL_NO_RSA
906 if (strcmp(*argv,"rsa") == 0)
908 rsa_doit[R_RSA_512]=1;
909 rsa_doit[R_RSA_1024]=1;
910 rsa_doit[R_RSA_2048]=1;
911 rsa_doit[R_RSA_4096]=1;
915 #ifndef OPENSSL_NO_DSA
916 if (strcmp(*argv,"dsa") == 0)
918 dsa_doit[R_DSA_512]=1;
919 dsa_doit[R_DSA_1024]=1;
923 #ifndef OPENSSL_NO_ECDSA
924 if (strcmp(*argv,"ecdsap160") == 0) ecdsa_doit[R_EC_P160]=2;
925 else if (strcmp(*argv,"ecdsap224") == 0) ecdsa_doit[R_EC_P224]=2;
926 else if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2;
927 else if (strcmp(*argv,"ecdsap384") == 0) ecdsa_doit[R_EC_P384]=2;
928 else if (strcmp(*argv,"ecdsap521") == 0) ecdsa_doit[R_EC_P521]=2;
929 else if (strcmp(*argv,"ecdsak163") == 0) ecdsa_doit[R_EC_K163]=2;
930 else if (strcmp(*argv,"ecdsak233") == 0) ecdsa_doit[R_EC_K233]=2;
931 else if (strcmp(*argv,"ecdsak283") == 0) ecdsa_doit[R_EC_K283]=2;
932 else if (strcmp(*argv,"ecdsak409") == 0) ecdsa_doit[R_EC_K409]=2;
933 else if (strcmp(*argv,"ecdsak571") == 0) ecdsa_doit[R_EC_K571]=2;
934 else if (strcmp(*argv,"ecdsab163") == 0) ecdsa_doit[R_EC_B163]=2;
935 else if (strcmp(*argv,"ecdsab233") == 0) ecdsa_doit[R_EC_B233]=2;
936 else if (strcmp(*argv,"ecdsab283") == 0) ecdsa_doit[R_EC_B283]=2;
937 else if (strcmp(*argv,"ecdsab409") == 0) ecdsa_doit[R_EC_B409]=2;
938 else if (strcmp(*argv,"ecdsab571") == 0) ecdsa_doit[R_EC_B571]=2;
939 else if (strcmp(*argv,"ecdsa") == 0)
941 for (i=0; i < EC_NUM; i++)
946 #ifndef OPENSSL_NO_ECDH
947 if (strcmp(*argv,"ecdhp160") == 0) ecdh_doit[R_EC_P160]=2;
948 else if (strcmp(*argv,"ecdhp224") == 0) ecdh_doit[R_EC_P224]=2;
949 else if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2;
950 else if (strcmp(*argv,"ecdhp384") == 0) ecdh_doit[R_EC_P384]=2;
951 else if (strcmp(*argv,"ecdhp521") == 0) ecdh_doit[R_EC_P521]=2;
952 else if (strcmp(*argv,"ecdhk163") == 0) ecdh_doit[R_EC_K163]=2;
953 else if (strcmp(*argv,"ecdhk233") == 0) ecdh_doit[R_EC_K233]=2;
954 else if (strcmp(*argv,"ecdhk283") == 0) ecdh_doit[R_EC_K283]=2;
955 else if (strcmp(*argv,"ecdhk409") == 0) ecdh_doit[R_EC_K409]=2;
956 else if (strcmp(*argv,"ecdhk571") == 0) ecdh_doit[R_EC_K571]=2;
957 else if (strcmp(*argv,"ecdhb163") == 0) ecdh_doit[R_EC_B163]=2;
958 else if (strcmp(*argv,"ecdhb233") == 0) ecdh_doit[R_EC_B233]=2;
959 else if (strcmp(*argv,"ecdhb283") == 0) ecdh_doit[R_EC_B283]=2;
960 else if (strcmp(*argv,"ecdhb409") == 0) ecdh_doit[R_EC_B409]=2;
961 else if (strcmp(*argv,"ecdhb571") == 0) ecdh_doit[R_EC_B571]=2;
962 else if (strcmp(*argv,"ecdh") == 0)
964 for (i=0; i < EC_NUM; i++)
970 BIO_printf(bio_err,"Error: bad option or value\n");
971 BIO_printf(bio_err,"\n");
972 BIO_printf(bio_err,"Available values:\n");
973 #ifndef OPENSSL_NO_MD2
974 BIO_printf(bio_err,"md2 ");
976 #ifndef OPENSSL_NO_MDC2
977 BIO_printf(bio_err,"mdc2 ");
979 #ifndef OPENSSL_NO_MD4
980 BIO_printf(bio_err,"md4 ");
982 #ifndef OPENSSL_NO_MD5
983 BIO_printf(bio_err,"md5 ");
984 #ifndef OPENSSL_NO_HMAC
985 BIO_printf(bio_err,"hmac ");
988 #ifndef OPENSSL_NO_SHA1
989 BIO_printf(bio_err,"sha1 ");
991 #ifndef OPENSSL_NO_RIPEMD160
992 BIO_printf(bio_err,"rmd160");
994 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
995 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
996 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
997 BIO_printf(bio_err,"\n");
1000 #ifndef OPENSSL_NO_IDEA
1001 BIO_printf(bio_err,"idea-cbc ");
1003 #ifndef OPENSSL_NO_RC2
1004 BIO_printf(bio_err,"rc2-cbc ");
1006 #ifndef OPENSSL_NO_RC5
1007 BIO_printf(bio_err,"rc5-cbc ");
1009 #ifndef OPENSSL_NO_BF
1010 BIO_printf(bio_err,"bf-cbc");
1012 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1013 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
1014 BIO_printf(bio_err,"\n");
1016 #ifndef OPENSSL_NO_DES
1017 BIO_printf(bio_err,"des-cbc des-ede3 ");
1019 #ifndef OPENSSL_NO_AES
1020 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
1022 #ifndef OPENSSL_NO_RC4
1023 BIO_printf(bio_err,"rc4");
1025 BIO_printf(bio_err,"\n");
1027 #ifndef OPENSSL_NO_RSA
1028 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
1031 #ifndef OPENSSL_NO_DSA
1032 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
1034 #ifndef OPENSSL_NO_ECDSA
1035 BIO_printf(bio_err,"ecdsap160 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
1036 BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n");
1037 BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n");
1038 BIO_printf(bio_err,"ecdsa\n");
1040 #ifndef OPENSSL_NO_ECDH
1041 BIO_printf(bio_err,"ecdhp160 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n");
1042 BIO_printf(bio_err,"ecdhk163 ecdhk233 ecdhk283 ecdhk409 ecdhk571\n");
1043 BIO_printf(bio_err,"ecdhb163 ecdhb233 ecdhb283 ecdhb409 ecdhb571\n");
1044 BIO_printf(bio_err,"ecdh\n");
1047 #ifndef OPENSSL_NO_IDEA
1048 BIO_printf(bio_err,"idea ");
1050 #ifndef OPENSSL_NO_RC2
1051 BIO_printf(bio_err,"rc2 ");
1053 #ifndef OPENSSL_NO_DES
1054 BIO_printf(bio_err,"des ");
1056 #ifndef OPENSSL_NO_AES
1057 BIO_printf(bio_err,"aes ");
1059 #ifndef OPENSSL_NO_RSA
1060 BIO_printf(bio_err,"rsa ");
1062 #ifndef OPENSSL_NO_BF
1063 BIO_printf(bio_err,"blowfish");
1065 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1066 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
1067 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
1068 BIO_printf(bio_err,"\n");
1071 BIO_printf(bio_err,"\n");
1072 BIO_printf(bio_err,"Available options:\n");
1074 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
1076 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
1077 BIO_printf(bio_err,"-evp e use EVP e.\n");
1078 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
1079 BIO_printf(bio_err,"-mr produce machine readable output.\n");
1081 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
1091 if(multi && do_multi(multi))
1097 for (i=0; i<ALGOR_NUM; i++)
1102 for (i=0; i<RSA_NUM; i++)
1104 for (i=0; i<DSA_NUM; i++)
1107 for (i=0; i<ALGOR_NUM; i++)
1108 if (doit[i]) pr_header++;
1110 if (usertime == 0 && !mr)
1111 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
1112 if (usertime <= 0 && !mr)
1114 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
1115 BIO_printf(bio_err,"program when this computer is idle.\n");
1118 #ifndef OPENSSL_NO_RSA
1119 for (i=0; i<RSA_NUM; i++)
1121 const unsigned char *p;
1124 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
1125 if (rsa_key[i] == NULL)
1127 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
1133 BIO_printf(bio_err,mr ? "+RK:%d:"
1134 : "Loaded RSA key, %d bit modulus and e= 0x",
1135 BN_num_bits(rsa_key[i]->n));
1136 BN_print(bio_err,rsa_key[i]->e);
1137 BIO_printf(bio_err,"\n");
1143 #ifndef OPENSSL_NO_DSA
1144 dsa_key[0]=get_dsa512();
1145 dsa_key[1]=get_dsa1024();
1146 dsa_key[2]=get_dsa2048();
1149 #ifndef OPENSSL_NO_DES
1150 DES_set_key_unchecked(&key,&sch);
1151 DES_set_key_unchecked(&key2,&sch2);
1152 DES_set_key_unchecked(&key3,&sch3);
1154 #ifndef OPENSSL_NO_AES
1155 AES_set_encrypt_key(key16,128,&aes_ks1);
1156 AES_set_encrypt_key(key24,192,&aes_ks2);
1157 AES_set_encrypt_key(key32,256,&aes_ks3);
1159 #ifndef OPENSSL_NO_IDEA
1160 idea_set_encrypt_key(key16,&idea_ks);
1162 #ifndef OPENSSL_NO_RC4
1163 RC4_set_key(&rc4_ks,16,key16);
1165 #ifndef OPENSSL_NO_RC2
1166 RC2_set_key(&rc2_ks,16,key16,128);
1168 #ifndef OPENSSL_NO_RC5
1169 RC5_32_set_key(&rc5_ks,16,key16,12);
1171 #ifndef OPENSSL_NO_BF
1172 BF_set_key(&bf_ks,16,key16);
1174 #ifndef OPENSSL_NO_CAST
1175 CAST_set_key(&cast_ks,16,key16);
1177 #ifndef OPENSSL_NO_RSA
1178 memset(rsa_c,0,sizeof(rsa_c));
1181 #ifndef OPENSSL_NO_DES
1182 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
1188 for (i=count; i; i--)
1189 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
1194 c[D_MD2][0]=count/10;
1195 c[D_MDC2][0]=count/10;
1200 c[D_RMD160][0]=count;
1201 c[D_RC4][0]=count*5;
1202 c[D_CBC_DES][0]=count;
1203 c[D_EDE3_DES][0]=count/3;
1204 c[D_CBC_IDEA][0]=count;
1205 c[D_CBC_RC2][0]=count;
1206 c[D_CBC_RC5][0]=count;
1207 c[D_CBC_BF][0]=count;
1208 c[D_CBC_CAST][0]=count;
1210 for (i=1; i<SIZE_NUM; i++)
1212 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1213 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1214 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1215 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1216 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1217 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1218 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1220 for (i=1; i<SIZE_NUM; i++)
1224 l0=(long)lengths[i-1];
1225 l1=(long)lengths[i];
1226 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1227 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1228 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1229 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1230 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1231 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1232 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1233 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1235 #ifndef OPENSSL_NO_RSA
1236 rsa_c[R_RSA_512][0]=count/2000;
1237 rsa_c[R_RSA_512][1]=count/400;
1238 for (i=1; i<RSA_NUM; i++)
1240 rsa_c[i][0]=rsa_c[i-1][0]/8;
1241 rsa_c[i][1]=rsa_c[i-1][1]/4;
1242 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1246 if (rsa_c[i][0] == 0)
1255 #ifndef OPENSSL_NO_DSA
1256 dsa_c[R_DSA_512][0]=count/1000;
1257 dsa_c[R_DSA_512][1]=count/1000/2;
1258 for (i=1; i<DSA_NUM; i++)
1260 dsa_c[i][0]=dsa_c[i-1][0]/4;
1261 dsa_c[i][1]=dsa_c[i-1][1]/4;
1262 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1275 #ifndef OPENSSL_NO_ECDSA
1276 ecdsa_c[R_EC_P160][0]=count/1000;
1277 ecdsa_c[R_EC_P160][1]=count/1000/2;
1278 for (i=R_EC_P224; i<=R_EC_P521; i++)
1280 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1281 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1282 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1286 if (ecdsa_c[i] == 0)
1293 ecdsa_c[R_EC_K163][0]=count/1000;
1294 ecdsa_c[R_EC_K163][1]=count/1000/2;
1295 for (i=R_EC_K233; i<=R_EC_K571; i++)
1297 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1298 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1299 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1303 if (ecdsa_c[i] == 0)
1310 ecdsa_c[R_EC_B163][0]=count/1000;
1311 ecdsa_c[R_EC_B163][1]=count/1000/2;
1312 for (i=R_EC_B233; i<=R_EC_B571; i++)
1314 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1315 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1316 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1320 if (ecdsa_c[i] == 0)
1329 #ifndef OPENSSL_NO_ECDH
1330 ecdh_c[R_EC_P160][0]=count/1000;
1331 ecdh_c[R_EC_P160][1]=count/1000;
1332 for (i=R_EC_P224; i<=R_EC_P521; i++)
1334 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1335 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1336 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1347 ecdh_c[R_EC_K163][0]=count/1000;
1348 ecdh_c[R_EC_K163][1]=count/1000;
1349 for (i=R_EC_K233; i<=R_EC_K571; i++)
1351 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1352 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1353 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1364 ecdh_c[R_EC_B163][0]=count/1000;
1365 ecdh_c[R_EC_B163][1]=count/1000;
1366 for (i=R_EC_B233; i<=R_EC_B571; i++)
1368 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1369 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1370 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1383 #define COND(d) (count < (d))
1384 #define COUNT(d) (d)
1386 /* not worth fixing */
1387 # error "You cannot disable DES on systems without SIGALRM."
1388 #endif /* OPENSSL_NO_DES */
1390 #define COND(c) (run)
1391 #define COUNT(d) (count)
1392 signal(SIGALRM,sig_done);
1393 #endif /* SIGALRM */
1395 #ifndef OPENSSL_NO_MD2
1398 for (j=0; j<SIZE_NUM; j++)
1400 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1402 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1403 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1405 print_result(D_MD2,j,count,d);
1409 #ifndef OPENSSL_NO_MDC2
1412 for (j=0; j<SIZE_NUM; j++)
1414 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1416 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1417 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1419 print_result(D_MDC2,j,count,d);
1424 #ifndef OPENSSL_NO_MD4
1427 for (j=0; j<SIZE_NUM; j++)
1429 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1431 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1432 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1434 print_result(D_MD4,j,count,d);
1439 #ifndef OPENSSL_NO_MD5
1442 for (j=0; j<SIZE_NUM; j++)
1444 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1446 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1447 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1449 print_result(D_MD5,j,count,d);
1454 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1459 HMAC_CTX_init(&hctx);
1460 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1461 16,EVP_md5(), NULL);
1463 for (j=0; j<SIZE_NUM; j++)
1465 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1467 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1469 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1470 HMAC_Update(&hctx,buf,lengths[j]);
1471 HMAC_Final(&hctx,&(hmac[0]),NULL);
1474 print_result(D_HMAC,j,count,d);
1476 HMAC_CTX_cleanup(&hctx);
1479 #ifndef OPENSSL_NO_SHA
1482 for (j=0; j<SIZE_NUM; j++)
1484 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1486 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1487 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1489 print_result(D_SHA1,j,count,d);
1493 #ifndef OPENSSL_NO_RIPEMD
1496 for (j=0; j<SIZE_NUM; j++)
1498 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1500 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1501 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1503 print_result(D_RMD160,j,count,d);
1507 #ifndef OPENSSL_NO_RC4
1510 for (j=0; j<SIZE_NUM; j++)
1512 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1514 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1515 RC4(&rc4_ks,(unsigned int)lengths[j],
1518 print_result(D_RC4,j,count,d);
1522 #ifndef OPENSSL_NO_DES
1523 if (doit[D_CBC_DES])
1525 for (j=0; j<SIZE_NUM; j++)
1527 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1529 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1530 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1531 &DES_iv,DES_ENCRYPT);
1533 print_result(D_CBC_DES,j,count,d);
1537 if (doit[D_EDE3_DES])
1539 for (j=0; j<SIZE_NUM; j++)
1541 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1543 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1544 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1546 &DES_iv,DES_ENCRYPT);
1548 print_result(D_EDE3_DES,j,count,d);
1552 #ifndef OPENSSL_NO_AES
1553 if (doit[D_CBC_128_AES])
1555 for (j=0; j<SIZE_NUM; j++)
1557 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1559 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1560 AES_cbc_encrypt(buf,buf,
1561 (unsigned long)lengths[j],&aes_ks1,
1564 print_result(D_CBC_128_AES,j,count,d);
1567 if (doit[D_CBC_192_AES])
1569 for (j=0; j<SIZE_NUM; j++)
1571 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1573 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1574 AES_cbc_encrypt(buf,buf,
1575 (unsigned long)lengths[j],&aes_ks2,
1578 print_result(D_CBC_192_AES,j,count,d);
1581 if (doit[D_CBC_256_AES])
1583 for (j=0; j<SIZE_NUM; j++)
1585 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1587 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1588 AES_cbc_encrypt(buf,buf,
1589 (unsigned long)lengths[j],&aes_ks3,
1592 print_result(D_CBC_256_AES,j,count,d);
1597 #ifndef OPENSSL_NO_IDEA
1598 if (doit[D_CBC_IDEA])
1600 for (j=0; j<SIZE_NUM; j++)
1602 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1604 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1605 idea_cbc_encrypt(buf,buf,
1606 (unsigned long)lengths[j],&idea_ks,
1609 print_result(D_CBC_IDEA,j,count,d);
1613 #ifndef OPENSSL_NO_RC2
1614 if (doit[D_CBC_RC2])
1616 for (j=0; j<SIZE_NUM; j++)
1618 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1620 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1621 RC2_cbc_encrypt(buf,buf,
1622 (unsigned long)lengths[j],&rc2_ks,
1625 print_result(D_CBC_RC2,j,count,d);
1629 #ifndef OPENSSL_NO_RC5
1630 if (doit[D_CBC_RC5])
1632 for (j=0; j<SIZE_NUM; j++)
1634 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1636 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1637 RC5_32_cbc_encrypt(buf,buf,
1638 (unsigned long)lengths[j],&rc5_ks,
1641 print_result(D_CBC_RC5,j,count,d);
1645 #ifndef OPENSSL_NO_BF
1648 for (j=0; j<SIZE_NUM; j++)
1650 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1652 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1653 BF_cbc_encrypt(buf,buf,
1654 (unsigned long)lengths[j],&bf_ks,
1657 print_result(D_CBC_BF,j,count,d);
1661 #ifndef OPENSSL_NO_CAST
1662 if (doit[D_CBC_CAST])
1664 for (j=0; j<SIZE_NUM; j++)
1666 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1668 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1669 CAST_cbc_encrypt(buf,buf,
1670 (unsigned long)lengths[j],&cast_ks,
1673 print_result(D_CBC_CAST,j,count,d);
1680 for (j=0; j<SIZE_NUM; j++)
1687 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1688 /* -O3 -fschedule-insns messes up an
1689 * optimization here! names[D_EVP]
1690 * somehow becomes NULL */
1691 print_message(names[D_EVP],save_count,
1694 EVP_CIPHER_CTX_init(&ctx);
1696 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1698 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1702 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1703 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1705 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1706 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1708 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1710 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1715 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1716 print_message(names[D_EVP],save_count,
1720 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1721 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1725 print_result(D_EVP,j,count,d);
1729 RAND_pseudo_bytes(buf,36);
1730 #ifndef OPENSSL_NO_RSA
1731 for (j=0; j<RSA_NUM; j++)
1734 if (!rsa_doit[j]) continue;
1735 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1738 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1739 ERR_print_errors(bio_err);
1744 pkey_print_message("private","rsa",
1745 rsa_c[j][0],rsa_bits[j],
1747 /* RSA_blinding_on(rsa_key[j],NULL); */
1749 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1751 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1752 &rsa_num, rsa_key[j]);
1756 "RSA sign failure\n");
1757 ERR_print_errors(bio_err);
1763 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1764 : "%ld %d bit private RSA's in %.2fs\n",
1765 count,rsa_bits[j],d);
1766 rsa_results[j][0]=d/(double)count;
1771 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1774 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1775 ERR_print_errors(bio_err);
1780 pkey_print_message("public","rsa",
1781 rsa_c[j][1],rsa_bits[j],
1784 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1786 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1787 rsa_num, rsa_key[j]);
1791 "RSA verify failure\n");
1792 ERR_print_errors(bio_err);
1798 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1799 : "%ld %d bit public RSA's in %.2fs\n",
1800 count,rsa_bits[j],d);
1801 rsa_results[j][1]=d/(double)count;
1807 /* if longer than 10s, don't do any more */
1808 for (j++; j<RSA_NUM; j++)
1814 RAND_pseudo_bytes(buf,20);
1815 #ifndef OPENSSL_NO_DSA
1816 if (RAND_status() != 1)
1818 RAND_seed(rnd_seed, sizeof rnd_seed);
1821 for (j=0; j<DSA_NUM; j++)
1826 if (!dsa_doit[j]) continue;
1827 /* DSA_generate_key(dsa_key[j]); */
1828 /* DSA_sign_setup(dsa_key[j],NULL); */
1829 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1833 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1834 ERR_print_errors(bio_err);
1839 pkey_print_message("sign","dsa",
1840 dsa_c[j][0],dsa_bits[j],
1843 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1845 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1850 "DSA sign failure\n");
1851 ERR_print_errors(bio_err);
1857 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1858 : "%ld %d bit DSA signs in %.2fs\n",
1859 count,dsa_bits[j],d);
1860 dsa_results[j][0]=d/(double)count;
1864 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1868 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1869 ERR_print_errors(bio_err);
1874 pkey_print_message("verify","dsa",
1875 dsa_c[j][1],dsa_bits[j],
1878 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1880 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1885 "DSA verify failure\n");
1886 ERR_print_errors(bio_err);
1892 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1893 : "%ld %d bit DSA verify in %.2fs\n",
1894 count,dsa_bits[j],d);
1895 dsa_results[j][1]=d/(double)count;
1900 /* if longer than 10s, don't do any more */
1901 for (j++; j<DSA_NUM; j++)
1905 if (rnd_fake) RAND_cleanup();
1908 #ifndef OPENSSL_NO_ECDSA
1909 if (RAND_status() != 1)
1911 RAND_seed(rnd_seed, sizeof rnd_seed);
1914 for (j=0; j<EC_NUM; j++)
1918 if (!ecdsa_doit[j]) continue; /* Ignore Curve */
1919 ecdsa[j] = EC_KEY_new();
1920 if (ecdsa[j] == NULL)
1922 BIO_printf(bio_err,"ECDSA failure.\n");
1923 ERR_print_errors(bio_err);
1928 ecdsa[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
1929 /* Could not obtain group information */
1930 if (ecdsa[j]->group == NULL)
1932 BIO_printf(bio_err,"ECDSA failure.Could not obtain group information\n");
1933 ERR_print_errors(bio_err);
1938 /* Perform ECDSA signature test */
1939 EC_KEY_generate_key(ecdsa[j]);
1940 ret = ECDSA_sign(EVP_PKEY_ECDSA, buf, 20, ecdsasig,
1941 &ecdsasiglen, ecdsa[j]);
1944 BIO_printf(bio_err,"ECDSA sign failure. No ECDSA sign will be done.\n");
1945 ERR_print_errors(bio_err);
1950 pkey_print_message("sign","ecdsa",
1952 test_curves_bits[j],
1956 for (count=0,run=1; COND(ecdsa_c[j][0]); count++)
1958 ret=ECDSA_sign(EVP_PKEY_ECDSA, buf, 20, ecdsasig, &ecdsasiglen, ecdsa[j]);
1961 BIO_printf(bio_err, "ECDSA sign failure\n");
1962 ERR_print_errors(bio_err);
1969 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
1970 "%ld %d bit ECDSA signs in %.2fs \n",
1971 count, test_curves_bits[j], d);
1972 ecdsa_results[j][0]=d/(double)count;
1976 /* Perform ECDSA verification test */
1977 ret=ECDSA_verify(EVP_PKEY_ECDSA, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
1980 BIO_printf(bio_err,"ECDSA verify failure. No ECDSA verify will be done.\n");
1981 ERR_print_errors(bio_err);
1986 pkey_print_message("verify","ecdsa",
1988 test_curves_bits[j],
1991 for (count=0,run=1; COND(ecdsa_c[j][1]); count++)
1993 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
1996 BIO_printf(bio_err, "ECDSA verify failure\n");
1997 ERR_print_errors(bio_err);
2003 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
2004 : "%ld %d bit ECDSA verify in %.2fs\n",
2005 count, test_curves_bits[j], d);
2006 ecdsa_results[j][1]=d/(double)count;
2011 /* if longer than 10s, don't do any more */
2012 for (j++; j<EC_NUM; j++)
2018 if (rnd_fake) RAND_cleanup();
2021 #ifndef OPENSSL_NO_ECDH
2022 if (RAND_status() != 1)
2024 RAND_seed(rnd_seed, sizeof rnd_seed);
2027 for (j=0; j<EC_NUM; j++)
2029 if (!ecdh_doit[j]) continue;
2030 ecdh_a[j] = EC_KEY_new();
2031 ecdh_b[j] = EC_KEY_new();
2032 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2034 BIO_printf(bio_err,"ECDH failure.\n");
2035 ERR_print_errors(bio_err);
2040 ecdh_a[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
2041 if (ecdh_a[j]->group == NULL)
2043 BIO_printf(bio_err,"ECDH failure.\n");
2044 ERR_print_errors(bio_err);
2049 ecdh_b[j]->group = ecdh_a[j]->group;
2051 /* generate two ECDH key pairs */
2052 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2053 !EC_KEY_generate_key(ecdh_b[j]))
2055 BIO_printf(bio_err,"ECDH key generation failure.\n");
2056 ERR_print_errors(bio_err);
2061 secret_size_a = ECDH_compute_key(secret_a,
2064 secret_size_b = ECDH_compute_key(secret_b,
2067 if (secret_size_a != secret_size_b)
2072 for (secret_idx = 0;
2073 (secret_idx < secret_size_a)
2074 && (ecdh_checks == 1);
2077 if (secret_a[secret_idx] != secret_b[secret_idx])
2081 if (ecdh_checks == 0)
2083 BIO_printf(bio_err,"ECDH computations don't match.\n");
2084 ERR_print_errors(bio_err);
2088 pkey_print_message("","ecdh",
2090 test_curves_bits[j],
2093 for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2095 ECDH_compute_key(secret_a,
2100 BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2101 count, test_curves_bits[j], d);
2102 ecdh_results[j][0]=d/(double)count;
2110 /* if longer than 10s, don't do any more */
2111 for (j++; j<EC_NUM; j++)
2115 if (rnd_fake) RAND_cleanup();
2122 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
2123 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
2125 printf("%s ",BN_options());
2126 #ifndef OPENSSL_NO_MD2
2127 printf("%s ",MD2_options());
2129 #ifndef OPENSSL_NO_RC4
2130 printf("%s ",RC4_options());
2132 #ifndef OPENSSL_NO_DES
2133 printf("%s ",DES_options());
2135 #ifndef OPENSSL_NO_AES
2136 printf("%s ",AES_options());
2138 #ifndef OPENSSL_NO_IDEA
2139 printf("%s ",idea_options());
2141 #ifndef OPENSSL_NO_BF
2142 printf("%s ",BF_options());
2144 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2145 printf("available timing options: ");
2156 #define as_string(s) (#s)
2157 printf("HZ=%g", (double)HZ);
2159 printf(" [sysconf value]");
2163 printf("timing function used: %s%s%s%s%s%s%s\n",
2164 (ftime_used ? "ftime" : ""),
2165 (ftime_used + times_used > 1 ? "," : ""),
2166 (times_used ? "times" : ""),
2167 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
2168 (gettimeofday_used ? "gettimeofday" : ""),
2169 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
2170 (getrusage_used ? "getrusage" : ""));
2176 fprintf(stdout,"+H");
2179 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
2180 fprintf(stdout,"type ");
2182 for (j=0; j<SIZE_NUM; j++)
2183 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
2184 fprintf(stdout,"\n");
2187 for (k=0; k<ALGOR_NUM; k++)
2189 if (!doit[k]) continue;
2191 fprintf(stdout,"+F:%d:%s",k,names[k]);
2193 fprintf(stdout,"%-13s",names[k]);
2194 for (j=0; j<SIZE_NUM; j++)
2196 if (results[k][j] > 10000 && !mr)
2197 fprintf(stdout," %11.2fk",results[k][j]/1e3);
2199 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
2201 fprintf(stdout,"\n");
2203 #ifndef OPENSSL_NO_RSA
2205 for (k=0; k<RSA_NUM; k++)
2207 if (!rsa_doit[k]) continue;
2210 printf("%18ssign verify sign/s verify/s\n"," ");
2214 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2215 k,rsa_bits[k],rsa_results[k][0],
2218 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2219 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2220 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
2223 #ifndef OPENSSL_NO_DSA
2225 for (k=0; k<DSA_NUM; k++)
2227 if (!dsa_doit[k]) continue;
2230 printf("%18ssign verify sign/s verify/s\n"," ");
2234 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2235 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2237 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2238 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2239 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
2242 #ifndef OPENSSL_NO_ECDSA
2244 for (k=0; k<EC_NUM; k++)
2246 if (!ecdsa_doit[k]) continue;
2249 printf("%30ssign verify sign/s verify/s\n"," ");
2254 fprintf(stdout,"+F4:%u:%u:%f:%f\n",
2255 k, test_curves_bits[k],
2256 ecdsa_results[k][0],ecdsa_results[k][1]);
2259 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2260 test_curves_bits[k],
2261 test_curves_names[k],
2262 ecdsa_results[k][0],ecdsa_results[k][1],
2263 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2268 #ifndef OPENSSL_NO_ECDH
2270 for (k=0; k<EC_NUM; k++)
2272 if (!ecdh_doit[k]) continue;
2275 printf("%30sop op/s\n"," ");
2279 fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2280 k, test_curves_bits[k],
2281 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2284 fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2285 test_curves_bits[k],
2286 test_curves_names[k],
2287 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2294 ERR_print_errors(bio_err);
2295 if (buf != NULL) OPENSSL_free(buf);
2296 if (buf2 != NULL) OPENSSL_free(buf2);
2297 #ifndef OPENSSL_NO_RSA
2298 for (i=0; i<RSA_NUM; i++)
2299 if (rsa_key[i] != NULL)
2300 RSA_free(rsa_key[i]);
2302 #ifndef OPENSSL_NO_DSA
2303 for (i=0; i<DSA_NUM; i++)
2304 if (dsa_key[i] != NULL)
2305 DSA_free(dsa_key[i]);
2308 #ifndef OPENSSL_NO_ECDSA
2309 for (i=0; i<EC_NUM; i++)
2310 if (ecdsa[i] != NULL)
2311 EC_KEY_free(ecdsa[i]);
2313 #ifndef OPENSSL_NO_ECDH
2314 for (i=0; i<EC_NUM; i++)
2316 if (ecdh_a[i] != NULL)
2317 EC_KEY_free(ecdh_a[i]);
2318 if (ecdh_b[i] != NULL)
2319 EC_KEY_free(ecdh_b[i]);
2327 static void print_message(const char *s, long num, int length)
2330 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2331 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
2332 (void)BIO_flush(bio_err);
2335 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2336 : "Doing %s %ld times on %d size blocks: ",s,num,length);
2337 (void)BIO_flush(bio_err);
2344 static void pkey_print_message(char *str, char *str2, long num, int bits,
2348 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2349 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
2350 (void)BIO_flush(bio_err);
2353 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2354 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
2355 (void)BIO_flush(bio_err);
2362 static void print_result(int alg,int run_no,int count,double time_used)
2364 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
2365 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
2366 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2369 static char *sstrsep(char **string, const char *delim)
2372 char *token = *string;
2377 memset(isdelim, 0, 256);
2382 isdelim[(unsigned char)(*delim)] = 1;
2386 while (!isdelim[(unsigned char)(**string)])
2401 static int do_multi(int multi)
2406 static char sep[]=":";
2408 fds=malloc(multi*sizeof *fds);
2409 for(n=0 ; n < multi ; ++n)
2427 printf("Forked child %d\n",n);
2430 /* for now, assume the pipe is long enough to take all the output */
2431 for(n=0 ; n < multi ; ++n)
2437 f=fdopen(fds[n],"r");
2438 while(fgets(buf,sizeof buf,f))
2445 fprintf(stderr,"Don't understand line '%s' from child %d\n",
2449 printf("Got: %s from %d\n",buf,n);
2450 if(!strncmp(buf,"+F:",3))
2456 alg=atoi(sstrsep(&p,sep));
2458 for(j=0 ; j < SIZE_NUM ; ++j)
2459 results[alg][j]+=atof(sstrsep(&p,sep));
2461 else if(!strncmp(buf,"+F2:",4))
2467 k=atoi(sstrsep(&p,sep));
2470 d=atof(sstrsep(&p,sep));
2472 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2474 rsa_results[k][0]=d;
2476 d=atof(sstrsep(&p,sep));
2478 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2480 rsa_results[k][1]=d;
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,"+F3:",4))
2509 k=atoi(sstrsep(&p,sep));
2512 d=atof(sstrsep(&p,sep));
2514 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2516 dsa_results[k][0]=d;
2518 d=atof(sstrsep(&p,sep));
2520 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2522 dsa_results[k][1]=d;
2524 #ifndef OPENSSL_NO_ECDSA
2525 else if(!strncmp(buf,"+F4:",4))
2531 k=atoi(sstrsep(&p,sep));
2534 d=atof(sstrsep(&p,sep));
2536 ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2538 ecdsa_results[k][0]=d;
2540 d=atof(sstrsep(&p,sep));
2542 ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2544 ecdsa_results[k][1]=d;
2548 #ifndef OPENSSL_NO_ECDH
2549 else if(!strncmp(buf,"+F5:",4))
2555 k=atoi(sstrsep(&p,sep));
2558 d=atof(sstrsep(&p,sep));
2560 ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2562 ecdh_results[k][0]=d;
2567 else if(!strncmp(buf,"+H:",3))
2571 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);