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/evp.h>
85 #include <openssl/objects.h>
87 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
89 #elif !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
92 #if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_MPE) && !defined(__NetBSD__) /* FIXME */
100 # include <sys/types.h>
101 # include <sys/times.h>
104 # include <sys/time.h>
105 # include <sys/resource.h>
108 /* Depending on the VMS version, the tms structure is perhaps defined.
109 The __TMS macro will show if it was. If it wasn't defined, we should
110 undefine TIMES, since that tells the rest of the program how things
111 should be handled. -- Richard Levitte */
112 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
117 #include <sys/timeb.h>
120 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD)
121 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
124 #if defined(sun) || defined(__ultrix)
125 #define _POSIX_SOURCE
127 #include <sys/param.h>
130 #ifndef OPENSSL_NO_DES
131 #include <openssl/des.h>
133 #ifndef OPENSSL_NO_MD2
134 #include <openssl/md2.h>
136 #ifndef OPENSSL_NO_MDC2
137 #include <openssl/mdc2.h>
139 #ifndef OPENSSL_NO_MD4
140 #include <openssl/md4.h>
142 #ifndef OPENSSL_NO_MD5
143 #include <openssl/md5.h>
145 #ifndef OPENSSL_NO_HMAC
146 #include <openssl/hmac.h>
148 #include <openssl/evp.h>
149 #ifndef OPENSSL_NO_SHA
150 #include <openssl/sha.h>
152 #ifndef OPENSSL_NO_RIPEMD
153 #include <openssl/ripemd.h>
155 #ifndef OPENSSL_NO_RC4
156 #include <openssl/rc4.h>
158 #ifndef OPENSSL_NO_RC5
159 #include <openssl/rc5.h>
161 #ifndef OPENSSL_NO_RC2
162 #include <openssl/rc2.h>
164 #ifndef OPENSSL_NO_IDEA
165 #include <openssl/idea.h>
167 #ifndef OPENSSL_NO_BF
168 #include <openssl/blowfish.h>
170 #ifndef OPENSSL_NO_CAST
171 #include <openssl/cast.h>
173 #ifndef OPENSSL_NO_RSA
174 #include <openssl/rsa.h>
175 #include "./testrsa.h"
177 #include <openssl/x509.h>
178 #ifndef OPENSSL_NO_DSA
179 #include "./testdsa.h"
182 /* The following if from times(3) man page. It may need to be changed */
185 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
187 # else /* _BSD_CLK_TCK_ */
188 # define HZ ((double)_BSD_CLK_TCK_)
191 # define HZ ((double)CLK_TCK)
196 #define BUFSIZE ((long)1024*8+1)
199 static double Time_F(int s, int usertime);
200 static void print_message(const char *s,long num,int length);
201 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
203 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
204 #define SIGRETTYPE void
206 #define SIGRETTYPE int
209 static SIGRETTYPE sig_done(int sig);
210 static SIGRETTYPE sig_done(int sig)
212 signal(SIGALRM,sig_done);
223 static double Time_F(int s, int usertime)
230 static struct rusage tstart,tend;
234 getrusage(RUSAGE_SELF,&tstart);
241 getrusage(RUSAGE_SELF,&tend);
242 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
243 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
244 +((double)i)/1000000.0;
245 return((ret < 0.001)?0.001:ret);
250 static struct timeval tstart,tend;
255 gettimeofday(&tstart,NULL);
260 gettimeofday(&tend,NULL);
261 i=(long)tend.tv_usec-(long)tstart.tv_usec;
262 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
263 return((ret < 0.001)?0.001:ret);
266 #else /* ndef USE_TOD */
271 static struct tms tstart,tend;
281 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
282 return((ret < 1e-3)?1e-3:ret);
285 # endif /* times() */
286 # if defined(TIMES) && defined(TIMEB)
291 static struct timeb tstart,tend;
302 i=(long)tend.millitm-(long)tstart.millitm;
303 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
304 return((ret < 0.001)?0.001:ret);
311 int MAIN(int, char **);
313 int MAIN(int argc, char **argv)
316 unsigned char *buf=NULL,*buf2=NULL;
322 long count,rsa_count,save_count=0;
324 #ifndef OPENSSL_NO_RSA
327 #ifndef OPENSSL_NO_MD2
328 unsigned char md2[MD2_DIGEST_LENGTH];
330 #ifndef OPENSSL_NO_MDC2
331 unsigned char mdc2[MDC2_DIGEST_LENGTH];
333 #ifndef OPENSSL_NO_MD4
334 unsigned char md4[MD4_DIGEST_LENGTH];
336 #ifndef OPENSSL_NO_MD5
337 unsigned char md5[MD5_DIGEST_LENGTH];
338 unsigned char hmac[MD5_DIGEST_LENGTH];
340 #ifndef OPENSSL_NO_SHA
341 unsigned char sha[SHA_DIGEST_LENGTH];
343 #ifndef OPENSSL_NO_RIPEMD
344 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
346 #ifndef OPENSSL_NO_RC4
349 #ifndef OPENSSL_NO_RC5
352 #ifndef OPENSSL_NO_RC2
355 #ifndef OPENSSL_NO_IDEA
356 IDEA_KEY_SCHEDULE idea_ks;
358 #ifndef OPENSSL_NO_BF
361 #ifndef OPENSSL_NO_CAST
364 static unsigned char key16[16]=
365 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
366 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
368 #ifndef OPENSSL_NO_DES
369 des_cblock *buf_as_des_cblock = NULL;
370 static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
371 static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
372 static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
373 des_key_schedule sch,sch2,sch3;
385 #define D_CBC_IDEA 10
389 #define D_CBC_CAST 14
391 double d,results[ALGOR_NUM][SIZE_NUM];
392 static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
393 long c[ALGOR_NUM][SIZE_NUM];
394 static const char *names[ALGOR_NUM]={
395 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
396 "des cbc","des ede3","idea cbc",
397 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
405 #ifndef OPENSSL_NO_RSA
406 RSA *rsa_key[RSA_NUM];
407 long rsa_c[RSA_NUM][2];
408 double rsa_results[RSA_NUM][2];
409 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
410 static unsigned char *rsa_data[RSA_NUM]=
411 {test512,test1024,test2048,test4096};
412 static int rsa_data_length[RSA_NUM]={
413 sizeof(test512),sizeof(test1024),
414 sizeof(test2048),sizeof(test4096)};
416 #ifndef OPENSSL_NO_DSA
417 DSA *dsa_key[DSA_NUM];
418 long dsa_c[DSA_NUM][2];
419 double dsa_results[DSA_NUM][2];
420 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
422 int rsa_doit[RSA_NUM];
423 int dsa_doit[DSA_NUM];
427 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);
498 else if(argc > 0 && !strcmp(*argv,"-decrypt"))
501 if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
507 BIO_printf(bio_err,"no engine given\n");
510 e = setup_engine(bio_err, *argv, 0);
511 /* j will be increased again further down. We just
512 don't want speed to confuse an engine with an
513 algorithm, especially when none is given (which
514 means all of them should be run) */
518 #ifndef OPENSSL_NO_MD2
519 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
522 #ifndef OPENSSL_NO_MDC2
523 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
526 #ifndef OPENSSL_NO_MD4
527 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
530 #ifndef OPENSSL_NO_MD5
531 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
534 #ifndef OPENSSL_NO_MD5
535 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
538 #ifndef OPENSSL_NO_SHA
539 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
541 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
544 #ifndef OPENSSL_NO_RIPEMD
545 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
547 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
549 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
552 #ifndef OPENSSL_NO_RC4
553 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
556 #ifndef OPENSSL_NO_DES
557 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
558 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
561 #ifndef OPENSSL_NO_RSA
562 #if 0 /* was: #ifdef RSAref */
563 if (strcmp(*argv,"rsaref") == 0)
565 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
571 if (strcmp(*argv,"openssl") == 0)
573 RSA_set_default_method(RSA_PKCS1_SSLeay());
578 #endif /* !OPENSSL_NO_RSA */
579 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
580 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
581 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
582 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
583 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
584 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
585 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
587 #ifndef OPENSSL_NO_RC2
588 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
589 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
592 #ifndef OPENSSL_NO_RC5
593 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
594 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
597 #ifndef OPENSSL_NO_IDEA
598 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
599 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
602 #ifndef OPENSSL_NO_BF
603 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
604 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
605 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
608 #ifndef OPENSSL_NO_CAST
609 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
610 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
611 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
614 #ifndef OPENSSL_NO_DES
615 if (strcmp(*argv,"des") == 0)
622 #ifndef OPENSSL_NO_RSA
623 if (strcmp(*argv,"rsa") == 0)
625 rsa_doit[R_RSA_512]=1;
626 rsa_doit[R_RSA_1024]=1;
627 rsa_doit[R_RSA_2048]=1;
628 rsa_doit[R_RSA_4096]=1;
632 #ifndef OPENSSL_NO_DSA
633 if (strcmp(*argv,"dsa") == 0)
635 dsa_doit[R_DSA_512]=1;
636 dsa_doit[R_DSA_1024]=1;
641 BIO_printf(bio_err,"Error: bad option or value\n");
642 BIO_printf(bio_err,"\n");
643 BIO_printf(bio_err,"Available values:\n");
644 #ifndef OPENSSL_NO_MD2
645 BIO_printf(bio_err,"md2 ");
647 #ifndef OPENSSL_NO_MDC2
648 BIO_printf(bio_err,"mdc2 ");
650 #ifndef OPENSSL_NO_MD4
651 BIO_printf(bio_err,"md4 ");
653 #ifndef OPENSSL_NO_MD5
654 BIO_printf(bio_err,"md5 ");
655 #ifndef OPENSSL_NO_HMAC
656 BIO_printf(bio_err,"hmac ");
659 #ifndef OPENSSL_NO_SHA1
660 BIO_printf(bio_err,"sha1 ");
662 #ifndef OPENSSL_NO_RIPEMD160
663 BIO_printf(bio_err,"rmd160");
665 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
666 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
667 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
668 BIO_printf(bio_err,"\n");
671 #ifndef OPENSSL_NO_IDEA
672 BIO_printf(bio_err,"idea-cbc ");
674 #ifndef OPENSSL_NO_RC2
675 BIO_printf(bio_err,"rc2-cbc ");
677 #ifndef OPENSSL_NO_RC5
678 BIO_printf(bio_err,"rc5-cbc ");
680 #ifndef OPENSSL_NO_BF
681 BIO_printf(bio_err,"bf-cbc");
683 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
684 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
685 BIO_printf(bio_err,"\n");
688 BIO_printf(bio_err,"des-cbc des-ede3 ");
689 #ifndef OPENSSL_NO_RC4
690 BIO_printf(bio_err,"rc4");
692 BIO_printf(bio_err,"\n");
694 #ifndef OPENSSL_NO_RSA
695 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
698 #ifndef OPENSSL_NO_DSA
699 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
702 #ifndef OPENSSL_NO_IDEA
703 BIO_printf(bio_err,"idea ");
705 #ifndef OPENSSL_NO_RC2
706 BIO_printf(bio_err,"rc2 ");
708 #ifndef OPENSSL_NO_DES
709 BIO_printf(bio_err,"des ");
711 #ifndef OPENSSL_NO_RSA
712 BIO_printf(bio_err,"rsa ");
714 #ifndef OPENSSL_NO_BF
715 BIO_printf(bio_err,"blowfish");
717 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
718 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
719 !defined(OPENSSL_NO_BF)
720 BIO_printf(bio_err,"\n");
723 BIO_printf(bio_err,"\n");
724 BIO_printf(bio_err,"Available options:\n");
726 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
728 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
738 for (i=0; i<ALGOR_NUM; i++)
743 for (i=0; i<RSA_NUM; i++)
745 for (i=0; i<DSA_NUM; i++)
748 for (i=0; i<ALGOR_NUM; i++)
749 if (doit[i]) pr_header++;
752 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
755 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
756 BIO_printf(bio_err,"program when this computer is idle.\n");
759 #ifndef OPENSSL_NO_RSA
760 for (i=0; i<RSA_NUM; i++)
762 const unsigned char *p;
765 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
766 if (rsa_key[i] == NULL)
768 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
774 BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
775 BN_print(bio_err,rsa_key[i]->e);
776 BIO_printf(bio_err,"\n");
782 #ifndef OPENSSL_NO_DSA
783 dsa_key[0]=get_dsa512();
784 dsa_key[1]=get_dsa1024();
785 dsa_key[2]=get_dsa2048();
788 #ifndef OPENSSL_NO_DES
789 des_set_key_unchecked(&key,&sch);
790 des_set_key_unchecked(&key2,&sch2);
791 des_set_key_unchecked(&key3,&sch3);
793 #ifndef OPENSSL_NO_IDEA
794 idea_set_encrypt_key(key16,&idea_ks);
796 #ifndef OPENSSL_NO_RC4
797 RC4_set_key(&rc4_ks,16,key16);
799 #ifndef OPENSSL_NO_RC2
800 RC2_set_key(&rc2_ks,16,key16,128);
802 #ifndef OPENSSL_NO_RC5
803 RC5_32_set_key(&rc5_ks,16,key16,12);
805 #ifndef OPENSSL_NO_BF
806 BF_set_key(&bf_ks,16,key16);
808 #ifndef OPENSSL_NO_CAST
809 CAST_set_key(&cast_ks,16,key16);
811 #ifndef OPENSSL_NO_RSA
812 memset(rsa_c,0,sizeof(rsa_c));
815 #ifndef OPENSSL_NO_DES
816 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
821 Time_F(START,usertime);
822 for (i=count; i; i--)
823 des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
824 &(sch[0]),DES_ENCRYPT);
825 d=Time_F(STOP,usertime);
828 c[D_MD2][0]=count/10;
829 c[D_MDC2][0]=count/10;
834 c[D_RMD160][0]=count;
836 c[D_CBC_DES][0]=count;
837 c[D_EDE3_DES][0]=count/3;
838 c[D_CBC_IDEA][0]=count;
839 c[D_CBC_RC2][0]=count;
840 c[D_CBC_RC5][0]=count;
841 c[D_CBC_BF][0]=count;
842 c[D_CBC_CAST][0]=count;
844 for (i=1; i<SIZE_NUM; i++)
846 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
847 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
848 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
849 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
850 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
851 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
852 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
854 for (i=1; i<SIZE_NUM; i++)
858 l0=(long)lengths[i-1];
860 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
861 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
862 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
863 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
864 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
865 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
866 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
867 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
869 #ifndef OPENSSL_NO_RSA
870 rsa_c[R_RSA_512][0]=count/2000;
871 rsa_c[R_RSA_512][1]=count/400;
872 for (i=1; i<RSA_NUM; i++)
874 rsa_c[i][0]=rsa_c[i-1][0]/8;
875 rsa_c[i][1]=rsa_c[i-1][1]/4;
876 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
880 if (rsa_c[i][0] == 0)
889 #ifndef OPENSSL_NO_DSA
890 dsa_c[R_DSA_512][0]=count/1000;
891 dsa_c[R_DSA_512][1]=count/1000/2;
892 for (i=1; i<DSA_NUM; i++)
894 dsa_c[i][0]=dsa_c[i-1][0]/4;
895 dsa_c[i][1]=dsa_c[i-1][1]/4;
896 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
909 #define COND(d) (count < (d))
912 /* not worth fixing */
913 # error "You cannot disable DES on systems without SIGALRM."
914 #endif /* OPENSSL_NO_DES */
916 #define COND(c) (run)
917 #define COUNT(d) (count)
918 signal(SIGALRM,sig_done);
921 #ifndef OPENSSL_NO_MD2
924 for (j=0; j<SIZE_NUM; j++)
926 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
927 Time_F(START,usertime);
928 for (count=0,run=1; COND(c[D_MD2][j]); count++)
929 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2());
930 d=Time_F(STOP,usertime);
931 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
932 count,names[D_MD2],d);
933 results[D_MD2][j]=((double)count)/d*lengths[j];
937 #ifndef OPENSSL_NO_MDC2
940 for (j=0; j<SIZE_NUM; j++)
942 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
943 Time_F(START,usertime);
944 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
945 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2());
946 d=Time_F(STOP,usertime);
947 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
948 count,names[D_MDC2],d);
949 results[D_MDC2][j]=((double)count)/d*lengths[j];
954 #ifndef OPENSSL_NO_MD4
957 for (j=0; j<SIZE_NUM; j++)
959 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
960 Time_F(START,usertime);
961 for (count=0,run=1; COND(c[D_MD4][j]); count++)
962 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4());
963 d=Time_F(STOP,usertime);
964 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
965 count,names[D_MD4],d);
966 results[D_MD4][j]=((double)count)/d*lengths[j];
971 #ifndef OPENSSL_NO_MD5
974 for (j=0; j<SIZE_NUM; j++)
976 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
977 Time_F(START,usertime);
978 for (count=0,run=1; COND(c[D_MD5][j]); count++)
979 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"));
980 d=Time_F(STOP,usertime);
981 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
982 count,names[D_MD5],d);
983 results[D_MD5][j]=((double)count)/d*lengths[j];
988 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
993 HMAC_CTX_init(&hctx);
994 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
997 for (j=0; j<SIZE_NUM; j++)
999 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1000 Time_F(START,usertime);
1001 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1003 HMAC_Init(&hctx,NULL,0,NULL);
1004 HMAC_Update(&hctx,buf,lengths[j]);
1005 HMAC_Final(&hctx,&(hmac[0]),NULL);
1007 d=Time_F(STOP,usertime);
1008 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1009 count,names[D_HMAC],d);
1010 results[D_HMAC][j]=((double)count)/d*lengths[j];
1012 HMAC_CTX_cleanup(&hctx);
1015 #ifndef OPENSSL_NO_SHA
1018 for (j=0; j<SIZE_NUM; j++)
1020 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1021 Time_F(START,usertime);
1022 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1023 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1());
1024 d=Time_F(STOP,usertime);
1025 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1026 count,names[D_SHA1],d);
1027 results[D_SHA1][j]=((double)count)/d*lengths[j];
1031 #ifndef OPENSSL_NO_RIPEMD
1034 for (j=0; j<SIZE_NUM; j++)
1036 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1037 Time_F(START,usertime);
1038 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1039 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160());
1040 d=Time_F(STOP,usertime);
1041 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1042 count,names[D_RMD160],d);
1043 results[D_RMD160][j]=((double)count)/d*lengths[j];
1047 #ifndef OPENSSL_NO_RC4
1050 for (j=0; j<SIZE_NUM; j++)
1052 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1053 Time_F(START,usertime);
1054 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1055 RC4(&rc4_ks,(unsigned int)lengths[j],
1057 d=Time_F(STOP,usertime);
1058 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1059 count,names[D_RC4],d);
1060 results[D_RC4][j]=((double)count)/d*lengths[j];
1064 #ifndef OPENSSL_NO_DES
1065 if (doit[D_CBC_DES])
1067 for (j=0; j<SIZE_NUM; j++)
1069 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1070 Time_F(START,usertime);
1071 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1072 des_ncbc_encrypt(buf,buf,lengths[j],&sch,
1074 d=Time_F(STOP,usertime);
1075 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1076 count,names[D_CBC_DES],d);
1077 results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1081 if (doit[D_EDE3_DES])
1083 for (j=0; j<SIZE_NUM; j++)
1085 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1086 Time_F(START,usertime);
1087 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1088 des_ede3_cbc_encrypt(buf,buf,lengths[j],
1091 d=Time_F(STOP,usertime);
1092 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1093 count,names[D_EDE3_DES],d);
1094 results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1098 #ifndef OPENSSL_NO_IDEA
1099 if (doit[D_CBC_IDEA])
1101 for (j=0; j<SIZE_NUM; j++)
1103 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1104 Time_F(START,usertime);
1105 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1106 idea_cbc_encrypt(buf,buf,
1107 (unsigned long)lengths[j],&idea_ks,
1109 d=Time_F(STOP,usertime);
1110 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1111 count,names[D_CBC_IDEA],d);
1112 results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1116 #ifndef OPENSSL_NO_RC2
1117 if (doit[D_CBC_RC2])
1119 for (j=0; j<SIZE_NUM; j++)
1121 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1122 Time_F(START,usertime);
1123 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1124 RC2_cbc_encrypt(buf,buf,
1125 (unsigned long)lengths[j],&rc2_ks,
1127 d=Time_F(STOP,usertime);
1128 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1129 count,names[D_CBC_RC2],d);
1130 results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1134 #ifndef OPENSSL_NO_RC5
1135 if (doit[D_CBC_RC5])
1137 for (j=0; j<SIZE_NUM; j++)
1139 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1140 Time_F(START,usertime);
1141 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1142 RC5_32_cbc_encrypt(buf,buf,
1143 (unsigned long)lengths[j],&rc5_ks,
1145 d=Time_F(STOP,usertime);
1146 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1147 count,names[D_CBC_RC5],d);
1148 results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1152 #ifndef OPENSSL_NO_BF
1155 for (j=0; j<SIZE_NUM; j++)
1157 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1158 Time_F(START,usertime);
1159 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1160 BF_cbc_encrypt(buf,buf,
1161 (unsigned long)lengths[j],&bf_ks,
1163 d=Time_F(STOP,usertime);
1164 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1165 count,names[D_CBC_BF],d);
1166 results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1170 #ifndef OPENSSL_NO_CAST
1171 if (doit[D_CBC_CAST])
1173 for (j=0; j<SIZE_NUM; j++)
1175 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1176 Time_F(START,usertime);
1177 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1178 CAST_cbc_encrypt(buf,buf,
1179 (unsigned long)lengths[j],&cast_ks,
1181 d=Time_F(STOP,usertime);
1182 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1183 count,names[D_CBC_CAST],d);
1184 results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1191 for (j=0; j<SIZE_NUM; j++)
1196 names[D_EVP]=OBJ_nid2ln(evp->nid);
1197 print_message(names[D_EVP],save_count,
1200 EVP_DecryptInit(&ctx,evp,key16,iv);
1202 EVP_EncryptInit(&ctx,evp,key16,iv);
1204 Time_F(START,usertime);
1206 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1207 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1209 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1210 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1212 EVP_DecryptFinal(&ctx,buf,&outl);
1214 EVP_EncryptFinal(&ctx,buf,&outl);
1215 d=Time_F(STOP,usertime);
1216 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1217 count,names[D_EVP],d);
1218 results[D_EVP][j]=((double)count)/d*lengths[j];
1222 RAND_pseudo_bytes(buf,36);
1223 #ifndef OPENSSL_NO_RSA
1224 for (j=0; j<RSA_NUM; j++)
1227 if (!rsa_doit[j]) continue;
1228 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1231 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1232 ERR_print_errors(bio_err);
1237 pkey_print_message("private","rsa",
1238 rsa_c[j][0],rsa_bits[j],
1240 /* RSA_blinding_on(rsa_key[j],NULL); */
1241 Time_F(START,usertime);
1242 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1244 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1245 &rsa_num, rsa_key[j]);
1249 "RSA sign failure\n");
1250 ERR_print_errors(bio_err);
1255 d=Time_F(STOP,usertime);
1257 "%ld %d bit private RSA's in %.2fs\n",
1258 count,rsa_bits[j],d);
1259 rsa_results[j][0]=d/(double)count;
1264 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1267 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1268 ERR_print_errors(bio_err);
1273 pkey_print_message("public","rsa",
1274 rsa_c[j][1],rsa_bits[j],
1276 Time_F(START,usertime);
1277 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1279 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1280 rsa_num, rsa_key[j]);
1284 "RSA verify failure\n");
1285 ERR_print_errors(bio_err);
1290 d=Time_F(STOP,usertime);
1292 "%ld %d bit public RSA's in %.2fs\n",
1293 count,rsa_bits[j],d);
1294 rsa_results[j][1]=d/(double)count;
1300 /* if longer than 10s, don't do any more */
1301 for (j++; j<RSA_NUM; j++)
1307 RAND_pseudo_bytes(buf,20);
1308 #ifndef OPENSSL_NO_DSA
1309 if (RAND_status() != 1)
1311 RAND_seed(rnd_seed, sizeof rnd_seed);
1314 for (j=0; j<DSA_NUM; j++)
1319 if (!dsa_doit[j]) continue;
1320 /* DSA_generate_key(dsa_key[j]); */
1321 /* DSA_sign_setup(dsa_key[j],NULL); */
1322 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1326 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1327 ERR_print_errors(bio_err);
1332 pkey_print_message("sign","dsa",
1333 dsa_c[j][0],dsa_bits[j],
1335 Time_F(START,usertime);
1336 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1338 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1343 "DSA sign failure\n");
1344 ERR_print_errors(bio_err);
1349 d=Time_F(STOP,usertime);
1350 BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1351 count,dsa_bits[j],d);
1352 dsa_results[j][0]=d/(double)count;
1356 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1360 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1361 ERR_print_errors(bio_err);
1366 pkey_print_message("verify","dsa",
1367 dsa_c[j][1],dsa_bits[j],
1369 Time_F(START,usertime);
1370 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1372 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1377 "DSA verify failure\n");
1378 ERR_print_errors(bio_err);
1383 d=Time_F(STOP,usertime);
1384 BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1385 count,dsa_bits[j],d);
1386 dsa_results[j][1]=d/(double)count;
1391 /* if longer than 10s, don't do any more */
1392 for (j++; j<DSA_NUM; j++)
1396 if (rnd_fake) RAND_cleanup();
1399 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1400 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1402 printf("%s ",BN_options());
1403 #ifndef OPENSSL_NO_MD2
1404 printf("%s ",MD2_options());
1406 #ifndef OPENSSL_NO_RC4
1407 printf("%s ",RC4_options());
1409 #ifndef OPENSSL_NO_DES
1410 printf("%s ",des_options());
1412 #ifndef OPENSSL_NO_IDEA
1413 printf("%s ",idea_options());
1415 #ifndef OPENSSL_NO_BF
1416 printf("%s ",BF_options());
1418 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1422 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1423 fprintf(stdout,"type ");
1424 for (j=0; j<SIZE_NUM; j++)
1425 fprintf(stdout,"%7d bytes",lengths[j]);
1426 fprintf(stdout,"\n");
1429 for (k=0; k<ALGOR_NUM; k++)
1431 if (!doit[k]) continue;
1432 fprintf(stdout,"%-13s",names[k]);
1433 for (j=0; j<SIZE_NUM; j++)
1435 if (results[k][j] > 10000)
1436 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1438 fprintf(stdout," %11.2f ",results[k][j]);
1440 fprintf(stdout,"\n");
1442 #ifndef OPENSSL_NO_RSA
1444 for (k=0; k<RSA_NUM; k++)
1446 if (!rsa_doit[k]) continue;
1449 printf("%18ssign verify sign/s verify/s\n"," ");
1452 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1453 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1454 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1455 fprintf(stdout,"\n");
1458 #ifndef OPENSSL_NO_DSA
1460 for (k=0; k<DSA_NUM; k++)
1462 if (!dsa_doit[k]) continue;
1464 printf("%18ssign verify sign/s verify/s\n"," ");
1467 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1468 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1469 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1470 fprintf(stdout,"\n");
1475 ERR_print_errors(bio_err);
1476 if (buf != NULL) OPENSSL_free(buf);
1477 if (buf2 != NULL) OPENSSL_free(buf2);
1478 #ifndef OPENSSL_NO_RSA
1479 for (i=0; i<RSA_NUM; i++)
1480 if (rsa_key[i] != NULL)
1481 RSA_free(rsa_key[i]);
1483 #ifndef OPENSSL_NO_DSA
1484 for (i=0; i<DSA_NUM; i++)
1485 if (dsa_key[i] != NULL)
1486 DSA_free(dsa_key[i]);
1492 static void print_message(const char *s, long num, int length)
1495 BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1496 (void)BIO_flush(bio_err);
1499 BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
1500 (void)BIO_flush(bio_err);
1507 static void pkey_print_message(char *str, char *str2, long num, int bits,
1511 BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1512 (void)BIO_flush(bio_err);
1515 BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1516 (void)BIO_flush(bio_err);