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 */
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, rsa_count;
377 #ifndef OPENSSL_NO_RSA
380 unsigned char md[EVP_MAX_MD_SIZE];
381 #ifndef OPENSSL_NO_MD2
382 unsigned char md2[MD2_DIGEST_LENGTH];
384 #ifndef OPENSSL_NO_MDC2
385 unsigned char mdc2[MDC2_DIGEST_LENGTH];
387 #ifndef OPENSSL_NO_MD4
388 unsigned char md4[MD4_DIGEST_LENGTH];
390 #ifndef OPENSSL_NO_MD5
391 unsigned char md5[MD5_DIGEST_LENGTH];
392 unsigned char hmac[MD5_DIGEST_LENGTH];
394 #ifndef OPENSSL_NO_SHA
395 unsigned char sha[SHA_DIGEST_LENGTH];
397 #ifndef OPENSSL_NO_RIPEMD
398 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
400 #ifndef OPENSSL_NO_RC4
403 #ifndef OPENSSL_NO_RC5
406 #ifndef OPENSSL_NO_RC2
409 #ifndef OPENSSL_NO_IDEA
410 IDEA_KEY_SCHEDULE idea_ks;
412 #ifndef OPENSSL_NO_BF
415 #ifndef OPENSSL_NO_CAST
418 static const unsigned char key16[16]=
419 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
420 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
421 static const unsigned char key24[24]=
422 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
423 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
424 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
425 static const unsigned char key32[32]=
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 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
430 #ifndef OPENSSL_NO_AES
431 #define MAX_BLOCK_SIZE 128
433 #define MAX_BLOCK_SIZE 64
435 unsigned char DES_iv[8];
436 unsigned char iv[MAX_BLOCK_SIZE/8];
437 #ifndef OPENSSL_NO_DES
438 DES_cblock *buf_as_des_cblock = NULL;
439 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
440 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
441 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
442 DES_key_schedule sch;
443 DES_key_schedule sch2;
444 DES_key_schedule sch3;
446 #ifndef OPENSSL_NO_AES
447 AES_KEY aes_ks1, aes_ks2, aes_ks3;
459 #define D_CBC_IDEA 10
463 #define D_CBC_CAST 14
464 #define D_CBC_128_AES 15
465 #define D_CBC_192_AES 16
466 #define D_CBC_256_AES 17
469 long c[ALGOR_NUM][SIZE_NUM];
477 #ifndef OPENSSL_NO_RSA
478 RSA *rsa_key[RSA_NUM];
479 long rsa_c[RSA_NUM][2];
480 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
481 static unsigned char *rsa_data[RSA_NUM]=
482 {test512,test1024,test2048,test4096};
483 static int rsa_data_length[RSA_NUM]={
484 sizeof(test512),sizeof(test1024),
485 sizeof(test2048),sizeof(test4096)};
487 #ifndef OPENSSL_NO_DSA
488 DSA *dsa_key[DSA_NUM];
489 long dsa_c[DSA_NUM][2];
490 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
492 int rsa_doit[RSA_NUM];
493 int dsa_doit[DSA_NUM];
496 const EVP_CIPHER *evp_cipher=NULL;
497 const EVP_MD *evp_md=NULL;
508 memset(results, 0, sizeof(results));
509 #ifndef OPENSSL_NO_DSA
510 memset(dsa_key,0,sizeof(dsa_key));
514 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
515 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
517 if (!load_config(bio_err, NULL))
520 #ifndef OPENSSL_NO_RSA
521 memset(rsa_key,0,sizeof(rsa_key));
522 for (i=0; i<RSA_NUM; i++)
526 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
528 BIO_printf(bio_err,"out of memory\n");
531 #ifndef OPENSSL_NO_DES
532 buf_as_des_cblock = (DES_cblock *)buf;
534 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
536 BIO_printf(bio_err,"out of memory\n");
540 memset(c,0,sizeof(c));
541 memset(DES_iv,0,sizeof(DES_iv));
542 memset(iv,0,sizeof(iv));
544 for (i=0; i<ALGOR_NUM; i++)
546 for (i=0; i<RSA_NUM; i++)
548 for (i=0; i<DSA_NUM; i++)
556 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
559 j--; /* Otherwise, -elapsed gets confused with
562 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
568 BIO_printf(bio_err,"no EVP given\n");
571 evp_cipher=EVP_get_cipherbyname(*argv);
574 evp_md=EVP_get_digestbyname(*argv);
576 if(!evp_cipher && !evp_md)
578 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
583 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
586 j--; /* Otherwise, -elapsed gets confused with
589 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
595 BIO_printf(bio_err,"no engine given\n");
598 e = setup_engine(bio_err, *argv, 0);
599 /* j will be increased again further down. We just
600 don't want speed to confuse an engine with an
601 algorithm, especially when none is given (which
602 means all of them should be run) */
606 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
612 BIO_printf(bio_err,"no multi count given\n");
618 BIO_printf(bio_err,"bad multi count\n");
621 j--; /* Otherwise, -mr gets confused with
625 else if (argc > 0 && !strcmp(*argv,"-mr"))
628 j--; /* Otherwise, -mr gets confused with
632 #ifndef OPENSSL_NO_MD2
633 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
636 #ifndef OPENSSL_NO_MDC2
637 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
640 #ifndef OPENSSL_NO_MD4
641 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
644 #ifndef OPENSSL_NO_MD5
645 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
648 #ifndef OPENSSL_NO_MD5
649 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
652 #ifndef OPENSSL_NO_SHA
653 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
655 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
658 #ifndef OPENSSL_NO_RIPEMD
659 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
661 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
663 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
666 #ifndef OPENSSL_NO_RC4
667 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
670 #ifndef OPENSSL_NO_DES
671 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
672 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
675 #ifndef OPENSSL_NO_AES
676 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
677 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
678 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
681 #ifndef OPENSSL_NO_RSA
682 #if 0 /* was: #ifdef RSAref */
683 if (strcmp(*argv,"rsaref") == 0)
685 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
691 if (strcmp(*argv,"openssl") == 0)
693 RSA_set_default_method(RSA_PKCS1_SSLeay());
698 #endif /* !OPENSSL_NO_RSA */
699 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
700 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
701 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
702 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
703 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
704 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
705 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
707 #ifndef OPENSSL_NO_RC2
708 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
709 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
712 #ifndef OPENSSL_NO_RC5
713 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
714 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
717 #ifndef OPENSSL_NO_IDEA
718 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
719 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
722 #ifndef OPENSSL_NO_BF
723 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
724 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
725 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
728 #ifndef OPENSSL_NO_CAST
729 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
730 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
731 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
734 #ifndef OPENSSL_NO_DES
735 if (strcmp(*argv,"des") == 0)
742 #ifndef OPENSSL_NO_AES
743 if (strcmp(*argv,"aes") == 0)
745 doit[D_CBC_128_AES]=1;
746 doit[D_CBC_192_AES]=1;
747 doit[D_CBC_256_AES]=1;
751 #ifndef OPENSSL_NO_RSA
752 if (strcmp(*argv,"rsa") == 0)
754 rsa_doit[R_RSA_512]=1;
755 rsa_doit[R_RSA_1024]=1;
756 rsa_doit[R_RSA_2048]=1;
757 rsa_doit[R_RSA_4096]=1;
761 #ifndef OPENSSL_NO_DSA
762 if (strcmp(*argv,"dsa") == 0)
764 dsa_doit[R_DSA_512]=1;
765 dsa_doit[R_DSA_1024]=1;
770 BIO_printf(bio_err,"Error: bad option or value\n");
771 BIO_printf(bio_err,"\n");
772 BIO_printf(bio_err,"Available values:\n");
773 #ifndef OPENSSL_NO_MD2
774 BIO_printf(bio_err,"md2 ");
776 #ifndef OPENSSL_NO_MDC2
777 BIO_printf(bio_err,"mdc2 ");
779 #ifndef OPENSSL_NO_MD4
780 BIO_printf(bio_err,"md4 ");
782 #ifndef OPENSSL_NO_MD5
783 BIO_printf(bio_err,"md5 ");
784 #ifndef OPENSSL_NO_HMAC
785 BIO_printf(bio_err,"hmac ");
788 #ifndef OPENSSL_NO_SHA1
789 BIO_printf(bio_err,"sha1 ");
791 #ifndef OPENSSL_NO_RIPEMD160
792 BIO_printf(bio_err,"rmd160");
794 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
795 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
796 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
797 BIO_printf(bio_err,"\n");
800 #ifndef OPENSSL_NO_IDEA
801 BIO_printf(bio_err,"idea-cbc ");
803 #ifndef OPENSSL_NO_RC2
804 BIO_printf(bio_err,"rc2-cbc ");
806 #ifndef OPENSSL_NO_RC5
807 BIO_printf(bio_err,"rc5-cbc ");
809 #ifndef OPENSSL_NO_BF
810 BIO_printf(bio_err,"bf-cbc");
812 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
813 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
814 BIO_printf(bio_err,"\n");
816 #ifndef OPENSSL_NO_DES
817 BIO_printf(bio_err,"des-cbc des-ede3 ");
819 #ifndef OPENSSL_NO_AES
820 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
822 #ifndef OPENSSL_NO_RC4
823 BIO_printf(bio_err,"rc4");
825 BIO_printf(bio_err,"\n");
827 #ifndef OPENSSL_NO_RSA
828 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
831 #ifndef OPENSSL_NO_DSA
832 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
835 #ifndef OPENSSL_NO_IDEA
836 BIO_printf(bio_err,"idea ");
838 #ifndef OPENSSL_NO_RC2
839 BIO_printf(bio_err,"rc2 ");
841 #ifndef OPENSSL_NO_DES
842 BIO_printf(bio_err,"des ");
844 #ifndef OPENSSL_NO_AES
845 BIO_printf(bio_err,"aes ");
847 #ifndef OPENSSL_NO_RSA
848 BIO_printf(bio_err,"rsa ");
850 #ifndef OPENSSL_NO_BF
851 BIO_printf(bio_err,"blowfish");
853 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
854 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
855 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
856 BIO_printf(bio_err,"\n");
859 BIO_printf(bio_err,"\n");
860 BIO_printf(bio_err,"Available options:\n");
862 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
864 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
865 BIO_printf(bio_err,"-evp e use EVP e.\n");
866 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
867 BIO_printf(bio_err,"-mr produce machine readable output.\n");
869 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
879 if(multi && do_multi(multi))
885 for (i=0; i<ALGOR_NUM; i++)
890 for (i=0; i<RSA_NUM; i++)
892 for (i=0; i<DSA_NUM; i++)
895 for (i=0; i<ALGOR_NUM; i++)
896 if (doit[i]) pr_header++;
898 if (usertime == 0 && !mr)
899 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
900 if (usertime <= 0 && !mr)
902 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
903 BIO_printf(bio_err,"program when this computer is idle.\n");
906 #ifndef OPENSSL_NO_RSA
907 for (i=0; i<RSA_NUM; i++)
909 const unsigned char *p;
912 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
913 if (rsa_key[i] == NULL)
915 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
921 BIO_printf(bio_err,mr ? "+RK:%d:"
922 : "Loaded RSA key, %d bit modulus and e= 0x",
923 BN_num_bits(rsa_key[i]->n));
924 BN_print(bio_err,rsa_key[i]->e);
925 BIO_printf(bio_err,"\n");
931 #ifndef OPENSSL_NO_DSA
932 dsa_key[0]=get_dsa512();
933 dsa_key[1]=get_dsa1024();
934 dsa_key[2]=get_dsa2048();
937 #ifndef OPENSSL_NO_DES
938 DES_set_key_unchecked(&key,&sch);
939 DES_set_key_unchecked(&key2,&sch2);
940 DES_set_key_unchecked(&key3,&sch3);
942 #ifndef OPENSSL_NO_AES
943 AES_set_encrypt_key(key16,128,&aes_ks1);
944 AES_set_encrypt_key(key24,192,&aes_ks2);
945 AES_set_encrypt_key(key32,256,&aes_ks3);
947 #ifndef OPENSSL_NO_IDEA
948 idea_set_encrypt_key(key16,&idea_ks);
950 #ifndef OPENSSL_NO_RC4
951 RC4_set_key(&rc4_ks,16,key16);
953 #ifndef OPENSSL_NO_RC2
954 RC2_set_key(&rc2_ks,16,key16,128);
956 #ifndef OPENSSL_NO_RC5
957 RC5_32_set_key(&rc5_ks,16,key16,12);
959 #ifndef OPENSSL_NO_BF
960 BF_set_key(&bf_ks,16,key16);
962 #ifndef OPENSSL_NO_CAST
963 CAST_set_key(&cast_ks,16,key16);
965 #ifndef OPENSSL_NO_RSA
966 memset(rsa_c,0,sizeof(rsa_c));
969 #ifndef OPENSSL_NO_DES
970 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
976 for (i=count; i; i--)
977 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
982 c[D_MD2][0]=count/10;
983 c[D_MDC2][0]=count/10;
988 c[D_RMD160][0]=count;
990 c[D_CBC_DES][0]=count;
991 c[D_EDE3_DES][0]=count/3;
992 c[D_CBC_IDEA][0]=count;
993 c[D_CBC_RC2][0]=count;
994 c[D_CBC_RC5][0]=count;
995 c[D_CBC_BF][0]=count;
996 c[D_CBC_CAST][0]=count;
998 for (i=1; i<SIZE_NUM; i++)
1000 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1001 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1002 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1003 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1004 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1005 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1006 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1008 for (i=1; i<SIZE_NUM; i++)
1012 l0=(long)lengths[i-1];
1013 l1=(long)lengths[i];
1014 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1015 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1016 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1017 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1018 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1019 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1020 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1021 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1023 #ifndef OPENSSL_NO_RSA
1024 rsa_c[R_RSA_512][0]=count/2000;
1025 rsa_c[R_RSA_512][1]=count/400;
1026 for (i=1; i<RSA_NUM; i++)
1028 rsa_c[i][0]=rsa_c[i-1][0]/8;
1029 rsa_c[i][1]=rsa_c[i-1][1]/4;
1030 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1034 if (rsa_c[i][0] == 0)
1043 #ifndef OPENSSL_NO_DSA
1044 dsa_c[R_DSA_512][0]=count/1000;
1045 dsa_c[R_DSA_512][1]=count/1000/2;
1046 for (i=1; i<DSA_NUM; i++)
1048 dsa_c[i][0]=dsa_c[i-1][0]/4;
1049 dsa_c[i][1]=dsa_c[i-1][1]/4;
1050 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1063 #define COND(d) (count < (d))
1064 #define COUNT(d) (d)
1066 /* not worth fixing */
1067 # error "You cannot disable DES on systems without SIGALRM."
1068 #endif /* OPENSSL_NO_DES */
1070 #define COND(c) (run)
1071 #define COUNT(d) (count)
1072 signal(SIGALRM,sig_done);
1073 #endif /* SIGALRM */
1075 #ifndef OPENSSL_NO_MD2
1078 for (j=0; j<SIZE_NUM; j++)
1080 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1082 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1083 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1085 print_result(D_MD2,j,count,d);
1089 #ifndef OPENSSL_NO_MDC2
1092 for (j=0; j<SIZE_NUM; j++)
1094 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1096 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1097 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1099 print_result(D_MDC2,j,count,d);
1104 #ifndef OPENSSL_NO_MD4
1107 for (j=0; j<SIZE_NUM; j++)
1109 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1111 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1112 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1114 print_result(D_MD4,j,count,d);
1119 #ifndef OPENSSL_NO_MD5
1122 for (j=0; j<SIZE_NUM; j++)
1124 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1126 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1127 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1129 print_result(D_MD5,j,count,d);
1134 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1139 HMAC_CTX_init(&hctx);
1140 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1141 16,EVP_md5(), NULL);
1143 for (j=0; j<SIZE_NUM; j++)
1145 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1147 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1149 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1150 HMAC_Update(&hctx,buf,lengths[j]);
1151 HMAC_Final(&hctx,&(hmac[0]),NULL);
1154 print_result(D_HMAC,j,count,d);
1156 HMAC_CTX_cleanup(&hctx);
1159 #ifndef OPENSSL_NO_SHA
1162 for (j=0; j<SIZE_NUM; j++)
1164 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1166 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1167 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1169 print_result(D_SHA1,j,count,d);
1173 #ifndef OPENSSL_NO_RIPEMD
1176 for (j=0; j<SIZE_NUM; j++)
1178 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1180 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1181 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1183 print_result(D_RMD160,j,count,d);
1187 #ifndef OPENSSL_NO_RC4
1190 for (j=0; j<SIZE_NUM; j++)
1192 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1194 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1195 RC4(&rc4_ks,(unsigned int)lengths[j],
1198 print_result(D_RC4,j,count,d);
1202 #ifndef OPENSSL_NO_DES
1203 if (doit[D_CBC_DES])
1205 for (j=0; j<SIZE_NUM; j++)
1207 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1209 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1210 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1211 &DES_iv,DES_ENCRYPT);
1213 print_result(D_CBC_DES,j,count,d);
1217 if (doit[D_EDE3_DES])
1219 for (j=0; j<SIZE_NUM; j++)
1221 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1223 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1224 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1226 &DES_iv,DES_ENCRYPT);
1228 print_result(D_EDE3_DES,j,count,d);
1232 #ifndef OPENSSL_NO_AES
1233 if (doit[D_CBC_128_AES])
1235 for (j=0; j<SIZE_NUM; j++)
1237 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1239 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1240 AES_cbc_encrypt(buf,buf,
1241 (unsigned long)lengths[j],&aes_ks1,
1244 print_result(D_CBC_128_AES,j,count,d);
1247 if (doit[D_CBC_192_AES])
1249 for (j=0; j<SIZE_NUM; j++)
1251 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1253 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1254 AES_cbc_encrypt(buf,buf,
1255 (unsigned long)lengths[j],&aes_ks2,
1258 print_result(D_CBC_192_AES,j,count,d);
1261 if (doit[D_CBC_256_AES])
1263 for (j=0; j<SIZE_NUM; j++)
1265 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1267 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1268 AES_cbc_encrypt(buf,buf,
1269 (unsigned long)lengths[j],&aes_ks3,
1272 print_result(D_CBC_256_AES,j,count,d);
1277 #ifndef OPENSSL_NO_IDEA
1278 if (doit[D_CBC_IDEA])
1280 for (j=0; j<SIZE_NUM; j++)
1282 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1284 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1285 idea_cbc_encrypt(buf,buf,
1286 (unsigned long)lengths[j],&idea_ks,
1289 print_result(D_CBC_IDEA,j,count,d);
1293 #ifndef OPENSSL_NO_RC2
1294 if (doit[D_CBC_RC2])
1296 for (j=0; j<SIZE_NUM; j++)
1298 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1300 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1301 RC2_cbc_encrypt(buf,buf,
1302 (unsigned long)lengths[j],&rc2_ks,
1305 print_result(D_CBC_RC2,j,count,d);
1309 #ifndef OPENSSL_NO_RC5
1310 if (doit[D_CBC_RC5])
1312 for (j=0; j<SIZE_NUM; j++)
1314 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1316 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1317 RC5_32_cbc_encrypt(buf,buf,
1318 (unsigned long)lengths[j],&rc5_ks,
1321 print_result(D_CBC_RC5,j,count,d);
1325 #ifndef OPENSSL_NO_BF
1328 for (j=0; j<SIZE_NUM; j++)
1330 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1332 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1333 BF_cbc_encrypt(buf,buf,
1334 (unsigned long)lengths[j],&bf_ks,
1337 print_result(D_CBC_BF,j,count,d);
1341 #ifndef OPENSSL_NO_CAST
1342 if (doit[D_CBC_CAST])
1344 for (j=0; j<SIZE_NUM; j++)
1346 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1348 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1349 CAST_cbc_encrypt(buf,buf,
1350 (unsigned long)lengths[j],&cast_ks,
1353 print_result(D_CBC_CAST,j,count,d);
1360 for (j=0; j<SIZE_NUM; j++)
1367 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1368 /* -O3 -fschedule-insns messes up an
1369 * optimization here! names[D_EVP]
1370 * somehow becomes NULL */
1371 print_message(names[D_EVP],save_count,
1374 EVP_CIPHER_CTX_init(&ctx);
1376 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1378 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1382 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1383 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1385 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1386 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1388 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1390 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1395 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1396 print_message(names[D_EVP],save_count,
1400 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1401 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1405 print_result(D_EVP,j,count,d);
1409 RAND_pseudo_bytes(buf,36);
1410 #ifndef OPENSSL_NO_RSA
1411 for (j=0; j<RSA_NUM; j++)
1414 if (!rsa_doit[j]) continue;
1415 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1418 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1419 ERR_print_errors(bio_err);
1424 pkey_print_message("private","rsa",
1425 rsa_c[j][0],rsa_bits[j],
1427 /* RSA_blinding_on(rsa_key[j],NULL); */
1429 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1431 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1432 &rsa_num, rsa_key[j]);
1436 "RSA sign failure\n");
1437 ERR_print_errors(bio_err);
1443 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1444 : "%ld %d bit private RSA's in %.2fs\n",
1445 count,rsa_bits[j],d);
1446 rsa_results[j][0]=d/(double)count;
1451 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1454 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1455 ERR_print_errors(bio_err);
1460 pkey_print_message("public","rsa",
1461 rsa_c[j][1],rsa_bits[j],
1464 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1466 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1467 rsa_num, rsa_key[j]);
1471 "RSA verify failure\n");
1472 ERR_print_errors(bio_err);
1478 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1479 : "%ld %d bit public RSA's in %.2fs\n",
1480 count,rsa_bits[j],d);
1481 rsa_results[j][1]=d/(double)count;
1487 /* if longer than 10s, don't do any more */
1488 for (j++; j<RSA_NUM; j++)
1494 RAND_pseudo_bytes(buf,20);
1495 #ifndef OPENSSL_NO_DSA
1496 if (RAND_status() != 1)
1498 RAND_seed(rnd_seed, sizeof rnd_seed);
1501 for (j=0; j<DSA_NUM; j++)
1506 if (!dsa_doit[j]) continue;
1507 /* DSA_generate_key(dsa_key[j]); */
1508 /* DSA_sign_setup(dsa_key[j],NULL); */
1509 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1513 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1514 ERR_print_errors(bio_err);
1519 pkey_print_message("sign","dsa",
1520 dsa_c[j][0],dsa_bits[j],
1523 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1525 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1530 "DSA sign failure\n");
1531 ERR_print_errors(bio_err);
1537 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1538 : "%ld %d bit DSA signs in %.2fs\n",
1539 count,dsa_bits[j],d);
1540 dsa_results[j][0]=d/(double)count;
1544 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1548 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1549 ERR_print_errors(bio_err);
1554 pkey_print_message("verify","dsa",
1555 dsa_c[j][1],dsa_bits[j],
1558 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1560 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1565 "DSA verify failure\n");
1566 ERR_print_errors(bio_err);
1572 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1573 : "%ld %d bit DSA verify in %.2fs\n",
1574 count,dsa_bits[j],d);
1575 dsa_results[j][1]=d/(double)count;
1580 /* if longer than 10s, don't do any more */
1581 for (j++; j<DSA_NUM; j++)
1585 if (rnd_fake) RAND_cleanup();
1592 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1593 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1595 printf("%s ",BN_options());
1596 #ifndef OPENSSL_NO_MD2
1597 printf("%s ",MD2_options());
1599 #ifndef OPENSSL_NO_RC4
1600 printf("%s ",RC4_options());
1602 #ifndef OPENSSL_NO_DES
1603 printf("%s ",DES_options());
1605 #ifndef OPENSSL_NO_AES
1606 printf("%s ",AES_options());
1608 #ifndef OPENSSL_NO_IDEA
1609 printf("%s ",idea_options());
1611 #ifndef OPENSSL_NO_BF
1612 printf("%s ",BF_options());
1614 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1615 printf("available timing options: ");
1626 #define as_string(s) (#s)
1627 printf("HZ=%g", (double)HZ);
1629 printf(" [sysconf value]");
1633 printf("timing function used: %s%s%s%s%s%s%s\n",
1634 (ftime_used ? "ftime" : ""),
1635 (ftime_used + times_used > 1 ? "," : ""),
1636 (times_used ? "times" : ""),
1637 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1638 (gettimeofday_used ? "gettimeofday" : ""),
1639 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1640 (getrusage_used ? "getrusage" : ""));
1646 fprintf(stdout,"+H");
1649 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1650 fprintf(stdout,"type ");
1652 for (j=0; j<SIZE_NUM; j++)
1653 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1654 fprintf(stdout,"\n");
1657 for (k=0; k<ALGOR_NUM; k++)
1659 if (!doit[k]) continue;
1661 fprintf(stdout,"+F:%d:%s",k,names[k]);
1663 fprintf(stdout,"%-13s",names[k]);
1664 for (j=0; j<SIZE_NUM; j++)
1666 if (results[k][j] > 10000 && !mr)
1667 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1669 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1671 fprintf(stdout,"\n");
1673 #ifndef OPENSSL_NO_RSA
1675 for (k=0; k<RSA_NUM; k++)
1677 if (!rsa_doit[k]) continue;
1680 printf("%18ssign verify sign/s verify/s\n"," ");
1684 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1685 k,rsa_bits[k],rsa_results[k][0],
1688 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1689 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1690 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1693 #ifndef OPENSSL_NO_DSA
1695 for (k=0; k<DSA_NUM; k++)
1697 if (!dsa_doit[k]) continue;
1700 printf("%18ssign verify sign/s verify/s\n"," ");
1704 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1705 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1707 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1708 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1709 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1714 ERR_print_errors(bio_err);
1715 if (buf != NULL) OPENSSL_free(buf);
1716 if (buf2 != NULL) OPENSSL_free(buf2);
1717 #ifndef OPENSSL_NO_RSA
1718 for (i=0; i<RSA_NUM; i++)
1719 if (rsa_key[i] != NULL)
1720 RSA_free(rsa_key[i]);
1722 #ifndef OPENSSL_NO_DSA
1723 for (i=0; i<DSA_NUM; i++)
1724 if (dsa_key[i] != NULL)
1725 DSA_free(dsa_key[i]);
1731 static void print_message(const char *s, long num, int length)
1734 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1735 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1736 (void)BIO_flush(bio_err);
1739 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1740 : "Doing %s %ld times on %d size blocks: ",s,num,length);
1741 (void)BIO_flush(bio_err);
1748 static void pkey_print_message(char *str, char *str2, long num, int bits,
1752 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1753 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1754 (void)BIO_flush(bio_err);
1757 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1758 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1759 (void)BIO_flush(bio_err);
1766 static void print_result(int alg,int run_no,int count,double time_used)
1768 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1769 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1770 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1773 static char *sstrsep(char **string, const char *delim)
1776 char *token = *string;
1781 memset(isdelim, 0, 256);
1786 isdelim[(unsigned char)(*delim)] = 1;
1790 while (!isdelim[(unsigned char)(**string)])
1805 static int do_multi(int multi)
1810 static char sep[]=":";
1812 fds=malloc(multi*sizeof *fds);
1813 for(n=0 ; n < multi ; ++n)
1831 printf("Forked child %d\n",n);
1834 /* for now, assume the pipe is long enough to take all the output */
1835 for(n=0 ; n < multi ; ++n)
1841 f=fdopen(fds[n],"r");
1842 while(fgets(buf,sizeof buf,f))
1849 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1853 printf("Got: %s from %d\n",buf,n);
1854 if(!strncmp(buf,"+F:",3))
1860 alg=atoi(sstrsep(&p,sep));
1862 for(j=0 ; j < SIZE_NUM ; ++j)
1863 results[alg][j]+=atof(sstrsep(&p,sep));
1865 else if(!strncmp(buf,"+F2:",4))
1871 k=atoi(sstrsep(&p,sep));
1874 d=atof(sstrsep(&p,sep));
1876 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1878 rsa_results[k][0]=d;
1880 d=atof(sstrsep(&p,sep));
1882 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1884 rsa_results[k][1]=d;
1886 else if(!strncmp(buf,"+F2:",4))
1892 k=atoi(sstrsep(&p,sep));
1895 d=atof(sstrsep(&p,sep));
1897 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1899 rsa_results[k][0]=d;
1901 d=atof(sstrsep(&p,sep));
1903 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1905 rsa_results[k][1]=d;
1907 else if(!strncmp(buf,"+F3:",4))
1913 k=atoi(sstrsep(&p,sep));
1916 d=atof(sstrsep(&p,sep));
1918 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1920 dsa_results[k][0]=d;
1922 d=atof(sstrsep(&p,sep));
1924 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1926 dsa_results[k][1]=d;
1928 else if(!strncmp(buf,"+H:",3))
1932 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);