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
78 #ifdef OPENSSL_NO_STDIO
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__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
90 #elif !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
93 #if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_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(OPENSSL_SYS_VMS_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>
131 #ifndef OPENSSL_NO_DES
132 #include <openssl/des.h>
134 #ifndef OPENSSL_NO_MD2
135 #include <openssl/md2.h>
137 #ifndef OPENSSL_NO_MDC2
138 #include <openssl/mdc2.h>
140 #ifndef OPENSSL_NO_MD4
141 #include <openssl/md4.h>
143 #ifndef OPENSSL_NO_MD5
144 #include <openssl/md5.h>
146 #ifndef OPENSSL_NO_HMAC
147 #include <openssl/hmac.h>
149 #include <openssl/evp.h>
150 #ifndef OPENSSL_NO_SHA
151 #include <openssl/sha.h>
153 #ifndef OPENSSL_NO_RIPEMD
154 #include <openssl/ripemd.h>
156 #ifndef OPENSSL_NO_RC4
157 #include <openssl/rc4.h>
159 #ifndef OPENSSL_NO_RC5
160 #include <openssl/rc5.h>
162 #ifndef OPENSSL_NO_RC2
163 #include <openssl/rc2.h>
165 #ifndef OPENSSL_NO_IDEA
166 #include <openssl/idea.h>
168 #ifndef OPENSSL_NO_BF
169 #include <openssl/blowfish.h>
171 #ifndef OPENSSL_NO_CAST
172 #include <openssl/cast.h>
174 #ifndef OPENSSL_NO_RSA
175 #include <openssl/rsa.h>
176 #include "./testrsa.h"
178 #include <openssl/x509.h>
179 #ifndef OPENSSL_NO_DSA
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;
325 #ifndef OPENSSL_NO_RSA
328 #ifndef OPENSSL_NO_MD2
329 unsigned char md2[MD2_DIGEST_LENGTH];
331 #ifndef OPENSSL_NO_MDC2
332 unsigned char mdc2[MDC2_DIGEST_LENGTH];
334 #ifndef OPENSSL_NO_MD4
335 unsigned char md4[MD4_DIGEST_LENGTH];
337 #ifndef OPENSSL_NO_MD5
338 unsigned char md5[MD5_DIGEST_LENGTH];
339 unsigned char hmac[MD5_DIGEST_LENGTH];
341 #ifndef OPENSSL_NO_SHA
342 unsigned char sha[SHA_DIGEST_LENGTH];
344 #ifndef OPENSSL_NO_RIPEMD
345 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
347 #ifndef OPENSSL_NO_RC4
350 #ifndef OPENSSL_NO_RC5
353 #ifndef OPENSSL_NO_RC2
356 #ifndef OPENSSL_NO_IDEA
357 IDEA_KEY_SCHEDULE idea_ks;
359 #ifndef OPENSSL_NO_BF
362 #ifndef OPENSSL_NO_CAST
365 static unsigned char key16[16]=
366 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
367 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
369 #ifndef OPENSSL_NO_DES
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"};
406 #ifndef OPENSSL_NO_RSA
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)};
417 #ifndef OPENSSL_NO_DSA
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;
436 memset(results, 0, sizeof(results));
437 #ifndef OPENSSL_NO_DSA
438 memset(dsa_key,0,sizeof(dsa_key));
442 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
443 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
445 #ifndef OPENSSL_NO_RSA
446 memset(rsa_key,0,sizeof(rsa_key));
447 for (i=0; i<RSA_NUM; i++)
451 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
453 BIO_printf(bio_err,"out of memory\n");
456 #ifndef OPENSSL_NO_DES
457 buf_as_des_cblock = (des_cblock *)buf;
459 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
461 BIO_printf(bio_err,"out of memory\n");
465 memset(c,0,sizeof(c));
466 memset(iv,0,sizeof(iv));
468 for (i=0; i<ALGOR_NUM; i++)
470 for (i=0; i<RSA_NUM; i++)
472 for (i=0; i<DSA_NUM; i++)
480 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
482 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
488 BIO_printf(bio_err,"no EVP given\n");
491 evp=EVP_get_cipherbyname(*argv);
494 BIO_printf(bio_err,"%s is an unknown cipher\n",*argv);
499 else if(argc > 0 && !strcmp(*argv,"-decrypt"))
506 if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
512 BIO_printf(bio_err,"no engine given\n");
515 e = setup_engine(bio_err, *argv, 0);
516 /* j will be increased again further down. We just
517 don't want speed to confuse an engine with an
518 algorithm, especially when none is given (which
519 means all of them should be run) */
523 #ifndef OPENSSL_NO_MD2
524 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
527 #ifndef OPENSSL_NO_MDC2
528 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
531 #ifndef OPENSSL_NO_MD4
532 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
535 #ifndef OPENSSL_NO_MD5
536 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
539 #ifndef OPENSSL_NO_MD5
540 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
543 #ifndef OPENSSL_NO_SHA
544 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
546 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
549 #ifndef OPENSSL_NO_RIPEMD
550 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
552 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
554 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
557 #ifndef OPENSSL_NO_RC4
558 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
561 #ifndef OPENSSL_NO_DES
562 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
563 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
566 #ifndef OPENSSL_NO_RSA
567 #if 0 /* was: #ifdef RSAref */
568 if (strcmp(*argv,"rsaref") == 0)
570 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
576 if (strcmp(*argv,"openssl") == 0)
578 RSA_set_default_openssl_method(RSA_PKCS1_SSLeay());
583 #endif /* !OPENSSL_NO_RSA */
584 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
585 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
586 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
587 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
588 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
589 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
590 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
592 #ifndef OPENSSL_NO_RC2
593 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
594 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
597 #ifndef OPENSSL_NO_RC5
598 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
599 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
602 #ifndef OPENSSL_NO_IDEA
603 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
604 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
607 #ifndef OPENSSL_NO_BF
608 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
609 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
610 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
613 #ifndef OPENSSL_NO_CAST
614 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
615 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
616 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
619 #ifndef OPENSSL_NO_DES
620 if (strcmp(*argv,"des") == 0)
627 #ifndef OPENSSL_NO_RSA
628 if (strcmp(*argv,"rsa") == 0)
630 rsa_doit[R_RSA_512]=1;
631 rsa_doit[R_RSA_1024]=1;
632 rsa_doit[R_RSA_2048]=1;
633 rsa_doit[R_RSA_4096]=1;
637 #ifndef OPENSSL_NO_DSA
638 if (strcmp(*argv,"dsa") == 0)
640 dsa_doit[R_DSA_512]=1;
641 dsa_doit[R_DSA_1024]=1;
646 BIO_printf(bio_err,"Error: bad option or value\n");
647 BIO_printf(bio_err,"\n");
648 BIO_printf(bio_err,"Available values:\n");
649 #ifndef OPENSSL_NO_MD2
650 BIO_printf(bio_err,"md2 ");
652 #ifndef OPENSSL_NO_MDC2
653 BIO_printf(bio_err,"mdc2 ");
655 #ifndef OPENSSL_NO_MD4
656 BIO_printf(bio_err,"md4 ");
658 #ifndef OPENSSL_NO_MD5
659 BIO_printf(bio_err,"md5 ");
660 #ifndef OPENSSL_NO_HMAC
661 BIO_printf(bio_err,"hmac ");
664 #ifndef OPENSSL_NO_SHA1
665 BIO_printf(bio_err,"sha1 ");
667 #ifndef OPENSSL_NO_RIPEMD160
668 BIO_printf(bio_err,"rmd160");
670 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
671 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
672 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
673 BIO_printf(bio_err,"\n");
676 #ifndef OPENSSL_NO_IDEA
677 BIO_printf(bio_err,"idea-cbc ");
679 #ifndef OPENSSL_NO_RC2
680 BIO_printf(bio_err,"rc2-cbc ");
682 #ifndef OPENSSL_NO_RC5
683 BIO_printf(bio_err,"rc5-cbc ");
685 #ifndef OPENSSL_NO_BF
686 BIO_printf(bio_err,"bf-cbc");
688 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
689 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
690 BIO_printf(bio_err,"\n");
693 BIO_printf(bio_err,"des-cbc des-ede3 ");
694 #ifndef OPENSSL_NO_RC4
695 BIO_printf(bio_err,"rc4");
697 BIO_printf(bio_err,"\n");
699 #ifndef OPENSSL_NO_RSA
700 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
703 #ifndef OPENSSL_NO_DSA
704 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
707 #ifndef OPENSSL_NO_IDEA
708 BIO_printf(bio_err,"idea ");
710 #ifndef OPENSSL_NO_RC2
711 BIO_printf(bio_err,"rc2 ");
713 #ifndef OPENSSL_NO_DES
714 BIO_printf(bio_err,"des ");
716 #ifndef OPENSSL_NO_RSA
717 BIO_printf(bio_err,"rsa ");
719 #ifndef OPENSSL_NO_BF
720 BIO_printf(bio_err,"blowfish");
722 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
723 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
724 !defined(OPENSSL_NO_BF)
725 BIO_printf(bio_err,"\n");
728 BIO_printf(bio_err,"\n");
729 BIO_printf(bio_err,"Available options:\n");
731 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
733 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
743 for (i=0; i<ALGOR_NUM; i++)
748 for (i=0; i<RSA_NUM; i++)
750 for (i=0; i<DSA_NUM; i++)
753 for (i=0; i<ALGOR_NUM; i++)
754 if (doit[i]) pr_header++;
757 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
760 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
761 BIO_printf(bio_err,"program when this computer is idle.\n");
764 #ifndef OPENSSL_NO_RSA
765 for (i=0; i<RSA_NUM; i++)
767 const unsigned char *p;
770 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
771 if (rsa_key[i] == NULL)
773 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
779 BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
780 BN_print(bio_err,rsa_key[i]->e);
781 BIO_printf(bio_err,"\n");
787 #ifndef OPENSSL_NO_DSA
788 dsa_key[0]=get_dsa512();
789 dsa_key[1]=get_dsa1024();
790 dsa_key[2]=get_dsa2048();
793 #ifndef OPENSSL_NO_DES
794 des_set_key_unchecked(&key,sch);
795 des_set_key_unchecked(&key2,sch2);
796 des_set_key_unchecked(&key3,sch3);
798 #ifndef OPENSSL_NO_IDEA
799 idea_set_encrypt_key(key16,&idea_ks);
801 #ifndef OPENSSL_NO_RC4
802 RC4_set_key(&rc4_ks,16,key16);
804 #ifndef OPENSSL_NO_RC2
805 RC2_set_key(&rc2_ks,16,key16,128);
807 #ifndef OPENSSL_NO_RC5
808 RC5_32_set_key(&rc5_ks,16,key16,12);
810 #ifndef OPENSSL_NO_BF
811 BF_set_key(&bf_ks,16,key16);
813 #ifndef OPENSSL_NO_CAST
814 CAST_set_key(&cast_ks,16,key16);
816 #ifndef OPENSSL_NO_RSA
817 memset(rsa_c,0,sizeof(rsa_c));
820 #ifndef OPENSSL_NO_DES
821 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
826 Time_F(START,usertime);
827 for (i=count; i; i--)
828 des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
829 &(sch[0]),DES_ENCRYPT);
830 d=Time_F(STOP,usertime);
833 c[D_MD2][0]=count/10;
834 c[D_MDC2][0]=count/10;
839 c[D_RMD160][0]=count;
841 c[D_CBC_DES][0]=count;
842 c[D_EDE3_DES][0]=count/3;
843 c[D_CBC_IDEA][0]=count;
844 c[D_CBC_RC2][0]=count;
845 c[D_CBC_RC5][0]=count;
846 c[D_CBC_BF][0]=count;
847 c[D_CBC_CAST][0]=count;
849 for (i=1; i<SIZE_NUM; i++)
851 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
852 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
853 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
854 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
855 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
856 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
857 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
859 for (i=1; i<SIZE_NUM; i++)
863 l0=(long)lengths[i-1];
865 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
866 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
867 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
868 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
869 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
870 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
871 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
872 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
874 #ifndef OPENSSL_NO_RSA
875 rsa_c[R_RSA_512][0]=count/2000;
876 rsa_c[R_RSA_512][1]=count/400;
877 for (i=1; i<RSA_NUM; i++)
879 rsa_c[i][0]=rsa_c[i-1][0]/8;
880 rsa_c[i][1]=rsa_c[i-1][1]/4;
881 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
885 if (rsa_c[i][0] == 0)
894 #ifndef OPENSSL_NO_DSA
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))
914 #define COND(d) (count < (d))
917 /* not worth fixing */
918 # error "You cannot disable DES on systems without SIGALRM."
919 #endif /* OPENSSL_NO_DES */
921 #define COND(c) (run)
922 #define COUNT(d) (count)
923 signal(SIGALRM,sig_done);
926 #ifndef OPENSSL_NO_MD2
929 for (j=0; j<SIZE_NUM; j++)
931 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
932 Time_F(START,usertime);
933 for (count=0,run=1; COND(c[D_MD2][j]); count++)
934 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2());
935 d=Time_F(STOP,usertime);
936 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
937 count,names[D_MD2],d);
938 results[D_MD2][j]=((double)count)/d*lengths[j];
942 #ifndef OPENSSL_NO_MDC2
945 for (j=0; j<SIZE_NUM; j++)
947 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
948 Time_F(START,usertime);
949 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
950 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2());
951 d=Time_F(STOP,usertime);
952 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
953 count,names[D_MDC2],d);
954 results[D_MDC2][j]=((double)count)/d*lengths[j];
959 #ifndef OPENSSL_NO_MD4
962 for (j=0; j<SIZE_NUM; j++)
964 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
965 Time_F(START,usertime);
966 for (count=0,run=1; COND(c[D_MD4][j]); count++)
967 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4());
968 d=Time_F(STOP,usertime);
969 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
970 count,names[D_MD4],d);
971 results[D_MD4][j]=((double)count)/d*lengths[j];
976 #ifndef OPENSSL_NO_MD5
979 for (j=0; j<SIZE_NUM; j++)
981 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
982 Time_F(START,usertime);
983 for (count=0,run=1; COND(c[D_MD5][j]); count++)
984 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_md5());
985 d=Time_F(STOP,usertime);
986 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
987 count,names[D_MD5],d);
988 results[D_MD5][j]=((double)count)/d*lengths[j];
993 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
997 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
1000 for (j=0; j<SIZE_NUM; j++)
1002 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1003 Time_F(START,usertime);
1004 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1006 HMAC_Init(&hctx,NULL,0,NULL);
1007 HMAC_Update(&hctx,buf,lengths[j]);
1008 HMAC_Final(&hctx,&(hmac[0]),NULL);
1010 d=Time_F(STOP,usertime);
1011 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1012 count,names[D_HMAC],d);
1013 results[D_HMAC][j]=((double)count)/d*lengths[j];
1015 HMAC_cleanup(&hctx);
1018 #ifndef OPENSSL_NO_SHA
1021 for (j=0; j<SIZE_NUM; j++)
1023 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1024 Time_F(START,usertime);
1025 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1026 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1());
1027 d=Time_F(STOP,usertime);
1028 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1029 count,names[D_SHA1],d);
1030 results[D_SHA1][j]=((double)count)/d*lengths[j];
1034 #ifndef OPENSSL_NO_RIPEMD
1037 for (j=0; j<SIZE_NUM; j++)
1039 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1040 Time_F(START,usertime);
1041 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1042 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160());
1043 d=Time_F(STOP,usertime);
1044 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1045 count,names[D_RMD160],d);
1046 results[D_RMD160][j]=((double)count)/d*lengths[j];
1050 #ifndef OPENSSL_NO_RC4
1053 for (j=0; j<SIZE_NUM; j++)
1055 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1056 Time_F(START,usertime);
1057 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1058 RC4(&rc4_ks,(unsigned int)lengths[j],
1060 d=Time_F(STOP,usertime);
1061 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1062 count,names[D_RC4],d);
1063 results[D_RC4][j]=((double)count)/d*lengths[j];
1067 #ifndef OPENSSL_NO_DES
1068 if (doit[D_CBC_DES])
1070 for (j=0; j<SIZE_NUM; j++)
1072 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1073 Time_F(START,usertime);
1074 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1075 des_ncbc_encrypt(buf,buf,lengths[j],sch,
1077 d=Time_F(STOP,usertime);
1078 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1079 count,names[D_CBC_DES],d);
1080 results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1084 if (doit[D_EDE3_DES])
1086 for (j=0; j<SIZE_NUM; j++)
1088 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1089 Time_F(START,usertime);
1090 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1091 des_ede3_cbc_encrypt(buf,buf,lengths[j],
1094 d=Time_F(STOP,usertime);
1095 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1096 count,names[D_EDE3_DES],d);
1097 results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1101 #ifndef OPENSSL_NO_IDEA
1102 if (doit[D_CBC_IDEA])
1104 for (j=0; j<SIZE_NUM; j++)
1106 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1107 Time_F(START,usertime);
1108 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1109 idea_cbc_encrypt(buf,buf,
1110 (unsigned long)lengths[j],&idea_ks,
1112 d=Time_F(STOP,usertime);
1113 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1114 count,names[D_CBC_IDEA],d);
1115 results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1119 #ifndef OPENSSL_NO_RC2
1120 if (doit[D_CBC_RC2])
1122 for (j=0; j<SIZE_NUM; j++)
1124 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1125 Time_F(START,usertime);
1126 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1127 RC2_cbc_encrypt(buf,buf,
1128 (unsigned long)lengths[j],&rc2_ks,
1130 d=Time_F(STOP,usertime);
1131 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1132 count,names[D_CBC_RC2],d);
1133 results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1137 #ifndef OPENSSL_NO_RC5
1138 if (doit[D_CBC_RC5])
1140 for (j=0; j<SIZE_NUM; j++)
1142 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1143 Time_F(START,usertime);
1144 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1145 RC5_32_cbc_encrypt(buf,buf,
1146 (unsigned long)lengths[j],&rc5_ks,
1148 d=Time_F(STOP,usertime);
1149 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1150 count,names[D_CBC_RC5],d);
1151 results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1155 #ifndef OPENSSL_NO_BF
1158 for (j=0; j<SIZE_NUM; j++)
1160 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1161 Time_F(START,usertime);
1162 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1163 BF_cbc_encrypt(buf,buf,
1164 (unsigned long)lengths[j],&bf_ks,
1166 d=Time_F(STOP,usertime);
1167 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1168 count,names[D_CBC_BF],d);
1169 results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1173 #ifndef OPENSSL_NO_CAST
1174 if (doit[D_CBC_CAST])
1176 for (j=0; j<SIZE_NUM; j++)
1178 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1179 Time_F(START,usertime);
1180 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1181 CAST_cbc_encrypt(buf,buf,
1182 (unsigned long)lengths[j],&cast_ks,
1184 d=Time_F(STOP,usertime);
1185 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1186 count,names[D_CBC_CAST],d);
1187 results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1194 for (j=0; j<SIZE_NUM; j++)
1199 names[D_EVP]=OBJ_nid2ln(evp->nid);
1200 print_message(names[D_EVP],save_count,
1203 EVP_DecryptInit(&ctx,evp,key16,iv);
1205 EVP_EncryptInit(&ctx,evp,key16,iv);
1207 Time_F(START,usertime);
1209 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1210 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1212 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1213 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1215 EVP_DecryptFinal(&ctx,buf,&outl);
1217 EVP_EncryptFinal(&ctx,buf,&outl);
1218 d=Time_F(STOP,usertime);
1219 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1220 count,names[D_EVP],d);
1221 results[D_EVP][j]=((double)count)/d*lengths[j];
1225 RAND_pseudo_bytes(buf,36);
1226 #ifndef OPENSSL_NO_RSA
1227 for (j=0; j<RSA_NUM; j++)
1230 if (!rsa_doit[j]) continue;
1231 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1234 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1235 ERR_print_errors(bio_err);
1240 pkey_print_message("private","rsa",
1241 rsa_c[j][0],rsa_bits[j],
1243 /* RSA_blinding_on(rsa_key[j],NULL); */
1244 Time_F(START,usertime);
1245 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1247 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1248 &rsa_num, rsa_key[j]);
1252 "RSA sign failure\n");
1253 ERR_print_errors(bio_err);
1258 d=Time_F(STOP,usertime);
1260 "%ld %d bit private RSA's in %.2fs\n",
1261 count,rsa_bits[j],d);
1262 rsa_results[j][0]=d/(double)count;
1267 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1270 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1271 ERR_print_errors(bio_err);
1276 pkey_print_message("public","rsa",
1277 rsa_c[j][1],rsa_bits[j],
1279 Time_F(START,usertime);
1280 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1282 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1283 rsa_num, rsa_key[j]);
1287 "RSA verify failure\n");
1288 ERR_print_errors(bio_err);
1293 d=Time_F(STOP,usertime);
1295 "%ld %d bit public RSA's in %.2fs\n",
1296 count,rsa_bits[j],d);
1297 rsa_results[j][1]=d/(double)count;
1303 /* if longer than 10s, don't do any more */
1304 for (j++; j<RSA_NUM; j++)
1310 RAND_pseudo_bytes(buf,20);
1311 #ifndef OPENSSL_NO_DSA
1312 if (RAND_status() != 1)
1314 RAND_seed(rnd_seed, sizeof rnd_seed);
1317 for (j=0; j<DSA_NUM; j++)
1322 if (!dsa_doit[j]) continue;
1323 DSA_generate_key(dsa_key[j]);
1324 /* DSA_sign_setup(dsa_key[j],NULL); */
1325 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1329 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1330 ERR_print_errors(bio_err);
1335 pkey_print_message("sign","dsa",
1336 dsa_c[j][0],dsa_bits[j],
1338 Time_F(START,usertime);
1339 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1341 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1346 "DSA sign failure\n");
1347 ERR_print_errors(bio_err);
1352 d=Time_F(STOP,usertime);
1353 BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1354 count,dsa_bits[j],d);
1355 dsa_results[j][0]=d/(double)count;
1359 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1363 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1364 ERR_print_errors(bio_err);
1369 pkey_print_message("verify","dsa",
1370 dsa_c[j][1],dsa_bits[j],
1372 Time_F(START,usertime);
1373 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1375 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1380 "DSA verify failure\n");
1381 ERR_print_errors(bio_err);
1386 d=Time_F(STOP,usertime);
1387 BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1388 count,dsa_bits[j],d);
1389 dsa_results[j][1]=d/(double)count;
1394 /* if longer than 10s, don't do any more */
1395 for (j++; j<DSA_NUM; j++)
1399 if (rnd_fake) RAND_cleanup();
1402 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1403 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1405 printf("%s ",BN_options());
1406 #ifndef OPENSSL_NO_MD2
1407 printf("%s ",MD2_options());
1409 #ifndef OPENSSL_NO_RC4
1410 printf("%s ",RC4_options());
1412 #ifndef OPENSSL_NO_DES
1413 printf("%s ",des_options());
1415 #ifndef OPENSSL_NO_IDEA
1416 printf("%s ",idea_options());
1418 #ifndef OPENSSL_NO_BF
1419 printf("%s ",BF_options());
1421 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1425 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1426 fprintf(stdout,"type ");
1427 for (j=0; j<SIZE_NUM; j++)
1428 fprintf(stdout,"%7d bytes",lengths[j]);
1429 fprintf(stdout,"\n");
1432 for (k=0; k<ALGOR_NUM; k++)
1434 if (!doit[k]) continue;
1435 fprintf(stdout,"%-13s",names[k]);
1436 for (j=0; j<SIZE_NUM; j++)
1438 if (results[k][j] > 10000)
1439 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1441 fprintf(stdout," %11.2f ",results[k][j]);
1443 fprintf(stdout,"\n");
1445 #ifndef OPENSSL_NO_RSA
1447 for (k=0; k<RSA_NUM; k++)
1449 if (!rsa_doit[k]) continue;
1452 printf("%18ssign verify sign/s verify/s\n"," ");
1455 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1456 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1457 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1458 fprintf(stdout,"\n");
1461 #ifndef OPENSSL_NO_DSA
1463 for (k=0; k<DSA_NUM; k++)
1465 if (!dsa_doit[k]) continue;
1467 printf("%18ssign verify sign/s verify/s\n"," ");
1470 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1471 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1472 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1473 fprintf(stdout,"\n");
1478 ERR_print_errors(bio_err);
1479 if (buf != NULL) OPENSSL_free(buf);
1480 if (buf2 != NULL) OPENSSL_free(buf2);
1481 #ifndef OPENSSL_NO_RSA
1482 for (i=0; i<RSA_NUM; i++)
1483 if (rsa_key[i] != NULL)
1484 RSA_free(rsa_key[i]);
1486 #ifndef OPENSSL_NO_DSA
1487 for (i=0; i<DSA_NUM; i++)
1488 if (dsa_key[i] != NULL)
1489 DSA_free(dsa_key[i]);
1495 static void print_message(const char *s, long num, int length)
1498 BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1499 (void)BIO_flush(bio_err);
1502 BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
1503 (void)BIO_flush(bio_err);
1510 static void pkey_print_message(char *str, char *str2, long num, int bits,
1514 BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1515 (void)BIO_flush(bio_err);
1518 BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1519 (void)BIO_flush(bio_err);