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_old.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 */
191 # define HZ ((double)sysconf(_SC_CLK_TCK))
194 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
196 # else /* _BSD_CLK_TCK_ */
197 # define HZ ((double)_BSD_CLK_TCK_)
200 # define HZ ((double)CLK_TCK)
205 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
210 #define BUFSIZE ((long)1024*8+1)
213 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
215 static int usertime=1;
217 static double Time_F(int s);
218 static void print_message(const char *s,long num,int length);
219 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
220 static void print_result(int alg,int run_no,int count,double time_used);
222 static int do_multi(int multi);
229 static const char *names[ALGOR_NUM]={
230 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
231 "des cbc","des ede3","idea cbc",
232 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
233 "aes-128 cbc","aes-192 cbc","aes-256 cbc"};
234 static double results[ALGOR_NUM][SIZE_NUM];
235 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
236 static double rsa_results[RSA_NUM][2];
237 static double dsa_results[DSA_NUM][2];
240 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
241 #define SIGRETTYPE void
243 #define SIGRETTYPE int
246 static SIGRETTYPE sig_done(int sig);
247 static SIGRETTYPE sig_done(int sig)
249 signal(SIGALRM,sig_done);
260 static double Time_F(int s)
267 static struct rusage tstart,tend;
272 getrusage(RUSAGE_SELF,&tstart);
279 getrusage(RUSAGE_SELF,&tend);
280 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
281 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
282 +((double)i)/1000000.0;
283 return((ret < 0.001)?0.001:ret);
288 static struct timeval tstart,tend;
291 gettimeofday_used = 1;
294 gettimeofday(&tstart,NULL);
299 gettimeofday(&tend,NULL);
300 i=(long)tend.tv_usec-(long)tstart.tv_usec;
301 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
302 return((ret < 0.001)?0.001:ret);
305 #else /* ndef USE_TOD */
310 static struct tms tstart,tend;
321 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
322 return((ret < 1e-3)?1e-3:ret);
325 # endif /* times() */
326 # if defined(TIMES) && defined(TIMEB)
329 # ifdef OPENSSL_SYS_VXWORKS
331 static unsigned long tick_start, tick_end;
335 tick_start = tickGet();
340 tick_end = tickGet();
341 ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
342 return((ret < 0.001)?0.001:ret);
345 # elif defined(TIMEB)
347 static struct timeb tstart,tend;
359 i=(long)tend.millitm-(long)tstart.millitm;
360 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
361 return((ret < 0.001)?0.001:ret);
368 int MAIN(int, char **);
370 int MAIN(int argc, char **argv)
373 unsigned char *buf=NULL,*buf2=NULL;
375 long count=0,save_count=0;
377 #ifndef OPENSSL_NO_RSA
381 unsigned char md[EVP_MAX_MD_SIZE];
382 #ifndef OPENSSL_NO_MD2
383 unsigned char md2[MD2_DIGEST_LENGTH];
385 #ifndef OPENSSL_NO_MDC2
386 unsigned char mdc2[MDC2_DIGEST_LENGTH];
388 #ifndef OPENSSL_NO_MD4
389 unsigned char md4[MD4_DIGEST_LENGTH];
391 #ifndef OPENSSL_NO_MD5
392 unsigned char md5[MD5_DIGEST_LENGTH];
393 unsigned char hmac[MD5_DIGEST_LENGTH];
395 #ifndef OPENSSL_NO_SHA
396 unsigned char sha[SHA_DIGEST_LENGTH];
398 #ifndef OPENSSL_NO_RIPEMD
399 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
401 #ifndef OPENSSL_NO_RC4
404 #ifndef OPENSSL_NO_RC5
407 #ifndef OPENSSL_NO_RC2
410 #ifndef OPENSSL_NO_IDEA
411 IDEA_KEY_SCHEDULE idea_ks;
413 #ifndef OPENSSL_NO_BF
416 #ifndef OPENSSL_NO_CAST
419 static const unsigned char key16[16]=
420 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
421 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
422 static const unsigned char key24[24]=
423 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
424 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
425 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
426 static const unsigned char key32[32]=
427 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
428 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
429 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
430 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
431 #ifndef OPENSSL_NO_AES
432 #define MAX_BLOCK_SIZE 128
434 #define MAX_BLOCK_SIZE 64
436 unsigned char DES_iv[8];
437 unsigned char iv[MAX_BLOCK_SIZE/8];
438 #ifndef OPENSSL_NO_DES
439 DES_cblock *buf_as_des_cblock = NULL;
440 static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
441 static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
442 static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
443 DES_key_schedule sch;
444 DES_key_schedule sch2;
445 DES_key_schedule sch3;
447 #ifndef OPENSSL_NO_AES
448 AES_KEY aes_ks1, aes_ks2, aes_ks3;
460 #define D_CBC_IDEA 10
464 #define D_CBC_CAST 14
465 #define D_CBC_128_AES 15
466 #define D_CBC_192_AES 16
467 #define D_CBC_256_AES 17
470 long c[ALGOR_NUM][SIZE_NUM];
478 #ifndef OPENSSL_NO_RSA
479 RSA *rsa_key[RSA_NUM];
480 long rsa_c[RSA_NUM][2];
481 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
482 static unsigned char *rsa_data[RSA_NUM]=
483 {test512,test1024,test2048,test4096};
484 static int rsa_data_length[RSA_NUM]={
485 sizeof(test512),sizeof(test1024),
486 sizeof(test2048),sizeof(test4096)};
488 #ifndef OPENSSL_NO_DSA
489 DSA *dsa_key[DSA_NUM];
490 long dsa_c[DSA_NUM][2];
491 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
493 int rsa_doit[RSA_NUM];
494 int dsa_doit[DSA_NUM];
497 const EVP_CIPHER *evp_cipher=NULL;
498 const EVP_MD *evp_md=NULL;
509 memset(results, 0, sizeof(results));
510 #ifndef OPENSSL_NO_DSA
511 memset(dsa_key,0,sizeof(dsa_key));
515 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
516 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
518 if (!load_config(bio_err, NULL))
521 #ifndef OPENSSL_NO_RSA
522 memset(rsa_key,0,sizeof(rsa_key));
523 for (i=0; i<RSA_NUM; i++)
527 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
529 BIO_printf(bio_err,"out of memory\n");
532 #ifndef OPENSSL_NO_DES
533 buf_as_des_cblock = (des_cblock *)buf;
535 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
537 BIO_printf(bio_err,"out of memory\n");
541 memset(c,0,sizeof(c));
542 memset(DES_iv,0,sizeof(DES_iv));
543 memset(iv,0,sizeof(iv));
545 for (i=0; i<ALGOR_NUM; i++)
547 for (i=0; i<RSA_NUM; i++)
549 for (i=0; i<DSA_NUM; i++)
557 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
560 j--; /* Otherwise, -elapsed gets confused with
563 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
569 BIO_printf(bio_err,"no EVP given\n");
572 evp_cipher=EVP_get_cipherbyname(*argv);
575 evp_md=EVP_get_digestbyname(*argv);
577 if(!evp_cipher && !evp_md)
579 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
584 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
587 j--; /* Otherwise, -elapsed gets confused with
590 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
596 BIO_printf(bio_err,"no engine given\n");
599 e = setup_engine(bio_err, *argv, 0);
600 /* j will be increased again further down. We just
601 don't want speed to confuse an engine with an
602 algorithm, especially when none is given (which
603 means all of them should be run) */
607 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
613 BIO_printf(bio_err,"no multi count given\n");
619 BIO_printf(bio_err,"bad multi count\n");
622 j--; /* Otherwise, -mr gets confused with
626 else if (argc > 0 && !strcmp(*argv,"-mr"))
629 j--; /* Otherwise, -mr gets confused with
633 #ifndef OPENSSL_NO_MD2
634 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
637 #ifndef OPENSSL_NO_MDC2
638 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
641 #ifndef OPENSSL_NO_MD4
642 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
645 #ifndef OPENSSL_NO_MD5
646 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
649 #ifndef OPENSSL_NO_MD5
650 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
653 #ifndef OPENSSL_NO_SHA
654 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
656 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
659 #ifndef OPENSSL_NO_RIPEMD
660 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
662 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
664 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
667 #ifndef OPENSSL_NO_RC4
668 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
671 #ifndef OPENSSL_NO_DES
672 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
673 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
676 #ifndef OPENSSL_NO_AES
677 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
678 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
679 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
682 #ifndef OPENSSL_NO_RSA
683 #if 0 /* was: #ifdef RSAref */
684 if (strcmp(*argv,"rsaref") == 0)
686 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
692 if (strcmp(*argv,"openssl") == 0)
694 RSA_set_default_method(RSA_PKCS1_SSLeay());
699 #endif /* !OPENSSL_NO_RSA */
700 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
701 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
702 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
703 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
704 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
705 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
706 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
708 #ifndef OPENSSL_NO_RC2
709 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
710 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
713 #ifndef OPENSSL_NO_RC5
714 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
715 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
718 #ifndef OPENSSL_NO_IDEA
719 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
720 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
723 #ifndef OPENSSL_NO_BF
724 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
725 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
726 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
729 #ifndef OPENSSL_NO_CAST
730 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
731 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
732 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
735 #ifndef OPENSSL_NO_DES
736 if (strcmp(*argv,"des") == 0)
743 #ifndef OPENSSL_NO_AES
744 if (strcmp(*argv,"aes") == 0)
746 doit[D_CBC_128_AES]=1;
747 doit[D_CBC_192_AES]=1;
748 doit[D_CBC_256_AES]=1;
752 #ifndef OPENSSL_NO_RSA
753 if (strcmp(*argv,"rsa") == 0)
755 rsa_doit[R_RSA_512]=1;
756 rsa_doit[R_RSA_1024]=1;
757 rsa_doit[R_RSA_2048]=1;
758 rsa_doit[R_RSA_4096]=1;
762 #ifndef OPENSSL_NO_DSA
763 if (strcmp(*argv,"dsa") == 0)
765 dsa_doit[R_DSA_512]=1;
766 dsa_doit[R_DSA_1024]=1;
771 BIO_printf(bio_err,"Error: bad option or value\n");
772 BIO_printf(bio_err,"\n");
773 BIO_printf(bio_err,"Available values:\n");
774 #ifndef OPENSSL_NO_MD2
775 BIO_printf(bio_err,"md2 ");
777 #ifndef OPENSSL_NO_MDC2
778 BIO_printf(bio_err,"mdc2 ");
780 #ifndef OPENSSL_NO_MD4
781 BIO_printf(bio_err,"md4 ");
783 #ifndef OPENSSL_NO_MD5
784 BIO_printf(bio_err,"md5 ");
785 #ifndef OPENSSL_NO_HMAC
786 BIO_printf(bio_err,"hmac ");
789 #ifndef OPENSSL_NO_SHA1
790 BIO_printf(bio_err,"sha1 ");
792 #ifndef OPENSSL_NO_RIPEMD160
793 BIO_printf(bio_err,"rmd160");
795 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
796 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
797 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
798 BIO_printf(bio_err,"\n");
801 #ifndef OPENSSL_NO_IDEA
802 BIO_printf(bio_err,"idea-cbc ");
804 #ifndef OPENSSL_NO_RC2
805 BIO_printf(bio_err,"rc2-cbc ");
807 #ifndef OPENSSL_NO_RC5
808 BIO_printf(bio_err,"rc5-cbc ");
810 #ifndef OPENSSL_NO_BF
811 BIO_printf(bio_err,"bf-cbc");
813 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
814 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
815 BIO_printf(bio_err,"\n");
817 #ifndef OPENSSL_NO_DES
818 BIO_printf(bio_err,"des-cbc des-ede3 ");
820 #ifndef OPENSSL_NO_AES
821 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
823 #ifndef OPENSSL_NO_RC4
824 BIO_printf(bio_err,"rc4");
826 BIO_printf(bio_err,"\n");
828 #ifndef OPENSSL_NO_RSA
829 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
832 #ifndef OPENSSL_NO_DSA
833 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
836 #ifndef OPENSSL_NO_IDEA
837 BIO_printf(bio_err,"idea ");
839 #ifndef OPENSSL_NO_RC2
840 BIO_printf(bio_err,"rc2 ");
842 #ifndef OPENSSL_NO_DES
843 BIO_printf(bio_err,"des ");
845 #ifndef OPENSSL_NO_AES
846 BIO_printf(bio_err,"aes ");
848 #ifndef OPENSSL_NO_RSA
849 BIO_printf(bio_err,"rsa ");
851 #ifndef OPENSSL_NO_BF
852 BIO_printf(bio_err,"blowfish");
854 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
855 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
856 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
857 BIO_printf(bio_err,"\n");
860 BIO_printf(bio_err,"\n");
861 BIO_printf(bio_err,"Available options:\n");
863 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
865 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
866 BIO_printf(bio_err,"-evp e use EVP e.\n");
867 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
868 BIO_printf(bio_err,"-mr produce machine readable output.\n");
870 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
880 if(multi && do_multi(multi))
886 for (i=0; i<ALGOR_NUM; i++)
891 for (i=0; i<RSA_NUM; i++)
893 for (i=0; i<DSA_NUM; i++)
896 for (i=0; i<ALGOR_NUM; i++)
897 if (doit[i]) pr_header++;
899 if (usertime == 0 && !mr)
900 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
901 if (usertime <= 0 && !mr)
903 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
904 BIO_printf(bio_err,"program when this computer is idle.\n");
907 #ifndef OPENSSL_NO_RSA
908 for (i=0; i<RSA_NUM; i++)
910 const unsigned char *p;
913 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
914 if (rsa_key[i] == NULL)
916 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
922 BIO_printf(bio_err,mr ? "+RK:%d:"
923 : "Loaded RSA key, %d bit modulus and e= 0x",
924 BN_num_bits(rsa_key[i]->n));
925 BN_print(bio_err,rsa_key[i]->e);
926 BIO_printf(bio_err,"\n");
932 #ifndef OPENSSL_NO_DSA
933 dsa_key[0]=get_dsa512();
934 dsa_key[1]=get_dsa1024();
935 dsa_key[2]=get_dsa2048();
938 #ifndef OPENSSL_NO_DES
939 DES_set_key_unchecked(&key,&sch);
940 DES_set_key_unchecked(&key2,&sch2);
941 DES_set_key_unchecked(&key3,&sch3);
943 #ifndef OPENSSL_NO_AES
944 AES_set_encrypt_key(key16,128,&aes_ks1);
945 AES_set_encrypt_key(key24,192,&aes_ks2);
946 AES_set_encrypt_key(key32,256,&aes_ks3);
948 #ifndef OPENSSL_NO_IDEA
949 idea_set_encrypt_key(key16,&idea_ks);
951 #ifndef OPENSSL_NO_RC4
952 RC4_set_key(&rc4_ks,16,key16);
954 #ifndef OPENSSL_NO_RC2
955 RC2_set_key(&rc2_ks,16,key16,128);
957 #ifndef OPENSSL_NO_RC5
958 RC5_32_set_key(&rc5_ks,16,key16,12);
960 #ifndef OPENSSL_NO_BF
961 BF_set_key(&bf_ks,16,key16);
963 #ifndef OPENSSL_NO_CAST
964 CAST_set_key(&cast_ks,16,key16);
966 #ifndef OPENSSL_NO_RSA
967 memset(rsa_c,0,sizeof(rsa_c));
970 #ifndef OPENSSL_NO_DES
971 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
977 for (i=count; i; i--)
978 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
983 c[D_MD2][0]=count/10;
984 c[D_MDC2][0]=count/10;
989 c[D_RMD160][0]=count;
991 c[D_CBC_DES][0]=count;
992 c[D_EDE3_DES][0]=count/3;
993 c[D_CBC_IDEA][0]=count;
994 c[D_CBC_RC2][0]=count;
995 c[D_CBC_RC5][0]=count;
996 c[D_CBC_BF][0]=count;
997 c[D_CBC_CAST][0]=count;
999 for (i=1; i<SIZE_NUM; i++)
1001 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1002 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1003 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1004 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1005 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1006 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1007 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1009 for (i=1; i<SIZE_NUM; i++)
1013 l0=(long)lengths[i-1];
1014 l1=(long)lengths[i];
1015 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1016 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1017 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1018 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1019 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1020 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1021 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1022 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1024 #ifndef OPENSSL_NO_RSA
1025 rsa_c[R_RSA_512][0]=count/2000;
1026 rsa_c[R_RSA_512][1]=count/400;
1027 for (i=1; i<RSA_NUM; i++)
1029 rsa_c[i][0]=rsa_c[i-1][0]/8;
1030 rsa_c[i][1]=rsa_c[i-1][1]/4;
1031 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1035 if (rsa_c[i][0] == 0)
1044 #ifndef OPENSSL_NO_DSA
1045 dsa_c[R_DSA_512][0]=count/1000;
1046 dsa_c[R_DSA_512][1]=count/1000/2;
1047 for (i=1; i<DSA_NUM; i++)
1049 dsa_c[i][0]=dsa_c[i-1][0]/4;
1050 dsa_c[i][1]=dsa_c[i-1][1]/4;
1051 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1064 #define COND(d) (count < (d))
1065 #define COUNT(d) (d)
1067 /* not worth fixing */
1068 # error "You cannot disable DES on systems without SIGALRM."
1069 #endif /* OPENSSL_NO_DES */
1071 #define COND(c) (run)
1072 #define COUNT(d) (count)
1073 signal(SIGALRM,sig_done);
1074 #endif /* SIGALRM */
1076 #ifndef OPENSSL_NO_MD2
1079 for (j=0; j<SIZE_NUM; j++)
1081 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1083 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1084 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1086 print_result(D_MD2,j,count,d);
1090 #ifndef OPENSSL_NO_MDC2
1093 for (j=0; j<SIZE_NUM; j++)
1095 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1097 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1098 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1100 print_result(D_MDC2,j,count,d);
1105 #ifndef OPENSSL_NO_MD4
1108 for (j=0; j<SIZE_NUM; j++)
1110 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1112 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1113 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1115 print_result(D_MD4,j,count,d);
1120 #ifndef OPENSSL_NO_MD5
1123 for (j=0; j<SIZE_NUM; j++)
1125 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1127 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1128 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1130 print_result(D_MD5,j,count,d);
1135 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1140 HMAC_CTX_init(&hctx);
1141 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1144 for (j=0; j<SIZE_NUM; j++)
1146 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1148 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1150 HMAC_Init_ex(&hctx,NULL,0,NULL);
1151 HMAC_Update(&hctx,buf,lengths[j]);
1152 HMAC_Final(&hctx,&(hmac[0]),NULL);
1155 print_result(D_HMAC,j,count,d);
1157 HMAC_CTX_cleanup(&hctx);
1160 #ifndef OPENSSL_NO_SHA
1163 for (j=0; j<SIZE_NUM; j++)
1165 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1167 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1168 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1170 print_result(D_SHA1,j,count,d);
1174 #ifndef OPENSSL_NO_RIPEMD
1177 for (j=0; j<SIZE_NUM; j++)
1179 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1181 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1182 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1184 print_result(D_RMD160,j,count,d);
1188 #ifndef OPENSSL_NO_RC4
1191 for (j=0; j<SIZE_NUM; j++)
1193 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1195 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1196 RC4(&rc4_ks,(unsigned int)lengths[j],
1199 print_result(D_RC4,j,count,d);
1203 #ifndef OPENSSL_NO_DES
1204 if (doit[D_CBC_DES])
1206 for (j=0; j<SIZE_NUM; j++)
1208 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1210 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1211 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1212 &DES_iv,DES_ENCRYPT);
1214 print_result(D_CBC_DES,j,count,d);
1218 if (doit[D_EDE3_DES])
1220 for (j=0; j<SIZE_NUM; j++)
1222 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1224 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1225 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1227 &DES_iv,DES_ENCRYPT);
1229 print_result(D_EDE3_DES,j,count,d);
1233 #ifndef OPENSSL_NO_AES
1234 if (doit[D_CBC_128_AES])
1236 for (j=0; j<SIZE_NUM; j++)
1238 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1240 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1241 AES_cbc_encrypt(buf,buf,
1242 (unsigned long)lengths[j],&aes_ks1,
1245 print_result(D_CBC_128_AES,j,count,d);
1248 if (doit[D_CBC_192_AES])
1250 for (j=0; j<SIZE_NUM; j++)
1252 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1254 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1255 AES_cbc_encrypt(buf,buf,
1256 (unsigned long)lengths[j],&aes_ks2,
1259 print_result(D_CBC_192_AES,j,count,d);
1262 if (doit[D_CBC_256_AES])
1264 for (j=0; j<SIZE_NUM; j++)
1266 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1268 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1269 AES_cbc_encrypt(buf,buf,
1270 (unsigned long)lengths[j],&aes_ks3,
1273 print_result(D_CBC_256_AES,j,count,d);
1278 #ifndef OPENSSL_NO_IDEA
1279 if (doit[D_CBC_IDEA])
1281 for (j=0; j<SIZE_NUM; j++)
1283 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1285 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1286 idea_cbc_encrypt(buf,buf,
1287 (unsigned long)lengths[j],&idea_ks,
1290 print_result(D_CBC_IDEA,j,count,d);
1294 #ifndef OPENSSL_NO_RC2
1295 if (doit[D_CBC_RC2])
1297 for (j=0; j<SIZE_NUM; j++)
1299 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1301 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1302 RC2_cbc_encrypt(buf,buf,
1303 (unsigned long)lengths[j],&rc2_ks,
1306 print_result(D_CBC_RC2,j,count,d);
1310 #ifndef OPENSSL_NO_RC5
1311 if (doit[D_CBC_RC5])
1313 for (j=0; j<SIZE_NUM; j++)
1315 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1317 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1318 RC5_32_cbc_encrypt(buf,buf,
1319 (unsigned long)lengths[j],&rc5_ks,
1322 print_result(D_CBC_RC5,j,count,d);
1326 #ifndef OPENSSL_NO_BF
1329 for (j=0; j<SIZE_NUM; j++)
1331 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1333 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1334 BF_cbc_encrypt(buf,buf,
1335 (unsigned long)lengths[j],&bf_ks,
1338 print_result(D_CBC_BF,j,count,d);
1342 #ifndef OPENSSL_NO_CAST
1343 if (doit[D_CBC_CAST])
1345 for (j=0; j<SIZE_NUM; j++)
1347 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1349 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1350 CAST_cbc_encrypt(buf,buf,
1351 (unsigned long)lengths[j],&cast_ks,
1354 print_result(D_CBC_CAST,j,count,d);
1361 for (j=0; j<SIZE_NUM; j++)
1368 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1369 /* -O3 -fschedule-insns messes up an
1370 * optimization here! names[D_EVP]
1371 * somehow becomes NULL */
1372 print_message(names[D_EVP],save_count,
1375 EVP_CIPHER_CTX_init(&ctx);
1377 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1379 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1383 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1384 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1386 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1387 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1389 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1391 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1396 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1397 print_message(names[D_EVP],save_count,
1401 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1402 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1406 print_result(D_EVP,j,count,d);
1410 RAND_pseudo_bytes(buf,36);
1411 #ifndef OPENSSL_NO_RSA
1412 for (j=0; j<RSA_NUM; j++)
1415 if (!rsa_doit[j]) continue;
1416 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1419 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1420 ERR_print_errors(bio_err);
1425 pkey_print_message("private","rsa",
1426 rsa_c[j][0],rsa_bits[j],
1428 /* RSA_blinding_on(rsa_key[j],NULL); */
1430 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1432 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1433 &rsa_num, rsa_key[j]);
1437 "RSA sign failure\n");
1438 ERR_print_errors(bio_err);
1444 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1445 : "%ld %d bit private RSA's in %.2fs\n",
1446 count,rsa_bits[j],d);
1447 rsa_results[j][0]=d/(double)count;
1452 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1455 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1456 ERR_print_errors(bio_err);
1461 pkey_print_message("public","rsa",
1462 rsa_c[j][1],rsa_bits[j],
1465 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1467 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1468 rsa_num, rsa_key[j]);
1472 "RSA verify failure\n");
1473 ERR_print_errors(bio_err);
1479 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1480 : "%ld %d bit public RSA's in %.2fs\n",
1481 count,rsa_bits[j],d);
1482 rsa_results[j][1]=d/(double)count;
1488 /* if longer than 10s, don't do any more */
1489 for (j++; j<RSA_NUM; j++)
1495 RAND_pseudo_bytes(buf,20);
1496 #ifndef OPENSSL_NO_DSA
1497 if (RAND_status() != 1)
1499 RAND_seed(rnd_seed, sizeof rnd_seed);
1502 for (j=0; j<DSA_NUM; j++)
1507 if (!dsa_doit[j]) continue;
1508 /* DSA_generate_key(dsa_key[j]); */
1509 /* DSA_sign_setup(dsa_key[j],NULL); */
1510 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1514 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1515 ERR_print_errors(bio_err);
1520 pkey_print_message("sign","dsa",
1521 dsa_c[j][0],dsa_bits[j],
1524 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1526 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1531 "DSA sign failure\n");
1532 ERR_print_errors(bio_err);
1538 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1539 : "%ld %d bit DSA signs in %.2fs\n",
1540 count,dsa_bits[j],d);
1541 dsa_results[j][0]=d/(double)count;
1545 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1549 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1550 ERR_print_errors(bio_err);
1555 pkey_print_message("verify","dsa",
1556 dsa_c[j][1],dsa_bits[j],
1559 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1561 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1566 "DSA verify failure\n");
1567 ERR_print_errors(bio_err);
1573 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1574 : "%ld %d bit DSA verify in %.2fs\n",
1575 count,dsa_bits[j],d);
1576 dsa_results[j][1]=d/(double)count;
1581 /* if longer than 10s, don't do any more */
1582 for (j++; j<DSA_NUM; j++)
1586 if (rnd_fake) RAND_cleanup();
1593 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1594 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1596 printf("%s ",BN_options());
1597 #ifndef OPENSSL_NO_MD2
1598 printf("%s ",MD2_options());
1600 #ifndef OPENSSL_NO_RC4
1601 printf("%s ",RC4_options());
1603 #ifndef OPENSSL_NO_DES
1604 printf("%s ",des_options());
1606 #ifndef OPENSSL_NO_AES
1607 printf("%s ",AES_options());
1609 #ifndef OPENSSL_NO_IDEA
1610 printf("%s ",idea_options());
1612 #ifndef OPENSSL_NO_BF
1613 printf("%s ",BF_options());
1615 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1616 printf("available timing options: ");
1627 #define as_string(s) (#s)
1628 printf("HZ=%g", (double)HZ);
1630 printf(" [sysconf value]");
1634 printf("timing function used: %s%s%s%s%s%s%s\n",
1635 (ftime_used ? "ftime" : ""),
1636 (ftime_used + times_used > 1 ? "," : ""),
1637 (times_used ? "times" : ""),
1638 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1639 (gettimeofday_used ? "gettimeofday" : ""),
1640 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1641 (getrusage_used ? "getrusage" : ""));
1647 fprintf(stdout,"+H");
1650 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1651 fprintf(stdout,"type ");
1653 for (j=0; j<SIZE_NUM; j++)
1654 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1655 fprintf(stdout,"\n");
1658 for (k=0; k<ALGOR_NUM; k++)
1660 if (!doit[k]) continue;
1662 fprintf(stdout,"+F:%d:%s",k,names[k]);
1664 fprintf(stdout,"%-13s",names[k]);
1665 for (j=0; j<SIZE_NUM; j++)
1667 if (results[k][j] > 10000 && !mr)
1668 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1670 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1672 fprintf(stdout,"\n");
1674 #ifndef OPENSSL_NO_RSA
1676 for (k=0; k<RSA_NUM; k++)
1678 if (!rsa_doit[k]) continue;
1681 printf("%18ssign verify sign/s verify/s\n"," ");
1685 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1686 k,rsa_bits[k],rsa_results[k][0],
1689 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1690 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1691 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1694 #ifndef OPENSSL_NO_DSA
1696 for (k=0; k<DSA_NUM; k++)
1698 if (!dsa_doit[k]) continue;
1701 printf("%18ssign verify sign/s verify/s\n"," ");
1705 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1706 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1708 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1709 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1710 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1715 ERR_print_errors(bio_err);
1716 if (buf != NULL) OPENSSL_free(buf);
1717 if (buf2 != NULL) OPENSSL_free(buf2);
1718 #ifndef OPENSSL_NO_RSA
1719 for (i=0; i<RSA_NUM; i++)
1720 if (rsa_key[i] != NULL)
1721 RSA_free(rsa_key[i]);
1723 #ifndef OPENSSL_NO_DSA
1724 for (i=0; i<DSA_NUM; i++)
1725 if (dsa_key[i] != NULL)
1726 DSA_free(dsa_key[i]);
1732 static void print_message(const char *s, long num, int length)
1735 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1736 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1737 (void)BIO_flush(bio_err);
1740 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1741 : "Doing %s %ld times on %d size blocks: ",s,num,length);
1742 (void)BIO_flush(bio_err);
1749 static void pkey_print_message(char *str, char *str2, long num, int bits,
1753 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1754 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1755 (void)BIO_flush(bio_err);
1758 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1759 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1760 (void)BIO_flush(bio_err);
1767 static void print_result(int alg,int run_no,int count,double time_used)
1769 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1770 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1771 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1774 static char *sstrsep(char **string, const char *delim)
1777 char *token = *string;
1782 memset(isdelim, 0, 256);
1787 isdelim[(unsigned char)(*delim)] = 1;
1791 while (!isdelim[(unsigned char)(**string)])
1806 static int do_multi(int multi)
1811 static char sep[]=":";
1813 fds=malloc(multi*sizeof *fds);
1814 for(n=0 ; n < multi ; ++n)
1832 printf("Forked child %d\n",n);
1835 /* for now, assume the pipe is long enough to take all the output */
1836 for(n=0 ; n < multi ; ++n)
1842 f=fdopen(fds[n],"r");
1843 while(fgets(buf,sizeof buf,f))
1850 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1854 printf("Got: %s from %d\n",buf,n);
1855 if(!strncmp(buf,"+F:",3))
1861 alg=atoi(sstrsep(&p,sep));
1863 for(j=0 ; j < SIZE_NUM ; ++j)
1864 results[alg][j]+=atof(sstrsep(&p,sep));
1866 else if(!strncmp(buf,"+F2:",4))
1872 k=atoi(sstrsep(&p,sep));
1875 d=atof(sstrsep(&p,sep));
1877 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1879 rsa_results[k][0]=d;
1881 d=atof(sstrsep(&p,sep));
1883 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1885 rsa_results[k][1]=d;
1887 else if(!strncmp(buf,"+F2:",4))
1893 k=atoi(sstrsep(&p,sep));
1896 d=atof(sstrsep(&p,sep));
1898 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1900 rsa_results[k][0]=d;
1902 d=atof(sstrsep(&p,sep));
1904 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1906 rsa_results[k][1]=d;
1908 else if(!strncmp(buf,"+F3:",4))
1914 k=atoi(sstrsep(&p,sep));
1917 d=atof(sstrsep(&p,sep));
1919 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1921 dsa_results[k][0]=d;
1923 d=atof(sstrsep(&p,sep));
1925 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1927 dsa_results[k][1]=d;
1929 else if(!strncmp(buf,"+H:",3))
1933 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);