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