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