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
81 #include <openssl/crypto.h>
82 #include <openssl/rand.h>
83 #include <openssl/err.h>
84 #include <openssl/engine.h>
86 #if defined(__FreeBSD__)
88 #elif !defined(MSDOS) && (!defined(VMS) || defined(__DECC))
91 #if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(MPE)
99 # include <sys/types.h>
100 # include <sys/times.h>
103 # include <sys/time.h>
104 # include <sys/resource.h>
107 /* Depending on the VMS version, the tms structure is perhaps defined.
108 The __TMS macro will show if it was. If it wasn't defined, we should
109 undefine TIMES, since that tells the rest of the program how things
110 should be handled. -- Richard Levitte */
111 #if defined(VMS) && defined(__DECC) && !defined(__TMS)
116 #include <sys/timeb.h>
119 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD)
120 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
123 #if defined(sun) || defined(__ultrix)
124 #define _POSIX_SOURCE
126 #include <sys/param.h>
130 #include <openssl/des.h>
133 #include <openssl/md2.h>
136 #include <openssl/mdc2.h>
139 #include <openssl/md4.h>
142 #include <openssl/md5.h>
145 #include <openssl/hmac.h>
147 #include <openssl/evp.h>
149 #include <openssl/sha.h>
152 #include <openssl/ripemd.h>
155 #include <openssl/rc4.h>
158 #include <openssl/rc5.h>
161 #include <openssl/rc2.h>
164 #include <openssl/idea.h>
167 #include <openssl/blowfish.h>
170 #include <openssl/cast.h>
173 #include <openssl/rsa.h>
174 #include "./testrsa.h"
176 #include <openssl/x509.h>
178 #include "./testdsa.h"
181 /* The following if from times(3) man page. It may need to be changed */
184 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
186 # else /* _BSD_CLK_TCK_ */
187 # define HZ ((double)_BSD_CLK_TCK_)
190 # define HZ ((double)CLK_TCK)
195 #define BUFSIZE ((long)1024*8+1)
198 static double Time_F(int s, int usertime);
199 static void print_message(char *s,long num,int length);
200 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
202 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
203 #define SIGRETTYPE void
205 #define SIGRETTYPE int
208 static SIGRETTYPE sig_done(int sig);
209 static SIGRETTYPE sig_done(int sig)
211 signal(SIGALRM,sig_done);
222 static double Time_F(int s, int usertime)
229 static struct rusage tstart,tend;
233 getrusage(RUSAGE_SELF,&tstart);
240 getrusage(RUSAGE_SELF,&tend);
241 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
242 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
243 +((double)i)/1000000.0;
244 return((ret < 0.001)?0.001:ret);
249 static struct timeval tstart,tend;
254 gettimeofday(&tstart,NULL);
259 gettimeofday(&tend,NULL);
260 i=(long)tend.tv_usec-(long)tstart.tv_usec;
261 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
262 return((ret < 0.001)?0.001:ret);
265 #else /* ndef USE_TOD */
270 static struct tms tstart,tend;
280 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
281 return((ret < 1e-3)?1e-3:ret);
284 # endif /* times() */
285 # if defined(TIMES) && defined(TIMEB)
290 static struct timeb tstart,tend;
301 i=(long)tend.millitm-(long)tstart.millitm;
302 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
303 return((ret < 0.001)?0.001:ret);
310 int MAIN(int, char **);
312 int MAIN(int argc, char **argv)
315 unsigned char *buf=NULL,*buf2=NULL;
321 long count,rsa_count;
325 unsigned char md2[MD2_DIGEST_LENGTH];
328 unsigned char mdc2[MDC2_DIGEST_LENGTH];
331 unsigned char md4[MD4_DIGEST_LENGTH];
334 unsigned char md5[MD5_DIGEST_LENGTH];
335 unsigned char hmac[MD5_DIGEST_LENGTH];
338 unsigned char sha[SHA_DIGEST_LENGTH];
341 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
353 IDEA_KEY_SCHEDULE idea_ks;
361 static unsigned char key16[16]=
362 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
363 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
366 des_cblock *buf_as_des_cblock = NULL;
367 static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
368 static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
369 static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
370 des_key_schedule sch,sch2,sch3;
382 #define D_CBC_IDEA 10
386 #define D_CBC_CAST 14
387 double d,results[ALGOR_NUM][SIZE_NUM];
388 static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
389 long c[ALGOR_NUM][SIZE_NUM];
390 static char *names[ALGOR_NUM]={
391 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
392 "des cbc","des ede3","idea cbc",
393 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
402 RSA *rsa_key[RSA_NUM];
403 long rsa_c[RSA_NUM][2];
404 double rsa_results[RSA_NUM][2];
405 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
406 static unsigned char *rsa_data[RSA_NUM]=
407 {test512,test1024,test2048,test4096};
408 static int rsa_data_length[RSA_NUM]={
409 sizeof(test512),sizeof(test1024),
410 sizeof(test2048),sizeof(test4096)};
413 DSA *dsa_key[DSA_NUM];
414 long dsa_c[DSA_NUM][2];
415 double dsa_results[DSA_NUM][2];
416 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
418 int rsa_doit[RSA_NUM];
419 int dsa_doit[DSA_NUM];
429 memset(results, 0, sizeof(results));
431 memset(dsa_key,0,sizeof(dsa_key));
435 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
436 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
439 memset(rsa_key,0,sizeof(rsa_key));
440 for (i=0; i<RSA_NUM; i++)
444 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
446 BIO_printf(bio_err,"out of memory\n");
450 buf_as_des_cblock = (des_cblock *)buf;
452 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
454 BIO_printf(bio_err,"out of memory\n");
458 memset(c,0,sizeof(c));
459 memset(iv,0,sizeof(iv));
461 for (i=0; i<ALGOR_NUM; i++)
463 for (i=0; i<RSA_NUM; i++)
465 for (i=0; i<DSA_NUM; i++)
473 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
476 if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
482 BIO_printf(bio_err,"no engine given\n");
485 if((e = ENGINE_by_id(*argv)) == NULL)
487 BIO_printf(bio_err,"invalid engine \"%s\"\n",
491 if(!ENGINE_set_default(e, ENGINE_METHOD_ALL))
493 BIO_printf(bio_err,"can't use that engine\n");
496 BIO_printf(bio_err,"engine \"%s\" set.\n", *argv);
497 /* Free our "structural" reference. */
499 /* It will be increased again further down. We just
500 don't want speed to confuse an engine with an
501 algorithm, especially when none is given (which
502 means all of them should be run) */
507 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
511 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
515 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
519 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
523 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
527 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
529 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
533 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
535 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
537 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
541 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
545 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
546 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
551 if (strcmp(*argv,"rsaref") == 0)
553 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
559 if (strcmp(*argv,"openssl") == 0)
561 RSA_set_default_openssl_method(RSA_PKCS1_SSLeay());
567 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
568 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
569 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
570 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
571 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
572 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
573 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
576 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
577 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
581 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
582 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
586 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
587 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
591 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
592 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
593 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
597 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
598 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
599 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
603 if (strcmp(*argv,"des") == 0)
611 if (strcmp(*argv,"rsa") == 0)
613 rsa_doit[R_RSA_512]=1;
614 rsa_doit[R_RSA_1024]=1;
615 rsa_doit[R_RSA_2048]=1;
616 rsa_doit[R_RSA_4096]=1;
621 if (strcmp(*argv,"dsa") == 0)
623 dsa_doit[R_DSA_512]=1;
624 dsa_doit[R_DSA_1024]=1;
629 BIO_printf(bio_err,"Error: bad option or value\n");
630 BIO_printf(bio_err,"\n");
631 BIO_printf(bio_err,"Available values:\n");
633 BIO_printf(bio_err,"md2 ");
636 BIO_printf(bio_err,"mdc2 ");
639 BIO_printf(bio_err,"md4 ");
642 BIO_printf(bio_err,"md5 ");
644 BIO_printf(bio_err,"hmac ");
648 BIO_printf(bio_err,"sha1 ");
651 BIO_printf(bio_err,"rmd160");
653 #if !defined(NO_MD2) || !defined(NO_MDC2) || !defined(NO_MD4) || !defined(NO_MD5) || !defined(NO_SHA1) || !defined(NO_RIPEMD160)
654 BIO_printf(bio_err,"\n");
658 BIO_printf(bio_err,"idea-cbc ");
661 BIO_printf(bio_err,"rc2-cbc ");
664 BIO_printf(bio_err,"rc5-cbc ");
667 BIO_printf(bio_err,"bf-cbc");
669 #if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_BF) || !defined(NO_RC5)
670 BIO_printf(bio_err,"\n");
673 BIO_printf(bio_err,"des-cbc des-ede3 ");
675 BIO_printf(bio_err,"rc4");
677 BIO_printf(bio_err,"\n");
680 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
684 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
688 BIO_printf(bio_err,"idea ");
691 BIO_printf(bio_err,"rc2 ");
694 BIO_printf(bio_err,"des ");
697 BIO_printf(bio_err,"rsa ");
700 BIO_printf(bio_err,"blowfish");
702 #if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_DES) || !defined(NO_RSA) || !defined(NO_BF)
703 BIO_printf(bio_err,"\n");
706 BIO_printf(bio_err,"\n");
707 BIO_printf(bio_err,"Available options:\n");
709 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
711 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
721 for (i=0; i<ALGOR_NUM; i++)
723 for (i=0; i<RSA_NUM; i++)
725 for (i=0; i<DSA_NUM; i++)
728 for (i=0; i<ALGOR_NUM; i++)
729 if (doit[i]) pr_header++;
732 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
735 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
736 BIO_printf(bio_err,"program when this computer is idle.\n");
740 for (i=0; i<RSA_NUM; i++)
745 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
746 if (rsa_key[i] == NULL)
748 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
754 BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
755 BN_print(bio_err,rsa_key[i]->e);
756 BIO_printf(bio_err,"\n");
763 dsa_key[0]=get_dsa512();
764 dsa_key[1]=get_dsa1024();
765 dsa_key[2]=get_dsa2048();
769 des_set_key_unchecked(&key,sch);
770 des_set_key_unchecked(&key2,sch2);
771 des_set_key_unchecked(&key3,sch3);
774 idea_set_encrypt_key(key16,&idea_ks);
777 RC4_set_key(&rc4_ks,16,key16);
780 RC2_set_key(&rc2_ks,16,key16,128);
783 RC5_32_set_key(&rc5_ks,16,key16,12);
786 BF_set_key(&bf_ks,16,key16);
789 CAST_set_key(&cast_ks,16,key16);
792 memset(rsa_c,0,sizeof(rsa_c));
796 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
801 Time_F(START,usertime);
802 for (i=count; i; i--)
803 des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
804 &(sch[0]),DES_ENCRYPT);
805 d=Time_F(STOP,usertime);
807 c[D_MD2][0]=count/10;
808 c[D_MDC2][0]=count/10;
813 c[D_RMD160][0]=count;
815 c[D_CBC_DES][0]=count;
816 c[D_EDE3_DES][0]=count/3;
817 c[D_CBC_IDEA][0]=count;
818 c[D_CBC_RC2][0]=count;
819 c[D_CBC_RC5][0]=count;
820 c[D_CBC_BF][0]=count;
821 c[D_CBC_CAST][0]=count;
823 for (i=1; i<SIZE_NUM; i++)
825 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
826 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
827 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
828 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
829 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
830 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
831 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
833 for (i=1; i<SIZE_NUM; i++)
837 l0=(long)lengths[i-1];
839 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
840 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
841 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
842 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
843 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
844 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
845 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
846 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
849 rsa_c[R_RSA_512][0]=count/2000;
850 rsa_c[R_RSA_512][1]=count/400;
851 for (i=1; i<RSA_NUM; i++)
853 rsa_c[i][0]=rsa_c[i-1][0]/8;
854 rsa_c[i][1]=rsa_c[i-1][1]/4;
855 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
859 if (rsa_c[i][0] == 0)
868 dsa_c[R_DSA_512][0]=count/1000;
869 dsa_c[R_DSA_512][1]=count/1000/2;
870 for (i=1; i<DSA_NUM; i++)
872 dsa_c[i][0]=dsa_c[i-1][0]/4;
873 dsa_c[i][1]=dsa_c[i-1][1]/4;
874 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
886 #define COND(d) (count < (d))
889 /* not worth fixing */
890 # error "You cannot disable DES on systems without SIGALRM."
893 #define COND(c) (run)
894 #define COUNT(d) (count)
895 signal(SIGALRM,sig_done);
901 for (j=0; j<SIZE_NUM; j++)
903 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
904 Time_F(START,usertime);
905 for (count=0,run=1; COND(c[D_MD2][j]); count++)
906 MD2(buf,(unsigned long)lengths[j],&(md2[0]));
907 d=Time_F(STOP,usertime);
908 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
909 count,names[D_MD2],d);
910 results[D_MD2][j]=((double)count)/d*lengths[j];
917 for (j=0; j<SIZE_NUM; j++)
919 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
920 Time_F(START,usertime);
921 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
922 MDC2(buf,(unsigned long)lengths[j],&(mdc2[0]));
923 d=Time_F(STOP,usertime);
924 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
925 count,names[D_MDC2],d);
926 results[D_MDC2][j]=((double)count)/d*lengths[j];
934 for (j=0; j<SIZE_NUM; j++)
936 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
937 Time_F(START,usertime);
938 for (count=0,run=1; COND(c[D_MD4][j]); count++)
939 MD4(&(buf[0]),(unsigned long)lengths[j],&(md4[0]));
940 d=Time_F(STOP,usertime);
941 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
942 count,names[D_MD4],d);
943 results[D_MD4][j]=((double)count)/d*lengths[j];
951 for (j=0; j<SIZE_NUM; j++)
953 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
954 Time_F(START,usertime);
955 for (count=0,run=1; COND(c[D_MD5][j]); count++)
956 MD5(&(buf[0]),(unsigned long)lengths[j],&(md5[0]));
957 d=Time_F(STOP,usertime);
958 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
959 count,names[D_MD5],d);
960 results[D_MD5][j]=((double)count)/d*lengths[j];
965 #if !defined(NO_MD5) && !defined(NO_HMAC)
969 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
972 for (j=0; j<SIZE_NUM; j++)
974 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
975 Time_F(START,usertime);
976 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
978 HMAC_Init(&hctx,NULL,0,NULL);
979 HMAC_Update(&hctx,buf,lengths[j]);
980 HMAC_Final(&hctx,&(hmac[0]),NULL);
982 d=Time_F(STOP,usertime);
983 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
984 count,names[D_HMAC],d);
985 results[D_HMAC][j]=((double)count)/d*lengths[j];
992 for (j=0; j<SIZE_NUM; j++)
994 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
995 Time_F(START,usertime);
996 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
997 SHA1(buf,(unsigned long)lengths[j],&(sha[0]));
998 d=Time_F(STOP,usertime);
999 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1000 count,names[D_SHA1],d);
1001 results[D_SHA1][j]=((double)count)/d*lengths[j];
1008 for (j=0; j<SIZE_NUM; j++)
1010 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1011 Time_F(START,usertime);
1012 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1013 RIPEMD160(buf,(unsigned long)lengths[j],&(rmd160[0]));
1014 d=Time_F(STOP,usertime);
1015 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1016 count,names[D_RMD160],d);
1017 results[D_RMD160][j]=((double)count)/d*lengths[j];
1024 for (j=0; j<SIZE_NUM; j++)
1026 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1027 Time_F(START,usertime);
1028 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1029 RC4(&rc4_ks,(unsigned int)lengths[j],
1031 d=Time_F(STOP,usertime);
1032 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1033 count,names[D_RC4],d);
1034 results[D_RC4][j]=((double)count)/d*lengths[j];
1039 if (doit[D_CBC_DES])
1041 for (j=0; j<SIZE_NUM; j++)
1043 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1044 Time_F(START,usertime);
1045 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1046 des_ncbc_encrypt(buf,buf,lengths[j],sch,
1048 d=Time_F(STOP,usertime);
1049 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1050 count,names[D_CBC_DES],d);
1051 results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1055 if (doit[D_EDE3_DES])
1057 for (j=0; j<SIZE_NUM; j++)
1059 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1060 Time_F(START,usertime);
1061 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1062 des_ede3_cbc_encrypt(buf,buf,lengths[j],
1065 d=Time_F(STOP,usertime);
1066 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1067 count,names[D_EDE3_DES],d);
1068 results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1073 if (doit[D_CBC_IDEA])
1075 for (j=0; j<SIZE_NUM; j++)
1077 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1078 Time_F(START,usertime);
1079 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1080 idea_cbc_encrypt(buf,buf,
1081 (unsigned long)lengths[j],&idea_ks,
1083 d=Time_F(STOP,usertime);
1084 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1085 count,names[D_CBC_IDEA],d);
1086 results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1091 if (doit[D_CBC_RC2])
1093 for (j=0; j<SIZE_NUM; j++)
1095 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1096 Time_F(START,usertime);
1097 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1098 RC2_cbc_encrypt(buf,buf,
1099 (unsigned long)lengths[j],&rc2_ks,
1101 d=Time_F(STOP,usertime);
1102 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1103 count,names[D_CBC_RC2],d);
1104 results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1109 if (doit[D_CBC_RC5])
1111 for (j=0; j<SIZE_NUM; j++)
1113 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1114 Time_F(START,usertime);
1115 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1116 RC5_32_cbc_encrypt(buf,buf,
1117 (unsigned long)lengths[j],&rc5_ks,
1119 d=Time_F(STOP,usertime);
1120 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1121 count,names[D_CBC_RC5],d);
1122 results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1129 for (j=0; j<SIZE_NUM; j++)
1131 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1132 Time_F(START,usertime);
1133 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1134 BF_cbc_encrypt(buf,buf,
1135 (unsigned long)lengths[j],&bf_ks,
1137 d=Time_F(STOP,usertime);
1138 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1139 count,names[D_CBC_BF],d);
1140 results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1145 if (doit[D_CBC_CAST])
1147 for (j=0; j<SIZE_NUM; j++)
1149 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1150 Time_F(START,usertime);
1151 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1152 CAST_cbc_encrypt(buf,buf,
1153 (unsigned long)lengths[j],&cast_ks,
1155 d=Time_F(STOP,usertime);
1156 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1157 count,names[D_CBC_CAST],d);
1158 results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1163 RAND_pseudo_bytes(buf,36);
1165 for (j=0; j<RSA_NUM; j++)
1168 if (!rsa_doit[j]) continue;
1169 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1172 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1173 ERR_print_errors(bio_err);
1178 pkey_print_message("private","rsa",
1179 rsa_c[j][0],rsa_bits[j],
1181 /* RSA_blinding_on(rsa_key[j],NULL); */
1182 Time_F(START,usertime);
1183 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1185 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1186 &rsa_num, rsa_key[j]);
1190 "RSA sign failure\n");
1191 ERR_print_errors(bio_err);
1196 d=Time_F(STOP,usertime);
1198 "%ld %d bit private RSA's in %.2fs\n",
1199 count,rsa_bits[j],d);
1200 rsa_results[j][0]=d/(double)count;
1205 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1208 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1209 ERR_print_errors(bio_err);
1214 pkey_print_message("public","rsa",
1215 rsa_c[j][1],rsa_bits[j],
1217 Time_F(START,usertime);
1218 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1220 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1221 rsa_num, rsa_key[j]);
1225 "RSA verify failure\n");
1226 ERR_print_errors(bio_err);
1231 d=Time_F(STOP,usertime);
1233 "%ld %d bit public RSA's in %.2fs\n",
1234 count,rsa_bits[j],d);
1235 rsa_results[j][1]=d/(double)count;
1241 /* if longer than 10s, don't do any more */
1242 for (j++; j<RSA_NUM; j++)
1248 RAND_pseudo_bytes(buf,20);
1250 if (RAND_status() != 1)
1252 RAND_seed(rnd_seed, sizeof rnd_seed);
1255 for (j=0; j<DSA_NUM; j++)
1260 if (!dsa_doit[j]) continue;
1261 DSA_generate_key(dsa_key[j]);
1262 /* DSA_sign_setup(dsa_key[j],NULL); */
1263 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1267 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1268 ERR_print_errors(bio_err);
1273 pkey_print_message("sign","dsa",
1274 dsa_c[j][0],dsa_bits[j],
1276 Time_F(START,usertime);
1277 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1279 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1284 "DSA sign failure\n");
1285 ERR_print_errors(bio_err);
1290 d=Time_F(STOP,usertime);
1291 BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1292 count,dsa_bits[j],d);
1293 dsa_results[j][0]=d/(double)count;
1297 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1301 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1302 ERR_print_errors(bio_err);
1307 pkey_print_message("verify","dsa",
1308 dsa_c[j][1],dsa_bits[j],
1310 Time_F(START,usertime);
1311 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1313 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1318 "DSA verify failure\n");
1319 ERR_print_errors(bio_err);
1324 d=Time_F(STOP,usertime);
1325 BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1326 count,dsa_bits[j],d);
1327 dsa_results[j][1]=d/(double)count;
1332 /* if longer than 10s, don't do any more */
1333 for (j++; j<DSA_NUM; j++)
1337 if (rnd_fake) RAND_cleanup();
1340 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1341 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1343 printf("%s ",BN_options());
1345 printf("%s ",MD2_options());
1348 printf("%s ",RC4_options());
1351 printf("%s ",des_options());
1354 printf("%s ",idea_options());
1357 printf("%s ",BF_options());
1359 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1363 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1364 fprintf(stdout,"type ");
1365 for (j=0; j<SIZE_NUM; j++)
1366 fprintf(stdout,"%7d bytes",lengths[j]);
1367 fprintf(stdout,"\n");
1370 for (k=0; k<ALGOR_NUM; k++)
1372 if (!doit[k]) continue;
1373 fprintf(stdout,"%-13s",names[k]);
1374 for (j=0; j<SIZE_NUM; j++)
1376 if (results[k][j] > 10000)
1377 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1379 fprintf(stdout," %11.2f ",results[k][j]);
1381 fprintf(stdout,"\n");
1385 for (k=0; k<RSA_NUM; k++)
1387 if (!rsa_doit[k]) continue;
1390 printf("%18ssign verify sign/s verify/s\n"," ");
1393 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1394 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1395 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1396 fprintf(stdout,"\n");
1401 for (k=0; k<DSA_NUM; k++)
1403 if (!dsa_doit[k]) continue;
1405 printf("%18ssign verify sign/s verify/s\n"," ");
1408 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1409 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1410 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1411 fprintf(stdout,"\n");
1416 ERR_print_errors(bio_err);
1417 if (buf != NULL) OPENSSL_free(buf);
1418 if (buf2 != NULL) OPENSSL_free(buf2);
1420 for (i=0; i<RSA_NUM; i++)
1421 if (rsa_key[i] != NULL)
1422 RSA_free(rsa_key[i]);
1425 for (i=0; i<DSA_NUM; i++)
1426 if (dsa_key[i] != NULL)
1427 DSA_free(dsa_key[i]);
1432 static void print_message(char *s, long num, int length)
1435 BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1436 (void)BIO_flush(bio_err);
1439 BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
1440 (void)BIO_flush(bio_err);
1447 static void pkey_print_message(char *str, char *str2, long num, int bits,
1451 BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1452 (void)BIO_flush(bio_err);
1455 BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1456 (void)BIO_flush(bio_err);