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;
979 dsa_doit[R_DSA_2048]=1;
983 #ifndef OPENSSL_NO_ECDSA
984 if (strcmp(*argv,"ecdsap160") == 0) ecdsa_doit[R_EC_P160]=2;
985 else if (strcmp(*argv,"ecdsap224") == 0) ecdsa_doit[R_EC_P224]=2;
986 else if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2;
987 else if (strcmp(*argv,"ecdsap384") == 0) ecdsa_doit[R_EC_P384]=2;
988 else if (strcmp(*argv,"ecdsap521") == 0) ecdsa_doit[R_EC_P521]=2;
989 else if (strcmp(*argv,"ecdsak163") == 0) ecdsa_doit[R_EC_K163]=2;
990 else if (strcmp(*argv,"ecdsak233") == 0) ecdsa_doit[R_EC_K233]=2;
991 else if (strcmp(*argv,"ecdsak283") == 0) ecdsa_doit[R_EC_K283]=2;
992 else if (strcmp(*argv,"ecdsak409") == 0) ecdsa_doit[R_EC_K409]=2;
993 else if (strcmp(*argv,"ecdsak571") == 0) ecdsa_doit[R_EC_K571]=2;
994 else if (strcmp(*argv,"ecdsab163") == 0) ecdsa_doit[R_EC_B163]=2;
995 else if (strcmp(*argv,"ecdsab233") == 0) ecdsa_doit[R_EC_B233]=2;
996 else if (strcmp(*argv,"ecdsab283") == 0) ecdsa_doit[R_EC_B283]=2;
997 else if (strcmp(*argv,"ecdsab409") == 0) ecdsa_doit[R_EC_B409]=2;
998 else if (strcmp(*argv,"ecdsab571") == 0) ecdsa_doit[R_EC_B571]=2;
999 else if (strcmp(*argv,"ecdsa") == 0)
1001 for (i=0; i < EC_NUM; i++)
1006 #ifndef OPENSSL_NO_ECDH
1007 if (strcmp(*argv,"ecdhp160") == 0) ecdh_doit[R_EC_P160]=2;
1008 else if (strcmp(*argv,"ecdhp224") == 0) ecdh_doit[R_EC_P224]=2;
1009 else if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2;
1010 else if (strcmp(*argv,"ecdhp384") == 0) ecdh_doit[R_EC_P384]=2;
1011 else if (strcmp(*argv,"ecdhp521") == 0) ecdh_doit[R_EC_P521]=2;
1012 else if (strcmp(*argv,"ecdhk163") == 0) ecdh_doit[R_EC_K163]=2;
1013 else if (strcmp(*argv,"ecdhk233") == 0) ecdh_doit[R_EC_K233]=2;
1014 else if (strcmp(*argv,"ecdhk283") == 0) ecdh_doit[R_EC_K283]=2;
1015 else if (strcmp(*argv,"ecdhk409") == 0) ecdh_doit[R_EC_K409]=2;
1016 else if (strcmp(*argv,"ecdhk571") == 0) ecdh_doit[R_EC_K571]=2;
1017 else if (strcmp(*argv,"ecdhb163") == 0) ecdh_doit[R_EC_B163]=2;
1018 else if (strcmp(*argv,"ecdhb233") == 0) ecdh_doit[R_EC_B233]=2;
1019 else if (strcmp(*argv,"ecdhb283") == 0) ecdh_doit[R_EC_B283]=2;
1020 else if (strcmp(*argv,"ecdhb409") == 0) ecdh_doit[R_EC_B409]=2;
1021 else if (strcmp(*argv,"ecdhb571") == 0) ecdh_doit[R_EC_B571]=2;
1022 else if (strcmp(*argv,"ecdh") == 0)
1024 for (i=0; i < EC_NUM; i++)
1030 BIO_printf(bio_err,"Error: bad option or value\n");
1031 BIO_printf(bio_err,"\n");
1032 BIO_printf(bio_err,"Available values:\n");
1033 #ifndef OPENSSL_NO_MD2
1034 BIO_printf(bio_err,"md2 ");
1036 #ifndef OPENSSL_NO_MDC2
1037 BIO_printf(bio_err,"mdc2 ");
1039 #ifndef OPENSSL_NO_MD4
1040 BIO_printf(bio_err,"md4 ");
1042 #ifndef OPENSSL_NO_MD5
1043 BIO_printf(bio_err,"md5 ");
1044 #ifndef OPENSSL_NO_HMAC
1045 BIO_printf(bio_err,"hmac ");
1048 #ifndef OPENSSL_NO_SHA1
1049 BIO_printf(bio_err,"sha1 ");
1051 #ifndef OPENSSL_NO_RIPEMD160
1052 BIO_printf(bio_err,"rmd160");
1054 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
1055 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
1056 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
1057 BIO_printf(bio_err,"\n");
1060 #ifndef OPENSSL_NO_IDEA
1061 BIO_printf(bio_err,"idea-cbc ");
1063 #ifndef OPENSSL_NO_RC2
1064 BIO_printf(bio_err,"rc2-cbc ");
1066 #ifndef OPENSSL_NO_RC5
1067 BIO_printf(bio_err,"rc5-cbc ");
1069 #ifndef OPENSSL_NO_BF
1070 BIO_printf(bio_err,"bf-cbc");
1072 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1073 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
1074 BIO_printf(bio_err,"\n");
1076 #ifndef OPENSSL_NO_DES
1077 BIO_printf(bio_err,"des-cbc des-ede3 ");
1079 #ifndef OPENSSL_NO_AES
1080 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
1082 #ifndef OPENSSL_NO_RC4
1083 BIO_printf(bio_err,"rc4");
1085 BIO_printf(bio_err,"\n");
1087 #ifndef OPENSSL_NO_RSA
1088 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
1091 #ifndef OPENSSL_NO_DSA
1092 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
1094 #ifndef OPENSSL_NO_ECDSA
1095 BIO_printf(bio_err,"ecdsap160 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
1096 BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n");
1097 BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n");
1098 BIO_printf(bio_err,"ecdsa\n");
1100 #ifndef OPENSSL_NO_ECDH
1101 BIO_printf(bio_err,"ecdhp160 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n");
1102 BIO_printf(bio_err,"ecdhk163 ecdhk233 ecdhk283 ecdhk409 ecdhk571\n");
1103 BIO_printf(bio_err,"ecdhb163 ecdhb233 ecdhb283 ecdhb409 ecdhb571\n");
1104 BIO_printf(bio_err,"ecdh\n");
1107 #ifndef OPENSSL_NO_IDEA
1108 BIO_printf(bio_err,"idea ");
1110 #ifndef OPENSSL_NO_RC2
1111 BIO_printf(bio_err,"rc2 ");
1113 #ifndef OPENSSL_NO_DES
1114 BIO_printf(bio_err,"des ");
1116 #ifndef OPENSSL_NO_AES
1117 BIO_printf(bio_err,"aes ");
1119 #ifndef OPENSSL_NO_RSA
1120 BIO_printf(bio_err,"rsa ");
1122 #ifndef OPENSSL_NO_BF
1123 BIO_printf(bio_err,"blowfish");
1125 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1126 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
1127 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
1128 BIO_printf(bio_err,"\n");
1131 BIO_printf(bio_err,"\n");
1132 BIO_printf(bio_err,"Available options:\n");
1133 #if defined(TIMES) || defined(USE_TOD)
1134 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
1136 #ifndef OPENSSL_NO_ENGINE
1137 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
1139 BIO_printf(bio_err,"-evp e use EVP e.\n");
1140 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
1141 BIO_printf(bio_err,"-mr produce machine readable output.\n");
1143 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
1153 if(multi && do_multi(multi))
1159 for (i=0; i<ALGOR_NUM; i++)
1164 for (i=0; i<RSA_NUM; i++)
1166 for (i=0; i<DSA_NUM; i++)
1169 for (i=0; i<ALGOR_NUM; i++)
1170 if (doit[i]) pr_header++;
1172 if (usertime == 0 && !mr)
1173 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
1174 if (usertime <= 0 && !mr)
1176 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
1177 BIO_printf(bio_err,"program when this computer is idle.\n");
1180 #ifndef OPENSSL_NO_RSA
1181 for (i=0; i<RSA_NUM; i++)
1183 const unsigned char *p;
1186 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
1187 if (rsa_key[i] == NULL)
1189 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
1195 BIO_printf(bio_err,mr ? "+RK:%d:"
1196 : "Loaded RSA key, %d bit modulus and e= 0x",
1197 BN_num_bits(rsa_key[i]->n));
1198 BN_print(bio_err,rsa_key[i]->e);
1199 BIO_printf(bio_err,"\n");
1205 #ifndef OPENSSL_NO_DSA
1206 dsa_key[0]=get_dsa512();
1207 dsa_key[1]=get_dsa1024();
1208 dsa_key[2]=get_dsa2048();
1211 #ifndef OPENSSL_NO_DES
1212 DES_set_key_unchecked(&key,&sch);
1213 DES_set_key_unchecked(&key2,&sch2);
1214 DES_set_key_unchecked(&key3,&sch3);
1216 #ifndef OPENSSL_NO_AES
1217 AES_set_encrypt_key(key16,128,&aes_ks1);
1218 AES_set_encrypt_key(key24,192,&aes_ks2);
1219 AES_set_encrypt_key(key32,256,&aes_ks3);
1221 #ifndef OPENSSL_NO_IDEA
1222 idea_set_encrypt_key(key16,&idea_ks);
1224 #ifndef OPENSSL_NO_RC4
1225 RC4_set_key(&rc4_ks,16,key16);
1227 #ifndef OPENSSL_NO_RC2
1228 RC2_set_key(&rc2_ks,16,key16,128);
1230 #ifndef OPENSSL_NO_RC5
1231 RC5_32_set_key(&rc5_ks,16,key16,12);
1233 #ifndef OPENSSL_NO_BF
1234 BF_set_key(&bf_ks,16,key16);
1236 #ifndef OPENSSL_NO_CAST
1237 CAST_set_key(&cast_ks,16,key16);
1239 #ifndef OPENSSL_NO_RSA
1240 memset(rsa_c,0,sizeof(rsa_c));
1243 #ifndef OPENSSL_NO_DES
1244 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
1250 for (i=count; i; i--)
1251 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
1256 c[D_MD2][0]=count/10;
1257 c[D_MDC2][0]=count/10;
1262 c[D_RMD160][0]=count;
1263 c[D_RC4][0]=count*5;
1264 c[D_CBC_DES][0]=count;
1265 c[D_EDE3_DES][0]=count/3;
1266 c[D_CBC_IDEA][0]=count;
1267 c[D_CBC_RC2][0]=count;
1268 c[D_CBC_RC5][0]=count;
1269 c[D_CBC_BF][0]=count;
1270 c[D_CBC_CAST][0]=count;
1271 c[D_CBC_128_AES][0]=count;
1272 c[D_CBC_192_AES][0]=count;
1273 c[D_CBC_256_AES][0]=count;
1275 for (i=1; i<SIZE_NUM; i++)
1277 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1278 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1279 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1280 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1281 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1282 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1283 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1285 for (i=1; i<SIZE_NUM; i++)
1289 l0=(long)lengths[i-1];
1290 l1=(long)lengths[i];
1291 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1292 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1293 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1294 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1295 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1296 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1297 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1298 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1299 c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
1300 c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
1301 c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
1303 #ifndef OPENSSL_NO_RSA
1304 rsa_c[R_RSA_512][0]=count/2000;
1305 rsa_c[R_RSA_512][1]=count/400;
1306 for (i=1; i<RSA_NUM; i++)
1308 rsa_c[i][0]=rsa_c[i-1][0]/8;
1309 rsa_c[i][1]=rsa_c[i-1][1]/4;
1310 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1314 if (rsa_c[i][0] == 0)
1323 #ifndef OPENSSL_NO_DSA
1324 dsa_c[R_DSA_512][0]=count/1000;
1325 dsa_c[R_DSA_512][1]=count/1000/2;
1326 for (i=1; i<DSA_NUM; i++)
1328 dsa_c[i][0]=dsa_c[i-1][0]/4;
1329 dsa_c[i][1]=dsa_c[i-1][1]/4;
1330 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1343 #ifndef OPENSSL_NO_ECDSA
1344 ecdsa_c[R_EC_P160][0]=count/1000;
1345 ecdsa_c[R_EC_P160][1]=count/1000/2;
1346 for (i=R_EC_P224; i<=R_EC_P521; i++)
1348 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1349 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1350 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1354 if (ecdsa_c[i] == 0)
1361 ecdsa_c[R_EC_K163][0]=count/1000;
1362 ecdsa_c[R_EC_K163][1]=count/1000/2;
1363 for (i=R_EC_K233; i<=R_EC_K571; i++)
1365 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1366 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1367 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1371 if (ecdsa_c[i] == 0)
1378 ecdsa_c[R_EC_B163][0]=count/1000;
1379 ecdsa_c[R_EC_B163][1]=count/1000/2;
1380 for (i=R_EC_B233; i<=R_EC_B571; i++)
1382 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1383 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1384 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1388 if (ecdsa_c[i] == 0)
1397 #ifndef OPENSSL_NO_ECDH
1398 ecdh_c[R_EC_P160][0]=count/1000;
1399 ecdh_c[R_EC_P160][1]=count/1000;
1400 for (i=R_EC_P224; i<=R_EC_P521; i++)
1402 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1403 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1404 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1415 ecdh_c[R_EC_K163][0]=count/1000;
1416 ecdh_c[R_EC_K163][1]=count/1000;
1417 for (i=R_EC_K233; i<=R_EC_K571; i++)
1419 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1420 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1421 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1432 ecdh_c[R_EC_B163][0]=count/1000;
1433 ecdh_c[R_EC_B163][1]=count/1000;
1434 for (i=R_EC_B233; i<=R_EC_B571; i++)
1436 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1437 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1438 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1451 #define COND(d) (count < (d))
1452 #define COUNT(d) (d)
1454 /* not worth fixing */
1455 # error "You cannot disable DES on systems without SIGALRM."
1456 #endif /* OPENSSL_NO_DES */
1458 #define COND(c) (run)
1459 #define COUNT(d) (count)
1460 signal(SIGALRM,sig_done);
1461 #endif /* SIGALRM */
1463 #ifndef OPENSSL_NO_MD2
1466 for (j=0; j<SIZE_NUM; j++)
1468 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1470 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1471 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1473 print_result(D_MD2,j,count,d);
1477 #ifndef OPENSSL_NO_MDC2
1480 for (j=0; j<SIZE_NUM; j++)
1482 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1484 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1485 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1487 print_result(D_MDC2,j,count,d);
1492 #ifndef OPENSSL_NO_MD4
1495 for (j=0; j<SIZE_NUM; j++)
1497 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1499 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1500 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1502 print_result(D_MD4,j,count,d);
1507 #ifndef OPENSSL_NO_MD5
1510 for (j=0; j<SIZE_NUM; j++)
1512 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1514 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1515 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1517 print_result(D_MD5,j,count,d);
1522 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1527 HMAC_CTX_init(&hctx);
1528 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1529 16,EVP_md5(), NULL);
1531 for (j=0; j<SIZE_NUM; j++)
1533 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1535 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1537 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1538 HMAC_Update(&hctx,buf,lengths[j]);
1539 HMAC_Final(&hctx,&(hmac[0]),NULL);
1542 print_result(D_HMAC,j,count,d);
1544 HMAC_CTX_cleanup(&hctx);
1547 #ifndef OPENSSL_NO_SHA
1550 for (j=0; j<SIZE_NUM; j++)
1552 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1554 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1555 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1557 print_result(D_SHA1,j,count,d);
1561 #ifndef OPENSSL_NO_RIPEMD
1564 for (j=0; j<SIZE_NUM; j++)
1566 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1568 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1569 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1571 print_result(D_RMD160,j,count,d);
1575 #ifndef OPENSSL_NO_RC4
1578 for (j=0; j<SIZE_NUM; j++)
1580 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1582 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1583 RC4(&rc4_ks,(unsigned int)lengths[j],
1586 print_result(D_RC4,j,count,d);
1590 #ifndef OPENSSL_NO_DES
1591 if (doit[D_CBC_DES])
1593 for (j=0; j<SIZE_NUM; j++)
1595 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1597 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1598 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1599 &DES_iv,DES_ENCRYPT);
1601 print_result(D_CBC_DES,j,count,d);
1605 if (doit[D_EDE3_DES])
1607 for (j=0; j<SIZE_NUM; j++)
1609 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1611 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1612 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1614 &DES_iv,DES_ENCRYPT);
1616 print_result(D_EDE3_DES,j,count,d);
1620 #ifndef OPENSSL_NO_AES
1621 if (doit[D_CBC_128_AES])
1623 for (j=0; j<SIZE_NUM; j++)
1625 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1627 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1628 AES_cbc_encrypt(buf,buf,
1629 (unsigned long)lengths[j],&aes_ks1,
1632 print_result(D_CBC_128_AES,j,count,d);
1635 if (doit[D_CBC_192_AES])
1637 for (j=0; j<SIZE_NUM; j++)
1639 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1641 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1642 AES_cbc_encrypt(buf,buf,
1643 (unsigned long)lengths[j],&aes_ks2,
1646 print_result(D_CBC_192_AES,j,count,d);
1649 if (doit[D_CBC_256_AES])
1651 for (j=0; j<SIZE_NUM; j++)
1653 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1655 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1656 AES_cbc_encrypt(buf,buf,
1657 (unsigned long)lengths[j],&aes_ks3,
1660 print_result(D_CBC_256_AES,j,count,d);
1665 #ifndef OPENSSL_NO_IDEA
1666 if (doit[D_CBC_IDEA])
1668 for (j=0; j<SIZE_NUM; j++)
1670 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1672 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1673 idea_cbc_encrypt(buf,buf,
1674 (unsigned long)lengths[j],&idea_ks,
1677 print_result(D_CBC_IDEA,j,count,d);
1681 #ifndef OPENSSL_NO_RC2
1682 if (doit[D_CBC_RC2])
1684 for (j=0; j<SIZE_NUM; j++)
1686 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1688 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1689 RC2_cbc_encrypt(buf,buf,
1690 (unsigned long)lengths[j],&rc2_ks,
1693 print_result(D_CBC_RC2,j,count,d);
1697 #ifndef OPENSSL_NO_RC5
1698 if (doit[D_CBC_RC5])
1700 for (j=0; j<SIZE_NUM; j++)
1702 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1704 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1705 RC5_32_cbc_encrypt(buf,buf,
1706 (unsigned long)lengths[j],&rc5_ks,
1709 print_result(D_CBC_RC5,j,count,d);
1713 #ifndef OPENSSL_NO_BF
1716 for (j=0; j<SIZE_NUM; j++)
1718 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1720 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1721 BF_cbc_encrypt(buf,buf,
1722 (unsigned long)lengths[j],&bf_ks,
1725 print_result(D_CBC_BF,j,count,d);
1729 #ifndef OPENSSL_NO_CAST
1730 if (doit[D_CBC_CAST])
1732 for (j=0; j<SIZE_NUM; j++)
1734 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1736 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1737 CAST_cbc_encrypt(buf,buf,
1738 (unsigned long)lengths[j],&cast_ks,
1741 print_result(D_CBC_CAST,j,count,d);
1748 for (j=0; j<SIZE_NUM; j++)
1755 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1756 /* -O3 -fschedule-insns messes up an
1757 * optimization here! names[D_EVP]
1758 * somehow becomes NULL */
1759 print_message(names[D_EVP],save_count,
1762 EVP_CIPHER_CTX_init(&ctx);
1764 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1766 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1770 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1771 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1773 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1774 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1776 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1778 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1780 EVP_CIPHER_CTX_cleanup(&ctx);
1784 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1785 print_message(names[D_EVP],save_count,
1789 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1790 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1794 print_result(D_EVP,j,count,d);
1798 RAND_pseudo_bytes(buf,36);
1799 #ifndef OPENSSL_NO_RSA
1800 for (j=0; j<RSA_NUM; j++)
1803 if (!rsa_doit[j]) continue;
1804 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1807 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1808 ERR_print_errors(bio_err);
1813 pkey_print_message("private","rsa",
1814 rsa_c[j][0],rsa_bits[j],
1816 /* RSA_blinding_on(rsa_key[j],NULL); */
1818 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1820 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1821 &rsa_num, rsa_key[j]);
1825 "RSA sign failure\n");
1826 ERR_print_errors(bio_err);
1832 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1833 : "%ld %d bit private RSA's in %.2fs\n",
1834 count,rsa_bits[j],d);
1835 rsa_results[j][0]=d/(double)count;
1840 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1843 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1844 ERR_print_errors(bio_err);
1849 pkey_print_message("public","rsa",
1850 rsa_c[j][1],rsa_bits[j],
1853 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1855 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1856 rsa_num, rsa_key[j]);
1860 "RSA verify failure\n");
1861 ERR_print_errors(bio_err);
1867 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1868 : "%ld %d bit public RSA's in %.2fs\n",
1869 count,rsa_bits[j],d);
1870 rsa_results[j][1]=d/(double)count;
1876 /* if longer than 10s, don't do any more */
1877 for (j++; j<RSA_NUM; j++)
1883 RAND_pseudo_bytes(buf,20);
1884 #ifndef OPENSSL_NO_DSA
1885 if (RAND_status() != 1)
1887 RAND_seed(rnd_seed, sizeof rnd_seed);
1890 for (j=0; j<DSA_NUM; j++)
1895 if (!dsa_doit[j]) continue;
1896 /* DSA_generate_key(dsa_key[j]); */
1897 /* DSA_sign_setup(dsa_key[j],NULL); */
1898 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1902 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1903 ERR_print_errors(bio_err);
1908 pkey_print_message("sign","dsa",
1909 dsa_c[j][0],dsa_bits[j],
1912 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1914 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1919 "DSA sign failure\n");
1920 ERR_print_errors(bio_err);
1926 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1927 : "%ld %d bit DSA signs in %.2fs\n",
1928 count,dsa_bits[j],d);
1929 dsa_results[j][0]=d/(double)count;
1933 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1937 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1938 ERR_print_errors(bio_err);
1943 pkey_print_message("verify","dsa",
1944 dsa_c[j][1],dsa_bits[j],
1947 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1949 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1954 "DSA verify failure\n");
1955 ERR_print_errors(bio_err);
1961 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1962 : "%ld %d bit DSA verify in %.2fs\n",
1963 count,dsa_bits[j],d);
1964 dsa_results[j][1]=d/(double)count;
1969 /* if longer than 10s, don't do any more */
1970 for (j++; j<DSA_NUM; j++)
1974 if (rnd_fake) RAND_cleanup();
1977 #ifndef OPENSSL_NO_ECDSA
1978 if (RAND_status() != 1)
1980 RAND_seed(rnd_seed, sizeof rnd_seed);
1983 for (j=0; j<EC_NUM; j++)
1987 if (!ecdsa_doit[j]) continue; /* Ignore Curve */
1988 ecdsa[j] = EC_KEY_new();
1989 if (ecdsa[j] == NULL)
1991 BIO_printf(bio_err,"ECDSA failure.\n");
1992 ERR_print_errors(bio_err);
1997 ecdsa[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
1998 /* Could not obtain group information */
1999 if (ecdsa[j]->group == NULL)
2001 BIO_printf(bio_err,"ECDSA failure.Could not obtain group information\n");
2002 ERR_print_errors(bio_err);
2008 EC_GROUP_precompute_mult(ecdsa[j]->group, NULL);
2010 /* Perform ECDSA signature test */
2011 EC_KEY_generate_key(ecdsa[j]);
2012 ret = ECDSA_sign(0, buf, 20, ecdsasig,
2013 &ecdsasiglen, ecdsa[j]);
2016 BIO_printf(bio_err,"ECDSA sign failure. No ECDSA sign will be done.\n");
2017 ERR_print_errors(bio_err);
2022 pkey_print_message("sign","ecdsa",
2024 test_curves_bits[j],
2028 for (count=0,run=1; COND(ecdsa_c[j][0]);
2031 ret=ECDSA_sign(0, buf, 20,
2032 ecdsasig, &ecdsasiglen,
2036 BIO_printf(bio_err, "ECDSA sign failure\n");
2037 ERR_print_errors(bio_err);
2044 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
2045 "%ld %d bit ECDSA signs in %.2fs \n",
2046 count, test_curves_bits[j], d);
2047 ecdsa_results[j][0]=d/(double)count;
2051 /* Perform ECDSA verification test */
2052 ret=ECDSA_verify(0, buf, 20, ecdsasig,
2053 ecdsasiglen, ecdsa[j]);
2056 BIO_printf(bio_err,"ECDSA verify failure. No ECDSA verify will be done.\n");
2057 ERR_print_errors(bio_err);
2062 pkey_print_message("verify","ecdsa",
2064 test_curves_bits[j],
2067 for (count=0,run=1; COND(ecdsa_c[j][1]); count++)
2069 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
2072 BIO_printf(bio_err, "ECDSA verify failure\n");
2073 ERR_print_errors(bio_err);
2079 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
2080 : "%ld %d bit ECDSA verify in %.2fs\n",
2081 count, test_curves_bits[j], d);
2082 ecdsa_results[j][1]=d/(double)count;
2087 /* if longer than 10s, don't do any more */
2088 for (j++; j<EC_NUM; j++)
2094 if (rnd_fake) RAND_cleanup();
2097 #ifndef OPENSSL_NO_ECDH
2098 if (RAND_status() != 1)
2100 RAND_seed(rnd_seed, sizeof rnd_seed);
2103 for (j=0; j<EC_NUM; j++)
2105 if (!ecdh_doit[j]) continue;
2106 ecdh_a[j] = EC_KEY_new();
2107 ecdh_b[j] = EC_KEY_new();
2108 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2110 BIO_printf(bio_err,"ECDH failure.\n");
2111 ERR_print_errors(bio_err);
2116 ecdh_a[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
2117 if (ecdh_a[j]->group == NULL)
2119 BIO_printf(bio_err,"ECDH failure.\n");
2120 ERR_print_errors(bio_err);
2125 ecdh_b[j]->group = EC_GROUP_dup(ecdh_a[j]->group);
2127 /* generate two ECDH key pairs */
2128 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2129 !EC_KEY_generate_key(ecdh_b[j]))
2131 BIO_printf(bio_err,"ECDH key generation failure.\n");
2132 ERR_print_errors(bio_err);
2137 /* If field size is not more than 24 octets, then use SHA-1 hash of result;
2138 * otherwise, use result (see section 4.8 of draft-ietf-tls-ecc-03.txt).
2140 int field_size, outlen;
2141 void *(*kdf)(void *in, size_t inlen, void *out, size_t xoutlen);
2142 field_size = EC_GROUP_get_degree(ecdh_a[j]->group);
2143 if (field_size <= 24 * 8)
2145 outlen = KDF1_SHA1_len;
2150 outlen = (field_size+7)/8;
2153 secret_size_a = ECDH_compute_key(secret_a, outlen,
2156 secret_size_b = ECDH_compute_key(secret_b, outlen,
2159 if (secret_size_a != secret_size_b)
2164 for (secret_idx = 0;
2165 (secret_idx < secret_size_a)
2166 && (ecdh_checks == 1);
2169 if (secret_a[secret_idx] != secret_b[secret_idx])
2173 if (ecdh_checks == 0)
2175 BIO_printf(bio_err,"ECDH computations don't match.\n");
2176 ERR_print_errors(bio_err);
2180 pkey_print_message("","ecdh",
2182 test_curves_bits[j],
2185 for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2187 ECDH_compute_key(secret_a, outlen,
2192 BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2193 count, test_curves_bits[j], d);
2194 ecdh_results[j][0]=d/(double)count;
2202 /* if longer than 10s, don't do any more */
2203 for (j++; j<EC_NUM; j++)
2207 if (rnd_fake) RAND_cleanup();
2214 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
2215 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
2217 printf("%s ",BN_options());
2218 #ifndef OPENSSL_NO_MD2
2219 printf("%s ",MD2_options());
2221 #ifndef OPENSSL_NO_RC4
2222 printf("%s ",RC4_options());
2224 #ifndef OPENSSL_NO_DES
2225 printf("%s ",DES_options());
2227 #ifndef OPENSSL_NO_AES
2228 printf("%s ",AES_options());
2230 #ifndef OPENSSL_NO_IDEA
2231 printf("%s ",idea_options());
2233 #ifndef OPENSSL_NO_BF
2234 printf("%s ",BF_options());
2236 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2237 printf("available timing options: ");
2248 #define as_string(s) (#s)
2251 printf("HZ=%g", dbl);
2254 printf(" [sysconf value]");
2258 printf("timing function used: %s%s%s%s%s%s%s\n",
2259 (ftime_used ? "ftime" : ""),
2260 (ftime_used + times_used > 1 ? "," : ""),
2261 (times_used ? "times" : ""),
2262 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
2263 (gettimeofday_used ? "gettimeofday" : ""),
2264 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
2265 (getrusage_used ? "getrusage" : ""));
2271 fprintf(stdout,"+H");
2274 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
2275 fprintf(stdout,"type ");
2277 for (j=0; j<SIZE_NUM; j++)
2278 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
2279 fprintf(stdout,"\n");
2282 for (k=0; k<ALGOR_NUM; k++)
2284 if (!doit[k]) continue;
2286 fprintf(stdout,"+F:%d:%s",k,names[k]);
2288 fprintf(stdout,"%-13s",names[k]);
2289 for (j=0; j<SIZE_NUM; j++)
2291 if (results[k][j] > 10000 && !mr)
2292 fprintf(stdout," %11.2fk",results[k][j]/1e3);
2294 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
2296 fprintf(stdout,"\n");
2298 #ifndef OPENSSL_NO_RSA
2300 for (k=0; k<RSA_NUM; k++)
2302 if (!rsa_doit[k]) continue;
2305 printf("%18ssign verify sign/s verify/s\n"," ");
2309 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2310 k,rsa_bits[k],rsa_results[k][0],
2313 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2314 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2315 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
2318 #ifndef OPENSSL_NO_DSA
2320 for (k=0; k<DSA_NUM; k++)
2322 if (!dsa_doit[k]) continue;
2325 printf("%18ssign verify sign/s verify/s\n"," ");
2329 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2330 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2332 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2333 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2334 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
2337 #ifndef OPENSSL_NO_ECDSA
2339 for (k=0; k<EC_NUM; k++)
2341 if (!ecdsa_doit[k]) continue;
2344 printf("%30ssign verify sign/s verify/s\n"," ");
2349 fprintf(stdout,"+F4:%u:%u:%f:%f\n",
2350 k, test_curves_bits[k],
2351 ecdsa_results[k][0],ecdsa_results[k][1]);
2354 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2355 test_curves_bits[k],
2356 test_curves_names[k],
2357 ecdsa_results[k][0],ecdsa_results[k][1],
2358 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2363 #ifndef OPENSSL_NO_ECDH
2365 for (k=0; k<EC_NUM; k++)
2367 if (!ecdh_doit[k]) continue;
2370 printf("%30sop op/s\n"," ");
2374 fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2375 k, test_curves_bits[k],
2376 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2379 fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2380 test_curves_bits[k],
2381 test_curves_names[k],
2382 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2389 ERR_print_errors(bio_err);
2390 if (buf != NULL) OPENSSL_free(buf);
2391 if (buf2 != NULL) OPENSSL_free(buf2);
2392 #ifndef OPENSSL_NO_RSA
2393 for (i=0; i<RSA_NUM; i++)
2394 if (rsa_key[i] != NULL)
2395 RSA_free(rsa_key[i]);
2397 #ifndef OPENSSL_NO_DSA
2398 for (i=0; i<DSA_NUM; i++)
2399 if (dsa_key[i] != NULL)
2400 DSA_free(dsa_key[i]);
2403 #ifndef OPENSSL_NO_ECDSA
2404 for (i=0; i<EC_NUM; i++)
2405 if (ecdsa[i] != NULL)
2406 EC_KEY_free(ecdsa[i]);
2408 #ifndef OPENSSL_NO_ECDH
2409 for (i=0; i<EC_NUM; i++)
2411 if (ecdh_a[i] != NULL)
2412 EC_KEY_free(ecdh_a[i]);
2413 if (ecdh_b[i] != NULL)
2414 EC_KEY_free(ecdh_b[i]);
2422 static void print_message(const char *s, long num, int length)
2425 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2426 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
2427 (void)BIO_flush(bio_err);
2430 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2431 : "Doing %s %ld times on %d size blocks: ",s,num,length);
2432 (void)BIO_flush(bio_err);
2439 static void pkey_print_message(char *str, char *str2, long num, int bits,
2443 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2444 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
2445 (void)BIO_flush(bio_err);
2448 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2449 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
2450 (void)BIO_flush(bio_err);
2457 static void print_result(int alg,int run_no,int count,double time_used)
2459 BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n"
2460 : "%d %s's in %.2fs\n",count,names[alg],time_used);
2461 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2464 static char *sstrsep(char **string, const char *delim)
2467 char *token = *string;
2472 memset(isdelim, 0, sizeof isdelim);
2477 isdelim[(unsigned char)(*delim)] = 1;
2481 while (!isdelim[(unsigned char)(**string)])
2496 static int do_multi(int multi)
2501 static char sep[]=":";
2503 fds=malloc(multi*sizeof *fds);
2504 for(n=0 ; n < multi ; ++n)
2522 printf("Forked child %d\n",n);
2525 /* for now, assume the pipe is long enough to take all the output */
2526 for(n=0 ; n < multi ; ++n)
2532 f=fdopen(fds[n],"r");
2533 while(fgets(buf,sizeof buf,f))
2540 fprintf(stderr,"Don't understand line '%s' from child %d\n",
2544 printf("Got: %s from %d\n",buf,n);
2545 if(!strncmp(buf,"+F:",3))
2551 alg=atoi(sstrsep(&p,sep));
2553 for(j=0 ; j < SIZE_NUM ; ++j)
2554 results[alg][j]+=atof(sstrsep(&p,sep));
2556 else if(!strncmp(buf,"+F2:",4))
2562 k=atoi(sstrsep(&p,sep));
2565 d=atof(sstrsep(&p,sep));
2567 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2569 rsa_results[k][0]=d;
2571 d=atof(sstrsep(&p,sep));
2573 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2575 rsa_results[k][1]=d;
2577 else if(!strncmp(buf,"+F2:",4))
2583 k=atoi(sstrsep(&p,sep));
2586 d=atof(sstrsep(&p,sep));
2588 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2590 rsa_results[k][0]=d;
2592 d=atof(sstrsep(&p,sep));
2594 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2596 rsa_results[k][1]=d;
2598 else if(!strncmp(buf,"+F3:",4))
2604 k=atoi(sstrsep(&p,sep));
2607 d=atof(sstrsep(&p,sep));
2609 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2611 dsa_results[k][0]=d;
2613 d=atof(sstrsep(&p,sep));
2615 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2617 dsa_results[k][1]=d;
2619 #ifndef OPENSSL_NO_ECDSA
2620 else if(!strncmp(buf,"+F4:",4))
2626 k=atoi(sstrsep(&p,sep));
2629 d=atof(sstrsep(&p,sep));
2631 ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2633 ecdsa_results[k][0]=d;
2635 d=atof(sstrsep(&p,sep));
2637 ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2639 ecdsa_results[k][1]=d;
2643 #ifndef OPENSSL_NO_ECDH
2644 else if(!strncmp(buf,"+F5:",4))
2650 k=atoi(sstrsep(&p,sep));
2653 d=atof(sstrsep(&p,sep));
2655 ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2657 ecdh_results[k][0]=d;
2662 else if(!strncmp(buf,"+H:",3))
2666 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);