fca6618f7e6bb8303c99b095472c4e94c92acca0
[openssl.git] / apps / speed.c
1 /* apps/speed.c -*- mode:C; c-file-style: "eay" -*- */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
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.
8  * 
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).
15  * 
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.
22  * 
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
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)"
40  * 
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
51  * SUCH DAMAGE.
52  * 
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.]
57  */
58
59 /* most of this code has been pilfered from my libdes speed.c program */
60
61 #undef SECONDS
62 #define SECONDS         3       
63 #define RSA_SECONDS     10
64 #define DSA_SECONDS     10
65
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 */
68
69 #undef PROG
70 #define PROG speed_main
71
72 #include <stdio.h>
73 #include <stdlib.h>
74 #include <signal.h>
75 #include <string.h>
76 #include <math.h>
77 #include "apps.h"
78 #ifdef OPENSSL_NO_STDIO
79 #define APPS_WIN16
80 #endif
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>
86 #if !defined(OPENSSL_SYS_MSDOS)
87 #include OPENSSL_UNISTD
88 #endif
89
90 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
91 # define USE_TOD
92 #elif !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
93 # define TIMES
94 #endif
95 #if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_MPE) && !defined(__NetBSD__) /* FIXME */
96 # define TIMEB
97 #endif
98
99 #ifndef _IRIX
100 # include <time.h>
101 #endif
102 #ifdef TIMES
103 # include <sys/types.h>
104 # include <sys/times.h>
105 #endif
106 #ifdef USE_TOD
107 # include <sys/time.h>
108 # include <sys/resource.h>
109 #endif
110
111 /* Depending on the VMS version, the tms structure is perhaps defined.
112    The __TMS macro will show if it was.  If it wasn't defined, we should
113    undefine TIMES, since that tells the rest of the program how things
114    should be handled.                           -- Richard Levitte */
115 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
116 #undef TIMES
117 #endif
118
119 #ifdef TIMEB
120 #include <sys/timeb.h>
121 #endif
122
123 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD)
124 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
125 #endif
126
127 #if defined(sun) || defined(__ultrix)
128 #define _POSIX_SOURCE
129 #include <limits.h>
130 #include <sys/param.h>
131 #endif
132
133 #ifndef OPENSSL_NO_DES
134 #include <openssl/des_old.h>
135 #endif
136 #ifndef OPENSSL_NO_MD2
137 #include <openssl/md2.h>
138 #endif
139 #ifndef OPENSSL_NO_MDC2
140 #include <openssl/mdc2.h>
141 #endif
142 #ifndef OPENSSL_NO_MD4
143 #include <openssl/md4.h>
144 #endif
145 #ifndef OPENSSL_NO_MD5
146 #include <openssl/md5.h>
147 #endif
148 #ifndef OPENSSL_NO_HMAC
149 #include <openssl/hmac.h>
150 #endif
151 #include <openssl/evp.h>
152 #ifndef OPENSSL_NO_SHA
153 #include <openssl/sha.h>
154 #endif
155 #ifndef OPENSSL_NO_RIPEMD
156 #include <openssl/ripemd.h>
157 #endif
158 #ifndef OPENSSL_NO_RC4
159 #include <openssl/rc4.h>
160 #endif
161 #ifndef OPENSSL_NO_RC5
162 #include <openssl/rc5.h>
163 #endif
164 #ifndef OPENSSL_NO_RC2
165 #include <openssl/rc2.h>
166 #endif
167 #ifndef OPENSSL_NO_IDEA
168 #include <openssl/idea.h>
169 #endif
170 #ifndef OPENSSL_NO_BF
171 #include <openssl/blowfish.h>
172 #endif
173 #ifndef OPENSSL_NO_CAST
174 #include <openssl/cast.h>
175 #endif
176 #ifndef OPENSSL_NO_RSA
177 #include <openssl/rsa.h>
178 #include "./testrsa.h"
179 #endif
180 #include <openssl/x509.h>
181 #ifndef OPENSSL_NO_DSA
182 #include "./testdsa.h"
183 #endif
184
185 /* The following if from times(3) man page.  It may need to be changed */
186 #ifndef HZ
187 # ifdef _SC_CLK_TCK
188 #  define HZ ((double)sysconf(_SC_CLK_TCK))
189 # else
190 #  ifndef CLK_TCK
191 #   ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
192 #    define HZ  100.0
193 #   else /* _BSD_CLK_TCK_ */
194 #    define HZ ((double)_BSD_CLK_TCK_)
195 #   endif
196 #  else /* CLK_TCK */
197 #   define HZ ((double)CLK_TCK)
198 #  endif
199 # endif
200 #endif
201
202 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
203 # define HAVE_FORK 1
204 #endif
205
206 #undef BUFSIZE
207 #define BUFSIZE ((long)1024*8+1)
208 int run=0;
209
210 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
211 static int mr=0;
212 static int usertime=1;
213
214 static double Time_F(int s);
215 static void print_message(const char *s,long num,int length);
216 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
217 static void print_result(int alg,int run_no,int count,double time_used);
218 #ifdef HAVE_FORK
219 static int do_multi(int multi);
220 #endif
221
222 #define ALGOR_NUM       16
223 #define SIZE_NUM        5
224 #define RSA_NUM         4
225 #define DSA_NUM         3
226 static const char *names[ALGOR_NUM]={
227   "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
228   "des cbc","des ede3","idea cbc",
229   "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
230 static double results[ALGOR_NUM][SIZE_NUM];
231 static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
232 static double rsa_results[RSA_NUM][2];
233 static double dsa_results[DSA_NUM][2];
234
235 #ifdef SIGALRM
236 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
237 #define SIGRETTYPE void
238 #else
239 #define SIGRETTYPE int
240 #endif 
241
242 static SIGRETTYPE sig_done(int sig);
243 static SIGRETTYPE sig_done(int sig)
244         {
245         signal(SIGALRM,sig_done);
246         run=0;
247 #ifdef LINT
248         sig=sig;
249 #endif
250         }
251 #endif
252
253 #define START   0
254 #define STOP    1
255
256 static double Time_F(int s)
257         {
258         double ret;
259
260 #ifdef USE_TOD
261         if(usertime)
262             {
263                 static struct rusage tstart,tend;
264
265                 getrusage_used = 1;
266                 if (s == START)
267                         {
268                         getrusage(RUSAGE_SELF,&tstart);
269                         return(0);
270                         }
271                 else
272                         {
273                         long i;
274
275                         getrusage(RUSAGE_SELF,&tend);
276                         i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
277                         ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
278                           +((double)i)/1000000.0;
279                         return((ret < 0.001)?0.001:ret);
280                         }
281                 }
282         else
283                 {
284                 static struct timeval tstart,tend;
285                 long i;
286
287                 gettimeofday_used = 1;
288                 if (s == START)
289                         {
290                         gettimeofday(&tstart,NULL);
291                         return(0);
292                         }
293                 else
294                         {
295                         gettimeofday(&tend,NULL);
296                         i=(long)tend.tv_usec-(long)tstart.tv_usec;
297                         ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
298                         return((ret < 0.001)?0.001:ret);
299                         }
300                 }
301 #else  /* ndef USE_TOD */
302                 
303 # ifdef TIMES
304         if (usertime)
305                 {
306                 static struct tms tstart,tend;
307
308                 times_used = 1;
309                 if (s == START)
310                         {
311                         times(&tstart);
312                         return(0);
313                         }
314                 else
315                         {
316                         times(&tend);
317                         ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
318                         return((ret < 1e-3)?1e-3:ret);
319                         }
320                 }
321 # endif /* times() */
322 # if defined(TIMES) && defined(TIMEB)
323         else
324 # endif
325 # ifdef TIMEB
326                 {
327                 static struct timeb tstart,tend;
328                 long i;
329
330                 ftime_used = 1;
331                 if (s == START)
332                         {
333                         ftime(&tstart);
334                         return(0);
335                         }
336                 else
337                         {
338                         ftime(&tend);
339                         i=(long)tend.millitm-(long)tstart.millitm;
340                         ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
341                         return((ret < 0.001)?0.001:ret);
342                         }
343                 }
344 # endif
345 #endif
346         }
347
348 int MAIN(int, char **);
349
350 int MAIN(int argc, char **argv)
351         {
352         ENGINE *e;
353         unsigned char *buf=NULL,*buf2=NULL;
354         int mret=1;
355         long count=0,save_count=0;
356         int i,j,k;
357 #ifndef OPENSSL_NO_RSA
358         unsigned rsa_num;
359         long rsa_count;
360 #endif
361         unsigned char md[EVP_MAX_MD_SIZE];
362 #ifndef OPENSSL_NO_MD2
363         unsigned char md2[MD2_DIGEST_LENGTH];
364 #endif
365 #ifndef OPENSSL_NO_MDC2
366         unsigned char mdc2[MDC2_DIGEST_LENGTH];
367 #endif
368 #ifndef OPENSSL_NO_MD4
369         unsigned char md4[MD4_DIGEST_LENGTH];
370 #endif
371 #ifndef OPENSSL_NO_MD5
372         unsigned char md5[MD5_DIGEST_LENGTH];
373         unsigned char hmac[MD5_DIGEST_LENGTH];
374 #endif
375 #ifndef OPENSSL_NO_SHA
376         unsigned char sha[SHA_DIGEST_LENGTH];
377 #endif
378 #ifndef OPENSSL_NO_RIPEMD
379         unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
380 #endif
381 #ifndef OPENSSL_NO_RC4
382         RC4_KEY rc4_ks;
383 #endif
384 #ifndef OPENSSL_NO_RC5
385         RC5_32_KEY rc5_ks;
386 #endif
387 #ifndef OPENSSL_NO_RC2
388         RC2_KEY rc2_ks;
389 #endif
390 #ifndef OPENSSL_NO_IDEA
391         IDEA_KEY_SCHEDULE idea_ks;
392 #endif
393 #ifndef OPENSSL_NO_BF
394         BF_KEY bf_ks;
395 #endif
396 #ifndef OPENSSL_NO_CAST
397         CAST_KEY cast_ks;
398 #endif
399         static unsigned char key16[16]=
400                 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
401                  0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
402         unsigned char iv[8];
403 #ifndef OPENSSL_NO_DES
404         DES_cblock *buf_as_des_cblock = NULL;
405         static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
406         static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
407         static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
408         DES_key_schedule sch;
409         DES_key_schedule sch2;
410         DES_key_schedule sch3;
411 #endif
412 #define D_MD2           0
413 #define D_MDC2          1
414 #define D_MD4           2
415 #define D_MD5           3
416 #define D_HMAC          4
417 #define D_SHA1          5
418 #define D_RMD160        6
419 #define D_RC4           7
420 #define D_CBC_DES       8
421 #define D_EDE3_DES      9
422 #define D_CBC_IDEA      10
423 #define D_CBC_RC2       11
424 #define D_CBC_RC5       12
425 #define D_CBC_BF        13
426 #define D_CBC_CAST      14
427 #define D_EVP           15
428         double d=0;
429         long c[ALGOR_NUM][SIZE_NUM];
430 #define R_DSA_512       0
431 #define R_DSA_1024      1
432 #define R_DSA_2048      2
433 #define R_RSA_512       0
434 #define R_RSA_1024      1
435 #define R_RSA_2048      2
436 #define R_RSA_4096      3
437 #ifndef OPENSSL_NO_RSA
438         RSA *rsa_key[RSA_NUM];
439         long rsa_c[RSA_NUM][2];
440         static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
441         static unsigned char *rsa_data[RSA_NUM]=
442                 {test512,test1024,test2048,test4096};
443         static int rsa_data_length[RSA_NUM]={
444                 sizeof(test512),sizeof(test1024),
445                 sizeof(test2048),sizeof(test4096)};
446 #endif
447 #ifndef OPENSSL_NO_DSA
448         DSA *dsa_key[DSA_NUM];
449         long dsa_c[DSA_NUM][2];
450         static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
451 #endif
452         int rsa_doit[RSA_NUM];
453         int dsa_doit[DSA_NUM];
454         int doit[ALGOR_NUM];
455         int pr_header=0;
456         const EVP_CIPHER *evp_cipher=NULL;
457         const EVP_MD *evp_md=NULL;
458         int decrypt=0;
459 #ifdef HAVE_FORK
460         int multi=0;
461 #endif
462
463 #ifndef TIMES
464         usertime=-1;
465 #endif
466
467         apps_startup();
468         memset(results, 0, sizeof(results));
469 #ifndef OPENSSL_NO_DSA
470         memset(dsa_key,0,sizeof(dsa_key));
471 #endif
472
473         if (bio_err == NULL)
474                 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
475                         BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
476
477 #ifndef OPENSSL_NO_RSA
478         memset(rsa_key,0,sizeof(rsa_key));
479         for (i=0; i<RSA_NUM; i++)
480                 rsa_key[i]=NULL;
481 #endif
482
483         if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
484                 {
485                 BIO_printf(bio_err,"out of memory\n");
486                 goto end;
487                 }
488 #ifndef OPENSSL_NO_DES
489         buf_as_des_cblock = (des_cblock *)buf;
490 #endif
491         if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
492                 {
493                 BIO_printf(bio_err,"out of memory\n");
494                 goto end;
495                 }
496
497         memset(c,0,sizeof(c));
498         memset(iv,0,sizeof(iv));
499
500         for (i=0; i<ALGOR_NUM; i++)
501                 doit[i]=0;
502         for (i=0; i<RSA_NUM; i++)
503                 rsa_doit[i]=0;
504         for (i=0; i<DSA_NUM; i++)
505                 dsa_doit[i]=0;
506         
507         j=0;
508         argc--;
509         argv++;
510         while (argc)
511                 {
512                 if      ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
513                         {
514                         usertime = 0;
515                         j--;    /* Otherwise, -elapsed gets confused with
516                                    an algorithm. */
517                         }
518                 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
519                         {
520                         argc--;
521                         argv++;
522                         if(argc == 0)
523                                 {
524                                 BIO_printf(bio_err,"no EVP given\n");
525                                 goto end;
526                                 }
527                         evp_cipher=EVP_get_cipherbyname(*argv);
528                         if(!evp_cipher)
529                                 {
530                                 evp_md=EVP_get_digestbyname(*argv);
531                                 }
532                         if(!evp_cipher && !evp_md)
533                                 {
534                                 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
535                                 goto end;
536                                 }
537                         doit[D_EVP]=1;
538                         }
539                 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
540                         {
541                         decrypt=1;
542                         j--;    /* Otherwise, -elapsed gets confused with
543                                    an algorithm. */
544                         }
545                 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
546                         {
547                         argc--;
548                         argv++;
549                         if(argc == 0)
550                                 {
551                                 BIO_printf(bio_err,"no engine given\n");
552                                 goto end;
553                                 }
554                         e = setup_engine(bio_err, *argv, 0);
555                         /* j will be increased again further down.  We just
556                            don't want speed to confuse an engine with an
557                            algorithm, especially when none is given (which
558                            means all of them should be run) */
559                         j--;
560                         }
561 #ifdef HAVE_FORK
562                 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
563                         {
564                         argc--;
565                         argv++;
566                         if(argc == 0)
567                                 {
568                                 BIO_printf(bio_err,"no multi count given\n");
569                                 goto end;
570                                 }
571                         multi=atoi(argv[0]);
572                         if(multi <= 0)
573                             {
574                                 BIO_printf(bio_err,"bad multi count\n");
575                                 goto end;
576                                 }                               
577                         j--;    /* Otherwise, -mr gets confused with
578                                    an algorithm. */
579                         }
580 #endif
581                 else if (argc > 0 && !strcmp(*argv,"-mr"))
582                         {
583                         mr=1;
584                         j--;    /* Otherwise, -mr gets confused with
585                                    an algorithm. */
586                         }
587                 else
588 #ifndef OPENSSL_NO_MD2
589                 if      (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
590                 else
591 #endif
592 #ifndef OPENSSL_NO_MDC2
593                         if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
594                 else
595 #endif
596 #ifndef OPENSSL_NO_MD4
597                         if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
598                 else
599 #endif
600 #ifndef OPENSSL_NO_MD5
601                         if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
602                 else
603 #endif
604 #ifndef OPENSSL_NO_MD5
605                         if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
606                 else
607 #endif
608 #ifndef OPENSSL_NO_SHA
609                         if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
610                 else
611                         if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
612                 else
613 #endif
614 #ifndef OPENSSL_NO_RIPEMD
615                         if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
616                 else
617                         if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
618                 else
619                         if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
620                 else
621 #endif
622 #ifndef OPENSSL_NO_RC4
623                         if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
624                 else 
625 #endif
626 #ifndef OPENSSL_NO_DES
627                         if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
628                 else    if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
629                 else
630 #endif
631 #ifndef OPENSSL_NO_RSA
632 #if 0 /* was: #ifdef RSAref */
633                         if (strcmp(*argv,"rsaref") == 0) 
634                         {
635                         RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
636                         j--;
637                         }
638                 else
639 #endif
640 #ifndef RSA_NULL
641                         if (strcmp(*argv,"openssl") == 0) 
642                         {
643                         RSA_set_default_method(RSA_PKCS1_SSLeay());
644                         j--;
645                         }
646                 else
647 #endif
648 #endif /* !OPENSSL_NO_RSA */
649                      if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
650                 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
651                 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
652                 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
653                 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
654                 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
655                 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
656                 else
657 #ifndef OPENSSL_NO_RC2
658                      if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
659                 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
660                 else
661 #endif
662 #ifndef OPENSSL_NO_RC5
663                      if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
664                 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
665                 else
666 #endif
667 #ifndef OPENSSL_NO_IDEA
668                      if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
669                 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
670                 else
671 #endif
672 #ifndef OPENSSL_NO_BF
673                      if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
674                 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
675                 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
676                 else
677 #endif
678 #ifndef OPENSSL_NO_CAST
679                      if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
680                 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
681                 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
682                 else
683 #endif
684 #ifndef OPENSSL_NO_DES
685                         if (strcmp(*argv,"des") == 0)
686                         {
687                         doit[D_CBC_DES]=1;
688                         doit[D_EDE3_DES]=1;
689                         }
690                 else
691 #endif
692 #ifndef OPENSSL_NO_RSA
693                         if (strcmp(*argv,"rsa") == 0)
694                         {
695                         rsa_doit[R_RSA_512]=1;
696                         rsa_doit[R_RSA_1024]=1;
697                         rsa_doit[R_RSA_2048]=1;
698                         rsa_doit[R_RSA_4096]=1;
699                         }
700                 else
701 #endif
702 #ifndef OPENSSL_NO_DSA
703                         if (strcmp(*argv,"dsa") == 0)
704                         {
705                         dsa_doit[R_DSA_512]=1;
706                         dsa_doit[R_DSA_1024]=1;
707                         }
708                 else
709 #endif
710                         {
711                         BIO_printf(bio_err,"Error: bad option or value\n");
712                         BIO_printf(bio_err,"\n");
713                         BIO_printf(bio_err,"Available values:\n");
714 #ifndef OPENSSL_NO_MD2
715                         BIO_printf(bio_err,"md2      ");
716 #endif
717 #ifndef OPENSSL_NO_MDC2
718                         BIO_printf(bio_err,"mdc2     ");
719 #endif
720 #ifndef OPENSSL_NO_MD4
721                         BIO_printf(bio_err,"md4      ");
722 #endif
723 #ifndef OPENSSL_NO_MD5
724                         BIO_printf(bio_err,"md5      ");
725 #ifndef OPENSSL_NO_HMAC
726                         BIO_printf(bio_err,"hmac     ");
727 #endif
728 #endif
729 #ifndef OPENSSL_NO_SHA1
730                         BIO_printf(bio_err,"sha1     ");
731 #endif
732 #ifndef OPENSSL_NO_RIPEMD160
733                         BIO_printf(bio_err,"rmd160");
734 #endif
735 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
736     !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
737     !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
738                         BIO_printf(bio_err,"\n");
739 #endif
740
741 #ifndef OPENSSL_NO_IDEA
742                         BIO_printf(bio_err,"idea-cbc ");
743 #endif
744 #ifndef OPENSSL_NO_RC2
745                         BIO_printf(bio_err,"rc2-cbc  ");
746 #endif
747 #ifndef OPENSSL_NO_RC5
748                         BIO_printf(bio_err,"rc5-cbc  ");
749 #endif
750 #ifndef OPENSSL_NO_BF
751                         BIO_printf(bio_err,"bf-cbc");
752 #endif
753 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
754     !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
755                         BIO_printf(bio_err,"\n");
756 #endif
757
758                         BIO_printf(bio_err,"des-cbc  des-ede3 ");
759 #ifndef OPENSSL_NO_RC4
760                         BIO_printf(bio_err,"rc4");
761 #endif
762                         BIO_printf(bio_err,"\n");
763
764 #ifndef OPENSSL_NO_RSA
765                         BIO_printf(bio_err,"rsa512   rsa1024  rsa2048  rsa4096\n");
766 #endif
767
768 #ifndef OPENSSL_NO_DSA
769                         BIO_printf(bio_err,"dsa512   dsa1024  dsa2048\n");
770 #endif
771
772 #ifndef OPENSSL_NO_IDEA
773                         BIO_printf(bio_err,"idea     ");
774 #endif
775 #ifndef OPENSSL_NO_RC2
776                         BIO_printf(bio_err,"rc2      ");
777 #endif
778 #ifndef OPENSSL_NO_DES
779                         BIO_printf(bio_err,"des      ");
780 #endif
781 #ifndef OPENSSL_NO_RSA
782                         BIO_printf(bio_err,"rsa      ");
783 #endif
784 #ifndef OPENSSL_NO_BF
785                         BIO_printf(bio_err,"blowfish");
786 #endif
787 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
788     !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
789     !defined(OPENSSL_NO_BF)
790                         BIO_printf(bio_err,"\n");
791 #endif
792
793                         BIO_printf(bio_err,"\n");
794                         BIO_printf(bio_err,"Available options:\n");
795 #ifdef TIMES
796                         BIO_printf(bio_err,"-elapsed        measure time in real time instead of CPU user time.\n");
797 #endif
798                         BIO_printf(bio_err,"-engine e       use engine e, possibly a hardware device.\n");
799                         BIO_printf(bio_err,"-evp e          use EVP e.\n");
800                         BIO_printf(bio_err,"-decrypt        time decryption instead of encryption (only EVP).\n");
801                         BIO_printf(bio_err,"-mr             produce machine readable output.\n");
802 #ifdef HAVE_FORK
803                         BIO_printf(bio_err,"-multi n        run n benchmarks in parallel.\n");
804 #endif
805                         goto end;
806                         }
807                 argc--;
808                 argv++;
809                 j++;
810                 }
811
812 #ifdef HAVE_FORK
813         if(multi && do_multi(multi))
814                 goto show_res;
815 #endif
816
817         if (j == 0)
818                 {
819                 for (i=0; i<ALGOR_NUM; i++)
820                         {
821                         if (i != D_EVP)
822                                 doit[i]=1;
823                         }
824                 for (i=0; i<RSA_NUM; i++)
825                         rsa_doit[i]=1;
826                 for (i=0; i<DSA_NUM; i++)
827                         dsa_doit[i]=1;
828                 }
829         for (i=0; i<ALGOR_NUM; i++)
830                 if (doit[i]) pr_header++;
831
832         if (usertime == 0 && !mr)
833                 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
834         if (usertime <= 0 && !mr)
835                 {
836                 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
837                 BIO_printf(bio_err,"program when this computer is idle.\n");
838                 }
839
840 #ifndef OPENSSL_NO_RSA
841         for (i=0; i<RSA_NUM; i++)
842                 {
843                 const unsigned char *p;
844
845                 p=rsa_data[i];
846                 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
847                 if (rsa_key[i] == NULL)
848                         {
849                         BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
850                         goto end;
851                         }
852 #if 0
853                 else
854                         {
855                         BIO_printf(bio_err,mr ? "+RK:%d:"
856                                    : "Loaded RSA key, %d bit modulus and e= 0x",
857                                    BN_num_bits(rsa_key[i]->n));
858                         BN_print(bio_err,rsa_key[i]->e);
859                         BIO_printf(bio_err,"\n");
860                         }
861 #endif
862                 }
863 #endif
864
865 #ifndef OPENSSL_NO_DSA
866         dsa_key[0]=get_dsa512();
867         dsa_key[1]=get_dsa1024();
868         dsa_key[2]=get_dsa2048();
869 #endif
870
871 #ifndef OPENSSL_NO_DES
872         DES_set_key_unchecked(&key,&sch);
873         DES_set_key_unchecked(&key2,&sch2);
874         DES_set_key_unchecked(&key3,&sch3);
875 #endif
876 #ifndef OPENSSL_NO_IDEA
877         idea_set_encrypt_key(key16,&idea_ks);
878 #endif
879 #ifndef OPENSSL_NO_RC4
880         RC4_set_key(&rc4_ks,16,key16);
881 #endif
882 #ifndef OPENSSL_NO_RC2
883         RC2_set_key(&rc2_ks,16,key16,128);
884 #endif
885 #ifndef OPENSSL_NO_RC5
886         RC5_32_set_key(&rc5_ks,16,key16,12);
887 #endif
888 #ifndef OPENSSL_NO_BF
889         BF_set_key(&bf_ks,16,key16);
890 #endif
891 #ifndef OPENSSL_NO_CAST
892         CAST_set_key(&cast_ks,16,key16);
893 #endif
894 #ifndef OPENSSL_NO_RSA
895         memset(rsa_c,0,sizeof(rsa_c));
896 #endif
897 #ifndef SIGALRM
898 #ifndef OPENSSL_NO_DES
899         BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
900         count=10;
901         do      {
902                 long i;
903                 count*=2;
904                 Time_F(START);
905                 for (i=count; i; i--)
906                         DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
907                                 &sch,DES_ENCRYPT);
908                 d=Time_F(STOP);
909                 } while (d <3);
910         save_count=count;
911         c[D_MD2][0]=count/10;
912         c[D_MDC2][0]=count/10;
913         c[D_MD4][0]=count;
914         c[D_MD5][0]=count;
915         c[D_HMAC][0]=count;
916         c[D_SHA1][0]=count;
917         c[D_RMD160][0]=count;
918         c[D_RC4][0]=count*5;
919         c[D_CBC_DES][0]=count;
920         c[D_EDE3_DES][0]=count/3;
921         c[D_CBC_IDEA][0]=count;
922         c[D_CBC_RC2][0]=count;
923         c[D_CBC_RC5][0]=count;
924         c[D_CBC_BF][0]=count;
925         c[D_CBC_CAST][0]=count;
926
927         for (i=1; i<SIZE_NUM; i++)
928                 {
929                 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
930                 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
931                 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
932                 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
933                 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
934                 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
935                 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
936                 }
937         for (i=1; i<SIZE_NUM; i++)
938                 {
939                 long l0,l1;
940
941                 l0=(long)lengths[i-1];
942                 l1=(long)lengths[i];
943                 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
944                 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
945                 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
946                 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
947                 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
948                 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
949                 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
950                 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
951                 }
952 #ifndef OPENSSL_NO_RSA
953         rsa_c[R_RSA_512][0]=count/2000;
954         rsa_c[R_RSA_512][1]=count/400;
955         for (i=1; i<RSA_NUM; i++)
956                 {
957                 rsa_c[i][0]=rsa_c[i-1][0]/8;
958                 rsa_c[i][1]=rsa_c[i-1][1]/4;
959                 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
960                         rsa_doit[i]=0;
961                 else
962                         {
963                         if (rsa_c[i][0] == 0)
964                                 {
965                                 rsa_c[i][0]=1;
966                                 rsa_c[i][1]=20;
967                                 }
968                         }                               
969                 }
970 #endif
971
972 #ifndef OPENSSL_NO_DSA
973         dsa_c[R_DSA_512][0]=count/1000;
974         dsa_c[R_DSA_512][1]=count/1000/2;
975         for (i=1; i<DSA_NUM; i++)
976                 {
977                 dsa_c[i][0]=dsa_c[i-1][0]/4;
978                 dsa_c[i][1]=dsa_c[i-1][1]/4;
979                 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
980                         dsa_doit[i]=0;
981                 else
982                         {
983                         if (dsa_c[i] == 0)
984                                 {
985                                 dsa_c[i][0]=1;
986                                 dsa_c[i][1]=1;
987                                 }
988                         }                               
989                 }
990 #endif
991
992 #define COND(d) (count < (d))
993 #define COUNT(d) (d)
994 #else
995 /* not worth fixing */
996 # error "You cannot disable DES on systems without SIGALRM."
997 #endif /* OPENSSL_NO_DES */
998 #else
999 #define COND(c) (run)
1000 #define COUNT(d) (count)
1001         signal(SIGALRM,sig_done);
1002 #endif /* SIGALRM */
1003
1004 #ifndef OPENSSL_NO_MD2
1005         if (doit[D_MD2])
1006                 {
1007                 for (j=0; j<SIZE_NUM; j++)
1008                         {
1009                         print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1010                         Time_F(START);
1011                         for (count=0,run=1; COND(c[D_MD2][j]); count++)
1012                                 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1013                         d=Time_F(STOP);
1014                         print_result(D_MD2,j,count,d);
1015                         }
1016                 }
1017 #endif
1018 #ifndef OPENSSL_NO_MDC2
1019         if (doit[D_MDC2])
1020                 {
1021                 for (j=0; j<SIZE_NUM; j++)
1022                         {
1023                         print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1024                         Time_F(START);
1025                         for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1026                                 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1027                         d=Time_F(STOP);
1028                         print_result(D_MDC2,j,count,d);
1029                         }
1030                 }
1031 #endif
1032
1033 #ifndef OPENSSL_NO_MD4
1034         if (doit[D_MD4])
1035                 {
1036                 for (j=0; j<SIZE_NUM; j++)
1037                         {
1038                         print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1039                         Time_F(START);
1040                         for (count=0,run=1; COND(c[D_MD4][j]); count++)
1041                                 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1042                         d=Time_F(STOP);
1043                         print_result(D_MD4,j,count,d);
1044                         }
1045                 }
1046 #endif
1047
1048 #ifndef OPENSSL_NO_MD5
1049         if (doit[D_MD5])
1050                 {
1051                 for (j=0; j<SIZE_NUM; j++)
1052                         {
1053                         print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1054                         Time_F(START);
1055                         for (count=0,run=1; COND(c[D_MD5][j]); count++)
1056                                 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1057                         d=Time_F(STOP);
1058                         print_result(D_MD5,j,count,d);
1059                         }
1060                 }
1061 #endif
1062
1063 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1064         if (doit[D_HMAC])
1065                 {
1066                 HMAC_CTX hctx;
1067
1068                 HMAC_CTX_init(&hctx);
1069                 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1070                              16,EVP_md5());
1071
1072                 for (j=0; j<SIZE_NUM; j++)
1073                         {
1074                         print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1075                         Time_F(START);
1076                         for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1077                                 {
1078                                 HMAC_Init_ex(&hctx,NULL,0,NULL);
1079                                 HMAC_Update(&hctx,buf,lengths[j]);
1080                                 HMAC_Final(&hctx,&(hmac[0]),NULL);
1081                                 }
1082                         d=Time_F(STOP);
1083                         print_result(D_HMAC,j,count,d);
1084                         }
1085                 HMAC_CTX_cleanup(&hctx);
1086                 }
1087 #endif
1088 #ifndef OPENSSL_NO_SHA
1089         if (doit[D_SHA1])
1090                 {
1091                 for (j=0; j<SIZE_NUM; j++)
1092                         {
1093                         print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1094                         Time_F(START);
1095                         for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1096                                 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1097                         d=Time_F(STOP);
1098                         print_result(D_SHA1,j,count,d);
1099                         }
1100                 }
1101 #endif
1102 #ifndef OPENSSL_NO_RIPEMD
1103         if (doit[D_RMD160])
1104                 {
1105                 for (j=0; j<SIZE_NUM; j++)
1106                         {
1107                         print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1108                         Time_F(START);
1109                         for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1110                                 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1111                         d=Time_F(STOP);
1112                         print_result(D_RMD160,j,count,d);
1113                         }
1114                 }
1115 #endif
1116 #ifndef OPENSSL_NO_RC4
1117         if (doit[D_RC4])
1118                 {
1119                 for (j=0; j<SIZE_NUM; j++)
1120                         {
1121                         print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1122                         Time_F(START);
1123                         for (count=0,run=1; COND(c[D_RC4][j]); count++)
1124                                 RC4(&rc4_ks,(unsigned int)lengths[j],
1125                                         buf,buf);
1126                         d=Time_F(STOP);
1127                         print_result(D_RC4,j,count,d);
1128                         }
1129                 }
1130 #endif
1131 #ifndef OPENSSL_NO_DES
1132         if (doit[D_CBC_DES])
1133                 {
1134                 for (j=0; j<SIZE_NUM; j++)
1135                         {
1136                         print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1137                         Time_F(START);
1138                         for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1139                                 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1140                                                  &iv,DES_ENCRYPT);
1141                         d=Time_F(STOP);
1142                         print_result(D_CBC_DES,j,count,d);
1143                         }
1144                 }
1145
1146         if (doit[D_EDE3_DES])
1147                 {
1148                 for (j=0; j<SIZE_NUM; j++)
1149                         {
1150                         print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1151                         Time_F(START);
1152                         for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1153                                 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1154                                                      &sch,&sch2,&sch3,
1155                                                      &iv,DES_ENCRYPT);
1156                         d=Time_F(STOP);
1157                         print_result(D_EDE3_DES,j,count,d);
1158                         }
1159                 }
1160 #endif
1161 #ifndef OPENSSL_NO_IDEA
1162         if (doit[D_CBC_IDEA])
1163                 {
1164                 for (j=0; j<SIZE_NUM; j++)
1165                         {
1166                         print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1167                         Time_F(START);
1168                         for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1169                                 idea_cbc_encrypt(buf,buf,
1170                                         (unsigned long)lengths[j],&idea_ks,
1171                                         iv,IDEA_ENCRYPT);
1172                         d=Time_F(STOP);
1173                         print_result(D_CBC_IDEA,j,count,d);
1174                         }
1175                 }
1176 #endif
1177 #ifndef OPENSSL_NO_RC2
1178         if (doit[D_CBC_RC2])
1179                 {
1180                 for (j=0; j<SIZE_NUM; j++)
1181                         {
1182                         print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1183                         Time_F(START);
1184                         for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1185                                 RC2_cbc_encrypt(buf,buf,
1186                                         (unsigned long)lengths[j],&rc2_ks,
1187                                         iv,RC2_ENCRYPT);
1188                         d=Time_F(STOP);
1189                         print_result(D_CBC_RC2,j,count,d);
1190                         }
1191                 }
1192 #endif
1193 #ifndef OPENSSL_NO_RC5
1194         if (doit[D_CBC_RC5])
1195                 {
1196                 for (j=0; j<SIZE_NUM; j++)
1197                         {
1198                         print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1199                         Time_F(START);
1200                         for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1201                                 RC5_32_cbc_encrypt(buf,buf,
1202                                         (unsigned long)lengths[j],&rc5_ks,
1203                                         iv,RC5_ENCRYPT);
1204                         d=Time_F(STOP);
1205                         print_result(D_CBC_RC5,j,count,d);
1206                         }
1207                 }
1208 #endif
1209 #ifndef OPENSSL_NO_BF
1210         if (doit[D_CBC_BF])
1211                 {
1212                 for (j=0; j<SIZE_NUM; j++)
1213                         {
1214                         print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1215                         Time_F(START);
1216                         for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1217                                 BF_cbc_encrypt(buf,buf,
1218                                         (unsigned long)lengths[j],&bf_ks,
1219                                         iv,BF_ENCRYPT);
1220                         d=Time_F(STOP);
1221                         print_result(D_CBC_BF,j,count,d);
1222                         }
1223                 }
1224 #endif
1225 #ifndef OPENSSL_NO_CAST
1226         if (doit[D_CBC_CAST])
1227                 {
1228                 for (j=0; j<SIZE_NUM; j++)
1229                         {
1230                         print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1231                         Time_F(START);
1232                         for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1233                                 CAST_cbc_encrypt(buf,buf,
1234                                         (unsigned long)lengths[j],&cast_ks,
1235                                         iv,CAST_ENCRYPT);
1236                         d=Time_F(STOP);
1237                         print_result(D_CBC_CAST,j,count,d);
1238                         }
1239                 }
1240 #endif
1241
1242         if (doit[D_EVP])
1243                 {
1244                 for (j=0; j<SIZE_NUM; j++)
1245                         {
1246                         if (evp_cipher)
1247                                 {
1248                                 EVP_CIPHER_CTX ctx;
1249                                 int outl;
1250
1251                                 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1252                                 print_message(names[D_EVP],save_count,
1253                                         lengths[j]);
1254
1255                                 EVP_CIPHER_CTX_init(&ctx);
1256                                 if(decrypt)
1257                                         EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1258                                 else
1259                                         EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1260
1261                                 Time_F(START);
1262                                 if(decrypt)
1263                                         for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1264                                                 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1265                                 else
1266                                         for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1267                                                 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1268                                 if(decrypt)
1269                                         EVP_DecryptFinal_ex(&ctx,buf,&outl);
1270                                 else
1271                                         EVP_EncryptFinal_ex(&ctx,buf,&outl);
1272                                 d=Time_F(STOP);
1273                                 }
1274                         if (evp_md)
1275                                 {
1276                                 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1277                                 print_message(names[D_EVP],save_count,
1278                                         lengths[j]);
1279
1280                                 Time_F(START);
1281                                 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1282                                         EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1283
1284                                 d=Time_F(STOP);
1285                                 }
1286                         print_result(D_EVP,j,count,d);
1287                         }
1288                 }
1289
1290         RAND_pseudo_bytes(buf,36);
1291 #ifndef OPENSSL_NO_RSA
1292         for (j=0; j<RSA_NUM; j++)
1293                 {
1294                 int ret;
1295                 if (!rsa_doit[j]) continue;
1296                 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1297                 if (ret == 0)
1298                         {
1299                         BIO_printf(bio_err,"RSA sign failure.  No RSA sign will be done.\n");
1300                         ERR_print_errors(bio_err);
1301                         rsa_count=1;
1302                         }
1303                 else
1304                         {
1305                         pkey_print_message("private","rsa",
1306                                 rsa_c[j][0],rsa_bits[j],
1307                                 RSA_SECONDS);
1308 /*                      RSA_blinding_on(rsa_key[j],NULL); */
1309                         Time_F(START);
1310                         for (count=0,run=1; COND(rsa_c[j][0]); count++)
1311                                 {
1312                                 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1313                                         &rsa_num, rsa_key[j]);
1314                                 if (ret == 0)
1315                                         {
1316                                         BIO_printf(bio_err,
1317                                                 "RSA sign failure\n");
1318                                         ERR_print_errors(bio_err);
1319                                         count=1;
1320                                         break;
1321                                         }
1322                                 }
1323                         d=Time_F(STOP);
1324                         BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1325                                    : "%ld %d bit private RSA's in %.2fs\n",
1326                                    count,rsa_bits[j],d);
1327                         rsa_results[j][0]=d/(double)count;
1328                         rsa_count=count;
1329                         }
1330
1331 #if 1
1332                 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1333                 if (ret <= 0)
1334                         {
1335                         BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
1336                         ERR_print_errors(bio_err);
1337                         rsa_doit[j] = 0;
1338                         }
1339                 else
1340                         {
1341                         pkey_print_message("public","rsa",
1342                                 rsa_c[j][1],rsa_bits[j],
1343                                 RSA_SECONDS);
1344                         Time_F(START);
1345                         for (count=0,run=1; COND(rsa_c[j][1]); count++)
1346                                 {
1347                                 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1348                                         rsa_num, rsa_key[j]);
1349                                 if (ret == 0)
1350                                         {
1351                                         BIO_printf(bio_err,
1352                                                 "RSA verify failure\n");
1353                                         ERR_print_errors(bio_err);
1354                                         count=1;
1355                                         break;
1356                                         }
1357                                 }
1358                         d=Time_F(STOP);
1359                         BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1360                                    : "%ld %d bit public RSA's in %.2fs\n",
1361                                    count,rsa_bits[j],d);
1362                         rsa_results[j][1]=d/(double)count;
1363                         }
1364 #endif
1365
1366                 if (rsa_count <= 1)
1367                         {
1368                         /* if longer than 10s, don't do any more */
1369                         for (j++; j<RSA_NUM; j++)
1370                                 rsa_doit[j]=0;
1371                         }
1372                 }
1373 #endif
1374
1375         RAND_pseudo_bytes(buf,20);
1376 #ifndef OPENSSL_NO_DSA
1377         if (RAND_status() != 1)
1378                 {
1379                 RAND_seed(rnd_seed, sizeof rnd_seed);
1380                 rnd_fake = 1;
1381                 }
1382         for (j=0; j<DSA_NUM; j++)
1383                 {
1384                 unsigned int kk;
1385                 int ret;
1386
1387                 if (!dsa_doit[j]) continue;
1388 /*              DSA_generate_key(dsa_key[j]); */
1389 /*              DSA_sign_setup(dsa_key[j],NULL); */
1390                 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1391                         &kk,dsa_key[j]);
1392                 if (ret == 0)
1393                         {
1394                         BIO_printf(bio_err,"DSA sign failure.  No DSA sign will be done.\n");
1395                         ERR_print_errors(bio_err);
1396                         rsa_count=1;
1397                         }
1398                 else
1399                         {
1400                         pkey_print_message("sign","dsa",
1401                                 dsa_c[j][0],dsa_bits[j],
1402                                 DSA_SECONDS);
1403                         Time_F(START);
1404                         for (count=0,run=1; COND(dsa_c[j][0]); count++)
1405                                 {
1406                                 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1407                                         &kk,dsa_key[j]);
1408                                 if (ret == 0)
1409                                         {
1410                                         BIO_printf(bio_err,
1411                                                 "DSA sign failure\n");
1412                                         ERR_print_errors(bio_err);
1413                                         count=1;
1414                                         break;
1415                                         }
1416                                 }
1417                         d=Time_F(STOP);
1418                         BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1419                                    : "%ld %d bit DSA signs in %.2fs\n",
1420                                    count,dsa_bits[j],d);
1421                         dsa_results[j][0]=d/(double)count;
1422                         rsa_count=count;
1423                         }
1424
1425                 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1426                         kk,dsa_key[j]);
1427                 if (ret <= 0)
1428                         {
1429                         BIO_printf(bio_err,"DSA verify failure.  No DSA verify will be done.\n");
1430                         ERR_print_errors(bio_err);
1431                         dsa_doit[j] = 0;
1432                         }
1433                 else
1434                         {
1435                         pkey_print_message("verify","dsa",
1436                                 dsa_c[j][1],dsa_bits[j],
1437                                 DSA_SECONDS);
1438                         Time_F(START);
1439                         for (count=0,run=1; COND(dsa_c[j][1]); count++)
1440                                 {
1441                                 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1442                                         kk,dsa_key[j]);
1443                                 if (ret <= 0)
1444                                         {
1445                                         BIO_printf(bio_err,
1446                                                 "DSA verify failure\n");
1447                                         ERR_print_errors(bio_err);
1448                                         count=1;
1449                                         break;
1450                                         }
1451                                 }
1452                         d=Time_F(STOP);
1453                         BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1454                                    : "%ld %d bit DSA verify in %.2fs\n",
1455                                    count,dsa_bits[j],d);
1456                         dsa_results[j][1]=d/(double)count;
1457                         }
1458
1459                 if (rsa_count <= 1)
1460                         {
1461                         /* if longer than 10s, don't do any more */
1462                         for (j++; j<DSA_NUM; j++)
1463                                 dsa_doit[j]=0;
1464                         }
1465                 }
1466         if (rnd_fake) RAND_cleanup();
1467 #endif
1468 #ifdef HAVE_FORK
1469 show_res:
1470 #endif
1471         if(!mr)
1472                 {
1473                 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1474         fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1475                 printf("options:");
1476                 printf("%s ",BN_options());
1477 #ifndef OPENSSL_NO_MD2
1478                 printf("%s ",MD2_options());
1479 #endif
1480 #ifndef OPENSSL_NO_RC4
1481                 printf("%s ",RC4_options());
1482 #endif
1483 #ifndef OPENSSL_NO_DES
1484                 printf("%s ",des_options());
1485 #endif
1486 #ifndef OPENSSL_NO_IDEA
1487                 printf("%s ",idea_options());
1488 #endif
1489 #ifndef OPENSSL_NO_BF
1490                 printf("%s ",BF_options());
1491 #endif
1492                 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1493                 printf("available timing options: ");
1494 #ifdef TIMES
1495                 printf("TIMES ");
1496 #endif
1497 #ifdef TIMEB
1498                 printf("TIMEB ");
1499 #endif
1500 #ifdef USE_TOD
1501                 printf("USE_TOD ");
1502 #endif
1503 #ifdef HZ
1504 #define as_string(s) (#s)
1505                 printf("HZ=%g", (double)HZ);
1506 # ifdef _SC_CLK_TCK
1507                 printf(" [sysconf value]");
1508 # endif
1509 #endif
1510                 printf("\n");
1511                 printf("timing function used: %s%s%s%s%s%s%s\n",
1512                        (ftime_used ? "ftime" : ""),
1513                        (ftime_used + times_used > 1 ? "," : ""),
1514                        (times_used ? "times" : ""),
1515                        (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1516                        (gettimeofday_used ? "gettimeofday" : ""),
1517                        (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1518                        (getrusage_used ? "getrusage" : ""));
1519                 }
1520
1521         if (pr_header)
1522                 {
1523                 if(mr)
1524                         fprintf(stdout,"+H");
1525                 else
1526                         {
1527                         fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n"); 
1528                         fprintf(stdout,"type        ");
1529                         }
1530                 for (j=0;  j<SIZE_NUM; j++)
1531                         fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1532                 fprintf(stdout,"\n");
1533                 }
1534
1535         for (k=0; k<ALGOR_NUM; k++)
1536                 {
1537                 if (!doit[k]) continue;
1538                 if(mr)
1539                         fprintf(stdout,"+F:%d:%s",k,names[k]);
1540                 else
1541                         fprintf(stdout,"%-13s",names[k]);
1542                 for (j=0; j<SIZE_NUM; j++)
1543                         {
1544                         if (results[k][j] > 10000 && !mr)
1545                                 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1546                         else
1547                                 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1548                         }
1549                 fprintf(stdout,"\n");
1550                 }
1551 #ifndef OPENSSL_NO_RSA
1552         j=1;
1553         for (k=0; k<RSA_NUM; k++)
1554                 {
1555                 if (!rsa_doit[k]) continue;
1556                 if (j && !mr)
1557                         {
1558                         printf("%18ssign    verify    sign/s verify/s\n"," ");
1559                         j=0;
1560                         }
1561                 if(mr)
1562                         fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1563                                 k,rsa_bits[k],rsa_results[k][0],
1564                                 rsa_results[k][1]);
1565                 else
1566                         fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1567                                 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1568                                 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1569                 }
1570 #endif
1571 #ifndef OPENSSL_NO_DSA
1572         j=1;
1573         for (k=0; k<DSA_NUM; k++)
1574                 {
1575                 if (!dsa_doit[k]) continue;
1576                 if (j && !mr)
1577                         {
1578                         printf("%18ssign    verify    sign/s verify/s\n"," ");
1579                         j=0;
1580                         }
1581                 if(mr)
1582                         fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1583                                 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1584                 else
1585                         fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1586                                 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1587                                 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1588                 }
1589 #endif
1590         mret=0;
1591 end:
1592         ERR_print_errors(bio_err);
1593         if (buf != NULL) OPENSSL_free(buf);
1594         if (buf2 != NULL) OPENSSL_free(buf2);
1595 #ifndef OPENSSL_NO_RSA
1596         for (i=0; i<RSA_NUM; i++)
1597                 if (rsa_key[i] != NULL)
1598                         RSA_free(rsa_key[i]);
1599 #endif
1600 #ifndef OPENSSL_NO_DSA
1601         for (i=0; i<DSA_NUM; i++)
1602                 if (dsa_key[i] != NULL)
1603                         DSA_free(dsa_key[i]);
1604 #endif
1605         apps_shutdown();
1606         EXIT(mret);
1607         }
1608
1609 static void print_message(const char *s, long num, int length)
1610         {
1611 #ifdef SIGALRM
1612         BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1613                    : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1614         (void)BIO_flush(bio_err);
1615         alarm(SECONDS);
1616 #else
1617         BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1618                    : "Doing %s %ld times on %d size blocks: ",s,num,length);
1619         (void)BIO_flush(bio_err);
1620 #endif
1621 #ifdef LINT
1622         num=num;
1623 #endif
1624         }
1625
1626 static void pkey_print_message(char *str, char *str2, long num, int bits,
1627              int tm)
1628         {
1629 #ifdef SIGALRM
1630         BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1631                            : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1632         (void)BIO_flush(bio_err);
1633         alarm(RSA_SECONDS);
1634 #else
1635         BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1636                            : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1637         (void)BIO_flush(bio_err);
1638 #endif
1639 #ifdef LINT
1640         num=num;
1641 #endif
1642         }
1643
1644 static void print_result(int alg,int run_no,int count,double time_used)
1645         {
1646         BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1647                    : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1648         results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1649         }
1650
1651 static char *sstrsep(char **string, const char *delim)
1652     {
1653     char isdelim[256];
1654     char *token = *string;
1655
1656     if (**string == 0)
1657         return NULL;
1658
1659     memset(isdelim, 0, 256);
1660     isdelim[0] = 1;
1661
1662     while (*delim)
1663         {
1664         isdelim[(unsigned char)(*delim)] = 1;
1665         delim++;
1666         }
1667
1668     while (!isdelim[(unsigned char)(**string)])
1669         {
1670         (*string)++;
1671         }
1672
1673     if (**string)
1674         {
1675         **string = 0;
1676         (*string)++;
1677         }
1678
1679     return token;
1680     }
1681
1682 #ifdef HAVE_FORK
1683 static int do_multi(int multi)
1684         {
1685         int n;
1686         int fd[2];
1687         int *fds;
1688         static char sep[]=":";
1689
1690         fds=malloc(multi*sizeof *fds);
1691         for(n=0 ; n < multi ; ++n)
1692                 {
1693                 pipe(fd);
1694                 if(fork())
1695                         {
1696                         close(fd[1]);
1697                         fds[n]=fd[0];
1698                         }
1699                 else
1700                         {
1701                         close(fd[0]);
1702                         close(1);
1703                         dup(fd[1]);
1704                         close(fd[1]);
1705                         mr=1;
1706                         usertime=0;
1707                         return 0;
1708                         }
1709                 printf("Forked child %d\n",n);
1710                 }
1711
1712         /* for now, assume the pipe is long enough to take all the output */
1713         for(n=0 ; n < multi ; ++n)
1714                 {
1715                 FILE *f;
1716                 char buf[1024];
1717                 char *p;
1718
1719                 f=fdopen(fds[n],"r");
1720                 while(fgets(buf,sizeof buf,f))
1721                         {
1722                         p=strchr(buf,'\n');
1723                         if(p)
1724                                 *p='\0';
1725                         if(buf[0] != '+')
1726                                 {
1727                                 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1728                                                 buf,n);
1729                                 continue;
1730                                 }
1731                         printf("Got: %s from %d\n",buf,n);
1732                         if(!strncmp(buf,"+F:",3))
1733                                 {
1734                                 int alg;
1735                                 int j;
1736
1737                                 p=buf+3;
1738                                 alg=atoi(sstrsep(&p,sep));
1739                                 sstrsep(&p,sep);
1740                                 for(j=0 ; j < SIZE_NUM ; ++j)
1741                                         results[alg][j]+=atof(sstrsep(&p,sep));
1742                                 }
1743                         else if(!strncmp(buf,"+F2:",4))
1744                                 {
1745                                 int k;
1746                                 double d;
1747                                 
1748                                 p=buf+4;
1749                                 k=atoi(sstrsep(&p,sep));
1750                                 sstrsep(&p,sep);
1751
1752                                 d=atof(sstrsep(&p,sep));
1753                                 if(n)
1754                                         rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1755                                 else
1756                                         rsa_results[k][0]=d;
1757
1758                                 d=atof(sstrsep(&p,sep));
1759                                 if(n)
1760                                         rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1761                                 else
1762                                         rsa_results[k][1]=d;
1763                                 }
1764                         else if(!strncmp(buf,"+F2:",4))
1765                                 {
1766                                 int k;
1767                                 double d;
1768                                 
1769                                 p=buf+4;
1770                                 k=atoi(sstrsep(&p,sep));
1771                                 sstrsep(&p,sep);
1772
1773                                 d=atof(sstrsep(&p,sep));
1774                                 if(n)
1775                                         rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1776                                 else
1777                                         rsa_results[k][0]=d;
1778
1779                                 d=atof(sstrsep(&p,sep));
1780                                 if(n)
1781                                         rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1782                                 else
1783                                         rsa_results[k][1]=d;
1784                                 }
1785                         else if(!strncmp(buf,"+F3:",4))
1786                                 {
1787                                 int k;
1788                                 double d;
1789                                 
1790                                 p=buf+4;
1791                                 k=atoi(sstrsep(&p,sep));
1792                                 sstrsep(&p,sep);
1793
1794                                 d=atof(sstrsep(&p,sep));
1795                                 if(n)
1796                                         dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1797                                 else
1798                                         dsa_results[k][0]=d;
1799
1800                                 d=atof(sstrsep(&p,sep));
1801                                 if(n)
1802                                         dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1803                                 else
1804                                         dsa_results[k][1]=d;
1805                                 }
1806                         else if(!strncmp(buf,"+H:",3))
1807                                 {
1808                                 }
1809                         else
1810                                 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);
1811                         }
1812                 }
1813         return 1;
1814         }
1815 #endif