1 /* apps/speed.c -*- mode:C; c-file-style: "eay" -*- */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
58 /* ====================================================================
59 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
61 * Portions of the attached software ("Contribution") are developed by
62 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
64 * The Contribution is licensed pursuant to the OpenSSL open source
65 * license provided above.
67 * The ECDH and ECDSA speed test software is originally written by
68 * Sumit Gupta of Sun Microsystems Laboratories.
72 /* most of this code has been pilfered from my libdes speed.c program */
74 #ifndef OPENSSL_NO_SPEED
78 #define RSA_SECONDS 10
79 #define DSA_SECONDS 10
80 #define ECDSA_SECONDS 10
81 #define ECDH_SECONDS 10
83 /* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
84 /* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
87 #define PROG speed_main
95 #ifdef OPENSSL_NO_STDIO
98 #include <openssl/crypto.h>
99 #include <openssl/rand.h>
100 #include <openssl/err.h>
101 #include <openssl/evp.h>
102 #include <openssl/objects.h>
103 #if !defined(OPENSSL_SYS_MSDOS)
104 #include OPENSSL_UNISTD
107 #ifndef OPENSSL_SYS_NETWARE
111 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
113 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
116 #if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_MPE) && !defined(__NetBSD__) && !defined(OPENSSL_SYS_VXWORKS) /* FIXME */
120 #if defined(OPENSSL_SYS_NETWARE)
130 # include <sys/types.h>
131 # include <sys/times.h>
134 # include <sys/time.h>
135 # include <sys/resource.h>
138 /* Depending on the VMS version, the tms structure is perhaps defined.
139 The __TMS macro will show if it was. If it wasn't defined, we should
140 undefine TIMES, since that tells the rest of the program how things
141 should be handled. -- Richard Levitte */
142 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
147 #include <sys/timeb.h>
150 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS) && !defined(OPENSSL_SYS_NETWARE)
151 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
154 #if defined(sun) || defined(__ultrix)
155 #define _POSIX_SOURCE
157 #include <sys/param.h>
160 #ifndef OPENSSL_NO_DES
161 #include <openssl/des.h>
163 #ifndef OPENSSL_NO_AES
164 #include <openssl/aes.h>
166 #ifndef OPENSSL_NO_MD2
167 #include <openssl/md2.h>
169 #ifndef OPENSSL_NO_MDC2
170 #include <openssl/mdc2.h>
172 #ifndef OPENSSL_NO_MD4
173 #include <openssl/md4.h>
175 #ifndef OPENSSL_NO_MD5
176 #include <openssl/md5.h>
178 #ifndef OPENSSL_NO_HMAC
179 #include <openssl/hmac.h>
181 #include <openssl/evp.h>
182 #ifndef OPENSSL_NO_SHA
183 #include <openssl/sha.h>
185 #ifndef OPENSSL_NO_RIPEMD
186 #include <openssl/ripemd.h>
188 #ifndef OPENSSL_NO_RC4
189 #include <openssl/rc4.h>
191 #ifndef OPENSSL_NO_RC5
192 #include <openssl/rc5.h>
194 #ifndef OPENSSL_NO_RC2
195 #include <openssl/rc2.h>
197 #ifndef OPENSSL_NO_IDEA
198 #include <openssl/idea.h>
200 #ifndef OPENSSL_NO_BF
201 #include <openssl/blowfish.h>
203 #ifndef OPENSSL_NO_CAST
204 #include <openssl/cast.h>
206 #ifndef OPENSSL_NO_RSA
207 #include <openssl/rsa.h>
208 #include "./testrsa.h"
210 #include <openssl/x509.h>
211 #ifndef OPENSSL_NO_DSA
212 #include "./testdsa.h"
214 #ifndef OPENSSL_NO_ECDSA
215 #include <openssl/ecdsa.h>
217 #ifndef OPENSSL_NO_ECDH
218 #include <openssl/ecdh.h>
222 * The following "HZ" timing stuff should be sync'd up with the code in
223 * crypto/tmdiff.[ch]. That appears to try to do the same job, though I think
224 * this code is more up to date than libcrypto's so there may be features to
225 * migrate over first. This is used in two places further down AFAICS.
226 * The point is that nothing in openssl actually *uses* that tmdiff stuff, so
227 * either speed.c should be using it or it should go because it's obviously not
228 * useful enough. Anyone want to do a janitorial job on this?
231 /* The following if from times(3) man page. It may need to be changed */
233 # if defined(_SC_CLK_TCK) \
234 && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000)
235 # define HZ sysconf(_SC_CLK_TCK)
238 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
240 # else /* _BSD_CLK_TCK_ */
241 # define HZ ((double)_BSD_CLK_TCK_)
244 # define HZ ((double)CLK_TCK)
249 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2) && !defined(OPENSSL_SYS_NETWARE)
254 #define BUFSIZE ((long)1024*8+1)
257 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
259 static int usertime=1;
261 static double Time_F(int s);
262 static void print_message(const char *s,long num,int length);
263 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
264 static void print_result(int alg,int run_no,int count,double time_used);
266 static int do_multi(int multi);
275 #define MAX_ECDH_SIZE 256
277 static const char *names[ALGOR_NUM]={
278 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
279 "des cbc","des ede3","idea cbc",
280 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
281 "aes-128 cbc","aes-192 cbc","aes-256 cbc"};
282 static double results[ALGOR_NUM][SIZE_NUM];
283 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
284 static double rsa_results[RSA_NUM][2];
285 static double dsa_results[DSA_NUM][2];
286 static double ecdsa_results[EC_NUM][2];
287 static double ecdh_results[EC_NUM][1];
291 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
292 #define SIGRETTYPE void
294 #define SIGRETTYPE int
297 static SIGRETTYPE sig_done(int sig);
298 static SIGRETTYPE sig_done(int sig)
300 signal(SIGALRM,sig_done);
311 #if defined(OPENSSL_SYS_NETWARE)
313 /* for NetWare the best we can do is use clock() which returns the
314 * time, in hundredths of a second, since the NLM began executing
316 static double Time_F(int s)
320 static clock_t tstart,tend;
330 ret=(double)((double)(tend)-(double)(tstart));
331 return((ret < 0.001)?0.001:ret);
337 static double Time_F(int s)
344 static struct rusage tstart,tend;
349 getrusage(RUSAGE_SELF,&tstart);
356 getrusage(RUSAGE_SELF,&tend);
357 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
358 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
359 +((double)i)/1000000.0;
360 return((ret < 0.001)?0.001:ret);
365 static struct timeval tstart,tend;
368 gettimeofday_used = 1;
371 gettimeofday(&tstart,NULL);
376 gettimeofday(&tend,NULL);
377 i=(long)tend.tv_usec-(long)tstart.tv_usec;
378 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
379 return((ret < 0.001)?0.001:ret);
382 #else /* ndef USE_TOD */
387 static struct tms tstart,tend;
399 ret=(double)(tend.tms_utime-tstart.tms_utime) / ret;
400 return((ret < 1e-3)?1e-3:ret);
403 # endif /* times() */
404 # if defined(TIMES) && defined(TIMEB)
407 # ifdef OPENSSL_SYS_VXWORKS
409 static unsigned long tick_start, tick_end;
413 tick_start = tickGet();
418 tick_end = tickGet();
419 ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
420 return((ret < 0.001)?0.001:ret);
423 # elif defined(TIMEB)
425 static struct timeb tstart,tend;
437 i=(long)tend.millitm-(long)tstart.millitm;
438 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
439 return((ret < 0.001)?0.001:ret);
445 #endif /* if defined(OPENSSL_SYS_NETWARE) */
448 static const int KDF1_SHA1_len = 20;
449 static void *KDF1_SHA1(void *in, size_t inlen, void *out, size_t outlen)
451 #ifndef OPENSSL_NO_SHA
452 if (outlen != SHA_DIGEST_LENGTH)
454 return SHA1(in, inlen, out);
461 int MAIN(int, char **);
463 int MAIN(int argc, char **argv)
465 #ifndef OPENSSL_NO_ENGINE
468 unsigned char *buf=NULL,*buf2=NULL;
470 long count=0,save_count=0;
472 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
475 #ifndef OPENSSL_NO_RSA
478 unsigned char md[EVP_MAX_MD_SIZE];
479 #ifndef OPENSSL_NO_MD2
480 unsigned char md2[MD2_DIGEST_LENGTH];
482 #ifndef OPENSSL_NO_MDC2
483 unsigned char mdc2[MDC2_DIGEST_LENGTH];
485 #ifndef OPENSSL_NO_MD4
486 unsigned char md4[MD4_DIGEST_LENGTH];
488 #ifndef OPENSSL_NO_MD5
489 unsigned char md5[MD5_DIGEST_LENGTH];
490 unsigned char hmac[MD5_DIGEST_LENGTH];
492 #ifndef OPENSSL_NO_SHA
493 unsigned char sha[SHA_DIGEST_LENGTH];
495 #ifndef OPENSSL_NO_RIPEMD
496 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
498 #ifndef OPENSSL_NO_RC4
501 #ifndef OPENSSL_NO_RC5
504 #ifndef OPENSSL_NO_RC2
507 #ifndef OPENSSL_NO_IDEA
508 IDEA_KEY_SCHEDULE idea_ks;
510 #ifndef OPENSSL_NO_BF
513 #ifndef OPENSSL_NO_CAST
516 static const unsigned char key16[16]=
517 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
518 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
519 static const unsigned char key24[24]=
520 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
521 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
522 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
523 static const unsigned char key32[32]=
524 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
525 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
526 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
527 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
528 #ifndef OPENSSL_NO_AES
529 #define MAX_BLOCK_SIZE 128
531 #define MAX_BLOCK_SIZE 64
533 unsigned char DES_iv[8];
534 unsigned char iv[MAX_BLOCK_SIZE/8];
535 #ifndef OPENSSL_NO_DES
536 DES_cblock *buf_as_des_cblock = NULL;
537 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
538 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
539 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
540 DES_key_schedule sch;
541 DES_key_schedule sch2;
542 DES_key_schedule sch3;
544 #ifndef OPENSSL_NO_AES
545 AES_KEY aes_ks1, aes_ks2, aes_ks3;
557 #define D_CBC_IDEA 10
561 #define D_CBC_CAST 14
562 #define D_CBC_128_AES 15
563 #define D_CBC_192_AES 16
564 #define D_CBC_256_AES 17
567 long c[ALGOR_NUM][SIZE_NUM];
593 #ifndef OPENSSL_NO_RSA
594 RSA *rsa_key[RSA_NUM];
595 long rsa_c[RSA_NUM][2];
596 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
597 static unsigned char *rsa_data[RSA_NUM]=
598 {test512,test1024,test2048,test4096};
599 static int rsa_data_length[RSA_NUM]={
600 sizeof(test512),sizeof(test1024),
601 sizeof(test2048),sizeof(test4096)};
603 #ifndef OPENSSL_NO_DSA
604 DSA *dsa_key[DSA_NUM];
605 long dsa_c[DSA_NUM][2];
606 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
608 #ifndef OPENSSL_NO_EC
609 /* We only test over the following curves as they are representative,
610 * To add tests over more curves, simply add the curve NID
611 * and curve name to the following arrays and increase the
612 * EC_NUM value accordingly.
614 static unsigned int test_curves[EC_NUM] =
618 NID_X9_62_prime192v1,
620 NID_X9_62_prime256v1,
635 static char * test_curves_names[EC_NUM] =
656 static int test_curves_bits[EC_NUM] =
658 160, 192, 224, 256, 384, 521,
659 163, 233, 283, 409, 571,
660 163, 233, 283, 409, 571
665 #ifndef OPENSSL_NO_ECDSA
666 unsigned char ecdsasig[256];
667 unsigned int ecdsasiglen;
668 EC_KEY *ecdsa[EC_NUM];
669 long ecdsa_c[EC_NUM][2];
672 #ifndef OPENSSL_NO_ECDH
673 EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
674 unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
675 int secret_size_a, secret_size_b;
678 long ecdh_c[EC_NUM][2];
681 int rsa_doit[RSA_NUM];
682 int dsa_doit[DSA_NUM];
683 int ecdsa_doit[EC_NUM];
684 int ecdh_doit[EC_NUM];
687 const EVP_CIPHER *evp_cipher=NULL;
688 const EVP_MD *evp_md=NULL;
699 memset(results, 0, sizeof(results));
700 #ifndef OPENSSL_NO_DSA
701 memset(dsa_key,0,sizeof(dsa_key));
703 #ifndef OPENSSL_NO_ECDSA
704 for (i=0; i<EC_NUM; i++) ecdsa[i] = NULL;
706 #ifndef OPENSSL_NO_ECDH
707 for (i=0; i<EC_NUM; i++)
716 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
717 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
719 if (!load_config(bio_err, NULL))
722 #ifndef OPENSSL_NO_RSA
723 memset(rsa_key,0,sizeof(rsa_key));
724 for (i=0; i<RSA_NUM; i++)
728 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
730 BIO_printf(bio_err,"out of memory\n");
733 #ifndef OPENSSL_NO_DES
734 buf_as_des_cblock = (DES_cblock *)buf;
736 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
738 BIO_printf(bio_err,"out of memory\n");
742 memset(c,0,sizeof(c));
743 memset(DES_iv,0,sizeof(DES_iv));
744 memset(iv,0,sizeof(iv));
746 for (i=0; i<ALGOR_NUM; i++)
748 for (i=0; i<RSA_NUM; i++)
750 for (i=0; i<DSA_NUM; i++)
752 #ifndef OPENSSL_NO_ECDSA
753 for (i=0; i<EC_NUM; i++)
756 #ifndef OPENSSL_NO_ECDH
757 for (i=0; i<EC_NUM; i++)
767 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
770 j--; /* Otherwise, -elapsed gets confused with
773 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
779 BIO_printf(bio_err,"no EVP given\n");
782 evp_cipher=EVP_get_cipherbyname(*argv);
785 evp_md=EVP_get_digestbyname(*argv);
787 if(!evp_cipher && !evp_md)
789 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
794 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
797 j--; /* Otherwise, -elapsed gets confused with
800 #ifndef OPENSSL_NO_ENGINE
801 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
807 BIO_printf(bio_err,"no engine given\n");
810 e = setup_engine(bio_err, *argv, 0);
811 /* j will be increased again further down. We just
812 don't want speed to confuse an engine with an
813 algorithm, especially when none is given (which
814 means all of them should be run) */
819 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
825 BIO_printf(bio_err,"no multi count given\n");
831 BIO_printf(bio_err,"bad multi count\n");
834 j--; /* Otherwise, -mr gets confused with
838 else if (argc > 0 && !strcmp(*argv,"-mr"))
841 j--; /* Otherwise, -mr gets confused with
845 #ifndef OPENSSL_NO_MD2
846 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
849 #ifndef OPENSSL_NO_MDC2
850 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
853 #ifndef OPENSSL_NO_MD4
854 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
857 #ifndef OPENSSL_NO_MD5
858 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
861 #ifndef OPENSSL_NO_MD5
862 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
865 #ifndef OPENSSL_NO_SHA
866 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
868 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
871 #ifndef OPENSSL_NO_RIPEMD
872 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
874 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
876 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
879 #ifndef OPENSSL_NO_RC4
880 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
883 #ifndef OPENSSL_NO_DES
884 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
885 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
888 #ifndef OPENSSL_NO_AES
889 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
890 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
891 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
894 #ifndef OPENSSL_NO_RSA
895 #if 0 /* was: #ifdef RSAref */
896 if (strcmp(*argv,"rsaref") == 0)
898 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
904 if (strcmp(*argv,"openssl") == 0)
906 RSA_set_default_method(RSA_PKCS1_SSLeay());
911 #endif /* !OPENSSL_NO_RSA */
912 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
913 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
914 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
915 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
916 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
917 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
918 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
920 #ifndef OPENSSL_NO_RC2
921 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
922 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
925 #ifndef OPENSSL_NO_RC5
926 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
927 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
930 #ifndef OPENSSL_NO_IDEA
931 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
932 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
935 #ifndef OPENSSL_NO_BF
936 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
937 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
938 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
941 #ifndef OPENSSL_NO_CAST
942 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
943 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
944 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
947 #ifndef OPENSSL_NO_DES
948 if (strcmp(*argv,"des") == 0)
955 #ifndef OPENSSL_NO_AES
956 if (strcmp(*argv,"aes") == 0)
958 doit[D_CBC_128_AES]=1;
959 doit[D_CBC_192_AES]=1;
960 doit[D_CBC_256_AES]=1;
964 #ifndef OPENSSL_NO_RSA
965 if (strcmp(*argv,"rsa") == 0)
967 rsa_doit[R_RSA_512]=1;
968 rsa_doit[R_RSA_1024]=1;
969 rsa_doit[R_RSA_2048]=1;
970 rsa_doit[R_RSA_4096]=1;
974 #ifndef OPENSSL_NO_DSA
975 if (strcmp(*argv,"dsa") == 0)
977 dsa_doit[R_DSA_512]=1;
978 dsa_doit[R_DSA_1024]=1;
982 #ifndef OPENSSL_NO_ECDSA
983 if (strcmp(*argv,"ecdsap160") == 0) ecdsa_doit[R_EC_P160]=2;
984 else if (strcmp(*argv,"ecdsap224") == 0) ecdsa_doit[R_EC_P224]=2;
985 else if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2;
986 else if (strcmp(*argv,"ecdsap384") == 0) ecdsa_doit[R_EC_P384]=2;
987 else if (strcmp(*argv,"ecdsap521") == 0) ecdsa_doit[R_EC_P521]=2;
988 else if (strcmp(*argv,"ecdsak163") == 0) ecdsa_doit[R_EC_K163]=2;
989 else if (strcmp(*argv,"ecdsak233") == 0) ecdsa_doit[R_EC_K233]=2;
990 else if (strcmp(*argv,"ecdsak283") == 0) ecdsa_doit[R_EC_K283]=2;
991 else if (strcmp(*argv,"ecdsak409") == 0) ecdsa_doit[R_EC_K409]=2;
992 else if (strcmp(*argv,"ecdsak571") == 0) ecdsa_doit[R_EC_K571]=2;
993 else if (strcmp(*argv,"ecdsab163") == 0) ecdsa_doit[R_EC_B163]=2;
994 else if (strcmp(*argv,"ecdsab233") == 0) ecdsa_doit[R_EC_B233]=2;
995 else if (strcmp(*argv,"ecdsab283") == 0) ecdsa_doit[R_EC_B283]=2;
996 else if (strcmp(*argv,"ecdsab409") == 0) ecdsa_doit[R_EC_B409]=2;
997 else if (strcmp(*argv,"ecdsab571") == 0) ecdsa_doit[R_EC_B571]=2;
998 else if (strcmp(*argv,"ecdsa") == 0)
1000 for (i=0; i < EC_NUM; i++)
1005 #ifndef OPENSSL_NO_ECDH
1006 if (strcmp(*argv,"ecdhp160") == 0) ecdh_doit[R_EC_P160]=2;
1007 else if (strcmp(*argv,"ecdhp224") == 0) ecdh_doit[R_EC_P224]=2;
1008 else if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2;
1009 else if (strcmp(*argv,"ecdhp384") == 0) ecdh_doit[R_EC_P384]=2;
1010 else if (strcmp(*argv,"ecdhp521") == 0) ecdh_doit[R_EC_P521]=2;
1011 else if (strcmp(*argv,"ecdhk163") == 0) ecdh_doit[R_EC_K163]=2;
1012 else if (strcmp(*argv,"ecdhk233") == 0) ecdh_doit[R_EC_K233]=2;
1013 else if (strcmp(*argv,"ecdhk283") == 0) ecdh_doit[R_EC_K283]=2;
1014 else if (strcmp(*argv,"ecdhk409") == 0) ecdh_doit[R_EC_K409]=2;
1015 else if (strcmp(*argv,"ecdhk571") == 0) ecdh_doit[R_EC_K571]=2;
1016 else if (strcmp(*argv,"ecdhb163") == 0) ecdh_doit[R_EC_B163]=2;
1017 else if (strcmp(*argv,"ecdhb233") == 0) ecdh_doit[R_EC_B233]=2;
1018 else if (strcmp(*argv,"ecdhb283") == 0) ecdh_doit[R_EC_B283]=2;
1019 else if (strcmp(*argv,"ecdhb409") == 0) ecdh_doit[R_EC_B409]=2;
1020 else if (strcmp(*argv,"ecdhb571") == 0) ecdh_doit[R_EC_B571]=2;
1021 else if (strcmp(*argv,"ecdh") == 0)
1023 for (i=0; i < EC_NUM; i++)
1029 BIO_printf(bio_err,"Error: bad option or value\n");
1030 BIO_printf(bio_err,"\n");
1031 BIO_printf(bio_err,"Available values:\n");
1032 #ifndef OPENSSL_NO_MD2
1033 BIO_printf(bio_err,"md2 ");
1035 #ifndef OPENSSL_NO_MDC2
1036 BIO_printf(bio_err,"mdc2 ");
1038 #ifndef OPENSSL_NO_MD4
1039 BIO_printf(bio_err,"md4 ");
1041 #ifndef OPENSSL_NO_MD5
1042 BIO_printf(bio_err,"md5 ");
1043 #ifndef OPENSSL_NO_HMAC
1044 BIO_printf(bio_err,"hmac ");
1047 #ifndef OPENSSL_NO_SHA1
1048 BIO_printf(bio_err,"sha1 ");
1050 #ifndef OPENSSL_NO_RIPEMD160
1051 BIO_printf(bio_err,"rmd160");
1053 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
1054 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
1055 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
1056 BIO_printf(bio_err,"\n");
1059 #ifndef OPENSSL_NO_IDEA
1060 BIO_printf(bio_err,"idea-cbc ");
1062 #ifndef OPENSSL_NO_RC2
1063 BIO_printf(bio_err,"rc2-cbc ");
1065 #ifndef OPENSSL_NO_RC5
1066 BIO_printf(bio_err,"rc5-cbc ");
1068 #ifndef OPENSSL_NO_BF
1069 BIO_printf(bio_err,"bf-cbc");
1071 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1072 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
1073 BIO_printf(bio_err,"\n");
1075 #ifndef OPENSSL_NO_DES
1076 BIO_printf(bio_err,"des-cbc des-ede3 ");
1078 #ifndef OPENSSL_NO_AES
1079 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
1081 #ifndef OPENSSL_NO_RC4
1082 BIO_printf(bio_err,"rc4");
1084 BIO_printf(bio_err,"\n");
1086 #ifndef OPENSSL_NO_RSA
1087 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
1090 #ifndef OPENSSL_NO_DSA
1091 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
1093 #ifndef OPENSSL_NO_ECDSA
1094 BIO_printf(bio_err,"ecdsap160 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
1095 BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n");
1096 BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n");
1097 BIO_printf(bio_err,"ecdsa\n");
1099 #ifndef OPENSSL_NO_ECDH
1100 BIO_printf(bio_err,"ecdhp160 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n");
1101 BIO_printf(bio_err,"ecdhk163 ecdhk233 ecdhk283 ecdhk409 ecdhk571\n");
1102 BIO_printf(bio_err,"ecdhb163 ecdhb233 ecdhb283 ecdhb409 ecdhb571\n");
1103 BIO_printf(bio_err,"ecdh\n");
1106 #ifndef OPENSSL_NO_IDEA
1107 BIO_printf(bio_err,"idea ");
1109 #ifndef OPENSSL_NO_RC2
1110 BIO_printf(bio_err,"rc2 ");
1112 #ifndef OPENSSL_NO_DES
1113 BIO_printf(bio_err,"des ");
1115 #ifndef OPENSSL_NO_AES
1116 BIO_printf(bio_err,"aes ");
1118 #ifndef OPENSSL_NO_RSA
1119 BIO_printf(bio_err,"rsa ");
1121 #ifndef OPENSSL_NO_BF
1122 BIO_printf(bio_err,"blowfish");
1124 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1125 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
1126 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
1127 BIO_printf(bio_err,"\n");
1130 BIO_printf(bio_err,"\n");
1131 BIO_printf(bio_err,"Available options:\n");
1132 #if defined(TIMES) || defined(USE_TOD)
1133 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
1135 #ifndef OPENSSL_NO_ENGINE
1136 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
1138 BIO_printf(bio_err,"-evp e use EVP e.\n");
1139 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
1140 BIO_printf(bio_err,"-mr produce machine readable output.\n");
1142 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
1152 if(multi && do_multi(multi))
1158 for (i=0; i<ALGOR_NUM; i++)
1163 for (i=0; i<RSA_NUM; i++)
1165 for (i=0; i<DSA_NUM; i++)
1168 for (i=0; i<ALGOR_NUM; i++)
1169 if (doit[i]) pr_header++;
1171 if (usertime == 0 && !mr)
1172 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
1173 if (usertime <= 0 && !mr)
1175 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
1176 BIO_printf(bio_err,"program when this computer is idle.\n");
1179 #ifndef OPENSSL_NO_RSA
1180 for (i=0; i<RSA_NUM; i++)
1182 const unsigned char *p;
1185 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
1186 if (rsa_key[i] == NULL)
1188 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
1194 BIO_printf(bio_err,mr ? "+RK:%d:"
1195 : "Loaded RSA key, %d bit modulus and e= 0x",
1196 BN_num_bits(rsa_key[i]->n));
1197 BN_print(bio_err,rsa_key[i]->e);
1198 BIO_printf(bio_err,"\n");
1204 #ifndef OPENSSL_NO_DSA
1205 dsa_key[0]=get_dsa512();
1206 dsa_key[1]=get_dsa1024();
1207 dsa_key[2]=get_dsa2048();
1210 #ifndef OPENSSL_NO_DES
1211 DES_set_key_unchecked(&key,&sch);
1212 DES_set_key_unchecked(&key2,&sch2);
1213 DES_set_key_unchecked(&key3,&sch3);
1215 #ifndef OPENSSL_NO_AES
1216 AES_set_encrypt_key(key16,128,&aes_ks1);
1217 AES_set_encrypt_key(key24,192,&aes_ks2);
1218 AES_set_encrypt_key(key32,256,&aes_ks3);
1220 #ifndef OPENSSL_NO_IDEA
1221 idea_set_encrypt_key(key16,&idea_ks);
1223 #ifndef OPENSSL_NO_RC4
1224 RC4_set_key(&rc4_ks,16,key16);
1226 #ifndef OPENSSL_NO_RC2
1227 RC2_set_key(&rc2_ks,16,key16,128);
1229 #ifndef OPENSSL_NO_RC5
1230 RC5_32_set_key(&rc5_ks,16,key16,12);
1232 #ifndef OPENSSL_NO_BF
1233 BF_set_key(&bf_ks,16,key16);
1235 #ifndef OPENSSL_NO_CAST
1236 CAST_set_key(&cast_ks,16,key16);
1238 #ifndef OPENSSL_NO_RSA
1239 memset(rsa_c,0,sizeof(rsa_c));
1242 #ifndef OPENSSL_NO_DES
1243 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
1249 for (i=count; i; i--)
1250 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
1255 c[D_MD2][0]=count/10;
1256 c[D_MDC2][0]=count/10;
1261 c[D_RMD160][0]=count;
1262 c[D_RC4][0]=count*5;
1263 c[D_CBC_DES][0]=count;
1264 c[D_EDE3_DES][0]=count/3;
1265 c[D_CBC_IDEA][0]=count;
1266 c[D_CBC_RC2][0]=count;
1267 c[D_CBC_RC5][0]=count;
1268 c[D_CBC_BF][0]=count;
1269 c[D_CBC_CAST][0]=count;
1270 c[D_CBC_128_AES][0]=count;
1271 c[D_CBC_192_AES][0]=count;
1272 c[D_CBC_256_AES][0]=count;
1274 for (i=1; i<SIZE_NUM; i++)
1276 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1277 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1278 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1279 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1280 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1281 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1282 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1284 for (i=1; i<SIZE_NUM; i++)
1288 l0=(long)lengths[i-1];
1289 l1=(long)lengths[i];
1290 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1291 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1292 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1293 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1294 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1295 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1296 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1297 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1298 c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
1299 c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
1300 c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
1302 #ifndef OPENSSL_NO_RSA
1303 rsa_c[R_RSA_512][0]=count/2000;
1304 rsa_c[R_RSA_512][1]=count/400;
1305 for (i=1; i<RSA_NUM; i++)
1307 rsa_c[i][0]=rsa_c[i-1][0]/8;
1308 rsa_c[i][1]=rsa_c[i-1][1]/4;
1309 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1313 if (rsa_c[i][0] == 0)
1322 #ifndef OPENSSL_NO_DSA
1323 dsa_c[R_DSA_512][0]=count/1000;
1324 dsa_c[R_DSA_512][1]=count/1000/2;
1325 for (i=1; i<DSA_NUM; i++)
1327 dsa_c[i][0]=dsa_c[i-1][0]/4;
1328 dsa_c[i][1]=dsa_c[i-1][1]/4;
1329 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1342 #ifndef OPENSSL_NO_ECDSA
1343 ecdsa_c[R_EC_P160][0]=count/1000;
1344 ecdsa_c[R_EC_P160][1]=count/1000/2;
1345 for (i=R_EC_P224; i<=R_EC_P521; i++)
1347 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1348 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1349 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1353 if (ecdsa_c[i] == 0)
1360 ecdsa_c[R_EC_K163][0]=count/1000;
1361 ecdsa_c[R_EC_K163][1]=count/1000/2;
1362 for (i=R_EC_K233; i<=R_EC_K571; i++)
1364 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1365 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1366 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1370 if (ecdsa_c[i] == 0)
1377 ecdsa_c[R_EC_B163][0]=count/1000;
1378 ecdsa_c[R_EC_B163][1]=count/1000/2;
1379 for (i=R_EC_B233; i<=R_EC_B571; i++)
1381 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1382 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1383 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1387 if (ecdsa_c[i] == 0)
1396 #ifndef OPENSSL_NO_ECDH
1397 ecdh_c[R_EC_P160][0]=count/1000;
1398 ecdh_c[R_EC_P160][1]=count/1000;
1399 for (i=R_EC_P224; i<=R_EC_P521; i++)
1401 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1402 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1403 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1414 ecdh_c[R_EC_K163][0]=count/1000;
1415 ecdh_c[R_EC_K163][1]=count/1000;
1416 for (i=R_EC_K233; i<=R_EC_K571; i++)
1418 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1419 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1420 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1431 ecdh_c[R_EC_B163][0]=count/1000;
1432 ecdh_c[R_EC_B163][1]=count/1000;
1433 for (i=R_EC_B233; i<=R_EC_B571; i++)
1435 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1436 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1437 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1450 #define COND(d) (count < (d))
1451 #define COUNT(d) (d)
1453 /* not worth fixing */
1454 # error "You cannot disable DES on systems without SIGALRM."
1455 #endif /* OPENSSL_NO_DES */
1457 #define COND(c) (run)
1458 #define COUNT(d) (count)
1459 signal(SIGALRM,sig_done);
1460 #endif /* SIGALRM */
1462 #ifndef OPENSSL_NO_MD2
1465 for (j=0; j<SIZE_NUM; j++)
1467 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1469 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1470 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1472 print_result(D_MD2,j,count,d);
1476 #ifndef OPENSSL_NO_MDC2
1479 for (j=0; j<SIZE_NUM; j++)
1481 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1483 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1484 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1486 print_result(D_MDC2,j,count,d);
1491 #ifndef OPENSSL_NO_MD4
1494 for (j=0; j<SIZE_NUM; j++)
1496 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1498 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1499 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1501 print_result(D_MD4,j,count,d);
1506 #ifndef OPENSSL_NO_MD5
1509 for (j=0; j<SIZE_NUM; j++)
1511 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1513 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1514 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1516 print_result(D_MD5,j,count,d);
1521 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1526 HMAC_CTX_init(&hctx);
1527 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1528 16,EVP_md5(), NULL);
1530 for (j=0; j<SIZE_NUM; j++)
1532 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1534 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1536 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1537 HMAC_Update(&hctx,buf,lengths[j]);
1538 HMAC_Final(&hctx,&(hmac[0]),NULL);
1541 print_result(D_HMAC,j,count,d);
1543 HMAC_CTX_cleanup(&hctx);
1546 #ifndef OPENSSL_NO_SHA
1549 for (j=0; j<SIZE_NUM; j++)
1551 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1553 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1554 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1556 print_result(D_SHA1,j,count,d);
1560 #ifndef OPENSSL_NO_RIPEMD
1563 for (j=0; j<SIZE_NUM; j++)
1565 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1567 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1568 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1570 print_result(D_RMD160,j,count,d);
1574 #ifndef OPENSSL_NO_RC4
1577 for (j=0; j<SIZE_NUM; j++)
1579 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1581 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1582 RC4(&rc4_ks,(unsigned int)lengths[j],
1585 print_result(D_RC4,j,count,d);
1589 #ifndef OPENSSL_NO_DES
1590 if (doit[D_CBC_DES])
1592 for (j=0; j<SIZE_NUM; j++)
1594 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1596 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1597 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1598 &DES_iv,DES_ENCRYPT);
1600 print_result(D_CBC_DES,j,count,d);
1604 if (doit[D_EDE3_DES])
1606 for (j=0; j<SIZE_NUM; j++)
1608 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1610 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1611 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1613 &DES_iv,DES_ENCRYPT);
1615 print_result(D_EDE3_DES,j,count,d);
1619 #ifndef OPENSSL_NO_AES
1620 if (doit[D_CBC_128_AES])
1622 for (j=0; j<SIZE_NUM; j++)
1624 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1626 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1627 AES_cbc_encrypt(buf,buf,
1628 (unsigned long)lengths[j],&aes_ks1,
1631 print_result(D_CBC_128_AES,j,count,d);
1634 if (doit[D_CBC_192_AES])
1636 for (j=0; j<SIZE_NUM; j++)
1638 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1640 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1641 AES_cbc_encrypt(buf,buf,
1642 (unsigned long)lengths[j],&aes_ks2,
1645 print_result(D_CBC_192_AES,j,count,d);
1648 if (doit[D_CBC_256_AES])
1650 for (j=0; j<SIZE_NUM; j++)
1652 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1654 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1655 AES_cbc_encrypt(buf,buf,
1656 (unsigned long)lengths[j],&aes_ks3,
1659 print_result(D_CBC_256_AES,j,count,d);
1664 #ifndef OPENSSL_NO_IDEA
1665 if (doit[D_CBC_IDEA])
1667 for (j=0; j<SIZE_NUM; j++)
1669 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1671 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1672 idea_cbc_encrypt(buf,buf,
1673 (unsigned long)lengths[j],&idea_ks,
1676 print_result(D_CBC_IDEA,j,count,d);
1680 #ifndef OPENSSL_NO_RC2
1681 if (doit[D_CBC_RC2])
1683 for (j=0; j<SIZE_NUM; j++)
1685 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1687 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1688 RC2_cbc_encrypt(buf,buf,
1689 (unsigned long)lengths[j],&rc2_ks,
1692 print_result(D_CBC_RC2,j,count,d);
1696 #ifndef OPENSSL_NO_RC5
1697 if (doit[D_CBC_RC5])
1699 for (j=0; j<SIZE_NUM; j++)
1701 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1703 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1704 RC5_32_cbc_encrypt(buf,buf,
1705 (unsigned long)lengths[j],&rc5_ks,
1708 print_result(D_CBC_RC5,j,count,d);
1712 #ifndef OPENSSL_NO_BF
1715 for (j=0; j<SIZE_NUM; j++)
1717 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1719 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1720 BF_cbc_encrypt(buf,buf,
1721 (unsigned long)lengths[j],&bf_ks,
1724 print_result(D_CBC_BF,j,count,d);
1728 #ifndef OPENSSL_NO_CAST
1729 if (doit[D_CBC_CAST])
1731 for (j=0; j<SIZE_NUM; j++)
1733 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1735 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1736 CAST_cbc_encrypt(buf,buf,
1737 (unsigned long)lengths[j],&cast_ks,
1740 print_result(D_CBC_CAST,j,count,d);
1747 for (j=0; j<SIZE_NUM; j++)
1754 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1755 /* -O3 -fschedule-insns messes up an
1756 * optimization here! names[D_EVP]
1757 * somehow becomes NULL */
1758 print_message(names[D_EVP],save_count,
1761 EVP_CIPHER_CTX_init(&ctx);
1763 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1765 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1769 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1770 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1772 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1773 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1775 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1777 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1779 EVP_CIPHER_CTX_cleanup(&ctx);
1783 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1784 print_message(names[D_EVP],save_count,
1788 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1789 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1793 print_result(D_EVP,j,count,d);
1797 RAND_pseudo_bytes(buf,36);
1798 #ifndef OPENSSL_NO_RSA
1799 for (j=0; j<RSA_NUM; j++)
1802 if (!rsa_doit[j]) continue;
1803 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1806 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1807 ERR_print_errors(bio_err);
1812 pkey_print_message("private","rsa",
1813 rsa_c[j][0],rsa_bits[j],
1815 /* RSA_blinding_on(rsa_key[j],NULL); */
1817 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1819 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1820 &rsa_num, rsa_key[j]);
1824 "RSA sign failure\n");
1825 ERR_print_errors(bio_err);
1831 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1832 : "%ld %d bit private RSA's in %.2fs\n",
1833 count,rsa_bits[j],d);
1834 rsa_results[j][0]=d/(double)count;
1839 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1842 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1843 ERR_print_errors(bio_err);
1848 pkey_print_message("public","rsa",
1849 rsa_c[j][1],rsa_bits[j],
1852 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1854 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1855 rsa_num, rsa_key[j]);
1859 "RSA verify failure\n");
1860 ERR_print_errors(bio_err);
1866 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1867 : "%ld %d bit public RSA's in %.2fs\n",
1868 count,rsa_bits[j],d);
1869 rsa_results[j][1]=d/(double)count;
1875 /* if longer than 10s, don't do any more */
1876 for (j++; j<RSA_NUM; j++)
1882 RAND_pseudo_bytes(buf,20);
1883 #ifndef OPENSSL_NO_DSA
1884 if (RAND_status() != 1)
1886 RAND_seed(rnd_seed, sizeof rnd_seed);
1889 for (j=0; j<DSA_NUM; j++)
1894 if (!dsa_doit[j]) continue;
1895 /* DSA_generate_key(dsa_key[j]); */
1896 /* DSA_sign_setup(dsa_key[j],NULL); */
1897 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1901 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1902 ERR_print_errors(bio_err);
1907 pkey_print_message("sign","dsa",
1908 dsa_c[j][0],dsa_bits[j],
1911 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1913 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1918 "DSA sign failure\n");
1919 ERR_print_errors(bio_err);
1925 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1926 : "%ld %d bit DSA signs in %.2fs\n",
1927 count,dsa_bits[j],d);
1928 dsa_results[j][0]=d/(double)count;
1932 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1936 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1937 ERR_print_errors(bio_err);
1942 pkey_print_message("verify","dsa",
1943 dsa_c[j][1],dsa_bits[j],
1946 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1948 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1953 "DSA verify failure\n");
1954 ERR_print_errors(bio_err);
1960 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1961 : "%ld %d bit DSA verify in %.2fs\n",
1962 count,dsa_bits[j],d);
1963 dsa_results[j][1]=d/(double)count;
1968 /* if longer than 10s, don't do any more */
1969 for (j++; j<DSA_NUM; j++)
1973 if (rnd_fake) RAND_cleanup();
1976 #ifndef OPENSSL_NO_ECDSA
1977 if (RAND_status() != 1)
1979 RAND_seed(rnd_seed, sizeof rnd_seed);
1982 for (j=0; j<EC_NUM; j++)
1986 if (!ecdsa_doit[j]) continue; /* Ignore Curve */
1987 ecdsa[j] = EC_KEY_new();
1988 if (ecdsa[j] == NULL)
1990 BIO_printf(bio_err,"ECDSA failure.\n");
1991 ERR_print_errors(bio_err);
1996 ecdsa[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
1997 /* Could not obtain group information */
1998 if (ecdsa[j]->group == NULL)
2000 BIO_printf(bio_err,"ECDSA failure.Could not obtain group information\n");
2001 ERR_print_errors(bio_err);
2007 EC_GROUP_precompute_mult(ecdsa[j]->group, NULL);
2009 /* Perform ECDSA signature test */
2010 EC_KEY_generate_key(ecdsa[j]);
2011 ret = ECDSA_sign(0, buf, 20, ecdsasig,
2012 &ecdsasiglen, ecdsa[j]);
2015 BIO_printf(bio_err,"ECDSA sign failure. No ECDSA sign will be done.\n");
2016 ERR_print_errors(bio_err);
2021 pkey_print_message("sign","ecdsa",
2023 test_curves_bits[j],
2027 for (count=0,run=1; COND(ecdsa_c[j][0]);
2030 ret=ECDSA_sign(0, buf, 20,
2031 ecdsasig, &ecdsasiglen,
2035 BIO_printf(bio_err, "ECDSA sign failure\n");
2036 ERR_print_errors(bio_err);
2043 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
2044 "%ld %d bit ECDSA signs in %.2fs \n",
2045 count, test_curves_bits[j], d);
2046 ecdsa_results[j][0]=d/(double)count;
2050 /* Perform ECDSA verification test */
2051 ret=ECDSA_verify(0, buf, 20, ecdsasig,
2052 ecdsasiglen, ecdsa[j]);
2055 BIO_printf(bio_err,"ECDSA verify failure. No ECDSA verify will be done.\n");
2056 ERR_print_errors(bio_err);
2061 pkey_print_message("verify","ecdsa",
2063 test_curves_bits[j],
2066 for (count=0,run=1; COND(ecdsa_c[j][1]); count++)
2068 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
2071 BIO_printf(bio_err, "ECDSA verify failure\n");
2072 ERR_print_errors(bio_err);
2078 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
2079 : "%ld %d bit ECDSA verify in %.2fs\n",
2080 count, test_curves_bits[j], d);
2081 ecdsa_results[j][1]=d/(double)count;
2086 /* if longer than 10s, don't do any more */
2087 for (j++; j<EC_NUM; j++)
2093 if (rnd_fake) RAND_cleanup();
2096 #ifndef OPENSSL_NO_ECDH
2097 if (RAND_status() != 1)
2099 RAND_seed(rnd_seed, sizeof rnd_seed);
2102 for (j=0; j<EC_NUM; j++)
2104 if (!ecdh_doit[j]) continue;
2105 ecdh_a[j] = EC_KEY_new();
2106 ecdh_b[j] = EC_KEY_new();
2107 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2109 BIO_printf(bio_err,"ECDH failure.\n");
2110 ERR_print_errors(bio_err);
2115 ecdh_a[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
2116 if (ecdh_a[j]->group == NULL)
2118 BIO_printf(bio_err,"ECDH failure.\n");
2119 ERR_print_errors(bio_err);
2124 ecdh_b[j]->group = EC_GROUP_dup(ecdh_a[j]->group);
2126 /* generate two ECDH key pairs */
2127 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2128 !EC_KEY_generate_key(ecdh_b[j]))
2130 BIO_printf(bio_err,"ECDH key generation failure.\n");
2131 ERR_print_errors(bio_err);
2136 /* If field size is not more than 24 octets, then use SHA-1 hash of result;
2137 * otherwise, use result (see section 4.8 of draft-ietf-tls-ecc-03.txt).
2139 int field_size, outlen;
2140 void *(*kdf)(void *in, size_t inlen, void *out, size_t xoutlen);
2141 field_size = EC_GROUP_get_degree(ecdh_a[j]->group);
2142 if (field_size <= 24 * 8)
2144 outlen = KDF1_SHA1_len;
2149 outlen = (field_size+7)/8;
2152 secret_size_a = ECDH_compute_key(secret_a, outlen,
2155 secret_size_b = ECDH_compute_key(secret_b, outlen,
2158 if (secret_size_a != secret_size_b)
2163 for (secret_idx = 0;
2164 (secret_idx < secret_size_a)
2165 && (ecdh_checks == 1);
2168 if (secret_a[secret_idx] != secret_b[secret_idx])
2172 if (ecdh_checks == 0)
2174 BIO_printf(bio_err,"ECDH computations don't match.\n");
2175 ERR_print_errors(bio_err);
2179 pkey_print_message("","ecdh",
2181 test_curves_bits[j],
2184 for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2186 ECDH_compute_key(secret_a, outlen,
2191 BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2192 count, test_curves_bits[j], d);
2193 ecdh_results[j][0]=d/(double)count;
2201 /* if longer than 10s, don't do any more */
2202 for (j++; j<EC_NUM; j++)
2206 if (rnd_fake) RAND_cleanup();
2213 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
2214 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
2216 printf("%s ",BN_options());
2217 #ifndef OPENSSL_NO_MD2
2218 printf("%s ",MD2_options());
2220 #ifndef OPENSSL_NO_RC4
2221 printf("%s ",RC4_options());
2223 #ifndef OPENSSL_NO_DES
2224 printf("%s ",DES_options());
2226 #ifndef OPENSSL_NO_AES
2227 printf("%s ",AES_options());
2229 #ifndef OPENSSL_NO_IDEA
2230 printf("%s ",idea_options());
2232 #ifndef OPENSSL_NO_BF
2233 printf("%s ",BF_options());
2235 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2236 printf("available timing options: ");
2247 #define as_string(s) (#s)
2250 printf("HZ=%g", dbl);
2253 printf(" [sysconf value]");
2257 printf("timing function used: %s%s%s%s%s%s%s\n",
2258 (ftime_used ? "ftime" : ""),
2259 (ftime_used + times_used > 1 ? "," : ""),
2260 (times_used ? "times" : ""),
2261 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
2262 (gettimeofday_used ? "gettimeofday" : ""),
2263 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
2264 (getrusage_used ? "getrusage" : ""));
2270 fprintf(stdout,"+H");
2273 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
2274 fprintf(stdout,"type ");
2276 for (j=0; j<SIZE_NUM; j++)
2277 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
2278 fprintf(stdout,"\n");
2281 for (k=0; k<ALGOR_NUM; k++)
2283 if (!doit[k]) continue;
2285 fprintf(stdout,"+F:%d:%s",k,names[k]);
2287 fprintf(stdout,"%-13s",names[k]);
2288 for (j=0; j<SIZE_NUM; j++)
2290 if (results[k][j] > 10000 && !mr)
2291 fprintf(stdout," %11.2fk",results[k][j]/1e3);
2293 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
2295 fprintf(stdout,"\n");
2297 #ifndef OPENSSL_NO_RSA
2299 for (k=0; k<RSA_NUM; k++)
2301 if (!rsa_doit[k]) continue;
2304 printf("%18ssign verify sign/s verify/s\n"," ");
2308 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2309 k,rsa_bits[k],rsa_results[k][0],
2312 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2313 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2314 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
2317 #ifndef OPENSSL_NO_DSA
2319 for (k=0; k<DSA_NUM; k++)
2321 if (!dsa_doit[k]) continue;
2324 printf("%18ssign verify sign/s verify/s\n"," ");
2328 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2329 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2331 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2332 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2333 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
2336 #ifndef OPENSSL_NO_ECDSA
2338 for (k=0; k<EC_NUM; k++)
2340 if (!ecdsa_doit[k]) continue;
2343 printf("%30ssign verify sign/s verify/s\n"," ");
2348 fprintf(stdout,"+F4:%u:%u:%f:%f\n",
2349 k, test_curves_bits[k],
2350 ecdsa_results[k][0],ecdsa_results[k][1]);
2353 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2354 test_curves_bits[k],
2355 test_curves_names[k],
2356 ecdsa_results[k][0],ecdsa_results[k][1],
2357 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2362 #ifndef OPENSSL_NO_ECDH
2364 for (k=0; k<EC_NUM; k++)
2366 if (!ecdh_doit[k]) continue;
2369 printf("%30sop op/s\n"," ");
2373 fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2374 k, test_curves_bits[k],
2375 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2378 fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2379 test_curves_bits[k],
2380 test_curves_names[k],
2381 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2388 ERR_print_errors(bio_err);
2389 if (buf != NULL) OPENSSL_free(buf);
2390 if (buf2 != NULL) OPENSSL_free(buf2);
2391 #ifndef OPENSSL_NO_RSA
2392 for (i=0; i<RSA_NUM; i++)
2393 if (rsa_key[i] != NULL)
2394 RSA_free(rsa_key[i]);
2396 #ifndef OPENSSL_NO_DSA
2397 for (i=0; i<DSA_NUM; i++)
2398 if (dsa_key[i] != NULL)
2399 DSA_free(dsa_key[i]);
2402 #ifndef OPENSSL_NO_ECDSA
2403 for (i=0; i<EC_NUM; i++)
2404 if (ecdsa[i] != NULL)
2405 EC_KEY_free(ecdsa[i]);
2407 #ifndef OPENSSL_NO_ECDH
2408 for (i=0; i<EC_NUM; i++)
2410 if (ecdh_a[i] != NULL)
2411 EC_KEY_free(ecdh_a[i]);
2412 if (ecdh_b[i] != NULL)
2413 EC_KEY_free(ecdh_b[i]);
2421 static void print_message(const char *s, long num, int length)
2424 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2425 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
2426 (void)BIO_flush(bio_err);
2429 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2430 : "Doing %s %ld times on %d size blocks: ",s,num,length);
2431 (void)BIO_flush(bio_err);
2438 static void pkey_print_message(char *str, char *str2, long num, int bits,
2442 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2443 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
2444 (void)BIO_flush(bio_err);
2447 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2448 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
2449 (void)BIO_flush(bio_err);
2456 static void print_result(int alg,int run_no,int count,double time_used)
2458 BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n"
2459 : "%d %s's in %.2fs\n",count,names[alg],time_used);
2460 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2463 static char *sstrsep(char **string, const char *delim)
2466 char *token = *string;
2471 memset(isdelim, 0, sizeof isdelim);
2476 isdelim[(unsigned char)(*delim)] = 1;
2480 while (!isdelim[(unsigned char)(**string)])
2495 static int do_multi(int multi)
2500 static char sep[]=":";
2502 fds=malloc(multi*sizeof *fds);
2503 for(n=0 ; n < multi ; ++n)
2521 printf("Forked child %d\n",n);
2524 /* for now, assume the pipe is long enough to take all the output */
2525 for(n=0 ; n < multi ; ++n)
2531 f=fdopen(fds[n],"r");
2532 while(fgets(buf,sizeof buf,f))
2539 fprintf(stderr,"Don't understand line '%s' from child %d\n",
2543 printf("Got: %s from %d\n",buf,n);
2544 if(!strncmp(buf,"+F:",3))
2550 alg=atoi(sstrsep(&p,sep));
2552 for(j=0 ; j < SIZE_NUM ; ++j)
2553 results[alg][j]+=atof(sstrsep(&p,sep));
2555 else if(!strncmp(buf,"+F2:",4))
2561 k=atoi(sstrsep(&p,sep));
2564 d=atof(sstrsep(&p,sep));
2566 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2568 rsa_results[k][0]=d;
2570 d=atof(sstrsep(&p,sep));
2572 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2574 rsa_results[k][1]=d;
2576 else if(!strncmp(buf,"+F2:",4))
2582 k=atoi(sstrsep(&p,sep));
2585 d=atof(sstrsep(&p,sep));
2587 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2589 rsa_results[k][0]=d;
2591 d=atof(sstrsep(&p,sep));
2593 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2595 rsa_results[k][1]=d;
2597 else if(!strncmp(buf,"+F3:",4))
2603 k=atoi(sstrsep(&p,sep));
2606 d=atof(sstrsep(&p,sep));
2608 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2610 dsa_results[k][0]=d;
2612 d=atof(sstrsep(&p,sep));
2614 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2616 dsa_results[k][1]=d;
2618 #ifndef OPENSSL_NO_ECDSA
2619 else if(!strncmp(buf,"+F4:",4))
2625 k=atoi(sstrsep(&p,sep));
2628 d=atof(sstrsep(&p,sep));
2630 ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2632 ecdsa_results[k][0]=d;
2634 d=atof(sstrsep(&p,sep));
2636 ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2638 ecdsa_results[k][1]=d;
2642 #ifndef OPENSSL_NO_ECDH
2643 else if(!strncmp(buf,"+F5:",4))
2649 k=atoi(sstrsep(&p,sep));
2652 d=atof(sstrsep(&p,sep));
2654 ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2656 ecdh_results[k][0]=d;
2661 else if(!strncmp(buf,"+H:",3))
2665 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);