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