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 */
63 #define RSA_SECONDS 10
64 #define DSA_SECONDS 10
66 /* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
67 /* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
70 #define PROG speed_main
78 #ifdef OPENSSL_NO_STDIO
81 #include <openssl/crypto.h>
82 #include <openssl/rand.h>
83 #include <openssl/err.h>
84 #include <openssl/evp.h>
85 #include <openssl/objects.h>
86 #if !defined(OPENSSL_SYS_MSDOS)
87 #include OPENSSL_UNISTD
90 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
92 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
95 #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 */
103 # include <sys/types.h>
104 # include <sys/times.h>
107 # include <sys/time.h>
108 # include <sys/resource.h>
111 /* Depending on the VMS version, the tms structure is perhaps defined.
112 The __TMS macro will show if it was. If it wasn't defined, we should
113 undefine TIMES, since that tells the rest of the program how things
114 should be handled. -- Richard Levitte */
115 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
120 #include <sys/timeb.h>
123 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS)
124 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
127 #if defined(sun) || defined(__ultrix)
128 #define _POSIX_SOURCE
130 #include <sys/param.h>
133 #ifndef OPENSSL_NO_DES
134 #include <openssl/des.h>
136 #ifndef OPENSSL_NO_AES
137 #include <openssl/aes.h>
139 #ifndef OPENSSL_NO_MD2
140 #include <openssl/md2.h>
142 #ifndef OPENSSL_NO_MDC2
143 #include <openssl/mdc2.h>
145 #ifndef OPENSSL_NO_MD4
146 #include <openssl/md4.h>
148 #ifndef OPENSSL_NO_MD5
149 #include <openssl/md5.h>
151 #ifndef OPENSSL_NO_HMAC
152 #include <openssl/hmac.h>
154 #include <openssl/evp.h>
155 #ifndef OPENSSL_NO_SHA
156 #include <openssl/sha.h>
158 #ifndef OPENSSL_NO_RIPEMD
159 #include <openssl/ripemd.h>
161 #ifndef OPENSSL_NO_RC4
162 #include <openssl/rc4.h>
164 #ifndef OPENSSL_NO_RC5
165 #include <openssl/rc5.h>
167 #ifndef OPENSSL_NO_RC2
168 #include <openssl/rc2.h>
170 #ifndef OPENSSL_NO_IDEA
171 #include <openssl/idea.h>
173 #ifndef OPENSSL_NO_BF
174 #include <openssl/blowfish.h>
176 #ifndef OPENSSL_NO_CAST
177 #include <openssl/cast.h>
179 #ifndef OPENSSL_NO_RSA
180 #include <openssl/rsa.h>
181 #include "./testrsa.h"
183 #include <openssl/x509.h>
184 #ifndef OPENSSL_NO_DSA
185 #include "./testdsa.h"
188 /* The following if from times(3) man page. It may need to be changed */
190 # if defined(_SC_CLK_TCK) \
191 && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000)
192 # define HZ ((double)sysconf(_SC_CLK_TCK))
195 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
197 # else /* _BSD_CLK_TCK_ */
198 # define HZ ((double)_BSD_CLK_TCK_)
201 # define HZ ((double)CLK_TCK)
206 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
211 #define BUFSIZE ((long)1024*8+1)
214 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
216 static int usertime=1;
218 static double Time_F(int s);
219 static void print_message(const char *s,long num,int length);
220 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
221 static void print_result(int alg,int run_no,int count,double time_used);
223 static int do_multi(int multi);
230 static const char *names[ALGOR_NUM]={
231 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
232 "des cbc","des ede3","idea cbc",
233 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
234 "aes-128 cbc","aes-192 cbc","aes-256 cbc"};
235 static double results[ALGOR_NUM][SIZE_NUM];
236 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
237 static double rsa_results[RSA_NUM][2];
238 static double dsa_results[DSA_NUM][2];
241 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
242 #define SIGRETTYPE void
244 #define SIGRETTYPE int
247 static SIGRETTYPE sig_done(int sig);
248 static SIGRETTYPE sig_done(int sig)
250 signal(SIGALRM,sig_done);
261 static double Time_F(int s)
268 static struct rusage tstart,tend;
273 getrusage(RUSAGE_SELF,&tstart);
280 getrusage(RUSAGE_SELF,&tend);
281 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
282 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
283 +((double)i)/1000000.0;
284 return((ret < 0.001)?0.001:ret);
289 static struct timeval tstart,tend;
292 gettimeofday_used = 1;
295 gettimeofday(&tstart,NULL);
300 gettimeofday(&tend,NULL);
301 i=(long)tend.tv_usec-(long)tstart.tv_usec;
302 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
303 return((ret < 0.001)?0.001:ret);
306 #else /* ndef USE_TOD */
311 static struct tms tstart,tend;
322 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
323 return((ret < 1e-3)?1e-3:ret);
326 # endif /* times() */
327 # if defined(TIMES) && defined(TIMEB)
330 # ifdef OPENSSL_SYS_VXWORKS
332 static unsigned long tick_start, tick_end;
336 tick_start = tickGet();
341 tick_end = tickGet();
342 ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
343 return((ret < 0.001)?0.001:ret);
346 # elif defined(TIMEB)
348 static struct timeb tstart,tend;
360 i=(long)tend.millitm-(long)tstart.millitm;
361 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
362 return((ret < 0.001)?0.001:ret);
369 int MAIN(int, char **);
371 int MAIN(int argc, char **argv)
374 unsigned char *buf=NULL,*buf2=NULL;
376 long count=0,save_count=0;
378 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
381 #ifndef OPENSSL_NO_RSA
384 unsigned char md[EVP_MAX_MD_SIZE];
385 #ifndef OPENSSL_NO_MD2
386 unsigned char md2[MD2_DIGEST_LENGTH];
388 #ifndef OPENSSL_NO_MDC2
389 unsigned char mdc2[MDC2_DIGEST_LENGTH];
391 #ifndef OPENSSL_NO_MD4
392 unsigned char md4[MD4_DIGEST_LENGTH];
394 #ifndef OPENSSL_NO_MD5
395 unsigned char md5[MD5_DIGEST_LENGTH];
396 unsigned char hmac[MD5_DIGEST_LENGTH];
398 #ifndef OPENSSL_NO_SHA
399 unsigned char sha[SHA_DIGEST_LENGTH];
401 #ifndef OPENSSL_NO_RIPEMD
402 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
404 #ifndef OPENSSL_NO_RC4
407 #ifndef OPENSSL_NO_RC5
410 #ifndef OPENSSL_NO_RC2
413 #ifndef OPENSSL_NO_IDEA
414 IDEA_KEY_SCHEDULE idea_ks;
416 #ifndef OPENSSL_NO_BF
419 #ifndef OPENSSL_NO_CAST
422 static const unsigned char key16[16]=
423 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
424 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
425 static const unsigned char key24[24]=
426 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
427 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
428 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
429 static const unsigned char key32[32]=
430 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
431 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
432 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
433 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
434 #ifndef OPENSSL_NO_AES
435 #define MAX_BLOCK_SIZE 128
437 #define MAX_BLOCK_SIZE 64
439 unsigned char DES_iv[8];
440 unsigned char iv[MAX_BLOCK_SIZE/8];
441 #ifndef OPENSSL_NO_DES
442 DES_cblock *buf_as_des_cblock = NULL;
443 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
444 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
445 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
446 DES_key_schedule sch;
447 DES_key_schedule sch2;
448 DES_key_schedule sch3;
450 #ifndef OPENSSL_NO_AES
451 AES_KEY aes_ks1, aes_ks2, aes_ks3;
463 #define D_CBC_IDEA 10
467 #define D_CBC_CAST 14
468 #define D_CBC_128_AES 15
469 #define D_CBC_192_AES 16
470 #define D_CBC_256_AES 17
473 long c[ALGOR_NUM][SIZE_NUM];
481 #ifndef OPENSSL_NO_RSA
482 RSA *rsa_key[RSA_NUM];
483 long rsa_c[RSA_NUM][2];
484 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
485 static unsigned char *rsa_data[RSA_NUM]=
486 {test512,test1024,test2048,test4096};
487 static int rsa_data_length[RSA_NUM]={
488 sizeof(test512),sizeof(test1024),
489 sizeof(test2048),sizeof(test4096)};
491 #ifndef OPENSSL_NO_DSA
492 DSA *dsa_key[DSA_NUM];
493 long dsa_c[DSA_NUM][2];
494 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
496 int rsa_doit[RSA_NUM];
497 int dsa_doit[DSA_NUM];
500 const EVP_CIPHER *evp_cipher=NULL;
501 const EVP_MD *evp_md=NULL;
512 memset(results, 0, sizeof(results));
513 #ifndef OPENSSL_NO_DSA
514 memset(dsa_key,0,sizeof(dsa_key));
518 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
519 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
521 if (!load_config(bio_err, NULL))
524 #ifndef OPENSSL_NO_RSA
525 memset(rsa_key,0,sizeof(rsa_key));
526 for (i=0; i<RSA_NUM; i++)
530 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
532 BIO_printf(bio_err,"out of memory\n");
535 #ifndef OPENSSL_NO_DES
536 buf_as_des_cblock = (DES_cblock *)buf;
538 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
540 BIO_printf(bio_err,"out of memory\n");
544 memset(c,0,sizeof(c));
545 memset(DES_iv,0,sizeof(DES_iv));
546 memset(iv,0,sizeof(iv));
548 for (i=0; i<ALGOR_NUM; i++)
550 for (i=0; i<RSA_NUM; i++)
552 for (i=0; i<DSA_NUM; i++)
560 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
563 j--; /* Otherwise, -elapsed gets confused with
566 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
572 BIO_printf(bio_err,"no EVP given\n");
575 evp_cipher=EVP_get_cipherbyname(*argv);
578 evp_md=EVP_get_digestbyname(*argv);
580 if(!evp_cipher && !evp_md)
582 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
587 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
590 j--; /* Otherwise, -elapsed gets confused with
593 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
599 BIO_printf(bio_err,"no engine given\n");
602 e = setup_engine(bio_err, *argv, 0);
603 /* j will be increased again further down. We just
604 don't want speed to confuse an engine with an
605 algorithm, especially when none is given (which
606 means all of them should be run) */
610 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
616 BIO_printf(bio_err,"no multi count given\n");
622 BIO_printf(bio_err,"bad multi count\n");
625 j--; /* Otherwise, -mr gets confused with
629 else if (argc > 0 && !strcmp(*argv,"-mr"))
632 j--; /* Otherwise, -mr gets confused with
636 #ifndef OPENSSL_NO_MD2
637 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
640 #ifndef OPENSSL_NO_MDC2
641 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
644 #ifndef OPENSSL_NO_MD4
645 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
648 #ifndef OPENSSL_NO_MD5
649 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
652 #ifndef OPENSSL_NO_MD5
653 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
656 #ifndef OPENSSL_NO_SHA
657 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
659 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
662 #ifndef OPENSSL_NO_RIPEMD
663 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
665 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
667 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
670 #ifndef OPENSSL_NO_RC4
671 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
674 #ifndef OPENSSL_NO_DES
675 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
676 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
679 #ifndef OPENSSL_NO_AES
680 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
681 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
682 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
685 #ifndef OPENSSL_NO_RSA
686 #if 0 /* was: #ifdef RSAref */
687 if (strcmp(*argv,"rsaref") == 0)
689 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
695 if (strcmp(*argv,"openssl") == 0)
697 RSA_set_default_method(RSA_PKCS1_SSLeay());
702 #endif /* !OPENSSL_NO_RSA */
703 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
704 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
705 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
706 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
707 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
708 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
709 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
711 #ifndef OPENSSL_NO_RC2
712 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
713 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
716 #ifndef OPENSSL_NO_RC5
717 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
718 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
721 #ifndef OPENSSL_NO_IDEA
722 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
723 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
726 #ifndef OPENSSL_NO_BF
727 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
728 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
729 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
732 #ifndef OPENSSL_NO_CAST
733 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
734 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
735 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
738 #ifndef OPENSSL_NO_DES
739 if (strcmp(*argv,"des") == 0)
746 #ifndef OPENSSL_NO_AES
747 if (strcmp(*argv,"aes") == 0)
749 doit[D_CBC_128_AES]=1;
750 doit[D_CBC_192_AES]=1;
751 doit[D_CBC_256_AES]=1;
755 #ifndef OPENSSL_NO_RSA
756 if (strcmp(*argv,"rsa") == 0)
758 rsa_doit[R_RSA_512]=1;
759 rsa_doit[R_RSA_1024]=1;
760 rsa_doit[R_RSA_2048]=1;
761 rsa_doit[R_RSA_4096]=1;
765 #ifndef OPENSSL_NO_DSA
766 if (strcmp(*argv,"dsa") == 0)
768 dsa_doit[R_DSA_512]=1;
769 dsa_doit[R_DSA_1024]=1;
774 BIO_printf(bio_err,"Error: bad option or value\n");
775 BIO_printf(bio_err,"\n");
776 BIO_printf(bio_err,"Available values:\n");
777 #ifndef OPENSSL_NO_MD2
778 BIO_printf(bio_err,"md2 ");
780 #ifndef OPENSSL_NO_MDC2
781 BIO_printf(bio_err,"mdc2 ");
783 #ifndef OPENSSL_NO_MD4
784 BIO_printf(bio_err,"md4 ");
786 #ifndef OPENSSL_NO_MD5
787 BIO_printf(bio_err,"md5 ");
788 #ifndef OPENSSL_NO_HMAC
789 BIO_printf(bio_err,"hmac ");
792 #ifndef OPENSSL_NO_SHA1
793 BIO_printf(bio_err,"sha1 ");
795 #ifndef OPENSSL_NO_RIPEMD160
796 BIO_printf(bio_err,"rmd160");
798 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
799 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
800 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
801 BIO_printf(bio_err,"\n");
804 #ifndef OPENSSL_NO_IDEA
805 BIO_printf(bio_err,"idea-cbc ");
807 #ifndef OPENSSL_NO_RC2
808 BIO_printf(bio_err,"rc2-cbc ");
810 #ifndef OPENSSL_NO_RC5
811 BIO_printf(bio_err,"rc5-cbc ");
813 #ifndef OPENSSL_NO_BF
814 BIO_printf(bio_err,"bf-cbc");
816 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
817 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
818 BIO_printf(bio_err,"\n");
820 #ifndef OPENSSL_NO_DES
821 BIO_printf(bio_err,"des-cbc des-ede3 ");
823 #ifndef OPENSSL_NO_AES
824 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
826 #ifndef OPENSSL_NO_RC4
827 BIO_printf(bio_err,"rc4");
829 BIO_printf(bio_err,"\n");
831 #ifndef OPENSSL_NO_RSA
832 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
835 #ifndef OPENSSL_NO_DSA
836 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
839 #ifndef OPENSSL_NO_IDEA
840 BIO_printf(bio_err,"idea ");
842 #ifndef OPENSSL_NO_RC2
843 BIO_printf(bio_err,"rc2 ");
845 #ifndef OPENSSL_NO_DES
846 BIO_printf(bio_err,"des ");
848 #ifndef OPENSSL_NO_AES
849 BIO_printf(bio_err,"aes ");
851 #ifndef OPENSSL_NO_RSA
852 BIO_printf(bio_err,"rsa ");
854 #ifndef OPENSSL_NO_BF
855 BIO_printf(bio_err,"blowfish");
857 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
858 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
859 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
860 BIO_printf(bio_err,"\n");
863 BIO_printf(bio_err,"\n");
864 BIO_printf(bio_err,"Available options:\n");
865 #if defined(TIMES) || defined(USE_TOD)
866 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
868 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
869 BIO_printf(bio_err,"-evp e use EVP e.\n");
870 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
871 BIO_printf(bio_err,"-mr produce machine readable output.\n");
873 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
883 if(multi && do_multi(multi))
889 for (i=0; i<ALGOR_NUM; i++)
894 for (i=0; i<RSA_NUM; i++)
896 for (i=0; i<DSA_NUM; i++)
899 for (i=0; i<ALGOR_NUM; i++)
900 if (doit[i]) pr_header++;
902 if (usertime == 0 && !mr)
903 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
904 if (usertime <= 0 && !mr)
906 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
907 BIO_printf(bio_err,"program when this computer is idle.\n");
910 #ifndef OPENSSL_NO_RSA
911 for (i=0; i<RSA_NUM; i++)
913 const unsigned char *p;
916 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
917 if (rsa_key[i] == NULL)
919 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
925 BIO_printf(bio_err,mr ? "+RK:%d:"
926 : "Loaded RSA key, %d bit modulus and e= 0x",
927 BN_num_bits(rsa_key[i]->n));
928 BN_print(bio_err,rsa_key[i]->e);
929 BIO_printf(bio_err,"\n");
935 #ifndef OPENSSL_NO_DSA
936 dsa_key[0]=get_dsa512();
937 dsa_key[1]=get_dsa1024();
938 dsa_key[2]=get_dsa2048();
941 #ifndef OPENSSL_NO_DES
942 DES_set_key_unchecked(&key,&sch);
943 DES_set_key_unchecked(&key2,&sch2);
944 DES_set_key_unchecked(&key3,&sch3);
946 #ifndef OPENSSL_NO_AES
947 AES_set_encrypt_key(key16,128,&aes_ks1);
948 AES_set_encrypt_key(key24,192,&aes_ks2);
949 AES_set_encrypt_key(key32,256,&aes_ks3);
951 #ifndef OPENSSL_NO_IDEA
952 idea_set_encrypt_key(key16,&idea_ks);
954 #ifndef OPENSSL_NO_RC4
955 RC4_set_key(&rc4_ks,16,key16);
957 #ifndef OPENSSL_NO_RC2
958 RC2_set_key(&rc2_ks,16,key16,128);
960 #ifndef OPENSSL_NO_RC5
961 RC5_32_set_key(&rc5_ks,16,key16,12);
963 #ifndef OPENSSL_NO_BF
964 BF_set_key(&bf_ks,16,key16);
966 #ifndef OPENSSL_NO_CAST
967 CAST_set_key(&cast_ks,16,key16);
969 #ifndef OPENSSL_NO_RSA
970 memset(rsa_c,0,sizeof(rsa_c));
973 #ifndef OPENSSL_NO_DES
974 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
980 for (i=count; i; i--)
981 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
986 c[D_MD2][0]=count/10;
987 c[D_MDC2][0]=count/10;
992 c[D_RMD160][0]=count;
994 c[D_CBC_DES][0]=count;
995 c[D_EDE3_DES][0]=count/3;
996 c[D_CBC_IDEA][0]=count;
997 c[D_CBC_RC2][0]=count;
998 c[D_CBC_RC5][0]=count;
999 c[D_CBC_BF][0]=count;
1000 c[D_CBC_CAST][0]=count;
1002 for (i=1; i<SIZE_NUM; i++)
1004 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1005 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1006 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1007 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1008 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1009 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1010 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1012 for (i=1; i<SIZE_NUM; i++)
1016 l0=(long)lengths[i-1];
1017 l1=(long)lengths[i];
1018 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1019 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1020 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1021 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1022 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1023 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1024 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1025 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1027 #ifndef OPENSSL_NO_RSA
1028 rsa_c[R_RSA_512][0]=count/2000;
1029 rsa_c[R_RSA_512][1]=count/400;
1030 for (i=1; i<RSA_NUM; i++)
1032 rsa_c[i][0]=rsa_c[i-1][0]/8;
1033 rsa_c[i][1]=rsa_c[i-1][1]/4;
1034 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1038 if (rsa_c[i][0] == 0)
1047 #ifndef OPENSSL_NO_DSA
1048 dsa_c[R_DSA_512][0]=count/1000;
1049 dsa_c[R_DSA_512][1]=count/1000/2;
1050 for (i=1; i<DSA_NUM; i++)
1052 dsa_c[i][0]=dsa_c[i-1][0]/4;
1053 dsa_c[i][1]=dsa_c[i-1][1]/4;
1054 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1067 #define COND(d) (count < (d))
1068 #define COUNT(d) (d)
1070 /* not worth fixing */
1071 # error "You cannot disable DES on systems without SIGALRM."
1072 #endif /* OPENSSL_NO_DES */
1074 #define COND(c) (run)
1075 #define COUNT(d) (count)
1076 signal(SIGALRM,sig_done);
1077 #endif /* SIGALRM */
1079 #ifndef OPENSSL_NO_MD2
1082 for (j=0; j<SIZE_NUM; j++)
1084 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1086 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1087 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1089 print_result(D_MD2,j,count,d);
1093 #ifndef OPENSSL_NO_MDC2
1096 for (j=0; j<SIZE_NUM; j++)
1098 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1100 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1101 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1103 print_result(D_MDC2,j,count,d);
1108 #ifndef OPENSSL_NO_MD4
1111 for (j=0; j<SIZE_NUM; j++)
1113 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1115 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1116 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1118 print_result(D_MD4,j,count,d);
1123 #ifndef OPENSSL_NO_MD5
1126 for (j=0; j<SIZE_NUM; j++)
1128 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1130 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1131 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1133 print_result(D_MD5,j,count,d);
1138 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1143 HMAC_CTX_init(&hctx);
1144 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1145 16,EVP_md5(), NULL);
1147 for (j=0; j<SIZE_NUM; j++)
1149 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1151 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1153 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1154 HMAC_Update(&hctx,buf,lengths[j]);
1155 HMAC_Final(&hctx,&(hmac[0]),NULL);
1158 print_result(D_HMAC,j,count,d);
1160 HMAC_CTX_cleanup(&hctx);
1163 #ifndef OPENSSL_NO_SHA
1166 for (j=0; j<SIZE_NUM; j++)
1168 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1170 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1171 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1173 print_result(D_SHA1,j,count,d);
1177 #ifndef OPENSSL_NO_RIPEMD
1180 for (j=0; j<SIZE_NUM; j++)
1182 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1184 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1185 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1187 print_result(D_RMD160,j,count,d);
1191 #ifndef OPENSSL_NO_RC4
1194 for (j=0; j<SIZE_NUM; j++)
1196 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1198 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1199 RC4(&rc4_ks,(unsigned int)lengths[j],
1202 print_result(D_RC4,j,count,d);
1206 #ifndef OPENSSL_NO_DES
1207 if (doit[D_CBC_DES])
1209 for (j=0; j<SIZE_NUM; j++)
1211 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1213 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1214 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1215 &DES_iv,DES_ENCRYPT);
1217 print_result(D_CBC_DES,j,count,d);
1221 if (doit[D_EDE3_DES])
1223 for (j=0; j<SIZE_NUM; j++)
1225 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1227 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1228 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1230 &DES_iv,DES_ENCRYPT);
1232 print_result(D_EDE3_DES,j,count,d);
1236 #ifndef OPENSSL_NO_AES
1237 if (doit[D_CBC_128_AES])
1239 for (j=0; j<SIZE_NUM; j++)
1241 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1243 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1244 AES_cbc_encrypt(buf,buf,
1245 (unsigned long)lengths[j],&aes_ks1,
1248 print_result(D_CBC_128_AES,j,count,d);
1251 if (doit[D_CBC_192_AES])
1253 for (j=0; j<SIZE_NUM; j++)
1255 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1257 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1258 AES_cbc_encrypt(buf,buf,
1259 (unsigned long)lengths[j],&aes_ks2,
1262 print_result(D_CBC_192_AES,j,count,d);
1265 if (doit[D_CBC_256_AES])
1267 for (j=0; j<SIZE_NUM; j++)
1269 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1271 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1272 AES_cbc_encrypt(buf,buf,
1273 (unsigned long)lengths[j],&aes_ks3,
1276 print_result(D_CBC_256_AES,j,count,d);
1281 #ifndef OPENSSL_NO_IDEA
1282 if (doit[D_CBC_IDEA])
1284 for (j=0; j<SIZE_NUM; j++)
1286 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1288 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1289 idea_cbc_encrypt(buf,buf,
1290 (unsigned long)lengths[j],&idea_ks,
1293 print_result(D_CBC_IDEA,j,count,d);
1297 #ifndef OPENSSL_NO_RC2
1298 if (doit[D_CBC_RC2])
1300 for (j=0; j<SIZE_NUM; j++)
1302 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1304 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1305 RC2_cbc_encrypt(buf,buf,
1306 (unsigned long)lengths[j],&rc2_ks,
1309 print_result(D_CBC_RC2,j,count,d);
1313 #ifndef OPENSSL_NO_RC5
1314 if (doit[D_CBC_RC5])
1316 for (j=0; j<SIZE_NUM; j++)
1318 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1320 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1321 RC5_32_cbc_encrypt(buf,buf,
1322 (unsigned long)lengths[j],&rc5_ks,
1325 print_result(D_CBC_RC5,j,count,d);
1329 #ifndef OPENSSL_NO_BF
1332 for (j=0; j<SIZE_NUM; j++)
1334 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1336 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1337 BF_cbc_encrypt(buf,buf,
1338 (unsigned long)lengths[j],&bf_ks,
1341 print_result(D_CBC_BF,j,count,d);
1345 #ifndef OPENSSL_NO_CAST
1346 if (doit[D_CBC_CAST])
1348 for (j=0; j<SIZE_NUM; j++)
1350 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1352 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1353 CAST_cbc_encrypt(buf,buf,
1354 (unsigned long)lengths[j],&cast_ks,
1357 print_result(D_CBC_CAST,j,count,d);
1364 for (j=0; j<SIZE_NUM; j++)
1371 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1372 /* -O3 -fschedule-insns messes up an
1373 * optimization here! names[D_EVP]
1374 * somehow becomes NULL */
1375 print_message(names[D_EVP],save_count,
1378 EVP_CIPHER_CTX_init(&ctx);
1380 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1382 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1386 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1387 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1389 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1390 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1392 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1394 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1396 EVP_CIPHER_CTX_cleanup(&ctx);
1400 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1401 print_message(names[D_EVP],save_count,
1405 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1406 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1410 print_result(D_EVP,j,count,d);
1414 RAND_pseudo_bytes(buf,36);
1415 #ifndef OPENSSL_NO_RSA
1416 for (j=0; j<RSA_NUM; j++)
1419 if (!rsa_doit[j]) continue;
1420 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1423 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1424 ERR_print_errors(bio_err);
1429 pkey_print_message("private","rsa",
1430 rsa_c[j][0],rsa_bits[j],
1432 /* RSA_blinding_on(rsa_key[j],NULL); */
1434 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1436 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1437 &rsa_num, rsa_key[j]);
1441 "RSA sign failure\n");
1442 ERR_print_errors(bio_err);
1448 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1449 : "%ld %d bit private RSA's in %.2fs\n",
1450 count,rsa_bits[j],d);
1451 rsa_results[j][0]=d/(double)count;
1456 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1459 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1460 ERR_print_errors(bio_err);
1465 pkey_print_message("public","rsa",
1466 rsa_c[j][1],rsa_bits[j],
1469 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1471 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1472 rsa_num, rsa_key[j]);
1476 "RSA verify failure\n");
1477 ERR_print_errors(bio_err);
1483 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1484 : "%ld %d bit public RSA's in %.2fs\n",
1485 count,rsa_bits[j],d);
1486 rsa_results[j][1]=d/(double)count;
1492 /* if longer than 10s, don't do any more */
1493 for (j++; j<RSA_NUM; j++)
1499 RAND_pseudo_bytes(buf,20);
1500 #ifndef OPENSSL_NO_DSA
1501 if (RAND_status() != 1)
1503 RAND_seed(rnd_seed, sizeof rnd_seed);
1506 for (j=0; j<DSA_NUM; j++)
1511 if (!dsa_doit[j]) continue;
1512 /* DSA_generate_key(dsa_key[j]); */
1513 /* DSA_sign_setup(dsa_key[j],NULL); */
1514 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1518 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1519 ERR_print_errors(bio_err);
1524 pkey_print_message("sign","dsa",
1525 dsa_c[j][0],dsa_bits[j],
1528 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1530 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1535 "DSA sign failure\n");
1536 ERR_print_errors(bio_err);
1542 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1543 : "%ld %d bit DSA signs in %.2fs\n",
1544 count,dsa_bits[j],d);
1545 dsa_results[j][0]=d/(double)count;
1549 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1553 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1554 ERR_print_errors(bio_err);
1559 pkey_print_message("verify","dsa",
1560 dsa_c[j][1],dsa_bits[j],
1563 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1565 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1570 "DSA verify failure\n");
1571 ERR_print_errors(bio_err);
1577 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1578 : "%ld %d bit DSA verify in %.2fs\n",
1579 count,dsa_bits[j],d);
1580 dsa_results[j][1]=d/(double)count;
1585 /* if longer than 10s, don't do any more */
1586 for (j++; j<DSA_NUM; j++)
1590 if (rnd_fake) RAND_cleanup();
1597 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1598 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1600 printf("%s ",BN_options());
1601 #ifndef OPENSSL_NO_MD2
1602 printf("%s ",MD2_options());
1604 #ifndef OPENSSL_NO_RC4
1605 printf("%s ",RC4_options());
1607 #ifndef OPENSSL_NO_DES
1608 printf("%s ",DES_options());
1610 #ifndef OPENSSL_NO_AES
1611 printf("%s ",AES_options());
1613 #ifndef OPENSSL_NO_IDEA
1614 printf("%s ",idea_options());
1616 #ifndef OPENSSL_NO_BF
1617 printf("%s ",BF_options());
1619 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1620 printf("available timing options: ");
1631 #define as_string(s) (#s)
1632 printf("HZ=%g", (double)HZ);
1634 printf(" [sysconf value]");
1638 printf("timing function used: %s%s%s%s%s%s%s\n",
1639 (ftime_used ? "ftime" : ""),
1640 (ftime_used + times_used > 1 ? "," : ""),
1641 (times_used ? "times" : ""),
1642 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1643 (gettimeofday_used ? "gettimeofday" : ""),
1644 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1645 (getrusage_used ? "getrusage" : ""));
1651 fprintf(stdout,"+H");
1654 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1655 fprintf(stdout,"type ");
1657 for (j=0; j<SIZE_NUM; j++)
1658 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1659 fprintf(stdout,"\n");
1662 for (k=0; k<ALGOR_NUM; k++)
1664 if (!doit[k]) continue;
1666 fprintf(stdout,"+F:%d:%s",k,names[k]);
1668 fprintf(stdout,"%-13s",names[k]);
1669 for (j=0; j<SIZE_NUM; j++)
1671 if (results[k][j] > 10000 && !mr)
1672 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1674 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1676 fprintf(stdout,"\n");
1678 #ifndef OPENSSL_NO_RSA
1680 for (k=0; k<RSA_NUM; k++)
1682 if (!rsa_doit[k]) continue;
1685 printf("%18ssign verify sign/s verify/s\n"," ");
1689 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1690 k,rsa_bits[k],rsa_results[k][0],
1693 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1694 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1695 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1698 #ifndef OPENSSL_NO_DSA
1700 for (k=0; k<DSA_NUM; k++)
1702 if (!dsa_doit[k]) continue;
1705 printf("%18ssign verify sign/s verify/s\n"," ");
1709 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1710 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1712 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1713 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1714 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1719 ERR_print_errors(bio_err);
1720 if (buf != NULL) OPENSSL_free(buf);
1721 if (buf2 != NULL) OPENSSL_free(buf2);
1722 #ifndef OPENSSL_NO_RSA
1723 for (i=0; i<RSA_NUM; i++)
1724 if (rsa_key[i] != NULL)
1725 RSA_free(rsa_key[i]);
1727 #ifndef OPENSSL_NO_DSA
1728 for (i=0; i<DSA_NUM; i++)
1729 if (dsa_key[i] != NULL)
1730 DSA_free(dsa_key[i]);
1736 static void print_message(const char *s, long num, int length)
1739 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1740 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1741 (void)BIO_flush(bio_err);
1744 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1745 : "Doing %s %ld times on %d size blocks: ",s,num,length);
1746 (void)BIO_flush(bio_err);
1753 static void pkey_print_message(char *str, char *str2, long num, int bits,
1757 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1758 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1759 (void)BIO_flush(bio_err);
1762 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1763 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1764 (void)BIO_flush(bio_err);
1771 static void print_result(int alg,int run_no,int count,double time_used)
1773 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1774 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1775 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1778 static char *sstrsep(char **string, const char *delim)
1781 char *token = *string;
1786 memset(isdelim, 0, sizeof isdelim);
1791 isdelim[(unsigned char)(*delim)] = 1;
1795 while (!isdelim[(unsigned char)(**string)])
1810 static int do_multi(int multi)
1815 static char sep[]=":";
1817 fds=malloc(multi*sizeof *fds);
1818 for(n=0 ; n < multi ; ++n)
1836 printf("Forked child %d\n",n);
1839 /* for now, assume the pipe is long enough to take all the output */
1840 for(n=0 ; n < multi ; ++n)
1846 f=fdopen(fds[n],"r");
1847 while(fgets(buf,sizeof buf,f))
1854 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1858 printf("Got: %s from %d\n",buf,n);
1859 if(!strncmp(buf,"+F:",3))
1865 alg=atoi(sstrsep(&p,sep));
1867 for(j=0 ; j < SIZE_NUM ; ++j)
1868 results[alg][j]+=atof(sstrsep(&p,sep));
1870 else if(!strncmp(buf,"+F2:",4))
1876 k=atoi(sstrsep(&p,sep));
1879 d=atof(sstrsep(&p,sep));
1881 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1883 rsa_results[k][0]=d;
1885 d=atof(sstrsep(&p,sep));
1887 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1889 rsa_results[k][1]=d;
1891 else if(!strncmp(buf,"+F2:",4))
1897 k=atoi(sstrsep(&p,sep));
1900 d=atof(sstrsep(&p,sep));
1902 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1904 rsa_results[k][0]=d;
1906 d=atof(sstrsep(&p,sep));
1908 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1910 rsa_results[k][1]=d;
1912 else if(!strncmp(buf,"+F3:",4))
1918 k=atoi(sstrsep(&p,sep));
1921 d=atof(sstrsep(&p,sep));
1923 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1925 dsa_results[k][0]=d;
1927 d=atof(sstrsep(&p,sep));
1929 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1931 dsa_results[k][1]=d;
1933 else if(!strncmp(buf,"+H:",3))
1937 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);