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 if((e = ENGINE_by_id(*argv)) == NULL)
510 BIO_printf(bio_err,"invalid engine \"%s\"\n",
514 if(!ENGINE_set_default(e, ENGINE_METHOD_ALL))
516 BIO_printf(bio_err,"can't use that engine\n");
519 BIO_printf(bio_err,"engine \"%s\" set.\n", *argv);
520 /* Free our "structural" reference. */
522 /* It will be increased again further down. We just
523 don't want speed to confuse an engine with an
524 algorithm, especially when none is given (which
525 means all of them should be run) */
529 #ifndef OPENSSL_NO_MD2
530 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
533 #ifndef OPENSSL_NO_MDC2
534 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
537 #ifndef OPENSSL_NO_MD4
538 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
541 #ifndef OPENSSL_NO_MD5
542 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
545 #ifndef OPENSSL_NO_MD5
546 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
549 #ifndef OPENSSL_NO_SHA
550 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
552 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
555 #ifndef OPENSSL_NO_RIPEMD
556 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
558 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
560 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
563 #ifndef OPENSSL_NO_RC4
564 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
567 #ifndef OPENSSL_NO_DES
568 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
569 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
572 #ifndef OPENSSL_NO_RSA
573 #if 0 /* was: #ifdef RSAref */
574 if (strcmp(*argv,"rsaref") == 0)
576 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
582 if (strcmp(*argv,"openssl") == 0)
584 RSA_set_default_openssl_method(RSA_PKCS1_SSLeay());
589 #endif /* !OPENSSL_NO_RSA */
590 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
591 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
592 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
593 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
594 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
595 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
596 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
598 #ifndef OPENSSL_NO_RC2
599 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
600 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
603 #ifndef OPENSSL_NO_RC5
604 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
605 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
608 #ifndef OPENSSL_NO_IDEA
609 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
610 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
613 #ifndef OPENSSL_NO_BF
614 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
615 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
616 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
619 #ifndef OPENSSL_NO_CAST
620 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
621 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
622 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
625 #ifndef OPENSSL_NO_DES
626 if (strcmp(*argv,"des") == 0)
633 #ifndef OPENSSL_NO_RSA
634 if (strcmp(*argv,"rsa") == 0)
636 rsa_doit[R_RSA_512]=1;
637 rsa_doit[R_RSA_1024]=1;
638 rsa_doit[R_RSA_2048]=1;
639 rsa_doit[R_RSA_4096]=1;
643 #ifndef OPENSSL_NO_DSA
644 if (strcmp(*argv,"dsa") == 0)
646 dsa_doit[R_DSA_512]=1;
647 dsa_doit[R_DSA_1024]=1;
652 BIO_printf(bio_err,"Error: bad option or value\n");
653 BIO_printf(bio_err,"\n");
654 BIO_printf(bio_err,"Available values:\n");
655 #ifndef OPENSSL_NO_MD2
656 BIO_printf(bio_err,"md2 ");
658 #ifndef OPENSSL_NO_MDC2
659 BIO_printf(bio_err,"mdc2 ");
661 #ifndef OPENSSL_NO_MD4
662 BIO_printf(bio_err,"md4 ");
664 #ifndef OPENSSL_NO_MD5
665 BIO_printf(bio_err,"md5 ");
666 #ifndef OPENSSL_NO_HMAC
667 BIO_printf(bio_err,"hmac ");
670 #ifndef OPENSSL_NO_SHA1
671 BIO_printf(bio_err,"sha1 ");
673 #ifndef OPENSSL_NO_RIPEMD160
674 BIO_printf(bio_err,"rmd160");
676 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
677 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
678 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
679 BIO_printf(bio_err,"\n");
682 #ifndef OPENSSL_NO_IDEA
683 BIO_printf(bio_err,"idea-cbc ");
685 #ifndef OPENSSL_NO_RC2
686 BIO_printf(bio_err,"rc2-cbc ");
688 #ifndef OPENSSL_NO_RC5
689 BIO_printf(bio_err,"rc5-cbc ");
691 #ifndef OPENSSL_NO_BF
692 BIO_printf(bio_err,"bf-cbc");
694 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
695 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
696 BIO_printf(bio_err,"\n");
699 BIO_printf(bio_err,"des-cbc des-ede3 ");
700 #ifndef OPENSSL_NO_RC4
701 BIO_printf(bio_err,"rc4");
703 BIO_printf(bio_err,"\n");
705 #ifndef OPENSSL_NO_RSA
706 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
709 #ifndef OPENSSL_NO_DSA
710 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
713 #ifndef OPENSSL_NO_IDEA
714 BIO_printf(bio_err,"idea ");
716 #ifndef OPENSSL_NO_RC2
717 BIO_printf(bio_err,"rc2 ");
719 #ifndef OPENSSL_NO_DES
720 BIO_printf(bio_err,"des ");
722 #ifndef OPENSSL_NO_RSA
723 BIO_printf(bio_err,"rsa ");
725 #ifndef OPENSSL_NO_BF
726 BIO_printf(bio_err,"blowfish");
728 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
729 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
730 !defined(OPENSSL_NO_BF)
731 BIO_printf(bio_err,"\n");
734 BIO_printf(bio_err,"\n");
735 BIO_printf(bio_err,"Available options:\n");
737 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
739 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
749 for (i=0; i<ALGOR_NUM; i++)
754 for (i=0; i<RSA_NUM; i++)
756 for (i=0; i<DSA_NUM; i++)
759 for (i=0; i<ALGOR_NUM; i++)
760 if (doit[i]) pr_header++;
763 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
766 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
767 BIO_printf(bio_err,"program when this computer is idle.\n");
770 #ifndef OPENSSL_NO_RSA
771 for (i=0; i<RSA_NUM; i++)
773 const unsigned char *p;
776 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
777 if (rsa_key[i] == NULL)
779 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
785 BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
786 BN_print(bio_err,rsa_key[i]->e);
787 BIO_printf(bio_err,"\n");
793 #ifndef OPENSSL_NO_DSA
794 dsa_key[0]=get_dsa512();
795 dsa_key[1]=get_dsa1024();
796 dsa_key[2]=get_dsa2048();
799 #ifndef OPENSSL_NO_DES
800 des_set_key_unchecked(&key,sch);
801 des_set_key_unchecked(&key2,sch2);
802 des_set_key_unchecked(&key3,sch3);
804 #ifndef OPENSSL_NO_IDEA
805 idea_set_encrypt_key(key16,&idea_ks);
807 #ifndef OPENSSL_NO_RC4
808 RC4_set_key(&rc4_ks,16,key16);
810 #ifndef OPENSSL_NO_RC2
811 RC2_set_key(&rc2_ks,16,key16,128);
813 #ifndef OPENSSL_NO_RC5
814 RC5_32_set_key(&rc5_ks,16,key16,12);
816 #ifndef OPENSSL_NO_BF
817 BF_set_key(&bf_ks,16,key16);
819 #ifndef OPENSSL_NO_CAST
820 CAST_set_key(&cast_ks,16,key16);
822 #ifndef OPENSSL_NO_RSA
823 memset(rsa_c,0,sizeof(rsa_c));
826 #ifndef OPENSSL_NO_DES
827 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
832 Time_F(START,usertime);
833 for (i=count; i; i--)
834 des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
835 &(sch[0]),DES_ENCRYPT);
836 d=Time_F(STOP,usertime);
839 c[D_MD2][0]=count/10;
840 c[D_MDC2][0]=count/10;
845 c[D_RMD160][0]=count;
847 c[D_CBC_DES][0]=count;
848 c[D_EDE3_DES][0]=count/3;
849 c[D_CBC_IDEA][0]=count;
850 c[D_CBC_RC2][0]=count;
851 c[D_CBC_RC5][0]=count;
852 c[D_CBC_BF][0]=count;
853 c[D_CBC_CAST][0]=count;
855 for (i=1; i<SIZE_NUM; i++)
857 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
858 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
859 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
860 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
861 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
862 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
863 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
865 for (i=1; i<SIZE_NUM; i++)
869 l0=(long)lengths[i-1];
871 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
872 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
873 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
874 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
875 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
876 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
877 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
878 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
880 #ifndef OPENSSL_NO_RSA
881 rsa_c[R_RSA_512][0]=count/2000;
882 rsa_c[R_RSA_512][1]=count/400;
883 for (i=1; i<RSA_NUM; i++)
885 rsa_c[i][0]=rsa_c[i-1][0]/8;
886 rsa_c[i][1]=rsa_c[i-1][1]/4;
887 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
891 if (rsa_c[i][0] == 0)
900 #ifndef OPENSSL_NO_DSA
901 dsa_c[R_DSA_512][0]=count/1000;
902 dsa_c[R_DSA_512][1]=count/1000/2;
903 for (i=1; i<DSA_NUM; i++)
905 dsa_c[i][0]=dsa_c[i-1][0]/4;
906 dsa_c[i][1]=dsa_c[i-1][1]/4;
907 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
920 #define COND(d) (count < (d))
923 /* not worth fixing */
924 # error "You cannot disable DES on systems without SIGALRM."
925 #endif /* OPENSSL_NO_DES */
927 #define COND(c) (run)
928 #define COUNT(d) (count)
929 signal(SIGALRM,sig_done);
932 #ifndef OPENSSL_NO_MD2
935 for (j=0; j<SIZE_NUM; j++)
937 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
938 Time_F(START,usertime);
939 for (count=0,run=1; COND(c[D_MD2][j]); count++)
940 MD2(buf,(unsigned long)lengths[j],&(md2[0]));
941 d=Time_F(STOP,usertime);
942 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
943 count,names[D_MD2],d);
944 results[D_MD2][j]=((double)count)/d*lengths[j];
948 #ifndef OPENSSL_NO_MDC2
951 for (j=0; j<SIZE_NUM; j++)
953 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
954 Time_F(START,usertime);
955 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
956 MDC2(buf,(unsigned long)lengths[j],&(mdc2[0]));
957 d=Time_F(STOP,usertime);
958 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
959 count,names[D_MDC2],d);
960 results[D_MDC2][j]=((double)count)/d*lengths[j];
965 #ifndef OPENSSL_NO_MD4
968 for (j=0; j<SIZE_NUM; j++)
970 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
971 Time_F(START,usertime);
972 for (count=0,run=1; COND(c[D_MD4][j]); count++)
973 MD4(&(buf[0]),(unsigned long)lengths[j],&(md4[0]));
974 d=Time_F(STOP,usertime);
975 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
976 count,names[D_MD4],d);
977 results[D_MD4][j]=((double)count)/d*lengths[j];
982 #ifndef OPENSSL_NO_MD5
985 for (j=0; j<SIZE_NUM; j++)
987 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
988 Time_F(START,usertime);
989 for (count=0,run=1; COND(c[D_MD5][j]); count++)
990 MD5(&(buf[0]),(unsigned long)lengths[j],&(md5[0]));
991 d=Time_F(STOP,usertime);
992 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
993 count,names[D_MD5],d);
994 results[D_MD5][j]=((double)count)/d*lengths[j];
999 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1003 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
1006 for (j=0; j<SIZE_NUM; j++)
1008 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1009 Time_F(START,usertime);
1010 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1012 HMAC_Init(&hctx,NULL,0,NULL);
1013 HMAC_Update(&hctx,buf,lengths[j]);
1014 HMAC_Final(&hctx,&(hmac[0]),NULL);
1016 d=Time_F(STOP,usertime);
1017 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1018 count,names[D_HMAC],d);
1019 results[D_HMAC][j]=((double)count)/d*lengths[j];
1023 #ifndef OPENSSL_NO_SHA
1026 for (j=0; j<SIZE_NUM; j++)
1028 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1029 Time_F(START,usertime);
1030 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1031 SHA1(buf,(unsigned long)lengths[j],&(sha[0]));
1032 d=Time_F(STOP,usertime);
1033 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1034 count,names[D_SHA1],d);
1035 results[D_SHA1][j]=((double)count)/d*lengths[j];
1039 #ifndef OPENSSL_NO_RIPEMD
1042 for (j=0; j<SIZE_NUM; j++)
1044 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1045 Time_F(START,usertime);
1046 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1047 RIPEMD160(buf,(unsigned long)lengths[j],&(rmd160[0]));
1048 d=Time_F(STOP,usertime);
1049 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1050 count,names[D_RMD160],d);
1051 results[D_RMD160][j]=((double)count)/d*lengths[j];
1055 #ifndef OPENSSL_NO_RC4
1058 for (j=0; j<SIZE_NUM; j++)
1060 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1061 Time_F(START,usertime);
1062 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1063 RC4(&rc4_ks,(unsigned int)lengths[j],
1065 d=Time_F(STOP,usertime);
1066 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1067 count,names[D_RC4],d);
1068 results[D_RC4][j]=((double)count)/d*lengths[j];
1072 #ifndef OPENSSL_NO_DES
1073 if (doit[D_CBC_DES])
1075 for (j=0; j<SIZE_NUM; j++)
1077 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1078 Time_F(START,usertime);
1079 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1080 des_ncbc_encrypt(buf,buf,lengths[j],sch,
1082 d=Time_F(STOP,usertime);
1083 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1084 count,names[D_CBC_DES],d);
1085 results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1089 if (doit[D_EDE3_DES])
1091 for (j=0; j<SIZE_NUM; j++)
1093 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1094 Time_F(START,usertime);
1095 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1096 des_ede3_cbc_encrypt(buf,buf,lengths[j],
1099 d=Time_F(STOP,usertime);
1100 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1101 count,names[D_EDE3_DES],d);
1102 results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1106 #ifndef OPENSSL_NO_IDEA
1107 if (doit[D_CBC_IDEA])
1109 for (j=0; j<SIZE_NUM; j++)
1111 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1112 Time_F(START,usertime);
1113 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1114 idea_cbc_encrypt(buf,buf,
1115 (unsigned long)lengths[j],&idea_ks,
1117 d=Time_F(STOP,usertime);
1118 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1119 count,names[D_CBC_IDEA],d);
1120 results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1124 #ifndef OPENSSL_NO_RC2
1125 if (doit[D_CBC_RC2])
1127 for (j=0; j<SIZE_NUM; j++)
1129 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1130 Time_F(START,usertime);
1131 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1132 RC2_cbc_encrypt(buf,buf,
1133 (unsigned long)lengths[j],&rc2_ks,
1135 d=Time_F(STOP,usertime);
1136 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1137 count,names[D_CBC_RC2],d);
1138 results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1142 #ifndef OPENSSL_NO_RC5
1143 if (doit[D_CBC_RC5])
1145 for (j=0; j<SIZE_NUM; j++)
1147 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1148 Time_F(START,usertime);
1149 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1150 RC5_32_cbc_encrypt(buf,buf,
1151 (unsigned long)lengths[j],&rc5_ks,
1153 d=Time_F(STOP,usertime);
1154 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1155 count,names[D_CBC_RC5],d);
1156 results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1160 #ifndef OPENSSL_NO_BF
1163 for (j=0; j<SIZE_NUM; j++)
1165 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1166 Time_F(START,usertime);
1167 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1168 BF_cbc_encrypt(buf,buf,
1169 (unsigned long)lengths[j],&bf_ks,
1171 d=Time_F(STOP,usertime);
1172 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1173 count,names[D_CBC_BF],d);
1174 results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1178 #ifndef OPENSSL_NO_CAST
1179 if (doit[D_CBC_CAST])
1181 for (j=0; j<SIZE_NUM; j++)
1183 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1184 Time_F(START,usertime);
1185 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1186 CAST_cbc_encrypt(buf,buf,
1187 (unsigned long)lengths[j],&cast_ks,
1189 d=Time_F(STOP,usertime);
1190 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1191 count,names[D_CBC_CAST],d);
1192 results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1199 for (j=0; j<SIZE_NUM; j++)
1204 names[D_EVP]=OBJ_nid2ln(evp->nid);
1205 print_message(names[D_EVP],save_count,
1207 EVP_EncryptInit(&ctx,evp,key16,iv);
1208 Time_F(START,usertime);
1209 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1210 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1211 EVP_EncryptFinal(&ctx,buf,&outl);
1212 d=Time_F(STOP,usertime);
1213 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1214 count,names[D_EVP],d);
1215 results[D_EVP][j]=((double)count)/d*lengths[j];
1219 RAND_pseudo_bytes(buf,36);
1220 #ifndef OPENSSL_NO_RSA
1221 for (j=0; j<RSA_NUM; j++)
1224 if (!rsa_doit[j]) continue;
1225 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1228 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1229 ERR_print_errors(bio_err);
1234 pkey_print_message("private","rsa",
1235 rsa_c[j][0],rsa_bits[j],
1237 /* RSA_blinding_on(rsa_key[j],NULL); */
1238 Time_F(START,usertime);
1239 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1241 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1242 &rsa_num, rsa_key[j]);
1246 "RSA sign failure\n");
1247 ERR_print_errors(bio_err);
1252 d=Time_F(STOP,usertime);
1254 "%ld %d bit private RSA's in %.2fs\n",
1255 count,rsa_bits[j],d);
1256 rsa_results[j][0]=d/(double)count;
1261 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1264 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1265 ERR_print_errors(bio_err);
1270 pkey_print_message("public","rsa",
1271 rsa_c[j][1],rsa_bits[j],
1273 Time_F(START,usertime);
1274 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1276 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1277 rsa_num, rsa_key[j]);
1281 "RSA verify failure\n");
1282 ERR_print_errors(bio_err);
1287 d=Time_F(STOP,usertime);
1289 "%ld %d bit public RSA's in %.2fs\n",
1290 count,rsa_bits[j],d);
1291 rsa_results[j][1]=d/(double)count;
1297 /* if longer than 10s, don't do any more */
1298 for (j++; j<RSA_NUM; j++)
1304 RAND_pseudo_bytes(buf,20);
1305 #ifndef OPENSSL_NO_DSA
1306 if (RAND_status() != 1)
1308 RAND_seed(rnd_seed, sizeof rnd_seed);
1311 for (j=0; j<DSA_NUM; j++)
1316 if (!dsa_doit[j]) continue;
1317 DSA_generate_key(dsa_key[j]);
1318 /* DSA_sign_setup(dsa_key[j],NULL); */
1319 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1323 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1324 ERR_print_errors(bio_err);
1329 pkey_print_message("sign","dsa",
1330 dsa_c[j][0],dsa_bits[j],
1332 Time_F(START,usertime);
1333 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1335 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1340 "DSA sign failure\n");
1341 ERR_print_errors(bio_err);
1346 d=Time_F(STOP,usertime);
1347 BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1348 count,dsa_bits[j],d);
1349 dsa_results[j][0]=d/(double)count;
1353 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1357 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1358 ERR_print_errors(bio_err);
1363 pkey_print_message("verify","dsa",
1364 dsa_c[j][1],dsa_bits[j],
1366 Time_F(START,usertime);
1367 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1369 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1374 "DSA verify failure\n");
1375 ERR_print_errors(bio_err);
1380 d=Time_F(STOP,usertime);
1381 BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1382 count,dsa_bits[j],d);
1383 dsa_results[j][1]=d/(double)count;
1388 /* if longer than 10s, don't do any more */
1389 for (j++; j<DSA_NUM; j++)
1393 if (rnd_fake) RAND_cleanup();
1396 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1397 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1399 printf("%s ",BN_options());
1400 #ifndef OPENSSL_NO_MD2
1401 printf("%s ",MD2_options());
1403 #ifndef OPENSSL_NO_RC4
1404 printf("%s ",RC4_options());
1406 #ifndef OPENSSL_NO_DES
1407 printf("%s ",des_options());
1409 #ifndef OPENSSL_NO_IDEA
1410 printf("%s ",idea_options());
1412 #ifndef OPENSSL_NO_BF
1413 printf("%s ",BF_options());
1415 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1419 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1420 fprintf(stdout,"type ");
1421 for (j=0; j<SIZE_NUM; j++)
1422 fprintf(stdout,"%7d bytes",lengths[j]);
1423 fprintf(stdout,"\n");
1426 for (k=0; k<ALGOR_NUM; k++)
1428 if (!doit[k]) continue;
1429 fprintf(stdout,"%-13s",names[k]);
1430 for (j=0; j<SIZE_NUM; j++)
1432 if (results[k][j] > 10000)
1433 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1435 fprintf(stdout," %11.2f ",results[k][j]);
1437 fprintf(stdout,"\n");
1439 #ifndef OPENSSL_NO_RSA
1441 for (k=0; k<RSA_NUM; k++)
1443 if (!rsa_doit[k]) continue;
1446 printf("%18ssign verify sign/s verify/s\n"," ");
1449 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1450 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1451 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1452 fprintf(stdout,"\n");
1455 #ifndef OPENSSL_NO_DSA
1457 for (k=0; k<DSA_NUM; k++)
1459 if (!dsa_doit[k]) continue;
1461 printf("%18ssign verify sign/s verify/s\n"," ");
1464 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1465 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1466 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1467 fprintf(stdout,"\n");
1472 ERR_print_errors(bio_err);
1473 if (buf != NULL) OPENSSL_free(buf);
1474 if (buf2 != NULL) OPENSSL_free(buf2);
1475 #ifndef OPENSSL_NO_RSA
1476 for (i=0; i<RSA_NUM; i++)
1477 if (rsa_key[i] != NULL)
1478 RSA_free(rsa_key[i]);
1480 #ifndef OPENSSL_NO_DSA
1481 for (i=0; i<DSA_NUM; i++)
1482 if (dsa_key[i] != NULL)
1483 DSA_free(dsa_key[i]);
1488 static void print_message(const char *s, long num, int length)
1491 BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1492 (void)BIO_flush(bio_err);
1495 BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
1496 (void)BIO_flush(bio_err);
1503 static void pkey_print_message(char *str, char *str2, long num, int bits,
1507 BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1508 (void)BIO_flush(bio_err);
1511 BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1512 (void)BIO_flush(bio_err);