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>
85 #include <openssl/evp.h>
86 #include <openssl/objects.h>
88 #if defined(__FreeBSD__)
90 #elif !defined(MSDOS) && (!defined(VMS) || defined(__DECC))
93 #if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(MPE) && !defined(__NetBSD__) /* FIXME */
101 # include <sys/types.h>
102 # include <sys/times.h>
105 # include <sys/time.h>
106 # include <sys/resource.h>
109 /* Depending on the VMS version, the tms structure is perhaps defined.
110 The __TMS macro will show if it was. If it wasn't defined, we should
111 undefine TIMES, since that tells the rest of the program how things
112 should be handled. -- Richard Levitte */
113 #if defined(VMS) && defined(__DECC) && !defined(__TMS)
118 #include <sys/timeb.h>
121 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD)
122 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
125 #if defined(sun) || defined(__ultrix)
126 #define _POSIX_SOURCE
128 #include <sys/param.h>
132 #include <openssl/des.h>
135 #include <openssl/md2.h>
138 #include <openssl/mdc2.h>
141 #include <openssl/md4.h>
144 #include <openssl/md5.h>
147 #include <openssl/hmac.h>
149 #include <openssl/evp.h>
151 #include <openssl/sha.h>
154 #include <openssl/ripemd.h>
157 #include <openssl/rc4.h>
160 #include <openssl/rc5.h>
163 #include <openssl/rc2.h>
166 #include <openssl/idea.h>
169 #include <openssl/blowfish.h>
172 #include <openssl/cast.h>
175 #include <openssl/rsa.h>
176 #include "./testrsa.h"
178 #include <openssl/x509.h>
180 #include "./testdsa.h"
183 /* The following if from times(3) man page. It may need to be changed */
186 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
188 # else /* _BSD_CLK_TCK_ */
189 # define HZ ((double)_BSD_CLK_TCK_)
192 # define HZ ((double)CLK_TCK)
197 #define BUFSIZE ((long)1024*8+1)
200 static double Time_F(int s, int usertime);
201 static void print_message(const char *s,long num,int length);
202 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
204 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
205 #define SIGRETTYPE void
207 #define SIGRETTYPE int
210 static SIGRETTYPE sig_done(int sig);
211 static SIGRETTYPE sig_done(int sig)
213 signal(SIGALRM,sig_done);
224 static double Time_F(int s, int usertime)
231 static struct rusage tstart,tend;
235 getrusage(RUSAGE_SELF,&tstart);
242 getrusage(RUSAGE_SELF,&tend);
243 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
244 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
245 +((double)i)/1000000.0;
246 return((ret < 0.001)?0.001:ret);
251 static struct timeval tstart,tend;
256 gettimeofday(&tstart,NULL);
261 gettimeofday(&tend,NULL);
262 i=(long)tend.tv_usec-(long)tstart.tv_usec;
263 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
264 return((ret < 0.001)?0.001:ret);
267 #else /* ndef USE_TOD */
272 static struct tms tstart,tend;
282 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
283 return((ret < 1e-3)?1e-3:ret);
286 # endif /* times() */
287 # if defined(TIMES) && defined(TIMEB)
292 static struct timeb tstart,tend;
303 i=(long)tend.millitm-(long)tstart.millitm;
304 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
305 return((ret < 0.001)?0.001:ret);
312 int MAIN(int, char **);
314 int MAIN(int argc, char **argv)
317 unsigned char *buf=NULL,*buf2=NULL;
323 long count,rsa_count,save_count=0;
329 unsigned char md2[MD2_DIGEST_LENGTH];
332 unsigned char mdc2[MDC2_DIGEST_LENGTH];
335 unsigned char md4[MD4_DIGEST_LENGTH];
338 unsigned char md5[MD5_DIGEST_LENGTH];
339 unsigned char hmac[MD5_DIGEST_LENGTH];
342 unsigned char sha[SHA_DIGEST_LENGTH];
345 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
357 IDEA_KEY_SCHEDULE idea_ks;
365 static unsigned char key16[16]=
366 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
367 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
370 des_cblock *buf_as_des_cblock = NULL;
371 static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
372 static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
373 static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
374 des_key_schedule sch,sch2,sch3;
386 #define D_CBC_IDEA 10
390 #define D_CBC_CAST 14
392 double d,results[ALGOR_NUM][SIZE_NUM];
393 static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
394 long c[ALGOR_NUM][SIZE_NUM];
395 static const char *names[ALGOR_NUM]={
396 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
397 "des cbc","des ede3","idea cbc",
398 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
407 RSA *rsa_key[RSA_NUM];
408 long rsa_c[RSA_NUM][2];
409 double rsa_results[RSA_NUM][2];
410 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
411 static unsigned char *rsa_data[RSA_NUM]=
412 {test512,test1024,test2048,test4096};
413 static int rsa_data_length[RSA_NUM]={
414 sizeof(test512),sizeof(test1024),
415 sizeof(test2048),sizeof(test4096)};
418 DSA *dsa_key[DSA_NUM];
419 long dsa_c[DSA_NUM][2];
420 double dsa_results[DSA_NUM][2];
421 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
423 int rsa_doit[RSA_NUM];
424 int dsa_doit[DSA_NUM];
428 const EVP_CIPHER *evp=NULL;
435 memset(results, 0, sizeof(results));
437 memset(dsa_key,0,sizeof(dsa_key));
441 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
442 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
445 memset(rsa_key,0,sizeof(rsa_key));
446 for (i=0; i<RSA_NUM; i++)
450 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
452 BIO_printf(bio_err,"out of memory\n");
456 buf_as_des_cblock = (des_cblock *)buf;
458 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
460 BIO_printf(bio_err,"out of memory\n");
464 memset(c,0,sizeof(c));
465 memset(iv,0,sizeof(iv));
467 for (i=0; i<ALGOR_NUM; i++)
469 for (i=0; i<RSA_NUM; i++)
471 for (i=0; i<DSA_NUM; i++)
479 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
481 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
487 BIO_printf(bio_err,"no EVP given\n");
490 evp=EVP_get_cipherbyname(*argv);
493 BIO_printf(bio_err,"%s is an unknown cipher\n",*argv);
499 if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
505 BIO_printf(bio_err,"no engine given\n");
508 if((e = ENGINE_by_id(*argv)) == NULL)
510 BIO_printf(bio_err,"invalid engine \"%s\"\n",
514 if(!ENGINE_set_default(e, ENGINE_METHOD_ALL))
516 BIO_printf(bio_err,"can't use that engine\n");
519 BIO_printf(bio_err,"engine \"%s\" set.\n", *argv);
520 /* Free our "structural" reference. */
522 /* It will be increased again further down. We just
523 don't want speed to confuse an engine with an
524 algorithm, especially when none is given (which
525 means all of them should be run) */
530 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
534 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
538 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
542 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
546 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
550 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
552 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
556 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
558 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
560 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
564 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
568 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
569 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
573 #if 0 /* was: #ifdef RSAref */
574 if (strcmp(*argv,"rsaref") == 0)
576 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
582 if (strcmp(*argv,"openssl") == 0)
584 RSA_set_default_openssl_method(RSA_PKCS1_SSLeay());
590 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
591 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
592 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
593 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
594 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
595 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
596 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
599 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
600 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
604 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
605 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
609 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
610 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
614 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
615 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
616 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
620 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
621 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
622 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
626 if (strcmp(*argv,"des") == 0)
634 if (strcmp(*argv,"rsa") == 0)
636 rsa_doit[R_RSA_512]=1;
637 rsa_doit[R_RSA_1024]=1;
638 rsa_doit[R_RSA_2048]=1;
639 rsa_doit[R_RSA_4096]=1;
644 if (strcmp(*argv,"dsa") == 0)
646 dsa_doit[R_DSA_512]=1;
647 dsa_doit[R_DSA_1024]=1;
652 BIO_printf(bio_err,"Error: bad option or value\n");
653 BIO_printf(bio_err,"\n");
654 BIO_printf(bio_err,"Available values:\n");
656 BIO_printf(bio_err,"md2 ");
659 BIO_printf(bio_err,"mdc2 ");
662 BIO_printf(bio_err,"md4 ");
665 BIO_printf(bio_err,"md5 ");
667 BIO_printf(bio_err,"hmac ");
671 BIO_printf(bio_err,"sha1 ");
674 BIO_printf(bio_err,"rmd160");
676 #if !defined(NO_MD2) || !defined(NO_MDC2) || !defined(NO_MD4) || !defined(NO_MD5) || !defined(NO_SHA1) || !defined(NO_RIPEMD160)
677 BIO_printf(bio_err,"\n");
681 BIO_printf(bio_err,"idea-cbc ");
684 BIO_printf(bio_err,"rc2-cbc ");
687 BIO_printf(bio_err,"rc5-cbc ");
690 BIO_printf(bio_err,"bf-cbc");
692 #if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_BF) || !defined(NO_RC5)
693 BIO_printf(bio_err,"\n");
696 BIO_printf(bio_err,"des-cbc des-ede3 ");
698 BIO_printf(bio_err,"rc4");
700 BIO_printf(bio_err,"\n");
703 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
707 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
711 BIO_printf(bio_err,"idea ");
714 BIO_printf(bio_err,"rc2 ");
717 BIO_printf(bio_err,"des ");
720 BIO_printf(bio_err,"rsa ");
723 BIO_printf(bio_err,"blowfish");
725 #if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_DES) || !defined(NO_RSA) || !defined(NO_BF)
726 BIO_printf(bio_err,"\n");
729 BIO_printf(bio_err,"\n");
730 BIO_printf(bio_err,"Available options:\n");
732 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
734 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
744 for (i=0; i<ALGOR_NUM; i++)
749 for (i=0; i<RSA_NUM; i++)
751 for (i=0; i<DSA_NUM; i++)
754 for (i=0; i<ALGOR_NUM; i++)
755 if (doit[i]) pr_header++;
758 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
761 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
762 BIO_printf(bio_err,"program when this computer is idle.\n");
766 for (i=0; i<RSA_NUM; i++)
768 const unsigned char *p;
771 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
772 if (rsa_key[i] == NULL)
774 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
780 BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
781 BN_print(bio_err,rsa_key[i]->e);
782 BIO_printf(bio_err,"\n");
789 dsa_key[0]=get_dsa512();
790 dsa_key[1]=get_dsa1024();
791 dsa_key[2]=get_dsa2048();
795 des_set_key_unchecked(&key,sch);
796 des_set_key_unchecked(&key2,sch2);
797 des_set_key_unchecked(&key3,sch3);
800 idea_set_encrypt_key(key16,&idea_ks);
803 RC4_set_key(&rc4_ks,16,key16);
806 RC2_set_key(&rc2_ks,16,key16,128);
809 RC5_32_set_key(&rc5_ks,16,key16,12);
812 BF_set_key(&bf_ks,16,key16);
815 CAST_set_key(&cast_ks,16,key16);
818 memset(rsa_c,0,sizeof(rsa_c));
822 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
827 Time_F(START,usertime);
828 for (i=count; i; i--)
829 des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
830 &(sch[0]),DES_ENCRYPT);
831 d=Time_F(STOP,usertime);
834 c[D_MD2][0]=count/10;
835 c[D_MDC2][0]=count/10;
840 c[D_RMD160][0]=count;
842 c[D_CBC_DES][0]=count;
843 c[D_EDE3_DES][0]=count/3;
844 c[D_CBC_IDEA][0]=count;
845 c[D_CBC_RC2][0]=count;
846 c[D_CBC_RC5][0]=count;
847 c[D_CBC_BF][0]=count;
848 c[D_CBC_CAST][0]=count;
850 for (i=1; i<SIZE_NUM; i++)
852 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
853 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
854 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
855 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
856 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
857 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
858 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
860 for (i=1; i<SIZE_NUM; i++)
864 l0=(long)lengths[i-1];
866 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
867 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
868 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
869 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
870 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
871 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
872 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
873 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
876 rsa_c[R_RSA_512][0]=count/2000;
877 rsa_c[R_RSA_512][1]=count/400;
878 for (i=1; i<RSA_NUM; i++)
880 rsa_c[i][0]=rsa_c[i-1][0]/8;
881 rsa_c[i][1]=rsa_c[i-1][1]/4;
882 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
886 if (rsa_c[i][0] == 0)
895 dsa_c[R_DSA_512][0]=count/1000;
896 dsa_c[R_DSA_512][1]=count/1000/2;
897 for (i=1; i<DSA_NUM; i++)
899 dsa_c[i][0]=dsa_c[i-1][0]/4;
900 dsa_c[i][1]=dsa_c[i-1][1]/4;
901 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
913 #define COND(d) (count < (d))
916 /* not worth fixing */
917 # error "You cannot disable DES on systems without SIGALRM."
920 #define COND(c) (run)
921 #define COUNT(d) (count)
922 signal(SIGALRM,sig_done);
928 for (j=0; j<SIZE_NUM; j++)
930 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
931 Time_F(START,usertime);
932 for (count=0,run=1; COND(c[D_MD2][j]); count++)
933 MD2(buf,(unsigned long)lengths[j],&(md2[0]));
934 d=Time_F(STOP,usertime);
935 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
936 count,names[D_MD2],d);
937 results[D_MD2][j]=((double)count)/d*lengths[j];
944 for (j=0; j<SIZE_NUM; j++)
946 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
947 Time_F(START,usertime);
948 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
949 MDC2(buf,(unsigned long)lengths[j],&(mdc2[0]));
950 d=Time_F(STOP,usertime);
951 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
952 count,names[D_MDC2],d);
953 results[D_MDC2][j]=((double)count)/d*lengths[j];
961 for (j=0; j<SIZE_NUM; j++)
963 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
964 Time_F(START,usertime);
965 for (count=0,run=1; COND(c[D_MD4][j]); count++)
966 MD4(&(buf[0]),(unsigned long)lengths[j],&(md4[0]));
967 d=Time_F(STOP,usertime);
968 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
969 count,names[D_MD4],d);
970 results[D_MD4][j]=((double)count)/d*lengths[j];
978 for (j=0; j<SIZE_NUM; j++)
980 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
981 Time_F(START,usertime);
982 for (count=0,run=1; COND(c[D_MD5][j]); count++)
983 MD5(&(buf[0]),(unsigned long)lengths[j],&(md5[0]));
984 d=Time_F(STOP,usertime);
985 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
986 count,names[D_MD5],d);
987 results[D_MD5][j]=((double)count)/d*lengths[j];
992 #if !defined(NO_MD5) && !defined(NO_HMAC)
996 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
999 for (j=0; j<SIZE_NUM; j++)
1001 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1002 Time_F(START,usertime);
1003 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1005 HMAC_Init(&hctx,NULL,0,NULL);
1006 HMAC_Update(&hctx,buf,lengths[j]);
1007 HMAC_Final(&hctx,&(hmac[0]),NULL);
1009 d=Time_F(STOP,usertime);
1010 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1011 count,names[D_HMAC],d);
1012 results[D_HMAC][j]=((double)count)/d*lengths[j];
1019 for (j=0; j<SIZE_NUM; j++)
1021 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1022 Time_F(START,usertime);
1023 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1024 SHA1(buf,(unsigned long)lengths[j],&(sha[0]));
1025 d=Time_F(STOP,usertime);
1026 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1027 count,names[D_SHA1],d);
1028 results[D_SHA1][j]=((double)count)/d*lengths[j];
1035 for (j=0; j<SIZE_NUM; j++)
1037 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1038 Time_F(START,usertime);
1039 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1040 RIPEMD160(buf,(unsigned long)lengths[j],&(rmd160[0]));
1041 d=Time_F(STOP,usertime);
1042 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1043 count,names[D_RMD160],d);
1044 results[D_RMD160][j]=((double)count)/d*lengths[j];
1051 for (j=0; j<SIZE_NUM; j++)
1053 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1054 Time_F(START,usertime);
1055 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1056 RC4(&rc4_ks,(unsigned int)lengths[j],
1058 d=Time_F(STOP,usertime);
1059 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1060 count,names[D_RC4],d);
1061 results[D_RC4][j]=((double)count)/d*lengths[j];
1066 if (doit[D_CBC_DES])
1068 for (j=0; j<SIZE_NUM; j++)
1070 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1071 Time_F(START,usertime);
1072 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1073 des_ncbc_encrypt(buf,buf,lengths[j],sch,
1075 d=Time_F(STOP,usertime);
1076 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1077 count,names[D_CBC_DES],d);
1078 results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1082 if (doit[D_EDE3_DES])
1084 for (j=0; j<SIZE_NUM; j++)
1086 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1087 Time_F(START,usertime);
1088 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1089 des_ede3_cbc_encrypt(buf,buf,lengths[j],
1092 d=Time_F(STOP,usertime);
1093 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1094 count,names[D_EDE3_DES],d);
1095 results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1100 if (doit[D_CBC_IDEA])
1102 for (j=0; j<SIZE_NUM; j++)
1104 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1105 Time_F(START,usertime);
1106 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1107 idea_cbc_encrypt(buf,buf,
1108 (unsigned long)lengths[j],&idea_ks,
1110 d=Time_F(STOP,usertime);
1111 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1112 count,names[D_CBC_IDEA],d);
1113 results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1118 if (doit[D_CBC_RC2])
1120 for (j=0; j<SIZE_NUM; j++)
1122 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1123 Time_F(START,usertime);
1124 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1125 RC2_cbc_encrypt(buf,buf,
1126 (unsigned long)lengths[j],&rc2_ks,
1128 d=Time_F(STOP,usertime);
1129 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1130 count,names[D_CBC_RC2],d);
1131 results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1136 if (doit[D_CBC_RC5])
1138 for (j=0; j<SIZE_NUM; j++)
1140 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1141 Time_F(START,usertime);
1142 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1143 RC5_32_cbc_encrypt(buf,buf,
1144 (unsigned long)lengths[j],&rc5_ks,
1146 d=Time_F(STOP,usertime);
1147 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1148 count,names[D_CBC_RC5],d);
1149 results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1156 for (j=0; j<SIZE_NUM; j++)
1158 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1159 Time_F(START,usertime);
1160 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1161 BF_cbc_encrypt(buf,buf,
1162 (unsigned long)lengths[j],&bf_ks,
1164 d=Time_F(STOP,usertime);
1165 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1166 count,names[D_CBC_BF],d);
1167 results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1172 if (doit[D_CBC_CAST])
1174 for (j=0; j<SIZE_NUM; j++)
1176 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1177 Time_F(START,usertime);
1178 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1179 CAST_cbc_encrypt(buf,buf,
1180 (unsigned long)lengths[j],&cast_ks,
1182 d=Time_F(STOP,usertime);
1183 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1184 count,names[D_CBC_CAST],d);
1185 results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1192 for (j=0; j<SIZE_NUM; j++)
1197 names[D_EVP]=OBJ_nid2ln(evp->nid);
1198 print_message(names[D_EVP],save_count,
1200 EVP_EncryptInit(&ctx,evp,key16,iv);
1201 Time_F(START,usertime);
1202 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1203 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1204 EVP_EncryptFinal(&ctx,buf,&outl);
1205 d=Time_F(STOP,usertime);
1206 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1207 count,names[D_EVP],d);
1208 results[D_EVP][j]=((double)count)/d*lengths[j];
1212 RAND_pseudo_bytes(buf,36);
1214 for (j=0; j<RSA_NUM; j++)
1217 if (!rsa_doit[j]) continue;
1218 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1221 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1222 ERR_print_errors(bio_err);
1227 pkey_print_message("private","rsa",
1228 rsa_c[j][0],rsa_bits[j],
1230 /* RSA_blinding_on(rsa_key[j],NULL); */
1231 Time_F(START,usertime);
1232 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1234 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1235 &rsa_num, rsa_key[j]);
1239 "RSA sign failure\n");
1240 ERR_print_errors(bio_err);
1245 d=Time_F(STOP,usertime);
1247 "%ld %d bit private RSA's in %.2fs\n",
1248 count,rsa_bits[j],d);
1249 rsa_results[j][0]=d/(double)count;
1254 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1257 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1258 ERR_print_errors(bio_err);
1263 pkey_print_message("public","rsa",
1264 rsa_c[j][1],rsa_bits[j],
1266 Time_F(START,usertime);
1267 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1269 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1270 rsa_num, rsa_key[j]);
1274 "RSA verify failure\n");
1275 ERR_print_errors(bio_err);
1280 d=Time_F(STOP,usertime);
1282 "%ld %d bit public RSA's in %.2fs\n",
1283 count,rsa_bits[j],d);
1284 rsa_results[j][1]=d/(double)count;
1290 /* if longer than 10s, don't do any more */
1291 for (j++; j<RSA_NUM; j++)
1297 RAND_pseudo_bytes(buf,20);
1299 if (RAND_status() != 1)
1301 RAND_seed(rnd_seed, sizeof rnd_seed);
1304 for (j=0; j<DSA_NUM; j++)
1309 if (!dsa_doit[j]) continue;
1310 DSA_generate_key(dsa_key[j]);
1311 /* DSA_sign_setup(dsa_key[j],NULL); */
1312 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1316 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1317 ERR_print_errors(bio_err);
1322 pkey_print_message("sign","dsa",
1323 dsa_c[j][0],dsa_bits[j],
1325 Time_F(START,usertime);
1326 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1328 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1333 "DSA sign failure\n");
1334 ERR_print_errors(bio_err);
1339 d=Time_F(STOP,usertime);
1340 BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1341 count,dsa_bits[j],d);
1342 dsa_results[j][0]=d/(double)count;
1346 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1350 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1351 ERR_print_errors(bio_err);
1356 pkey_print_message("verify","dsa",
1357 dsa_c[j][1],dsa_bits[j],
1359 Time_F(START,usertime);
1360 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1362 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1367 "DSA verify failure\n");
1368 ERR_print_errors(bio_err);
1373 d=Time_F(STOP,usertime);
1374 BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1375 count,dsa_bits[j],d);
1376 dsa_results[j][1]=d/(double)count;
1381 /* if longer than 10s, don't do any more */
1382 for (j++; j<DSA_NUM; j++)
1386 if (rnd_fake) RAND_cleanup();
1389 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1390 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1392 printf("%s ",BN_options());
1394 printf("%s ",MD2_options());
1397 printf("%s ",RC4_options());
1400 printf("%s ",des_options());
1403 printf("%s ",idea_options());
1406 printf("%s ",BF_options());
1408 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1412 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1413 fprintf(stdout,"type ");
1414 for (j=0; j<SIZE_NUM; j++)
1415 fprintf(stdout,"%7d bytes",lengths[j]);
1416 fprintf(stdout,"\n");
1419 for (k=0; k<ALGOR_NUM; k++)
1421 if (!doit[k]) continue;
1422 fprintf(stdout,"%-13s",names[k]);
1423 for (j=0; j<SIZE_NUM; j++)
1425 if (results[k][j] > 10000)
1426 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1428 fprintf(stdout," %11.2f ",results[k][j]);
1430 fprintf(stdout,"\n");
1434 for (k=0; k<RSA_NUM; k++)
1436 if (!rsa_doit[k]) continue;
1439 printf("%18ssign verify sign/s verify/s\n"," ");
1442 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1443 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1444 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1445 fprintf(stdout,"\n");
1450 for (k=0; k<DSA_NUM; k++)
1452 if (!dsa_doit[k]) continue;
1454 printf("%18ssign verify sign/s verify/s\n"," ");
1457 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1458 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1459 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1460 fprintf(stdout,"\n");
1465 ERR_print_errors(bio_err);
1466 if (buf != NULL) OPENSSL_free(buf);
1467 if (buf2 != NULL) OPENSSL_free(buf2);
1469 for (i=0; i<RSA_NUM; i++)
1470 if (rsa_key[i] != NULL)
1471 RSA_free(rsa_key[i]);
1474 for (i=0; i<DSA_NUM; i++)
1475 if (dsa_key[i] != NULL)
1476 DSA_free(dsa_key[i]);
1481 static void print_message(const char *s, long num, int length)
1484 BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1485 (void)BIO_flush(bio_err);
1488 BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
1489 (void)BIO_flush(bio_err);
1496 static void pkey_print_message(char *str, char *str2, long num, int bits,
1500 BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1501 (void)BIO_flush(bio_err);
1504 BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1505 (void)BIO_flush(bio_err);