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 */
76 #define RSA_SECONDS 10
77 #define DSA_SECONDS 10
78 #define ECDSA_SECONDS 10
79 #define ECDH_SECONDS 10
81 /* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
82 /* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
85 #define PROG speed_main
93 #ifdef OPENSSL_NO_STDIO
96 #include <openssl/crypto.h>
97 #include <openssl/rand.h>
98 #include <openssl/err.h>
99 #include <openssl/evp.h>
100 #include <openssl/objects.h>
101 #if !defined(OPENSSL_SYS_MSDOS)
102 #include OPENSSL_UNISTD
105 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
107 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
110 #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 */
118 # include <sys/types.h>
119 # include <sys/times.h>
122 # include <sys/time.h>
123 # include <sys/resource.h>
126 /* Depending on the VMS version, the tms structure is perhaps defined.
127 The __TMS macro will show if it was. If it wasn't defined, we should
128 undefine TIMES, since that tells the rest of the program how things
129 should be handled. -- Richard Levitte */
130 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
135 #include <sys/timeb.h>
138 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS)
139 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
142 #if defined(sun) || defined(__ultrix)
143 #define _POSIX_SOURCE
145 #include <sys/param.h>
148 #ifndef OPENSSL_NO_DES
149 #include <openssl/des.h>
151 #ifndef OPENSSL_NO_AES
152 #include <openssl/aes.h>
154 #ifndef OPENSSL_NO_MD2
155 #include <openssl/md2.h>
157 #ifndef OPENSSL_NO_MDC2
158 #include <openssl/mdc2.h>
160 #ifndef OPENSSL_NO_MD4
161 #include <openssl/md4.h>
163 #ifndef OPENSSL_NO_MD5
164 #include <openssl/md5.h>
166 #ifndef OPENSSL_NO_HMAC
167 #include <openssl/hmac.h>
169 #include <openssl/evp.h>
170 #ifndef OPENSSL_NO_SHA
171 #include <openssl/sha.h>
173 #ifndef OPENSSL_NO_RIPEMD
174 #include <openssl/ripemd.h>
176 #ifndef OPENSSL_NO_RC4
177 #include <openssl/rc4.h>
179 #ifndef OPENSSL_NO_RC5
180 #include <openssl/rc5.h>
182 #ifndef OPENSSL_NO_RC2
183 #include <openssl/rc2.h>
185 #ifndef OPENSSL_NO_IDEA
186 #include <openssl/idea.h>
188 #ifndef OPENSSL_NO_BF
189 #include <openssl/blowfish.h>
191 #ifndef OPENSSL_NO_CAST
192 #include <openssl/cast.h>
194 #ifndef OPENSSL_NO_RSA
195 #include <openssl/rsa.h>
196 #include "./testrsa.h"
198 #include <openssl/x509.h>
199 #ifndef OPENSSL_NO_DSA
200 #include "./testdsa.h"
202 #ifndef OPENSSL_NO_ECDSA
203 #include <openssl/ecdsa.h>
205 #ifndef OPENSSL_NO_ECDH
206 #include <openssl/ecdh.h>
209 /* The following if from times(3) man page. It may need to be changed */
212 # define HZ ((double)sysconf(_SC_CLK_TCK))
215 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
217 # else /* _BSD_CLK_TCK_ */
218 # define HZ ((double)_BSD_CLK_TCK_)
221 # define HZ ((double)CLK_TCK)
226 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
231 #define BUFSIZE ((long)1024*8+1)
234 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
236 static int usertime=1;
238 static double Time_F(int s);
239 static void print_message(const char *s,long num,int length);
240 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
241 static void print_result(int alg,int run_no,int count,double time_used);
243 static int do_multi(int multi);
252 #define MAX_ECDH_SIZE 256
254 static const char *names[ALGOR_NUM]={
255 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
256 "des cbc","des ede3","idea cbc",
257 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
258 "aes-128 cbc","aes-192 cbc","aes-256 cbc"};
259 static double results[ALGOR_NUM][SIZE_NUM];
260 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
261 static double rsa_results[RSA_NUM][2];
262 static double dsa_results[DSA_NUM][2];
263 static double ecdsa_results[EC_NUM][2];
264 static double ecdh_results[EC_NUM][1];
268 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
269 #define SIGRETTYPE void
271 #define SIGRETTYPE int
274 static SIGRETTYPE sig_done(int sig);
275 static SIGRETTYPE sig_done(int sig)
277 signal(SIGALRM,sig_done);
288 static double Time_F(int s)
295 static struct rusage tstart,tend;
300 getrusage(RUSAGE_SELF,&tstart);
307 getrusage(RUSAGE_SELF,&tend);
308 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
309 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
310 +((double)i)/1000000.0;
311 return((ret < 0.001)?0.001:ret);
316 static struct timeval tstart,tend;
319 gettimeofday_used = 1;
322 gettimeofday(&tstart,NULL);
327 gettimeofday(&tend,NULL);
328 i=(long)tend.tv_usec-(long)tstart.tv_usec;
329 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
330 return((ret < 0.001)?0.001:ret);
333 #else /* ndef USE_TOD */
338 static struct tms tstart,tend;
349 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
350 return((ret < 1e-3)?1e-3:ret);
353 # endif /* times() */
354 # if defined(TIMES) && defined(TIMEB)
357 # ifdef OPENSSL_SYS_VXWORKS
359 static unsigned long tick_start, tick_end;
363 tick_start = tickGet();
368 tick_end = tickGet();
369 ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
370 return((ret < 0.001)?0.001:ret);
373 # elif defined(TIMEB)
375 static struct timeb tstart,tend;
387 i=(long)tend.millitm-(long)tstart.millitm;
388 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
389 return((ret < 0.001)?0.001:ret);
396 int MAIN(int, char **);
398 int MAIN(int argc, char **argv)
401 unsigned char *buf=NULL,*buf2=NULL;
403 long count=0,save_count=0;
405 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
408 #ifndef OPENSSL_NO_RSA
411 unsigned char md[EVP_MAX_MD_SIZE];
412 #ifndef OPENSSL_NO_MD2
413 unsigned char md2[MD2_DIGEST_LENGTH];
415 #ifndef OPENSSL_NO_MDC2
416 unsigned char mdc2[MDC2_DIGEST_LENGTH];
418 #ifndef OPENSSL_NO_MD4
419 unsigned char md4[MD4_DIGEST_LENGTH];
421 #ifndef OPENSSL_NO_MD5
422 unsigned char md5[MD5_DIGEST_LENGTH];
423 unsigned char hmac[MD5_DIGEST_LENGTH];
425 #ifndef OPENSSL_NO_SHA
426 unsigned char sha[SHA_DIGEST_LENGTH];
428 #ifndef OPENSSL_NO_RIPEMD
429 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
431 #ifndef OPENSSL_NO_RC4
434 #ifndef OPENSSL_NO_RC5
437 #ifndef OPENSSL_NO_RC2
440 #ifndef OPENSSL_NO_IDEA
441 IDEA_KEY_SCHEDULE idea_ks;
443 #ifndef OPENSSL_NO_BF
446 #ifndef OPENSSL_NO_CAST
449 static const unsigned char key16[16]=
450 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
451 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
452 static const unsigned char key24[24]=
453 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
454 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
455 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
456 static const unsigned char key32[32]=
457 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
458 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
459 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
460 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
461 #ifndef OPENSSL_NO_AES
462 #define MAX_BLOCK_SIZE 128
464 #define MAX_BLOCK_SIZE 64
466 unsigned char DES_iv[8];
467 unsigned char iv[MAX_BLOCK_SIZE/8];
468 #ifndef OPENSSL_NO_DES
469 DES_cblock *buf_as_des_cblock = NULL;
470 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
471 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
472 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
473 DES_key_schedule sch;
474 DES_key_schedule sch2;
475 DES_key_schedule sch3;
477 #ifndef OPENSSL_NO_AES
478 AES_KEY aes_ks1, aes_ks2, aes_ks3;
490 #define D_CBC_IDEA 10
494 #define D_CBC_CAST 14
495 #define D_CBC_128_AES 15
496 #define D_CBC_192_AES 16
497 #define D_CBC_256_AES 17
500 long c[ALGOR_NUM][SIZE_NUM];
526 #ifndef OPENSSL_NO_RSA
527 RSA *rsa_key[RSA_NUM];
528 long rsa_c[RSA_NUM][2];
529 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
530 static unsigned char *rsa_data[RSA_NUM]=
531 {test512,test1024,test2048,test4096};
532 static int rsa_data_length[RSA_NUM]={
533 sizeof(test512),sizeof(test1024),
534 sizeof(test2048),sizeof(test4096)};
536 #ifndef OPENSSL_NO_DSA
537 DSA *dsa_key[DSA_NUM];
538 long dsa_c[DSA_NUM][2];
539 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
541 #ifndef OPENSSL_NO_EC
542 /* We only test over the following curves as they are representative,
543 * To add tests over more curves, simply add the curve NID
544 * and curve name to the following arrays and increase the
545 * EC_NUM value accordingly.
547 static unsigned int test_curves[EC_NUM] =
551 NID_X9_62_prime192v1,
553 NID_X9_62_prime256v1,
568 static char * test_curves_names[EC_NUM] =
589 static int test_curves_bits[EC_NUM] =
591 160, 192, 224, 256, 384, 521,
592 163, 233, 283, 409, 571,
593 163, 233, 283, 409, 571
598 #ifndef OPENSSL_NO_ECDSA
599 unsigned char ecdsasig[256];
600 unsigned int ecdsasiglen;
601 EC_KEY *ecdsa[EC_NUM];
602 long ecdsa_c[EC_NUM][2];
605 #ifndef OPENSSL_NO_ECDH
606 EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
607 unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
608 int secret_size_a, secret_size_b;
611 long ecdh_c[EC_NUM][2];
614 int rsa_doit[RSA_NUM];
615 int dsa_doit[DSA_NUM];
616 int ecdsa_doit[EC_NUM];
617 int ecdh_doit[EC_NUM];
620 const EVP_CIPHER *evp_cipher=NULL;
621 const EVP_MD *evp_md=NULL;
632 memset(results, 0, sizeof(results));
633 #ifndef OPENSSL_NO_DSA
634 memset(dsa_key,0,sizeof(dsa_key));
636 #ifndef OPENSSL_NO_ECDSA
637 for (i=0; i<EC_NUM; i++) ecdsa[i] = NULL;
639 #ifndef OPENSSL_NO_ECDH
640 for (i=0; i<EC_NUM; i++)
649 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
650 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
652 if (!load_config(bio_err, NULL))
655 #ifndef OPENSSL_NO_RSA
656 memset(rsa_key,0,sizeof(rsa_key));
657 for (i=0; i<RSA_NUM; i++)
661 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
663 BIO_printf(bio_err,"out of memory\n");
666 #ifndef OPENSSL_NO_DES
667 buf_as_des_cblock = (DES_cblock *)buf;
669 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
671 BIO_printf(bio_err,"out of memory\n");
675 memset(c,0,sizeof(c));
676 memset(DES_iv,0,sizeof(DES_iv));
677 memset(iv,0,sizeof(iv));
679 for (i=0; i<ALGOR_NUM; i++)
681 for (i=0; i<RSA_NUM; i++)
683 for (i=0; i<DSA_NUM; i++)
685 #ifndef OPENSSL_NO_ECDSA
686 for (i=0; i<EC_NUM; i++)
689 #ifndef OPENSSL_NO_ECDH
690 for (i=0; i<EC_NUM; i++)
700 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
703 j--; /* Otherwise, -elapsed gets confused with
706 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
712 BIO_printf(bio_err,"no EVP given\n");
715 evp_cipher=EVP_get_cipherbyname(*argv);
718 evp_md=EVP_get_digestbyname(*argv);
720 if(!evp_cipher && !evp_md)
722 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
727 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
730 j--; /* Otherwise, -elapsed gets confused with
733 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
739 BIO_printf(bio_err,"no engine given\n");
742 e = setup_engine(bio_err, *argv, 0);
743 /* j will be increased again further down. We just
744 don't want speed to confuse an engine with an
745 algorithm, especially when none is given (which
746 means all of them should be run) */
750 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
756 BIO_printf(bio_err,"no multi count given\n");
762 BIO_printf(bio_err,"bad multi count\n");
765 j--; /* Otherwise, -mr gets confused with
769 else if (argc > 0 && !strcmp(*argv,"-mr"))
772 j--; /* Otherwise, -mr gets confused with
776 #ifndef OPENSSL_NO_MD2
777 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
780 #ifndef OPENSSL_NO_MDC2
781 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
784 #ifndef OPENSSL_NO_MD4
785 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
788 #ifndef OPENSSL_NO_MD5
789 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
792 #ifndef OPENSSL_NO_MD5
793 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
796 #ifndef OPENSSL_NO_SHA
797 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
799 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
802 #ifndef OPENSSL_NO_RIPEMD
803 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
805 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
807 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
810 #ifndef OPENSSL_NO_RC4
811 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
814 #ifndef OPENSSL_NO_DES
815 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
816 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
819 #ifndef OPENSSL_NO_AES
820 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
821 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
822 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
825 #ifndef OPENSSL_NO_RSA
826 #if 0 /* was: #ifdef RSAref */
827 if (strcmp(*argv,"rsaref") == 0)
829 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
835 if (strcmp(*argv,"openssl") == 0)
837 RSA_set_default_method(RSA_PKCS1_SSLeay());
842 #endif /* !OPENSSL_NO_RSA */
843 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
844 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
845 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
846 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
847 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
848 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
849 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
851 #ifndef OPENSSL_NO_RC2
852 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
853 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
856 #ifndef OPENSSL_NO_RC5
857 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
858 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
861 #ifndef OPENSSL_NO_IDEA
862 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
863 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
866 #ifndef OPENSSL_NO_BF
867 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
868 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
869 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
872 #ifndef OPENSSL_NO_CAST
873 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
874 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
875 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
878 #ifndef OPENSSL_NO_DES
879 if (strcmp(*argv,"des") == 0)
886 #ifndef OPENSSL_NO_AES
887 if (strcmp(*argv,"aes") == 0)
889 doit[D_CBC_128_AES]=1;
890 doit[D_CBC_192_AES]=1;
891 doit[D_CBC_256_AES]=1;
895 #ifndef OPENSSL_NO_RSA
896 if (strcmp(*argv,"rsa") == 0)
898 rsa_doit[R_RSA_512]=1;
899 rsa_doit[R_RSA_1024]=1;
900 rsa_doit[R_RSA_2048]=1;
901 rsa_doit[R_RSA_4096]=1;
905 #ifndef OPENSSL_NO_DSA
906 if (strcmp(*argv,"dsa") == 0)
908 dsa_doit[R_DSA_512]=1;
909 dsa_doit[R_DSA_1024]=1;
913 #ifndef OPENSSL_NO_ECDSA
914 if (strcmp(*argv,"ecdsap160") == 0) ecdsa_doit[R_EC_P160]=2;
915 else if (strcmp(*argv,"ecdsap224") == 0) ecdsa_doit[R_EC_P224]=2;
916 else if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2;
917 else if (strcmp(*argv,"ecdsap384") == 0) ecdsa_doit[R_EC_P384]=2;
918 else if (strcmp(*argv,"ecdsap521") == 0) ecdsa_doit[R_EC_P521]=2;
919 else if (strcmp(*argv,"ecdsak163") == 0) ecdsa_doit[R_EC_K163]=2;
920 else if (strcmp(*argv,"ecdsak233") == 0) ecdsa_doit[R_EC_K233]=2;
921 else if (strcmp(*argv,"ecdsak283") == 0) ecdsa_doit[R_EC_K283]=2;
922 else if (strcmp(*argv,"ecdsak409") == 0) ecdsa_doit[R_EC_K409]=2;
923 else if (strcmp(*argv,"ecdsak571") == 0) ecdsa_doit[R_EC_K571]=2;
924 else if (strcmp(*argv,"ecdsab163") == 0) ecdsa_doit[R_EC_B163]=2;
925 else if (strcmp(*argv,"ecdsab233") == 0) ecdsa_doit[R_EC_B233]=2;
926 else if (strcmp(*argv,"ecdsab283") == 0) ecdsa_doit[R_EC_B283]=2;
927 else if (strcmp(*argv,"ecdsab409") == 0) ecdsa_doit[R_EC_B409]=2;
928 else if (strcmp(*argv,"ecdsab571") == 0) ecdsa_doit[R_EC_B571]=2;
929 else if (strcmp(*argv,"ecdsa") == 0)
931 for (i=0; i < EC_NUM; i++)
936 #ifndef OPENSSL_NO_ECDH
937 if (strcmp(*argv,"ecdhp160") == 0) ecdh_doit[R_EC_P160]=2;
938 else if (strcmp(*argv,"ecdhp224") == 0) ecdh_doit[R_EC_P224]=2;
939 else if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2;
940 else if (strcmp(*argv,"ecdhp384") == 0) ecdh_doit[R_EC_P384]=2;
941 else if (strcmp(*argv,"ecdhp521") == 0) ecdh_doit[R_EC_P521]=2;
942 else if (strcmp(*argv,"ecdhk163") == 0) ecdh_doit[R_EC_K163]=2;
943 else if (strcmp(*argv,"ecdhk233") == 0) ecdh_doit[R_EC_K233]=2;
944 else if (strcmp(*argv,"ecdhk283") == 0) ecdh_doit[R_EC_K283]=2;
945 else if (strcmp(*argv,"ecdhk409") == 0) ecdh_doit[R_EC_K409]=2;
946 else if (strcmp(*argv,"ecdhk571") == 0) ecdh_doit[R_EC_K571]=2;
947 else if (strcmp(*argv,"ecdhb163") == 0) ecdh_doit[R_EC_B163]=2;
948 else if (strcmp(*argv,"ecdhb233") == 0) ecdh_doit[R_EC_B233]=2;
949 else if (strcmp(*argv,"ecdhb283") == 0) ecdh_doit[R_EC_B283]=2;
950 else if (strcmp(*argv,"ecdhb409") == 0) ecdh_doit[R_EC_B409]=2;
951 else if (strcmp(*argv,"ecdhb571") == 0) ecdh_doit[R_EC_B571]=2;
952 else if (strcmp(*argv,"ecdh") == 0)
954 for (i=0; i < EC_NUM; i++)
960 BIO_printf(bio_err,"Error: bad option or value\n");
961 BIO_printf(bio_err,"\n");
962 BIO_printf(bio_err,"Available values:\n");
963 #ifndef OPENSSL_NO_MD2
964 BIO_printf(bio_err,"md2 ");
966 #ifndef OPENSSL_NO_MDC2
967 BIO_printf(bio_err,"mdc2 ");
969 #ifndef OPENSSL_NO_MD4
970 BIO_printf(bio_err,"md4 ");
972 #ifndef OPENSSL_NO_MD5
973 BIO_printf(bio_err,"md5 ");
974 #ifndef OPENSSL_NO_HMAC
975 BIO_printf(bio_err,"hmac ");
978 #ifndef OPENSSL_NO_SHA1
979 BIO_printf(bio_err,"sha1 ");
981 #ifndef OPENSSL_NO_RIPEMD160
982 BIO_printf(bio_err,"rmd160");
984 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
985 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
986 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
987 BIO_printf(bio_err,"\n");
990 #ifndef OPENSSL_NO_IDEA
991 BIO_printf(bio_err,"idea-cbc ");
993 #ifndef OPENSSL_NO_RC2
994 BIO_printf(bio_err,"rc2-cbc ");
996 #ifndef OPENSSL_NO_RC5
997 BIO_printf(bio_err,"rc5-cbc ");
999 #ifndef OPENSSL_NO_BF
1000 BIO_printf(bio_err,"bf-cbc");
1002 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1003 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
1004 BIO_printf(bio_err,"\n");
1006 #ifndef OPENSSL_NO_DES
1007 BIO_printf(bio_err,"des-cbc des-ede3 ");
1009 #ifndef OPENSSL_NO_AES
1010 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
1012 #ifndef OPENSSL_NO_RC4
1013 BIO_printf(bio_err,"rc4");
1015 BIO_printf(bio_err,"\n");
1017 #ifndef OPENSSL_NO_RSA
1018 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
1021 #ifndef OPENSSL_NO_DSA
1022 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
1024 #ifndef OPENSSL_NO_ECDSA
1025 BIO_printf(bio_err,"ecdsap160 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
1026 BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n");
1027 BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n");
1028 BIO_printf(bio_err,"ecdsa\n");
1030 #ifndef OPENSSL_NO_ECDH
1031 BIO_printf(bio_err,"ecdhp160 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n");
1032 BIO_printf(bio_err,"ecdhk163 ecdhk233 ecdhk283 ecdhk409 ecdhk571\n");
1033 BIO_printf(bio_err,"ecdhb163 ecdhb233 ecdhb283 ecdhb409 ecdhb571\n");
1034 BIO_printf(bio_err,"ecdh\n");
1037 #ifndef OPENSSL_NO_IDEA
1038 BIO_printf(bio_err,"idea ");
1040 #ifndef OPENSSL_NO_RC2
1041 BIO_printf(bio_err,"rc2 ");
1043 #ifndef OPENSSL_NO_DES
1044 BIO_printf(bio_err,"des ");
1046 #ifndef OPENSSL_NO_AES
1047 BIO_printf(bio_err,"aes ");
1049 #ifndef OPENSSL_NO_RSA
1050 BIO_printf(bio_err,"rsa ");
1052 #ifndef OPENSSL_NO_BF
1053 BIO_printf(bio_err,"blowfish");
1055 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1056 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
1057 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
1058 BIO_printf(bio_err,"\n");
1061 BIO_printf(bio_err,"\n");
1062 BIO_printf(bio_err,"Available options:\n");
1063 #if defined(TIMES) || defined(USE_TOD)
1064 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
1066 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
1067 BIO_printf(bio_err,"-evp e use EVP e.\n");
1068 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
1069 BIO_printf(bio_err,"-mr produce machine readable output.\n");
1071 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
1081 if(multi && do_multi(multi))
1087 for (i=0; i<ALGOR_NUM; i++)
1092 for (i=0; i<RSA_NUM; i++)
1094 for (i=0; i<DSA_NUM; i++)
1097 for (i=0; i<ALGOR_NUM; i++)
1098 if (doit[i]) pr_header++;
1100 if (usertime == 0 && !mr)
1101 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
1102 if (usertime <= 0 && !mr)
1104 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
1105 BIO_printf(bio_err,"program when this computer is idle.\n");
1108 #ifndef OPENSSL_NO_RSA
1109 for (i=0; i<RSA_NUM; i++)
1111 const unsigned char *p;
1114 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
1115 if (rsa_key[i] == NULL)
1117 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
1123 BIO_printf(bio_err,mr ? "+RK:%d:"
1124 : "Loaded RSA key, %d bit modulus and e= 0x",
1125 BN_num_bits(rsa_key[i]->n));
1126 BN_print(bio_err,rsa_key[i]->e);
1127 BIO_printf(bio_err,"\n");
1133 #ifndef OPENSSL_NO_DSA
1134 dsa_key[0]=get_dsa512();
1135 dsa_key[1]=get_dsa1024();
1136 dsa_key[2]=get_dsa2048();
1139 #ifndef OPENSSL_NO_DES
1140 DES_set_key_unchecked(&key,&sch);
1141 DES_set_key_unchecked(&key2,&sch2);
1142 DES_set_key_unchecked(&key3,&sch3);
1144 #ifndef OPENSSL_NO_AES
1145 AES_set_encrypt_key(key16,128,&aes_ks1);
1146 AES_set_encrypt_key(key24,192,&aes_ks2);
1147 AES_set_encrypt_key(key32,256,&aes_ks3);
1149 #ifndef OPENSSL_NO_IDEA
1150 idea_set_encrypt_key(key16,&idea_ks);
1152 #ifndef OPENSSL_NO_RC4
1153 RC4_set_key(&rc4_ks,16,key16);
1155 #ifndef OPENSSL_NO_RC2
1156 RC2_set_key(&rc2_ks,16,key16,128);
1158 #ifndef OPENSSL_NO_RC5
1159 RC5_32_set_key(&rc5_ks,16,key16,12);
1161 #ifndef OPENSSL_NO_BF
1162 BF_set_key(&bf_ks,16,key16);
1164 #ifndef OPENSSL_NO_CAST
1165 CAST_set_key(&cast_ks,16,key16);
1167 #ifndef OPENSSL_NO_RSA
1168 memset(rsa_c,0,sizeof(rsa_c));
1171 #ifndef OPENSSL_NO_DES
1172 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
1178 for (i=count; i; i--)
1179 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
1184 c[D_MD2][0]=count/10;
1185 c[D_MDC2][0]=count/10;
1190 c[D_RMD160][0]=count;
1191 c[D_RC4][0]=count*5;
1192 c[D_CBC_DES][0]=count;
1193 c[D_EDE3_DES][0]=count/3;
1194 c[D_CBC_IDEA][0]=count;
1195 c[D_CBC_RC2][0]=count;
1196 c[D_CBC_RC5][0]=count;
1197 c[D_CBC_BF][0]=count;
1198 c[D_CBC_CAST][0]=count;
1200 for (i=1; i<SIZE_NUM; i++)
1202 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1203 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1204 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1205 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1206 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1207 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1208 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1210 for (i=1; i<SIZE_NUM; i++)
1214 l0=(long)lengths[i-1];
1215 l1=(long)lengths[i];
1216 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1217 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1218 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1219 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1220 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1221 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1222 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1223 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1225 #ifndef OPENSSL_NO_RSA
1226 rsa_c[R_RSA_512][0]=count/2000;
1227 rsa_c[R_RSA_512][1]=count/400;
1228 for (i=1; i<RSA_NUM; i++)
1230 rsa_c[i][0]=rsa_c[i-1][0]/8;
1231 rsa_c[i][1]=rsa_c[i-1][1]/4;
1232 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1236 if (rsa_c[i][0] == 0)
1245 #ifndef OPENSSL_NO_DSA
1246 dsa_c[R_DSA_512][0]=count/1000;
1247 dsa_c[R_DSA_512][1]=count/1000/2;
1248 for (i=1; i<DSA_NUM; i++)
1250 dsa_c[i][0]=dsa_c[i-1][0]/4;
1251 dsa_c[i][1]=dsa_c[i-1][1]/4;
1252 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1265 #ifndef OPENSSL_NO_ECDSA
1266 ecdsa_c[R_EC_P160][0]=count/1000;
1267 ecdsa_c[R_EC_P160][1]=count/1000/2;
1268 for (i=R_EC_P224; i<=R_EC_P521; i++)
1270 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1271 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1272 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1276 if (ecdsa_c[i] == 0)
1283 ecdsa_c[R_EC_K163][0]=count/1000;
1284 ecdsa_c[R_EC_K163][1]=count/1000/2;
1285 for (i=R_EC_K233; i<=R_EC_K571; i++)
1287 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1288 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1289 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1293 if (ecdsa_c[i] == 0)
1300 ecdsa_c[R_EC_B163][0]=count/1000;
1301 ecdsa_c[R_EC_B163][1]=count/1000/2;
1302 for (i=R_EC_B233; i<=R_EC_B571; i++)
1304 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1305 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1306 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1310 if (ecdsa_c[i] == 0)
1319 #ifndef OPENSSL_NO_ECDH
1320 ecdh_c[R_EC_P160][0]=count/1000;
1321 ecdh_c[R_EC_P160][1]=count/1000;
1322 for (i=R_EC_P224; i<=R_EC_P521; i++)
1324 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1325 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1326 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1337 ecdh_c[R_EC_K163][0]=count/1000;
1338 ecdh_c[R_EC_K163][1]=count/1000;
1339 for (i=R_EC_K233; i<=R_EC_K571; i++)
1341 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1342 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1343 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1354 ecdh_c[R_EC_B163][0]=count/1000;
1355 ecdh_c[R_EC_B163][1]=count/1000;
1356 for (i=R_EC_B233; i<=R_EC_B571; i++)
1358 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1359 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1360 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1373 #define COND(d) (count < (d))
1374 #define COUNT(d) (d)
1376 /* not worth fixing */
1377 # error "You cannot disable DES on systems without SIGALRM."
1378 #endif /* OPENSSL_NO_DES */
1380 #define COND(c) (run)
1381 #define COUNT(d) (count)
1382 signal(SIGALRM,sig_done);
1383 #endif /* SIGALRM */
1385 #ifndef OPENSSL_NO_MD2
1388 for (j=0; j<SIZE_NUM; j++)
1390 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1392 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1393 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1395 print_result(D_MD2,j,count,d);
1399 #ifndef OPENSSL_NO_MDC2
1402 for (j=0; j<SIZE_NUM; j++)
1404 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1406 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1407 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1409 print_result(D_MDC2,j,count,d);
1414 #ifndef OPENSSL_NO_MD4
1417 for (j=0; j<SIZE_NUM; j++)
1419 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1421 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1422 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1424 print_result(D_MD4,j,count,d);
1429 #ifndef OPENSSL_NO_MD5
1432 for (j=0; j<SIZE_NUM; j++)
1434 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1436 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1437 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1439 print_result(D_MD5,j,count,d);
1444 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1449 HMAC_CTX_init(&hctx);
1450 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1451 16,EVP_md5(), NULL);
1453 for (j=0; j<SIZE_NUM; j++)
1455 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1457 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1459 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1460 HMAC_Update(&hctx,buf,lengths[j]);
1461 HMAC_Final(&hctx,&(hmac[0]),NULL);
1464 print_result(D_HMAC,j,count,d);
1466 HMAC_CTX_cleanup(&hctx);
1469 #ifndef OPENSSL_NO_SHA
1472 for (j=0; j<SIZE_NUM; j++)
1474 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1476 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1477 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1479 print_result(D_SHA1,j,count,d);
1483 #ifndef OPENSSL_NO_RIPEMD
1486 for (j=0; j<SIZE_NUM; j++)
1488 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1490 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1491 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1493 print_result(D_RMD160,j,count,d);
1497 #ifndef OPENSSL_NO_RC4
1500 for (j=0; j<SIZE_NUM; j++)
1502 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1504 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1505 RC4(&rc4_ks,(unsigned int)lengths[j],
1508 print_result(D_RC4,j,count,d);
1512 #ifndef OPENSSL_NO_DES
1513 if (doit[D_CBC_DES])
1515 for (j=0; j<SIZE_NUM; j++)
1517 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1519 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1520 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1521 &DES_iv,DES_ENCRYPT);
1523 print_result(D_CBC_DES,j,count,d);
1527 if (doit[D_EDE3_DES])
1529 for (j=0; j<SIZE_NUM; j++)
1531 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1533 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1534 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1536 &DES_iv,DES_ENCRYPT);
1538 print_result(D_EDE3_DES,j,count,d);
1542 #ifndef OPENSSL_NO_AES
1543 if (doit[D_CBC_128_AES])
1545 for (j=0; j<SIZE_NUM; j++)
1547 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1549 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1550 AES_cbc_encrypt(buf,buf,
1551 (unsigned long)lengths[j],&aes_ks1,
1554 print_result(D_CBC_128_AES,j,count,d);
1557 if (doit[D_CBC_192_AES])
1559 for (j=0; j<SIZE_NUM; j++)
1561 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1563 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1564 AES_cbc_encrypt(buf,buf,
1565 (unsigned long)lengths[j],&aes_ks2,
1568 print_result(D_CBC_192_AES,j,count,d);
1571 if (doit[D_CBC_256_AES])
1573 for (j=0; j<SIZE_NUM; j++)
1575 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1577 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1578 AES_cbc_encrypt(buf,buf,
1579 (unsigned long)lengths[j],&aes_ks3,
1582 print_result(D_CBC_256_AES,j,count,d);
1587 #ifndef OPENSSL_NO_IDEA
1588 if (doit[D_CBC_IDEA])
1590 for (j=0; j<SIZE_NUM; j++)
1592 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1594 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1595 idea_cbc_encrypt(buf,buf,
1596 (unsigned long)lengths[j],&idea_ks,
1599 print_result(D_CBC_IDEA,j,count,d);
1603 #ifndef OPENSSL_NO_RC2
1604 if (doit[D_CBC_RC2])
1606 for (j=0; j<SIZE_NUM; j++)
1608 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1610 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1611 RC2_cbc_encrypt(buf,buf,
1612 (unsigned long)lengths[j],&rc2_ks,
1615 print_result(D_CBC_RC2,j,count,d);
1619 #ifndef OPENSSL_NO_RC5
1620 if (doit[D_CBC_RC5])
1622 for (j=0; j<SIZE_NUM; j++)
1624 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1626 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1627 RC5_32_cbc_encrypt(buf,buf,
1628 (unsigned long)lengths[j],&rc5_ks,
1631 print_result(D_CBC_RC5,j,count,d);
1635 #ifndef OPENSSL_NO_BF
1638 for (j=0; j<SIZE_NUM; j++)
1640 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1642 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1643 BF_cbc_encrypt(buf,buf,
1644 (unsigned long)lengths[j],&bf_ks,
1647 print_result(D_CBC_BF,j,count,d);
1651 #ifndef OPENSSL_NO_CAST
1652 if (doit[D_CBC_CAST])
1654 for (j=0; j<SIZE_NUM; j++)
1656 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1658 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1659 CAST_cbc_encrypt(buf,buf,
1660 (unsigned long)lengths[j],&cast_ks,
1663 print_result(D_CBC_CAST,j,count,d);
1670 for (j=0; j<SIZE_NUM; j++)
1677 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1678 /* -O3 -fschedule-insns messes up an
1679 * optimization here! names[D_EVP]
1680 * somehow becomes NULL */
1681 print_message(names[D_EVP],save_count,
1684 EVP_CIPHER_CTX_init(&ctx);
1686 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1688 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1692 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1693 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1695 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1696 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1698 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1700 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1705 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1706 print_message(names[D_EVP],save_count,
1710 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1711 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1715 print_result(D_EVP,j,count,d);
1719 RAND_pseudo_bytes(buf,36);
1720 #ifndef OPENSSL_NO_RSA
1721 for (j=0; j<RSA_NUM; j++)
1724 if (!rsa_doit[j]) continue;
1725 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1728 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1729 ERR_print_errors(bio_err);
1734 pkey_print_message("private","rsa",
1735 rsa_c[j][0],rsa_bits[j],
1737 /* RSA_blinding_on(rsa_key[j],NULL); */
1739 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1741 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1742 &rsa_num, rsa_key[j]);
1746 "RSA sign failure\n");
1747 ERR_print_errors(bio_err);
1753 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1754 : "%ld %d bit private RSA's in %.2fs\n",
1755 count,rsa_bits[j],d);
1756 rsa_results[j][0]=d/(double)count;
1761 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1764 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1765 ERR_print_errors(bio_err);
1770 pkey_print_message("public","rsa",
1771 rsa_c[j][1],rsa_bits[j],
1774 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1776 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1777 rsa_num, rsa_key[j]);
1781 "RSA verify failure\n");
1782 ERR_print_errors(bio_err);
1788 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1789 : "%ld %d bit public RSA's in %.2fs\n",
1790 count,rsa_bits[j],d);
1791 rsa_results[j][1]=d/(double)count;
1797 /* if longer than 10s, don't do any more */
1798 for (j++; j<RSA_NUM; j++)
1804 RAND_pseudo_bytes(buf,20);
1805 #ifndef OPENSSL_NO_DSA
1806 if (RAND_status() != 1)
1808 RAND_seed(rnd_seed, sizeof rnd_seed);
1811 for (j=0; j<DSA_NUM; j++)
1816 if (!dsa_doit[j]) continue;
1817 /* DSA_generate_key(dsa_key[j]); */
1818 /* DSA_sign_setup(dsa_key[j],NULL); */
1819 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1823 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1824 ERR_print_errors(bio_err);
1829 pkey_print_message("sign","dsa",
1830 dsa_c[j][0],dsa_bits[j],
1833 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1835 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1840 "DSA sign failure\n");
1841 ERR_print_errors(bio_err);
1847 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1848 : "%ld %d bit DSA signs in %.2fs\n",
1849 count,dsa_bits[j],d);
1850 dsa_results[j][0]=d/(double)count;
1854 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1858 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1859 ERR_print_errors(bio_err);
1864 pkey_print_message("verify","dsa",
1865 dsa_c[j][1],dsa_bits[j],
1868 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1870 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1875 "DSA verify failure\n");
1876 ERR_print_errors(bio_err);
1882 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1883 : "%ld %d bit DSA verify in %.2fs\n",
1884 count,dsa_bits[j],d);
1885 dsa_results[j][1]=d/(double)count;
1890 /* if longer than 10s, don't do any more */
1891 for (j++; j<DSA_NUM; j++)
1895 if (rnd_fake) RAND_cleanup();
1898 #ifndef OPENSSL_NO_ECDSA
1899 if (RAND_status() != 1)
1901 RAND_seed(rnd_seed, sizeof rnd_seed);
1904 for (j=0; j<EC_NUM; j++)
1908 if (!ecdsa_doit[j]) continue; /* Ignore Curve */
1909 ecdsa[j] = EC_KEY_new();
1910 if (ecdsa[j] == NULL)
1912 BIO_printf(bio_err,"ECDSA failure.\n");
1913 ERR_print_errors(bio_err);
1918 ecdsa[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
1919 /* Could not obtain group information */
1920 if (ecdsa[j]->group == NULL)
1922 BIO_printf(bio_err,"ECDSA failure.Could not obtain group information\n");
1923 ERR_print_errors(bio_err);
1928 /* Perform ECDSA signature test */
1929 EC_KEY_generate_key(ecdsa[j]);
1930 ret = ECDSA_sign(0, buf, 20, ecdsasig,
1931 &ecdsasiglen, ecdsa[j]);
1934 BIO_printf(bio_err,"ECDSA sign failure. No ECDSA sign will be done.\n");
1935 ERR_print_errors(bio_err);
1940 pkey_print_message("sign","ecdsa",
1942 test_curves_bits[j],
1946 for (count=0,run=1; COND(ecdsa_c[j][0]);
1949 ret=ECDSA_sign(0, buf, 20,
1950 ecdsasig, &ecdsasiglen,
1954 BIO_printf(bio_err, "ECDSA sign failure\n");
1955 ERR_print_errors(bio_err);
1962 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
1963 "%ld %d bit ECDSA signs in %.2fs \n",
1964 count, test_curves_bits[j], d);
1965 ecdsa_results[j][0]=d/(double)count;
1969 /* Perform ECDSA verification test */
1970 ret=ECDSA_verify(0, buf, 20, ecdsasig,
1971 ecdsasiglen, ecdsa[j]);
1974 BIO_printf(bio_err,"ECDSA verify failure. No ECDSA verify will be done.\n");
1975 ERR_print_errors(bio_err);
1980 pkey_print_message("verify","ecdsa",
1982 test_curves_bits[j],
1985 for (count=0,run=1; COND(ecdsa_c[j][1]); count++)
1987 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
1990 BIO_printf(bio_err, "ECDSA verify failure\n");
1991 ERR_print_errors(bio_err);
1997 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
1998 : "%ld %d bit ECDSA verify in %.2fs\n",
1999 count, test_curves_bits[j], d);
2000 ecdsa_results[j][1]=d/(double)count;
2005 /* if longer than 10s, don't do any more */
2006 for (j++; j<EC_NUM; j++)
2012 if (rnd_fake) RAND_cleanup();
2015 #ifndef OPENSSL_NO_ECDH
2016 if (RAND_status() != 1)
2018 RAND_seed(rnd_seed, sizeof rnd_seed);
2021 for (j=0; j<EC_NUM; j++)
2023 if (!ecdh_doit[j]) continue;
2024 ecdh_a[j] = EC_KEY_new();
2025 ecdh_b[j] = EC_KEY_new();
2026 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2028 BIO_printf(bio_err,"ECDH failure.\n");
2029 ERR_print_errors(bio_err);
2034 ecdh_a[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
2035 if (ecdh_a[j]->group == NULL)
2037 BIO_printf(bio_err,"ECDH failure.\n");
2038 ERR_print_errors(bio_err);
2043 ecdh_b[j]->group = ecdh_a[j]->group;
2045 /* generate two ECDH key pairs */
2046 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2047 !EC_KEY_generate_key(ecdh_b[j]))
2049 BIO_printf(bio_err,"ECDH key generation failure.\n");
2050 ERR_print_errors(bio_err);
2055 secret_size_a = ECDH_compute_key(secret_a,
2058 secret_size_b = ECDH_compute_key(secret_b,
2061 if (secret_size_a != secret_size_b)
2066 for (secret_idx = 0;
2067 (secret_idx < secret_size_a)
2068 && (ecdh_checks == 1);
2071 if (secret_a[secret_idx] != secret_b[secret_idx])
2075 if (ecdh_checks == 0)
2077 BIO_printf(bio_err,"ECDH computations don't match.\n");
2078 ERR_print_errors(bio_err);
2082 pkey_print_message("","ecdh",
2084 test_curves_bits[j],
2087 for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2089 ECDH_compute_key(secret_a,
2094 BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2095 count, test_curves_bits[j], d);
2096 ecdh_results[j][0]=d/(double)count;
2104 /* if longer than 10s, don't do any more */
2105 for (j++; j<EC_NUM; j++)
2109 if (rnd_fake) RAND_cleanup();
2116 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
2117 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
2119 printf("%s ",BN_options());
2120 #ifndef OPENSSL_NO_MD2
2121 printf("%s ",MD2_options());
2123 #ifndef OPENSSL_NO_RC4
2124 printf("%s ",RC4_options());
2126 #ifndef OPENSSL_NO_DES
2127 printf("%s ",DES_options());
2129 #ifndef OPENSSL_NO_AES
2130 printf("%s ",AES_options());
2132 #ifndef OPENSSL_NO_IDEA
2133 printf("%s ",idea_options());
2135 #ifndef OPENSSL_NO_BF
2136 printf("%s ",BF_options());
2138 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2139 printf("available timing options: ");
2150 #define as_string(s) (#s)
2151 printf("HZ=%g", (double)HZ);
2153 printf(" [sysconf value]");
2157 printf("timing function used: %s%s%s%s%s%s%s\n",
2158 (ftime_used ? "ftime" : ""),
2159 (ftime_used + times_used > 1 ? "," : ""),
2160 (times_used ? "times" : ""),
2161 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
2162 (gettimeofday_used ? "gettimeofday" : ""),
2163 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
2164 (getrusage_used ? "getrusage" : ""));
2170 fprintf(stdout,"+H");
2173 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
2174 fprintf(stdout,"type ");
2176 for (j=0; j<SIZE_NUM; j++)
2177 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
2178 fprintf(stdout,"\n");
2181 for (k=0; k<ALGOR_NUM; k++)
2183 if (!doit[k]) continue;
2185 fprintf(stdout,"+F:%d:%s",k,names[k]);
2187 fprintf(stdout,"%-13s",names[k]);
2188 for (j=0; j<SIZE_NUM; j++)
2190 if (results[k][j] > 10000 && !mr)
2191 fprintf(stdout," %11.2fk",results[k][j]/1e3);
2193 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
2195 fprintf(stdout,"\n");
2197 #ifndef OPENSSL_NO_RSA
2199 for (k=0; k<RSA_NUM; k++)
2201 if (!rsa_doit[k]) continue;
2204 printf("%18ssign verify sign/s verify/s\n"," ");
2208 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2209 k,rsa_bits[k],rsa_results[k][0],
2212 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2213 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2214 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
2217 #ifndef OPENSSL_NO_DSA
2219 for (k=0; k<DSA_NUM; k++)
2221 if (!dsa_doit[k]) continue;
2224 printf("%18ssign verify sign/s verify/s\n"," ");
2228 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2229 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2231 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2232 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2233 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
2236 #ifndef OPENSSL_NO_ECDSA
2238 for (k=0; k<EC_NUM; k++)
2240 if (!ecdsa_doit[k]) continue;
2243 printf("%30ssign verify sign/s verify/s\n"," ");
2248 fprintf(stdout,"+F4:%u:%u:%f:%f\n",
2249 k, test_curves_bits[k],
2250 ecdsa_results[k][0],ecdsa_results[k][1]);
2253 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2254 test_curves_bits[k],
2255 test_curves_names[k],
2256 ecdsa_results[k][0],ecdsa_results[k][1],
2257 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2262 #ifndef OPENSSL_NO_ECDH
2264 for (k=0; k<EC_NUM; k++)
2266 if (!ecdh_doit[k]) continue;
2269 printf("%30sop op/s\n"," ");
2273 fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2274 k, test_curves_bits[k],
2275 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2278 fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2279 test_curves_bits[k],
2280 test_curves_names[k],
2281 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2288 ERR_print_errors(bio_err);
2289 if (buf != NULL) OPENSSL_free(buf);
2290 if (buf2 != NULL) OPENSSL_free(buf2);
2291 #ifndef OPENSSL_NO_RSA
2292 for (i=0; i<RSA_NUM; i++)
2293 if (rsa_key[i] != NULL)
2294 RSA_free(rsa_key[i]);
2296 #ifndef OPENSSL_NO_DSA
2297 for (i=0; i<DSA_NUM; i++)
2298 if (dsa_key[i] != NULL)
2299 DSA_free(dsa_key[i]);
2302 #ifndef OPENSSL_NO_ECDSA
2303 for (i=0; i<EC_NUM; i++)
2304 if (ecdsa[i] != NULL)
2305 EC_KEY_free(ecdsa[i]);
2307 #ifndef OPENSSL_NO_ECDH
2308 for (i=0; i<EC_NUM; i++)
2310 if (ecdh_a[i] != NULL)
2311 EC_KEY_free(ecdh_a[i]);
2312 if (ecdh_b[i] != NULL)
2313 EC_KEY_free(ecdh_b[i]);
2321 static void print_message(const char *s, long num, int length)
2324 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2325 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
2326 (void)BIO_flush(bio_err);
2329 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2330 : "Doing %s %ld times on %d size blocks: ",s,num,length);
2331 (void)BIO_flush(bio_err);
2338 static void pkey_print_message(char *str, char *str2, long num, int bits,
2342 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2343 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
2344 (void)BIO_flush(bio_err);
2347 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2348 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
2349 (void)BIO_flush(bio_err);
2356 static void print_result(int alg,int run_no,int count,double time_used)
2358 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
2359 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
2360 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2363 static char *sstrsep(char **string, const char *delim)
2366 char *token = *string;
2371 memset(isdelim, 0, sizeof isdelim);
2376 isdelim[(unsigned char)(*delim)] = 1;
2380 while (!isdelim[(unsigned char)(**string)])
2395 static int do_multi(int multi)
2400 static char sep[]=":";
2402 fds=malloc(multi*sizeof *fds);
2403 for(n=0 ; n < multi ; ++n)
2421 printf("Forked child %d\n",n);
2424 /* for now, assume the pipe is long enough to take all the output */
2425 for(n=0 ; n < multi ; ++n)
2431 f=fdopen(fds[n],"r");
2432 while(fgets(buf,sizeof buf,f))
2439 fprintf(stderr,"Don't understand line '%s' from child %d\n",
2443 printf("Got: %s from %d\n",buf,n);
2444 if(!strncmp(buf,"+F:",3))
2450 alg=atoi(sstrsep(&p,sep));
2452 for(j=0 ; j < SIZE_NUM ; ++j)
2453 results[alg][j]+=atof(sstrsep(&p,sep));
2455 else if(!strncmp(buf,"+F2:",4))
2461 k=atoi(sstrsep(&p,sep));
2464 d=atof(sstrsep(&p,sep));
2466 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2468 rsa_results[k][0]=d;
2470 d=atof(sstrsep(&p,sep));
2472 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2474 rsa_results[k][1]=d;
2476 else if(!strncmp(buf,"+F2:",4))
2482 k=atoi(sstrsep(&p,sep));
2485 d=atof(sstrsep(&p,sep));
2487 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2489 rsa_results[k][0]=d;
2491 d=atof(sstrsep(&p,sep));
2493 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2495 rsa_results[k][1]=d;
2497 else if(!strncmp(buf,"+F3:",4))
2503 k=atoi(sstrsep(&p,sep));
2506 d=atof(sstrsep(&p,sep));
2508 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2510 dsa_results[k][0]=d;
2512 d=atof(sstrsep(&p,sep));
2514 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2516 dsa_results[k][1]=d;
2518 #ifndef OPENSSL_NO_ECDSA
2519 else if(!strncmp(buf,"+F4:",4))
2525 k=atoi(sstrsep(&p,sep));
2528 d=atof(sstrsep(&p,sep));
2530 ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2532 ecdsa_results[k][0]=d;
2534 d=atof(sstrsep(&p,sep));
2536 ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2538 ecdsa_results[k][1]=d;
2542 #ifndef OPENSSL_NO_ECDH
2543 else if(!strncmp(buf,"+F5:",4))
2549 k=atoi(sstrsep(&p,sep));
2552 d=atof(sstrsep(&p,sep));
2554 ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2556 ecdh_results[k][0]=d;
2561 else if(!strncmp(buf,"+H:",3))
2565 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);