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 #ifndef OPENSSL_NO_RSA
519 memset(rsa_key,0,sizeof(rsa_key));
520 for (i=0; i<RSA_NUM; i++)
524 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
526 BIO_printf(bio_err,"out of memory\n");
529 #ifndef OPENSSL_NO_DES
530 buf_as_des_cblock = (des_cblock *)buf;
532 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
534 BIO_printf(bio_err,"out of memory\n");
538 memset(c,0,sizeof(c));
539 memset(DES_iv,0,sizeof(DES_iv));
540 memset(iv,0,sizeof(iv));
542 for (i=0; i<ALGOR_NUM; i++)
544 for (i=0; i<RSA_NUM; i++)
546 for (i=0; i<DSA_NUM; i++)
554 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
557 j--; /* Otherwise, -elapsed gets confused with
560 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
566 BIO_printf(bio_err,"no EVP given\n");
569 evp_cipher=EVP_get_cipherbyname(*argv);
572 evp_md=EVP_get_digestbyname(*argv);
574 if(!evp_cipher && !evp_md)
576 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
581 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
584 j--; /* Otherwise, -elapsed gets confused with
587 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
593 BIO_printf(bio_err,"no engine given\n");
596 e = setup_engine(bio_err, *argv, 0);
597 /* j will be increased again further down. We just
598 don't want speed to confuse an engine with an
599 algorithm, especially when none is given (which
600 means all of them should be run) */
604 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
610 BIO_printf(bio_err,"no multi count given\n");
616 BIO_printf(bio_err,"bad multi count\n");
619 j--; /* Otherwise, -mr gets confused with
623 else if (argc > 0 && !strcmp(*argv,"-mr"))
626 j--; /* Otherwise, -mr gets confused with
630 #ifndef OPENSSL_NO_MD2
631 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
634 #ifndef OPENSSL_NO_MDC2
635 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
638 #ifndef OPENSSL_NO_MD4
639 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
642 #ifndef OPENSSL_NO_MD5
643 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
646 #ifndef OPENSSL_NO_MD5
647 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
650 #ifndef OPENSSL_NO_SHA
651 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
653 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
656 #ifndef OPENSSL_NO_RIPEMD
657 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
659 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
661 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
664 #ifndef OPENSSL_NO_RC4
665 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
668 #ifndef OPENSSL_NO_DES
669 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
670 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
673 #ifndef OPENSSL_NO_AES
674 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
675 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
676 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
679 #ifndef OPENSSL_NO_RSA
680 #if 0 /* was: #ifdef RSAref */
681 if (strcmp(*argv,"rsaref") == 0)
683 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
689 if (strcmp(*argv,"openssl") == 0)
691 RSA_set_default_method(RSA_PKCS1_SSLeay());
696 #endif /* !OPENSSL_NO_RSA */
697 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
698 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
699 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
700 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
701 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
702 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
703 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
705 #ifndef OPENSSL_NO_RC2
706 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
707 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
710 #ifndef OPENSSL_NO_RC5
711 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
712 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
715 #ifndef OPENSSL_NO_IDEA
716 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
717 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
720 #ifndef OPENSSL_NO_BF
721 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
722 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
723 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
726 #ifndef OPENSSL_NO_CAST
727 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
728 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
729 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
732 #ifndef OPENSSL_NO_DES
733 if (strcmp(*argv,"des") == 0)
740 #ifndef OPENSSL_NO_AES
741 if (strcmp(*argv,"aes") == 0)
743 doit[D_CBC_128_AES]=1;
744 doit[D_CBC_192_AES]=1;
745 doit[D_CBC_256_AES]=1;
749 #ifndef OPENSSL_NO_RSA
750 if (strcmp(*argv,"rsa") == 0)
752 rsa_doit[R_RSA_512]=1;
753 rsa_doit[R_RSA_1024]=1;
754 rsa_doit[R_RSA_2048]=1;
755 rsa_doit[R_RSA_4096]=1;
759 #ifndef OPENSSL_NO_DSA
760 if (strcmp(*argv,"dsa") == 0)
762 dsa_doit[R_DSA_512]=1;
763 dsa_doit[R_DSA_1024]=1;
768 BIO_printf(bio_err,"Error: bad option or value\n");
769 BIO_printf(bio_err,"\n");
770 BIO_printf(bio_err,"Available values:\n");
771 #ifndef OPENSSL_NO_MD2
772 BIO_printf(bio_err,"md2 ");
774 #ifndef OPENSSL_NO_MDC2
775 BIO_printf(bio_err,"mdc2 ");
777 #ifndef OPENSSL_NO_MD4
778 BIO_printf(bio_err,"md4 ");
780 #ifndef OPENSSL_NO_MD5
781 BIO_printf(bio_err,"md5 ");
782 #ifndef OPENSSL_NO_HMAC
783 BIO_printf(bio_err,"hmac ");
786 #ifndef OPENSSL_NO_SHA1
787 BIO_printf(bio_err,"sha1 ");
789 #ifndef OPENSSL_NO_RIPEMD160
790 BIO_printf(bio_err,"rmd160");
792 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
793 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
794 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
795 BIO_printf(bio_err,"\n");
798 #ifndef OPENSSL_NO_IDEA
799 BIO_printf(bio_err,"idea-cbc ");
801 #ifndef OPENSSL_NO_RC2
802 BIO_printf(bio_err,"rc2-cbc ");
804 #ifndef OPENSSL_NO_RC5
805 BIO_printf(bio_err,"rc5-cbc ");
807 #ifndef OPENSSL_NO_BF
808 BIO_printf(bio_err,"bf-cbc");
810 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
811 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
812 BIO_printf(bio_err,"\n");
814 #ifndef OPENSSL_NO_DES
815 BIO_printf(bio_err,"des-cbc des-ede3 ");
817 #ifndef OPENSSL_NO_AES
818 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
820 #ifndef OPENSSL_NO_RC4
821 BIO_printf(bio_err,"rc4");
823 BIO_printf(bio_err,"\n");
825 #ifndef OPENSSL_NO_RSA
826 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
829 #ifndef OPENSSL_NO_DSA
830 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
833 #ifndef OPENSSL_NO_IDEA
834 BIO_printf(bio_err,"idea ");
836 #ifndef OPENSSL_NO_RC2
837 BIO_printf(bio_err,"rc2 ");
839 #ifndef OPENSSL_NO_DES
840 BIO_printf(bio_err,"des ");
842 #ifndef OPENSSL_NO_AES
843 BIO_printf(bio_err,"aes ");
845 #ifndef OPENSSL_NO_RSA
846 BIO_printf(bio_err,"rsa ");
848 #ifndef OPENSSL_NO_BF
849 BIO_printf(bio_err,"blowfish");
851 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
852 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
853 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
854 BIO_printf(bio_err,"\n");
857 BIO_printf(bio_err,"\n");
858 BIO_printf(bio_err,"Available options:\n");
860 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
862 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
863 BIO_printf(bio_err,"-evp e use EVP e.\n");
864 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
865 BIO_printf(bio_err,"-mr produce machine readable output.\n");
867 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
877 if(multi && do_multi(multi))
883 for (i=0; i<ALGOR_NUM; i++)
888 for (i=0; i<RSA_NUM; i++)
890 for (i=0; i<DSA_NUM; i++)
893 for (i=0; i<ALGOR_NUM; i++)
894 if (doit[i]) pr_header++;
896 if (usertime == 0 && !mr)
897 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
898 if (usertime <= 0 && !mr)
900 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
901 BIO_printf(bio_err,"program when this computer is idle.\n");
904 #ifndef OPENSSL_NO_RSA
905 for (i=0; i<RSA_NUM; i++)
907 const unsigned char *p;
910 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
911 if (rsa_key[i] == NULL)
913 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
919 BIO_printf(bio_err,mr ? "+RK:%d:"
920 : "Loaded RSA key, %d bit modulus and e= 0x",
921 BN_num_bits(rsa_key[i]->n));
922 BN_print(bio_err,rsa_key[i]->e);
923 BIO_printf(bio_err,"\n");
929 #ifndef OPENSSL_NO_DSA
930 dsa_key[0]=get_dsa512();
931 dsa_key[1]=get_dsa1024();
932 dsa_key[2]=get_dsa2048();
935 #ifndef OPENSSL_NO_DES
936 DES_set_key_unchecked(&key,&sch);
937 DES_set_key_unchecked(&key2,&sch2);
938 DES_set_key_unchecked(&key3,&sch3);
940 #ifndef OPENSSL_NO_AES
941 AES_set_encrypt_key(key16,128,&aes_ks1);
942 AES_set_encrypt_key(key24,192,&aes_ks2);
943 AES_set_encrypt_key(key32,256,&aes_ks3);
945 #ifndef OPENSSL_NO_IDEA
946 idea_set_encrypt_key(key16,&idea_ks);
948 #ifndef OPENSSL_NO_RC4
949 RC4_set_key(&rc4_ks,16,key16);
951 #ifndef OPENSSL_NO_RC2
952 RC2_set_key(&rc2_ks,16,key16,128);
954 #ifndef OPENSSL_NO_RC5
955 RC5_32_set_key(&rc5_ks,16,key16,12);
957 #ifndef OPENSSL_NO_BF
958 BF_set_key(&bf_ks,16,key16);
960 #ifndef OPENSSL_NO_CAST
961 CAST_set_key(&cast_ks,16,key16);
963 #ifndef OPENSSL_NO_RSA
964 memset(rsa_c,0,sizeof(rsa_c));
967 #ifndef OPENSSL_NO_DES
968 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
974 for (i=count; i; i--)
975 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
980 c[D_MD2][0]=count/10;
981 c[D_MDC2][0]=count/10;
986 c[D_RMD160][0]=count;
988 c[D_CBC_DES][0]=count;
989 c[D_EDE3_DES][0]=count/3;
990 c[D_CBC_IDEA][0]=count;
991 c[D_CBC_RC2][0]=count;
992 c[D_CBC_RC5][0]=count;
993 c[D_CBC_BF][0]=count;
994 c[D_CBC_CAST][0]=count;
996 for (i=1; i<SIZE_NUM; i++)
998 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
999 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1000 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1001 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1002 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1003 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1004 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1006 for (i=1; i<SIZE_NUM; i++)
1010 l0=(long)lengths[i-1];
1011 l1=(long)lengths[i];
1012 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1013 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1014 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1015 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1016 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1017 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1018 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1019 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1021 #ifndef OPENSSL_NO_RSA
1022 rsa_c[R_RSA_512][0]=count/2000;
1023 rsa_c[R_RSA_512][1]=count/400;
1024 for (i=1; i<RSA_NUM; i++)
1026 rsa_c[i][0]=rsa_c[i-1][0]/8;
1027 rsa_c[i][1]=rsa_c[i-1][1]/4;
1028 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1032 if (rsa_c[i][0] == 0)
1041 #ifndef OPENSSL_NO_DSA
1042 dsa_c[R_DSA_512][0]=count/1000;
1043 dsa_c[R_DSA_512][1]=count/1000/2;
1044 for (i=1; i<DSA_NUM; i++)
1046 dsa_c[i][0]=dsa_c[i-1][0]/4;
1047 dsa_c[i][1]=dsa_c[i-1][1]/4;
1048 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1061 #define COND(d) (count < (d))
1062 #define COUNT(d) (d)
1064 /* not worth fixing */
1065 # error "You cannot disable DES on systems without SIGALRM."
1066 #endif /* OPENSSL_NO_DES */
1068 #define COND(c) (run)
1069 #define COUNT(d) (count)
1070 signal(SIGALRM,sig_done);
1071 #endif /* SIGALRM */
1073 #ifndef OPENSSL_NO_MD2
1076 for (j=0; j<SIZE_NUM; j++)
1078 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1080 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1081 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1083 print_result(D_MD2,j,count,d);
1087 #ifndef OPENSSL_NO_MDC2
1090 for (j=0; j<SIZE_NUM; j++)
1092 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1094 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1095 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1097 print_result(D_MDC2,j,count,d);
1102 #ifndef OPENSSL_NO_MD4
1105 for (j=0; j<SIZE_NUM; j++)
1107 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1109 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1110 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1112 print_result(D_MD4,j,count,d);
1117 #ifndef OPENSSL_NO_MD5
1120 for (j=0; j<SIZE_NUM; j++)
1122 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1124 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1125 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1127 print_result(D_MD5,j,count,d);
1132 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1137 HMAC_CTX_init(&hctx);
1138 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1141 for (j=0; j<SIZE_NUM; j++)
1143 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1145 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1147 HMAC_Init_ex(&hctx,NULL,0,NULL);
1148 HMAC_Update(&hctx,buf,lengths[j]);
1149 HMAC_Final(&hctx,&(hmac[0]),NULL);
1152 print_result(D_HMAC,j,count,d);
1154 HMAC_CTX_cleanup(&hctx);
1157 #ifndef OPENSSL_NO_SHA
1160 for (j=0; j<SIZE_NUM; j++)
1162 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1164 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1165 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1167 print_result(D_SHA1,j,count,d);
1171 #ifndef OPENSSL_NO_RIPEMD
1174 for (j=0; j<SIZE_NUM; j++)
1176 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1178 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1179 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1181 print_result(D_RMD160,j,count,d);
1185 #ifndef OPENSSL_NO_RC4
1188 for (j=0; j<SIZE_NUM; j++)
1190 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1192 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1193 RC4(&rc4_ks,(unsigned int)lengths[j],
1196 print_result(D_RC4,j,count,d);
1200 #ifndef OPENSSL_NO_DES
1201 if (doit[D_CBC_DES])
1203 for (j=0; j<SIZE_NUM; j++)
1205 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1207 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1208 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1209 &DES_iv,DES_ENCRYPT);
1211 print_result(D_CBC_DES,j,count,d);
1215 if (doit[D_EDE3_DES])
1217 for (j=0; j<SIZE_NUM; j++)
1219 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1221 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1222 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1224 &DES_iv,DES_ENCRYPT);
1226 print_result(D_EDE3_DES,j,count,d);
1230 #ifndef OPENSSL_NO_AES
1231 if (doit[D_CBC_128_AES])
1233 for (j=0; j<SIZE_NUM; j++)
1235 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1237 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1238 AES_cbc_encrypt(buf,buf,
1239 (unsigned long)lengths[j],&aes_ks1,
1242 print_result(D_CBC_128_AES,j,count,d);
1245 if (doit[D_CBC_192_AES])
1247 for (j=0; j<SIZE_NUM; j++)
1249 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1251 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1252 AES_cbc_encrypt(buf,buf,
1253 (unsigned long)lengths[j],&aes_ks2,
1256 print_result(D_CBC_192_AES,j,count,d);
1259 if (doit[D_CBC_256_AES])
1261 for (j=0; j<SIZE_NUM; j++)
1263 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1265 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1266 AES_cbc_encrypt(buf,buf,
1267 (unsigned long)lengths[j],&aes_ks3,
1270 print_result(D_CBC_256_AES,j,count,d);
1275 #ifndef OPENSSL_NO_IDEA
1276 if (doit[D_CBC_IDEA])
1278 for (j=0; j<SIZE_NUM; j++)
1280 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1282 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1283 idea_cbc_encrypt(buf,buf,
1284 (unsigned long)lengths[j],&idea_ks,
1287 print_result(D_CBC_IDEA,j,count,d);
1291 #ifndef OPENSSL_NO_RC2
1292 if (doit[D_CBC_RC2])
1294 for (j=0; j<SIZE_NUM; j++)
1296 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1298 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1299 RC2_cbc_encrypt(buf,buf,
1300 (unsigned long)lengths[j],&rc2_ks,
1303 print_result(D_CBC_RC2,j,count,d);
1307 #ifndef OPENSSL_NO_RC5
1308 if (doit[D_CBC_RC5])
1310 for (j=0; j<SIZE_NUM; j++)
1312 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1314 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1315 RC5_32_cbc_encrypt(buf,buf,
1316 (unsigned long)lengths[j],&rc5_ks,
1319 print_result(D_CBC_RC5,j,count,d);
1323 #ifndef OPENSSL_NO_BF
1326 for (j=0; j<SIZE_NUM; j++)
1328 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1330 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1331 BF_cbc_encrypt(buf,buf,
1332 (unsigned long)lengths[j],&bf_ks,
1335 print_result(D_CBC_BF,j,count,d);
1339 #ifndef OPENSSL_NO_CAST
1340 if (doit[D_CBC_CAST])
1342 for (j=0; j<SIZE_NUM; j++)
1344 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1346 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1347 CAST_cbc_encrypt(buf,buf,
1348 (unsigned long)lengths[j],&cast_ks,
1351 print_result(D_CBC_CAST,j,count,d);
1358 for (j=0; j<SIZE_NUM; j++)
1365 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1366 /* -O3 -fschedule-insns messes up an
1367 * optimization here! names[D_EVP]
1368 * somehow becomes NULL */
1369 print_message(names[D_EVP],save_count,
1372 EVP_CIPHER_CTX_init(&ctx);
1374 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1376 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1380 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1381 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1383 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1384 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1386 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1388 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1393 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1394 print_message(names[D_EVP],save_count,
1398 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1399 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1403 print_result(D_EVP,j,count,d);
1407 RAND_pseudo_bytes(buf,36);
1408 #ifndef OPENSSL_NO_RSA
1409 for (j=0; j<RSA_NUM; j++)
1412 if (!rsa_doit[j]) continue;
1413 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1416 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1417 ERR_print_errors(bio_err);
1422 pkey_print_message("private","rsa",
1423 rsa_c[j][0],rsa_bits[j],
1425 /* RSA_blinding_on(rsa_key[j],NULL); */
1427 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1429 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1430 &rsa_num, rsa_key[j]);
1434 "RSA sign failure\n");
1435 ERR_print_errors(bio_err);
1441 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1442 : "%ld %d bit private RSA's in %.2fs\n",
1443 count,rsa_bits[j],d);
1444 rsa_results[j][0]=d/(double)count;
1449 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1452 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1453 ERR_print_errors(bio_err);
1458 pkey_print_message("public","rsa",
1459 rsa_c[j][1],rsa_bits[j],
1462 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1464 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1465 rsa_num, rsa_key[j]);
1469 "RSA verify failure\n");
1470 ERR_print_errors(bio_err);
1476 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1477 : "%ld %d bit public RSA's in %.2fs\n",
1478 count,rsa_bits[j],d);
1479 rsa_results[j][1]=d/(double)count;
1485 /* if longer than 10s, don't do any more */
1486 for (j++; j<RSA_NUM; j++)
1492 RAND_pseudo_bytes(buf,20);
1493 #ifndef OPENSSL_NO_DSA
1494 if (RAND_status() != 1)
1496 RAND_seed(rnd_seed, sizeof rnd_seed);
1499 for (j=0; j<DSA_NUM; j++)
1504 if (!dsa_doit[j]) continue;
1505 /* DSA_generate_key(dsa_key[j]); */
1506 /* DSA_sign_setup(dsa_key[j],NULL); */
1507 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1511 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1512 ERR_print_errors(bio_err);
1517 pkey_print_message("sign","dsa",
1518 dsa_c[j][0],dsa_bits[j],
1521 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1523 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1528 "DSA sign failure\n");
1529 ERR_print_errors(bio_err);
1535 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1536 : "%ld %d bit DSA signs in %.2fs\n",
1537 count,dsa_bits[j],d);
1538 dsa_results[j][0]=d/(double)count;
1542 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1546 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1547 ERR_print_errors(bio_err);
1552 pkey_print_message("verify","dsa",
1553 dsa_c[j][1],dsa_bits[j],
1556 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1558 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1563 "DSA verify failure\n");
1564 ERR_print_errors(bio_err);
1570 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1571 : "%ld %d bit DSA verify in %.2fs\n",
1572 count,dsa_bits[j],d);
1573 dsa_results[j][1]=d/(double)count;
1578 /* if longer than 10s, don't do any more */
1579 for (j++; j<DSA_NUM; j++)
1583 if (rnd_fake) RAND_cleanup();
1590 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1591 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1593 printf("%s ",BN_options());
1594 #ifndef OPENSSL_NO_MD2
1595 printf("%s ",MD2_options());
1597 #ifndef OPENSSL_NO_RC4
1598 printf("%s ",RC4_options());
1600 #ifndef OPENSSL_NO_DES
1601 printf("%s ",des_options());
1603 #ifndef OPENSSL_NO_AES
1604 printf("%s ",AES_options());
1606 #ifndef OPENSSL_NO_IDEA
1607 printf("%s ",idea_options());
1609 #ifndef OPENSSL_NO_BF
1610 printf("%s ",BF_options());
1612 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1613 printf("available timing options: ");
1624 #define as_string(s) (#s)
1625 printf("HZ=%g", HZ);
1627 printf(" [sysconf value]");
1631 printf("timing function used: %s%s%s%s%s%s%s\n",
1632 (ftime_used ? "ftime" : ""),
1633 (ftime_used + times_used > 1 ? "," : ""),
1634 (times_used ? "times" : ""),
1635 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1636 (gettimeofday_used ? "gettimeofday" : ""),
1637 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1638 (getrusage_used ? "getrusage" : ""));
1644 fprintf(stdout,"+H");
1647 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1648 fprintf(stdout,"type ");
1650 for (j=0; j<SIZE_NUM; j++)
1651 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1652 fprintf(stdout,"\n");
1655 for (k=0; k<ALGOR_NUM; k++)
1657 if (!doit[k]) continue;
1659 fprintf(stdout,"+F:%d:%s",k,names[k]);
1661 fprintf(stdout,"%-13s",names[k]);
1662 for (j=0; j<SIZE_NUM; j++)
1664 if (results[k][j] > 10000 && !mr)
1665 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1667 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1669 fprintf(stdout,"\n");
1671 #ifndef OPENSSL_NO_RSA
1673 for (k=0; k<RSA_NUM; k++)
1675 if (!rsa_doit[k]) continue;
1678 printf("%18ssign verify sign/s verify/s\n"," ");
1682 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1683 k,rsa_bits[k],rsa_results[k][0],
1686 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1687 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1688 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1691 #ifndef OPENSSL_NO_DSA
1693 for (k=0; k<DSA_NUM; k++)
1695 if (!dsa_doit[k]) continue;
1698 printf("%18ssign verify sign/s verify/s\n"," ");
1702 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1703 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1705 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1706 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1707 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1712 ERR_print_errors(bio_err);
1713 if (buf != NULL) OPENSSL_free(buf);
1714 if (buf2 != NULL) OPENSSL_free(buf2);
1715 #ifndef OPENSSL_NO_RSA
1716 for (i=0; i<RSA_NUM; i++)
1717 if (rsa_key[i] != NULL)
1718 RSA_free(rsa_key[i]);
1720 #ifndef OPENSSL_NO_DSA
1721 for (i=0; i<DSA_NUM; i++)
1722 if (dsa_key[i] != NULL)
1723 DSA_free(dsa_key[i]);
1729 static void print_message(const char *s, long num, int length)
1732 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1733 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1734 (void)BIO_flush(bio_err);
1737 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1738 : "Doing %s %ld times on %d size blocks: ",s,num,length);
1739 (void)BIO_flush(bio_err);
1746 static void pkey_print_message(char *str, char *str2, long num, int bits,
1750 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1751 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1752 (void)BIO_flush(bio_err);
1755 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1756 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1757 (void)BIO_flush(bio_err);
1764 static void print_result(int alg,int run_no,int count,double time_used)
1766 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1767 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1768 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1771 static char *sstrsep(char **string, const char *delim)
1774 char *token = *string;
1779 memset(isdelim, 0, 256);
1784 isdelim[(unsigned char)(*delim)] = 1;
1788 while (!isdelim[(unsigned char)(**string)])
1803 static int do_multi(int multi)
1808 static char sep[]=":";
1810 fds=malloc(multi*sizeof *fds);
1811 for(n=0 ; n < multi ; ++n)
1829 printf("Forked child %d\n",n);
1832 /* for now, assume the pipe is long enough to take all the output */
1833 for(n=0 ; n < multi ; ++n)
1839 f=fdopen(fds[n],"r");
1840 while(fgets(buf,sizeof buf,f))
1847 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1851 printf("Got: %s from %d\n",buf,n);
1852 if(!strncmp(buf,"+F:",3))
1858 alg=atoi(sstrsep(&p,sep));
1860 for(j=0 ; j < SIZE_NUM ; ++j)
1861 results[alg][j]+=atof(sstrsep(&p,sep));
1863 else if(!strncmp(buf,"+F2:",4))
1869 k=atoi(sstrsep(&p,sep));
1872 d=atof(sstrsep(&p,sep));
1874 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1876 rsa_results[k][0]=d;
1878 d=atof(sstrsep(&p,sep));
1880 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1882 rsa_results[k][1]=d;
1884 else if(!strncmp(buf,"+F2:",4))
1890 k=atoi(sstrsep(&p,sep));
1893 d=atof(sstrsep(&p,sep));
1895 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1897 rsa_results[k][0]=d;
1899 d=atof(sstrsep(&p,sep));
1901 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1903 rsa_results[k][1]=d;
1905 else if(!strncmp(buf,"+F3:",4))
1911 k=atoi(sstrsep(&p,sep));
1914 d=atof(sstrsep(&p,sep));
1916 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1918 dsa_results[k][0]=d;
1920 d=atof(sstrsep(&p,sep));
1922 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1924 dsa_results[k][1]=d;
1926 else if(!strncmp(buf,"+H:",3))
1930 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);