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__)
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;
327 unsigned char md2[MD2_DIGEST_LENGTH];
330 unsigned char mdc2[MDC2_DIGEST_LENGTH];
333 unsigned char md4[MD4_DIGEST_LENGTH];
336 unsigned char md5[MD5_DIGEST_LENGTH];
337 unsigned char hmac[MD5_DIGEST_LENGTH];
340 unsigned char sha[SHA_DIGEST_LENGTH];
343 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
355 IDEA_KEY_SCHEDULE idea_ks;
363 static unsigned char key16[16]=
364 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
365 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
368 des_cblock *buf_as_des_cblock = NULL;
369 static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
370 static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
371 static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
372 des_key_schedule sch,sch2,sch3;
384 #define D_CBC_IDEA 10
388 #define D_CBC_CAST 14
390 double d,results[ALGOR_NUM][SIZE_NUM];
391 static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
392 long c[ALGOR_NUM][SIZE_NUM];
393 static const char *names[ALGOR_NUM]={
394 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
395 "des cbc","des ede3","idea cbc",
396 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
405 RSA *rsa_key[RSA_NUM];
406 long rsa_c[RSA_NUM][2];
407 double rsa_results[RSA_NUM][2];
408 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
409 static unsigned char *rsa_data[RSA_NUM]=
410 {test512,test1024,test2048,test4096};
411 static int rsa_data_length[RSA_NUM]={
412 sizeof(test512),sizeof(test1024),
413 sizeof(test2048),sizeof(test4096)};
416 DSA *dsa_key[DSA_NUM];
417 long dsa_c[DSA_NUM][2];
418 double dsa_results[DSA_NUM][2];
419 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
421 int rsa_doit[RSA_NUM];
422 int dsa_doit[DSA_NUM];
426 const EVP_CIPHER *evp=NULL;
433 memset(results, 0, sizeof(results));
435 memset(dsa_key,0,sizeof(dsa_key));
439 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
440 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
443 memset(rsa_key,0,sizeof(rsa_key));
444 for (i=0; i<RSA_NUM; i++)
448 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
450 BIO_printf(bio_err,"out of memory\n");
454 buf_as_des_cblock = (des_cblock *)buf;
456 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
458 BIO_printf(bio_err,"out of memory\n");
462 memset(c,0,sizeof(c));
463 memset(iv,0,sizeof(iv));
465 for (i=0; i<ALGOR_NUM; i++)
467 for (i=0; i<RSA_NUM; i++)
469 for (i=0; i<DSA_NUM; i++)
477 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
479 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
485 BIO_printf(bio_err,"no EVP given\n");
488 evp=EVP_get_cipherbyname(*argv);
491 BIO_printf(bio_err,"%s is an unknown cipher\n",*argv);
497 if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
503 BIO_printf(bio_err,"no engine given\n");
506 if((e = ENGINE_by_id(*argv)) == NULL)
508 BIO_printf(bio_err,"invalid engine \"%s\"\n",
512 if(!ENGINE_set_default(e, ENGINE_METHOD_ALL))
514 BIO_printf(bio_err,"can't use that engine\n");
517 BIO_printf(bio_err,"engine \"%s\" set.\n", *argv);
518 /* Free our "structural" reference. */
520 /* It will be increased again further down. We just
521 don't want speed to confuse an engine with an
522 algorithm, especially when none is given (which
523 means all of them should be run) */
528 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
532 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
536 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
540 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
544 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
548 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
550 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
554 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
556 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
558 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
562 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
566 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
567 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
571 #if 0 /* was: #ifdef RSAref */
572 if (strcmp(*argv,"rsaref") == 0)
574 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
580 if (strcmp(*argv,"openssl") == 0)
582 RSA_set_default_openssl_method(RSA_PKCS1_SSLeay());
588 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
589 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
590 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
591 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
592 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
593 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
594 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
597 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
598 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
602 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
603 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
607 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
608 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
612 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
613 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
614 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
618 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
619 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
620 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
624 if (strcmp(*argv,"des") == 0)
632 if (strcmp(*argv,"rsa") == 0)
634 rsa_doit[R_RSA_512]=1;
635 rsa_doit[R_RSA_1024]=1;
636 rsa_doit[R_RSA_2048]=1;
637 rsa_doit[R_RSA_4096]=1;
642 if (strcmp(*argv,"dsa") == 0)
644 dsa_doit[R_DSA_512]=1;
645 dsa_doit[R_DSA_1024]=1;
650 BIO_printf(bio_err,"Error: bad option or value\n");
651 BIO_printf(bio_err,"\n");
652 BIO_printf(bio_err,"Available values:\n");
654 BIO_printf(bio_err,"md2 ");
657 BIO_printf(bio_err,"mdc2 ");
660 BIO_printf(bio_err,"md4 ");
663 BIO_printf(bio_err,"md5 ");
665 BIO_printf(bio_err,"hmac ");
669 BIO_printf(bio_err,"sha1 ");
672 BIO_printf(bio_err,"rmd160");
674 #if !defined(NO_MD2) || !defined(NO_MDC2) || !defined(NO_MD4) || !defined(NO_MD5) || !defined(NO_SHA1) || !defined(NO_RIPEMD160)
675 BIO_printf(bio_err,"\n");
679 BIO_printf(bio_err,"idea-cbc ");
682 BIO_printf(bio_err,"rc2-cbc ");
685 BIO_printf(bio_err,"rc5-cbc ");
688 BIO_printf(bio_err,"bf-cbc");
690 #if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_BF) || !defined(NO_RC5)
691 BIO_printf(bio_err,"\n");
694 BIO_printf(bio_err,"des-cbc des-ede3 ");
696 BIO_printf(bio_err,"rc4");
698 BIO_printf(bio_err,"\n");
701 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
705 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
709 BIO_printf(bio_err,"idea ");
712 BIO_printf(bio_err,"rc2 ");
715 BIO_printf(bio_err,"des ");
718 BIO_printf(bio_err,"rsa ");
721 BIO_printf(bio_err,"blowfish");
723 #if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_DES) || !defined(NO_RSA) || !defined(NO_BF)
724 BIO_printf(bio_err,"\n");
727 BIO_printf(bio_err,"\n");
728 BIO_printf(bio_err,"Available options:\n");
730 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
732 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
742 for (i=0; i<ALGOR_NUM; i++)
747 for (i=0; i<RSA_NUM; i++)
749 for (i=0; i<DSA_NUM; i++)
752 for (i=0; i<ALGOR_NUM; i++)
753 if (doit[i]) pr_header++;
756 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
759 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
760 BIO_printf(bio_err,"program when this computer is idle.\n");
764 for (i=0; i<RSA_NUM; i++)
766 const unsigned char *p;
769 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
770 if (rsa_key[i] == NULL)
772 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
778 BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
779 BN_print(bio_err,rsa_key[i]->e);
780 BIO_printf(bio_err,"\n");
787 dsa_key[0]=get_dsa512();
788 dsa_key[1]=get_dsa1024();
789 dsa_key[2]=get_dsa2048();
793 des_set_key_unchecked(&key,sch);
794 des_set_key_unchecked(&key2,sch2);
795 des_set_key_unchecked(&key3,sch3);
798 idea_set_encrypt_key(key16,&idea_ks);
801 RC4_set_key(&rc4_ks,16,key16);
804 RC2_set_key(&rc2_ks,16,key16,128);
807 RC5_32_set_key(&rc5_ks,16,key16,12);
810 BF_set_key(&bf_ks,16,key16);
813 CAST_set_key(&cast_ks,16,key16);
816 memset(rsa_c,0,sizeof(rsa_c));
820 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
825 Time_F(START,usertime);
826 for (i=count; i; i--)
827 des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
828 &(sch[0]),DES_ENCRYPT);
829 d=Time_F(STOP,usertime);
832 c[D_MD2][0]=count/10;
833 c[D_MDC2][0]=count/10;
838 c[D_RMD160][0]=count;
840 c[D_CBC_DES][0]=count;
841 c[D_EDE3_DES][0]=count/3;
842 c[D_CBC_IDEA][0]=count;
843 c[D_CBC_RC2][0]=count;
844 c[D_CBC_RC5][0]=count;
845 c[D_CBC_BF][0]=count;
846 c[D_CBC_CAST][0]=count;
848 for (i=1; i<SIZE_NUM; i++)
850 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
851 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
852 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
853 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
854 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
855 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
856 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
858 for (i=1; i<SIZE_NUM; i++)
862 l0=(long)lengths[i-1];
864 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
865 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
866 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
867 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
868 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
869 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
870 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
871 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
874 rsa_c[R_RSA_512][0]=count/2000;
875 rsa_c[R_RSA_512][1]=count/400;
876 for (i=1; i<RSA_NUM; i++)
878 rsa_c[i][0]=rsa_c[i-1][0]/8;
879 rsa_c[i][1]=rsa_c[i-1][1]/4;
880 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
884 if (rsa_c[i][0] == 0)
893 dsa_c[R_DSA_512][0]=count/1000;
894 dsa_c[R_DSA_512][1]=count/1000/2;
895 for (i=1; i<DSA_NUM; i++)
897 dsa_c[i][0]=dsa_c[i-1][0]/4;
898 dsa_c[i][1]=dsa_c[i-1][1]/4;
899 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
911 #define COND(d) (count < (d))
914 /* not worth fixing */
915 # error "You cannot disable DES on systems without SIGALRM."
918 #define COND(c) (run)
919 #define COUNT(d) (count)
920 signal(SIGALRM,sig_done);
926 for (j=0; j<SIZE_NUM; j++)
928 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
929 Time_F(START,usertime);
930 for (count=0,run=1; COND(c[D_MD2][j]); count++)
931 MD2(buf,(unsigned long)lengths[j],&(md2[0]));
932 d=Time_F(STOP,usertime);
933 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
934 count,names[D_MD2],d);
935 results[D_MD2][j]=((double)count)/d*lengths[j];
942 for (j=0; j<SIZE_NUM; j++)
944 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
945 Time_F(START,usertime);
946 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
947 MDC2(buf,(unsigned long)lengths[j],&(mdc2[0]));
948 d=Time_F(STOP,usertime);
949 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
950 count,names[D_MDC2],d);
951 results[D_MDC2][j]=((double)count)/d*lengths[j];
959 for (j=0; j<SIZE_NUM; j++)
961 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
962 Time_F(START,usertime);
963 for (count=0,run=1; COND(c[D_MD4][j]); count++)
964 MD4(&(buf[0]),(unsigned long)lengths[j],&(md4[0]));
965 d=Time_F(STOP,usertime);
966 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
967 count,names[D_MD4],d);
968 results[D_MD4][j]=((double)count)/d*lengths[j];
976 for (j=0; j<SIZE_NUM; j++)
978 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
979 Time_F(START,usertime);
980 for (count=0,run=1; COND(c[D_MD5][j]); count++)
981 MD5(&(buf[0]),(unsigned long)lengths[j],&(md5[0]));
982 d=Time_F(STOP,usertime);
983 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
984 count,names[D_MD5],d);
985 results[D_MD5][j]=((double)count)/d*lengths[j];
990 #if !defined(NO_MD5) && !defined(NO_HMAC)
994 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
997 for (j=0; j<SIZE_NUM; j++)
999 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1000 Time_F(START,usertime);
1001 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1003 HMAC_Init(&hctx,NULL,0,NULL);
1004 HMAC_Update(&hctx,buf,lengths[j]);
1005 HMAC_Final(&hctx,&(hmac[0]),NULL);
1007 d=Time_F(STOP,usertime);
1008 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1009 count,names[D_HMAC],d);
1010 results[D_HMAC][j]=((double)count)/d*lengths[j];
1017 for (j=0; j<SIZE_NUM; j++)
1019 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1020 Time_F(START,usertime);
1021 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1022 SHA1(buf,(unsigned long)lengths[j],&(sha[0]));
1023 d=Time_F(STOP,usertime);
1024 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1025 count,names[D_SHA1],d);
1026 results[D_SHA1][j]=((double)count)/d*lengths[j];
1033 for (j=0; j<SIZE_NUM; j++)
1035 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1036 Time_F(START,usertime);
1037 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1038 RIPEMD160(buf,(unsigned long)lengths[j],&(rmd160[0]));
1039 d=Time_F(STOP,usertime);
1040 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1041 count,names[D_RMD160],d);
1042 results[D_RMD160][j]=((double)count)/d*lengths[j];
1049 for (j=0; j<SIZE_NUM; j++)
1051 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1052 Time_F(START,usertime);
1053 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1054 RC4(&rc4_ks,(unsigned int)lengths[j],
1056 d=Time_F(STOP,usertime);
1057 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1058 count,names[D_RC4],d);
1059 results[D_RC4][j]=((double)count)/d*lengths[j];
1064 if (doit[D_CBC_DES])
1066 for (j=0; j<SIZE_NUM; j++)
1068 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1069 Time_F(START,usertime);
1070 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1071 des_ncbc_encrypt(buf,buf,lengths[j],sch,
1073 d=Time_F(STOP,usertime);
1074 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1075 count,names[D_CBC_DES],d);
1076 results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1080 if (doit[D_EDE3_DES])
1082 for (j=0; j<SIZE_NUM; j++)
1084 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1085 Time_F(START,usertime);
1086 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1087 des_ede3_cbc_encrypt(buf,buf,lengths[j],
1090 d=Time_F(STOP,usertime);
1091 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1092 count,names[D_EDE3_DES],d);
1093 results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1098 if (doit[D_CBC_IDEA])
1100 for (j=0; j<SIZE_NUM; j++)
1102 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1103 Time_F(START,usertime);
1104 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1105 idea_cbc_encrypt(buf,buf,
1106 (unsigned long)lengths[j],&idea_ks,
1108 d=Time_F(STOP,usertime);
1109 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1110 count,names[D_CBC_IDEA],d);
1111 results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1116 if (doit[D_CBC_RC2])
1118 for (j=0; j<SIZE_NUM; j++)
1120 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1121 Time_F(START,usertime);
1122 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1123 RC2_cbc_encrypt(buf,buf,
1124 (unsigned long)lengths[j],&rc2_ks,
1126 d=Time_F(STOP,usertime);
1127 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1128 count,names[D_CBC_RC2],d);
1129 results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1134 if (doit[D_CBC_RC5])
1136 for (j=0; j<SIZE_NUM; j++)
1138 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1139 Time_F(START,usertime);
1140 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1141 RC5_32_cbc_encrypt(buf,buf,
1142 (unsigned long)lengths[j],&rc5_ks,
1144 d=Time_F(STOP,usertime);
1145 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1146 count,names[D_CBC_RC5],d);
1147 results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1154 for (j=0; j<SIZE_NUM; j++)
1156 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1157 Time_F(START,usertime);
1158 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1159 BF_cbc_encrypt(buf,buf,
1160 (unsigned long)lengths[j],&bf_ks,
1162 d=Time_F(STOP,usertime);
1163 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1164 count,names[D_CBC_BF],d);
1165 results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1170 if (doit[D_CBC_CAST])
1172 for (j=0; j<SIZE_NUM; j++)
1174 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1175 Time_F(START,usertime);
1176 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1177 CAST_cbc_encrypt(buf,buf,
1178 (unsigned long)lengths[j],&cast_ks,
1180 d=Time_F(STOP,usertime);
1181 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1182 count,names[D_CBC_CAST],d);
1183 results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1190 for (j=0; j<SIZE_NUM; j++)
1195 names[D_EVP]=OBJ_nid2ln(evp->nid);
1196 print_message(names[D_EVP],save_count,
1198 EVP_EncryptInit(&ctx,evp,key16,iv);
1199 Time_F(START,usertime);
1200 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1201 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1202 EVP_EncryptFinal(&ctx,buf,&outl);
1203 d=Time_F(STOP,usertime);
1204 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1205 count,names[D_EVP],d);
1206 results[D_EVP][j]=((double)count)/d*lengths[j];
1210 RAND_pseudo_bytes(buf,36);
1212 for (j=0; j<RSA_NUM; j++)
1215 if (!rsa_doit[j]) continue;
1216 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1219 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1220 ERR_print_errors(bio_err);
1225 pkey_print_message("private","rsa",
1226 rsa_c[j][0],rsa_bits[j],
1228 /* RSA_blinding_on(rsa_key[j],NULL); */
1229 Time_F(START,usertime);
1230 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1232 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1233 &rsa_num, rsa_key[j]);
1237 "RSA sign failure\n");
1238 ERR_print_errors(bio_err);
1243 d=Time_F(STOP,usertime);
1245 "%ld %d bit private RSA's in %.2fs\n",
1246 count,rsa_bits[j],d);
1247 rsa_results[j][0]=d/(double)count;
1252 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1255 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1256 ERR_print_errors(bio_err);
1261 pkey_print_message("public","rsa",
1262 rsa_c[j][1],rsa_bits[j],
1264 Time_F(START,usertime);
1265 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1267 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1268 rsa_num, rsa_key[j]);
1272 "RSA verify failure\n");
1273 ERR_print_errors(bio_err);
1278 d=Time_F(STOP,usertime);
1280 "%ld %d bit public RSA's in %.2fs\n",
1281 count,rsa_bits[j],d);
1282 rsa_results[j][1]=d/(double)count;
1288 /* if longer than 10s, don't do any more */
1289 for (j++; j<RSA_NUM; j++)
1295 RAND_pseudo_bytes(buf,20);
1297 if (RAND_status() != 1)
1299 RAND_seed(rnd_seed, sizeof rnd_seed);
1302 for (j=0; j<DSA_NUM; j++)
1307 if (!dsa_doit[j]) continue;
1308 DSA_generate_key(dsa_key[j]);
1309 /* DSA_sign_setup(dsa_key[j],NULL); */
1310 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1314 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1315 ERR_print_errors(bio_err);
1320 pkey_print_message("sign","dsa",
1321 dsa_c[j][0],dsa_bits[j],
1323 Time_F(START,usertime);
1324 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1326 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1331 "DSA sign failure\n");
1332 ERR_print_errors(bio_err);
1337 d=Time_F(STOP,usertime);
1338 BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1339 count,dsa_bits[j],d);
1340 dsa_results[j][0]=d/(double)count;
1344 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1348 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1349 ERR_print_errors(bio_err);
1354 pkey_print_message("verify","dsa",
1355 dsa_c[j][1],dsa_bits[j],
1357 Time_F(START,usertime);
1358 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1360 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1365 "DSA verify failure\n");
1366 ERR_print_errors(bio_err);
1371 d=Time_F(STOP,usertime);
1372 BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1373 count,dsa_bits[j],d);
1374 dsa_results[j][1]=d/(double)count;
1379 /* if longer than 10s, don't do any more */
1380 for (j++; j<DSA_NUM; j++)
1384 if (rnd_fake) RAND_cleanup();
1387 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1388 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1390 printf("%s ",BN_options());
1392 printf("%s ",MD2_options());
1395 printf("%s ",RC4_options());
1398 printf("%s ",des_options());
1401 printf("%s ",idea_options());
1404 printf("%s ",BF_options());
1406 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1410 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1411 fprintf(stdout,"type ");
1412 for (j=0; j<SIZE_NUM; j++)
1413 fprintf(stdout,"%7d bytes",lengths[j]);
1414 fprintf(stdout,"\n");
1417 for (k=0; k<ALGOR_NUM; k++)
1419 if (!doit[k]) continue;
1420 fprintf(stdout,"%-13s",names[k]);
1421 for (j=0; j<SIZE_NUM; j++)
1423 if (results[k][j] > 10000)
1424 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1426 fprintf(stdout," %11.2f ",results[k][j]);
1428 fprintf(stdout,"\n");
1432 for (k=0; k<RSA_NUM; k++)
1434 if (!rsa_doit[k]) continue;
1437 printf("%18ssign verify sign/s verify/s\n"," ");
1440 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1441 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1442 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1443 fprintf(stdout,"\n");
1448 for (k=0; k<DSA_NUM; k++)
1450 if (!dsa_doit[k]) continue;
1452 printf("%18ssign verify sign/s verify/s\n"," ");
1455 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1456 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1457 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1458 fprintf(stdout,"\n");
1463 ERR_print_errors(bio_err);
1464 if (buf != NULL) OPENSSL_free(buf);
1465 if (buf2 != NULL) OPENSSL_free(buf2);
1467 for (i=0; i<RSA_NUM; i++)
1468 if (rsa_key[i] != NULL)
1469 RSA_free(rsa_key[i]);
1472 for (i=0; i<DSA_NUM; i++)
1473 if (dsa_key[i] != NULL)
1474 DSA_free(dsa_key[i]);
1479 static void print_message(const char *s, long num, int length)
1482 BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1483 (void)BIO_flush(bio_err);
1486 BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
1487 (void)BIO_flush(bio_err);
1494 static void pkey_print_message(char *str, char *str2, long num, int bits,
1498 BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1499 (void)BIO_flush(bio_err);
1502 BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1503 (void)BIO_flush(bio_err);