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.]
59 /* most of this code has been pilfered from my libdes speed.c program */
61 /* $DragonFly: src/secure/usr.bin/openssl/apps/Attic/speed.c,v 1.1 2004/02/05 04:22:22 rob Exp $
63 #ifndef OPENSSL_NO_SPEED
67 #define RSA_SECONDS 10
68 #define DSA_SECONDS 10
70 /* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
71 /* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
74 #define PROG speed_main
82 #ifdef OPENSSL_NO_STDIO
85 #include <openssl/crypto.h>
86 #include <openssl/rand.h>
87 #include <openssl/err.h>
88 #include <openssl/evp.h>
89 #include <openssl/objects.h>
90 #if !defined(OPENSSL_SYS_MSDOS)
91 #include OPENSSL_UNISTD
94 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX) || defined (__DragonFLY)
96 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
99 #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) && !defined (__DragonFly) /* FIXME */
107 # include <sys/types.h>
108 # include <sys/times.h>
111 # include <sys/time.h>
112 # include <sys/resource.h>
115 /* Depending on the VMS version, the tms structure is perhaps defined.
116 The __TMS macro will show if it was. If it wasn't defined, we should
117 undefine TIMES, since that tells the rest of the program how things
118 should be handled. -- Richard Levitte */
119 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
124 #include <sys/timeb.h>
127 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS)
128 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
131 #if defined(sun) || defined(__ultrix)
132 #define _POSIX_SOURCE
134 #include <sys/param.h>
137 #ifndef OPENSSL_NO_DES
138 #include <openssl/des.h>
140 #ifndef OPENSSL_NO_AES
141 #include <openssl/aes.h>
143 #ifndef OPENSSL_NO_MD2
144 #include <openssl/md2.h>
146 #ifndef OPENSSL_NO_MDC2
147 #include <openssl/mdc2.h>
149 #ifndef OPENSSL_NO_MD4
150 #include <openssl/md4.h>
152 #ifndef OPENSSL_NO_MD5
153 #include <openssl/md5.h>
155 #ifndef OPENSSL_NO_HMAC
156 #include <openssl/hmac.h>
158 #include <openssl/evp.h>
159 #ifndef OPENSSL_NO_SHA
160 #include <openssl/sha.h>
162 #ifndef OPENSSL_NO_RIPEMD
163 #include <openssl/ripemd.h>
165 #ifndef OPENSSL_NO_RC4
166 #include <openssl/rc4.h>
168 #ifndef OPENSSL_NO_RC5
169 #include <openssl/rc5.h>
171 #ifndef OPENSSL_NO_RC2
172 #include <openssl/rc2.h>
174 #ifndef OPENSSL_NO_IDEA
175 #include <openssl/idea.h>
177 #ifndef OPENSSL_NO_BF
178 #include <openssl/blowfish.h>
180 #ifndef OPENSSL_NO_CAST
181 #include <openssl/cast.h>
183 #ifndef OPENSSL_NO_RSA
184 #include <openssl/rsa.h>
185 #include "./testrsa.h"
187 #include <openssl/x509.h>
188 #ifndef OPENSSL_NO_DSA
189 #include "./testdsa.h"
192 /* The following if from times(3) man page. It may need to be changed */
194 # if defined(_SC_CLK_TCK) \
195 && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000)
196 # define HZ ((double)sysconf(_SC_CLK_TCK))
199 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
201 # else /* _BSD_CLK_TCK_ */
202 # define HZ ((double)_BSD_CLK_TCK_)
205 # define HZ ((double)CLK_TCK)
210 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
215 #define BUFSIZE ((long)1024*8+1)
218 static char ftime_used = 0, times_used = 0, gettimeofday_used = 1, getrusage_used = 0;
220 static int usertime=1;
222 static double Time_F(int s);
223 static void print_message(const char *s,long num,int length);
224 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
225 static void print_result(int alg,int run_no,int count,double time_used);
227 static int do_multi(int multi);
234 static const char *names[ALGOR_NUM]={
235 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
236 "des cbc","des ede3","idea cbc",
237 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
238 "aes-128 cbc","aes-192 cbc","aes-256 cbc"};
239 static double results[ALGOR_NUM][SIZE_NUM];
240 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
241 static double rsa_results[RSA_NUM][2];
242 static double dsa_results[DSA_NUM][2];
245 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
246 #define SIGRETTYPE void
248 #define SIGRETTYPE int
251 static SIGRETTYPE sig_done(int sig);
252 static SIGRETTYPE sig_done(int sig)
254 signal(SIGALRM,sig_done);
265 static double Time_F(int s)
272 static struct rusage tstart,tend;
277 getrusage(RUSAGE_SELF,&tstart);
284 getrusage(RUSAGE_SELF,&tend);
285 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
286 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
287 +((double)i)/1000000.0;
288 return((ret < 0.001)?0.001:ret);
293 static struct timeval tstart,tend;
296 gettimeofday_used = 1;
299 gettimeofday(&tstart,NULL);
304 gettimeofday(&tend,NULL);
305 i=(long)tend.tv_usec-(long)tstart.tv_usec;
306 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
307 return((ret < 0.001)?0.001:ret);
310 #else /* ndef USE_TOD */
315 static struct tms tstart,tend;
326 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
327 return((ret < 1e-3)?1e-3:ret);
330 # endif /* times() */
331 # if defined(TIMES) && defined(TIMEB)
334 # ifdef OPENSSL_SYS_VXWORKS
336 static unsigned long tick_start, tick_end;
340 tick_start = tickGet();
345 tick_end = tickGet();
346 ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
347 return((ret < 0.001)?0.001:ret);
350 # elif defined(TIMEB)
352 static struct timeb tstart,tend;
364 i=(long)tend.millitm-(long)tstart.millitm;
365 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
366 return((ret < 0.001)?0.001:ret);
373 int MAIN(int, char **);
375 int MAIN(int argc, char **argv)
377 #ifndef OPENSSL_NO_ENGINE
380 unsigned char *buf=NULL,*buf2=NULL;
382 long count=0,save_count=0;
384 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
387 #ifndef OPENSSL_NO_RSA
390 unsigned char md[EVP_MAX_MD_SIZE];
391 #ifndef OPENSSL_NO_MD2
392 unsigned char md2[MD2_DIGEST_LENGTH];
394 #ifndef OPENSSL_NO_MDC2
395 unsigned char mdc2[MDC2_DIGEST_LENGTH];
397 #ifndef OPENSSL_NO_MD4
398 unsigned char md4[MD4_DIGEST_LENGTH];
400 #ifndef OPENSSL_NO_MD5
401 unsigned char md5[MD5_DIGEST_LENGTH];
402 unsigned char hmac[MD5_DIGEST_LENGTH];
404 #ifndef OPENSSL_NO_SHA
405 unsigned char sha[SHA_DIGEST_LENGTH];
407 #ifndef OPENSSL_NO_RIPEMD
408 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
410 #ifndef OPENSSL_NO_RC4
413 #ifndef OPENSSL_NO_RC5
416 #ifndef OPENSSL_NO_RC2
419 #ifndef OPENSSL_NO_IDEA
420 IDEA_KEY_SCHEDULE idea_ks;
422 #ifndef OPENSSL_NO_BF
425 #ifndef OPENSSL_NO_CAST
428 static const unsigned char key16[16]=
429 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
430 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
431 static const unsigned char key24[24]=
432 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
433 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
434 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
435 static const unsigned char key32[32]=
436 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
437 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
438 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
439 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
440 #ifndef OPENSSL_NO_AES
441 #define MAX_BLOCK_SIZE 128
443 #define MAX_BLOCK_SIZE 64
445 unsigned char DES_iv[8];
446 unsigned char iv[MAX_BLOCK_SIZE/8];
447 #ifndef OPENSSL_NO_DES
448 DES_cblock *buf_as_des_cblock = NULL;
449 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
450 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
451 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
452 DES_key_schedule sch;
453 DES_key_schedule sch2;
454 DES_key_schedule sch3;
456 #ifndef OPENSSL_NO_AES
457 AES_KEY aes_ks1, aes_ks2, aes_ks3;
469 #define D_CBC_IDEA 10
473 #define D_CBC_CAST 14
474 #define D_CBC_128_AES 15
475 #define D_CBC_192_AES 16
476 #define D_CBC_256_AES 17
479 long c[ALGOR_NUM][SIZE_NUM];
487 #ifndef OPENSSL_NO_RSA
488 RSA *rsa_key[RSA_NUM];
489 long rsa_c[RSA_NUM][2];
490 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
491 static unsigned char *rsa_data[RSA_NUM]=
492 {test512,test1024,test2048,test4096};
493 static int rsa_data_length[RSA_NUM]={
494 sizeof(test512),sizeof(test1024),
495 sizeof(test2048),sizeof(test4096)};
497 #ifndef OPENSSL_NO_DSA
498 DSA *dsa_key[DSA_NUM];
499 long dsa_c[DSA_NUM][2];
500 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
502 int rsa_doit[RSA_NUM];
503 int dsa_doit[DSA_NUM];
506 const EVP_CIPHER *evp_cipher=NULL;
507 const EVP_MD *evp_md=NULL;
518 memset(results, 0, sizeof(results));
519 #ifndef OPENSSL_NO_DSA
520 memset(dsa_key,0,sizeof(dsa_key));
524 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
525 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
527 if (!load_config(bio_err, NULL))
530 #ifndef OPENSSL_NO_RSA
531 memset(rsa_key,0,sizeof(rsa_key));
532 for (i=0; i<RSA_NUM; i++)
536 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
538 BIO_printf(bio_err,"out of memory\n");
541 #ifndef OPENSSL_NO_DES
542 buf_as_des_cblock = (DES_cblock *)buf;
544 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
546 BIO_printf(bio_err,"out of memory\n");
550 memset(c,0,sizeof(c));
551 memset(DES_iv,0,sizeof(DES_iv));
552 memset(iv,0,sizeof(iv));
554 for (i=0; i<ALGOR_NUM; i++)
556 for (i=0; i<RSA_NUM; i++)
558 for (i=0; i<DSA_NUM; i++)
566 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
569 j--; /* Otherwise, -elapsed gets confused with
572 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
578 BIO_printf(bio_err,"no EVP given\n");
581 evp_cipher=EVP_get_cipherbyname(*argv);
584 evp_md=EVP_get_digestbyname(*argv);
586 if(!evp_cipher && !evp_md)
588 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
593 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
596 j--; /* Otherwise, -elapsed gets confused with
599 #ifndef OPENSSL_NO_ENGINE
600 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
606 BIO_printf(bio_err,"no engine given\n");
609 e = setup_engine(bio_err, *argv, 0);
610 /* j will be increased again further down. We just
611 don't want speed to confuse an engine with an
612 algorithm, especially when none is given (which
613 means all of them should be run) */
618 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
624 BIO_printf(bio_err,"no multi count given\n");
630 BIO_printf(bio_err,"bad multi count\n");
633 j--; /* Otherwise, -mr gets confused with
637 else if (argc > 0 && !strcmp(*argv,"-mr"))
640 j--; /* Otherwise, -mr gets confused with
644 #ifndef OPENSSL_NO_MD2
645 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
648 #ifndef OPENSSL_NO_MDC2
649 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
652 #ifndef OPENSSL_NO_MD4
653 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
656 #ifndef OPENSSL_NO_MD5
657 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
660 #ifndef OPENSSL_NO_MD5
661 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
664 #ifndef OPENSSL_NO_SHA
665 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
667 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
670 #ifndef OPENSSL_NO_RIPEMD
671 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
673 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
675 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
678 #ifndef OPENSSL_NO_RC4
679 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
682 #ifndef OPENSSL_NO_DES
683 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
684 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
687 #ifndef OPENSSL_NO_AES
688 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
689 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
690 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
693 #ifndef OPENSSL_NO_RSA
694 #if 0 /* was: #ifdef RSAref */
695 if (strcmp(*argv,"rsaref") == 0)
697 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
703 if (strcmp(*argv,"openssl") == 0)
705 RSA_set_default_method(RSA_PKCS1_SSLeay());
710 #endif /* !OPENSSL_NO_RSA */
711 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
712 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
713 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
714 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
715 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
716 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
717 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
719 #ifndef OPENSSL_NO_RC2
720 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
721 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
724 #ifndef OPENSSL_NO_RC5
725 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
726 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
729 #ifndef OPENSSL_NO_IDEA
730 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
731 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
734 #ifndef OPENSSL_NO_BF
735 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
736 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
737 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
740 #ifndef OPENSSL_NO_CAST
741 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
742 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
743 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
746 #ifndef OPENSSL_NO_DES
747 if (strcmp(*argv,"des") == 0)
754 #ifndef OPENSSL_NO_AES
755 if (strcmp(*argv,"aes") == 0)
757 doit[D_CBC_128_AES]=1;
758 doit[D_CBC_192_AES]=1;
759 doit[D_CBC_256_AES]=1;
763 #ifndef OPENSSL_NO_RSA
764 if (strcmp(*argv,"rsa") == 0)
766 rsa_doit[R_RSA_512]=1;
767 rsa_doit[R_RSA_1024]=1;
768 rsa_doit[R_RSA_2048]=1;
769 rsa_doit[R_RSA_4096]=1;
773 #ifndef OPENSSL_NO_DSA
774 if (strcmp(*argv,"dsa") == 0)
776 dsa_doit[R_DSA_512]=1;
777 dsa_doit[R_DSA_1024]=1;
782 BIO_printf(bio_err,"Error: bad option or value\n");
783 BIO_printf(bio_err,"\n");
784 BIO_printf(bio_err,"Available values:\n");
785 #ifndef OPENSSL_NO_MD2
786 BIO_printf(bio_err,"md2 ");
788 #ifndef OPENSSL_NO_MDC2
789 BIO_printf(bio_err,"mdc2 ");
791 #ifndef OPENSSL_NO_MD4
792 BIO_printf(bio_err,"md4 ");
794 #ifndef OPENSSL_NO_MD5
795 BIO_printf(bio_err,"md5 ");
796 #ifndef OPENSSL_NO_HMAC
797 BIO_printf(bio_err,"hmac ");
800 #ifndef OPENSSL_NO_SHA1
801 BIO_printf(bio_err,"sha1 ");
803 #ifndef OPENSSL_NO_RIPEMD160
804 BIO_printf(bio_err,"rmd160");
806 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
807 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
808 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
809 BIO_printf(bio_err,"\n");
812 #ifndef OPENSSL_NO_IDEA
813 BIO_printf(bio_err,"idea-cbc ");
815 #ifndef OPENSSL_NO_RC2
816 BIO_printf(bio_err,"rc2-cbc ");
818 #ifndef OPENSSL_NO_RC5
819 BIO_printf(bio_err,"rc5-cbc ");
821 #ifndef OPENSSL_NO_BF
822 BIO_printf(bio_err,"bf-cbc");
824 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
825 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
826 BIO_printf(bio_err,"\n");
828 #ifndef OPENSSL_NO_DES
829 BIO_printf(bio_err,"des-cbc des-ede3 ");
831 #ifndef OPENSSL_NO_AES
832 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
834 #ifndef OPENSSL_NO_RC4
835 BIO_printf(bio_err,"rc4");
837 BIO_printf(bio_err,"\n");
839 #ifndef OPENSSL_NO_RSA
840 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
843 #ifndef OPENSSL_NO_DSA
844 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
847 #ifndef OPENSSL_NO_IDEA
848 BIO_printf(bio_err,"idea ");
850 #ifndef OPENSSL_NO_RC2
851 BIO_printf(bio_err,"rc2 ");
853 #ifndef OPENSSL_NO_DES
854 BIO_printf(bio_err,"des ");
856 #ifndef OPENSSL_NO_AES
857 BIO_printf(bio_err,"aes ");
859 #ifndef OPENSSL_NO_RSA
860 BIO_printf(bio_err,"rsa ");
862 #ifndef OPENSSL_NO_BF
863 BIO_printf(bio_err,"blowfish");
865 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
866 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
867 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
868 BIO_printf(bio_err,"\n");
871 BIO_printf(bio_err,"\n");
872 BIO_printf(bio_err,"Available options:\n");
873 #if defined(TIMES) || defined(USE_TOD)
874 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
876 #ifndef OPENSSL_NO_ENGINE
877 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
879 BIO_printf(bio_err,"-evp e use EVP e.\n");
880 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
881 BIO_printf(bio_err,"-mr produce machine readable output.\n");
883 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
893 if(multi && do_multi(multi))
899 for (i=0; i<ALGOR_NUM; i++)
904 for (i=0; i<RSA_NUM; i++)
906 for (i=0; i<DSA_NUM; i++)
909 for (i=0; i<ALGOR_NUM; i++)
910 if (doit[i]) pr_header++;
912 if (usertime == 0 && !mr)
913 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
914 if (usertime <= 0 && !mr)
916 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
917 BIO_printf(bio_err,"program when this computer is idle.\n");
920 #ifndef OPENSSL_NO_RSA
921 for (i=0; i<RSA_NUM; i++)
923 const unsigned char *p;
926 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
927 if (rsa_key[i] == NULL)
929 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
935 BIO_printf(bio_err,mr ? "+RK:%d:"
936 : "Loaded RSA key, %d bit modulus and e= 0x",
937 BN_num_bits(rsa_key[i]->n));
938 BN_print(bio_err,rsa_key[i]->e);
939 BIO_printf(bio_err,"\n");
945 #ifndef OPENSSL_NO_DSA
946 dsa_key[0]=get_dsa512();
947 dsa_key[1]=get_dsa1024();
948 dsa_key[2]=get_dsa2048();
951 #ifndef OPENSSL_NO_DES
952 DES_set_key_unchecked(&key,&sch);
953 DES_set_key_unchecked(&key2,&sch2);
954 DES_set_key_unchecked(&key3,&sch3);
956 #ifndef OPENSSL_NO_AES
957 AES_set_encrypt_key(key16,128,&aes_ks1);
958 AES_set_encrypt_key(key24,192,&aes_ks2);
959 AES_set_encrypt_key(key32,256,&aes_ks3);
961 #ifndef OPENSSL_NO_IDEA
962 idea_set_encrypt_key(key16,&idea_ks);
964 #ifndef OPENSSL_NO_RC4
965 RC4_set_key(&rc4_ks,16,key16);
967 #ifndef OPENSSL_NO_RC2
968 RC2_set_key(&rc2_ks,16,key16,128);
970 #ifndef OPENSSL_NO_RC5
971 RC5_32_set_key(&rc5_ks,16,key16,12);
973 #ifndef OPENSSL_NO_BF
974 BF_set_key(&bf_ks,16,key16);
976 #ifndef OPENSSL_NO_CAST
977 CAST_set_key(&cast_ks,16,key16);
979 #ifndef OPENSSL_NO_RSA
980 memset(rsa_c,0,sizeof(rsa_c));
983 #ifndef OPENSSL_NO_DES
984 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
990 for (i=count; i; i--)
991 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
996 c[D_MD2][0]=count/10;
997 c[D_MDC2][0]=count/10;
1002 c[D_RMD160][0]=count;
1003 c[D_RC4][0]=count*5;
1004 c[D_CBC_DES][0]=count;
1005 c[D_EDE3_DES][0]=count/3;
1006 c[D_CBC_IDEA][0]=count;
1007 c[D_CBC_RC2][0]=count;
1008 c[D_CBC_RC5][0]=count;
1009 c[D_CBC_BF][0]=count;
1010 c[D_CBC_CAST][0]=count;
1012 for (i=1; i<SIZE_NUM; i++)
1014 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1015 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1016 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1017 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1018 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1019 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1020 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1022 for (i=1; i<SIZE_NUM; i++)
1026 l0=(long)lengths[i-1];
1027 l1=(long)lengths[i];
1028 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1029 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1030 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1031 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1032 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1033 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1034 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1035 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1037 #ifndef OPENSSL_NO_RSA
1038 rsa_c[R_RSA_512][0]=count/2000;
1039 rsa_c[R_RSA_512][1]=count/400;
1040 for (i=1; i<RSA_NUM; i++)
1042 rsa_c[i][0]=rsa_c[i-1][0]/8;
1043 rsa_c[i][1]=rsa_c[i-1][1]/4;
1044 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1048 if (rsa_c[i][0] == 0)
1057 #ifndef OPENSSL_NO_DSA
1058 dsa_c[R_DSA_512][0]=count/1000;
1059 dsa_c[R_DSA_512][1]=count/1000/2;
1060 for (i=1; i<DSA_NUM; i++)
1062 dsa_c[i][0]=dsa_c[i-1][0]/4;
1063 dsa_c[i][1]=dsa_c[i-1][1]/4;
1064 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1077 #define COND(d) (count < (d))
1078 #define COUNT(d) (d)
1080 /* not worth fixing */
1081 # error "You cannot disable DES on systems without SIGALRM."
1082 #endif /* OPENSSL_NO_DES */
1084 #define COND(c) (run)
1085 #define COUNT(d) (count)
1086 signal(SIGALRM,sig_done);
1087 #endif /* SIGALRM */
1089 #ifndef OPENSSL_NO_MD2
1092 for (j=0; j<SIZE_NUM; j++)
1094 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1096 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1097 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1099 print_result(D_MD2,j,count,d);
1103 #ifndef OPENSSL_NO_MDC2
1106 for (j=0; j<SIZE_NUM; j++)
1108 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1110 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1111 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1113 print_result(D_MDC2,j,count,d);
1118 #ifndef OPENSSL_NO_MD4
1121 for (j=0; j<SIZE_NUM; j++)
1123 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1125 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1126 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1128 print_result(D_MD4,j,count,d);
1133 #ifndef OPENSSL_NO_MD5
1136 for (j=0; j<SIZE_NUM; j++)
1138 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1140 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1141 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1143 print_result(D_MD5,j,count,d);
1148 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1153 HMAC_CTX_init(&hctx);
1154 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1155 16,EVP_md5(), NULL);
1157 for (j=0; j<SIZE_NUM; j++)
1159 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1161 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1163 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1164 HMAC_Update(&hctx,buf,lengths[j]);
1165 HMAC_Final(&hctx,&(hmac[0]),NULL);
1168 print_result(D_HMAC,j,count,d);
1170 HMAC_CTX_cleanup(&hctx);
1173 #ifndef OPENSSL_NO_SHA
1176 for (j=0; j<SIZE_NUM; j++)
1178 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1180 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1181 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1183 print_result(D_SHA1,j,count,d);
1187 #ifndef OPENSSL_NO_RIPEMD
1190 for (j=0; j<SIZE_NUM; j++)
1192 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1194 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1195 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1197 print_result(D_RMD160,j,count,d);
1201 #ifndef OPENSSL_NO_RC4
1204 for (j=0; j<SIZE_NUM; j++)
1206 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1208 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1209 RC4(&rc4_ks,(unsigned int)lengths[j],
1212 print_result(D_RC4,j,count,d);
1216 #ifndef OPENSSL_NO_DES
1217 if (doit[D_CBC_DES])
1219 for (j=0; j<SIZE_NUM; j++)
1221 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1223 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1224 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1225 &DES_iv,DES_ENCRYPT);
1227 print_result(D_CBC_DES,j,count,d);
1231 if (doit[D_EDE3_DES])
1233 for (j=0; j<SIZE_NUM; j++)
1235 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1237 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1238 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1240 &DES_iv,DES_ENCRYPT);
1242 print_result(D_EDE3_DES,j,count,d);
1246 #ifndef OPENSSL_NO_AES
1247 if (doit[D_CBC_128_AES])
1249 for (j=0; j<SIZE_NUM; j++)
1251 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1253 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1254 AES_cbc_encrypt(buf,buf,
1255 (unsigned long)lengths[j],&aes_ks1,
1258 print_result(D_CBC_128_AES,j,count,d);
1261 if (doit[D_CBC_192_AES])
1263 for (j=0; j<SIZE_NUM; j++)
1265 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1267 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1268 AES_cbc_encrypt(buf,buf,
1269 (unsigned long)lengths[j],&aes_ks2,
1272 print_result(D_CBC_192_AES,j,count,d);
1275 if (doit[D_CBC_256_AES])
1277 for (j=0; j<SIZE_NUM; j++)
1279 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1281 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1282 AES_cbc_encrypt(buf,buf,
1283 (unsigned long)lengths[j],&aes_ks3,
1286 print_result(D_CBC_256_AES,j,count,d);
1291 #ifndef OPENSSL_NO_IDEA
1292 if (doit[D_CBC_IDEA])
1294 for (j=0; j<SIZE_NUM; j++)
1296 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1298 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1299 idea_cbc_encrypt(buf,buf,
1300 (unsigned long)lengths[j],&idea_ks,
1303 print_result(D_CBC_IDEA,j,count,d);
1307 #ifndef OPENSSL_NO_RC2
1308 if (doit[D_CBC_RC2])
1310 for (j=0; j<SIZE_NUM; j++)
1312 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1314 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1315 RC2_cbc_encrypt(buf,buf,
1316 (unsigned long)lengths[j],&rc2_ks,
1319 print_result(D_CBC_RC2,j,count,d);
1323 #ifndef OPENSSL_NO_RC5
1324 if (doit[D_CBC_RC5])
1326 for (j=0; j<SIZE_NUM; j++)
1328 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1330 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1331 RC5_32_cbc_encrypt(buf,buf,
1332 (unsigned long)lengths[j],&rc5_ks,
1335 print_result(D_CBC_RC5,j,count,d);
1339 #ifndef OPENSSL_NO_BF
1342 for (j=0; j<SIZE_NUM; j++)
1344 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1346 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1347 BF_cbc_encrypt(buf,buf,
1348 (unsigned long)lengths[j],&bf_ks,
1351 print_result(D_CBC_BF,j,count,d);
1355 #ifndef OPENSSL_NO_CAST
1356 if (doit[D_CBC_CAST])
1358 for (j=0; j<SIZE_NUM; j++)
1360 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1362 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1363 CAST_cbc_encrypt(buf,buf,
1364 (unsigned long)lengths[j],&cast_ks,
1367 print_result(D_CBC_CAST,j,count,d);
1374 for (j=0; j<SIZE_NUM; j++)
1381 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1382 /* -O3 -fschedule-insns messes up an
1383 * optimization here! names[D_EVP]
1384 * somehow becomes NULL */
1385 print_message(names[D_EVP],save_count,
1388 EVP_CIPHER_CTX_init(&ctx);
1390 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1392 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1396 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1397 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1399 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1400 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1402 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1404 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1406 EVP_CIPHER_CTX_cleanup(&ctx);
1410 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1411 print_message(names[D_EVP],save_count,
1415 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1416 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1420 print_result(D_EVP,j,count,d);
1424 RAND_pseudo_bytes(buf,36);
1425 #ifndef OPENSSL_NO_RSA
1426 for (j=0; j<RSA_NUM; j++)
1429 if (!rsa_doit[j]) continue;
1430 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1433 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1434 ERR_print_errors(bio_err);
1439 pkey_print_message("private","rsa",
1440 rsa_c[j][0],rsa_bits[j],
1442 /* RSA_blinding_on(rsa_key[j],NULL); */
1444 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1446 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1447 &rsa_num, rsa_key[j]);
1451 "RSA sign failure\n");
1452 ERR_print_errors(bio_err);
1458 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1459 : "%ld %d bit private RSA's in %.2fs\n",
1460 count,rsa_bits[j],d);
1461 rsa_results[j][0]=d/(double)count;
1466 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1469 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1470 ERR_print_errors(bio_err);
1475 pkey_print_message("public","rsa",
1476 rsa_c[j][1],rsa_bits[j],
1479 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1481 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1482 rsa_num, rsa_key[j]);
1486 "RSA verify failure\n");
1487 ERR_print_errors(bio_err);
1493 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1494 : "%ld %d bit public RSA's in %.2fs\n",
1495 count,rsa_bits[j],d);
1496 rsa_results[j][1]=d/(double)count;
1502 /* if longer than 10s, don't do any more */
1503 for (j++; j<RSA_NUM; j++)
1509 RAND_pseudo_bytes(buf,20);
1510 #ifndef OPENSSL_NO_DSA
1511 if (RAND_status() != 1)
1513 RAND_seed(rnd_seed, sizeof rnd_seed);
1516 for (j=0; j<DSA_NUM; j++)
1521 if (!dsa_doit[j]) continue;
1522 /* DSA_generate_key(dsa_key[j]); */
1523 /* DSA_sign_setup(dsa_key[j],NULL); */
1524 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1528 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1529 ERR_print_errors(bio_err);
1534 pkey_print_message("sign","dsa",
1535 dsa_c[j][0],dsa_bits[j],
1538 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1540 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1545 "DSA sign failure\n");
1546 ERR_print_errors(bio_err);
1552 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1553 : "%ld %d bit DSA signs in %.2fs\n",
1554 count,dsa_bits[j],d);
1555 dsa_results[j][0]=d/(double)count;
1559 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1563 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1564 ERR_print_errors(bio_err);
1569 pkey_print_message("verify","dsa",
1570 dsa_c[j][1],dsa_bits[j],
1573 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1575 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1580 "DSA verify failure\n");
1581 ERR_print_errors(bio_err);
1587 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1588 : "%ld %d bit DSA verify in %.2fs\n",
1589 count,dsa_bits[j],d);
1590 dsa_results[j][1]=d/(double)count;
1595 /* if longer than 10s, don't do any more */
1596 for (j++; j<DSA_NUM; j++)
1600 if (rnd_fake) RAND_cleanup();
1607 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1608 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1610 printf("%s ",BN_options());
1611 #ifndef OPENSSL_NO_MD2
1612 printf("%s ",MD2_options());
1614 #ifndef OPENSSL_NO_RC4
1615 printf("%s ",RC4_options());
1617 #ifndef OPENSSL_NO_DES
1618 printf("%s ",DES_options());
1620 #ifndef OPENSSL_NO_AES
1621 printf("%s ",AES_options());
1623 #ifndef OPENSSL_NO_IDEA
1624 printf("%s ",idea_options());
1626 #ifndef OPENSSL_NO_BF
1627 printf("%s ",BF_options());
1629 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1630 printf("available timing options: ");
1641 #define as_string(s) (#s)
1642 printf("HZ=%g", (double)HZ);
1644 printf(" [sysconf value]");
1648 printf("timing function used: %s%s%s%s%s%s%s\n",
1649 (ftime_used ? "ftime" : ""),
1650 (ftime_used + times_used > 1 ? "," : ""),
1651 (times_used ? "times" : ""),
1652 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1653 (gettimeofday_used ? "gettimeofday" : ""),
1654 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1655 (getrusage_used ? "getrusage" : ""));
1661 fprintf(stdout,"+H");
1664 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1665 fprintf(stdout,"type ");
1667 for (j=0; j<SIZE_NUM; j++)
1668 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1669 fprintf(stdout,"\n");
1672 for (k=0; k<ALGOR_NUM; k++)
1674 if (!doit[k]) continue;
1676 fprintf(stdout,"+F:%d:%s",k,names[k]);
1678 fprintf(stdout,"%-13s",names[k]);
1679 for (j=0; j<SIZE_NUM; j++)
1681 if (results[k][j] > 10000 && !mr)
1682 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1684 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1686 fprintf(stdout,"\n");
1688 #ifndef OPENSSL_NO_RSA
1690 for (k=0; k<RSA_NUM; k++)
1692 if (!rsa_doit[k]) continue;
1695 printf("%18ssign verify sign/s verify/s\n"," ");
1699 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1700 k,rsa_bits[k],rsa_results[k][0],
1703 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1704 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1705 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1708 #ifndef OPENSSL_NO_DSA
1710 for (k=0; k<DSA_NUM; k++)
1712 if (!dsa_doit[k]) continue;
1715 printf("%18ssign verify sign/s verify/s\n"," ");
1719 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1720 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1722 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1723 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1724 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1729 ERR_print_errors(bio_err);
1730 if (buf != NULL) OPENSSL_free(buf);
1731 if (buf2 != NULL) OPENSSL_free(buf2);
1732 #ifndef OPENSSL_NO_RSA
1733 for (i=0; i<RSA_NUM; i++)
1734 if (rsa_key[i] != NULL)
1735 RSA_free(rsa_key[i]);
1737 #ifndef OPENSSL_NO_DSA
1738 for (i=0; i<DSA_NUM; i++)
1739 if (dsa_key[i] != NULL)
1740 DSA_free(dsa_key[i]);
1746 static void print_message(const char *s, long num, int length)
1749 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1750 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1751 (void)BIO_flush(bio_err);
1754 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1755 : "Doing %s %ld times on %d size blocks: ",s,num,length);
1756 (void)BIO_flush(bio_err);
1763 static void pkey_print_message(char *str, char *str2, long num, int bits,
1767 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1768 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1769 (void)BIO_flush(bio_err);
1772 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1773 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1774 (void)BIO_flush(bio_err);
1781 static void print_result(int alg,int run_no,int count,double time_used)
1783 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1784 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1785 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1788 static char *sstrsep(char **string, const char *delim)
1791 char *token = *string;
1796 memset(isdelim, 0, sizeof isdelim);
1801 isdelim[(unsigned char)(*delim)] = 1;
1805 while (!isdelim[(unsigned char)(**string)])
1820 static int do_multi(int multi)
1825 static char sep[]=":";
1827 fds=malloc(multi*sizeof *fds);
1828 for(n=0 ; n < multi ; ++n)
1846 printf("Forked child %d\n",n);
1849 /* for now, assume the pipe is long enough to take all the output */
1850 for(n=0 ; n < multi ; ++n)
1856 f=fdopen(fds[n],"r");
1857 while(fgets(buf,sizeof buf,f))
1864 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1868 printf("Got: %s from %d\n",buf,n);
1869 if(!strncmp(buf,"+F:",3))
1875 alg=atoi(sstrsep(&p,sep));
1877 for(j=0 ; j < SIZE_NUM ; ++j)
1878 results[alg][j]+=atof(sstrsep(&p,sep));
1880 else if(!strncmp(buf,"+F2:",4))
1886 k=atoi(sstrsep(&p,sep));
1889 d=atof(sstrsep(&p,sep));
1891 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1893 rsa_results[k][0]=d;
1895 d=atof(sstrsep(&p,sep));
1897 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1899 rsa_results[k][1]=d;
1901 else if(!strncmp(buf,"+F2:",4))
1907 k=atoi(sstrsep(&p,sep));
1910 d=atof(sstrsep(&p,sep));
1912 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1914 rsa_results[k][0]=d;
1916 d=atof(sstrsep(&p,sep));
1918 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1920 rsa_results[k][1]=d;
1922 else if(!strncmp(buf,"+F3:",4))
1928 k=atoi(sstrsep(&p,sep));
1931 d=atof(sstrsep(&p,sep));
1933 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1935 dsa_results[k][0]=d;
1937 d=atof(sstrsep(&p,sep));
1939 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1941 dsa_results[k][1]=d;
1943 else if(!strncmp(buf,"+H:",3))
1947 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);