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 #include <openssl/bn.h>
161 #ifndef OPENSSL_NO_DES
162 #include <openssl/des.h>
164 #ifndef OPENSSL_NO_AES
165 #include <openssl/aes.h>
167 #ifndef OPENSSL_NO_MD2
168 #include <openssl/md2.h>
170 #ifndef OPENSSL_NO_MDC2
171 #include <openssl/mdc2.h>
173 #ifndef OPENSSL_NO_MD4
174 #include <openssl/md4.h>
176 #ifndef OPENSSL_NO_MD5
177 #include <openssl/md5.h>
179 #ifndef OPENSSL_NO_HMAC
180 #include <openssl/hmac.h>
182 #include <openssl/evp.h>
183 #ifndef OPENSSL_NO_SHA
184 #include <openssl/sha.h>
186 #ifndef OPENSSL_NO_RIPEMD
187 #include <openssl/ripemd.h>
189 #ifndef OPENSSL_NO_RC4
190 #include <openssl/rc4.h>
192 #ifndef OPENSSL_NO_RC5
193 #include <openssl/rc5.h>
195 #ifndef OPENSSL_NO_RC2
196 #include <openssl/rc2.h>
198 #ifndef OPENSSL_NO_IDEA
199 #include <openssl/idea.h>
201 #ifndef OPENSSL_NO_BF
202 #include <openssl/blowfish.h>
204 #ifndef OPENSSL_NO_CAST
205 #include <openssl/cast.h>
207 #ifndef OPENSSL_NO_RSA
208 #include <openssl/rsa.h>
209 #include "./testrsa.h"
211 #include <openssl/x509.h>
212 #ifndef OPENSSL_NO_DSA
213 #include <openssl/dsa.h>
214 #include "./testdsa.h"
216 #ifndef OPENSSL_NO_ECDSA
217 #include <openssl/ecdsa.h>
219 #ifndef OPENSSL_NO_ECDH
220 #include <openssl/ecdh.h>
224 * The following "HZ" timing stuff should be sync'd up with the code in
225 * crypto/tmdiff.[ch]. That appears to try to do the same job, though I think
226 * this code is more up to date than libcrypto's so there may be features to
227 * migrate over first. This is used in two places further down AFAICS.
228 * The point is that nothing in openssl actually *uses* that tmdiff stuff, so
229 * either speed.c should be using it or it should go because it's obviously not
230 * useful enough. Anyone want to do a janitorial job on this?
233 /* The following if from times(3) man page. It may need to be changed */
235 # if defined(_SC_CLK_TCK) \
236 && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000)
237 # define HZ sysconf(_SC_CLK_TCK)
240 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
242 # else /* _BSD_CLK_TCK_ */
243 # define HZ ((double)_BSD_CLK_TCK_)
246 # define HZ ((double)CLK_TCK)
251 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2) && !defined(OPENSSL_SYS_NETWARE)
256 /* BUFSIZE needs to be one cipherblock larger than the largest number in the
257 lengths array (see below), to make space for padding when doing EVP tests.
258 1024 extra bytes may seem much, but hey, it doesn't hurt!
259 -- Richard Levitte */
260 #define BUFSIZE ((long)1024*9+1)
263 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
265 static int usertime=1;
267 static double Time_F(int s);
268 static void print_message(const char *s,long num,int length);
269 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
270 static void print_result(int alg,int run_no,int count,double time_used);
272 static int do_multi(int multi);
281 #define MAX_ECDH_SIZE 256
283 static const char *names[ALGOR_NUM]={
284 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
285 "des cbc","des ede3","idea cbc",
286 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
287 "aes-128 cbc","aes-192 cbc","aes-256 cbc","evp","sha256","sha512"};
288 static double results[ALGOR_NUM][SIZE_NUM];
289 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
290 static double rsa_results[RSA_NUM][2];
291 static double dsa_results[DSA_NUM][2];
292 static double ecdsa_results[EC_NUM][2];
293 static double ecdh_results[EC_NUM][1];
297 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
298 #define SIGRETTYPE void
300 #define SIGRETTYPE int
303 static SIGRETTYPE sig_done(int sig);
304 static SIGRETTYPE sig_done(int sig)
306 signal(SIGALRM,sig_done);
317 #if defined(OPENSSL_SYS_NETWARE)
319 /* for NetWare the best we can do is use clock() which returns the
320 * time, in hundredths of a second, since the NLM began executing
322 static double Time_F(int s)
326 static clock_t tstart,tend;
336 ret=(double)((double)(tend)-(double)(tstart));
337 return((ret < 0.001)?0.001:ret);
343 static double Time_F(int s)
350 static struct rusage tstart,tend;
355 getrusage(RUSAGE_SELF,&tstart);
362 getrusage(RUSAGE_SELF,&tend);
363 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
364 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
365 +((double)i)/1000000.0;
366 return((ret < 0.001)?0.001:ret);
371 static struct timeval tstart,tend;
374 gettimeofday_used = 1;
377 gettimeofday(&tstart,NULL);
382 gettimeofday(&tend,NULL);
383 i=(long)tend.tv_usec-(long)tstart.tv_usec;
384 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
385 return((ret < 0.001)?0.001:ret);
388 #else /* ndef USE_TOD */
393 static struct tms tstart,tend;
405 ret=(double)(tend.tms_utime-tstart.tms_utime) / ret;
406 return((ret < 1e-3)?1e-3:ret);
409 # endif /* times() */
410 # if defined(TIMES) && defined(TIMEB)
413 # ifdef OPENSSL_SYS_VXWORKS
415 static unsigned long tick_start, tick_end;
419 tick_start = tickGet();
424 tick_end = tickGet();
425 ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
426 return((ret < 0.001)?0.001:ret);
429 # elif defined(TIMEB)
431 static struct timeb tstart,tend;
443 i=(long)tend.millitm-(long)tstart.millitm;
444 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
445 return((ret < 0.001)?0.001:ret);
451 #endif /* if defined(OPENSSL_SYS_NETWARE) */
454 static const int KDF1_SHA1_len = 20;
455 static void *KDF1_SHA1(void *in, size_t inlen, void *out, size_t outlen)
457 #ifndef OPENSSL_NO_SHA
458 if (outlen != SHA_DIGEST_LENGTH)
460 return SHA1(in, inlen, out);
467 int MAIN(int, char **);
469 int MAIN(int argc, char **argv)
471 #ifndef OPENSSL_NO_ENGINE
474 unsigned char *buf=NULL,*buf2=NULL;
476 long count=0,save_count=0;
478 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
481 #ifndef OPENSSL_NO_RSA
484 unsigned char md[EVP_MAX_MD_SIZE];
485 #ifndef OPENSSL_NO_MD2
486 unsigned char md2[MD2_DIGEST_LENGTH];
488 #ifndef OPENSSL_NO_MDC2
489 unsigned char mdc2[MDC2_DIGEST_LENGTH];
491 #ifndef OPENSSL_NO_MD4
492 unsigned char md4[MD4_DIGEST_LENGTH];
494 #ifndef OPENSSL_NO_MD5
495 unsigned char md5[MD5_DIGEST_LENGTH];
496 unsigned char hmac[MD5_DIGEST_LENGTH];
498 #ifndef OPENSSL_NO_SHA
499 unsigned char sha[SHA_DIGEST_LENGTH];
500 unsigned char sha256[SHA256_DIGEST_LENGTH];
501 unsigned char sha512[SHA512_DIGEST_LENGTH];
503 #ifndef OPENSSL_NO_RIPEMD
504 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
506 #ifndef OPENSSL_NO_RC4
509 #ifndef OPENSSL_NO_RC5
512 #ifndef OPENSSL_NO_RC2
515 #ifndef OPENSSL_NO_IDEA
516 IDEA_KEY_SCHEDULE idea_ks;
518 #ifndef OPENSSL_NO_BF
521 #ifndef OPENSSL_NO_CAST
524 static const unsigned char key16[16]=
525 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
526 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
527 static const unsigned char key24[24]=
528 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
529 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
530 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
531 static const unsigned char key32[32]=
532 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
533 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
534 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
535 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
536 #ifndef OPENSSL_NO_AES
537 #define MAX_BLOCK_SIZE 128
539 #define MAX_BLOCK_SIZE 64
541 unsigned char DES_iv[8];
542 unsigned char iv[MAX_BLOCK_SIZE/8];
543 #ifndef OPENSSL_NO_DES
544 DES_cblock *buf_as_des_cblock = NULL;
545 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
546 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
547 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
548 DES_key_schedule sch;
549 DES_key_schedule sch2;
550 DES_key_schedule sch3;
552 #ifndef OPENSSL_NO_AES
553 AES_KEY aes_ks1, aes_ks2, aes_ks3;
565 #define D_CBC_IDEA 10
569 #define D_CBC_CAST 14
570 #define D_CBC_128_AES 15
571 #define D_CBC_192_AES 16
572 #define D_CBC_256_AES 17
577 long c[ALGOR_NUM][SIZE_NUM];
603 #ifndef OPENSSL_NO_RSA
604 RSA *rsa_key[RSA_NUM];
605 long rsa_c[RSA_NUM][2];
606 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
607 static unsigned char *rsa_data[RSA_NUM]=
608 {test512,test1024,test2048,test4096};
609 static int rsa_data_length[RSA_NUM]={
610 sizeof(test512),sizeof(test1024),
611 sizeof(test2048),sizeof(test4096)};
613 #ifndef OPENSSL_NO_DSA
614 DSA *dsa_key[DSA_NUM];
615 long dsa_c[DSA_NUM][2];
616 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
618 #ifndef OPENSSL_NO_EC
619 /* We only test over the following curves as they are representative,
620 * To add tests over more curves, simply add the curve NID
621 * and curve name to the following arrays and increase the
622 * EC_NUM value accordingly.
624 static unsigned int test_curves[EC_NUM] =
628 NID_X9_62_prime192v1,
630 NID_X9_62_prime256v1,
645 static char * test_curves_names[EC_NUM] =
666 static int test_curves_bits[EC_NUM] =
668 160, 192, 224, 256, 384, 521,
669 163, 233, 283, 409, 571,
670 163, 233, 283, 409, 571
675 #ifndef OPENSSL_NO_ECDSA
676 unsigned char ecdsasig[256];
677 unsigned int ecdsasiglen;
678 EC_KEY *ecdsa[EC_NUM];
679 long ecdsa_c[EC_NUM][2];
682 #ifndef OPENSSL_NO_ECDH
683 EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
684 unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
685 int secret_size_a, secret_size_b;
688 long ecdh_c[EC_NUM][2];
691 int rsa_doit[RSA_NUM];
692 int dsa_doit[DSA_NUM];
693 int ecdsa_doit[EC_NUM];
694 int ecdh_doit[EC_NUM];
697 const EVP_CIPHER *evp_cipher=NULL;
698 const EVP_MD *evp_md=NULL;
709 memset(results, 0, sizeof(results));
710 #ifndef OPENSSL_NO_DSA
711 memset(dsa_key,0,sizeof(dsa_key));
713 #ifndef OPENSSL_NO_ECDSA
714 for (i=0; i<EC_NUM; i++) ecdsa[i] = NULL;
716 #ifndef OPENSSL_NO_ECDH
717 for (i=0; i<EC_NUM; i++)
726 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
727 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
729 if (!load_config(bio_err, NULL))
732 #ifndef OPENSSL_NO_RSA
733 memset(rsa_key,0,sizeof(rsa_key));
734 for (i=0; i<RSA_NUM; i++)
738 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
740 BIO_printf(bio_err,"out of memory\n");
743 #ifndef OPENSSL_NO_DES
744 buf_as_des_cblock = (DES_cblock *)buf;
746 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
748 BIO_printf(bio_err,"out of memory\n");
752 memset(c,0,sizeof(c));
753 memset(DES_iv,0,sizeof(DES_iv));
754 memset(iv,0,sizeof(iv));
756 for (i=0; i<ALGOR_NUM; i++)
758 for (i=0; i<RSA_NUM; i++)
760 for (i=0; i<DSA_NUM; i++)
762 #ifndef OPENSSL_NO_ECDSA
763 for (i=0; i<EC_NUM; i++)
766 #ifndef OPENSSL_NO_ECDH
767 for (i=0; i<EC_NUM; i++)
777 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
780 j--; /* Otherwise, -elapsed gets confused with
783 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
789 BIO_printf(bio_err,"no EVP given\n");
792 evp_cipher=EVP_get_cipherbyname(*argv);
795 evp_md=EVP_get_digestbyname(*argv);
797 if(!evp_cipher && !evp_md)
799 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
804 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
807 j--; /* Otherwise, -elapsed gets confused with
810 #ifndef OPENSSL_NO_ENGINE
811 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
817 BIO_printf(bio_err,"no engine given\n");
820 e = setup_engine(bio_err, *argv, 0);
821 /* j will be increased again further down. We just
822 don't want speed to confuse an engine with an
823 algorithm, especially when none is given (which
824 means all of them should be run) */
829 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
835 BIO_printf(bio_err,"no multi count given\n");
841 BIO_printf(bio_err,"bad multi count\n");
844 j--; /* Otherwise, -mr gets confused with
848 else if (argc > 0 && !strcmp(*argv,"-mr"))
851 j--; /* Otherwise, -mr gets confused with
855 #ifndef OPENSSL_NO_MD2
856 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
859 #ifndef OPENSSL_NO_MDC2
860 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
863 #ifndef OPENSSL_NO_MD4
864 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
867 #ifndef OPENSSL_NO_MD5
868 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
871 #ifndef OPENSSL_NO_MD5
872 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
875 #ifndef OPENSSL_NO_SHA
876 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
878 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1,
882 if (strcmp(*argv,"sha256") == 0) doit[D_SHA256]=1;
884 if (strcmp(*argv,"sha512") == 0) doit[D_SHA512]=1;
887 #ifndef OPENSSL_NO_RIPEMD
888 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
890 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
892 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
895 #ifndef OPENSSL_NO_RC4
896 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
899 #ifndef OPENSSL_NO_DES
900 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
901 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
904 #ifndef OPENSSL_NO_AES
905 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
906 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
907 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
910 #ifndef OPENSSL_NO_RSA
911 #if 0 /* was: #ifdef RSAref */
912 if (strcmp(*argv,"rsaref") == 0)
914 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
920 if (strcmp(*argv,"openssl") == 0)
922 RSA_set_default_method(RSA_PKCS1_SSLeay());
927 #endif /* !OPENSSL_NO_RSA */
928 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
929 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
930 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
931 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
932 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
933 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
934 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
936 #ifndef OPENSSL_NO_RC2
937 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
938 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
941 #ifndef OPENSSL_NO_RC5
942 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
943 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
946 #ifndef OPENSSL_NO_IDEA
947 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
948 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
951 #ifndef OPENSSL_NO_BF
952 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
953 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
954 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
957 #ifndef OPENSSL_NO_CAST
958 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
959 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
960 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
963 #ifndef OPENSSL_NO_DES
964 if (strcmp(*argv,"des") == 0)
971 #ifndef OPENSSL_NO_AES
972 if (strcmp(*argv,"aes") == 0)
974 doit[D_CBC_128_AES]=1;
975 doit[D_CBC_192_AES]=1;
976 doit[D_CBC_256_AES]=1;
980 #ifndef OPENSSL_NO_RSA
981 if (strcmp(*argv,"rsa") == 0)
983 rsa_doit[R_RSA_512]=1;
984 rsa_doit[R_RSA_1024]=1;
985 rsa_doit[R_RSA_2048]=1;
986 rsa_doit[R_RSA_4096]=1;
990 #ifndef OPENSSL_NO_DSA
991 if (strcmp(*argv,"dsa") == 0)
993 dsa_doit[R_DSA_512]=1;
994 dsa_doit[R_DSA_1024]=1;
995 dsa_doit[R_DSA_2048]=1;
999 #ifndef OPENSSL_NO_ECDSA
1000 if (strcmp(*argv,"ecdsap160") == 0) ecdsa_doit[R_EC_P160]=2;
1001 else if (strcmp(*argv,"ecdsap224") == 0) ecdsa_doit[R_EC_P224]=2;
1002 else if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2;
1003 else if (strcmp(*argv,"ecdsap384") == 0) ecdsa_doit[R_EC_P384]=2;
1004 else if (strcmp(*argv,"ecdsap521") == 0) ecdsa_doit[R_EC_P521]=2;
1005 else if (strcmp(*argv,"ecdsak163") == 0) ecdsa_doit[R_EC_K163]=2;
1006 else if (strcmp(*argv,"ecdsak233") == 0) ecdsa_doit[R_EC_K233]=2;
1007 else if (strcmp(*argv,"ecdsak283") == 0) ecdsa_doit[R_EC_K283]=2;
1008 else if (strcmp(*argv,"ecdsak409") == 0) ecdsa_doit[R_EC_K409]=2;
1009 else if (strcmp(*argv,"ecdsak571") == 0) ecdsa_doit[R_EC_K571]=2;
1010 else if (strcmp(*argv,"ecdsab163") == 0) ecdsa_doit[R_EC_B163]=2;
1011 else if (strcmp(*argv,"ecdsab233") == 0) ecdsa_doit[R_EC_B233]=2;
1012 else if (strcmp(*argv,"ecdsab283") == 0) ecdsa_doit[R_EC_B283]=2;
1013 else if (strcmp(*argv,"ecdsab409") == 0) ecdsa_doit[R_EC_B409]=2;
1014 else if (strcmp(*argv,"ecdsab571") == 0) ecdsa_doit[R_EC_B571]=2;
1015 else if (strcmp(*argv,"ecdsa") == 0)
1017 for (i=0; i < EC_NUM; i++)
1022 #ifndef OPENSSL_NO_ECDH
1023 if (strcmp(*argv,"ecdhp160") == 0) ecdh_doit[R_EC_P160]=2;
1024 else if (strcmp(*argv,"ecdhp224") == 0) ecdh_doit[R_EC_P224]=2;
1025 else if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2;
1026 else if (strcmp(*argv,"ecdhp384") == 0) ecdh_doit[R_EC_P384]=2;
1027 else if (strcmp(*argv,"ecdhp521") == 0) ecdh_doit[R_EC_P521]=2;
1028 else if (strcmp(*argv,"ecdhk163") == 0) ecdh_doit[R_EC_K163]=2;
1029 else if (strcmp(*argv,"ecdhk233") == 0) ecdh_doit[R_EC_K233]=2;
1030 else if (strcmp(*argv,"ecdhk283") == 0) ecdh_doit[R_EC_K283]=2;
1031 else if (strcmp(*argv,"ecdhk409") == 0) ecdh_doit[R_EC_K409]=2;
1032 else if (strcmp(*argv,"ecdhk571") == 0) ecdh_doit[R_EC_K571]=2;
1033 else if (strcmp(*argv,"ecdhb163") == 0) ecdh_doit[R_EC_B163]=2;
1034 else if (strcmp(*argv,"ecdhb233") == 0) ecdh_doit[R_EC_B233]=2;
1035 else if (strcmp(*argv,"ecdhb283") == 0) ecdh_doit[R_EC_B283]=2;
1036 else if (strcmp(*argv,"ecdhb409") == 0) ecdh_doit[R_EC_B409]=2;
1037 else if (strcmp(*argv,"ecdhb571") == 0) ecdh_doit[R_EC_B571]=2;
1038 else if (strcmp(*argv,"ecdh") == 0)
1040 for (i=0; i < EC_NUM; i++)
1046 BIO_printf(bio_err,"Error: bad option or value\n");
1047 BIO_printf(bio_err,"\n");
1048 BIO_printf(bio_err,"Available values:\n");
1049 #ifndef OPENSSL_NO_MD2
1050 BIO_printf(bio_err,"md2 ");
1052 #ifndef OPENSSL_NO_MDC2
1053 BIO_printf(bio_err,"mdc2 ");
1055 #ifndef OPENSSL_NO_MD4
1056 BIO_printf(bio_err,"md4 ");
1058 #ifndef OPENSSL_NO_MD5
1059 BIO_printf(bio_err,"md5 ");
1060 #ifndef OPENSSL_NO_HMAC
1061 BIO_printf(bio_err,"hmac ");
1064 #ifndef OPENSSL_NO_SHA1
1065 BIO_printf(bio_err,"sha1 ");
1066 BIO_printf(bio_err,"sha256 ");
1067 BIO_printf(bio_err,"sha512 ");
1069 #ifndef OPENSSL_NO_RIPEMD160
1070 BIO_printf(bio_err,"rmd160");
1072 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
1073 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
1074 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
1075 BIO_printf(bio_err,"\n");
1078 #ifndef OPENSSL_NO_IDEA
1079 BIO_printf(bio_err,"idea-cbc ");
1081 #ifndef OPENSSL_NO_RC2
1082 BIO_printf(bio_err,"rc2-cbc ");
1084 #ifndef OPENSSL_NO_RC5
1085 BIO_printf(bio_err,"rc5-cbc ");
1087 #ifndef OPENSSL_NO_BF
1088 BIO_printf(bio_err,"bf-cbc");
1090 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1091 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
1092 BIO_printf(bio_err,"\n");
1094 #ifndef OPENSSL_NO_DES
1095 BIO_printf(bio_err,"des-cbc des-ede3 ");
1097 #ifndef OPENSSL_NO_AES
1098 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
1100 #ifndef OPENSSL_NO_RC4
1101 BIO_printf(bio_err,"rc4");
1103 BIO_printf(bio_err,"\n");
1105 #ifndef OPENSSL_NO_RSA
1106 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
1109 #ifndef OPENSSL_NO_DSA
1110 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
1112 #ifndef OPENSSL_NO_ECDSA
1113 BIO_printf(bio_err,"ecdsap160 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
1114 BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n");
1115 BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n");
1116 BIO_printf(bio_err,"ecdsa\n");
1118 #ifndef OPENSSL_NO_ECDH
1119 BIO_printf(bio_err,"ecdhp160 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n");
1120 BIO_printf(bio_err,"ecdhk163 ecdhk233 ecdhk283 ecdhk409 ecdhk571\n");
1121 BIO_printf(bio_err,"ecdhb163 ecdhb233 ecdhb283 ecdhb409 ecdhb571\n");
1122 BIO_printf(bio_err,"ecdh\n");
1125 #ifndef OPENSSL_NO_IDEA
1126 BIO_printf(bio_err,"idea ");
1128 #ifndef OPENSSL_NO_RC2
1129 BIO_printf(bio_err,"rc2 ");
1131 #ifndef OPENSSL_NO_DES
1132 BIO_printf(bio_err,"des ");
1134 #ifndef OPENSSL_NO_AES
1135 BIO_printf(bio_err,"aes ");
1137 #ifndef OPENSSL_NO_RSA
1138 BIO_printf(bio_err,"rsa ");
1140 #ifndef OPENSSL_NO_BF
1141 BIO_printf(bio_err,"blowfish");
1143 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1144 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
1145 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
1146 BIO_printf(bio_err,"\n");
1149 BIO_printf(bio_err,"\n");
1150 BIO_printf(bio_err,"Available options:\n");
1151 #if defined(TIMES) || defined(USE_TOD)
1152 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
1154 #ifndef OPENSSL_NO_ENGINE
1155 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
1157 BIO_printf(bio_err,"-evp e use EVP e.\n");
1158 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
1159 BIO_printf(bio_err,"-mr produce machine readable output.\n");
1161 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
1171 if(multi && do_multi(multi))
1177 for (i=0; i<ALGOR_NUM; i++)
1182 for (i=0; i<RSA_NUM; i++)
1184 for (i=0; i<DSA_NUM; i++)
1187 for (i=0; i<ALGOR_NUM; i++)
1188 if (doit[i]) pr_header++;
1190 if (usertime == 0 && !mr)
1191 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
1192 if (usertime <= 0 && !mr)
1194 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
1195 BIO_printf(bio_err,"program when this computer is idle.\n");
1198 #ifndef OPENSSL_NO_RSA
1199 for (i=0; i<RSA_NUM; i++)
1201 const unsigned char *p;
1204 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
1205 if (rsa_key[i] == NULL)
1207 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
1213 BIO_printf(bio_err,mr ? "+RK:%d:"
1214 : "Loaded RSA key, %d bit modulus and e= 0x",
1215 BN_num_bits(rsa_key[i]->n));
1216 BN_print(bio_err,rsa_key[i]->e);
1217 BIO_printf(bio_err,"\n");
1223 #ifndef OPENSSL_NO_DSA
1224 dsa_key[0]=get_dsa512();
1225 dsa_key[1]=get_dsa1024();
1226 dsa_key[2]=get_dsa2048();
1229 #ifndef OPENSSL_NO_DES
1230 DES_set_key_unchecked(&key,&sch);
1231 DES_set_key_unchecked(&key2,&sch2);
1232 DES_set_key_unchecked(&key3,&sch3);
1234 #ifndef OPENSSL_NO_AES
1235 AES_set_encrypt_key(key16,128,&aes_ks1);
1236 AES_set_encrypt_key(key24,192,&aes_ks2);
1237 AES_set_encrypt_key(key32,256,&aes_ks3);
1239 #ifndef OPENSSL_NO_IDEA
1240 idea_set_encrypt_key(key16,&idea_ks);
1242 #ifndef OPENSSL_NO_RC4
1243 RC4_set_key(&rc4_ks,16,key16);
1245 #ifndef OPENSSL_NO_RC2
1246 RC2_set_key(&rc2_ks,16,key16,128);
1248 #ifndef OPENSSL_NO_RC5
1249 RC5_32_set_key(&rc5_ks,16,key16,12);
1251 #ifndef OPENSSL_NO_BF
1252 BF_set_key(&bf_ks,16,key16);
1254 #ifndef OPENSSL_NO_CAST
1255 CAST_set_key(&cast_ks,16,key16);
1257 #ifndef OPENSSL_NO_RSA
1258 memset(rsa_c,0,sizeof(rsa_c));
1261 #ifndef OPENSSL_NO_DES
1262 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
1268 for (i=count; i; i--)
1269 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
1274 c[D_MD2][0]=count/10;
1275 c[D_MDC2][0]=count/10;
1280 c[D_RMD160][0]=count;
1281 c[D_RC4][0]=count*5;
1282 c[D_CBC_DES][0]=count;
1283 c[D_EDE3_DES][0]=count/3;
1284 c[D_CBC_IDEA][0]=count;
1285 c[D_CBC_RC2][0]=count;
1286 c[D_CBC_RC5][0]=count;
1287 c[D_CBC_BF][0]=count;
1288 c[D_CBC_CAST][0]=count;
1289 c[D_CBC_128_AES][0]=count;
1290 c[D_CBC_192_AES][0]=count;
1291 c[D_CBC_256_AES][0]=count;
1292 c[D_SHA256][0]=count;
1293 c[D_SHA512][0]=count;
1295 for (i=1; i<SIZE_NUM; i++)
1297 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1298 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1299 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1300 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1301 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1302 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1303 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1304 c[D_SHA256][i]=c[D_SHA256][0]*4*lengths[0]/lengths[i];
1305 c[D_SHA512][i]=c[D_SHA512][0]*4*lengths[0]/lengths[i];
1307 for (i=1; i<SIZE_NUM; i++)
1311 l0=(long)lengths[i-1];
1312 l1=(long)lengths[i];
1313 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1314 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1315 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1316 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1317 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1318 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1319 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1320 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1321 c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
1322 c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
1323 c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
1325 #ifndef OPENSSL_NO_RSA
1326 rsa_c[R_RSA_512][0]=count/2000;
1327 rsa_c[R_RSA_512][1]=count/400;
1328 for (i=1; i<RSA_NUM; i++)
1330 rsa_c[i][0]=rsa_c[i-1][0]/8;
1331 rsa_c[i][1]=rsa_c[i-1][1]/4;
1332 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1336 if (rsa_c[i][0] == 0)
1345 #ifndef OPENSSL_NO_DSA
1346 dsa_c[R_DSA_512][0]=count/1000;
1347 dsa_c[R_DSA_512][1]=count/1000/2;
1348 for (i=1; i<DSA_NUM; i++)
1350 dsa_c[i][0]=dsa_c[i-1][0]/4;
1351 dsa_c[i][1]=dsa_c[i-1][1]/4;
1352 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1365 #ifndef OPENSSL_NO_ECDSA
1366 ecdsa_c[R_EC_P160][0]=count/1000;
1367 ecdsa_c[R_EC_P160][1]=count/1000/2;
1368 for (i=R_EC_P224; i<=R_EC_P521; i++)
1370 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1371 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1372 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1376 if (ecdsa_c[i] == 0)
1383 ecdsa_c[R_EC_K163][0]=count/1000;
1384 ecdsa_c[R_EC_K163][1]=count/1000/2;
1385 for (i=R_EC_K233; i<=R_EC_K571; i++)
1387 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1388 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1389 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1393 if (ecdsa_c[i] == 0)
1400 ecdsa_c[R_EC_B163][0]=count/1000;
1401 ecdsa_c[R_EC_B163][1]=count/1000/2;
1402 for (i=R_EC_B233; i<=R_EC_B571; i++)
1404 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1405 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1406 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1410 if (ecdsa_c[i] == 0)
1419 #ifndef OPENSSL_NO_ECDH
1420 ecdh_c[R_EC_P160][0]=count/1000;
1421 ecdh_c[R_EC_P160][1]=count/1000;
1422 for (i=R_EC_P224; i<=R_EC_P521; i++)
1424 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1425 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1426 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1437 ecdh_c[R_EC_K163][0]=count/1000;
1438 ecdh_c[R_EC_K163][1]=count/1000;
1439 for (i=R_EC_K233; i<=R_EC_K571; i++)
1441 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1442 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1443 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1454 ecdh_c[R_EC_B163][0]=count/1000;
1455 ecdh_c[R_EC_B163][1]=count/1000;
1456 for (i=R_EC_B233; i<=R_EC_B571; i++)
1458 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1459 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1460 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1473 #define COND(d) (count < (d))
1474 #define COUNT(d) (d)
1476 /* not worth fixing */
1477 # error "You cannot disable DES on systems without SIGALRM."
1478 #endif /* OPENSSL_NO_DES */
1480 #define COND(c) (run)
1481 #define COUNT(d) (count)
1482 signal(SIGALRM,sig_done);
1483 #endif /* SIGALRM */
1485 #ifndef OPENSSL_NO_MD2
1488 for (j=0; j<SIZE_NUM; j++)
1490 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1492 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1493 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1495 print_result(D_MD2,j,count,d);
1499 #ifndef OPENSSL_NO_MDC2
1502 for (j=0; j<SIZE_NUM; j++)
1504 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1506 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1507 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1509 print_result(D_MDC2,j,count,d);
1514 #ifndef OPENSSL_NO_MD4
1517 for (j=0; j<SIZE_NUM; j++)
1519 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1521 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1522 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1524 print_result(D_MD4,j,count,d);
1529 #ifndef OPENSSL_NO_MD5
1532 for (j=0; j<SIZE_NUM; j++)
1534 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1536 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1537 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1539 print_result(D_MD5,j,count,d);
1544 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1549 HMAC_CTX_init(&hctx);
1550 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1551 16,EVP_md5(), NULL);
1553 for (j=0; j<SIZE_NUM; j++)
1555 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1557 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1559 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1560 HMAC_Update(&hctx,buf,lengths[j]);
1561 HMAC_Final(&hctx,&(hmac[0]),NULL);
1564 print_result(D_HMAC,j,count,d);
1566 HMAC_CTX_cleanup(&hctx);
1569 #ifndef OPENSSL_NO_SHA
1572 for (j=0; j<SIZE_NUM; j++)
1574 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1576 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1577 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1579 print_result(D_SHA1,j,count,d);
1585 for (j=0; j<SIZE_NUM; j++)
1587 print_message(names[D_SHA256],c[D_SHA256][j],lengths[j]);
1589 for (count=0,run=1; COND(c[D_SHA256][j]); count++)
1590 SHA256(buf,lengths[j],sha256);
1592 print_result(D_SHA256,j,count,d);
1598 for (j=0; j<SIZE_NUM; j++)
1600 print_message(names[D_SHA512],c[D_SHA512][j],lengths[j]);
1602 for (count=0,run=1; COND(c[D_SHA512][j]); count++)
1603 SHA512(buf,lengths[j],sha512);
1605 print_result(D_SHA512,j,count,d);
1609 #ifndef OPENSSL_NO_RIPEMD
1612 for (j=0; j<SIZE_NUM; j++)
1614 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1616 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1617 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1619 print_result(D_RMD160,j,count,d);
1623 #ifndef OPENSSL_NO_RC4
1626 for (j=0; j<SIZE_NUM; j++)
1628 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1630 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1631 RC4(&rc4_ks,(unsigned int)lengths[j],
1634 print_result(D_RC4,j,count,d);
1638 #ifndef OPENSSL_NO_DES
1639 if (doit[D_CBC_DES])
1641 for (j=0; j<SIZE_NUM; j++)
1643 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1645 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1646 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1647 &DES_iv,DES_ENCRYPT);
1649 print_result(D_CBC_DES,j,count,d);
1653 if (doit[D_EDE3_DES])
1655 for (j=0; j<SIZE_NUM; j++)
1657 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1659 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1660 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1662 &DES_iv,DES_ENCRYPT);
1664 print_result(D_EDE3_DES,j,count,d);
1668 #ifndef OPENSSL_NO_AES
1669 if (doit[D_CBC_128_AES])
1671 for (j=0; j<SIZE_NUM; j++)
1673 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1675 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1676 AES_cbc_encrypt(buf,buf,
1677 (unsigned long)lengths[j],&aes_ks1,
1680 print_result(D_CBC_128_AES,j,count,d);
1683 if (doit[D_CBC_192_AES])
1685 for (j=0; j<SIZE_NUM; j++)
1687 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1689 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1690 AES_cbc_encrypt(buf,buf,
1691 (unsigned long)lengths[j],&aes_ks2,
1694 print_result(D_CBC_192_AES,j,count,d);
1697 if (doit[D_CBC_256_AES])
1699 for (j=0; j<SIZE_NUM; j++)
1701 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1703 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1704 AES_cbc_encrypt(buf,buf,
1705 (unsigned long)lengths[j],&aes_ks3,
1708 print_result(D_CBC_256_AES,j,count,d);
1713 #ifndef OPENSSL_NO_IDEA
1714 if (doit[D_CBC_IDEA])
1716 for (j=0; j<SIZE_NUM; j++)
1718 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1720 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1721 idea_cbc_encrypt(buf,buf,
1722 (unsigned long)lengths[j],&idea_ks,
1725 print_result(D_CBC_IDEA,j,count,d);
1729 #ifndef OPENSSL_NO_RC2
1730 if (doit[D_CBC_RC2])
1732 for (j=0; j<SIZE_NUM; j++)
1734 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1736 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1737 RC2_cbc_encrypt(buf,buf,
1738 (unsigned long)lengths[j],&rc2_ks,
1741 print_result(D_CBC_RC2,j,count,d);
1745 #ifndef OPENSSL_NO_RC5
1746 if (doit[D_CBC_RC5])
1748 for (j=0; j<SIZE_NUM; j++)
1750 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1752 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1753 RC5_32_cbc_encrypt(buf,buf,
1754 (unsigned long)lengths[j],&rc5_ks,
1757 print_result(D_CBC_RC5,j,count,d);
1761 #ifndef OPENSSL_NO_BF
1764 for (j=0; j<SIZE_NUM; j++)
1766 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1768 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1769 BF_cbc_encrypt(buf,buf,
1770 (unsigned long)lengths[j],&bf_ks,
1773 print_result(D_CBC_BF,j,count,d);
1777 #ifndef OPENSSL_NO_CAST
1778 if (doit[D_CBC_CAST])
1780 for (j=0; j<SIZE_NUM; j++)
1782 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1784 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1785 CAST_cbc_encrypt(buf,buf,
1786 (unsigned long)lengths[j],&cast_ks,
1789 print_result(D_CBC_CAST,j,count,d);
1796 for (j=0; j<SIZE_NUM; j++)
1803 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1804 /* -O3 -fschedule-insns messes up an
1805 * optimization here! names[D_EVP]
1806 * somehow becomes NULL */
1807 print_message(names[D_EVP],save_count,
1810 EVP_CIPHER_CTX_init(&ctx);
1812 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1814 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1818 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1819 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1821 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1822 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1824 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1826 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1828 EVP_CIPHER_CTX_cleanup(&ctx);
1832 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1833 print_message(names[D_EVP],save_count,
1837 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1838 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1842 print_result(D_EVP,j,count,d);
1846 RAND_pseudo_bytes(buf,36);
1847 #ifndef OPENSSL_NO_RSA
1848 for (j=0; j<RSA_NUM; j++)
1851 if (!rsa_doit[j]) continue;
1852 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1855 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1856 ERR_print_errors(bio_err);
1861 pkey_print_message("private","rsa",
1862 rsa_c[j][0],rsa_bits[j],
1864 /* RSA_blinding_on(rsa_key[j],NULL); */
1866 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1868 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1869 &rsa_num, rsa_key[j]);
1873 "RSA sign failure\n");
1874 ERR_print_errors(bio_err);
1880 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1881 : "%ld %d bit private RSA's in %.2fs\n",
1882 count,rsa_bits[j],d);
1883 rsa_results[j][0]=d/(double)count;
1888 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1891 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1892 ERR_print_errors(bio_err);
1897 pkey_print_message("public","rsa",
1898 rsa_c[j][1],rsa_bits[j],
1901 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1903 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1904 rsa_num, rsa_key[j]);
1908 "RSA verify failure\n");
1909 ERR_print_errors(bio_err);
1915 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1916 : "%ld %d bit public RSA's in %.2fs\n",
1917 count,rsa_bits[j],d);
1918 rsa_results[j][1]=d/(double)count;
1924 /* if longer than 10s, don't do any more */
1925 for (j++; j<RSA_NUM; j++)
1931 RAND_pseudo_bytes(buf,20);
1932 #ifndef OPENSSL_NO_DSA
1933 if (RAND_status() != 1)
1935 RAND_seed(rnd_seed, sizeof rnd_seed);
1938 for (j=0; j<DSA_NUM; j++)
1943 if (!dsa_doit[j]) continue;
1944 /* DSA_generate_key(dsa_key[j]); */
1945 /* DSA_sign_setup(dsa_key[j],NULL); */
1946 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1950 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1951 ERR_print_errors(bio_err);
1956 pkey_print_message("sign","dsa",
1957 dsa_c[j][0],dsa_bits[j],
1960 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1962 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1967 "DSA sign failure\n");
1968 ERR_print_errors(bio_err);
1974 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1975 : "%ld %d bit DSA signs in %.2fs\n",
1976 count,dsa_bits[j],d);
1977 dsa_results[j][0]=d/(double)count;
1981 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1985 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1986 ERR_print_errors(bio_err);
1991 pkey_print_message("verify","dsa",
1992 dsa_c[j][1],dsa_bits[j],
1995 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1997 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
2002 "DSA verify failure\n");
2003 ERR_print_errors(bio_err);
2009 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
2010 : "%ld %d bit DSA verify in %.2fs\n",
2011 count,dsa_bits[j],d);
2012 dsa_results[j][1]=d/(double)count;
2017 /* if longer than 10s, don't do any more */
2018 for (j++; j<DSA_NUM; j++)
2022 if (rnd_fake) RAND_cleanup();
2025 #ifndef OPENSSL_NO_ECDSA
2026 if (RAND_status() != 1)
2028 RAND_seed(rnd_seed, sizeof rnd_seed);
2031 for (j=0; j<EC_NUM; j++)
2035 if (!ecdsa_doit[j]) continue; /* Ignore Curve */
2036 ecdsa[j] = EC_KEY_new();
2037 if (ecdsa[j] == NULL)
2039 BIO_printf(bio_err,"ECDSA failure.\n");
2040 ERR_print_errors(bio_err);
2045 ecdsa[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
2046 /* Could not obtain group information */
2047 if (ecdsa[j]->group == NULL)
2049 BIO_printf(bio_err,"ECDSA failure.Could not obtain group information\n");
2050 ERR_print_errors(bio_err);
2056 EC_GROUP_precompute_mult(ecdsa[j]->group, NULL);
2058 /* Perform ECDSA signature test */
2059 EC_KEY_generate_key(ecdsa[j]);
2060 ret = ECDSA_sign(0, buf, 20, ecdsasig,
2061 &ecdsasiglen, ecdsa[j]);
2064 BIO_printf(bio_err,"ECDSA sign failure. No ECDSA sign will be done.\n");
2065 ERR_print_errors(bio_err);
2070 pkey_print_message("sign","ecdsa",
2072 test_curves_bits[j],
2076 for (count=0,run=1; COND(ecdsa_c[j][0]);
2079 ret=ECDSA_sign(0, buf, 20,
2080 ecdsasig, &ecdsasiglen,
2084 BIO_printf(bio_err, "ECDSA sign failure\n");
2085 ERR_print_errors(bio_err);
2092 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
2093 "%ld %d bit ECDSA signs in %.2fs \n",
2094 count, test_curves_bits[j], d);
2095 ecdsa_results[j][0]=d/(double)count;
2099 /* Perform ECDSA verification test */
2100 ret=ECDSA_verify(0, buf, 20, ecdsasig,
2101 ecdsasiglen, ecdsa[j]);
2104 BIO_printf(bio_err,"ECDSA verify failure. No ECDSA verify will be done.\n");
2105 ERR_print_errors(bio_err);
2110 pkey_print_message("verify","ecdsa",
2112 test_curves_bits[j],
2115 for (count=0,run=1; COND(ecdsa_c[j][1]); count++)
2117 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
2120 BIO_printf(bio_err, "ECDSA verify failure\n");
2121 ERR_print_errors(bio_err);
2127 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
2128 : "%ld %d bit ECDSA verify in %.2fs\n",
2129 count, test_curves_bits[j], d);
2130 ecdsa_results[j][1]=d/(double)count;
2135 /* if longer than 10s, don't do any more */
2136 for (j++; j<EC_NUM; j++)
2142 if (rnd_fake) RAND_cleanup();
2145 #ifndef OPENSSL_NO_ECDH
2146 if (RAND_status() != 1)
2148 RAND_seed(rnd_seed, sizeof rnd_seed);
2151 for (j=0; j<EC_NUM; j++)
2153 if (!ecdh_doit[j]) continue;
2154 ecdh_a[j] = EC_KEY_new();
2155 ecdh_b[j] = EC_KEY_new();
2156 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2158 BIO_printf(bio_err,"ECDH failure.\n");
2159 ERR_print_errors(bio_err);
2164 ecdh_a[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
2165 if (ecdh_a[j]->group == NULL)
2167 BIO_printf(bio_err,"ECDH failure.\n");
2168 ERR_print_errors(bio_err);
2173 ecdh_b[j]->group = EC_GROUP_dup(ecdh_a[j]->group);
2175 /* generate two ECDH key pairs */
2176 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2177 !EC_KEY_generate_key(ecdh_b[j]))
2179 BIO_printf(bio_err,"ECDH key generation failure.\n");
2180 ERR_print_errors(bio_err);
2185 /* If field size is not more than 24 octets, then use SHA-1 hash of result;
2186 * otherwise, use result (see section 4.8 of draft-ietf-tls-ecc-03.txt).
2188 int field_size, outlen;
2189 void *(*kdf)(void *in, size_t inlen, void *out, size_t xoutlen);
2190 field_size = EC_GROUP_get_degree(ecdh_a[j]->group);
2191 if (field_size <= 24 * 8)
2193 outlen = KDF1_SHA1_len;
2198 outlen = (field_size+7)/8;
2201 secret_size_a = ECDH_compute_key(secret_a, outlen,
2204 secret_size_b = ECDH_compute_key(secret_b, outlen,
2207 if (secret_size_a != secret_size_b)
2212 for (secret_idx = 0;
2213 (secret_idx < secret_size_a)
2214 && (ecdh_checks == 1);
2217 if (secret_a[secret_idx] != secret_b[secret_idx])
2221 if (ecdh_checks == 0)
2223 BIO_printf(bio_err,"ECDH computations don't match.\n");
2224 ERR_print_errors(bio_err);
2228 pkey_print_message("","ecdh",
2230 test_curves_bits[j],
2233 for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2235 ECDH_compute_key(secret_a, outlen,
2240 BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2241 count, test_curves_bits[j], d);
2242 ecdh_results[j][0]=d/(double)count;
2250 /* if longer than 10s, don't do any more */
2251 for (j++; j<EC_NUM; j++)
2255 if (rnd_fake) RAND_cleanup();
2262 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
2263 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
2265 printf("%s ",BN_options());
2266 #ifndef OPENSSL_NO_MD2
2267 printf("%s ",MD2_options());
2269 #ifndef OPENSSL_NO_RC4
2270 printf("%s ",RC4_options());
2272 #ifndef OPENSSL_NO_DES
2273 printf("%s ",DES_options());
2275 #ifndef OPENSSL_NO_AES
2276 printf("%s ",AES_options());
2278 #ifndef OPENSSL_NO_IDEA
2279 printf("%s ",idea_options());
2281 #ifndef OPENSSL_NO_BF
2282 printf("%s ",BF_options());
2284 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2285 printf("available timing options: ");
2296 #define as_string(s) (#s)
2299 printf("HZ=%g", dbl);
2302 printf(" [sysconf value]");
2306 printf("timing function used: %s%s%s%s%s%s%s\n",
2307 (ftime_used ? "ftime" : ""),
2308 (ftime_used + times_used > 1 ? "," : ""),
2309 (times_used ? "times" : ""),
2310 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
2311 (gettimeofday_used ? "gettimeofday" : ""),
2312 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
2313 (getrusage_used ? "getrusage" : ""));
2319 fprintf(stdout,"+H");
2322 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
2323 fprintf(stdout,"type ");
2325 for (j=0; j<SIZE_NUM; j++)
2326 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
2327 fprintf(stdout,"\n");
2330 for (k=0; k<ALGOR_NUM; k++)
2332 if (!doit[k]) continue;
2334 fprintf(stdout,"+F:%d:%s",k,names[k]);
2336 fprintf(stdout,"%-13s",names[k]);
2337 for (j=0; j<SIZE_NUM; j++)
2339 if (results[k][j] > 10000 && !mr)
2340 fprintf(stdout," %11.2fk",results[k][j]/1e3);
2342 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
2344 fprintf(stdout,"\n");
2346 #ifndef OPENSSL_NO_RSA
2348 for (k=0; k<RSA_NUM; k++)
2350 if (!rsa_doit[k]) continue;
2353 printf("%18ssign verify sign/s verify/s\n"," ");
2357 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2358 k,rsa_bits[k],rsa_results[k][0],
2361 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2362 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2363 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
2366 #ifndef OPENSSL_NO_DSA
2368 for (k=0; k<DSA_NUM; k++)
2370 if (!dsa_doit[k]) continue;
2373 printf("%18ssign verify sign/s verify/s\n"," ");
2377 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2378 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2380 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2381 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2382 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
2385 #ifndef OPENSSL_NO_ECDSA
2387 for (k=0; k<EC_NUM; k++)
2389 if (!ecdsa_doit[k]) continue;
2392 printf("%30ssign verify sign/s verify/s\n"," ");
2397 fprintf(stdout,"+F4:%u:%u:%f:%f\n",
2398 k, test_curves_bits[k],
2399 ecdsa_results[k][0],ecdsa_results[k][1]);
2402 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2403 test_curves_bits[k],
2404 test_curves_names[k],
2405 ecdsa_results[k][0],ecdsa_results[k][1],
2406 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2411 #ifndef OPENSSL_NO_ECDH
2413 for (k=0; k<EC_NUM; k++)
2415 if (!ecdh_doit[k]) continue;
2418 printf("%30sop op/s\n"," ");
2422 fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2423 k, test_curves_bits[k],
2424 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2427 fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2428 test_curves_bits[k],
2429 test_curves_names[k],
2430 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2437 ERR_print_errors(bio_err);
2438 if (buf != NULL) OPENSSL_free(buf);
2439 if (buf2 != NULL) OPENSSL_free(buf2);
2440 #ifndef OPENSSL_NO_RSA
2441 for (i=0; i<RSA_NUM; i++)
2442 if (rsa_key[i] != NULL)
2443 RSA_free(rsa_key[i]);
2445 #ifndef OPENSSL_NO_DSA
2446 for (i=0; i<DSA_NUM; i++)
2447 if (dsa_key[i] != NULL)
2448 DSA_free(dsa_key[i]);
2451 #ifndef OPENSSL_NO_ECDSA
2452 for (i=0; i<EC_NUM; i++)
2453 if (ecdsa[i] != NULL)
2454 EC_KEY_free(ecdsa[i]);
2456 #ifndef OPENSSL_NO_ECDH
2457 for (i=0; i<EC_NUM; i++)
2459 if (ecdh_a[i] != NULL)
2460 EC_KEY_free(ecdh_a[i]);
2461 if (ecdh_b[i] != NULL)
2462 EC_KEY_free(ecdh_b[i]);
2470 static void print_message(const char *s, long num, int length)
2473 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2474 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
2475 (void)BIO_flush(bio_err);
2478 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2479 : "Doing %s %ld times on %d size blocks: ",s,num,length);
2480 (void)BIO_flush(bio_err);
2487 static void pkey_print_message(char *str, char *str2, long num, int bits,
2491 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2492 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
2493 (void)BIO_flush(bio_err);
2496 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2497 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
2498 (void)BIO_flush(bio_err);
2505 static void print_result(int alg,int run_no,int count,double time_used)
2507 BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n"
2508 : "%d %s's in %.2fs\n",count,names[alg],time_used);
2509 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2512 static char *sstrsep(char **string, const char *delim)
2515 char *token = *string;
2520 memset(isdelim, 0, sizeof isdelim);
2525 isdelim[(unsigned char)(*delim)] = 1;
2529 while (!isdelim[(unsigned char)(**string)])
2544 static int do_multi(int multi)
2549 static char sep[]=":";
2551 fds=malloc(multi*sizeof *fds);
2552 for(n=0 ; n < multi ; ++n)
2570 printf("Forked child %d\n",n);
2573 /* for now, assume the pipe is long enough to take all the output */
2574 for(n=0 ; n < multi ; ++n)
2580 f=fdopen(fds[n],"r");
2581 while(fgets(buf,sizeof buf,f))
2588 fprintf(stderr,"Don't understand line '%s' from child %d\n",
2592 printf("Got: %s from %d\n",buf,n);
2593 if(!strncmp(buf,"+F:",3))
2599 alg=atoi(sstrsep(&p,sep));
2601 for(j=0 ; j < SIZE_NUM ; ++j)
2602 results[alg][j]+=atof(sstrsep(&p,sep));
2604 else if(!strncmp(buf,"+F2:",4))
2610 k=atoi(sstrsep(&p,sep));
2613 d=atof(sstrsep(&p,sep));
2615 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2617 rsa_results[k][0]=d;
2619 d=atof(sstrsep(&p,sep));
2621 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2623 rsa_results[k][1]=d;
2625 else if(!strncmp(buf,"+F2:",4))
2631 k=atoi(sstrsep(&p,sep));
2634 d=atof(sstrsep(&p,sep));
2636 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2638 rsa_results[k][0]=d;
2640 d=atof(sstrsep(&p,sep));
2642 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2644 rsa_results[k][1]=d;
2646 else if(!strncmp(buf,"+F3:",4))
2652 k=atoi(sstrsep(&p,sep));
2655 d=atof(sstrsep(&p,sep));
2657 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2659 dsa_results[k][0]=d;
2661 d=atof(sstrsep(&p,sep));
2663 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2665 dsa_results[k][1]=d;
2667 #ifndef OPENSSL_NO_ECDSA
2668 else if(!strncmp(buf,"+F4:",4))
2674 k=atoi(sstrsep(&p,sep));
2677 d=atof(sstrsep(&p,sep));
2679 ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2681 ecdsa_results[k][0]=d;
2683 d=atof(sstrsep(&p,sep));
2685 ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2687 ecdsa_results[k][1]=d;
2691 #ifndef OPENSSL_NO_ECDH
2692 else if(!strncmp(buf,"+F5:",4))
2698 k=atoi(sstrsep(&p,sep));
2701 d=atof(sstrsep(&p,sep));
2703 ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2705 ecdh_results[k][0]=d;
2710 else if(!strncmp(buf,"+H:",3))
2714 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);