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++)
744 for (i=0; i<RSA_NUM; i++)
746 for (i=0; i<DSA_NUM; i++)
749 for (i=0; i<ALGOR_NUM; i++)
750 if (doit[i]) pr_header++;
753 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
756 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
757 BIO_printf(bio_err,"program when this computer is idle.\n");
761 for (i=0; i<RSA_NUM; i++)
763 const unsigned char *p;
766 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
767 if (rsa_key[i] == NULL)
769 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
775 BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
776 BN_print(bio_err,rsa_key[i]->e);
777 BIO_printf(bio_err,"\n");
784 dsa_key[0]=get_dsa512();
785 dsa_key[1]=get_dsa1024();
786 dsa_key[2]=get_dsa2048();
790 des_set_key_unchecked(&key,sch);
791 des_set_key_unchecked(&key2,sch2);
792 des_set_key_unchecked(&key3,sch3);
795 idea_set_encrypt_key(key16,&idea_ks);
798 RC4_set_key(&rc4_ks,16,key16);
801 RC2_set_key(&rc2_ks,16,key16,128);
804 RC5_32_set_key(&rc5_ks,16,key16,12);
807 BF_set_key(&bf_ks,16,key16);
810 CAST_set_key(&cast_ks,16,key16);
813 memset(rsa_c,0,sizeof(rsa_c));
817 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
822 Time_F(START,usertime);
823 for (i=count; i; i--)
824 des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
825 &(sch[0]),DES_ENCRYPT);
826 d=Time_F(STOP,usertime);
829 c[D_MD2][0]=count/10;
830 c[D_MDC2][0]=count/10;
835 c[D_RMD160][0]=count;
837 c[D_CBC_DES][0]=count;
838 c[D_EDE3_DES][0]=count/3;
839 c[D_CBC_IDEA][0]=count;
840 c[D_CBC_RC2][0]=count;
841 c[D_CBC_RC5][0]=count;
842 c[D_CBC_BF][0]=count;
843 c[D_CBC_CAST][0]=count;
845 for (i=1; i<SIZE_NUM; i++)
847 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
848 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
849 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
850 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
851 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
852 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
853 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
855 for (i=1; i<SIZE_NUM; i++)
859 l0=(long)lengths[i-1];
861 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
862 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
863 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
864 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
865 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
866 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
867 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
868 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
871 rsa_c[R_RSA_512][0]=count/2000;
872 rsa_c[R_RSA_512][1]=count/400;
873 for (i=1; i<RSA_NUM; i++)
875 rsa_c[i][0]=rsa_c[i-1][0]/8;
876 rsa_c[i][1]=rsa_c[i-1][1]/4;
877 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
881 if (rsa_c[i][0] == 0)
890 dsa_c[R_DSA_512][0]=count/1000;
891 dsa_c[R_DSA_512][1]=count/1000/2;
892 for (i=1; i<DSA_NUM; i++)
894 dsa_c[i][0]=dsa_c[i-1][0]/4;
895 dsa_c[i][1]=dsa_c[i-1][1]/4;
896 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
908 #define COND(d) (count < (d))
911 /* not worth fixing */
912 # error "You cannot disable DES on systems without SIGALRM."
915 #define COND(c) (run)
916 #define COUNT(d) (count)
917 signal(SIGALRM,sig_done);
923 for (j=0; j<SIZE_NUM; j++)
925 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
926 Time_F(START,usertime);
927 for (count=0,run=1; COND(c[D_MD2][j]); count++)
928 MD2(buf,(unsigned long)lengths[j],&(md2[0]));
929 d=Time_F(STOP,usertime);
930 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
931 count,names[D_MD2],d);
932 results[D_MD2][j]=((double)count)/d*lengths[j];
939 for (j=0; j<SIZE_NUM; j++)
941 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
942 Time_F(START,usertime);
943 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
944 MDC2(buf,(unsigned long)lengths[j],&(mdc2[0]));
945 d=Time_F(STOP,usertime);
946 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
947 count,names[D_MDC2],d);
948 results[D_MDC2][j]=((double)count)/d*lengths[j];
956 for (j=0; j<SIZE_NUM; j++)
958 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
959 Time_F(START,usertime);
960 for (count=0,run=1; COND(c[D_MD4][j]); count++)
961 MD4(&(buf[0]),(unsigned long)lengths[j],&(md4[0]));
962 d=Time_F(STOP,usertime);
963 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
964 count,names[D_MD4],d);
965 results[D_MD4][j]=((double)count)/d*lengths[j];
973 for (j=0; j<SIZE_NUM; j++)
975 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
976 Time_F(START,usertime);
977 for (count=0,run=1; COND(c[D_MD5][j]); count++)
978 MD5(&(buf[0]),(unsigned long)lengths[j],&(md5[0]));
979 d=Time_F(STOP,usertime);
980 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
981 count,names[D_MD5],d);
982 results[D_MD5][j]=((double)count)/d*lengths[j];
987 #if !defined(NO_MD5) && !defined(NO_HMAC)
991 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
994 for (j=0; j<SIZE_NUM; j++)
996 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
997 Time_F(START,usertime);
998 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1000 HMAC_Init(&hctx,NULL,0,NULL);
1001 HMAC_Update(&hctx,buf,lengths[j]);
1002 HMAC_Final(&hctx,&(hmac[0]),NULL);
1004 d=Time_F(STOP,usertime);
1005 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1006 count,names[D_HMAC],d);
1007 results[D_HMAC][j]=((double)count)/d*lengths[j];
1014 for (j=0; j<SIZE_NUM; j++)
1016 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1017 Time_F(START,usertime);
1018 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1019 SHA1(buf,(unsigned long)lengths[j],&(sha[0]));
1020 d=Time_F(STOP,usertime);
1021 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1022 count,names[D_SHA1],d);
1023 results[D_SHA1][j]=((double)count)/d*lengths[j];
1030 for (j=0; j<SIZE_NUM; j++)
1032 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1033 Time_F(START,usertime);
1034 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1035 RIPEMD160(buf,(unsigned long)lengths[j],&(rmd160[0]));
1036 d=Time_F(STOP,usertime);
1037 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1038 count,names[D_RMD160],d);
1039 results[D_RMD160][j]=((double)count)/d*lengths[j];
1046 for (j=0; j<SIZE_NUM; j++)
1048 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1049 Time_F(START,usertime);
1050 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1051 RC4(&rc4_ks,(unsigned int)lengths[j],
1053 d=Time_F(STOP,usertime);
1054 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1055 count,names[D_RC4],d);
1056 results[D_RC4][j]=((double)count)/d*lengths[j];
1061 if (doit[D_CBC_DES])
1063 for (j=0; j<SIZE_NUM; j++)
1065 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1066 Time_F(START,usertime);
1067 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1068 des_ncbc_encrypt(buf,buf,lengths[j],sch,
1070 d=Time_F(STOP,usertime);
1071 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1072 count,names[D_CBC_DES],d);
1073 results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1077 if (doit[D_EDE3_DES])
1079 for (j=0; j<SIZE_NUM; j++)
1081 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1082 Time_F(START,usertime);
1083 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1084 des_ede3_cbc_encrypt(buf,buf,lengths[j],
1087 d=Time_F(STOP,usertime);
1088 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1089 count,names[D_EDE3_DES],d);
1090 results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1095 if (doit[D_CBC_IDEA])
1097 for (j=0; j<SIZE_NUM; j++)
1099 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1100 Time_F(START,usertime);
1101 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1102 idea_cbc_encrypt(buf,buf,
1103 (unsigned long)lengths[j],&idea_ks,
1105 d=Time_F(STOP,usertime);
1106 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1107 count,names[D_CBC_IDEA],d);
1108 results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1113 if (doit[D_CBC_RC2])
1115 for (j=0; j<SIZE_NUM; j++)
1117 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1118 Time_F(START,usertime);
1119 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1120 RC2_cbc_encrypt(buf,buf,
1121 (unsigned long)lengths[j],&rc2_ks,
1123 d=Time_F(STOP,usertime);
1124 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1125 count,names[D_CBC_RC2],d);
1126 results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1131 if (doit[D_CBC_RC5])
1133 for (j=0; j<SIZE_NUM; j++)
1135 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1136 Time_F(START,usertime);
1137 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1138 RC5_32_cbc_encrypt(buf,buf,
1139 (unsigned long)lengths[j],&rc5_ks,
1141 d=Time_F(STOP,usertime);
1142 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1143 count,names[D_CBC_RC5],d);
1144 results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1151 for (j=0; j<SIZE_NUM; j++)
1153 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1154 Time_F(START,usertime);
1155 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1156 BF_cbc_encrypt(buf,buf,
1157 (unsigned long)lengths[j],&bf_ks,
1159 d=Time_F(STOP,usertime);
1160 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1161 count,names[D_CBC_BF],d);
1162 results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1167 if (doit[D_CBC_CAST])
1169 for (j=0; j<SIZE_NUM; j++)
1171 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1172 Time_F(START,usertime);
1173 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1174 CAST_cbc_encrypt(buf,buf,
1175 (unsigned long)lengths[j],&cast_ks,
1177 d=Time_F(STOP,usertime);
1178 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1179 count,names[D_CBC_CAST],d);
1180 results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1187 for (j=0; j<SIZE_NUM; j++)
1192 names[D_EVP]=OBJ_nid2ln(evp->nid);
1193 print_message(names[D_EVP],save_count,
1195 EVP_EncryptInit(&ctx,evp,key16,iv);
1196 Time_F(START,usertime);
1197 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1198 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1199 EVP_EncryptFinal(&ctx,buf,&outl);
1200 d=Time_F(STOP,usertime);
1201 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1202 count,names[D_EVP],d);
1203 results[D_EVP][j]=((double)count)/d*lengths[j];
1207 RAND_pseudo_bytes(buf,36);
1209 for (j=0; j<RSA_NUM; j++)
1212 if (!rsa_doit[j]) continue;
1213 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1216 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1217 ERR_print_errors(bio_err);
1222 pkey_print_message("private","rsa",
1223 rsa_c[j][0],rsa_bits[j],
1225 /* RSA_blinding_on(rsa_key[j],NULL); */
1226 Time_F(START,usertime);
1227 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1229 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1230 &rsa_num, rsa_key[j]);
1234 "RSA sign failure\n");
1235 ERR_print_errors(bio_err);
1240 d=Time_F(STOP,usertime);
1242 "%ld %d bit private RSA's in %.2fs\n",
1243 count,rsa_bits[j],d);
1244 rsa_results[j][0]=d/(double)count;
1249 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1252 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1253 ERR_print_errors(bio_err);
1258 pkey_print_message("public","rsa",
1259 rsa_c[j][1],rsa_bits[j],
1261 Time_F(START,usertime);
1262 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1264 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1265 rsa_num, rsa_key[j]);
1269 "RSA verify failure\n");
1270 ERR_print_errors(bio_err);
1275 d=Time_F(STOP,usertime);
1277 "%ld %d bit public RSA's in %.2fs\n",
1278 count,rsa_bits[j],d);
1279 rsa_results[j][1]=d/(double)count;
1285 /* if longer than 10s, don't do any more */
1286 for (j++; j<RSA_NUM; j++)
1292 RAND_pseudo_bytes(buf,20);
1294 if (RAND_status() != 1)
1296 RAND_seed(rnd_seed, sizeof rnd_seed);
1299 for (j=0; j<DSA_NUM; j++)
1304 if (!dsa_doit[j]) continue;
1305 DSA_generate_key(dsa_key[j]);
1306 /* DSA_sign_setup(dsa_key[j],NULL); */
1307 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1311 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1312 ERR_print_errors(bio_err);
1317 pkey_print_message("sign","dsa",
1318 dsa_c[j][0],dsa_bits[j],
1320 Time_F(START,usertime);
1321 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1323 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1328 "DSA sign failure\n");
1329 ERR_print_errors(bio_err);
1334 d=Time_F(STOP,usertime);
1335 BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1336 count,dsa_bits[j],d);
1337 dsa_results[j][0]=d/(double)count;
1341 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1345 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1346 ERR_print_errors(bio_err);
1351 pkey_print_message("verify","dsa",
1352 dsa_c[j][1],dsa_bits[j],
1354 Time_F(START,usertime);
1355 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1357 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1362 "DSA verify failure\n");
1363 ERR_print_errors(bio_err);
1368 d=Time_F(STOP,usertime);
1369 BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1370 count,dsa_bits[j],d);
1371 dsa_results[j][1]=d/(double)count;
1376 /* if longer than 10s, don't do any more */
1377 for (j++; j<DSA_NUM; j++)
1381 if (rnd_fake) RAND_cleanup();
1384 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1385 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1387 printf("%s ",BN_options());
1389 printf("%s ",MD2_options());
1392 printf("%s ",RC4_options());
1395 printf("%s ",des_options());
1398 printf("%s ",idea_options());
1401 printf("%s ",BF_options());
1403 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1407 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1408 fprintf(stdout,"type ");
1409 for (j=0; j<SIZE_NUM; j++)
1410 fprintf(stdout,"%7d bytes",lengths[j]);
1411 fprintf(stdout,"\n");
1414 for (k=0; k<ALGOR_NUM; k++)
1416 if (!doit[k]) continue;
1417 fprintf(stdout,"%-13s",names[k]);
1418 for (j=0; j<SIZE_NUM; j++)
1420 if (results[k][j] > 10000)
1421 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1423 fprintf(stdout," %11.2f ",results[k][j]);
1425 fprintf(stdout,"\n");
1429 for (k=0; k<RSA_NUM; k++)
1431 if (!rsa_doit[k]) continue;
1434 printf("%18ssign verify sign/s verify/s\n"," ");
1437 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1438 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1439 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1440 fprintf(stdout,"\n");
1445 for (k=0; k<DSA_NUM; k++)
1447 if (!dsa_doit[k]) continue;
1449 printf("%18ssign verify sign/s verify/s\n"," ");
1452 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1453 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1454 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1455 fprintf(stdout,"\n");
1460 ERR_print_errors(bio_err);
1461 if (buf != NULL) OPENSSL_free(buf);
1462 if (buf2 != NULL) OPENSSL_free(buf2);
1464 for (i=0; i<RSA_NUM; i++)
1465 if (rsa_key[i] != NULL)
1466 RSA_free(rsa_key[i]);
1469 for (i=0; i<DSA_NUM; i++)
1470 if (dsa_key[i] != NULL)
1471 DSA_free(dsa_key[i]);
1476 static void print_message(const char *s, long num, int length)
1479 BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1480 (void)BIO_flush(bio_err);
1483 BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
1484 (void)BIO_flush(bio_err);
1491 static void pkey_print_message(char *str, char *str2, long num, int bits,
1495 BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1496 (void)BIO_flush(bio_err);
1499 BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1500 (void)BIO_flush(bio_err);