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 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2());
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 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2());
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 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4());
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 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_md5());
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];
1008 HMAC_cleanup(&hctx);
1011 #ifndef OPENSSL_NO_SHA
1014 for (j=0; j<SIZE_NUM; j++)
1016 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1017 Time_F(START,usertime);
1018 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1019 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1());
1020 d=Time_F(STOP,usertime);
1021 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1022 count,names[D_SHA1],d);
1023 results[D_SHA1][j]=((double)count)/d*lengths[j];
1027 #ifndef OPENSSL_NO_RIPEMD
1030 for (j=0; j<SIZE_NUM; j++)
1032 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1033 Time_F(START,usertime);
1034 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1035 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160());
1036 d=Time_F(STOP,usertime);
1037 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1038 count,names[D_RMD160],d);
1039 results[D_RMD160][j]=((double)count)/d*lengths[j];
1043 #ifndef OPENSSL_NO_RC4
1046 for (j=0; j<SIZE_NUM; j++)
1048 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1049 Time_F(START,usertime);
1050 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1051 RC4(&rc4_ks,(unsigned int)lengths[j],
1053 d=Time_F(STOP,usertime);
1054 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1055 count,names[D_RC4],d);
1056 results[D_RC4][j]=((double)count)/d*lengths[j];
1060 #ifndef OPENSSL_NO_DES
1061 if (doit[D_CBC_DES])
1063 for (j=0; j<SIZE_NUM; j++)
1065 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1066 Time_F(START,usertime);
1067 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1068 des_ncbc_encrypt(buf,buf,lengths[j],sch,
1070 d=Time_F(STOP,usertime);
1071 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1072 count,names[D_CBC_DES],d);
1073 results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1077 if (doit[D_EDE3_DES])
1079 for (j=0; j<SIZE_NUM; j++)
1081 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1082 Time_F(START,usertime);
1083 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1084 des_ede3_cbc_encrypt(buf,buf,lengths[j],
1087 d=Time_F(STOP,usertime);
1088 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1089 count,names[D_EDE3_DES],d);
1090 results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1094 #ifndef OPENSSL_NO_IDEA
1095 if (doit[D_CBC_IDEA])
1097 for (j=0; j<SIZE_NUM; j++)
1099 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1100 Time_F(START,usertime);
1101 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1102 idea_cbc_encrypt(buf,buf,
1103 (unsigned long)lengths[j],&idea_ks,
1105 d=Time_F(STOP,usertime);
1106 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1107 count,names[D_CBC_IDEA],d);
1108 results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1112 #ifndef OPENSSL_NO_RC2
1113 if (doit[D_CBC_RC2])
1115 for (j=0; j<SIZE_NUM; j++)
1117 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1118 Time_F(START,usertime);
1119 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1120 RC2_cbc_encrypt(buf,buf,
1121 (unsigned long)lengths[j],&rc2_ks,
1123 d=Time_F(STOP,usertime);
1124 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1125 count,names[D_CBC_RC2],d);
1126 results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1130 #ifndef OPENSSL_NO_RC5
1131 if (doit[D_CBC_RC5])
1133 for (j=0; j<SIZE_NUM; j++)
1135 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1136 Time_F(START,usertime);
1137 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1138 RC5_32_cbc_encrypt(buf,buf,
1139 (unsigned long)lengths[j],&rc5_ks,
1141 d=Time_F(STOP,usertime);
1142 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1143 count,names[D_CBC_RC5],d);
1144 results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1148 #ifndef OPENSSL_NO_BF
1151 for (j=0; j<SIZE_NUM; j++)
1153 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1154 Time_F(START,usertime);
1155 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1156 BF_cbc_encrypt(buf,buf,
1157 (unsigned long)lengths[j],&bf_ks,
1159 d=Time_F(STOP,usertime);
1160 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1161 count,names[D_CBC_BF],d);
1162 results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1166 #ifndef OPENSSL_NO_CAST
1167 if (doit[D_CBC_CAST])
1169 for (j=0; j<SIZE_NUM; j++)
1171 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1172 Time_F(START,usertime);
1173 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1174 CAST_cbc_encrypt(buf,buf,
1175 (unsigned long)lengths[j],&cast_ks,
1177 d=Time_F(STOP,usertime);
1178 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1179 count,names[D_CBC_CAST],d);
1180 results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1187 for (j=0; j<SIZE_NUM; j++)
1192 names[D_EVP]=OBJ_nid2ln(evp->nid);
1193 print_message(names[D_EVP],save_count,
1195 EVP_EncryptInit(&ctx,evp,key16,iv);
1196 Time_F(START,usertime);
1197 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1198 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1199 EVP_EncryptFinal(&ctx,buf,&outl);
1200 d=Time_F(STOP,usertime);
1201 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1202 count,names[D_EVP],d);
1203 results[D_EVP][j]=((double)count)/d*lengths[j];
1207 RAND_pseudo_bytes(buf,36);
1208 #ifndef OPENSSL_NO_RSA
1209 for (j=0; j<RSA_NUM; j++)
1212 if (!rsa_doit[j]) continue;
1213 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1216 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1217 ERR_print_errors(bio_err);
1222 pkey_print_message("private","rsa",
1223 rsa_c[j][0],rsa_bits[j],
1225 /* RSA_blinding_on(rsa_key[j],NULL); */
1226 Time_F(START,usertime);
1227 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1229 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1230 &rsa_num, rsa_key[j]);
1234 "RSA sign failure\n");
1235 ERR_print_errors(bio_err);
1240 d=Time_F(STOP,usertime);
1242 "%ld %d bit private RSA's in %.2fs\n",
1243 count,rsa_bits[j],d);
1244 rsa_results[j][0]=d/(double)count;
1249 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1252 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1253 ERR_print_errors(bio_err);
1258 pkey_print_message("public","rsa",
1259 rsa_c[j][1],rsa_bits[j],
1261 Time_F(START,usertime);
1262 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1264 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1265 rsa_num, rsa_key[j]);
1269 "RSA verify failure\n");
1270 ERR_print_errors(bio_err);
1275 d=Time_F(STOP,usertime);
1277 "%ld %d bit public RSA's in %.2fs\n",
1278 count,rsa_bits[j],d);
1279 rsa_results[j][1]=d/(double)count;
1285 /* if longer than 10s, don't do any more */
1286 for (j++; j<RSA_NUM; j++)
1292 RAND_pseudo_bytes(buf,20);
1293 #ifndef OPENSSL_NO_DSA
1294 if (RAND_status() != 1)
1296 RAND_seed(rnd_seed, sizeof rnd_seed);
1299 for (j=0; j<DSA_NUM; j++)
1304 if (!dsa_doit[j]) continue;
1305 DSA_generate_key(dsa_key[j]);
1306 /* DSA_sign_setup(dsa_key[j],NULL); */
1307 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1311 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1312 ERR_print_errors(bio_err);
1317 pkey_print_message("sign","dsa",
1318 dsa_c[j][0],dsa_bits[j],
1320 Time_F(START,usertime);
1321 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1323 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1328 "DSA sign failure\n");
1329 ERR_print_errors(bio_err);
1334 d=Time_F(STOP,usertime);
1335 BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1336 count,dsa_bits[j],d);
1337 dsa_results[j][0]=d/(double)count;
1341 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1345 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1346 ERR_print_errors(bio_err);
1351 pkey_print_message("verify","dsa",
1352 dsa_c[j][1],dsa_bits[j],
1354 Time_F(START,usertime);
1355 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1357 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1362 "DSA verify failure\n");
1363 ERR_print_errors(bio_err);
1368 d=Time_F(STOP,usertime);
1369 BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1370 count,dsa_bits[j],d);
1371 dsa_results[j][1]=d/(double)count;
1376 /* if longer than 10s, don't do any more */
1377 for (j++; j<DSA_NUM; j++)
1381 if (rnd_fake) RAND_cleanup();
1384 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1385 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1387 printf("%s ",BN_options());
1388 #ifndef OPENSSL_NO_MD2
1389 printf("%s ",MD2_options());
1391 #ifndef OPENSSL_NO_RC4
1392 printf("%s ",RC4_options());
1394 #ifndef OPENSSL_NO_DES
1395 printf("%s ",des_options());
1397 #ifndef OPENSSL_NO_IDEA
1398 printf("%s ",idea_options());
1400 #ifndef OPENSSL_NO_BF
1401 printf("%s ",BF_options());
1403 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1407 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1408 fprintf(stdout,"type ");
1409 for (j=0; j<SIZE_NUM; j++)
1410 fprintf(stdout,"%7d bytes",lengths[j]);
1411 fprintf(stdout,"\n");
1414 for (k=0; k<ALGOR_NUM; k++)
1416 if (!doit[k]) continue;
1417 fprintf(stdout,"%-13s",names[k]);
1418 for (j=0; j<SIZE_NUM; j++)
1420 if (results[k][j] > 10000)
1421 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1423 fprintf(stdout," %11.2f ",results[k][j]);
1425 fprintf(stdout,"\n");
1427 #ifndef OPENSSL_NO_RSA
1429 for (k=0; k<RSA_NUM; k++)
1431 if (!rsa_doit[k]) continue;
1434 printf("%18ssign verify sign/s verify/s\n"," ");
1437 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1438 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1439 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1440 fprintf(stdout,"\n");
1443 #ifndef OPENSSL_NO_DSA
1445 for (k=0; k<DSA_NUM; k++)
1447 if (!dsa_doit[k]) continue;
1449 printf("%18ssign verify sign/s verify/s\n"," ");
1452 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1453 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1454 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1455 fprintf(stdout,"\n");
1460 ERR_print_errors(bio_err);
1461 if (buf != NULL) OPENSSL_free(buf);
1462 if (buf2 != NULL) OPENSSL_free(buf2);
1463 #ifndef OPENSSL_NO_RSA
1464 for (i=0; i<RSA_NUM; i++)
1465 if (rsa_key[i] != NULL)
1466 RSA_free(rsa_key[i]);
1468 #ifndef OPENSSL_NO_DSA
1469 for (i=0; i<DSA_NUM; i++)
1470 if (dsa_key[i] != NULL)
1471 DSA_free(dsa_key[i]);
1476 static void print_message(const char *s, long num, int length)
1479 BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1480 (void)BIO_flush(bio_err);
1483 BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
1484 (void)BIO_flush(bio_err);
1491 static void pkey_print_message(char *str, char *str2, long num, int bits,
1495 BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1496 (void)BIO_flush(bio_err);
1499 BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1500 (void)BIO_flush(bio_err);