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;
435 memset(results, 0, sizeof(results));
436 #ifndef OPENSSL_NO_DSA
437 memset(dsa_key,0,sizeof(dsa_key));
441 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
442 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
444 #ifndef OPENSSL_NO_RSA
445 memset(rsa_key,0,sizeof(rsa_key));
446 for (i=0; i<RSA_NUM; i++)
450 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
452 BIO_printf(bio_err,"out of memory\n");
455 #ifndef OPENSSL_NO_DES
456 buf_as_des_cblock = (des_cblock *)buf;
458 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
460 BIO_printf(bio_err,"out of memory\n");
464 memset(c,0,sizeof(c));
465 memset(iv,0,sizeof(iv));
467 for (i=0; i<ALGOR_NUM; i++)
469 for (i=0; i<RSA_NUM; i++)
471 for (i=0; i<DSA_NUM; i++)
479 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
481 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
487 BIO_printf(bio_err,"no EVP given\n");
490 evp=EVP_get_cipherbyname(*argv);
493 BIO_printf(bio_err,"%s is an unknown cipher\n",*argv);
499 if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
505 BIO_printf(bio_err,"no engine given\n");
508 e = setup_engine(bio_err, *argv, 0);
509 /* j will be increased again further down. We just
510 don't want speed to confuse an engine with an
511 algorithm, especially when none is given (which
512 means all of them should be run) */
516 #ifndef OPENSSL_NO_MD2
517 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
520 #ifndef OPENSSL_NO_MDC2
521 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
524 #ifndef OPENSSL_NO_MD4
525 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
528 #ifndef OPENSSL_NO_MD5
529 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
532 #ifndef OPENSSL_NO_MD5
533 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
536 #ifndef OPENSSL_NO_SHA
537 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
539 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
542 #ifndef OPENSSL_NO_RIPEMD
543 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
545 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
547 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
550 #ifndef OPENSSL_NO_RC4
551 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
554 #ifndef OPENSSL_NO_DES
555 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
556 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
559 #ifndef OPENSSL_NO_RSA
560 #if 0 /* was: #ifdef RSAref */
561 if (strcmp(*argv,"rsaref") == 0)
563 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
569 if (strcmp(*argv,"openssl") == 0)
571 RSA_set_default_openssl_method(RSA_PKCS1_SSLeay());
576 #endif /* !OPENSSL_NO_RSA */
577 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
578 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
579 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
580 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
581 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
582 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
583 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
585 #ifndef OPENSSL_NO_RC2
586 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
587 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
590 #ifndef OPENSSL_NO_RC5
591 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
592 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
595 #ifndef OPENSSL_NO_IDEA
596 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
597 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
600 #ifndef OPENSSL_NO_BF
601 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
602 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
603 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
606 #ifndef OPENSSL_NO_CAST
607 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
608 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
609 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
612 #ifndef OPENSSL_NO_DES
613 if (strcmp(*argv,"des") == 0)
620 #ifndef OPENSSL_NO_RSA
621 if (strcmp(*argv,"rsa") == 0)
623 rsa_doit[R_RSA_512]=1;
624 rsa_doit[R_RSA_1024]=1;
625 rsa_doit[R_RSA_2048]=1;
626 rsa_doit[R_RSA_4096]=1;
630 #ifndef OPENSSL_NO_DSA
631 if (strcmp(*argv,"dsa") == 0)
633 dsa_doit[R_DSA_512]=1;
634 dsa_doit[R_DSA_1024]=1;
639 BIO_printf(bio_err,"Error: bad option or value\n");
640 BIO_printf(bio_err,"\n");
641 BIO_printf(bio_err,"Available values:\n");
642 #ifndef OPENSSL_NO_MD2
643 BIO_printf(bio_err,"md2 ");
645 #ifndef OPENSSL_NO_MDC2
646 BIO_printf(bio_err,"mdc2 ");
648 #ifndef OPENSSL_NO_MD4
649 BIO_printf(bio_err,"md4 ");
651 #ifndef OPENSSL_NO_MD5
652 BIO_printf(bio_err,"md5 ");
653 #ifndef OPENSSL_NO_HMAC
654 BIO_printf(bio_err,"hmac ");
657 #ifndef OPENSSL_NO_SHA1
658 BIO_printf(bio_err,"sha1 ");
660 #ifndef OPENSSL_NO_RIPEMD160
661 BIO_printf(bio_err,"rmd160");
663 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
664 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
665 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
666 BIO_printf(bio_err,"\n");
669 #ifndef OPENSSL_NO_IDEA
670 BIO_printf(bio_err,"idea-cbc ");
672 #ifndef OPENSSL_NO_RC2
673 BIO_printf(bio_err,"rc2-cbc ");
675 #ifndef OPENSSL_NO_RC5
676 BIO_printf(bio_err,"rc5-cbc ");
678 #ifndef OPENSSL_NO_BF
679 BIO_printf(bio_err,"bf-cbc");
681 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
682 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
683 BIO_printf(bio_err,"\n");
686 BIO_printf(bio_err,"des-cbc des-ede3 ");
687 #ifndef OPENSSL_NO_RC4
688 BIO_printf(bio_err,"rc4");
690 BIO_printf(bio_err,"\n");
692 #ifndef OPENSSL_NO_RSA
693 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
696 #ifndef OPENSSL_NO_DSA
697 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
700 #ifndef OPENSSL_NO_IDEA
701 BIO_printf(bio_err,"idea ");
703 #ifndef OPENSSL_NO_RC2
704 BIO_printf(bio_err,"rc2 ");
706 #ifndef OPENSSL_NO_DES
707 BIO_printf(bio_err,"des ");
709 #ifndef OPENSSL_NO_RSA
710 BIO_printf(bio_err,"rsa ");
712 #ifndef OPENSSL_NO_BF
713 BIO_printf(bio_err,"blowfish");
715 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
716 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
717 !defined(OPENSSL_NO_BF)
718 BIO_printf(bio_err,"\n");
721 BIO_printf(bio_err,"\n");
722 BIO_printf(bio_err,"Available options:\n");
724 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
726 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
736 for (i=0; i<ALGOR_NUM; i++)
741 for (i=0; i<RSA_NUM; i++)
743 for (i=0; i<DSA_NUM; i++)
746 for (i=0; i<ALGOR_NUM; i++)
747 if (doit[i]) pr_header++;
750 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
753 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
754 BIO_printf(bio_err,"program when this computer is idle.\n");
757 #ifndef OPENSSL_NO_RSA
758 for (i=0; i<RSA_NUM; i++)
760 const unsigned char *p;
763 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
764 if (rsa_key[i] == NULL)
766 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
772 BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
773 BN_print(bio_err,rsa_key[i]->e);
774 BIO_printf(bio_err,"\n");
780 #ifndef OPENSSL_NO_DSA
781 dsa_key[0]=get_dsa512();
782 dsa_key[1]=get_dsa1024();
783 dsa_key[2]=get_dsa2048();
786 #ifndef OPENSSL_NO_DES
787 des_set_key_unchecked(&key,sch);
788 des_set_key_unchecked(&key2,sch2);
789 des_set_key_unchecked(&key3,sch3);
791 #ifndef OPENSSL_NO_IDEA
792 idea_set_encrypt_key(key16,&idea_ks);
794 #ifndef OPENSSL_NO_RC4
795 RC4_set_key(&rc4_ks,16,key16);
797 #ifndef OPENSSL_NO_RC2
798 RC2_set_key(&rc2_ks,16,key16,128);
800 #ifndef OPENSSL_NO_RC5
801 RC5_32_set_key(&rc5_ks,16,key16,12);
803 #ifndef OPENSSL_NO_BF
804 BF_set_key(&bf_ks,16,key16);
806 #ifndef OPENSSL_NO_CAST
807 CAST_set_key(&cast_ks,16,key16);
809 #ifndef OPENSSL_NO_RSA
810 memset(rsa_c,0,sizeof(rsa_c));
813 #ifndef OPENSSL_NO_DES
814 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
819 Time_F(START,usertime);
820 for (i=count; i; i--)
821 des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
822 &(sch[0]),DES_ENCRYPT);
823 d=Time_F(STOP,usertime);
826 c[D_MD2][0]=count/10;
827 c[D_MDC2][0]=count/10;
832 c[D_RMD160][0]=count;
834 c[D_CBC_DES][0]=count;
835 c[D_EDE3_DES][0]=count/3;
836 c[D_CBC_IDEA][0]=count;
837 c[D_CBC_RC2][0]=count;
838 c[D_CBC_RC5][0]=count;
839 c[D_CBC_BF][0]=count;
840 c[D_CBC_CAST][0]=count;
842 for (i=1; i<SIZE_NUM; i++)
844 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
845 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
846 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
847 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
848 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
849 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
850 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
852 for (i=1; i<SIZE_NUM; i++)
856 l0=(long)lengths[i-1];
858 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
859 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
860 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
861 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
862 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
863 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
864 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
865 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
867 #ifndef OPENSSL_NO_RSA
868 rsa_c[R_RSA_512][0]=count/2000;
869 rsa_c[R_RSA_512][1]=count/400;
870 for (i=1; i<RSA_NUM; i++)
872 rsa_c[i][0]=rsa_c[i-1][0]/8;
873 rsa_c[i][1]=rsa_c[i-1][1]/4;
874 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
878 if (rsa_c[i][0] == 0)
887 #ifndef OPENSSL_NO_DSA
888 dsa_c[R_DSA_512][0]=count/1000;
889 dsa_c[R_DSA_512][1]=count/1000/2;
890 for (i=1; i<DSA_NUM; i++)
892 dsa_c[i][0]=dsa_c[i-1][0]/4;
893 dsa_c[i][1]=dsa_c[i-1][1]/4;
894 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
907 #define COND(d) (count < (d))
910 /* not worth fixing */
911 # error "You cannot disable DES on systems without SIGALRM."
912 #endif /* OPENSSL_NO_DES */
914 #define COND(c) (run)
915 #define COUNT(d) (count)
916 signal(SIGALRM,sig_done);
919 #ifndef OPENSSL_NO_MD2
922 for (j=0; j<SIZE_NUM; j++)
924 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
925 Time_F(START,usertime);
926 for (count=0,run=1; COND(c[D_MD2][j]); count++)
927 MD2(buf,(unsigned long)lengths[j],&(md2[0]));
928 d=Time_F(STOP,usertime);
929 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
930 count,names[D_MD2],d);
931 results[D_MD2][j]=((double)count)/d*lengths[j];
935 #ifndef OPENSSL_NO_MDC2
938 for (j=0; j<SIZE_NUM; j++)
940 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
941 Time_F(START,usertime);
942 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
943 MDC2(buf,(unsigned long)lengths[j],&(mdc2[0]));
944 d=Time_F(STOP,usertime);
945 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
946 count,names[D_MDC2],d);
947 results[D_MDC2][j]=((double)count)/d*lengths[j];
952 #ifndef OPENSSL_NO_MD4
955 for (j=0; j<SIZE_NUM; j++)
957 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
958 Time_F(START,usertime);
959 for (count=0,run=1; COND(c[D_MD4][j]); count++)
960 MD4(&(buf[0]),(unsigned long)lengths[j],&(md4[0]));
961 d=Time_F(STOP,usertime);
962 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
963 count,names[D_MD4],d);
964 results[D_MD4][j]=((double)count)/d*lengths[j];
969 #ifndef OPENSSL_NO_MD5
972 for (j=0; j<SIZE_NUM; j++)
974 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
975 Time_F(START,usertime);
976 for (count=0,run=1; COND(c[D_MD5][j]); count++)
977 MD5(&(buf[0]),(unsigned long)lengths[j],&(md5[0]));
978 d=Time_F(STOP,usertime);
979 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
980 count,names[D_MD5],d);
981 results[D_MD5][j]=((double)count)/d*lengths[j];
986 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
990 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
993 for (j=0; j<SIZE_NUM; j++)
995 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
996 Time_F(START,usertime);
997 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
999 HMAC_Init(&hctx,NULL,0,NULL);
1000 HMAC_Update(&hctx,buf,lengths[j]);
1001 HMAC_Final(&hctx,&(hmac[0]),NULL);
1003 d=Time_F(STOP,usertime);
1004 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1005 count,names[D_HMAC],d);
1006 results[D_HMAC][j]=((double)count)/d*lengths[j];
1010 #ifndef OPENSSL_NO_SHA
1013 for (j=0; j<SIZE_NUM; j++)
1015 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1016 Time_F(START,usertime);
1017 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1018 SHA1(buf,(unsigned long)lengths[j],&(sha[0]));
1019 d=Time_F(STOP,usertime);
1020 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1021 count,names[D_SHA1],d);
1022 results[D_SHA1][j]=((double)count)/d*lengths[j];
1026 #ifndef OPENSSL_NO_RIPEMD
1029 for (j=0; j<SIZE_NUM; j++)
1031 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1032 Time_F(START,usertime);
1033 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1034 RIPEMD160(buf,(unsigned long)lengths[j],&(rmd160[0]));
1035 d=Time_F(STOP,usertime);
1036 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1037 count,names[D_RMD160],d);
1038 results[D_RMD160][j]=((double)count)/d*lengths[j];
1042 #ifndef OPENSSL_NO_RC4
1045 for (j=0; j<SIZE_NUM; j++)
1047 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1048 Time_F(START,usertime);
1049 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1050 RC4(&rc4_ks,(unsigned int)lengths[j],
1052 d=Time_F(STOP,usertime);
1053 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1054 count,names[D_RC4],d);
1055 results[D_RC4][j]=((double)count)/d*lengths[j];
1059 #ifndef OPENSSL_NO_DES
1060 if (doit[D_CBC_DES])
1062 for (j=0; j<SIZE_NUM; j++)
1064 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1065 Time_F(START,usertime);
1066 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1067 des_ncbc_encrypt(buf,buf,lengths[j],sch,
1069 d=Time_F(STOP,usertime);
1070 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1071 count,names[D_CBC_DES],d);
1072 results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1076 if (doit[D_EDE3_DES])
1078 for (j=0; j<SIZE_NUM; j++)
1080 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1081 Time_F(START,usertime);
1082 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1083 des_ede3_cbc_encrypt(buf,buf,lengths[j],
1086 d=Time_F(STOP,usertime);
1087 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1088 count,names[D_EDE3_DES],d);
1089 results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1093 #ifndef OPENSSL_NO_IDEA
1094 if (doit[D_CBC_IDEA])
1096 for (j=0; j<SIZE_NUM; j++)
1098 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1099 Time_F(START,usertime);
1100 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1101 idea_cbc_encrypt(buf,buf,
1102 (unsigned long)lengths[j],&idea_ks,
1104 d=Time_F(STOP,usertime);
1105 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1106 count,names[D_CBC_IDEA],d);
1107 results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1111 #ifndef OPENSSL_NO_RC2
1112 if (doit[D_CBC_RC2])
1114 for (j=0; j<SIZE_NUM; j++)
1116 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1117 Time_F(START,usertime);
1118 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1119 RC2_cbc_encrypt(buf,buf,
1120 (unsigned long)lengths[j],&rc2_ks,
1122 d=Time_F(STOP,usertime);
1123 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1124 count,names[D_CBC_RC2],d);
1125 results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1129 #ifndef OPENSSL_NO_RC5
1130 if (doit[D_CBC_RC5])
1132 for (j=0; j<SIZE_NUM; j++)
1134 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1135 Time_F(START,usertime);
1136 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1137 RC5_32_cbc_encrypt(buf,buf,
1138 (unsigned long)lengths[j],&rc5_ks,
1140 d=Time_F(STOP,usertime);
1141 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1142 count,names[D_CBC_RC5],d);
1143 results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1147 #ifndef OPENSSL_NO_BF
1150 for (j=0; j<SIZE_NUM; j++)
1152 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1153 Time_F(START,usertime);
1154 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1155 BF_cbc_encrypt(buf,buf,
1156 (unsigned long)lengths[j],&bf_ks,
1158 d=Time_F(STOP,usertime);
1159 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1160 count,names[D_CBC_BF],d);
1161 results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1165 #ifndef OPENSSL_NO_CAST
1166 if (doit[D_CBC_CAST])
1168 for (j=0; j<SIZE_NUM; j++)
1170 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1171 Time_F(START,usertime);
1172 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1173 CAST_cbc_encrypt(buf,buf,
1174 (unsigned long)lengths[j],&cast_ks,
1176 d=Time_F(STOP,usertime);
1177 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1178 count,names[D_CBC_CAST],d);
1179 results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1186 for (j=0; j<SIZE_NUM; j++)
1191 names[D_EVP]=OBJ_nid2ln(evp->nid);
1192 print_message(names[D_EVP],save_count,
1194 EVP_EncryptInit(&ctx,evp,key16,iv);
1195 Time_F(START,usertime);
1196 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1197 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1198 EVP_EncryptFinal(&ctx,buf,&outl);
1199 d=Time_F(STOP,usertime);
1200 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1201 count,names[D_EVP],d);
1202 results[D_EVP][j]=((double)count)/d*lengths[j];
1206 RAND_pseudo_bytes(buf,36);
1207 #ifndef OPENSSL_NO_RSA
1208 for (j=0; j<RSA_NUM; j++)
1211 if (!rsa_doit[j]) continue;
1212 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1215 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1216 ERR_print_errors(bio_err);
1221 pkey_print_message("private","rsa",
1222 rsa_c[j][0],rsa_bits[j],
1224 /* RSA_blinding_on(rsa_key[j],NULL); */
1225 Time_F(START,usertime);
1226 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1228 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1229 &rsa_num, rsa_key[j]);
1233 "RSA sign failure\n");
1234 ERR_print_errors(bio_err);
1239 d=Time_F(STOP,usertime);
1241 "%ld %d bit private RSA's in %.2fs\n",
1242 count,rsa_bits[j],d);
1243 rsa_results[j][0]=d/(double)count;
1248 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1251 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1252 ERR_print_errors(bio_err);
1257 pkey_print_message("public","rsa",
1258 rsa_c[j][1],rsa_bits[j],
1260 Time_F(START,usertime);
1261 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1263 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1264 rsa_num, rsa_key[j]);
1268 "RSA verify failure\n");
1269 ERR_print_errors(bio_err);
1274 d=Time_F(STOP,usertime);
1276 "%ld %d bit public RSA's in %.2fs\n",
1277 count,rsa_bits[j],d);
1278 rsa_results[j][1]=d/(double)count;
1284 /* if longer than 10s, don't do any more */
1285 for (j++; j<RSA_NUM; j++)
1291 RAND_pseudo_bytes(buf,20);
1292 #ifndef OPENSSL_NO_DSA
1293 if (RAND_status() != 1)
1295 RAND_seed(rnd_seed, sizeof rnd_seed);
1298 for (j=0; j<DSA_NUM; j++)
1303 if (!dsa_doit[j]) continue;
1304 DSA_generate_key(dsa_key[j]);
1305 /* DSA_sign_setup(dsa_key[j],NULL); */
1306 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1310 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1311 ERR_print_errors(bio_err);
1316 pkey_print_message("sign","dsa",
1317 dsa_c[j][0],dsa_bits[j],
1319 Time_F(START,usertime);
1320 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1322 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1327 "DSA sign failure\n");
1328 ERR_print_errors(bio_err);
1333 d=Time_F(STOP,usertime);
1334 BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1335 count,dsa_bits[j],d);
1336 dsa_results[j][0]=d/(double)count;
1340 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1344 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1345 ERR_print_errors(bio_err);
1350 pkey_print_message("verify","dsa",
1351 dsa_c[j][1],dsa_bits[j],
1353 Time_F(START,usertime);
1354 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1356 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1361 "DSA verify failure\n");
1362 ERR_print_errors(bio_err);
1367 d=Time_F(STOP,usertime);
1368 BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1369 count,dsa_bits[j],d);
1370 dsa_results[j][1]=d/(double)count;
1375 /* if longer than 10s, don't do any more */
1376 for (j++; j<DSA_NUM; j++)
1380 if (rnd_fake) RAND_cleanup();
1383 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1384 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1386 printf("%s ",BN_options());
1387 #ifndef OPENSSL_NO_MD2
1388 printf("%s ",MD2_options());
1390 #ifndef OPENSSL_NO_RC4
1391 printf("%s ",RC4_options());
1393 #ifndef OPENSSL_NO_DES
1394 printf("%s ",des_options());
1396 #ifndef OPENSSL_NO_IDEA
1397 printf("%s ",idea_options());
1399 #ifndef OPENSSL_NO_BF
1400 printf("%s ",BF_options());
1402 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1406 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1407 fprintf(stdout,"type ");
1408 for (j=0; j<SIZE_NUM; j++)
1409 fprintf(stdout,"%7d bytes",lengths[j]);
1410 fprintf(stdout,"\n");
1413 for (k=0; k<ALGOR_NUM; k++)
1415 if (!doit[k]) continue;
1416 fprintf(stdout,"%-13s",names[k]);
1417 for (j=0; j<SIZE_NUM; j++)
1419 if (results[k][j] > 10000)
1420 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1422 fprintf(stdout," %11.2f ",results[k][j]);
1424 fprintf(stdout,"\n");
1426 #ifndef OPENSSL_NO_RSA
1428 for (k=0; k<RSA_NUM; k++)
1430 if (!rsa_doit[k]) continue;
1433 printf("%18ssign verify sign/s verify/s\n"," ");
1436 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1437 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1438 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1439 fprintf(stdout,"\n");
1442 #ifndef OPENSSL_NO_DSA
1444 for (k=0; k<DSA_NUM; k++)
1446 if (!dsa_doit[k]) continue;
1448 printf("%18ssign verify sign/s verify/s\n"," ");
1451 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1452 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1453 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1454 fprintf(stdout,"\n");
1459 ERR_print_errors(bio_err);
1460 if (buf != NULL) OPENSSL_free(buf);
1461 if (buf2 != NULL) OPENSSL_free(buf2);
1462 #ifndef OPENSSL_NO_RSA
1463 for (i=0; i<RSA_NUM; i++)
1464 if (rsa_key[i] != NULL)
1465 RSA_free(rsa_key[i]);
1467 #ifndef OPENSSL_NO_DSA
1468 for (i=0; i<DSA_NUM; i++)
1469 if (dsa_key[i] != NULL)
1470 DSA_free(dsa_key[i]);
1475 static void print_message(const char *s, long num, int length)
1478 BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1479 (void)BIO_flush(bio_err);
1482 BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
1483 (void)BIO_flush(bio_err);
1490 static void pkey_print_message(char *str, char *str2, long num, int bits,
1494 BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1495 (void)BIO_flush(bio_err);
1498 BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1499 (void)BIO_flush(bio_err);