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