1024 is the export key bits limit according to current regulations, not 512.
[oweals/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 #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                         }
777                 else
778 #endif
779                         {
780                         BIO_printf(bio_err,"Error: bad option or value\n");
781                         BIO_printf(bio_err,"\n");
782                         BIO_printf(bio_err,"Available values:\n");
783 #ifndef OPENSSL_NO_MD2
784                         BIO_printf(bio_err,"md2      ");
785 #endif
786 #ifndef OPENSSL_NO_MDC2
787                         BIO_printf(bio_err,"mdc2     ");
788 #endif
789 #ifndef OPENSSL_NO_MD4
790                         BIO_printf(bio_err,"md4      ");
791 #endif
792 #ifndef OPENSSL_NO_MD5
793                         BIO_printf(bio_err,"md5      ");
794 #ifndef OPENSSL_NO_HMAC
795                         BIO_printf(bio_err,"hmac     ");
796 #endif
797 #endif
798 #ifndef OPENSSL_NO_SHA1
799                         BIO_printf(bio_err,"sha1     ");
800 #endif
801 #ifndef OPENSSL_NO_RIPEMD160
802                         BIO_printf(bio_err,"rmd160");
803 #endif
804 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
805     !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
806     !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
807                         BIO_printf(bio_err,"\n");
808 #endif
809
810 #ifndef OPENSSL_NO_IDEA
811                         BIO_printf(bio_err,"idea-cbc ");
812 #endif
813 #ifndef OPENSSL_NO_RC2
814                         BIO_printf(bio_err,"rc2-cbc  ");
815 #endif
816 #ifndef OPENSSL_NO_RC5
817                         BIO_printf(bio_err,"rc5-cbc  ");
818 #endif
819 #ifndef OPENSSL_NO_BF
820                         BIO_printf(bio_err,"bf-cbc");
821 #endif
822 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
823     !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
824                         BIO_printf(bio_err,"\n");
825 #endif
826 #ifndef OPENSSL_NO_DES
827                         BIO_printf(bio_err,"des-cbc  des-ede3 ");
828 #endif
829 #ifndef OPENSSL_NO_AES
830                         BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
831 #endif
832 #ifndef OPENSSL_NO_RC4
833                         BIO_printf(bio_err,"rc4");
834 #endif
835                         BIO_printf(bio_err,"\n");
836
837 #ifndef OPENSSL_NO_RSA
838                         BIO_printf(bio_err,"rsa512   rsa1024  rsa2048  rsa4096\n");
839 #endif
840
841 #ifndef OPENSSL_NO_DSA
842                         BIO_printf(bio_err,"dsa512   dsa1024  dsa2048\n");
843 #endif
844
845 #ifndef OPENSSL_NO_IDEA
846                         BIO_printf(bio_err,"idea     ");
847 #endif
848 #ifndef OPENSSL_NO_RC2
849                         BIO_printf(bio_err,"rc2      ");
850 #endif
851 #ifndef OPENSSL_NO_DES
852                         BIO_printf(bio_err,"des      ");
853 #endif
854 #ifndef OPENSSL_NO_AES
855                         BIO_printf(bio_err,"aes      ");
856 #endif
857 #ifndef OPENSSL_NO_RSA
858                         BIO_printf(bio_err,"rsa      ");
859 #endif
860 #ifndef OPENSSL_NO_BF
861                         BIO_printf(bio_err,"blowfish");
862 #endif
863 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
864     !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
865     !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
866                         BIO_printf(bio_err,"\n");
867 #endif
868
869                         BIO_printf(bio_err,"\n");
870                         BIO_printf(bio_err,"Available options:\n");
871 #if defined(TIMES) || defined(USE_TOD)
872                         BIO_printf(bio_err,"-elapsed        measure time in real time instead of CPU user time.\n");
873 #endif
874 #ifndef OPENSSL_NO_ENGINE
875                         BIO_printf(bio_err,"-engine e       use engine e, possibly a hardware device.\n");
876 #endif
877                         BIO_printf(bio_err,"-evp e          use EVP e.\n");
878                         BIO_printf(bio_err,"-decrypt        time decryption instead of encryption (only EVP).\n");
879                         BIO_printf(bio_err,"-mr             produce machine readable output.\n");
880 #ifdef HAVE_FORK
881                         BIO_printf(bio_err,"-multi n        run n benchmarks in parallel.\n");
882 #endif
883                         goto end;
884                         }
885                 argc--;
886                 argv++;
887                 j++;
888                 }
889
890 #ifdef HAVE_FORK
891         if(multi && do_multi(multi))
892                 goto show_res;
893 #endif
894
895         if (j == 0)
896                 {
897                 for (i=0; i<ALGOR_NUM; i++)
898                         {
899                         if (i != D_EVP)
900                                 doit[i]=1;
901                         }
902                 for (i=0; i<RSA_NUM; i++)
903                         rsa_doit[i]=1;
904                 for (i=0; i<DSA_NUM; i++)
905                         dsa_doit[i]=1;
906                 }
907         for (i=0; i<ALGOR_NUM; i++)
908                 if (doit[i]) pr_header++;
909
910         if (usertime == 0 && !mr)
911                 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
912         if (usertime <= 0 && !mr)
913                 {
914                 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
915                 BIO_printf(bio_err,"program when this computer is idle.\n");
916                 }
917
918 #ifndef OPENSSL_NO_RSA
919         for (i=0; i<RSA_NUM; i++)
920                 {
921                 const unsigned char *p;
922
923                 p=rsa_data[i];
924                 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
925                 if (rsa_key[i] == NULL)
926                         {
927                         BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
928                         goto end;
929                         }
930 #if 0
931                 else
932                         {
933                         BIO_printf(bio_err,mr ? "+RK:%d:"
934                                    : "Loaded RSA key, %d bit modulus and e= 0x",
935                                    BN_num_bits(rsa_key[i]->n));
936                         BN_print(bio_err,rsa_key[i]->e);
937                         BIO_printf(bio_err,"\n");
938                         }
939 #endif
940                 }
941 #endif
942
943 #ifndef OPENSSL_NO_DSA
944         dsa_key[0]=get_dsa512();
945         dsa_key[1]=get_dsa1024();
946         dsa_key[2]=get_dsa2048();
947 #endif
948
949 #ifndef OPENSSL_NO_DES
950         DES_set_key_unchecked(&key,&sch);
951         DES_set_key_unchecked(&key2,&sch2);
952         DES_set_key_unchecked(&key3,&sch3);
953 #endif
954 #ifndef OPENSSL_NO_AES
955         AES_set_encrypt_key(key16,128,&aes_ks1);
956         AES_set_encrypt_key(key24,192,&aes_ks2);
957         AES_set_encrypt_key(key32,256,&aes_ks3);
958 #endif
959 #ifndef OPENSSL_NO_IDEA
960         idea_set_encrypt_key(key16,&idea_ks);
961 #endif
962 #ifndef OPENSSL_NO_RC4
963         RC4_set_key(&rc4_ks,16,key16);
964 #endif
965 #ifndef OPENSSL_NO_RC2
966         RC2_set_key(&rc2_ks,16,key16,128);
967 #endif
968 #ifndef OPENSSL_NO_RC5
969         RC5_32_set_key(&rc5_ks,16,key16,12);
970 #endif
971 #ifndef OPENSSL_NO_BF
972         BF_set_key(&bf_ks,16,key16);
973 #endif
974 #ifndef OPENSSL_NO_CAST
975         CAST_set_key(&cast_ks,16,key16);
976 #endif
977 #ifndef OPENSSL_NO_RSA
978         memset(rsa_c,0,sizeof(rsa_c));
979 #endif
980 #ifndef SIGALRM
981 #ifndef OPENSSL_NO_DES
982         BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
983         count=10;
984         do      {
985                 long i;
986                 count*=2;
987                 Time_F(START);
988                 for (i=count; i; i--)
989                         DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
990                                 &sch,DES_ENCRYPT);
991                 d=Time_F(STOP);
992                 } while (d <3);
993         save_count=count;
994         c[D_MD2][0]=count/10;
995         c[D_MDC2][0]=count/10;
996         c[D_MD4][0]=count;
997         c[D_MD5][0]=count;
998         c[D_HMAC][0]=count;
999         c[D_SHA1][0]=count;
1000         c[D_RMD160][0]=count;
1001         c[D_RC4][0]=count*5;
1002         c[D_CBC_DES][0]=count;
1003         c[D_EDE3_DES][0]=count/3;
1004         c[D_CBC_IDEA][0]=count;
1005         c[D_CBC_RC2][0]=count;
1006         c[D_CBC_RC5][0]=count;
1007         c[D_CBC_BF][0]=count;
1008         c[D_CBC_CAST][0]=count;
1009         c[D_CBC_128_AES][0]=count;
1010         c[D_CBC_192_AES][0]=count;
1011         c[D_CBC_256_AES][0]=count;
1012
1013         for (i=1; i<SIZE_NUM; i++)
1014                 {
1015                 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1016                 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1017                 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1018                 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1019                 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1020                 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1021                 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1022                 }
1023         for (i=1; i<SIZE_NUM; i++)
1024                 {
1025                 long l0,l1;
1026
1027                 l0=(long)lengths[i-1];
1028                 l1=(long)lengths[i];
1029                 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1030                 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1031                 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1032                 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1033                 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1034                 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1035                 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1036                 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1037                 c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
1038                 c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
1039                 c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
1040                 }
1041 #ifndef OPENSSL_NO_RSA
1042         rsa_c[R_RSA_512][0]=count/2000;
1043         rsa_c[R_RSA_512][1]=count/400;
1044         for (i=1; i<RSA_NUM; i++)
1045                 {
1046                 rsa_c[i][0]=rsa_c[i-1][0]/8;
1047                 rsa_c[i][1]=rsa_c[i-1][1]/4;
1048                 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1049                         rsa_doit[i]=0;
1050                 else
1051                         {
1052                         if (rsa_c[i][0] == 0)
1053                                 {
1054                                 rsa_c[i][0]=1;
1055                                 rsa_c[i][1]=20;
1056                                 }
1057                         }                               
1058                 }
1059 #endif
1060
1061 #ifndef OPENSSL_NO_DSA
1062         dsa_c[R_DSA_512][0]=count/1000;
1063         dsa_c[R_DSA_512][1]=count/1000/2;
1064         for (i=1; i<DSA_NUM; i++)
1065                 {
1066                 dsa_c[i][0]=dsa_c[i-1][0]/4;
1067                 dsa_c[i][1]=dsa_c[i-1][1]/4;
1068                 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1069                         dsa_doit[i]=0;
1070                 else
1071                         {
1072                         if (dsa_c[i] == 0)
1073                                 {
1074                                 dsa_c[i][0]=1;
1075                                 dsa_c[i][1]=1;
1076                                 }
1077                         }                               
1078                 }
1079 #endif
1080
1081 #define COND(d) (count < (d))
1082 #define COUNT(d) (d)
1083 #else
1084 /* not worth fixing */
1085 # error "You cannot disable DES on systems without SIGALRM."
1086 #endif /* OPENSSL_NO_DES */
1087 #else
1088 #define COND(c) (run)
1089 #define COUNT(d) (count)
1090         signal(SIGALRM,sig_done);
1091 #endif /* SIGALRM */
1092
1093 #ifndef OPENSSL_NO_MD2
1094         if (doit[D_MD2])
1095                 {
1096                 for (j=0; j<SIZE_NUM; j++)
1097                         {
1098                         print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1099                         Time_F(START);
1100                         for (count=0,run=1; COND(c[D_MD2][j]); count++)
1101                                 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1102                         d=Time_F(STOP);
1103                         print_result(D_MD2,j,count,d);
1104                         }
1105                 }
1106 #endif
1107 #ifndef OPENSSL_NO_MDC2
1108         if (doit[D_MDC2])
1109                 {
1110                 for (j=0; j<SIZE_NUM; j++)
1111                         {
1112                         print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1113                         Time_F(START);
1114                         for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1115                                 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1116                         d=Time_F(STOP);
1117                         print_result(D_MDC2,j,count,d);
1118                         }
1119                 }
1120 #endif
1121
1122 #ifndef OPENSSL_NO_MD4
1123         if (doit[D_MD4])
1124                 {
1125                 for (j=0; j<SIZE_NUM; j++)
1126                         {
1127                         print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1128                         Time_F(START);
1129                         for (count=0,run=1; COND(c[D_MD4][j]); count++)
1130                                 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1131                         d=Time_F(STOP);
1132                         print_result(D_MD4,j,count,d);
1133                         }
1134                 }
1135 #endif
1136
1137 #ifndef OPENSSL_NO_MD5
1138         if (doit[D_MD5])
1139                 {
1140                 for (j=0; j<SIZE_NUM; j++)
1141                         {
1142                         print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1143                         Time_F(START);
1144                         for (count=0,run=1; COND(c[D_MD5][j]); count++)
1145                                 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1146                         d=Time_F(STOP);
1147                         print_result(D_MD5,j,count,d);
1148                         }
1149                 }
1150 #endif
1151
1152 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1153         if (doit[D_HMAC])
1154                 {
1155                 HMAC_CTX hctx;
1156
1157                 HMAC_CTX_init(&hctx);
1158                 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1159                         16,EVP_md5(), NULL);
1160
1161                 for (j=0; j<SIZE_NUM; j++)
1162                         {
1163                         print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1164                         Time_F(START);
1165                         for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1166                                 {
1167                                 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1168                                 HMAC_Update(&hctx,buf,lengths[j]);
1169                                 HMAC_Final(&hctx,&(hmac[0]),NULL);
1170                                 }
1171                         d=Time_F(STOP);
1172                         print_result(D_HMAC,j,count,d);
1173                         }
1174                 HMAC_CTX_cleanup(&hctx);
1175                 }
1176 #endif
1177 #ifndef OPENSSL_NO_SHA
1178         if (doit[D_SHA1])
1179                 {
1180                 for (j=0; j<SIZE_NUM; j++)
1181                         {
1182                         print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1183                         Time_F(START);
1184                         for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1185                                 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1186                         d=Time_F(STOP);
1187                         print_result(D_SHA1,j,count,d);
1188                         }
1189                 }
1190 #endif
1191 #ifndef OPENSSL_NO_RIPEMD
1192         if (doit[D_RMD160])
1193                 {
1194                 for (j=0; j<SIZE_NUM; j++)
1195                         {
1196                         print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1197                         Time_F(START);
1198                         for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1199                                 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1200                         d=Time_F(STOP);
1201                         print_result(D_RMD160,j,count,d);
1202                         }
1203                 }
1204 #endif
1205 #ifndef OPENSSL_NO_RC4
1206         if (doit[D_RC4])
1207                 {
1208                 for (j=0; j<SIZE_NUM; j++)
1209                         {
1210                         print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1211                         Time_F(START);
1212                         for (count=0,run=1; COND(c[D_RC4][j]); count++)
1213                                 RC4(&rc4_ks,(unsigned int)lengths[j],
1214                                         buf,buf);
1215                         d=Time_F(STOP);
1216                         print_result(D_RC4,j,count,d);
1217                         }
1218                 }
1219 #endif
1220 #ifndef OPENSSL_NO_DES
1221         if (doit[D_CBC_DES])
1222                 {
1223                 for (j=0; j<SIZE_NUM; j++)
1224                         {
1225                         print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1226                         Time_F(START);
1227                         for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1228                                 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1229                                                  &DES_iv,DES_ENCRYPT);
1230                         d=Time_F(STOP);
1231                         print_result(D_CBC_DES,j,count,d);
1232                         }
1233                 }
1234
1235         if (doit[D_EDE3_DES])
1236                 {
1237                 for (j=0; j<SIZE_NUM; j++)
1238                         {
1239                         print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1240                         Time_F(START);
1241                         for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1242                                 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1243                                                      &sch,&sch2,&sch3,
1244                                                      &DES_iv,DES_ENCRYPT);
1245                         d=Time_F(STOP);
1246                         print_result(D_EDE3_DES,j,count,d);
1247                         }
1248                 }
1249 #endif
1250 #ifndef OPENSSL_NO_AES
1251         if (doit[D_CBC_128_AES])
1252                 {
1253                 for (j=0; j<SIZE_NUM; j++)
1254                         {
1255                         print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1256                         Time_F(START);
1257                         for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1258                                 AES_cbc_encrypt(buf,buf,
1259                                         (unsigned long)lengths[j],&aes_ks1,
1260                                         iv,AES_ENCRYPT);
1261                         d=Time_F(STOP);
1262                         print_result(D_CBC_128_AES,j,count,d);
1263                         }
1264                 }
1265         if (doit[D_CBC_192_AES])
1266                 {
1267                 for (j=0; j<SIZE_NUM; j++)
1268                         {
1269                         print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1270                         Time_F(START);
1271                         for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1272                                 AES_cbc_encrypt(buf,buf,
1273                                         (unsigned long)lengths[j],&aes_ks2,
1274                                         iv,AES_ENCRYPT);
1275                         d=Time_F(STOP);
1276                         print_result(D_CBC_192_AES,j,count,d);
1277                         }
1278                 }
1279         if (doit[D_CBC_256_AES])
1280                 {
1281                 for (j=0; j<SIZE_NUM; j++)
1282                         {
1283                         print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1284                         Time_F(START);
1285                         for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1286                                 AES_cbc_encrypt(buf,buf,
1287                                         (unsigned long)lengths[j],&aes_ks3,
1288                                         iv,AES_ENCRYPT);
1289                         d=Time_F(STOP);
1290                         print_result(D_CBC_256_AES,j,count,d);
1291                         }
1292                 }
1293
1294 #endif
1295 #ifndef OPENSSL_NO_IDEA
1296         if (doit[D_CBC_IDEA])
1297                 {
1298                 for (j=0; j<SIZE_NUM; j++)
1299                         {
1300                         print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1301                         Time_F(START);
1302                         for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1303                                 idea_cbc_encrypt(buf,buf,
1304                                         (unsigned long)lengths[j],&idea_ks,
1305                                         iv,IDEA_ENCRYPT);
1306                         d=Time_F(STOP);
1307                         print_result(D_CBC_IDEA,j,count,d);
1308                         }
1309                 }
1310 #endif
1311 #ifndef OPENSSL_NO_RC2
1312         if (doit[D_CBC_RC2])
1313                 {
1314                 for (j=0; j<SIZE_NUM; j++)
1315                         {
1316                         print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1317                         Time_F(START);
1318                         for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1319                                 RC2_cbc_encrypt(buf,buf,
1320                                         (unsigned long)lengths[j],&rc2_ks,
1321                                         iv,RC2_ENCRYPT);
1322                         d=Time_F(STOP);
1323                         print_result(D_CBC_RC2,j,count,d);
1324                         }
1325                 }
1326 #endif
1327 #ifndef OPENSSL_NO_RC5
1328         if (doit[D_CBC_RC5])
1329                 {
1330                 for (j=0; j<SIZE_NUM; j++)
1331                         {
1332                         print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1333                         Time_F(START);
1334                         for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1335                                 RC5_32_cbc_encrypt(buf,buf,
1336                                         (unsigned long)lengths[j],&rc5_ks,
1337                                         iv,RC5_ENCRYPT);
1338                         d=Time_F(STOP);
1339                         print_result(D_CBC_RC5,j,count,d);
1340                         }
1341                 }
1342 #endif
1343 #ifndef OPENSSL_NO_BF
1344         if (doit[D_CBC_BF])
1345                 {
1346                 for (j=0; j<SIZE_NUM; j++)
1347                         {
1348                         print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1349                         Time_F(START);
1350                         for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1351                                 BF_cbc_encrypt(buf,buf,
1352                                         (unsigned long)lengths[j],&bf_ks,
1353                                         iv,BF_ENCRYPT);
1354                         d=Time_F(STOP);
1355                         print_result(D_CBC_BF,j,count,d);
1356                         }
1357                 }
1358 #endif
1359 #ifndef OPENSSL_NO_CAST
1360         if (doit[D_CBC_CAST])
1361                 {
1362                 for (j=0; j<SIZE_NUM; j++)
1363                         {
1364                         print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1365                         Time_F(START);
1366                         for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1367                                 CAST_cbc_encrypt(buf,buf,
1368                                         (unsigned long)lengths[j],&cast_ks,
1369                                         iv,CAST_ENCRYPT);
1370                         d=Time_F(STOP);
1371                         print_result(D_CBC_CAST,j,count,d);
1372                         }
1373                 }
1374 #endif
1375
1376         if (doit[D_EVP])
1377                 {
1378                 for (j=0; j<SIZE_NUM; j++)
1379                         {
1380                         if (evp_cipher)
1381                                 {
1382                                 EVP_CIPHER_CTX ctx;
1383                                 int outl;
1384
1385                                 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1386                                 /* -O3 -fschedule-insns messes up an
1387                                  * optimization here!  names[D_EVP]
1388                                  * somehow becomes NULL */
1389                                 print_message(names[D_EVP],save_count,
1390                                         lengths[j]);
1391
1392                                 EVP_CIPHER_CTX_init(&ctx);
1393                                 if(decrypt)
1394                                         EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1395                                 else
1396                                         EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1397
1398                                 Time_F(START);
1399                                 if(decrypt)
1400                                         for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1401                                                 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1402                                 else
1403                                         for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1404                                                 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1405                                 if(decrypt)
1406                                         EVP_DecryptFinal_ex(&ctx,buf,&outl);
1407                                 else
1408                                         EVP_EncryptFinal_ex(&ctx,buf,&outl);
1409                                 d=Time_F(STOP);
1410                                 EVP_CIPHER_CTX_cleanup(&ctx);
1411                                 }
1412                         if (evp_md)
1413                                 {
1414                                 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1415                                 print_message(names[D_EVP],save_count,
1416                                         lengths[j]);
1417
1418                                 Time_F(START);
1419                                 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1420                                         EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1421
1422                                 d=Time_F(STOP);
1423                                 }
1424                         print_result(D_EVP,j,count,d);
1425                         }
1426                 }
1427
1428         RAND_pseudo_bytes(buf,36);
1429 #ifndef OPENSSL_NO_RSA
1430         for (j=0; j<RSA_NUM; j++)
1431                 {
1432                 int ret;
1433                 if (!rsa_doit[j]) continue;
1434                 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1435                 if (ret == 0)
1436                         {
1437                         BIO_printf(bio_err,"RSA sign failure.  No RSA sign will be done.\n");
1438                         ERR_print_errors(bio_err);
1439                         rsa_count=1;
1440                         }
1441                 else
1442                         {
1443                         pkey_print_message("private","rsa",
1444                                 rsa_c[j][0],rsa_bits[j],
1445                                 RSA_SECONDS);
1446 /*                      RSA_blinding_on(rsa_key[j],NULL); */
1447                         Time_F(START);
1448                         for (count=0,run=1; COND(rsa_c[j][0]); count++)
1449                                 {
1450                                 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1451                                         &rsa_num, rsa_key[j]);
1452                                 if (ret == 0)
1453                                         {
1454                                         BIO_printf(bio_err,
1455                                                 "RSA sign failure\n");
1456                                         ERR_print_errors(bio_err);
1457                                         count=1;
1458                                         break;
1459                                         }
1460                                 }
1461                         d=Time_F(STOP);
1462                         BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1463                                    : "%ld %d bit private RSA's in %.2fs\n",
1464                                    count,rsa_bits[j],d);
1465                         rsa_results[j][0]=d/(double)count;
1466                         rsa_count=count;
1467                         }
1468
1469 #if 1
1470                 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1471                 if (ret <= 0)
1472                         {
1473                         BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
1474                         ERR_print_errors(bio_err);
1475                         rsa_doit[j] = 0;
1476                         }
1477                 else
1478                         {
1479                         pkey_print_message("public","rsa",
1480                                 rsa_c[j][1],rsa_bits[j],
1481                                 RSA_SECONDS);
1482                         Time_F(START);
1483                         for (count=0,run=1; COND(rsa_c[j][1]); count++)
1484                                 {
1485                                 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1486                                         rsa_num, rsa_key[j]);
1487                                 if (ret == 0)
1488                                         {
1489                                         BIO_printf(bio_err,
1490                                                 "RSA verify failure\n");
1491                                         ERR_print_errors(bio_err);
1492                                         count=1;
1493                                         break;
1494                                         }
1495                                 }
1496                         d=Time_F(STOP);
1497                         BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1498                                    : "%ld %d bit public RSA's in %.2fs\n",
1499                                    count,rsa_bits[j],d);
1500                         rsa_results[j][1]=d/(double)count;
1501                         }
1502 #endif
1503
1504                 if (rsa_count <= 1)
1505                         {
1506                         /* if longer than 10s, don't do any more */
1507                         for (j++; j<RSA_NUM; j++)
1508                                 rsa_doit[j]=0;
1509                         }
1510                 }
1511 #endif
1512
1513         RAND_pseudo_bytes(buf,20);
1514 #ifndef OPENSSL_NO_DSA
1515         if (RAND_status() != 1)
1516                 {
1517                 RAND_seed(rnd_seed, sizeof rnd_seed);
1518                 rnd_fake = 1;
1519                 }
1520         for (j=0; j<DSA_NUM; j++)
1521                 {
1522                 unsigned int kk;
1523                 int ret;
1524
1525                 if (!dsa_doit[j]) continue;
1526 /*              DSA_generate_key(dsa_key[j]); */
1527 /*              DSA_sign_setup(dsa_key[j],NULL); */
1528                 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1529                         &kk,dsa_key[j]);
1530                 if (ret == 0)
1531                         {
1532                         BIO_printf(bio_err,"DSA sign failure.  No DSA sign will be done.\n");
1533                         ERR_print_errors(bio_err);
1534                         rsa_count=1;
1535                         }
1536                 else
1537                         {
1538                         pkey_print_message("sign","dsa",
1539                                 dsa_c[j][0],dsa_bits[j],
1540                                 DSA_SECONDS);
1541                         Time_F(START);
1542                         for (count=0,run=1; COND(dsa_c[j][0]); count++)
1543                                 {
1544                                 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1545                                         &kk,dsa_key[j]);
1546                                 if (ret == 0)
1547                                         {
1548                                         BIO_printf(bio_err,
1549                                                 "DSA sign failure\n");
1550                                         ERR_print_errors(bio_err);
1551                                         count=1;
1552                                         break;
1553                                         }
1554                                 }
1555                         d=Time_F(STOP);
1556                         BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1557                                    : "%ld %d bit DSA signs in %.2fs\n",
1558                                    count,dsa_bits[j],d);
1559                         dsa_results[j][0]=d/(double)count;
1560                         rsa_count=count;
1561                         }
1562
1563                 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1564                         kk,dsa_key[j]);
1565                 if (ret <= 0)
1566                         {
1567                         BIO_printf(bio_err,"DSA verify failure.  No DSA verify will be done.\n");
1568                         ERR_print_errors(bio_err);
1569                         dsa_doit[j] = 0;
1570                         }
1571                 else
1572                         {
1573                         pkey_print_message("verify","dsa",
1574                                 dsa_c[j][1],dsa_bits[j],
1575                                 DSA_SECONDS);
1576                         Time_F(START);
1577                         for (count=0,run=1; COND(dsa_c[j][1]); count++)
1578                                 {
1579                                 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1580                                         kk,dsa_key[j]);
1581                                 if (ret <= 0)
1582                                         {
1583                                         BIO_printf(bio_err,
1584                                                 "DSA verify failure\n");
1585                                         ERR_print_errors(bio_err);
1586                                         count=1;
1587                                         break;
1588                                         }
1589                                 }
1590                         d=Time_F(STOP);
1591                         BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1592                                    : "%ld %d bit DSA verify in %.2fs\n",
1593                                    count,dsa_bits[j],d);
1594                         dsa_results[j][1]=d/(double)count;
1595                         }
1596
1597                 if (rsa_count <= 1)
1598                         {
1599                         /* if longer than 10s, don't do any more */
1600                         for (j++; j<DSA_NUM; j++)
1601                                 dsa_doit[j]=0;
1602                         }
1603                 }
1604         if (rnd_fake) RAND_cleanup();
1605 #endif
1606 #ifdef HAVE_FORK
1607 show_res:
1608 #endif
1609         if(!mr)
1610                 {
1611                 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1612         fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1613                 printf("options:");
1614                 printf("%s ",BN_options());
1615 #ifndef OPENSSL_NO_MD2
1616                 printf("%s ",MD2_options());
1617 #endif
1618 #ifndef OPENSSL_NO_RC4
1619                 printf("%s ",RC4_options());
1620 #endif
1621 #ifndef OPENSSL_NO_DES
1622                 printf("%s ",DES_options());
1623 #endif
1624 #ifndef OPENSSL_NO_AES
1625                 printf("%s ",AES_options());
1626 #endif
1627 #ifndef OPENSSL_NO_IDEA
1628                 printf("%s ",idea_options());
1629 #endif
1630 #ifndef OPENSSL_NO_BF
1631                 printf("%s ",BF_options());
1632 #endif
1633                 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1634                 printf("available timing options: ");
1635 #ifdef TIMES
1636                 printf("TIMES ");
1637 #endif
1638 #ifdef TIMEB
1639                 printf("TIMEB ");
1640 #endif
1641 #ifdef USE_TOD
1642                 printf("USE_TOD ");
1643 #endif
1644 #ifdef HZ
1645 #define as_string(s) (#s)
1646                 printf("HZ=%g", (double)HZ);
1647 # ifdef _SC_CLK_TCK
1648                 printf(" [sysconf value]");
1649 # endif
1650 #endif
1651                 printf("\n");
1652                 printf("timing function used: %s%s%s%s%s%s%s\n",
1653                        (ftime_used ? "ftime" : ""),
1654                        (ftime_used + times_used > 1 ? "," : ""),
1655                        (times_used ? "times" : ""),
1656                        (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1657                        (gettimeofday_used ? "gettimeofday" : ""),
1658                        (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1659                        (getrusage_used ? "getrusage" : ""));
1660                 }
1661
1662         if (pr_header)
1663                 {
1664                 if(mr)
1665                         fprintf(stdout,"+H");
1666                 else
1667                         {
1668                         fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n"); 
1669                         fprintf(stdout,"type        ");
1670                         }
1671                 for (j=0;  j<SIZE_NUM; j++)
1672                         fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1673                 fprintf(stdout,"\n");
1674                 }
1675
1676         for (k=0; k<ALGOR_NUM; k++)
1677                 {
1678                 if (!doit[k]) continue;
1679                 if(mr)
1680                         fprintf(stdout,"+F:%d:%s",k,names[k]);
1681                 else
1682                         fprintf(stdout,"%-13s",names[k]);
1683                 for (j=0; j<SIZE_NUM; j++)
1684                         {
1685                         if (results[k][j] > 10000 && !mr)
1686                                 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1687                         else
1688                                 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1689                         }
1690                 fprintf(stdout,"\n");
1691                 }
1692 #ifndef OPENSSL_NO_RSA
1693         j=1;
1694         for (k=0; k<RSA_NUM; k++)
1695                 {
1696                 if (!rsa_doit[k]) continue;
1697                 if (j && !mr)
1698                         {
1699                         printf("%18ssign    verify    sign/s verify/s\n"," ");
1700                         j=0;
1701                         }
1702                 if(mr)
1703                         fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1704                                 k,rsa_bits[k],rsa_results[k][0],
1705                                 rsa_results[k][1]);
1706                 else
1707                         fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1708                                 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1709                                 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1710                 }
1711 #endif
1712 #ifndef OPENSSL_NO_DSA
1713         j=1;
1714         for (k=0; k<DSA_NUM; k++)
1715                 {
1716                 if (!dsa_doit[k]) continue;
1717                 if (j && !mr)
1718                         {
1719                         printf("%18ssign    verify    sign/s verify/s\n"," ");
1720                         j=0;
1721                         }
1722                 if(mr)
1723                         fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1724                                 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1725                 else
1726                         fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1727                                 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1728                                 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1729                 }
1730 #endif
1731         mret=0;
1732 end:
1733         ERR_print_errors(bio_err);
1734         if (buf != NULL) OPENSSL_free(buf);
1735         if (buf2 != NULL) OPENSSL_free(buf2);
1736 #ifndef OPENSSL_NO_RSA
1737         for (i=0; i<RSA_NUM; i++)
1738                 if (rsa_key[i] != NULL)
1739                         RSA_free(rsa_key[i]);
1740 #endif
1741 #ifndef OPENSSL_NO_DSA
1742         for (i=0; i<DSA_NUM; i++)
1743                 if (dsa_key[i] != NULL)
1744                         DSA_free(dsa_key[i]);
1745 #endif
1746         apps_shutdown();
1747         OPENSSL_EXIT(mret);
1748         }
1749
1750 static void print_message(const char *s, long num, int length)
1751         {
1752 #ifdef SIGALRM
1753         BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1754                    : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1755         (void)BIO_flush(bio_err);
1756         alarm(SECONDS);
1757 #else
1758         BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1759                    : "Doing %s %ld times on %d size blocks: ",s,num,length);
1760         (void)BIO_flush(bio_err);
1761 #endif
1762 #ifdef LINT
1763         num=num;
1764 #endif
1765         }
1766
1767 static void pkey_print_message(char *str, char *str2, long num, int bits,
1768              int tm)
1769         {
1770 #ifdef SIGALRM
1771         BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1772                            : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1773         (void)BIO_flush(bio_err);
1774         alarm(RSA_SECONDS);
1775 #else
1776         BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1777                            : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1778         (void)BIO_flush(bio_err);
1779 #endif
1780 #ifdef LINT
1781         num=num;
1782 #endif
1783         }
1784
1785 static void print_result(int alg,int run_no,int count,double time_used)
1786         {
1787         BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1788                    : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1789         results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1790         }
1791
1792 static char *sstrsep(char **string, const char *delim)
1793     {
1794     char isdelim[256];
1795     char *token = *string;
1796
1797     if (**string == 0)
1798         return NULL;
1799
1800     memset(isdelim, 0, sizeof isdelim);
1801     isdelim[0] = 1;
1802
1803     while (*delim)
1804         {
1805         isdelim[(unsigned char)(*delim)] = 1;
1806         delim++;
1807         }
1808
1809     while (!isdelim[(unsigned char)(**string)])
1810         {
1811         (*string)++;
1812         }
1813
1814     if (**string)
1815         {
1816         **string = 0;
1817         (*string)++;
1818         }
1819
1820     return token;
1821     }
1822
1823 #ifdef HAVE_FORK
1824 static int do_multi(int multi)
1825         {
1826         int n;
1827         int fd[2];
1828         int *fds;
1829         static char sep[]=":";
1830
1831         fds=malloc(multi*sizeof *fds);
1832         for(n=0 ; n < multi ; ++n)
1833                 {
1834                 pipe(fd);
1835                 if(fork())
1836                         {
1837                         close(fd[1]);
1838                         fds[n]=fd[0];
1839                         }
1840                 else
1841                         {
1842                         close(fd[0]);
1843                         close(1);
1844                         dup(fd[1]);
1845                         close(fd[1]);
1846                         mr=1;
1847                         usertime=0;
1848                         return 0;
1849                         }
1850                 printf("Forked child %d\n",n);
1851                 }
1852
1853         /* for now, assume the pipe is long enough to take all the output */
1854         for(n=0 ; n < multi ; ++n)
1855                 {
1856                 FILE *f;
1857                 char buf[1024];
1858                 char *p;
1859
1860                 f=fdopen(fds[n],"r");
1861                 while(fgets(buf,sizeof buf,f))
1862                         {
1863                         p=strchr(buf,'\n');
1864                         if(p)
1865                                 *p='\0';
1866                         if(buf[0] != '+')
1867                                 {
1868                                 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1869                                                 buf,n);
1870                                 continue;
1871                                 }
1872                         printf("Got: %s from %d\n",buf,n);
1873                         if(!strncmp(buf,"+F:",3))
1874                                 {
1875                                 int alg;
1876                                 int j;
1877
1878                                 p=buf+3;
1879                                 alg=atoi(sstrsep(&p,sep));
1880                                 sstrsep(&p,sep);
1881                                 for(j=0 ; j < SIZE_NUM ; ++j)
1882                                         results[alg][j]+=atof(sstrsep(&p,sep));
1883                                 }
1884                         else if(!strncmp(buf,"+F2:",4))
1885                                 {
1886                                 int k;
1887                                 double d;
1888                                 
1889                                 p=buf+4;
1890                                 k=atoi(sstrsep(&p,sep));
1891                                 sstrsep(&p,sep);
1892
1893                                 d=atof(sstrsep(&p,sep));
1894                                 if(n)
1895                                         rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1896                                 else
1897                                         rsa_results[k][0]=d;
1898
1899                                 d=atof(sstrsep(&p,sep));
1900                                 if(n)
1901                                         rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1902                                 else
1903                                         rsa_results[k][1]=d;
1904                                 }
1905                         else if(!strncmp(buf,"+F2:",4))
1906                                 {
1907                                 int k;
1908                                 double d;
1909                                 
1910                                 p=buf+4;
1911                                 k=atoi(sstrsep(&p,sep));
1912                                 sstrsep(&p,sep);
1913
1914                                 d=atof(sstrsep(&p,sep));
1915                                 if(n)
1916                                         rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1917                                 else
1918                                         rsa_results[k][0]=d;
1919
1920                                 d=atof(sstrsep(&p,sep));
1921                                 if(n)
1922                                         rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1923                                 else
1924                                         rsa_results[k][1]=d;
1925                                 }
1926                         else if(!strncmp(buf,"+F3:",4))
1927                                 {
1928                                 int k;
1929                                 double d;
1930                                 
1931                                 p=buf+4;
1932                                 k=atoi(sstrsep(&p,sep));
1933                                 sstrsep(&p,sep);
1934
1935                                 d=atof(sstrsep(&p,sep));
1936                                 if(n)
1937                                         dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1938                                 else
1939                                         dsa_results[k][0]=d;
1940
1941                                 d=atof(sstrsep(&p,sep));
1942                                 if(n)
1943                                         dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1944                                 else
1945                                         dsa_results[k][1]=d;
1946                                 }
1947                         else if(!strncmp(buf,"+H:",3))
1948                                 {
1949                                 }
1950                         else
1951                                 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);
1952                         }
1953                 }
1954         return 1;
1955         }
1956 #endif
1957 #endif