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);
1399 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1400 print_message(names[D_EVP],save_count,
1404 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1405 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1409 print_result(D_EVP,j,count,d);
1413 RAND_pseudo_bytes(buf,36);
1414 #ifndef OPENSSL_NO_RSA
1415 for (j=0; j<RSA_NUM; j++)
1418 if (!rsa_doit[j]) continue;
1419 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1422 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1423 ERR_print_errors(bio_err);
1428 pkey_print_message("private","rsa",
1429 rsa_c[j][0],rsa_bits[j],
1431 /* RSA_blinding_on(rsa_key[j],NULL); */
1433 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1435 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1436 &rsa_num, rsa_key[j]);
1440 "RSA sign failure\n");
1441 ERR_print_errors(bio_err);
1447 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1448 : "%ld %d bit private RSA's in %.2fs\n",
1449 count,rsa_bits[j],d);
1450 rsa_results[j][0]=d/(double)count;
1455 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1458 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1459 ERR_print_errors(bio_err);
1464 pkey_print_message("public","rsa",
1465 rsa_c[j][1],rsa_bits[j],
1468 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1470 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1471 rsa_num, rsa_key[j]);
1475 "RSA verify failure\n");
1476 ERR_print_errors(bio_err);
1482 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1483 : "%ld %d bit public RSA's in %.2fs\n",
1484 count,rsa_bits[j],d);
1485 rsa_results[j][1]=d/(double)count;
1491 /* if longer than 10s, don't do any more */
1492 for (j++; j<RSA_NUM; j++)
1498 RAND_pseudo_bytes(buf,20);
1499 #ifndef OPENSSL_NO_DSA
1500 if (RAND_status() != 1)
1502 RAND_seed(rnd_seed, sizeof rnd_seed);
1505 for (j=0; j<DSA_NUM; j++)
1510 if (!dsa_doit[j]) continue;
1511 /* DSA_generate_key(dsa_key[j]); */
1512 /* DSA_sign_setup(dsa_key[j],NULL); */
1513 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1517 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1518 ERR_print_errors(bio_err);
1523 pkey_print_message("sign","dsa",
1524 dsa_c[j][0],dsa_bits[j],
1527 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1529 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1534 "DSA sign failure\n");
1535 ERR_print_errors(bio_err);
1541 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1542 : "%ld %d bit DSA signs in %.2fs\n",
1543 count,dsa_bits[j],d);
1544 dsa_results[j][0]=d/(double)count;
1548 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1552 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1553 ERR_print_errors(bio_err);
1558 pkey_print_message("verify","dsa",
1559 dsa_c[j][1],dsa_bits[j],
1562 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1564 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1569 "DSA verify failure\n");
1570 ERR_print_errors(bio_err);
1576 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1577 : "%ld %d bit DSA verify in %.2fs\n",
1578 count,dsa_bits[j],d);
1579 dsa_results[j][1]=d/(double)count;
1584 /* if longer than 10s, don't do any more */
1585 for (j++; j<DSA_NUM; j++)
1589 if (rnd_fake) RAND_cleanup();
1596 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1597 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1599 printf("%s ",BN_options());
1600 #ifndef OPENSSL_NO_MD2
1601 printf("%s ",MD2_options());
1603 #ifndef OPENSSL_NO_RC4
1604 printf("%s ",RC4_options());
1606 #ifndef OPENSSL_NO_DES
1607 printf("%s ",DES_options());
1609 #ifndef OPENSSL_NO_AES
1610 printf("%s ",AES_options());
1612 #ifndef OPENSSL_NO_IDEA
1613 printf("%s ",idea_options());
1615 #ifndef OPENSSL_NO_BF
1616 printf("%s ",BF_options());
1618 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1619 printf("available timing options: ");
1630 #define as_string(s) (#s)
1631 printf("HZ=%g", (double)HZ);
1633 printf(" [sysconf value]");
1637 printf("timing function used: %s%s%s%s%s%s%s\n",
1638 (ftime_used ? "ftime" : ""),
1639 (ftime_used + times_used > 1 ? "," : ""),
1640 (times_used ? "times" : ""),
1641 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1642 (gettimeofday_used ? "gettimeofday" : ""),
1643 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1644 (getrusage_used ? "getrusage" : ""));
1650 fprintf(stdout,"+H");
1653 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1654 fprintf(stdout,"type ");
1656 for (j=0; j<SIZE_NUM; j++)
1657 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1658 fprintf(stdout,"\n");
1661 for (k=0; k<ALGOR_NUM; k++)
1663 if (!doit[k]) continue;
1665 fprintf(stdout,"+F:%d:%s",k,names[k]);
1667 fprintf(stdout,"%-13s",names[k]);
1668 for (j=0; j<SIZE_NUM; j++)
1670 if (results[k][j] > 10000 && !mr)
1671 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1673 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1675 fprintf(stdout,"\n");
1677 #ifndef OPENSSL_NO_RSA
1679 for (k=0; k<RSA_NUM; k++)
1681 if (!rsa_doit[k]) continue;
1684 printf("%18ssign verify sign/s verify/s\n"," ");
1688 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1689 k,rsa_bits[k],rsa_results[k][0],
1692 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1693 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1694 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1697 #ifndef OPENSSL_NO_DSA
1699 for (k=0; k<DSA_NUM; k++)
1701 if (!dsa_doit[k]) continue;
1704 printf("%18ssign verify sign/s verify/s\n"," ");
1708 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1709 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1711 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1712 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1713 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1718 ERR_print_errors(bio_err);
1719 if (buf != NULL) OPENSSL_free(buf);
1720 if (buf2 != NULL) OPENSSL_free(buf2);
1721 #ifndef OPENSSL_NO_RSA
1722 for (i=0; i<RSA_NUM; i++)
1723 if (rsa_key[i] != NULL)
1724 RSA_free(rsa_key[i]);
1726 #ifndef OPENSSL_NO_DSA
1727 for (i=0; i<DSA_NUM; i++)
1728 if (dsa_key[i] != NULL)
1729 DSA_free(dsa_key[i]);
1735 static void print_message(const char *s, long num, int length)
1738 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1739 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1740 (void)BIO_flush(bio_err);
1743 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1744 : "Doing %s %ld times on %d size blocks: ",s,num,length);
1745 (void)BIO_flush(bio_err);
1752 static void pkey_print_message(char *str, char *str2, long num, int bits,
1756 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1757 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1758 (void)BIO_flush(bio_err);
1761 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1762 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1763 (void)BIO_flush(bio_err);
1770 static void print_result(int alg,int run_no,int count,double time_used)
1772 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1773 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1774 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1777 static char *sstrsep(char **string, const char *delim)
1780 char *token = *string;
1785 memset(isdelim, 0, sizeof isdelim);
1790 isdelim[(unsigned char)(*delim)] = 1;
1794 while (!isdelim[(unsigned char)(**string)])
1809 static int do_multi(int multi)
1814 static char sep[]=":";
1816 fds=malloc(multi*sizeof *fds);
1817 for(n=0 ; n < multi ; ++n)
1835 printf("Forked child %d\n",n);
1838 /* for now, assume the pipe is long enough to take all the output */
1839 for(n=0 ; n < multi ; ++n)
1845 f=fdopen(fds[n],"r");
1846 while(fgets(buf,sizeof buf,f))
1853 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1857 printf("Got: %s from %d\n",buf,n);
1858 if(!strncmp(buf,"+F:",3))
1864 alg=atoi(sstrsep(&p,sep));
1866 for(j=0 ; j < SIZE_NUM ; ++j)
1867 results[alg][j]+=atof(sstrsep(&p,sep));
1869 else if(!strncmp(buf,"+F2:",4))
1875 k=atoi(sstrsep(&p,sep));
1878 d=atof(sstrsep(&p,sep));
1880 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1882 rsa_results[k][0]=d;
1884 d=atof(sstrsep(&p,sep));
1886 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1888 rsa_results[k][1]=d;
1890 else if(!strncmp(buf,"+F2:",4))
1896 k=atoi(sstrsep(&p,sep));
1899 d=atof(sstrsep(&p,sep));
1901 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1903 rsa_results[k][0]=d;
1905 d=atof(sstrsep(&p,sep));
1907 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1909 rsa_results[k][1]=d;
1911 else if(!strncmp(buf,"+F3:",4))
1917 k=atoi(sstrsep(&p,sep));
1920 d=atof(sstrsep(&p,sep));
1922 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1924 dsa_results[k][0]=d;
1926 d=atof(sstrsep(&p,sep));
1928 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1930 dsa_results[k][1]=d;
1932 else if(!strncmp(buf,"+H:",3))
1936 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);