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"))
502 if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
508 BIO_printf(bio_err,"no engine given\n");
511 e = setup_engine(bio_err, *argv, 0);
512 /* j will be increased again further down. We just
513 don't want speed to confuse an engine with an
514 algorithm, especially when none is given (which
515 means all of them should be run) */
519 #ifndef OPENSSL_NO_MD2
520 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
523 #ifndef OPENSSL_NO_MDC2
524 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
527 #ifndef OPENSSL_NO_MD4
528 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
531 #ifndef OPENSSL_NO_MD5
532 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
535 #ifndef OPENSSL_NO_MD5
536 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
539 #ifndef OPENSSL_NO_SHA
540 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
542 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
545 #ifndef OPENSSL_NO_RIPEMD
546 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
548 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
550 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
553 #ifndef OPENSSL_NO_RC4
554 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
557 #ifndef OPENSSL_NO_DES
558 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
559 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
562 #ifndef OPENSSL_NO_RSA
563 #if 0 /* was: #ifdef RSAref */
564 if (strcmp(*argv,"rsaref") == 0)
566 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
572 if (strcmp(*argv,"openssl") == 0)
574 RSA_set_default_openssl_method(RSA_PKCS1_SSLeay());
579 #endif /* !OPENSSL_NO_RSA */
580 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
581 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
582 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
583 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
584 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
585 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
586 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
588 #ifndef OPENSSL_NO_RC2
589 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
590 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
593 #ifndef OPENSSL_NO_RC5
594 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
595 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
598 #ifndef OPENSSL_NO_IDEA
599 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
600 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
603 #ifndef OPENSSL_NO_BF
604 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
605 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
606 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
609 #ifndef OPENSSL_NO_CAST
610 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
611 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
612 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
615 #ifndef OPENSSL_NO_DES
616 if (strcmp(*argv,"des") == 0)
623 #ifndef OPENSSL_NO_RSA
624 if (strcmp(*argv,"rsa") == 0)
626 rsa_doit[R_RSA_512]=1;
627 rsa_doit[R_RSA_1024]=1;
628 rsa_doit[R_RSA_2048]=1;
629 rsa_doit[R_RSA_4096]=1;
633 #ifndef OPENSSL_NO_DSA
634 if (strcmp(*argv,"dsa") == 0)
636 dsa_doit[R_DSA_512]=1;
637 dsa_doit[R_DSA_1024]=1;
642 BIO_printf(bio_err,"Error: bad option or value\n");
643 BIO_printf(bio_err,"\n");
644 BIO_printf(bio_err,"Available values:\n");
645 #ifndef OPENSSL_NO_MD2
646 BIO_printf(bio_err,"md2 ");
648 #ifndef OPENSSL_NO_MDC2
649 BIO_printf(bio_err,"mdc2 ");
651 #ifndef OPENSSL_NO_MD4
652 BIO_printf(bio_err,"md4 ");
654 #ifndef OPENSSL_NO_MD5
655 BIO_printf(bio_err,"md5 ");
656 #ifndef OPENSSL_NO_HMAC
657 BIO_printf(bio_err,"hmac ");
660 #ifndef OPENSSL_NO_SHA1
661 BIO_printf(bio_err,"sha1 ");
663 #ifndef OPENSSL_NO_RIPEMD160
664 BIO_printf(bio_err,"rmd160");
666 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
667 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
668 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
669 BIO_printf(bio_err,"\n");
672 #ifndef OPENSSL_NO_IDEA
673 BIO_printf(bio_err,"idea-cbc ");
675 #ifndef OPENSSL_NO_RC2
676 BIO_printf(bio_err,"rc2-cbc ");
678 #ifndef OPENSSL_NO_RC5
679 BIO_printf(bio_err,"rc5-cbc ");
681 #ifndef OPENSSL_NO_BF
682 BIO_printf(bio_err,"bf-cbc");
684 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
685 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
686 BIO_printf(bio_err,"\n");
689 BIO_printf(bio_err,"des-cbc des-ede3 ");
690 #ifndef OPENSSL_NO_RC4
691 BIO_printf(bio_err,"rc4");
693 BIO_printf(bio_err,"\n");
695 #ifndef OPENSSL_NO_RSA
696 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
699 #ifndef OPENSSL_NO_DSA
700 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
703 #ifndef OPENSSL_NO_IDEA
704 BIO_printf(bio_err,"idea ");
706 #ifndef OPENSSL_NO_RC2
707 BIO_printf(bio_err,"rc2 ");
709 #ifndef OPENSSL_NO_DES
710 BIO_printf(bio_err,"des ");
712 #ifndef OPENSSL_NO_RSA
713 BIO_printf(bio_err,"rsa ");
715 #ifndef OPENSSL_NO_BF
716 BIO_printf(bio_err,"blowfish");
718 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
719 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
720 !defined(OPENSSL_NO_BF)
721 BIO_printf(bio_err,"\n");
724 BIO_printf(bio_err,"\n");
725 BIO_printf(bio_err,"Available options:\n");
727 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
729 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
739 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");
760 #ifndef OPENSSL_NO_RSA
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");
783 #ifndef OPENSSL_NO_DSA
784 dsa_key[0]=get_dsa512();
785 dsa_key[1]=get_dsa1024();
786 dsa_key[2]=get_dsa2048();
789 #ifndef OPENSSL_NO_DES
790 des_set_key_unchecked(&key,&sch);
791 des_set_key_unchecked(&key2,&sch2);
792 des_set_key_unchecked(&key3,&sch3);
794 #ifndef OPENSSL_NO_IDEA
795 idea_set_encrypt_key(key16,&idea_ks);
797 #ifndef OPENSSL_NO_RC4
798 RC4_set_key(&rc4_ks,16,key16);
800 #ifndef OPENSSL_NO_RC2
801 RC2_set_key(&rc2_ks,16,key16,128);
803 #ifndef OPENSSL_NO_RC5
804 RC5_32_set_key(&rc5_ks,16,key16,12);
806 #ifndef OPENSSL_NO_BF
807 BF_set_key(&bf_ks,16,key16);
809 #ifndef OPENSSL_NO_CAST
810 CAST_set_key(&cast_ks,16,key16);
812 #ifndef OPENSSL_NO_RSA
813 memset(rsa_c,0,sizeof(rsa_c));
816 #ifndef OPENSSL_NO_DES
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;
870 #ifndef OPENSSL_NO_RSA
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 #ifndef OPENSSL_NO_DSA
891 dsa_c[R_DSA_512][0]=count/1000;
892 dsa_c[R_DSA_512][1]=count/1000/2;
893 for (i=1; i<DSA_NUM; i++)
895 dsa_c[i][0]=dsa_c[i-1][0]/4;
896 dsa_c[i][1]=dsa_c[i-1][1]/4;
897 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
910 #define COND(d) (count < (d))
913 /* not worth fixing */
914 # error "You cannot disable DES on systems without SIGALRM."
915 #endif /* OPENSSL_NO_DES */
917 #define COND(c) (run)
918 #define COUNT(d) (count)
919 signal(SIGALRM,sig_done);
922 #ifndef OPENSSL_NO_MD2
925 for (j=0; j<SIZE_NUM; j++)
927 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
928 Time_F(START,usertime);
929 for (count=0,run=1; COND(c[D_MD2][j]); count++)
930 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2());
931 d=Time_F(STOP,usertime);
932 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
933 count,names[D_MD2],d);
934 results[D_MD2][j]=((double)count)/d*lengths[j];
938 #ifndef OPENSSL_NO_MDC2
941 for (j=0; j<SIZE_NUM; j++)
943 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
944 Time_F(START,usertime);
945 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
946 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2());
947 d=Time_F(STOP,usertime);
948 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
949 count,names[D_MDC2],d);
950 results[D_MDC2][j]=((double)count)/d*lengths[j];
955 #ifndef OPENSSL_NO_MD4
958 for (j=0; j<SIZE_NUM; j++)
960 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
961 Time_F(START,usertime);
962 for (count=0,run=1; COND(c[D_MD4][j]); count++)
963 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4());
964 d=Time_F(STOP,usertime);
965 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
966 count,names[D_MD4],d);
967 results[D_MD4][j]=((double)count)/d*lengths[j];
972 #ifndef OPENSSL_NO_MD5
975 for (j=0; j<SIZE_NUM; j++)
977 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
978 Time_F(START,usertime);
979 for (count=0,run=1; COND(c[D_MD5][j]); count++)
980 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_md5());
981 d=Time_F(STOP,usertime);
982 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
983 count,names[D_MD5],d);
984 results[D_MD5][j]=((double)count)/d*lengths[j];
989 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
994 HMAC_CTX_init(&hctx);
995 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
998 for (j=0; j<SIZE_NUM; j++)
1000 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1001 Time_F(START,usertime);
1002 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1004 HMAC_Init(&hctx,NULL,0,NULL);
1005 HMAC_Update(&hctx,buf,lengths[j]);
1006 HMAC_Final(&hctx,&(hmac[0]),NULL);
1008 d=Time_F(STOP,usertime);
1009 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1010 count,names[D_HMAC],d);
1011 results[D_HMAC][j]=((double)count)/d*lengths[j];
1013 HMAC_CTX_cleanup(&hctx);
1016 #ifndef OPENSSL_NO_SHA
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 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1());
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];
1032 #ifndef OPENSSL_NO_RIPEMD
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 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160());
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];
1048 #ifndef OPENSSL_NO_RC4
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];
1065 #ifndef OPENSSL_NO_DES
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];
1099 #ifndef OPENSSL_NO_IDEA
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];
1117 #ifndef OPENSSL_NO_RC2
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];
1135 #ifndef OPENSSL_NO_RC5
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];
1153 #ifndef OPENSSL_NO_BF
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];
1171 #ifndef OPENSSL_NO_CAST
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,
1201 EVP_DecryptInit(&ctx,evp,key16,iv);
1203 EVP_EncryptInit(&ctx,evp,key16,iv);
1205 Time_F(START,usertime);
1207 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1208 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1210 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1211 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1213 EVP_DecryptFinal(&ctx,buf,&outl);
1215 EVP_EncryptFinal(&ctx,buf,&outl);
1216 d=Time_F(STOP,usertime);
1217 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1218 count,names[D_EVP],d);
1219 results[D_EVP][j]=((double)count)/d*lengths[j];
1223 RAND_pseudo_bytes(buf,36);
1224 #ifndef OPENSSL_NO_RSA
1225 for (j=0; j<RSA_NUM; j++)
1228 if (!rsa_doit[j]) continue;
1229 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1232 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1233 ERR_print_errors(bio_err);
1238 pkey_print_message("private","rsa",
1239 rsa_c[j][0],rsa_bits[j],
1241 /* RSA_blinding_on(rsa_key[j],NULL); */
1242 Time_F(START,usertime);
1243 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1245 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1246 &rsa_num, rsa_key[j]);
1250 "RSA sign failure\n");
1251 ERR_print_errors(bio_err);
1256 d=Time_F(STOP,usertime);
1258 "%ld %d bit private RSA's in %.2fs\n",
1259 count,rsa_bits[j],d);
1260 rsa_results[j][0]=d/(double)count;
1265 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1268 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1269 ERR_print_errors(bio_err);
1274 pkey_print_message("public","rsa",
1275 rsa_c[j][1],rsa_bits[j],
1277 Time_F(START,usertime);
1278 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1280 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1281 rsa_num, rsa_key[j]);
1285 "RSA verify failure\n");
1286 ERR_print_errors(bio_err);
1291 d=Time_F(STOP,usertime);
1293 "%ld %d bit public RSA's in %.2fs\n",
1294 count,rsa_bits[j],d);
1295 rsa_results[j][1]=d/(double)count;
1301 /* if longer than 10s, don't do any more */
1302 for (j++; j<RSA_NUM; j++)
1308 RAND_pseudo_bytes(buf,20);
1309 #ifndef OPENSSL_NO_DSA
1310 if (RAND_status() != 1)
1312 RAND_seed(rnd_seed, sizeof rnd_seed);
1315 for (j=0; j<DSA_NUM; j++)
1320 if (!dsa_doit[j]) continue;
1321 /* DSA_generate_key(dsa_key[j]); */
1322 /* DSA_sign_setup(dsa_key[j],NULL); */
1323 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1327 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1328 ERR_print_errors(bio_err);
1333 pkey_print_message("sign","dsa",
1334 dsa_c[j][0],dsa_bits[j],
1336 Time_F(START,usertime);
1337 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1339 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1344 "DSA sign failure\n");
1345 ERR_print_errors(bio_err);
1350 d=Time_F(STOP,usertime);
1351 BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1352 count,dsa_bits[j],d);
1353 dsa_results[j][0]=d/(double)count;
1357 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1361 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1362 ERR_print_errors(bio_err);
1367 pkey_print_message("verify","dsa",
1368 dsa_c[j][1],dsa_bits[j],
1370 Time_F(START,usertime);
1371 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1373 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1378 "DSA verify failure\n");
1379 ERR_print_errors(bio_err);
1384 d=Time_F(STOP,usertime);
1385 BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1386 count,dsa_bits[j],d);
1387 dsa_results[j][1]=d/(double)count;
1392 /* if longer than 10s, don't do any more */
1393 for (j++; j<DSA_NUM; j++)
1397 if (rnd_fake) RAND_cleanup();
1400 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1401 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1403 printf("%s ",BN_options());
1404 #ifndef OPENSSL_NO_MD2
1405 printf("%s ",MD2_options());
1407 #ifndef OPENSSL_NO_RC4
1408 printf("%s ",RC4_options());
1410 #ifndef OPENSSL_NO_DES
1411 printf("%s ",des_options());
1413 #ifndef OPENSSL_NO_IDEA
1414 printf("%s ",idea_options());
1416 #ifndef OPENSSL_NO_BF
1417 printf("%s ",BF_options());
1419 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1423 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1424 fprintf(stdout,"type ");
1425 for (j=0; j<SIZE_NUM; j++)
1426 fprintf(stdout,"%7d bytes",lengths[j]);
1427 fprintf(stdout,"\n");
1430 for (k=0; k<ALGOR_NUM; k++)
1432 if (!doit[k]) continue;
1433 fprintf(stdout,"%-13s",names[k]);
1434 for (j=0; j<SIZE_NUM; j++)
1436 if (results[k][j] > 10000)
1437 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1439 fprintf(stdout," %11.2f ",results[k][j]);
1441 fprintf(stdout,"\n");
1443 #ifndef OPENSSL_NO_RSA
1445 for (k=0; k<RSA_NUM; k++)
1447 if (!rsa_doit[k]) continue;
1450 printf("%18ssign verify sign/s verify/s\n"," ");
1453 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1454 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1455 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1456 fprintf(stdout,"\n");
1459 #ifndef OPENSSL_NO_DSA
1461 for (k=0; k<DSA_NUM; k++)
1463 if (!dsa_doit[k]) continue;
1465 printf("%18ssign verify sign/s verify/s\n"," ");
1468 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1469 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1470 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1471 fprintf(stdout,"\n");
1476 ERR_print_errors(bio_err);
1477 if (buf != NULL) OPENSSL_free(buf);
1478 if (buf2 != NULL) OPENSSL_free(buf2);
1479 #ifndef OPENSSL_NO_RSA
1480 for (i=0; i<RSA_NUM; i++)
1481 if (rsa_key[i] != NULL)
1482 RSA_free(rsa_key[i]);
1484 #ifndef OPENSSL_NO_DSA
1485 for (i=0; i<DSA_NUM; i++)
1486 if (dsa_key[i] != NULL)
1487 DSA_free(dsa_key[i]);
1493 static void print_message(const char *s, long num, int length)
1496 BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1497 (void)BIO_flush(bio_err);
1500 BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
1501 (void)BIO_flush(bio_err);
1508 static void pkey_print_message(char *str, char *str2, long num, int bits,
1512 BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1513 (void)BIO_flush(bio_err);
1516 BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1517 (void)BIO_flush(bio_err);