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