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