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_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__) /* 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)
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)
331 static struct timeb tstart,tend;
343 i=(long)tend.millitm-(long)tstart.millitm;
344 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
345 return((ret < 0.001)?0.001:ret);
352 int MAIN(int, char **);
354 int MAIN(int argc, char **argv)
357 unsigned char *buf=NULL,*buf2=NULL;
359 long count=0,save_count=0;
361 #ifndef OPENSSL_NO_RSA
365 unsigned char md[EVP_MAX_MD_SIZE];
366 #ifndef OPENSSL_NO_MD2
367 unsigned char md2[MD2_DIGEST_LENGTH];
369 #ifndef OPENSSL_NO_MDC2
370 unsigned char mdc2[MDC2_DIGEST_LENGTH];
372 #ifndef OPENSSL_NO_MD4
373 unsigned char md4[MD4_DIGEST_LENGTH];
375 #ifndef OPENSSL_NO_MD5
376 unsigned char md5[MD5_DIGEST_LENGTH];
377 unsigned char hmac[MD5_DIGEST_LENGTH];
379 #ifndef OPENSSL_NO_SHA
380 unsigned char sha[SHA_DIGEST_LENGTH];
382 #ifndef OPENSSL_NO_RIPEMD
383 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
385 #ifndef OPENSSL_NO_RC4
388 #ifndef OPENSSL_NO_RC5
391 #ifndef OPENSSL_NO_RC2
394 #ifndef OPENSSL_NO_IDEA
395 IDEA_KEY_SCHEDULE idea_ks;
397 #ifndef OPENSSL_NO_BF
400 #ifndef OPENSSL_NO_CAST
403 static const unsigned char key16[16]=
404 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
405 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
406 static const unsigned char key24[24]=
407 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
408 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
409 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
410 static const unsigned char key32[32]=
411 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
412 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
413 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
414 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
415 #ifndef OPENSSL_NO_AES
416 #define MAX_BLOCK_SIZE 128
418 #define MAX_BLOCK_SIZE 64
420 unsigned char DES_iv[8];
421 unsigned char iv[MAX_BLOCK_SIZE/8];
422 #ifndef OPENSSL_NO_DES
423 DES_cblock *buf_as_des_cblock = NULL;
424 static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
425 static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
426 static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
427 DES_key_schedule sch;
428 DES_key_schedule sch2;
429 DES_key_schedule sch3;
431 #ifndef OPENSSL_NO_AES
432 AES_KEY aes_ks1, aes_ks2, aes_ks3;
444 #define D_CBC_IDEA 10
448 #define D_CBC_CAST 14
449 #define D_CBC_128_AES 15
450 #define D_CBC_192_AES 16
451 #define D_CBC_256_AES 17
454 long c[ALGOR_NUM][SIZE_NUM];
462 #ifndef OPENSSL_NO_RSA
463 RSA *rsa_key[RSA_NUM];
464 long rsa_c[RSA_NUM][2];
465 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
466 static unsigned char *rsa_data[RSA_NUM]=
467 {test512,test1024,test2048,test4096};
468 static int rsa_data_length[RSA_NUM]={
469 sizeof(test512),sizeof(test1024),
470 sizeof(test2048),sizeof(test4096)};
472 #ifndef OPENSSL_NO_DSA
473 DSA *dsa_key[DSA_NUM];
474 long dsa_c[DSA_NUM][2];
475 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
477 int rsa_doit[RSA_NUM];
478 int dsa_doit[DSA_NUM];
481 const EVP_CIPHER *evp_cipher=NULL;
482 const EVP_MD *evp_md=NULL;
493 memset(results, 0, sizeof(results));
494 #ifndef OPENSSL_NO_DSA
495 memset(dsa_key,0,sizeof(dsa_key));
499 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
500 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
502 #ifndef OPENSSL_NO_RSA
503 memset(rsa_key,0,sizeof(rsa_key));
504 for (i=0; i<RSA_NUM; i++)
508 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
510 BIO_printf(bio_err,"out of memory\n");
513 #ifndef OPENSSL_NO_DES
514 buf_as_des_cblock = (des_cblock *)buf;
516 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
518 BIO_printf(bio_err,"out of memory\n");
522 memset(c,0,sizeof(c));
523 memset(DES_iv,0,sizeof(DES_iv));
524 memset(iv,0,sizeof(iv));
526 for (i=0; i<ALGOR_NUM; i++)
528 for (i=0; i<RSA_NUM; i++)
530 for (i=0; i<DSA_NUM; i++)
538 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
541 j--; /* Otherwise, -elapsed gets confused with
544 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
550 BIO_printf(bio_err,"no EVP given\n");
553 evp_cipher=EVP_get_cipherbyname(*argv);
556 evp_md=EVP_get_digestbyname(*argv);
558 if(!evp_cipher && !evp_md)
560 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
565 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
568 j--; /* Otherwise, -elapsed gets confused with
571 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
577 BIO_printf(bio_err,"no engine given\n");
580 e = setup_engine(bio_err, *argv, 0);
581 /* j will be increased again further down. We just
582 don't want speed to confuse an engine with an
583 algorithm, especially when none is given (which
584 means all of them should be run) */
588 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
594 BIO_printf(bio_err,"no multi count given\n");
600 BIO_printf(bio_err,"bad multi count\n");
603 j--; /* Otherwise, -mr gets confused with
607 else if (argc > 0 && !strcmp(*argv,"-mr"))
610 j--; /* Otherwise, -mr gets confused with
614 #ifndef OPENSSL_NO_MD2
615 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
618 #ifndef OPENSSL_NO_MDC2
619 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
622 #ifndef OPENSSL_NO_MD4
623 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
626 #ifndef OPENSSL_NO_MD5
627 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
630 #ifndef OPENSSL_NO_MD5
631 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
634 #ifndef OPENSSL_NO_SHA
635 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
637 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
640 #ifndef OPENSSL_NO_RIPEMD
641 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
643 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
645 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
648 #ifndef OPENSSL_NO_RC4
649 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
652 #ifndef OPENSSL_NO_DES
653 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
654 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
657 #ifndef OPENSSL_NO_AES
658 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
659 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
660 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
663 #ifndef OPENSSL_NO_RSA
664 #if 0 /* was: #ifdef RSAref */
665 if (strcmp(*argv,"rsaref") == 0)
667 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
673 if (strcmp(*argv,"openssl") == 0)
675 RSA_set_default_method(RSA_PKCS1_SSLeay());
680 #endif /* !OPENSSL_NO_RSA */
681 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
682 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
683 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
684 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
685 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
686 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
687 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
689 #ifndef OPENSSL_NO_RC2
690 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
691 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
694 #ifndef OPENSSL_NO_RC5
695 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
696 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
699 #ifndef OPENSSL_NO_IDEA
700 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
701 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
704 #ifndef OPENSSL_NO_BF
705 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
706 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
707 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
710 #ifndef OPENSSL_NO_CAST
711 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
712 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
713 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
716 #ifndef OPENSSL_NO_DES
717 if (strcmp(*argv,"des") == 0)
724 #ifndef OPENSSL_NO_AES
725 if (strcmp(*argv,"aes") == 0)
727 doit[D_CBC_128_AES]=1;
728 doit[D_CBC_192_AES]=1;
729 doit[D_CBC_256_AES]=1;
733 #ifndef OPENSSL_NO_RSA
734 if (strcmp(*argv,"rsa") == 0)
736 rsa_doit[R_RSA_512]=1;
737 rsa_doit[R_RSA_1024]=1;
738 rsa_doit[R_RSA_2048]=1;
739 rsa_doit[R_RSA_4096]=1;
743 #ifndef OPENSSL_NO_DSA
744 if (strcmp(*argv,"dsa") == 0)
746 dsa_doit[R_DSA_512]=1;
747 dsa_doit[R_DSA_1024]=1;
752 BIO_printf(bio_err,"Error: bad option or value\n");
753 BIO_printf(bio_err,"\n");
754 BIO_printf(bio_err,"Available values:\n");
755 #ifndef OPENSSL_NO_MD2
756 BIO_printf(bio_err,"md2 ");
758 #ifndef OPENSSL_NO_MDC2
759 BIO_printf(bio_err,"mdc2 ");
761 #ifndef OPENSSL_NO_MD4
762 BIO_printf(bio_err,"md4 ");
764 #ifndef OPENSSL_NO_MD5
765 BIO_printf(bio_err,"md5 ");
766 #ifndef OPENSSL_NO_HMAC
767 BIO_printf(bio_err,"hmac ");
770 #ifndef OPENSSL_NO_SHA1
771 BIO_printf(bio_err,"sha1 ");
773 #ifndef OPENSSL_NO_RIPEMD160
774 BIO_printf(bio_err,"rmd160");
776 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
777 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
778 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
779 BIO_printf(bio_err,"\n");
782 #ifndef OPENSSL_NO_IDEA
783 BIO_printf(bio_err,"idea-cbc ");
785 #ifndef OPENSSL_NO_RC2
786 BIO_printf(bio_err,"rc2-cbc ");
788 #ifndef OPENSSL_NO_RC5
789 BIO_printf(bio_err,"rc5-cbc ");
791 #ifndef OPENSSL_NO_BF
792 BIO_printf(bio_err,"bf-cbc");
794 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
795 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
796 BIO_printf(bio_err,"\n");
798 #ifndef OPENSSL_NO_DES
799 BIO_printf(bio_err,"des-cbc des-ede3 ");
801 #ifndef OPENSSL_NO_AES
802 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
804 #ifndef OPENSSL_NO_RC4
805 BIO_printf(bio_err,"rc4");
807 BIO_printf(bio_err,"\n");
809 #ifndef OPENSSL_NO_RSA
810 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
813 #ifndef OPENSSL_NO_DSA
814 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
817 #ifndef OPENSSL_NO_IDEA
818 BIO_printf(bio_err,"idea ");
820 #ifndef OPENSSL_NO_RC2
821 BIO_printf(bio_err,"rc2 ");
823 #ifndef OPENSSL_NO_DES
824 BIO_printf(bio_err,"des ");
826 #ifndef OPENSSL_NO_AES
827 BIO_printf(bio_err,"aes ");
829 #ifndef OPENSSL_NO_RSA
830 BIO_printf(bio_err,"rsa ");
832 #ifndef OPENSSL_NO_BF
833 BIO_printf(bio_err,"blowfish");
835 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
836 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
837 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
838 BIO_printf(bio_err,"\n");
841 BIO_printf(bio_err,"\n");
842 BIO_printf(bio_err,"Available options:\n");
844 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
846 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
847 BIO_printf(bio_err,"-evp e use EVP e.\n");
848 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
849 BIO_printf(bio_err,"-mr produce machine readable output.\n");
851 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
861 if(multi && do_multi(multi))
867 for (i=0; i<ALGOR_NUM; i++)
872 for (i=0; i<RSA_NUM; i++)
874 for (i=0; i<DSA_NUM; i++)
877 for (i=0; i<ALGOR_NUM; i++)
878 if (doit[i]) pr_header++;
880 if (usertime == 0 && !mr)
881 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
882 if (usertime <= 0 && !mr)
884 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
885 BIO_printf(bio_err,"program when this computer is idle.\n");
888 #ifndef OPENSSL_NO_RSA
889 for (i=0; i<RSA_NUM; i++)
891 const unsigned char *p;
894 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
895 if (rsa_key[i] == NULL)
897 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
903 BIO_printf(bio_err,mr ? "+RK:%d:"
904 : "Loaded RSA key, %d bit modulus and e= 0x",
905 BN_num_bits(rsa_key[i]->n));
906 BN_print(bio_err,rsa_key[i]->e);
907 BIO_printf(bio_err,"\n");
913 #ifndef OPENSSL_NO_DSA
914 dsa_key[0]=get_dsa512();
915 dsa_key[1]=get_dsa1024();
916 dsa_key[2]=get_dsa2048();
919 #ifndef OPENSSL_NO_DES
920 DES_set_key_unchecked(&key,&sch);
921 DES_set_key_unchecked(&key2,&sch2);
922 DES_set_key_unchecked(&key3,&sch3);
924 #ifndef OPENSSL_NO_AES
925 AES_set_encrypt_key(key16,128,&aes_ks1);
926 AES_set_encrypt_key(key24,192,&aes_ks2);
927 AES_set_encrypt_key(key32,256,&aes_ks3);
929 #ifndef OPENSSL_NO_IDEA
930 idea_set_encrypt_key(key16,&idea_ks);
932 #ifndef OPENSSL_NO_RC4
933 RC4_set_key(&rc4_ks,16,key16);
935 #ifndef OPENSSL_NO_RC2
936 RC2_set_key(&rc2_ks,16,key16,128);
938 #ifndef OPENSSL_NO_RC5
939 RC5_32_set_key(&rc5_ks,16,key16,12);
941 #ifndef OPENSSL_NO_BF
942 BF_set_key(&bf_ks,16,key16);
944 #ifndef OPENSSL_NO_CAST
945 CAST_set_key(&cast_ks,16,key16);
947 #ifndef OPENSSL_NO_RSA
948 memset(rsa_c,0,sizeof(rsa_c));
951 #ifndef OPENSSL_NO_DES
952 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
958 for (i=count; i; i--)
959 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
964 c[D_MD2][0]=count/10;
965 c[D_MDC2][0]=count/10;
970 c[D_RMD160][0]=count;
972 c[D_CBC_DES][0]=count;
973 c[D_EDE3_DES][0]=count/3;
974 c[D_CBC_IDEA][0]=count;
975 c[D_CBC_RC2][0]=count;
976 c[D_CBC_RC5][0]=count;
977 c[D_CBC_BF][0]=count;
978 c[D_CBC_CAST][0]=count;
980 for (i=1; i<SIZE_NUM; i++)
982 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
983 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
984 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
985 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
986 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
987 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
988 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
990 for (i=1; i<SIZE_NUM; i++)
994 l0=(long)lengths[i-1];
996 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
997 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
998 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
999 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1000 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1001 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1002 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1003 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1005 #ifndef OPENSSL_NO_RSA
1006 rsa_c[R_RSA_512][0]=count/2000;
1007 rsa_c[R_RSA_512][1]=count/400;
1008 for (i=1; i<RSA_NUM; i++)
1010 rsa_c[i][0]=rsa_c[i-1][0]/8;
1011 rsa_c[i][1]=rsa_c[i-1][1]/4;
1012 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1016 if (rsa_c[i][0] == 0)
1025 #ifndef OPENSSL_NO_DSA
1026 dsa_c[R_DSA_512][0]=count/1000;
1027 dsa_c[R_DSA_512][1]=count/1000/2;
1028 for (i=1; i<DSA_NUM; i++)
1030 dsa_c[i][0]=dsa_c[i-1][0]/4;
1031 dsa_c[i][1]=dsa_c[i-1][1]/4;
1032 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1045 #define COND(d) (count < (d))
1046 #define COUNT(d) (d)
1048 /* not worth fixing */
1049 # error "You cannot disable DES on systems without SIGALRM."
1050 #endif /* OPENSSL_NO_DES */
1052 #define COND(c) (run)
1053 #define COUNT(d) (count)
1054 signal(SIGALRM,sig_done);
1055 #endif /* SIGALRM */
1057 #ifndef OPENSSL_NO_MD2
1060 for (j=0; j<SIZE_NUM; j++)
1062 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1064 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1065 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1067 print_result(D_MD2,j,count,d);
1071 #ifndef OPENSSL_NO_MDC2
1074 for (j=0; j<SIZE_NUM; j++)
1076 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1078 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1079 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1081 print_result(D_MDC2,j,count,d);
1086 #ifndef OPENSSL_NO_MD4
1089 for (j=0; j<SIZE_NUM; j++)
1091 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1093 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1094 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1096 print_result(D_MD4,j,count,d);
1101 #ifndef OPENSSL_NO_MD5
1104 for (j=0; j<SIZE_NUM; j++)
1106 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1108 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1109 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1111 print_result(D_MD5,j,count,d);
1116 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1121 HMAC_CTX_init(&hctx);
1122 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1125 for (j=0; j<SIZE_NUM; j++)
1127 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1129 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1131 HMAC_Init_ex(&hctx,NULL,0,NULL);
1132 HMAC_Update(&hctx,buf,lengths[j]);
1133 HMAC_Final(&hctx,&(hmac[0]),NULL);
1136 print_result(D_HMAC,j,count,d);
1138 HMAC_CTX_cleanup(&hctx);
1141 #ifndef OPENSSL_NO_SHA
1144 for (j=0; j<SIZE_NUM; j++)
1146 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1148 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1149 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1151 print_result(D_SHA1,j,count,d);
1155 #ifndef OPENSSL_NO_RIPEMD
1158 for (j=0; j<SIZE_NUM; j++)
1160 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1162 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1163 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1165 print_result(D_RMD160,j,count,d);
1169 #ifndef OPENSSL_NO_RC4
1172 for (j=0; j<SIZE_NUM; j++)
1174 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1176 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1177 RC4(&rc4_ks,(unsigned int)lengths[j],
1180 print_result(D_RC4,j,count,d);
1184 #ifndef OPENSSL_NO_DES
1185 if (doit[D_CBC_DES])
1187 for (j=0; j<SIZE_NUM; j++)
1189 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1191 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1192 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1193 &DES_iv,DES_ENCRYPT);
1195 print_result(D_CBC_DES,j,count,d);
1199 if (doit[D_EDE3_DES])
1201 for (j=0; j<SIZE_NUM; j++)
1203 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1205 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1206 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1208 &DES_iv,DES_ENCRYPT);
1210 print_result(D_EDE3_DES,j,count,d);
1214 #ifndef OPENSSL_NO_AES
1215 if (doit[D_CBC_128_AES])
1217 for (j=0; j<SIZE_NUM; j++)
1219 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1221 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1222 AES_cbc_encrypt(buf,buf,
1223 (unsigned long)lengths[j],&aes_ks1,
1226 print_result(D_CBC_128_AES,j,count,d);
1229 if (doit[D_CBC_192_AES])
1231 for (j=0; j<SIZE_NUM; j++)
1233 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1235 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1236 AES_cbc_encrypt(buf,buf,
1237 (unsigned long)lengths[j],&aes_ks2,
1240 print_result(D_CBC_192_AES,j,count,d);
1243 if (doit[D_CBC_256_AES])
1245 for (j=0; j<SIZE_NUM; j++)
1247 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1249 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1250 AES_cbc_encrypt(buf,buf,
1251 (unsigned long)lengths[j],&aes_ks3,
1254 print_result(D_CBC_256_AES,j,count,d);
1259 #ifndef OPENSSL_NO_IDEA
1260 if (doit[D_CBC_IDEA])
1262 for (j=0; j<SIZE_NUM; j++)
1264 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1266 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1267 idea_cbc_encrypt(buf,buf,
1268 (unsigned long)lengths[j],&idea_ks,
1271 print_result(D_CBC_IDEA,j,count,d);
1275 #ifndef OPENSSL_NO_RC2
1276 if (doit[D_CBC_RC2])
1278 for (j=0; j<SIZE_NUM; j++)
1280 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1282 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1283 RC2_cbc_encrypt(buf,buf,
1284 (unsigned long)lengths[j],&rc2_ks,
1287 print_result(D_CBC_RC2,j,count,d);
1291 #ifndef OPENSSL_NO_RC5
1292 if (doit[D_CBC_RC5])
1294 for (j=0; j<SIZE_NUM; j++)
1296 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1298 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1299 RC5_32_cbc_encrypt(buf,buf,
1300 (unsigned long)lengths[j],&rc5_ks,
1303 print_result(D_CBC_RC5,j,count,d);
1307 #ifndef OPENSSL_NO_BF
1310 for (j=0; j<SIZE_NUM; j++)
1312 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1314 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1315 BF_cbc_encrypt(buf,buf,
1316 (unsigned long)lengths[j],&bf_ks,
1319 print_result(D_CBC_BF,j,count,d);
1323 #ifndef OPENSSL_NO_CAST
1324 if (doit[D_CBC_CAST])
1326 for (j=0; j<SIZE_NUM; j++)
1328 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1330 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1331 CAST_cbc_encrypt(buf,buf,
1332 (unsigned long)lengths[j],&cast_ks,
1335 print_result(D_CBC_CAST,j,count,d);
1342 for (j=0; j<SIZE_NUM; j++)
1349 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1350 /* -O3 -fschedule-insns messes up an
1351 * optimization here! names[D_EVP]
1352 * somehow becomes NULL */
1353 print_message(names[D_EVP],save_count,
1356 EVP_CIPHER_CTX_init(&ctx);
1358 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1360 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1364 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1365 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1367 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1368 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1370 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1372 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1377 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1378 print_message(names[D_EVP],save_count,
1382 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1383 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1387 print_result(D_EVP,j,count,d);
1391 RAND_pseudo_bytes(buf,36);
1392 #ifndef OPENSSL_NO_RSA
1393 for (j=0; j<RSA_NUM; j++)
1396 if (!rsa_doit[j]) continue;
1397 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1400 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1401 ERR_print_errors(bio_err);
1406 pkey_print_message("private","rsa",
1407 rsa_c[j][0],rsa_bits[j],
1409 /* RSA_blinding_on(rsa_key[j],NULL); */
1411 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1413 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1414 &rsa_num, rsa_key[j]);
1418 "RSA sign failure\n");
1419 ERR_print_errors(bio_err);
1425 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1426 : "%ld %d bit private RSA's in %.2fs\n",
1427 count,rsa_bits[j],d);
1428 rsa_results[j][0]=d/(double)count;
1433 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1436 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1437 ERR_print_errors(bio_err);
1442 pkey_print_message("public","rsa",
1443 rsa_c[j][1],rsa_bits[j],
1446 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1448 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1449 rsa_num, rsa_key[j]);
1453 "RSA verify failure\n");
1454 ERR_print_errors(bio_err);
1460 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1461 : "%ld %d bit public RSA's in %.2fs\n",
1462 count,rsa_bits[j],d);
1463 rsa_results[j][1]=d/(double)count;
1469 /* if longer than 10s, don't do any more */
1470 for (j++; j<RSA_NUM; j++)
1476 RAND_pseudo_bytes(buf,20);
1477 #ifndef OPENSSL_NO_DSA
1478 if (RAND_status() != 1)
1480 RAND_seed(rnd_seed, sizeof rnd_seed);
1483 for (j=0; j<DSA_NUM; j++)
1488 if (!dsa_doit[j]) continue;
1489 /* DSA_generate_key(dsa_key[j]); */
1490 /* DSA_sign_setup(dsa_key[j],NULL); */
1491 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1495 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1496 ERR_print_errors(bio_err);
1501 pkey_print_message("sign","dsa",
1502 dsa_c[j][0],dsa_bits[j],
1505 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1507 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1512 "DSA sign failure\n");
1513 ERR_print_errors(bio_err);
1519 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1520 : "%ld %d bit DSA signs in %.2fs\n",
1521 count,dsa_bits[j],d);
1522 dsa_results[j][0]=d/(double)count;
1526 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1530 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1531 ERR_print_errors(bio_err);
1536 pkey_print_message("verify","dsa",
1537 dsa_c[j][1],dsa_bits[j],
1540 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1542 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1547 "DSA verify failure\n");
1548 ERR_print_errors(bio_err);
1554 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1555 : "%ld %d bit DSA verify in %.2fs\n",
1556 count,dsa_bits[j],d);
1557 dsa_results[j][1]=d/(double)count;
1562 /* if longer than 10s, don't do any more */
1563 for (j++; j<DSA_NUM; j++)
1567 if (rnd_fake) RAND_cleanup();
1574 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1575 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1577 printf("%s ",BN_options());
1578 #ifndef OPENSSL_NO_MD2
1579 printf("%s ",MD2_options());
1581 #ifndef OPENSSL_NO_RC4
1582 printf("%s ",RC4_options());
1584 #ifndef OPENSSL_NO_DES
1585 printf("%s ",des_options());
1587 #ifndef OPENSSL_NO_AES
1588 printf("%s ",AES_options());
1590 #ifndef OPENSSL_NO_IDEA
1591 printf("%s ",idea_options());
1593 #ifndef OPENSSL_NO_BF
1594 printf("%s ",BF_options());
1596 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1597 printf("available timing options: ");
1608 #define as_string(s) (#s)
1609 printf("HZ=%g", HZ);
1611 printf(" [sysconf value]");
1615 printf("timing function used: %s%s%s%s%s%s%s\n",
1616 (ftime_used ? "ftime" : ""),
1617 (ftime_used + times_used > 1 ? "," : ""),
1618 (times_used ? "times" : ""),
1619 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1620 (gettimeofday_used ? "gettimeofday" : ""),
1621 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1622 (getrusage_used ? "getrusage" : ""));
1628 fprintf(stdout,"+H");
1631 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1632 fprintf(stdout,"type ");
1634 for (j=0; j<SIZE_NUM; j++)
1635 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1636 fprintf(stdout,"\n");
1639 for (k=0; k<ALGOR_NUM; k++)
1641 if (!doit[k]) continue;
1643 fprintf(stdout,"+F:%d:%s",k,names[k]);
1645 fprintf(stdout,"%-13s",names[k]);
1646 for (j=0; j<SIZE_NUM; j++)
1648 if (results[k][j] > 10000 && !mr)
1649 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1651 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1653 fprintf(stdout,"\n");
1655 #ifndef OPENSSL_NO_RSA
1657 for (k=0; k<RSA_NUM; k++)
1659 if (!rsa_doit[k]) continue;
1662 printf("%18ssign verify sign/s verify/s\n"," ");
1666 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1667 k,rsa_bits[k],rsa_results[k][0],
1670 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1671 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1672 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1675 #ifndef OPENSSL_NO_DSA
1677 for (k=0; k<DSA_NUM; k++)
1679 if (!dsa_doit[k]) continue;
1682 printf("%18ssign verify sign/s verify/s\n"," ");
1686 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1687 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1689 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1690 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1691 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1696 ERR_print_errors(bio_err);
1697 if (buf != NULL) OPENSSL_free(buf);
1698 if (buf2 != NULL) OPENSSL_free(buf2);
1699 #ifndef OPENSSL_NO_RSA
1700 for (i=0; i<RSA_NUM; i++)
1701 if (rsa_key[i] != NULL)
1702 RSA_free(rsa_key[i]);
1704 #ifndef OPENSSL_NO_DSA
1705 for (i=0; i<DSA_NUM; i++)
1706 if (dsa_key[i] != NULL)
1707 DSA_free(dsa_key[i]);
1713 static void print_message(const char *s, long num, int length)
1716 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1717 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1718 (void)BIO_flush(bio_err);
1721 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1722 : "Doing %s %ld times on %d size blocks: ",s,num,length);
1723 (void)BIO_flush(bio_err);
1730 static void pkey_print_message(char *str, char *str2, long num, int bits,
1734 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1735 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1736 (void)BIO_flush(bio_err);
1739 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1740 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1741 (void)BIO_flush(bio_err);
1748 static void print_result(int alg,int run_no,int count,double time_used)
1750 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1751 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1752 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1755 static char *sstrsep(char **string, const char *delim)
1758 char *token = *string;
1763 memset(isdelim, 0, 256);
1768 isdelim[(unsigned char)(*delim)] = 1;
1772 while (!isdelim[(unsigned char)(**string)])
1787 static int do_multi(int multi)
1792 static char sep[]=":";
1794 fds=malloc(multi*sizeof *fds);
1795 for(n=0 ; n < multi ; ++n)
1813 printf("Forked child %d\n",n);
1816 /* for now, assume the pipe is long enough to take all the output */
1817 for(n=0 ; n < multi ; ++n)
1823 f=fdopen(fds[n],"r");
1824 while(fgets(buf,sizeof buf,f))
1831 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1835 printf("Got: %s from %d\n",buf,n);
1836 if(!strncmp(buf,"+F:",3))
1842 alg=atoi(sstrsep(&p,sep));
1844 for(j=0 ; j < SIZE_NUM ; ++j)
1845 results[alg][j]+=atof(sstrsep(&p,sep));
1847 else if(!strncmp(buf,"+F2:",4))
1853 k=atoi(sstrsep(&p,sep));
1856 d=atof(sstrsep(&p,sep));
1858 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1860 rsa_results[k][0]=d;
1862 d=atof(sstrsep(&p,sep));
1864 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1866 rsa_results[k][1]=d;
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,"+F3:",4))
1895 k=atoi(sstrsep(&p,sep));
1898 d=atof(sstrsep(&p,sep));
1900 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1902 dsa_results[k][0]=d;
1904 d=atof(sstrsep(&p,sep));
1906 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1908 dsa_results[k][1]=d;
1910 else if(!strncmp(buf,"+H:",3))
1914 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);