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