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 */
61 #ifndef OPENSSL_NO_SPEED
65 #define RSA_SECONDS 10
66 #define DSA_SECONDS 10
68 /* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
69 /* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
72 #define PROG speed_main
80 #ifdef OPENSSL_NO_STDIO
83 #include <openssl/crypto.h>
84 #include <openssl/rand.h>
85 #include <openssl/err.h>
86 #include <openssl/evp.h>
87 #include <openssl/objects.h>
88 #if !defined(OPENSSL_SYS_MSDOS)
89 #include OPENSSL_UNISTD
92 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
94 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
97 #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 */
105 # include <sys/types.h>
106 # include <sys/times.h>
109 # include <sys/time.h>
110 # include <sys/resource.h>
113 /* Depending on the VMS version, the tms structure is perhaps defined.
114 The __TMS macro will show if it was. If it wasn't defined, we should
115 undefine TIMES, since that tells the rest of the program how things
116 should be handled. -- Richard Levitte */
117 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
122 #include <sys/timeb.h>
125 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS)
126 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
129 #if defined(sun) || defined(__ultrix)
130 #define _POSIX_SOURCE
132 #include <sys/param.h>
135 #ifndef OPENSSL_NO_DES
136 #include <openssl/des.h>
138 #ifndef OPENSSL_NO_AES
139 #include <openssl/aes.h>
141 #ifndef OPENSSL_NO_MD2
142 #include <openssl/md2.h>
144 #ifndef OPENSSL_NO_MDC2
145 #include <openssl/mdc2.h>
147 #ifndef OPENSSL_NO_MD4
148 #include <openssl/md4.h>
150 #ifndef OPENSSL_NO_MD5
151 #include <openssl/md5.h>
153 #ifndef OPENSSL_NO_HMAC
154 #include <openssl/hmac.h>
156 #include <openssl/evp.h>
157 #ifndef OPENSSL_NO_SHA
158 #include <openssl/sha.h>
160 #ifndef OPENSSL_NO_RIPEMD
161 #include <openssl/ripemd.h>
163 #ifndef OPENSSL_NO_RC4
164 #include <openssl/rc4.h>
166 #ifndef OPENSSL_NO_RC5
167 #include <openssl/rc5.h>
169 #ifndef OPENSSL_NO_RC2
170 #include <openssl/rc2.h>
172 #ifndef OPENSSL_NO_IDEA
173 #include <openssl/idea.h>
175 #ifndef OPENSSL_NO_BF
176 #include <openssl/blowfish.h>
178 #ifndef OPENSSL_NO_CAST
179 #include <openssl/cast.h>
181 #ifndef OPENSSL_NO_RSA
182 #include <openssl/rsa.h>
183 #include "./testrsa.h"
185 #include <openssl/x509.h>
186 #ifndef OPENSSL_NO_DSA
187 #include "./testdsa.h"
190 /* The following if from times(3) man page. It may need to be changed */
192 # if defined(_SC_CLK_TCK) \
193 && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000)
194 # define HZ ((double)sysconf(_SC_CLK_TCK))
197 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
199 # else /* _BSD_CLK_TCK_ */
200 # define HZ ((double)_BSD_CLK_TCK_)
203 # define HZ ((double)CLK_TCK)
208 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
213 #define BUFSIZE ((long)1024*8+1)
216 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
218 static int usertime=1;
220 static double Time_F(int s);
221 static void print_message(const char *s,long num,int length);
222 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
223 static void print_result(int alg,int run_no,int count,double time_used);
225 static int do_multi(int multi);
232 static const char *names[ALGOR_NUM]={
233 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
234 "des cbc","des ede3","idea cbc",
235 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
236 "aes-128 cbc","aes-192 cbc","aes-256 cbc"};
237 static double results[ALGOR_NUM][SIZE_NUM];
238 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
239 static double rsa_results[RSA_NUM][2];
240 static double dsa_results[DSA_NUM][2];
243 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
244 #define SIGRETTYPE void
246 #define SIGRETTYPE int
249 static SIGRETTYPE sig_done(int sig);
250 static SIGRETTYPE sig_done(int sig)
252 signal(SIGALRM,sig_done);
263 static double Time_F(int s)
270 static struct rusage tstart,tend;
275 getrusage(RUSAGE_SELF,&tstart);
282 getrusage(RUSAGE_SELF,&tend);
283 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
284 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
285 +((double)i)/1000000.0;
286 return((ret < 0.001)?0.001:ret);
291 static struct timeval tstart,tend;
294 gettimeofday_used = 1;
297 gettimeofday(&tstart,NULL);
302 gettimeofday(&tend,NULL);
303 i=(long)tend.tv_usec-(long)tstart.tv_usec;
304 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
305 return((ret < 0.001)?0.001:ret);
308 #else /* ndef USE_TOD */
313 static struct tms tstart,tend;
324 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
325 return((ret < 1e-3)?1e-3:ret);
328 # endif /* times() */
329 # if defined(TIMES) && defined(TIMEB)
332 # ifdef OPENSSL_SYS_VXWORKS
334 static unsigned long tick_start, tick_end;
338 tick_start = tickGet();
343 tick_end = tickGet();
344 ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
345 return((ret < 0.001)?0.001:ret);
348 # elif defined(TIMEB)
350 static struct timeb tstart,tend;
362 i=(long)tend.millitm-(long)tstart.millitm;
363 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
364 return((ret < 0.001)?0.001:ret);
371 int MAIN(int, char **);
373 int MAIN(int argc, char **argv)
375 #ifndef OPENSSL_NO_ENGINE
378 unsigned char *buf=NULL,*buf2=NULL;
380 long count=0,save_count=0;
382 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
385 #ifndef OPENSSL_NO_RSA
388 unsigned char md[EVP_MAX_MD_SIZE];
389 #ifndef OPENSSL_NO_MD2
390 unsigned char md2[MD2_DIGEST_LENGTH];
392 #ifndef OPENSSL_NO_MDC2
393 unsigned char mdc2[MDC2_DIGEST_LENGTH];
395 #ifndef OPENSSL_NO_MD4
396 unsigned char md4[MD4_DIGEST_LENGTH];
398 #ifndef OPENSSL_NO_MD5
399 unsigned char md5[MD5_DIGEST_LENGTH];
400 unsigned char hmac[MD5_DIGEST_LENGTH];
402 #ifndef OPENSSL_NO_SHA
403 unsigned char sha[SHA_DIGEST_LENGTH];
405 #ifndef OPENSSL_NO_RIPEMD
406 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
408 #ifndef OPENSSL_NO_RC4
411 #ifndef OPENSSL_NO_RC5
414 #ifndef OPENSSL_NO_RC2
417 #ifndef OPENSSL_NO_IDEA
418 IDEA_KEY_SCHEDULE idea_ks;
420 #ifndef OPENSSL_NO_BF
423 #ifndef OPENSSL_NO_CAST
426 static const unsigned char key16[16]=
427 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
428 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
429 static const unsigned char key24[24]=
430 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
431 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
432 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
433 static const unsigned char key32[32]=
434 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
435 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
436 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
437 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
438 #ifndef OPENSSL_NO_AES
439 #define MAX_BLOCK_SIZE 128
441 #define MAX_BLOCK_SIZE 64
443 unsigned char DES_iv[8];
444 unsigned char iv[MAX_BLOCK_SIZE/8];
445 #ifndef OPENSSL_NO_DES
446 DES_cblock *buf_as_des_cblock = NULL;
447 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
448 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
449 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
450 DES_key_schedule sch;
451 DES_key_schedule sch2;
452 DES_key_schedule sch3;
454 #ifndef OPENSSL_NO_AES
455 AES_KEY aes_ks1, aes_ks2, aes_ks3;
467 #define D_CBC_IDEA 10
471 #define D_CBC_CAST 14
472 #define D_CBC_128_AES 15
473 #define D_CBC_192_AES 16
474 #define D_CBC_256_AES 17
477 long c[ALGOR_NUM][SIZE_NUM];
485 #ifndef OPENSSL_NO_RSA
486 RSA *rsa_key[RSA_NUM];
487 long rsa_c[RSA_NUM][2];
488 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
489 static unsigned char *rsa_data[RSA_NUM]=
490 {test512,test1024,test2048,test4096};
491 static int rsa_data_length[RSA_NUM]={
492 sizeof(test512),sizeof(test1024),
493 sizeof(test2048),sizeof(test4096)};
495 #ifndef OPENSSL_NO_DSA
496 DSA *dsa_key[DSA_NUM];
497 long dsa_c[DSA_NUM][2];
498 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
500 int rsa_doit[RSA_NUM];
501 int dsa_doit[DSA_NUM];
504 const EVP_CIPHER *evp_cipher=NULL;
505 const EVP_MD *evp_md=NULL;
516 memset(results, 0, sizeof(results));
517 #ifndef OPENSSL_NO_DSA
518 memset(dsa_key,0,sizeof(dsa_key));
522 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
523 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
525 if (!load_config(bio_err, NULL))
528 #ifndef OPENSSL_NO_RSA
529 memset(rsa_key,0,sizeof(rsa_key));
530 for (i=0; i<RSA_NUM; i++)
534 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
536 BIO_printf(bio_err,"out of memory\n");
539 #ifndef OPENSSL_NO_DES
540 buf_as_des_cblock = (DES_cblock *)buf;
542 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
544 BIO_printf(bio_err,"out of memory\n");
548 memset(c,0,sizeof(c));
549 memset(DES_iv,0,sizeof(DES_iv));
550 memset(iv,0,sizeof(iv));
552 for (i=0; i<ALGOR_NUM; i++)
554 for (i=0; i<RSA_NUM; i++)
556 for (i=0; i<DSA_NUM; i++)
564 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
567 j--; /* Otherwise, -elapsed gets confused with
570 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
576 BIO_printf(bio_err,"no EVP given\n");
579 evp_cipher=EVP_get_cipherbyname(*argv);
582 evp_md=EVP_get_digestbyname(*argv);
584 if(!evp_cipher && !evp_md)
586 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
591 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
594 j--; /* Otherwise, -elapsed gets confused with
597 #ifndef OPENSSL_NO_ENGINE
598 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
604 BIO_printf(bio_err,"no engine given\n");
607 e = setup_engine(bio_err, *argv, 0);
608 /* j will be increased again further down. We just
609 don't want speed to confuse an engine with an
610 algorithm, especially when none is given (which
611 means all of them should be run) */
616 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
622 BIO_printf(bio_err,"no multi count given\n");
628 BIO_printf(bio_err,"bad multi count\n");
631 j--; /* Otherwise, -mr gets confused with
635 else if (argc > 0 && !strcmp(*argv,"-mr"))
638 j--; /* Otherwise, -mr gets confused with
642 #ifndef OPENSSL_NO_MD2
643 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
646 #ifndef OPENSSL_NO_MDC2
647 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
650 #ifndef OPENSSL_NO_MD4
651 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
654 #ifndef OPENSSL_NO_MD5
655 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
658 #ifndef OPENSSL_NO_MD5
659 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
662 #ifndef OPENSSL_NO_SHA
663 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
665 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
668 #ifndef OPENSSL_NO_RIPEMD
669 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
671 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
673 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
676 #ifndef OPENSSL_NO_RC4
677 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
680 #ifndef OPENSSL_NO_DES
681 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
682 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
685 #ifndef OPENSSL_NO_AES
686 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
687 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
688 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
691 #ifndef OPENSSL_NO_RSA
692 #if 0 /* was: #ifdef RSAref */
693 if (strcmp(*argv,"rsaref") == 0)
695 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
701 if (strcmp(*argv,"openssl") == 0)
703 RSA_set_default_method(RSA_PKCS1_SSLeay());
708 #endif /* !OPENSSL_NO_RSA */
709 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
710 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
711 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
712 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
713 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
714 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
715 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
717 #ifndef OPENSSL_NO_RC2
718 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
719 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
722 #ifndef OPENSSL_NO_RC5
723 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
724 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
727 #ifndef OPENSSL_NO_IDEA
728 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
729 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
732 #ifndef OPENSSL_NO_BF
733 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
734 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
735 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
738 #ifndef OPENSSL_NO_CAST
739 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
740 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
741 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
744 #ifndef OPENSSL_NO_DES
745 if (strcmp(*argv,"des") == 0)
752 #ifndef OPENSSL_NO_AES
753 if (strcmp(*argv,"aes") == 0)
755 doit[D_CBC_128_AES]=1;
756 doit[D_CBC_192_AES]=1;
757 doit[D_CBC_256_AES]=1;
761 #ifndef OPENSSL_NO_RSA
762 if (strcmp(*argv,"rsa") == 0)
764 rsa_doit[R_RSA_512]=1;
765 rsa_doit[R_RSA_1024]=1;
766 rsa_doit[R_RSA_2048]=1;
767 rsa_doit[R_RSA_4096]=1;
771 #ifndef OPENSSL_NO_DSA
772 if (strcmp(*argv,"dsa") == 0)
774 dsa_doit[R_DSA_512]=1;
775 dsa_doit[R_DSA_1024]=1;
780 BIO_printf(bio_err,"Error: bad option or value\n");
781 BIO_printf(bio_err,"\n");
782 BIO_printf(bio_err,"Available values:\n");
783 #ifndef OPENSSL_NO_MD2
784 BIO_printf(bio_err,"md2 ");
786 #ifndef OPENSSL_NO_MDC2
787 BIO_printf(bio_err,"mdc2 ");
789 #ifndef OPENSSL_NO_MD4
790 BIO_printf(bio_err,"md4 ");
792 #ifndef OPENSSL_NO_MD5
793 BIO_printf(bio_err,"md5 ");
794 #ifndef OPENSSL_NO_HMAC
795 BIO_printf(bio_err,"hmac ");
798 #ifndef OPENSSL_NO_SHA1
799 BIO_printf(bio_err,"sha1 ");
801 #ifndef OPENSSL_NO_RIPEMD160
802 BIO_printf(bio_err,"rmd160");
804 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
805 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
806 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
807 BIO_printf(bio_err,"\n");
810 #ifndef OPENSSL_NO_IDEA
811 BIO_printf(bio_err,"idea-cbc ");
813 #ifndef OPENSSL_NO_RC2
814 BIO_printf(bio_err,"rc2-cbc ");
816 #ifndef OPENSSL_NO_RC5
817 BIO_printf(bio_err,"rc5-cbc ");
819 #ifndef OPENSSL_NO_BF
820 BIO_printf(bio_err,"bf-cbc");
822 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
823 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
824 BIO_printf(bio_err,"\n");
826 #ifndef OPENSSL_NO_DES
827 BIO_printf(bio_err,"des-cbc des-ede3 ");
829 #ifndef OPENSSL_NO_AES
830 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
832 #ifndef OPENSSL_NO_RC4
833 BIO_printf(bio_err,"rc4");
835 BIO_printf(bio_err,"\n");
837 #ifndef OPENSSL_NO_RSA
838 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
841 #ifndef OPENSSL_NO_DSA
842 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
845 #ifndef OPENSSL_NO_IDEA
846 BIO_printf(bio_err,"idea ");
848 #ifndef OPENSSL_NO_RC2
849 BIO_printf(bio_err,"rc2 ");
851 #ifndef OPENSSL_NO_DES
852 BIO_printf(bio_err,"des ");
854 #ifndef OPENSSL_NO_AES
855 BIO_printf(bio_err,"aes ");
857 #ifndef OPENSSL_NO_RSA
858 BIO_printf(bio_err,"rsa ");
860 #ifndef OPENSSL_NO_BF
861 BIO_printf(bio_err,"blowfish");
863 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
864 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
865 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
866 BIO_printf(bio_err,"\n");
869 BIO_printf(bio_err,"\n");
870 BIO_printf(bio_err,"Available options:\n");
871 #if defined(TIMES) || defined(USE_TOD)
872 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
874 #ifndef OPENSSL_NO_ENGINE
875 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
877 BIO_printf(bio_err,"-evp e use EVP e.\n");
878 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
879 BIO_printf(bio_err,"-mr produce machine readable output.\n");
881 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
891 if(multi && do_multi(multi))
897 for (i=0; i<ALGOR_NUM; i++)
902 for (i=0; i<RSA_NUM; i++)
904 for (i=0; i<DSA_NUM; i++)
907 for (i=0; i<ALGOR_NUM; i++)
908 if (doit[i]) pr_header++;
910 if (usertime == 0 && !mr)
911 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
912 if (usertime <= 0 && !mr)
914 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
915 BIO_printf(bio_err,"program when this computer is idle.\n");
918 #ifndef OPENSSL_NO_RSA
919 for (i=0; i<RSA_NUM; i++)
921 const unsigned char *p;
924 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
925 if (rsa_key[i] == NULL)
927 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
933 BIO_printf(bio_err,mr ? "+RK:%d:"
934 : "Loaded RSA key, %d bit modulus and e= 0x",
935 BN_num_bits(rsa_key[i]->n));
936 BN_print(bio_err,rsa_key[i]->e);
937 BIO_printf(bio_err,"\n");
943 #ifndef OPENSSL_NO_DSA
944 dsa_key[0]=get_dsa512();
945 dsa_key[1]=get_dsa1024();
946 dsa_key[2]=get_dsa2048();
949 #ifndef OPENSSL_NO_DES
950 DES_set_key_unchecked(&key,&sch);
951 DES_set_key_unchecked(&key2,&sch2);
952 DES_set_key_unchecked(&key3,&sch3);
954 #ifndef OPENSSL_NO_AES
955 AES_set_encrypt_key(key16,128,&aes_ks1);
956 AES_set_encrypt_key(key24,192,&aes_ks2);
957 AES_set_encrypt_key(key32,256,&aes_ks3);
959 #ifndef OPENSSL_NO_IDEA
960 idea_set_encrypt_key(key16,&idea_ks);
962 #ifndef OPENSSL_NO_RC4
963 RC4_set_key(&rc4_ks,16,key16);
965 #ifndef OPENSSL_NO_RC2
966 RC2_set_key(&rc2_ks,16,key16,128);
968 #ifndef OPENSSL_NO_RC5
969 RC5_32_set_key(&rc5_ks,16,key16,12);
971 #ifndef OPENSSL_NO_BF
972 BF_set_key(&bf_ks,16,key16);
974 #ifndef OPENSSL_NO_CAST
975 CAST_set_key(&cast_ks,16,key16);
977 #ifndef OPENSSL_NO_RSA
978 memset(rsa_c,0,sizeof(rsa_c));
981 #ifndef OPENSSL_NO_DES
982 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
988 for (i=count; i; i--)
989 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
994 c[D_MD2][0]=count/10;
995 c[D_MDC2][0]=count/10;
1000 c[D_RMD160][0]=count;
1001 c[D_RC4][0]=count*5;
1002 c[D_CBC_DES][0]=count;
1003 c[D_EDE3_DES][0]=count/3;
1004 c[D_CBC_IDEA][0]=count;
1005 c[D_CBC_RC2][0]=count;
1006 c[D_CBC_RC5][0]=count;
1007 c[D_CBC_BF][0]=count;
1008 c[D_CBC_CAST][0]=count;
1009 c[D_CBC_128_AES][0]=count;
1010 c[D_CBC_192_AES][0]=count;
1011 c[D_CBC_256_AES][0]=count;
1013 for (i=1; i<SIZE_NUM; i++)
1015 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1016 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1017 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1018 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1019 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1020 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1021 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1023 for (i=1; i<SIZE_NUM; i++)
1027 l0=(long)lengths[i-1];
1028 l1=(long)lengths[i];
1029 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1030 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1031 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1032 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1033 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1034 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1035 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1036 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1037 c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
1038 c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
1039 c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
1041 #ifndef OPENSSL_NO_RSA
1042 rsa_c[R_RSA_512][0]=count/2000;
1043 rsa_c[R_RSA_512][1]=count/400;
1044 for (i=1; i<RSA_NUM; i++)
1046 rsa_c[i][0]=rsa_c[i-1][0]/8;
1047 rsa_c[i][1]=rsa_c[i-1][1]/4;
1048 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1052 if (rsa_c[i][0] == 0)
1061 #ifndef OPENSSL_NO_DSA
1062 dsa_c[R_DSA_512][0]=count/1000;
1063 dsa_c[R_DSA_512][1]=count/1000/2;
1064 for (i=1; i<DSA_NUM; i++)
1066 dsa_c[i][0]=dsa_c[i-1][0]/4;
1067 dsa_c[i][1]=dsa_c[i-1][1]/4;
1068 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1081 #define COND(d) (count < (d))
1082 #define COUNT(d) (d)
1084 /* not worth fixing */
1085 # error "You cannot disable DES on systems without SIGALRM."
1086 #endif /* OPENSSL_NO_DES */
1088 #define COND(c) (run)
1089 #define COUNT(d) (count)
1090 signal(SIGALRM,sig_done);
1091 #endif /* SIGALRM */
1093 #ifndef OPENSSL_NO_MD2
1096 for (j=0; j<SIZE_NUM; j++)
1098 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1100 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1101 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1103 print_result(D_MD2,j,count,d);
1107 #ifndef OPENSSL_NO_MDC2
1110 for (j=0; j<SIZE_NUM; j++)
1112 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1114 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1115 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1117 print_result(D_MDC2,j,count,d);
1122 #ifndef OPENSSL_NO_MD4
1125 for (j=0; j<SIZE_NUM; j++)
1127 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1129 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1130 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1132 print_result(D_MD4,j,count,d);
1137 #ifndef OPENSSL_NO_MD5
1140 for (j=0; j<SIZE_NUM; j++)
1142 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1144 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1145 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1147 print_result(D_MD5,j,count,d);
1152 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1157 HMAC_CTX_init(&hctx);
1158 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1159 16,EVP_md5(), NULL);
1161 for (j=0; j<SIZE_NUM; j++)
1163 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1165 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1167 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1168 HMAC_Update(&hctx,buf,lengths[j]);
1169 HMAC_Final(&hctx,&(hmac[0]),NULL);
1172 print_result(D_HMAC,j,count,d);
1174 HMAC_CTX_cleanup(&hctx);
1177 #ifndef OPENSSL_NO_SHA
1180 for (j=0; j<SIZE_NUM; j++)
1182 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1184 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1185 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1187 print_result(D_SHA1,j,count,d);
1191 #ifndef OPENSSL_NO_RIPEMD
1194 for (j=0; j<SIZE_NUM; j++)
1196 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1198 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1199 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1201 print_result(D_RMD160,j,count,d);
1205 #ifndef OPENSSL_NO_RC4
1208 for (j=0; j<SIZE_NUM; j++)
1210 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1212 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1213 RC4(&rc4_ks,(unsigned int)lengths[j],
1216 print_result(D_RC4,j,count,d);
1220 #ifndef OPENSSL_NO_DES
1221 if (doit[D_CBC_DES])
1223 for (j=0; j<SIZE_NUM; j++)
1225 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1227 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1228 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1229 &DES_iv,DES_ENCRYPT);
1231 print_result(D_CBC_DES,j,count,d);
1235 if (doit[D_EDE3_DES])
1237 for (j=0; j<SIZE_NUM; j++)
1239 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1241 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1242 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1244 &DES_iv,DES_ENCRYPT);
1246 print_result(D_EDE3_DES,j,count,d);
1250 #ifndef OPENSSL_NO_AES
1251 if (doit[D_CBC_128_AES])
1253 for (j=0; j<SIZE_NUM; j++)
1255 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1257 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1258 AES_cbc_encrypt(buf,buf,
1259 (unsigned long)lengths[j],&aes_ks1,
1262 print_result(D_CBC_128_AES,j,count,d);
1265 if (doit[D_CBC_192_AES])
1267 for (j=0; j<SIZE_NUM; j++)
1269 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1271 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1272 AES_cbc_encrypt(buf,buf,
1273 (unsigned long)lengths[j],&aes_ks2,
1276 print_result(D_CBC_192_AES,j,count,d);
1279 if (doit[D_CBC_256_AES])
1281 for (j=0; j<SIZE_NUM; j++)
1283 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1285 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1286 AES_cbc_encrypt(buf,buf,
1287 (unsigned long)lengths[j],&aes_ks3,
1290 print_result(D_CBC_256_AES,j,count,d);
1295 #ifndef OPENSSL_NO_IDEA
1296 if (doit[D_CBC_IDEA])
1298 for (j=0; j<SIZE_NUM; j++)
1300 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1302 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1303 idea_cbc_encrypt(buf,buf,
1304 (unsigned long)lengths[j],&idea_ks,
1307 print_result(D_CBC_IDEA,j,count,d);
1311 #ifndef OPENSSL_NO_RC2
1312 if (doit[D_CBC_RC2])
1314 for (j=0; j<SIZE_NUM; j++)
1316 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1318 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1319 RC2_cbc_encrypt(buf,buf,
1320 (unsigned long)lengths[j],&rc2_ks,
1323 print_result(D_CBC_RC2,j,count,d);
1327 #ifndef OPENSSL_NO_RC5
1328 if (doit[D_CBC_RC5])
1330 for (j=0; j<SIZE_NUM; j++)
1332 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1334 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1335 RC5_32_cbc_encrypt(buf,buf,
1336 (unsigned long)lengths[j],&rc5_ks,
1339 print_result(D_CBC_RC5,j,count,d);
1343 #ifndef OPENSSL_NO_BF
1346 for (j=0; j<SIZE_NUM; j++)
1348 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1350 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1351 BF_cbc_encrypt(buf,buf,
1352 (unsigned long)lengths[j],&bf_ks,
1355 print_result(D_CBC_BF,j,count,d);
1359 #ifndef OPENSSL_NO_CAST
1360 if (doit[D_CBC_CAST])
1362 for (j=0; j<SIZE_NUM; j++)
1364 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1366 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1367 CAST_cbc_encrypt(buf,buf,
1368 (unsigned long)lengths[j],&cast_ks,
1371 print_result(D_CBC_CAST,j,count,d);
1378 for (j=0; j<SIZE_NUM; j++)
1385 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1386 /* -O3 -fschedule-insns messes up an
1387 * optimization here! names[D_EVP]
1388 * somehow becomes NULL */
1389 print_message(names[D_EVP],save_count,
1392 EVP_CIPHER_CTX_init(&ctx);
1394 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1396 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1400 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1401 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1403 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1404 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1406 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1408 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1410 EVP_CIPHER_CTX_cleanup(&ctx);
1414 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1415 print_message(names[D_EVP],save_count,
1419 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1420 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1424 print_result(D_EVP,j,count,d);
1428 RAND_pseudo_bytes(buf,36);
1429 #ifndef OPENSSL_NO_RSA
1430 for (j=0; j<RSA_NUM; j++)
1433 if (!rsa_doit[j]) continue;
1434 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1437 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1438 ERR_print_errors(bio_err);
1443 pkey_print_message("private","rsa",
1444 rsa_c[j][0],rsa_bits[j],
1446 /* RSA_blinding_on(rsa_key[j],NULL); */
1448 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1450 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1451 &rsa_num, rsa_key[j]);
1455 "RSA sign failure\n");
1456 ERR_print_errors(bio_err);
1462 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1463 : "%ld %d bit private RSA's in %.2fs\n",
1464 count,rsa_bits[j],d);
1465 rsa_results[j][0]=d/(double)count;
1470 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1473 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1474 ERR_print_errors(bio_err);
1479 pkey_print_message("public","rsa",
1480 rsa_c[j][1],rsa_bits[j],
1483 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1485 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1486 rsa_num, rsa_key[j]);
1490 "RSA verify failure\n");
1491 ERR_print_errors(bio_err);
1497 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1498 : "%ld %d bit public RSA's in %.2fs\n",
1499 count,rsa_bits[j],d);
1500 rsa_results[j][1]=d/(double)count;
1506 /* if longer than 10s, don't do any more */
1507 for (j++; j<RSA_NUM; j++)
1513 RAND_pseudo_bytes(buf,20);
1514 #ifndef OPENSSL_NO_DSA
1515 if (RAND_status() != 1)
1517 RAND_seed(rnd_seed, sizeof rnd_seed);
1520 for (j=0; j<DSA_NUM; j++)
1525 if (!dsa_doit[j]) continue;
1526 /* DSA_generate_key(dsa_key[j]); */
1527 /* DSA_sign_setup(dsa_key[j],NULL); */
1528 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1532 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1533 ERR_print_errors(bio_err);
1538 pkey_print_message("sign","dsa",
1539 dsa_c[j][0],dsa_bits[j],
1542 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1544 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1549 "DSA sign failure\n");
1550 ERR_print_errors(bio_err);
1556 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1557 : "%ld %d bit DSA signs in %.2fs\n",
1558 count,dsa_bits[j],d);
1559 dsa_results[j][0]=d/(double)count;
1563 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1567 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1568 ERR_print_errors(bio_err);
1573 pkey_print_message("verify","dsa",
1574 dsa_c[j][1],dsa_bits[j],
1577 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1579 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1584 "DSA verify failure\n");
1585 ERR_print_errors(bio_err);
1591 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1592 : "%ld %d bit DSA verify in %.2fs\n",
1593 count,dsa_bits[j],d);
1594 dsa_results[j][1]=d/(double)count;
1599 /* if longer than 10s, don't do any more */
1600 for (j++; j<DSA_NUM; j++)
1604 if (rnd_fake) RAND_cleanup();
1611 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1612 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1614 printf("%s ",BN_options());
1615 #ifndef OPENSSL_NO_MD2
1616 printf("%s ",MD2_options());
1618 #ifndef OPENSSL_NO_RC4
1619 printf("%s ",RC4_options());
1621 #ifndef OPENSSL_NO_DES
1622 printf("%s ",DES_options());
1624 #ifndef OPENSSL_NO_AES
1625 printf("%s ",AES_options());
1627 #ifndef OPENSSL_NO_IDEA
1628 printf("%s ",idea_options());
1630 #ifndef OPENSSL_NO_BF
1631 printf("%s ",BF_options());
1633 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1634 printf("available timing options: ");
1645 #define as_string(s) (#s)
1646 printf("HZ=%g", (double)HZ);
1648 printf(" [sysconf value]");
1652 printf("timing function used: %s%s%s%s%s%s%s\n",
1653 (ftime_used ? "ftime" : ""),
1654 (ftime_used + times_used > 1 ? "," : ""),
1655 (times_used ? "times" : ""),
1656 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1657 (gettimeofday_used ? "gettimeofday" : ""),
1658 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1659 (getrusage_used ? "getrusage" : ""));
1665 fprintf(stdout,"+H");
1668 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1669 fprintf(stdout,"type ");
1671 for (j=0; j<SIZE_NUM; j++)
1672 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1673 fprintf(stdout,"\n");
1676 for (k=0; k<ALGOR_NUM; k++)
1678 if (!doit[k]) continue;
1680 fprintf(stdout,"+F:%d:%s",k,names[k]);
1682 fprintf(stdout,"%-13s",names[k]);
1683 for (j=0; j<SIZE_NUM; j++)
1685 if (results[k][j] > 10000 && !mr)
1686 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1688 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1690 fprintf(stdout,"\n");
1692 #ifndef OPENSSL_NO_RSA
1694 for (k=0; k<RSA_NUM; k++)
1696 if (!rsa_doit[k]) continue;
1699 printf("%18ssign verify sign/s verify/s\n"," ");
1703 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1704 k,rsa_bits[k],rsa_results[k][0],
1707 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1708 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1709 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1712 #ifndef OPENSSL_NO_DSA
1714 for (k=0; k<DSA_NUM; k++)
1716 if (!dsa_doit[k]) continue;
1719 printf("%18ssign verify sign/s verify/s\n"," ");
1723 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1724 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1726 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1727 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1728 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1733 ERR_print_errors(bio_err);
1734 if (buf != NULL) OPENSSL_free(buf);
1735 if (buf2 != NULL) OPENSSL_free(buf2);
1736 #ifndef OPENSSL_NO_RSA
1737 for (i=0; i<RSA_NUM; i++)
1738 if (rsa_key[i] != NULL)
1739 RSA_free(rsa_key[i]);
1741 #ifndef OPENSSL_NO_DSA
1742 for (i=0; i<DSA_NUM; i++)
1743 if (dsa_key[i] != NULL)
1744 DSA_free(dsa_key[i]);
1750 static void print_message(const char *s, long num, int length)
1753 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1754 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1755 (void)BIO_flush(bio_err);
1758 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1759 : "Doing %s %ld times on %d size blocks: ",s,num,length);
1760 (void)BIO_flush(bio_err);
1767 static void pkey_print_message(char *str, char *str2, long num, int bits,
1771 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1772 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1773 (void)BIO_flush(bio_err);
1776 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1777 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1778 (void)BIO_flush(bio_err);
1785 static void print_result(int alg,int run_no,int count,double time_used)
1787 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1788 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1789 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1792 static char *sstrsep(char **string, const char *delim)
1795 char *token = *string;
1800 memset(isdelim, 0, sizeof isdelim);
1805 isdelim[(unsigned char)(*delim)] = 1;
1809 while (!isdelim[(unsigned char)(**string)])
1824 static int do_multi(int multi)
1829 static char sep[]=":";
1831 fds=malloc(multi*sizeof *fds);
1832 for(n=0 ; n < multi ; ++n)
1850 printf("Forked child %d\n",n);
1853 /* for now, assume the pipe is long enough to take all the output */
1854 for(n=0 ; n < multi ; ++n)
1860 f=fdopen(fds[n],"r");
1861 while(fgets(buf,sizeof buf,f))
1868 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1872 printf("Got: %s from %d\n",buf,n);
1873 if(!strncmp(buf,"+F:",3))
1879 alg=atoi(sstrsep(&p,sep));
1881 for(j=0 ; j < SIZE_NUM ; ++j)
1882 results[alg][j]+=atof(sstrsep(&p,sep));
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,"+F2:",4))
1911 k=atoi(sstrsep(&p,sep));
1914 d=atof(sstrsep(&p,sep));
1916 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1918 rsa_results[k][0]=d;
1920 d=atof(sstrsep(&p,sep));
1922 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1924 rsa_results[k][1]=d;
1926 else if(!strncmp(buf,"+F3:",4))
1932 k=atoi(sstrsep(&p,sep));
1935 d=atof(sstrsep(&p,sep));
1937 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1939 dsa_results[k][0]=d;
1941 d=atof(sstrsep(&p,sep));
1943 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1945 dsa_results[k][1]=d;
1947 else if(!strncmp(buf,"+H:",3))
1951 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);