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;
377 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
380 #ifndef OPENSSL_NO_RSA
383 unsigned char md[EVP_MAX_MD_SIZE];
384 #ifndef OPENSSL_NO_MD2
385 unsigned char md2[MD2_DIGEST_LENGTH];
387 #ifndef OPENSSL_NO_MDC2
388 unsigned char mdc2[MDC2_DIGEST_LENGTH];
390 #ifndef OPENSSL_NO_MD4
391 unsigned char md4[MD4_DIGEST_LENGTH];
393 #ifndef OPENSSL_NO_MD5
394 unsigned char md5[MD5_DIGEST_LENGTH];
395 unsigned char hmac[MD5_DIGEST_LENGTH];
397 #ifndef OPENSSL_NO_SHA
398 unsigned char sha[SHA_DIGEST_LENGTH];
400 #ifndef OPENSSL_NO_RIPEMD
401 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
403 #ifndef OPENSSL_NO_RC4
406 #ifndef OPENSSL_NO_RC5
409 #ifndef OPENSSL_NO_RC2
412 #ifndef OPENSSL_NO_IDEA
413 IDEA_KEY_SCHEDULE idea_ks;
415 #ifndef OPENSSL_NO_BF
418 #ifndef OPENSSL_NO_CAST
421 static const unsigned char key16[16]=
422 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
423 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
424 static const unsigned char key24[24]=
425 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
426 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
427 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
428 static const unsigned char key32[32]=
429 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
430 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
431 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
432 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
433 #ifndef OPENSSL_NO_AES
434 #define MAX_BLOCK_SIZE 128
436 #define MAX_BLOCK_SIZE 64
438 unsigned char DES_iv[8];
439 unsigned char iv[MAX_BLOCK_SIZE/8];
440 #ifndef OPENSSL_NO_DES
441 DES_cblock *buf_as_des_cblock = NULL;
442 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
443 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
444 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
445 DES_key_schedule sch;
446 DES_key_schedule sch2;
447 DES_key_schedule sch3;
449 #ifndef OPENSSL_NO_AES
450 AES_KEY aes_ks1, aes_ks2, aes_ks3;
462 #define D_CBC_IDEA 10
466 #define D_CBC_CAST 14
467 #define D_CBC_128_AES 15
468 #define D_CBC_192_AES 16
469 #define D_CBC_256_AES 17
472 long c[ALGOR_NUM][SIZE_NUM];
480 #ifndef OPENSSL_NO_RSA
481 RSA *rsa_key[RSA_NUM];
482 long rsa_c[RSA_NUM][2];
483 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
484 static unsigned char *rsa_data[RSA_NUM]=
485 {test512,test1024,test2048,test4096};
486 static int rsa_data_length[RSA_NUM]={
487 sizeof(test512),sizeof(test1024),
488 sizeof(test2048),sizeof(test4096)};
490 #ifndef OPENSSL_NO_DSA
491 DSA *dsa_key[DSA_NUM];
492 long dsa_c[DSA_NUM][2];
493 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
495 int rsa_doit[RSA_NUM];
496 int dsa_doit[DSA_NUM];
499 const EVP_CIPHER *evp_cipher=NULL;
500 const EVP_MD *evp_md=NULL;
511 memset(results, 0, sizeof(results));
512 #ifndef OPENSSL_NO_DSA
513 memset(dsa_key,0,sizeof(dsa_key));
517 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
518 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
520 if (!load_config(bio_err, NULL))
523 #ifndef OPENSSL_NO_RSA
524 memset(rsa_key,0,sizeof(rsa_key));
525 for (i=0; i<RSA_NUM; i++)
529 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
531 BIO_printf(bio_err,"out of memory\n");
534 #ifndef OPENSSL_NO_DES
535 buf_as_des_cblock = (DES_cblock *)buf;
537 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
539 BIO_printf(bio_err,"out of memory\n");
543 memset(c,0,sizeof(c));
544 memset(DES_iv,0,sizeof(DES_iv));
545 memset(iv,0,sizeof(iv));
547 for (i=0; i<ALGOR_NUM; i++)
549 for (i=0; i<RSA_NUM; i++)
551 for (i=0; i<DSA_NUM; i++)
559 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
562 j--; /* Otherwise, -elapsed gets confused with
565 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
571 BIO_printf(bio_err,"no EVP given\n");
574 evp_cipher=EVP_get_cipherbyname(*argv);
577 evp_md=EVP_get_digestbyname(*argv);
579 if(!evp_cipher && !evp_md)
581 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
586 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
589 j--; /* Otherwise, -elapsed gets confused with
592 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
598 BIO_printf(bio_err,"no engine given\n");
601 e = setup_engine(bio_err, *argv, 0);
602 /* j will be increased again further down. We just
603 don't want speed to confuse an engine with an
604 algorithm, especially when none is given (which
605 means all of them should be run) */
609 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
615 BIO_printf(bio_err,"no multi count given\n");
621 BIO_printf(bio_err,"bad multi count\n");
624 j--; /* Otherwise, -mr gets confused with
628 else if (argc > 0 && !strcmp(*argv,"-mr"))
631 j--; /* Otherwise, -mr gets confused with
635 #ifndef OPENSSL_NO_MD2
636 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
639 #ifndef OPENSSL_NO_MDC2
640 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
643 #ifndef OPENSSL_NO_MD4
644 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
647 #ifndef OPENSSL_NO_MD5
648 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
651 #ifndef OPENSSL_NO_MD5
652 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
655 #ifndef OPENSSL_NO_SHA
656 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
658 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
661 #ifndef OPENSSL_NO_RIPEMD
662 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
664 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
666 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
669 #ifndef OPENSSL_NO_RC4
670 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
673 #ifndef OPENSSL_NO_DES
674 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
675 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
678 #ifndef OPENSSL_NO_AES
679 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
680 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
681 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
684 #ifndef OPENSSL_NO_RSA
685 #if 0 /* was: #ifdef RSAref */
686 if (strcmp(*argv,"rsaref") == 0)
688 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
694 if (strcmp(*argv,"openssl") == 0)
696 RSA_set_default_method(RSA_PKCS1_SSLeay());
701 #endif /* !OPENSSL_NO_RSA */
702 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
703 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
704 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
705 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
706 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
707 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
708 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
710 #ifndef OPENSSL_NO_RC2
711 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
712 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
715 #ifndef OPENSSL_NO_RC5
716 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
717 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
720 #ifndef OPENSSL_NO_IDEA
721 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
722 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
725 #ifndef OPENSSL_NO_BF
726 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
727 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
728 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
731 #ifndef OPENSSL_NO_CAST
732 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
733 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
734 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
737 #ifndef OPENSSL_NO_DES
738 if (strcmp(*argv,"des") == 0)
745 #ifndef OPENSSL_NO_AES
746 if (strcmp(*argv,"aes") == 0)
748 doit[D_CBC_128_AES]=1;
749 doit[D_CBC_192_AES]=1;
750 doit[D_CBC_256_AES]=1;
754 #ifndef OPENSSL_NO_RSA
755 if (strcmp(*argv,"rsa") == 0)
757 rsa_doit[R_RSA_512]=1;
758 rsa_doit[R_RSA_1024]=1;
759 rsa_doit[R_RSA_2048]=1;
760 rsa_doit[R_RSA_4096]=1;
764 #ifndef OPENSSL_NO_DSA
765 if (strcmp(*argv,"dsa") == 0)
767 dsa_doit[R_DSA_512]=1;
768 dsa_doit[R_DSA_1024]=1;
773 BIO_printf(bio_err,"Error: bad option or value\n");
774 BIO_printf(bio_err,"\n");
775 BIO_printf(bio_err,"Available values:\n");
776 #ifndef OPENSSL_NO_MD2
777 BIO_printf(bio_err,"md2 ");
779 #ifndef OPENSSL_NO_MDC2
780 BIO_printf(bio_err,"mdc2 ");
782 #ifndef OPENSSL_NO_MD4
783 BIO_printf(bio_err,"md4 ");
785 #ifndef OPENSSL_NO_MD5
786 BIO_printf(bio_err,"md5 ");
787 #ifndef OPENSSL_NO_HMAC
788 BIO_printf(bio_err,"hmac ");
791 #ifndef OPENSSL_NO_SHA1
792 BIO_printf(bio_err,"sha1 ");
794 #ifndef OPENSSL_NO_RIPEMD160
795 BIO_printf(bio_err,"rmd160");
797 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
798 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
799 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
800 BIO_printf(bio_err,"\n");
803 #ifndef OPENSSL_NO_IDEA
804 BIO_printf(bio_err,"idea-cbc ");
806 #ifndef OPENSSL_NO_RC2
807 BIO_printf(bio_err,"rc2-cbc ");
809 #ifndef OPENSSL_NO_RC5
810 BIO_printf(bio_err,"rc5-cbc ");
812 #ifndef OPENSSL_NO_BF
813 BIO_printf(bio_err,"bf-cbc");
815 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
816 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
817 BIO_printf(bio_err,"\n");
819 #ifndef OPENSSL_NO_DES
820 BIO_printf(bio_err,"des-cbc des-ede3 ");
822 #ifndef OPENSSL_NO_AES
823 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
825 #ifndef OPENSSL_NO_RC4
826 BIO_printf(bio_err,"rc4");
828 BIO_printf(bio_err,"\n");
830 #ifndef OPENSSL_NO_RSA
831 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
834 #ifndef OPENSSL_NO_DSA
835 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
838 #ifndef OPENSSL_NO_IDEA
839 BIO_printf(bio_err,"idea ");
841 #ifndef OPENSSL_NO_RC2
842 BIO_printf(bio_err,"rc2 ");
844 #ifndef OPENSSL_NO_DES
845 BIO_printf(bio_err,"des ");
847 #ifndef OPENSSL_NO_AES
848 BIO_printf(bio_err,"aes ");
850 #ifndef OPENSSL_NO_RSA
851 BIO_printf(bio_err,"rsa ");
853 #ifndef OPENSSL_NO_BF
854 BIO_printf(bio_err,"blowfish");
856 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
857 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
858 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
859 BIO_printf(bio_err,"\n");
862 BIO_printf(bio_err,"\n");
863 BIO_printf(bio_err,"Available options:\n");
864 #if defined(TIMES) || defined(USE_TOD)
865 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
867 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
868 BIO_printf(bio_err,"-evp e use EVP e.\n");
869 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
870 BIO_printf(bio_err,"-mr produce machine readable output.\n");
872 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
882 if(multi && do_multi(multi))
888 for (i=0; i<ALGOR_NUM; i++)
893 for (i=0; i<RSA_NUM; i++)
895 for (i=0; i<DSA_NUM; i++)
898 for (i=0; i<ALGOR_NUM; i++)
899 if (doit[i]) pr_header++;
901 if (usertime == 0 && !mr)
902 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
903 if (usertime <= 0 && !mr)
905 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
906 BIO_printf(bio_err,"program when this computer is idle.\n");
909 #ifndef OPENSSL_NO_RSA
910 for (i=0; i<RSA_NUM; i++)
912 const unsigned char *p;
915 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
916 if (rsa_key[i] == NULL)
918 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
924 BIO_printf(bio_err,mr ? "+RK:%d:"
925 : "Loaded RSA key, %d bit modulus and e= 0x",
926 BN_num_bits(rsa_key[i]->n));
927 BN_print(bio_err,rsa_key[i]->e);
928 BIO_printf(bio_err,"\n");
934 #ifndef OPENSSL_NO_DSA
935 dsa_key[0]=get_dsa512();
936 dsa_key[1]=get_dsa1024();
937 dsa_key[2]=get_dsa2048();
940 #ifndef OPENSSL_NO_DES
941 DES_set_key_unchecked(&key,&sch);
942 DES_set_key_unchecked(&key2,&sch2);
943 DES_set_key_unchecked(&key3,&sch3);
945 #ifndef OPENSSL_NO_AES
946 AES_set_encrypt_key(key16,128,&aes_ks1);
947 AES_set_encrypt_key(key24,192,&aes_ks2);
948 AES_set_encrypt_key(key32,256,&aes_ks3);
950 #ifndef OPENSSL_NO_IDEA
951 idea_set_encrypt_key(key16,&idea_ks);
953 #ifndef OPENSSL_NO_RC4
954 RC4_set_key(&rc4_ks,16,key16);
956 #ifndef OPENSSL_NO_RC2
957 RC2_set_key(&rc2_ks,16,key16,128);
959 #ifndef OPENSSL_NO_RC5
960 RC5_32_set_key(&rc5_ks,16,key16,12);
962 #ifndef OPENSSL_NO_BF
963 BF_set_key(&bf_ks,16,key16);
965 #ifndef OPENSSL_NO_CAST
966 CAST_set_key(&cast_ks,16,key16);
968 #ifndef OPENSSL_NO_RSA
969 memset(rsa_c,0,sizeof(rsa_c));
972 #ifndef OPENSSL_NO_DES
973 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
979 for (i=count; i; i--)
980 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
985 c[D_MD2][0]=count/10;
986 c[D_MDC2][0]=count/10;
991 c[D_RMD160][0]=count;
993 c[D_CBC_DES][0]=count;
994 c[D_EDE3_DES][0]=count/3;
995 c[D_CBC_IDEA][0]=count;
996 c[D_CBC_RC2][0]=count;
997 c[D_CBC_RC5][0]=count;
998 c[D_CBC_BF][0]=count;
999 c[D_CBC_CAST][0]=count;
1001 for (i=1; i<SIZE_NUM; i++)
1003 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1004 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1005 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1006 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1007 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1008 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1009 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1011 for (i=1; i<SIZE_NUM; i++)
1015 l0=(long)lengths[i-1];
1016 l1=(long)lengths[i];
1017 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1018 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1019 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1020 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1021 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1022 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1023 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1024 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1026 #ifndef OPENSSL_NO_RSA
1027 rsa_c[R_RSA_512][0]=count/2000;
1028 rsa_c[R_RSA_512][1]=count/400;
1029 for (i=1; i<RSA_NUM; i++)
1031 rsa_c[i][0]=rsa_c[i-1][0]/8;
1032 rsa_c[i][1]=rsa_c[i-1][1]/4;
1033 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1037 if (rsa_c[i][0] == 0)
1046 #ifndef OPENSSL_NO_DSA
1047 dsa_c[R_DSA_512][0]=count/1000;
1048 dsa_c[R_DSA_512][1]=count/1000/2;
1049 for (i=1; i<DSA_NUM; i++)
1051 dsa_c[i][0]=dsa_c[i-1][0]/4;
1052 dsa_c[i][1]=dsa_c[i-1][1]/4;
1053 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1066 #define COND(d) (count < (d))
1067 #define COUNT(d) (d)
1069 /* not worth fixing */
1070 # error "You cannot disable DES on systems without SIGALRM."
1071 #endif /* OPENSSL_NO_DES */
1073 #define COND(c) (run)
1074 #define COUNT(d) (count)
1075 signal(SIGALRM,sig_done);
1076 #endif /* SIGALRM */
1078 #ifndef OPENSSL_NO_MD2
1081 for (j=0; j<SIZE_NUM; j++)
1083 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1085 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1086 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1088 print_result(D_MD2,j,count,d);
1092 #ifndef OPENSSL_NO_MDC2
1095 for (j=0; j<SIZE_NUM; j++)
1097 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1099 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1100 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1102 print_result(D_MDC2,j,count,d);
1107 #ifndef OPENSSL_NO_MD4
1110 for (j=0; j<SIZE_NUM; j++)
1112 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1114 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1115 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1117 print_result(D_MD4,j,count,d);
1122 #ifndef OPENSSL_NO_MD5
1125 for (j=0; j<SIZE_NUM; j++)
1127 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1129 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1130 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1132 print_result(D_MD5,j,count,d);
1137 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1142 HMAC_CTX_init(&hctx);
1143 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1144 16,EVP_md5(), NULL);
1146 for (j=0; j<SIZE_NUM; j++)
1148 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1150 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1152 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1153 HMAC_Update(&hctx,buf,lengths[j]);
1154 HMAC_Final(&hctx,&(hmac[0]),NULL);
1157 print_result(D_HMAC,j,count,d);
1159 HMAC_CTX_cleanup(&hctx);
1162 #ifndef OPENSSL_NO_SHA
1165 for (j=0; j<SIZE_NUM; j++)
1167 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1169 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1170 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1172 print_result(D_SHA1,j,count,d);
1176 #ifndef OPENSSL_NO_RIPEMD
1179 for (j=0; j<SIZE_NUM; j++)
1181 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1183 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1184 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1186 print_result(D_RMD160,j,count,d);
1190 #ifndef OPENSSL_NO_RC4
1193 for (j=0; j<SIZE_NUM; j++)
1195 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1197 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1198 RC4(&rc4_ks,(unsigned int)lengths[j],
1201 print_result(D_RC4,j,count,d);
1205 #ifndef OPENSSL_NO_DES
1206 if (doit[D_CBC_DES])
1208 for (j=0; j<SIZE_NUM; j++)
1210 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1212 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1213 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1214 &DES_iv,DES_ENCRYPT);
1216 print_result(D_CBC_DES,j,count,d);
1220 if (doit[D_EDE3_DES])
1222 for (j=0; j<SIZE_NUM; j++)
1224 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1226 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1227 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1229 &DES_iv,DES_ENCRYPT);
1231 print_result(D_EDE3_DES,j,count,d);
1235 #ifndef OPENSSL_NO_AES
1236 if (doit[D_CBC_128_AES])
1238 for (j=0; j<SIZE_NUM; j++)
1240 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1242 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1243 AES_cbc_encrypt(buf,buf,
1244 (unsigned long)lengths[j],&aes_ks1,
1247 print_result(D_CBC_128_AES,j,count,d);
1250 if (doit[D_CBC_192_AES])
1252 for (j=0; j<SIZE_NUM; j++)
1254 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1256 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1257 AES_cbc_encrypt(buf,buf,
1258 (unsigned long)lengths[j],&aes_ks2,
1261 print_result(D_CBC_192_AES,j,count,d);
1264 if (doit[D_CBC_256_AES])
1266 for (j=0; j<SIZE_NUM; j++)
1268 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1270 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1271 AES_cbc_encrypt(buf,buf,
1272 (unsigned long)lengths[j],&aes_ks3,
1275 print_result(D_CBC_256_AES,j,count,d);
1280 #ifndef OPENSSL_NO_IDEA
1281 if (doit[D_CBC_IDEA])
1283 for (j=0; j<SIZE_NUM; j++)
1285 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1287 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1288 idea_cbc_encrypt(buf,buf,
1289 (unsigned long)lengths[j],&idea_ks,
1292 print_result(D_CBC_IDEA,j,count,d);
1296 #ifndef OPENSSL_NO_RC2
1297 if (doit[D_CBC_RC2])
1299 for (j=0; j<SIZE_NUM; j++)
1301 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1303 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1304 RC2_cbc_encrypt(buf,buf,
1305 (unsigned long)lengths[j],&rc2_ks,
1308 print_result(D_CBC_RC2,j,count,d);
1312 #ifndef OPENSSL_NO_RC5
1313 if (doit[D_CBC_RC5])
1315 for (j=0; j<SIZE_NUM; j++)
1317 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1319 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1320 RC5_32_cbc_encrypt(buf,buf,
1321 (unsigned long)lengths[j],&rc5_ks,
1324 print_result(D_CBC_RC5,j,count,d);
1328 #ifndef OPENSSL_NO_BF
1331 for (j=0; j<SIZE_NUM; j++)
1333 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1335 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1336 BF_cbc_encrypt(buf,buf,
1337 (unsigned long)lengths[j],&bf_ks,
1340 print_result(D_CBC_BF,j,count,d);
1344 #ifndef OPENSSL_NO_CAST
1345 if (doit[D_CBC_CAST])
1347 for (j=0; j<SIZE_NUM; j++)
1349 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1351 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1352 CAST_cbc_encrypt(buf,buf,
1353 (unsigned long)lengths[j],&cast_ks,
1356 print_result(D_CBC_CAST,j,count,d);
1363 for (j=0; j<SIZE_NUM; j++)
1370 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1371 /* -O3 -fschedule-insns messes up an
1372 * optimization here! names[D_EVP]
1373 * somehow becomes NULL */
1374 print_message(names[D_EVP],save_count,
1377 EVP_CIPHER_CTX_init(&ctx);
1379 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1381 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1385 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1386 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1388 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1389 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1391 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1393 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1398 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1399 print_message(names[D_EVP],save_count,
1403 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1404 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1408 print_result(D_EVP,j,count,d);
1412 RAND_pseudo_bytes(buf,36);
1413 #ifndef OPENSSL_NO_RSA
1414 for (j=0; j<RSA_NUM; j++)
1417 if (!rsa_doit[j]) continue;
1418 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1421 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1422 ERR_print_errors(bio_err);
1427 pkey_print_message("private","rsa",
1428 rsa_c[j][0],rsa_bits[j],
1430 /* RSA_blinding_on(rsa_key[j],NULL); */
1432 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1434 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1435 &rsa_num, rsa_key[j]);
1439 "RSA sign failure\n");
1440 ERR_print_errors(bio_err);
1446 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1447 : "%ld %d bit private RSA's in %.2fs\n",
1448 count,rsa_bits[j],d);
1449 rsa_results[j][0]=d/(double)count;
1454 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1457 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1458 ERR_print_errors(bio_err);
1463 pkey_print_message("public","rsa",
1464 rsa_c[j][1],rsa_bits[j],
1467 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1469 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1470 rsa_num, rsa_key[j]);
1474 "RSA verify failure\n");
1475 ERR_print_errors(bio_err);
1481 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1482 : "%ld %d bit public RSA's in %.2fs\n",
1483 count,rsa_bits[j],d);
1484 rsa_results[j][1]=d/(double)count;
1490 /* if longer than 10s, don't do any more */
1491 for (j++; j<RSA_NUM; j++)
1497 RAND_pseudo_bytes(buf,20);
1498 #ifndef OPENSSL_NO_DSA
1499 if (RAND_status() != 1)
1501 RAND_seed(rnd_seed, sizeof rnd_seed);
1504 for (j=0; j<DSA_NUM; j++)
1509 if (!dsa_doit[j]) continue;
1510 /* DSA_generate_key(dsa_key[j]); */
1511 /* DSA_sign_setup(dsa_key[j],NULL); */
1512 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1516 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1517 ERR_print_errors(bio_err);
1522 pkey_print_message("sign","dsa",
1523 dsa_c[j][0],dsa_bits[j],
1526 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1528 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1533 "DSA sign failure\n");
1534 ERR_print_errors(bio_err);
1540 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1541 : "%ld %d bit DSA signs in %.2fs\n",
1542 count,dsa_bits[j],d);
1543 dsa_results[j][0]=d/(double)count;
1547 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1551 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1552 ERR_print_errors(bio_err);
1557 pkey_print_message("verify","dsa",
1558 dsa_c[j][1],dsa_bits[j],
1561 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1563 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1568 "DSA verify failure\n");
1569 ERR_print_errors(bio_err);
1575 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1576 : "%ld %d bit DSA verify in %.2fs\n",
1577 count,dsa_bits[j],d);
1578 dsa_results[j][1]=d/(double)count;
1583 /* if longer than 10s, don't do any more */
1584 for (j++; j<DSA_NUM; j++)
1588 if (rnd_fake) RAND_cleanup();
1595 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1596 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1598 printf("%s ",BN_options());
1599 #ifndef OPENSSL_NO_MD2
1600 printf("%s ",MD2_options());
1602 #ifndef OPENSSL_NO_RC4
1603 printf("%s ",RC4_options());
1605 #ifndef OPENSSL_NO_DES
1606 printf("%s ",DES_options());
1608 #ifndef OPENSSL_NO_AES
1609 printf("%s ",AES_options());
1611 #ifndef OPENSSL_NO_IDEA
1612 printf("%s ",idea_options());
1614 #ifndef OPENSSL_NO_BF
1615 printf("%s ",BF_options());
1617 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1618 printf("available timing options: ");
1629 #define as_string(s) (#s)
1630 printf("HZ=%g", (double)HZ);
1632 printf(" [sysconf value]");
1636 printf("timing function used: %s%s%s%s%s%s%s\n",
1637 (ftime_used ? "ftime" : ""),
1638 (ftime_used + times_used > 1 ? "," : ""),
1639 (times_used ? "times" : ""),
1640 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1641 (gettimeofday_used ? "gettimeofday" : ""),
1642 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1643 (getrusage_used ? "getrusage" : ""));
1649 fprintf(stdout,"+H");
1652 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1653 fprintf(stdout,"type ");
1655 for (j=0; j<SIZE_NUM; j++)
1656 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1657 fprintf(stdout,"\n");
1660 for (k=0; k<ALGOR_NUM; k++)
1662 if (!doit[k]) continue;
1664 fprintf(stdout,"+F:%d:%s",k,names[k]);
1666 fprintf(stdout,"%-13s",names[k]);
1667 for (j=0; j<SIZE_NUM; j++)
1669 if (results[k][j] > 10000 && !mr)
1670 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1672 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1674 fprintf(stdout,"\n");
1676 #ifndef OPENSSL_NO_RSA
1678 for (k=0; k<RSA_NUM; k++)
1680 if (!rsa_doit[k]) continue;
1683 printf("%18ssign verify sign/s verify/s\n"," ");
1687 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1688 k,rsa_bits[k],rsa_results[k][0],
1691 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1692 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1693 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1696 #ifndef OPENSSL_NO_DSA
1698 for (k=0; k<DSA_NUM; k++)
1700 if (!dsa_doit[k]) continue;
1703 printf("%18ssign verify sign/s verify/s\n"," ");
1707 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1708 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1710 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1711 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1712 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1717 ERR_print_errors(bio_err);
1718 if (buf != NULL) OPENSSL_free(buf);
1719 if (buf2 != NULL) OPENSSL_free(buf2);
1720 #ifndef OPENSSL_NO_RSA
1721 for (i=0; i<RSA_NUM; i++)
1722 if (rsa_key[i] != NULL)
1723 RSA_free(rsa_key[i]);
1725 #ifndef OPENSSL_NO_DSA
1726 for (i=0; i<DSA_NUM; i++)
1727 if (dsa_key[i] != NULL)
1728 DSA_free(dsa_key[i]);
1734 static void print_message(const char *s, long num, int length)
1737 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1738 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1739 (void)BIO_flush(bio_err);
1742 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1743 : "Doing %s %ld times on %d size blocks: ",s,num,length);
1744 (void)BIO_flush(bio_err);
1751 static void pkey_print_message(char *str, char *str2, long num, int bits,
1755 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1756 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1757 (void)BIO_flush(bio_err);
1760 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1761 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1762 (void)BIO_flush(bio_err);
1769 static void print_result(int alg,int run_no,int count,double time_used)
1771 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1772 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1773 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1776 static char *sstrsep(char **string, const char *delim)
1779 char *token = *string;
1784 memset(isdelim, 0, 256);
1789 isdelim[(unsigned char)(*delim)] = 1;
1793 while (!isdelim[(unsigned char)(**string)])
1808 static int do_multi(int multi)
1813 static char sep[]=":";
1815 fds=malloc(multi*sizeof *fds);
1816 for(n=0 ; n < multi ; ++n)
1834 printf("Forked child %d\n",n);
1837 /* for now, assume the pipe is long enough to take all the output */
1838 for(n=0 ; n < multi ; ++n)
1844 f=fdopen(fds[n],"r");
1845 while(fgets(buf,sizeof buf,f))
1852 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1856 printf("Got: %s from %d\n",buf,n);
1857 if(!strncmp(buf,"+F:",3))
1863 alg=atoi(sstrsep(&p,sep));
1865 for(j=0 ; j < SIZE_NUM ; ++j)
1866 results[alg][j]+=atof(sstrsep(&p,sep));
1868 else if(!strncmp(buf,"+F2:",4))
1874 k=atoi(sstrsep(&p,sep));
1877 d=atof(sstrsep(&p,sep));
1879 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1881 rsa_results[k][0]=d;
1883 d=atof(sstrsep(&p,sep));
1885 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1887 rsa_results[k][1]=d;
1889 else if(!strncmp(buf,"+F2:",4))
1895 k=atoi(sstrsep(&p,sep));
1898 d=atof(sstrsep(&p,sep));
1900 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1902 rsa_results[k][0]=d;
1904 d=atof(sstrsep(&p,sep));
1906 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1908 rsa_results[k][1]=d;
1910 else if(!strncmp(buf,"+F3:",4))
1916 k=atoi(sstrsep(&p,sep));
1919 d=atof(sstrsep(&p,sep));
1921 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1923 dsa_results[k][0]=d;
1925 d=atof(sstrsep(&p,sep));
1927 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1929 dsa_results[k][1]=d;
1931 else if(!strncmp(buf,"+H:",3))
1935 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);