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