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