Security fixes brought forward from 0.9.7.
[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  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
60  *
61  * Portions of the attached software ("Contribution") are developed by 
62  * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
63  *
64  * The Contribution is licensed pursuant to the OpenSSL open source
65  * license provided above.
66  *
67  * The ECDH and ECDSA speed test software is originally written by 
68  * Sumit Gupta of Sun Microsystems Laboratories.
69  *
70  */
71
72 /* most of this code has been pilfered from my libdes speed.c program */
73
74 #undef SECONDS
75 #define SECONDS         3       
76 #define RSA_SECONDS     10
77 #define DSA_SECONDS     10
78 #define ECDSA_SECONDS   10
79 #define ECDH_SECONDS    10
80
81 /* 11-Sep-92 Andrew Daviel   Support for Silicon Graphics IRIX added */
82 /* 06-Apr-92 Luke Brennan    Support for VMS and add extra signal calls */
83
84 #undef PROG
85 #define PROG speed_main
86
87 #include <stdio.h>
88 #include <stdlib.h>
89 #include <signal.h>
90 #include <string.h>
91 #include <math.h>
92 #include "apps.h"
93 #ifdef OPENSSL_NO_STDIO
94 #define APPS_WIN16
95 #endif
96 #include <openssl/crypto.h>
97 #include <openssl/rand.h>
98 #include <openssl/err.h>
99 #include <openssl/evp.h>
100 #include <openssl/objects.h>
101 #if !defined(OPENSSL_SYS_MSDOS)
102 #include OPENSSL_UNISTD
103 #endif
104
105 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
106 # define USE_TOD
107 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
108 # define TIMES
109 #endif
110 #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 */
111 # define TIMEB
112 #endif
113
114 #ifndef _IRIX
115 # include <time.h>
116 #endif
117 #ifdef TIMES
118 # include <sys/types.h>
119 # include <sys/times.h>
120 #endif
121 #ifdef USE_TOD
122 # include <sys/time.h>
123 # include <sys/resource.h>
124 #endif
125
126 /* Depending on the VMS version, the tms structure is perhaps defined.
127    The __TMS macro will show if it was.  If it wasn't defined, we should
128    undefine TIMES, since that tells the rest of the program how things
129    should be handled.                           -- Richard Levitte */
130 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
131 #undef TIMES
132 #endif
133
134 #ifdef TIMEB
135 #include <sys/timeb.h>
136 #endif
137
138 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS)
139 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
140 #endif
141
142 #if defined(sun) || defined(__ultrix)
143 #define _POSIX_SOURCE
144 #include <limits.h>
145 #include <sys/param.h>
146 #endif
147
148 #ifndef OPENSSL_NO_DES
149 #include <openssl/des.h>
150 #endif
151 #ifndef OPENSSL_NO_AES
152 #include <openssl/aes.h>
153 #endif
154 #ifndef OPENSSL_NO_MD2
155 #include <openssl/md2.h>
156 #endif
157 #ifndef OPENSSL_NO_MDC2
158 #include <openssl/mdc2.h>
159 #endif
160 #ifndef OPENSSL_NO_MD4
161 #include <openssl/md4.h>
162 #endif
163 #ifndef OPENSSL_NO_MD5
164 #include <openssl/md5.h>
165 #endif
166 #ifndef OPENSSL_NO_HMAC
167 #include <openssl/hmac.h>
168 #endif
169 #include <openssl/evp.h>
170 #ifndef OPENSSL_NO_SHA
171 #include <openssl/sha.h>
172 #endif
173 #ifndef OPENSSL_NO_RIPEMD
174 #include <openssl/ripemd.h>
175 #endif
176 #ifndef OPENSSL_NO_RC4
177 #include <openssl/rc4.h>
178 #endif
179 #ifndef OPENSSL_NO_RC5
180 #include <openssl/rc5.h>
181 #endif
182 #ifndef OPENSSL_NO_RC2
183 #include <openssl/rc2.h>
184 #endif
185 #ifndef OPENSSL_NO_IDEA
186 #include <openssl/idea.h>
187 #endif
188 #ifndef OPENSSL_NO_BF
189 #include <openssl/blowfish.h>
190 #endif
191 #ifndef OPENSSL_NO_CAST
192 #include <openssl/cast.h>
193 #endif
194 #ifndef OPENSSL_NO_RSA
195 #include <openssl/rsa.h>
196 #include "./testrsa.h"
197 #endif
198 #include <openssl/x509.h>
199 #ifndef OPENSSL_NO_DSA
200 #include "./testdsa.h"
201 #endif
202 #ifndef OPENSSL_NO_ECDSA
203 #include <openssl/ecdsa.h>
204 #endif
205 #ifndef OPENSSL_NO_ECDH
206 #include <openssl/ecdh.h>
207 #endif
208
209 /* The following if from times(3) man page.  It may need to be changed */
210 #ifndef HZ
211 # ifdef _SC_CLK_TCK
212 #  define HZ ((double)sysconf(_SC_CLK_TCK))
213 # else
214 #  ifndef CLK_TCK
215 #   ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
216 #    define HZ  100.0
217 #   else /* _BSD_CLK_TCK_ */
218 #    define HZ ((double)_BSD_CLK_TCK_)
219 #   endif
220 #  else /* CLK_TCK */
221 #   define HZ ((double)CLK_TCK)
222 #  endif
223 # endif
224 #endif
225
226 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
227 # define HAVE_FORK 1
228 #endif
229
230 #undef BUFSIZE
231 #define BUFSIZE ((long)1024*8+1)
232 int run=0;
233
234 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
235 static int mr=0;
236 static int usertime=1;
237
238 static double Time_F(int s);
239 static void print_message(const char *s,long num,int length);
240 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
241 static void print_result(int alg,int run_no,int count,double time_used);
242 #ifdef HAVE_FORK
243 static int do_multi(int multi);
244 #endif
245
246 #define ALGOR_NUM       19
247 #define SIZE_NUM        5
248 #define RSA_NUM         4
249 #define DSA_NUM         3
250
251 #define EC_NUM       16
252 #define MAX_ECDH_SIZE 256
253
254 static const char *names[ALGOR_NUM]={
255   "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
256   "des cbc","des ede3","idea cbc",
257   "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
258   "aes-128 cbc","aes-192 cbc","aes-256 cbc"};
259 static double results[ALGOR_NUM][SIZE_NUM];
260 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
261 static double rsa_results[RSA_NUM][2];
262 static double dsa_results[DSA_NUM][2];
263 static double ecdsa_results[EC_NUM][2];
264 static double ecdh_results[EC_NUM][1];
265
266
267 #ifdef SIGALRM
268 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
269 #define SIGRETTYPE void
270 #else
271 #define SIGRETTYPE int
272 #endif 
273
274 static SIGRETTYPE sig_done(int sig);
275 static SIGRETTYPE sig_done(int sig)
276         {
277         signal(SIGALRM,sig_done);
278         run=0;
279 #ifdef LINT
280         sig=sig;
281 #endif
282         }
283 #endif
284
285 #define START   0
286 #define STOP    1
287
288 static double Time_F(int s)
289         {
290         double ret;
291
292 #ifdef USE_TOD
293         if(usertime)
294             {
295                 static struct rusage tstart,tend;
296
297                 getrusage_used = 1;
298                 if (s == START)
299                         {
300                         getrusage(RUSAGE_SELF,&tstart);
301                         return(0);
302                         }
303                 else
304                         {
305                         long i;
306
307                         getrusage(RUSAGE_SELF,&tend);
308                         i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
309                         ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
310                           +((double)i)/1000000.0;
311                         return((ret < 0.001)?0.001:ret);
312                         }
313                 }
314         else
315                 {
316                 static struct timeval tstart,tend;
317                 long i;
318
319                 gettimeofday_used = 1;
320                 if (s == START)
321                         {
322                         gettimeofday(&tstart,NULL);
323                         return(0);
324                         }
325                 else
326                         {
327                         gettimeofday(&tend,NULL);
328                         i=(long)tend.tv_usec-(long)tstart.tv_usec;
329                         ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
330                         return((ret < 0.001)?0.001:ret);
331                         }
332                 }
333 #else  /* ndef USE_TOD */
334                 
335 # ifdef TIMES
336         if (usertime)
337                 {
338                 static struct tms tstart,tend;
339
340                 times_used = 1;
341                 if (s == START)
342                         {
343                         times(&tstart);
344                         return(0);
345                         }
346                 else
347                         {
348                         times(&tend);
349                         ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
350                         return((ret < 1e-3)?1e-3:ret);
351                         }
352                 }
353 # endif /* times() */
354 # if defined(TIMES) && defined(TIMEB)
355         else
356 # endif
357 # ifdef OPENSSL_SYS_VXWORKS
358                 {
359                 static unsigned long tick_start, tick_end;
360
361                 if( s == START )
362                         {
363                         tick_start = tickGet();
364                         return 0;
365                         }
366                 else
367                         {
368                         tick_end = tickGet();
369                         ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
370                         return((ret < 0.001)?0.001:ret);
371                         }
372                 }
373 # elif defined(TIMEB)
374                 {
375                 static struct timeb tstart,tend;
376                 long i;
377
378                 ftime_used = 1;
379                 if (s == START)
380                         {
381                         ftime(&tstart);
382                         return(0);
383                         }
384                 else
385                         {
386                         ftime(&tend);
387                         i=(long)tend.millitm-(long)tstart.millitm;
388                         ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
389                         return((ret < 0.001)?0.001:ret);
390                         }
391                 }
392 # endif
393 #endif
394         }
395
396 int MAIN(int, char **);
397
398 int MAIN(int argc, char **argv)
399         {
400         ENGINE *e = NULL;
401         unsigned char *buf=NULL,*buf2=NULL;
402         int mret=1;
403         long count=0,save_count=0;
404         int i,j,k;
405 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
406         long rsa_count;
407 #endif
408 #ifndef OPENSSL_NO_RSA
409         unsigned rsa_num;
410 #endif
411         unsigned char md[EVP_MAX_MD_SIZE];
412 #ifndef OPENSSL_NO_MD2
413         unsigned char md2[MD2_DIGEST_LENGTH];
414 #endif
415 #ifndef OPENSSL_NO_MDC2
416         unsigned char mdc2[MDC2_DIGEST_LENGTH];
417 #endif
418 #ifndef OPENSSL_NO_MD4
419         unsigned char md4[MD4_DIGEST_LENGTH];
420 #endif
421 #ifndef OPENSSL_NO_MD5
422         unsigned char md5[MD5_DIGEST_LENGTH];
423         unsigned char hmac[MD5_DIGEST_LENGTH];
424 #endif
425 #ifndef OPENSSL_NO_SHA
426         unsigned char sha[SHA_DIGEST_LENGTH];
427 #endif
428 #ifndef OPENSSL_NO_RIPEMD
429         unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
430 #endif
431 #ifndef OPENSSL_NO_RC4
432         RC4_KEY rc4_ks;
433 #endif
434 #ifndef OPENSSL_NO_RC5
435         RC5_32_KEY rc5_ks;
436 #endif
437 #ifndef OPENSSL_NO_RC2
438         RC2_KEY rc2_ks;
439 #endif
440 #ifndef OPENSSL_NO_IDEA
441         IDEA_KEY_SCHEDULE idea_ks;
442 #endif
443 #ifndef OPENSSL_NO_BF
444         BF_KEY bf_ks;
445 #endif
446 #ifndef OPENSSL_NO_CAST
447         CAST_KEY cast_ks;
448 #endif
449         static const unsigned char key16[16]=
450                 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
451                  0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
452         static const unsigned char key24[24]=
453                 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
454                  0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
455                  0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
456         static const unsigned char key32[32]=
457                 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
458                  0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
459                  0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
460                  0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
461 #ifndef OPENSSL_NO_AES
462 #define MAX_BLOCK_SIZE 128
463 #else
464 #define MAX_BLOCK_SIZE 64
465 #endif
466         unsigned char DES_iv[8];
467         unsigned char iv[MAX_BLOCK_SIZE/8];
468 #ifndef OPENSSL_NO_DES
469         DES_cblock *buf_as_des_cblock = NULL;
470         static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
471         static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
472         static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
473         DES_key_schedule sch;
474         DES_key_schedule sch2;
475         DES_key_schedule sch3;
476 #endif
477 #ifndef OPENSSL_NO_AES
478         AES_KEY aes_ks1, aes_ks2, aes_ks3;
479 #endif
480 #define D_MD2           0
481 #define D_MDC2          1
482 #define D_MD4           2
483 #define D_MD5           3
484 #define D_HMAC          4
485 #define D_SHA1          5
486 #define D_RMD160        6
487 #define D_RC4           7
488 #define D_CBC_DES       8
489 #define D_EDE3_DES      9
490 #define D_CBC_IDEA      10
491 #define D_CBC_RC2       11
492 #define D_CBC_RC5       12
493 #define D_CBC_BF        13
494 #define D_CBC_CAST      14
495 #define D_CBC_128_AES   15
496 #define D_CBC_192_AES   16
497 #define D_CBC_256_AES   17
498 #define D_EVP           18
499         double d=0.0;
500         long c[ALGOR_NUM][SIZE_NUM];
501 #define R_DSA_512       0
502 #define R_DSA_1024      1
503 #define R_DSA_2048      2
504 #define R_RSA_512       0
505 #define R_RSA_1024      1
506 #define R_RSA_2048      2
507 #define R_RSA_4096      3
508
509 #define R_EC_P160    0
510 #define R_EC_P192    1  
511 #define R_EC_P224    2
512 #define R_EC_P256    3
513 #define R_EC_P384    4
514 #define R_EC_P521    5
515 #define R_EC_K163    6
516 #define R_EC_K233    7
517 #define R_EC_K283    8
518 #define R_EC_K409    9
519 #define R_EC_K571    10
520 #define R_EC_B163    11
521 #define R_EC_B233    12
522 #define R_EC_B283    13
523 #define R_EC_B409    14
524 #define R_EC_B571    15
525
526 #ifndef OPENSSL_NO_RSA
527         RSA *rsa_key[RSA_NUM];
528         long rsa_c[RSA_NUM][2];
529         static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
530         static unsigned char *rsa_data[RSA_NUM]=
531                 {test512,test1024,test2048,test4096};
532         static int rsa_data_length[RSA_NUM]={
533                 sizeof(test512),sizeof(test1024),
534                 sizeof(test2048),sizeof(test4096)};
535 #endif
536 #ifndef OPENSSL_NO_DSA
537         DSA *dsa_key[DSA_NUM];
538         long dsa_c[DSA_NUM][2];
539         static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
540 #endif
541 #ifndef OPENSSL_NO_EC
542         /* We only test over the following curves as they are representative, 
543          * To add tests over more curves, simply add the curve NID
544          * and curve name to the following arrays and increase the 
545          * EC_NUM value accordingly. 
546          */
547         static unsigned int test_curves[EC_NUM] = 
548         {       
549         /* Prime Curves */
550         NID_secp160r1,
551         NID_X9_62_prime192v1,
552         NID_secp224r1,
553         NID_X9_62_prime256v1,
554         NID_secp384r1,
555         NID_secp521r1,
556         /* Binary Curves */
557         NID_sect163k1,
558         NID_sect233k1,
559         NID_sect283k1,
560         NID_sect409k1,
561         NID_sect571k1,
562         NID_sect163r2,
563         NID_sect233r1,
564         NID_sect283r1,
565         NID_sect409r1,
566         NID_sect571r1
567         }; 
568         static char * test_curves_names[EC_NUM] = 
569         {
570         /* Prime Curves */
571         "secp160r1",
572         "nistp192",
573         "nistp224",
574         "nistp256",
575         "nistp384",
576         "nistp521",
577         /* Binary Curves */
578         "nistk163",
579         "nistk233",
580         "nistk283",
581         "nistk409",
582         "nistk571",
583         "nistb163",
584         "nistb233",
585         "nistb283",
586         "nistb409",
587         "nistb571"
588         };
589         static int test_curves_bits[EC_NUM] =
590         {
591         160, 192, 224, 256, 384, 521,
592         163, 233, 283, 409, 571,
593         163, 233, 283, 409, 571
594         };
595
596 #endif
597
598 #ifndef OPENSSL_NO_ECDSA
599         unsigned char ecdsasig[256];
600         unsigned int ecdsasiglen;
601         EC_KEY *ecdsa[EC_NUM];
602         long ecdsa_c[EC_NUM][2];
603 #endif
604
605 #ifndef OPENSSL_NO_ECDH
606         EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
607         unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
608         int secret_size_a, secret_size_b;
609         int ecdh_checks = 0;
610         int secret_idx = 0;
611         long ecdh_c[EC_NUM][2];
612 #endif
613
614         int rsa_doit[RSA_NUM];
615         int dsa_doit[DSA_NUM];
616         int ecdsa_doit[EC_NUM];
617         int ecdh_doit[EC_NUM];
618         int doit[ALGOR_NUM];
619         int pr_header=0;
620         const EVP_CIPHER *evp_cipher=NULL;
621         const EVP_MD *evp_md=NULL;
622         int decrypt=0;
623 #ifdef HAVE_FORK
624         int multi=0;
625 #endif
626
627 #ifndef TIMES
628         usertime=-1;
629 #endif
630
631         apps_startup();
632         memset(results, 0, sizeof(results));
633 #ifndef OPENSSL_NO_DSA
634         memset(dsa_key,0,sizeof(dsa_key));
635 #endif
636 #ifndef OPENSSL_NO_ECDSA
637         for (i=0; i<EC_NUM; i++) ecdsa[i] = NULL;
638 #endif
639 #ifndef OPENSSL_NO_ECDH
640         for (i=0; i<EC_NUM; i++)
641                 {
642                 ecdh_a[i] = NULL;
643                 ecdh_b[i] = NULL;
644                 }
645 #endif
646
647
648         if (bio_err == NULL)
649                 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
650                         BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
651
652         if (!load_config(bio_err, NULL))
653                 goto end;
654
655 #ifndef OPENSSL_NO_RSA
656         memset(rsa_key,0,sizeof(rsa_key));
657         for (i=0; i<RSA_NUM; i++)
658                 rsa_key[i]=NULL;
659 #endif
660
661         if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
662                 {
663                 BIO_printf(bio_err,"out of memory\n");
664                 goto end;
665                 }
666 #ifndef OPENSSL_NO_DES
667         buf_as_des_cblock = (DES_cblock *)buf;
668 #endif
669         if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
670                 {
671                 BIO_printf(bio_err,"out of memory\n");
672                 goto end;
673                 }
674
675         memset(c,0,sizeof(c));
676         memset(DES_iv,0,sizeof(DES_iv));
677         memset(iv,0,sizeof(iv));
678
679         for (i=0; i<ALGOR_NUM; i++)
680                 doit[i]=0;
681         for (i=0; i<RSA_NUM; i++)
682                 rsa_doit[i]=0;
683         for (i=0; i<DSA_NUM; i++)
684                 dsa_doit[i]=0;
685 #ifndef OPENSSL_NO_ECDSA
686         for (i=0; i<EC_NUM; i++)
687                 ecdsa_doit[i]=0;
688 #endif
689 #ifndef OPENSSL_NO_ECDH
690         for (i=0; i<EC_NUM; i++)
691                 ecdh_doit[i]=0;
692 #endif
693
694         
695         j=0;
696         argc--;
697         argv++;
698         while (argc)
699                 {
700                 if      ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
701                         {
702                         usertime = 0;
703                         j--;    /* Otherwise, -elapsed gets confused with
704                                    an algorithm. */
705                         }
706                 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
707                         {
708                         argc--;
709                         argv++;
710                         if(argc == 0)
711                                 {
712                                 BIO_printf(bio_err,"no EVP given\n");
713                                 goto end;
714                                 }
715                         evp_cipher=EVP_get_cipherbyname(*argv);
716                         if(!evp_cipher)
717                                 {
718                                 evp_md=EVP_get_digestbyname(*argv);
719                                 }
720                         if(!evp_cipher && !evp_md)
721                                 {
722                                 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
723                                 goto end;
724                                 }
725                         doit[D_EVP]=1;
726                         }
727                 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
728                         {
729                         decrypt=1;
730                         j--;    /* Otherwise, -elapsed gets confused with
731                                    an algorithm. */
732                         }
733                 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
734                         {
735                         argc--;
736                         argv++;
737                         if(argc == 0)
738                                 {
739                                 BIO_printf(bio_err,"no engine given\n");
740                                 goto end;
741                                 }
742                         e = setup_engine(bio_err, *argv, 0);
743                         /* j will be increased again further down.  We just
744                            don't want speed to confuse an engine with an
745                            algorithm, especially when none is given (which
746                            means all of them should be run) */
747                         j--;
748                         }
749 #ifdef HAVE_FORK
750                 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
751                         {
752                         argc--;
753                         argv++;
754                         if(argc == 0)
755                                 {
756                                 BIO_printf(bio_err,"no multi count given\n");
757                                 goto end;
758                                 }
759                         multi=atoi(argv[0]);
760                         if(multi <= 0)
761                             {
762                                 BIO_printf(bio_err,"bad multi count\n");
763                                 goto end;
764                                 }                               
765                         j--;    /* Otherwise, -mr gets confused with
766                                    an algorithm. */
767                         }
768 #endif
769                 else if (argc > 0 && !strcmp(*argv,"-mr"))
770                         {
771                         mr=1;
772                         j--;    /* Otherwise, -mr gets confused with
773                                    an algorithm. */
774                         }
775                 else
776 #ifndef OPENSSL_NO_MD2
777                 if      (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
778                 else
779 #endif
780 #ifndef OPENSSL_NO_MDC2
781                         if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
782                 else
783 #endif
784 #ifndef OPENSSL_NO_MD4
785                         if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
786                 else
787 #endif
788 #ifndef OPENSSL_NO_MD5
789                         if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
790                 else
791 #endif
792 #ifndef OPENSSL_NO_MD5
793                         if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
794                 else
795 #endif
796 #ifndef OPENSSL_NO_SHA
797                         if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
798                 else
799                         if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
800                 else
801 #endif
802 #ifndef OPENSSL_NO_RIPEMD
803                         if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
804                 else
805                         if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
806                 else
807                         if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
808                 else
809 #endif
810 #ifndef OPENSSL_NO_RC4
811                         if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
812                 else 
813 #endif
814 #ifndef OPENSSL_NO_DES
815                         if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
816                 else    if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
817                 else
818 #endif
819 #ifndef OPENSSL_NO_AES
820                         if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
821                 else    if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
822                 else    if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
823                 else
824 #endif
825 #ifndef OPENSSL_NO_RSA
826 #if 0 /* was: #ifdef RSAref */
827                         if (strcmp(*argv,"rsaref") == 0) 
828                         {
829                         RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
830                         j--;
831                         }
832                 else
833 #endif
834 #ifndef RSA_NULL
835                         if (strcmp(*argv,"openssl") == 0) 
836                         {
837                         RSA_set_default_method(RSA_PKCS1_SSLeay());
838                         j--;
839                         }
840                 else
841 #endif
842 #endif /* !OPENSSL_NO_RSA */
843                      if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
844                 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
845                 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
846                 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
847                 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
848                 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
849                 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
850                 else
851 #ifndef OPENSSL_NO_RC2
852                      if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
853                 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
854                 else
855 #endif
856 #ifndef OPENSSL_NO_RC5
857                      if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
858                 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
859                 else
860 #endif
861 #ifndef OPENSSL_NO_IDEA
862                      if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
863                 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
864                 else
865 #endif
866 #ifndef OPENSSL_NO_BF
867                      if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
868                 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
869                 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
870                 else
871 #endif
872 #ifndef OPENSSL_NO_CAST
873                      if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
874                 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
875                 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
876                 else
877 #endif
878 #ifndef OPENSSL_NO_DES
879                         if (strcmp(*argv,"des") == 0)
880                         {
881                         doit[D_CBC_DES]=1;
882                         doit[D_EDE3_DES]=1;
883                         }
884                 else
885 #endif
886 #ifndef OPENSSL_NO_AES
887                         if (strcmp(*argv,"aes") == 0)
888                         {
889                         doit[D_CBC_128_AES]=1;
890                         doit[D_CBC_192_AES]=1;
891                         doit[D_CBC_256_AES]=1;
892                         }
893                 else
894 #endif
895 #ifndef OPENSSL_NO_RSA
896                         if (strcmp(*argv,"rsa") == 0)
897                         {
898                         rsa_doit[R_RSA_512]=1;
899                         rsa_doit[R_RSA_1024]=1;
900                         rsa_doit[R_RSA_2048]=1;
901                         rsa_doit[R_RSA_4096]=1;
902                         }
903                 else
904 #endif
905 #ifndef OPENSSL_NO_DSA
906                         if (strcmp(*argv,"dsa") == 0)
907                         {
908                         dsa_doit[R_DSA_512]=1;
909                         dsa_doit[R_DSA_1024]=1;
910                         }
911                 else
912 #endif
913 #ifndef OPENSSL_NO_ECDSA
914                      if (strcmp(*argv,"ecdsap160") == 0) ecdsa_doit[R_EC_P160]=2;
915                 else if (strcmp(*argv,"ecdsap224") == 0) ecdsa_doit[R_EC_P224]=2;
916                 else if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2;
917                 else if (strcmp(*argv,"ecdsap384") == 0) ecdsa_doit[R_EC_P384]=2;
918                 else if (strcmp(*argv,"ecdsap521") == 0) ecdsa_doit[R_EC_P521]=2;
919                 else if (strcmp(*argv,"ecdsak163") == 0) ecdsa_doit[R_EC_K163]=2;
920                 else if (strcmp(*argv,"ecdsak233") == 0) ecdsa_doit[R_EC_K233]=2;
921                 else if (strcmp(*argv,"ecdsak283") == 0) ecdsa_doit[R_EC_K283]=2;
922                 else if (strcmp(*argv,"ecdsak409") == 0) ecdsa_doit[R_EC_K409]=2;
923                 else if (strcmp(*argv,"ecdsak571") == 0) ecdsa_doit[R_EC_K571]=2;
924                 else if (strcmp(*argv,"ecdsab163") == 0) ecdsa_doit[R_EC_B163]=2;
925                 else if (strcmp(*argv,"ecdsab233") == 0) ecdsa_doit[R_EC_B233]=2;
926                 else if (strcmp(*argv,"ecdsab283") == 0) ecdsa_doit[R_EC_B283]=2;
927                 else if (strcmp(*argv,"ecdsab409") == 0) ecdsa_doit[R_EC_B409]=2;
928                 else if (strcmp(*argv,"ecdsab571") == 0) ecdsa_doit[R_EC_B571]=2;
929                 else if (strcmp(*argv,"ecdsa") == 0)
930                         {
931                         for (i=0; i < EC_NUM; i++)
932                                 ecdsa_doit[i]=1;
933                         }
934                 else
935 #endif
936 #ifndef OPENSSL_NO_ECDH
937                      if (strcmp(*argv,"ecdhp160") == 0) ecdh_doit[R_EC_P160]=2;
938                 else if (strcmp(*argv,"ecdhp224") == 0) ecdh_doit[R_EC_P224]=2;
939                 else if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2;
940                 else if (strcmp(*argv,"ecdhp384") == 0) ecdh_doit[R_EC_P384]=2;
941                 else if (strcmp(*argv,"ecdhp521") == 0) ecdh_doit[R_EC_P521]=2;
942                 else if (strcmp(*argv,"ecdhk163") == 0) ecdh_doit[R_EC_K163]=2;
943                 else if (strcmp(*argv,"ecdhk233") == 0) ecdh_doit[R_EC_K233]=2;
944                 else if (strcmp(*argv,"ecdhk283") == 0) ecdh_doit[R_EC_K283]=2;
945                 else if (strcmp(*argv,"ecdhk409") == 0) ecdh_doit[R_EC_K409]=2;
946                 else if (strcmp(*argv,"ecdhk571") == 0) ecdh_doit[R_EC_K571]=2;
947                 else if (strcmp(*argv,"ecdhb163") == 0) ecdh_doit[R_EC_B163]=2;
948                 else if (strcmp(*argv,"ecdhb233") == 0) ecdh_doit[R_EC_B233]=2;
949                 else if (strcmp(*argv,"ecdhb283") == 0) ecdh_doit[R_EC_B283]=2;
950                 else if (strcmp(*argv,"ecdhb409") == 0) ecdh_doit[R_EC_B409]=2;
951                 else if (strcmp(*argv,"ecdhb571") == 0) ecdh_doit[R_EC_B571]=2;
952                 else if (strcmp(*argv,"ecdh") == 0)
953                         {
954                         for (i=0; i < EC_NUM; i++)
955                                 ecdh_doit[i]=1;
956                         }
957                 else
958 #endif
959                         {
960                         BIO_printf(bio_err,"Error: bad option or value\n");
961                         BIO_printf(bio_err,"\n");
962                         BIO_printf(bio_err,"Available values:\n");
963 #ifndef OPENSSL_NO_MD2
964                         BIO_printf(bio_err,"md2      ");
965 #endif
966 #ifndef OPENSSL_NO_MDC2
967                         BIO_printf(bio_err,"mdc2     ");
968 #endif
969 #ifndef OPENSSL_NO_MD4
970                         BIO_printf(bio_err,"md4      ");
971 #endif
972 #ifndef OPENSSL_NO_MD5
973                         BIO_printf(bio_err,"md5      ");
974 #ifndef OPENSSL_NO_HMAC
975                         BIO_printf(bio_err,"hmac     ");
976 #endif
977 #endif
978 #ifndef OPENSSL_NO_SHA1
979                         BIO_printf(bio_err,"sha1     ");
980 #endif
981 #ifndef OPENSSL_NO_RIPEMD160
982                         BIO_printf(bio_err,"rmd160");
983 #endif
984 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
985     !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
986     !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
987                         BIO_printf(bio_err,"\n");
988 #endif
989
990 #ifndef OPENSSL_NO_IDEA
991                         BIO_printf(bio_err,"idea-cbc ");
992 #endif
993 #ifndef OPENSSL_NO_RC2
994                         BIO_printf(bio_err,"rc2-cbc  ");
995 #endif
996 #ifndef OPENSSL_NO_RC5
997                         BIO_printf(bio_err,"rc5-cbc  ");
998 #endif
999 #ifndef OPENSSL_NO_BF
1000                         BIO_printf(bio_err,"bf-cbc");
1001 #endif
1002 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1003     !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
1004                         BIO_printf(bio_err,"\n");
1005 #endif
1006 #ifndef OPENSSL_NO_DES
1007                         BIO_printf(bio_err,"des-cbc  des-ede3 ");
1008 #endif
1009 #ifndef OPENSSL_NO_AES
1010                         BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
1011 #endif
1012 #ifndef OPENSSL_NO_RC4
1013                         BIO_printf(bio_err,"rc4");
1014 #endif
1015                         BIO_printf(bio_err,"\n");
1016
1017 #ifndef OPENSSL_NO_RSA
1018                         BIO_printf(bio_err,"rsa512   rsa1024  rsa2048  rsa4096\n");
1019 #endif
1020
1021 #ifndef OPENSSL_NO_DSA
1022                         BIO_printf(bio_err,"dsa512   dsa1024  dsa2048\n");
1023 #endif
1024 #ifndef OPENSSL_NO_ECDSA
1025                         BIO_printf(bio_err,"ecdsap160 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
1026                         BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n");
1027                         BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n");
1028                         BIO_printf(bio_err,"ecdsa\n");
1029 #endif
1030 #ifndef OPENSSL_NO_ECDH
1031                         BIO_printf(bio_err,"ecdhp160  ecdhp224  ecdhp256  ecdhp384  ecdhp521\n");
1032                         BIO_printf(bio_err,"ecdhk163  ecdhk233  ecdhk283  ecdhk409  ecdhk571\n");
1033                         BIO_printf(bio_err,"ecdhb163  ecdhb233  ecdhb283  ecdhb409  ecdhb571\n");
1034                         BIO_printf(bio_err,"ecdh\n");
1035 #endif
1036
1037 #ifndef OPENSSL_NO_IDEA
1038                         BIO_printf(bio_err,"idea     ");
1039 #endif
1040 #ifndef OPENSSL_NO_RC2
1041                         BIO_printf(bio_err,"rc2      ");
1042 #endif
1043 #ifndef OPENSSL_NO_DES
1044                         BIO_printf(bio_err,"des      ");
1045 #endif
1046 #ifndef OPENSSL_NO_AES
1047                         BIO_printf(bio_err,"aes      ");
1048 #endif
1049 #ifndef OPENSSL_NO_RSA
1050                         BIO_printf(bio_err,"rsa      ");
1051 #endif
1052 #ifndef OPENSSL_NO_BF
1053                         BIO_printf(bio_err,"blowfish");
1054 #endif
1055 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1056     !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
1057     !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
1058                         BIO_printf(bio_err,"\n");
1059 #endif
1060
1061                         BIO_printf(bio_err,"\n");
1062                         BIO_printf(bio_err,"Available options:\n");
1063 #if defined(TIMES) || defined(USE_TOD)
1064                         BIO_printf(bio_err,"-elapsed        measure time in real time instead of CPU user time.\n");
1065 #endif
1066                         BIO_printf(bio_err,"-engine e       use engine e, possibly a hardware device.\n");
1067                         BIO_printf(bio_err,"-evp e          use EVP e.\n");
1068                         BIO_printf(bio_err,"-decrypt        time decryption instead of encryption (only EVP).\n");
1069                         BIO_printf(bio_err,"-mr             produce machine readable output.\n");
1070 #ifdef HAVE_FORK
1071                         BIO_printf(bio_err,"-multi n        run n benchmarks in parallel.\n");
1072 #endif
1073                         goto end;
1074                         }
1075                 argc--;
1076                 argv++;
1077                 j++;
1078                 }
1079
1080 #ifdef HAVE_FORK
1081         if(multi && do_multi(multi))
1082                 goto show_res;
1083 #endif
1084
1085         if (j == 0)
1086                 {
1087                 for (i=0; i<ALGOR_NUM; i++)
1088                         {
1089                         if (i != D_EVP)
1090                                 doit[i]=1;
1091                         }
1092                 for (i=0; i<RSA_NUM; i++)
1093                         rsa_doit[i]=1;
1094                 for (i=0; i<DSA_NUM; i++)
1095                         dsa_doit[i]=1;
1096                 }
1097         for (i=0; i<ALGOR_NUM; i++)
1098                 if (doit[i]) pr_header++;
1099
1100         if (usertime == 0 && !mr)
1101                 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
1102         if (usertime <= 0 && !mr)
1103                 {
1104                 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
1105                 BIO_printf(bio_err,"program when this computer is idle.\n");
1106                 }
1107
1108 #ifndef OPENSSL_NO_RSA
1109         for (i=0; i<RSA_NUM; i++)
1110                 {
1111                 const unsigned char *p;
1112
1113                 p=rsa_data[i];
1114                 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
1115                 if (rsa_key[i] == NULL)
1116                         {
1117                         BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
1118                         goto end;
1119                         }
1120 #if 0
1121                 else
1122                         {
1123                         BIO_printf(bio_err,mr ? "+RK:%d:"
1124                                    : "Loaded RSA key, %d bit modulus and e= 0x",
1125                                    BN_num_bits(rsa_key[i]->n));
1126                         BN_print(bio_err,rsa_key[i]->e);
1127                         BIO_printf(bio_err,"\n");
1128                         }
1129 #endif
1130                 }
1131 #endif
1132
1133 #ifndef OPENSSL_NO_DSA
1134         dsa_key[0]=get_dsa512();
1135         dsa_key[1]=get_dsa1024();
1136         dsa_key[2]=get_dsa2048();
1137 #endif
1138
1139 #ifndef OPENSSL_NO_DES
1140         DES_set_key_unchecked(&key,&sch);
1141         DES_set_key_unchecked(&key2,&sch2);
1142         DES_set_key_unchecked(&key3,&sch3);
1143 #endif
1144 #ifndef OPENSSL_NO_AES
1145         AES_set_encrypt_key(key16,128,&aes_ks1);
1146         AES_set_encrypt_key(key24,192,&aes_ks2);
1147         AES_set_encrypt_key(key32,256,&aes_ks3);
1148 #endif
1149 #ifndef OPENSSL_NO_IDEA
1150         idea_set_encrypt_key(key16,&idea_ks);
1151 #endif
1152 #ifndef OPENSSL_NO_RC4
1153         RC4_set_key(&rc4_ks,16,key16);
1154 #endif
1155 #ifndef OPENSSL_NO_RC2
1156         RC2_set_key(&rc2_ks,16,key16,128);
1157 #endif
1158 #ifndef OPENSSL_NO_RC5
1159         RC5_32_set_key(&rc5_ks,16,key16,12);
1160 #endif
1161 #ifndef OPENSSL_NO_BF
1162         BF_set_key(&bf_ks,16,key16);
1163 #endif
1164 #ifndef OPENSSL_NO_CAST
1165         CAST_set_key(&cast_ks,16,key16);
1166 #endif
1167 #ifndef OPENSSL_NO_RSA
1168         memset(rsa_c,0,sizeof(rsa_c));
1169 #endif
1170 #ifndef SIGALRM
1171 #ifndef OPENSSL_NO_DES
1172         BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
1173         count=10;
1174         do      {
1175                 long i;
1176                 count*=2;
1177                 Time_F(START);
1178                 for (i=count; i; i--)
1179                         DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
1180                                 &sch,DES_ENCRYPT);
1181                 d=Time_F(STOP);
1182                 } while (d <3);
1183         save_count=count;
1184         c[D_MD2][0]=count/10;
1185         c[D_MDC2][0]=count/10;
1186         c[D_MD4][0]=count;
1187         c[D_MD5][0]=count;
1188         c[D_HMAC][0]=count;
1189         c[D_SHA1][0]=count;
1190         c[D_RMD160][0]=count;
1191         c[D_RC4][0]=count*5;
1192         c[D_CBC_DES][0]=count;
1193         c[D_EDE3_DES][0]=count/3;
1194         c[D_CBC_IDEA][0]=count;
1195         c[D_CBC_RC2][0]=count;
1196         c[D_CBC_RC5][0]=count;
1197         c[D_CBC_BF][0]=count;
1198         c[D_CBC_CAST][0]=count;
1199
1200         for (i=1; i<SIZE_NUM; i++)
1201                 {
1202                 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1203                 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1204                 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1205                 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1206                 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1207                 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1208                 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1209                 }
1210         for (i=1; i<SIZE_NUM; i++)
1211                 {
1212                 long l0,l1;
1213
1214                 l0=(long)lengths[i-1];
1215                 l1=(long)lengths[i];
1216                 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1217                 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1218                 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1219                 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1220                 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1221                 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1222                 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1223                 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1224                 }
1225 #ifndef OPENSSL_NO_RSA
1226         rsa_c[R_RSA_512][0]=count/2000;
1227         rsa_c[R_RSA_512][1]=count/400;
1228         for (i=1; i<RSA_NUM; i++)
1229                 {
1230                 rsa_c[i][0]=rsa_c[i-1][0]/8;
1231                 rsa_c[i][1]=rsa_c[i-1][1]/4;
1232                 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1233                         rsa_doit[i]=0;
1234                 else
1235                         {
1236                         if (rsa_c[i][0] == 0)
1237                                 {
1238                                 rsa_c[i][0]=1;
1239                                 rsa_c[i][1]=20;
1240                                 }
1241                         }                               
1242                 }
1243 #endif
1244
1245 #ifndef OPENSSL_NO_DSA
1246         dsa_c[R_DSA_512][0]=count/1000;
1247         dsa_c[R_DSA_512][1]=count/1000/2;
1248         for (i=1; i<DSA_NUM; i++)
1249                 {
1250                 dsa_c[i][0]=dsa_c[i-1][0]/4;
1251                 dsa_c[i][1]=dsa_c[i-1][1]/4;
1252                 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1253                         dsa_doit[i]=0;
1254                 else
1255                         {
1256                         if (dsa_c[i] == 0)
1257                                 {
1258                                 dsa_c[i][0]=1;
1259                                 dsa_c[i][1]=1;
1260                                 }
1261                         }                               
1262                 }
1263 #endif
1264
1265 #ifndef OPENSSL_NO_ECDSA
1266         ecdsa_c[R_EC_P160][0]=count/1000;
1267         ecdsa_c[R_EC_P160][1]=count/1000/2;
1268         for (i=R_EC_P224; i<=R_EC_P521; i++)
1269                 {
1270                 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1271                 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1272                 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1273                         ecdsa_doit[i]=0;
1274                 else
1275                         {
1276                         if (ecdsa_c[i] == 0)
1277                                 {
1278                                 ecdsa_c[i][0]=1;
1279                                 ecdsa_c[i][1]=1;
1280                                 }
1281                         }
1282                 }
1283         ecdsa_c[R_EC_K163][0]=count/1000;
1284         ecdsa_c[R_EC_K163][1]=count/1000/2;
1285         for (i=R_EC_K233; i<=R_EC_K571; i++)
1286                 {
1287                 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1288                 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1289                 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1290                         ecdsa_doit[i]=0;
1291                 else
1292                         {
1293                         if (ecdsa_c[i] == 0)
1294                                 {
1295                                 ecdsa_c[i][0]=1;
1296                                 ecdsa_c[i][1]=1;
1297                                 }
1298                         }
1299                 }
1300         ecdsa_c[R_EC_B163][0]=count/1000;
1301         ecdsa_c[R_EC_B163][1]=count/1000/2;
1302         for (i=R_EC_B233; i<=R_EC_B571; i++)
1303                 {
1304                 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1305                 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1306                 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1307                         ecdsa_doit[i]=0;
1308                 else
1309                         {
1310                         if (ecdsa_c[i] == 0)
1311                                 {
1312                                 ecdsa_c[i][0]=1;
1313                                 ecdsa_c[i][1]=1;
1314                                 }
1315                         }
1316                 }
1317 #endif
1318
1319 #ifndef OPENSSL_NO_ECDH
1320         ecdh_c[R_EC_P160][0]=count/1000;
1321         ecdh_c[R_EC_P160][1]=count/1000;
1322         for (i=R_EC_P224; i<=R_EC_P521; i++)
1323                 {
1324                 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1325                 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1326                 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1327                         ecdh_doit[i]=0;
1328                 else
1329                         {
1330                         if (ecdh_c[i] == 0)
1331                                 {
1332                                 ecdh_c[i][0]=1;
1333                                 ecdh_c[i][1]=1;
1334                                 }
1335                         }
1336                 }
1337         ecdh_c[R_EC_K163][0]=count/1000;
1338         ecdh_c[R_EC_K163][1]=count/1000;
1339         for (i=R_EC_K233; i<=R_EC_K571; i++)
1340                 {
1341                 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1342                 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1343                 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1344                         ecdh_doit[i]=0;
1345                 else
1346                         {
1347                         if (ecdh_c[i] == 0)
1348                                 {
1349                                 ecdh_c[i][0]=1;
1350                                 ecdh_c[i][1]=1;
1351                                 }
1352                         }
1353                 }
1354         ecdh_c[R_EC_B163][0]=count/1000;
1355         ecdh_c[R_EC_B163][1]=count/1000;
1356         for (i=R_EC_B233; i<=R_EC_B571; i++)
1357                 {
1358                 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1359                 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1360                 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1361                         ecdh_doit[i]=0;
1362                 else
1363                         {
1364                         if (ecdh_c[i] == 0)
1365                                 {
1366                                 ecdh_c[i][0]=1;
1367                                 ecdh_c[i][1]=1;
1368                                 }
1369                         }
1370                 }
1371 #endif
1372
1373 #define COND(d) (count < (d))
1374 #define COUNT(d) (d)
1375 #else
1376 /* not worth fixing */
1377 # error "You cannot disable DES on systems without SIGALRM."
1378 #endif /* OPENSSL_NO_DES */
1379 #else
1380 #define COND(c) (run)
1381 #define COUNT(d) (count)
1382         signal(SIGALRM,sig_done);
1383 #endif /* SIGALRM */
1384
1385 #ifndef OPENSSL_NO_MD2
1386         if (doit[D_MD2])
1387                 {
1388                 for (j=0; j<SIZE_NUM; j++)
1389                         {
1390                         print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1391                         Time_F(START);
1392                         for (count=0,run=1; COND(c[D_MD2][j]); count++)
1393                                 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1394                         d=Time_F(STOP);
1395                         print_result(D_MD2,j,count,d);
1396                         }
1397                 }
1398 #endif
1399 #ifndef OPENSSL_NO_MDC2
1400         if (doit[D_MDC2])
1401                 {
1402                 for (j=0; j<SIZE_NUM; j++)
1403                         {
1404                         print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1405                         Time_F(START);
1406                         for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1407                                 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1408                         d=Time_F(STOP);
1409                         print_result(D_MDC2,j,count,d);
1410                         }
1411                 }
1412 #endif
1413
1414 #ifndef OPENSSL_NO_MD4
1415         if (doit[D_MD4])
1416                 {
1417                 for (j=0; j<SIZE_NUM; j++)
1418                         {
1419                         print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1420                         Time_F(START);
1421                         for (count=0,run=1; COND(c[D_MD4][j]); count++)
1422                                 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1423                         d=Time_F(STOP);
1424                         print_result(D_MD4,j,count,d);
1425                         }
1426                 }
1427 #endif
1428
1429 #ifndef OPENSSL_NO_MD5
1430         if (doit[D_MD5])
1431                 {
1432                 for (j=0; j<SIZE_NUM; j++)
1433                         {
1434                         print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1435                         Time_F(START);
1436                         for (count=0,run=1; COND(c[D_MD5][j]); count++)
1437                                 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1438                         d=Time_F(STOP);
1439                         print_result(D_MD5,j,count,d);
1440                         }
1441                 }
1442 #endif
1443
1444 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1445         if (doit[D_HMAC])
1446                 {
1447                 HMAC_CTX hctx;
1448
1449                 HMAC_CTX_init(&hctx);
1450                 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1451                         16,EVP_md5(), NULL);
1452
1453                 for (j=0; j<SIZE_NUM; j++)
1454                         {
1455                         print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1456                         Time_F(START);
1457                         for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1458                                 {
1459                                 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1460                                 HMAC_Update(&hctx,buf,lengths[j]);
1461                                 HMAC_Final(&hctx,&(hmac[0]),NULL);
1462                                 }
1463                         d=Time_F(STOP);
1464                         print_result(D_HMAC,j,count,d);
1465                         }
1466                 HMAC_CTX_cleanup(&hctx);
1467                 }
1468 #endif
1469 #ifndef OPENSSL_NO_SHA
1470         if (doit[D_SHA1])
1471                 {
1472                 for (j=0; j<SIZE_NUM; j++)
1473                         {
1474                         print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1475                         Time_F(START);
1476                         for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1477                                 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1478                         d=Time_F(STOP);
1479                         print_result(D_SHA1,j,count,d);
1480                         }
1481                 }
1482 #endif
1483 #ifndef OPENSSL_NO_RIPEMD
1484         if (doit[D_RMD160])
1485                 {
1486                 for (j=0; j<SIZE_NUM; j++)
1487                         {
1488                         print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1489                         Time_F(START);
1490                         for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1491                                 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1492                         d=Time_F(STOP);
1493                         print_result(D_RMD160,j,count,d);
1494                         }
1495                 }
1496 #endif
1497 #ifndef OPENSSL_NO_RC4
1498         if (doit[D_RC4])
1499                 {
1500                 for (j=0; j<SIZE_NUM; j++)
1501                         {
1502                         print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1503                         Time_F(START);
1504                         for (count=0,run=1; COND(c[D_RC4][j]); count++)
1505                                 RC4(&rc4_ks,(unsigned int)lengths[j],
1506                                         buf,buf);
1507                         d=Time_F(STOP);
1508                         print_result(D_RC4,j,count,d);
1509                         }
1510                 }
1511 #endif
1512 #ifndef OPENSSL_NO_DES
1513         if (doit[D_CBC_DES])
1514                 {
1515                 for (j=0; j<SIZE_NUM; j++)
1516                         {
1517                         print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1518                         Time_F(START);
1519                         for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1520                                 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1521                                                  &DES_iv,DES_ENCRYPT);
1522                         d=Time_F(STOP);
1523                         print_result(D_CBC_DES,j,count,d);
1524                         }
1525                 }
1526
1527         if (doit[D_EDE3_DES])
1528                 {
1529                 for (j=0; j<SIZE_NUM; j++)
1530                         {
1531                         print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1532                         Time_F(START);
1533                         for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1534                                 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1535                                                      &sch,&sch2,&sch3,
1536                                                      &DES_iv,DES_ENCRYPT);
1537                         d=Time_F(STOP);
1538                         print_result(D_EDE3_DES,j,count,d);
1539                         }
1540                 }
1541 #endif
1542 #ifndef OPENSSL_NO_AES
1543         if (doit[D_CBC_128_AES])
1544                 {
1545                 for (j=0; j<SIZE_NUM; j++)
1546                         {
1547                         print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1548                         Time_F(START);
1549                         for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1550                                 AES_cbc_encrypt(buf,buf,
1551                                         (unsigned long)lengths[j],&aes_ks1,
1552                                         iv,AES_ENCRYPT);
1553                         d=Time_F(STOP);
1554                         print_result(D_CBC_128_AES,j,count,d);
1555                         }
1556                 }
1557         if (doit[D_CBC_192_AES])
1558                 {
1559                 for (j=0; j<SIZE_NUM; j++)
1560                         {
1561                         print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1562                         Time_F(START);
1563                         for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1564                                 AES_cbc_encrypt(buf,buf,
1565                                         (unsigned long)lengths[j],&aes_ks2,
1566                                         iv,AES_ENCRYPT);
1567                         d=Time_F(STOP);
1568                         print_result(D_CBC_192_AES,j,count,d);
1569                         }
1570                 }
1571         if (doit[D_CBC_256_AES])
1572                 {
1573                 for (j=0; j<SIZE_NUM; j++)
1574                         {
1575                         print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1576                         Time_F(START);
1577                         for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1578                                 AES_cbc_encrypt(buf,buf,
1579                                         (unsigned long)lengths[j],&aes_ks3,
1580                                         iv,AES_ENCRYPT);
1581                         d=Time_F(STOP);
1582                         print_result(D_CBC_256_AES,j,count,d);
1583                         }
1584                 }
1585
1586 #endif
1587 #ifndef OPENSSL_NO_IDEA
1588         if (doit[D_CBC_IDEA])
1589                 {
1590                 for (j=0; j<SIZE_NUM; j++)
1591                         {
1592                         print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1593                         Time_F(START);
1594                         for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1595                                 idea_cbc_encrypt(buf,buf,
1596                                         (unsigned long)lengths[j],&idea_ks,
1597                                         iv,IDEA_ENCRYPT);
1598                         d=Time_F(STOP);
1599                         print_result(D_CBC_IDEA,j,count,d);
1600                         }
1601                 }
1602 #endif
1603 #ifndef OPENSSL_NO_RC2
1604         if (doit[D_CBC_RC2])
1605                 {
1606                 for (j=0; j<SIZE_NUM; j++)
1607                         {
1608                         print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1609                         Time_F(START);
1610                         for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1611                                 RC2_cbc_encrypt(buf,buf,
1612                                         (unsigned long)lengths[j],&rc2_ks,
1613                                         iv,RC2_ENCRYPT);
1614                         d=Time_F(STOP);
1615                         print_result(D_CBC_RC2,j,count,d);
1616                         }
1617                 }
1618 #endif
1619 #ifndef OPENSSL_NO_RC5
1620         if (doit[D_CBC_RC5])
1621                 {
1622                 for (j=0; j<SIZE_NUM; j++)
1623                         {
1624                         print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1625                         Time_F(START);
1626                         for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1627                                 RC5_32_cbc_encrypt(buf,buf,
1628                                         (unsigned long)lengths[j],&rc5_ks,
1629                                         iv,RC5_ENCRYPT);
1630                         d=Time_F(STOP);
1631                         print_result(D_CBC_RC5,j,count,d);
1632                         }
1633                 }
1634 #endif
1635 #ifndef OPENSSL_NO_BF
1636         if (doit[D_CBC_BF])
1637                 {
1638                 for (j=0; j<SIZE_NUM; j++)
1639                         {
1640                         print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1641                         Time_F(START);
1642                         for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1643                                 BF_cbc_encrypt(buf,buf,
1644                                         (unsigned long)lengths[j],&bf_ks,
1645                                         iv,BF_ENCRYPT);
1646                         d=Time_F(STOP);
1647                         print_result(D_CBC_BF,j,count,d);
1648                         }
1649                 }
1650 #endif
1651 #ifndef OPENSSL_NO_CAST
1652         if (doit[D_CBC_CAST])
1653                 {
1654                 for (j=0; j<SIZE_NUM; j++)
1655                         {
1656                         print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1657                         Time_F(START);
1658                         for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1659                                 CAST_cbc_encrypt(buf,buf,
1660                                         (unsigned long)lengths[j],&cast_ks,
1661                                         iv,CAST_ENCRYPT);
1662                         d=Time_F(STOP);
1663                         print_result(D_CBC_CAST,j,count,d);
1664                         }
1665                 }
1666 #endif
1667
1668         if (doit[D_EVP])
1669                 {
1670                 for (j=0; j<SIZE_NUM; j++)
1671                         {
1672                         if (evp_cipher)
1673                                 {
1674                                 EVP_CIPHER_CTX ctx;
1675                                 int outl;
1676
1677                                 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1678                                 /* -O3 -fschedule-insns messes up an
1679                                  * optimization here!  names[D_EVP]
1680                                  * somehow becomes NULL */
1681                                 print_message(names[D_EVP],save_count,
1682                                         lengths[j]);
1683
1684                                 EVP_CIPHER_CTX_init(&ctx);
1685                                 if(decrypt)
1686                                         EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1687                                 else
1688                                         EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1689
1690                                 Time_F(START);
1691                                 if(decrypt)
1692                                         for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1693                                                 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1694                                 else
1695                                         for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1696                                                 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1697                                 if(decrypt)
1698                                         EVP_DecryptFinal_ex(&ctx,buf,&outl);
1699                                 else
1700                                         EVP_EncryptFinal_ex(&ctx,buf,&outl);
1701                                 d=Time_F(STOP);
1702                                 }
1703                         if (evp_md)
1704                                 {
1705                                 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1706                                 print_message(names[D_EVP],save_count,
1707                                         lengths[j]);
1708
1709                                 Time_F(START);
1710                                 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1711                                         EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1712
1713                                 d=Time_F(STOP);
1714                                 }
1715                         print_result(D_EVP,j,count,d);
1716                         }
1717                 }
1718
1719         RAND_pseudo_bytes(buf,36);
1720 #ifndef OPENSSL_NO_RSA
1721         for (j=0; j<RSA_NUM; j++)
1722                 {
1723                 int ret;
1724                 if (!rsa_doit[j]) continue;
1725                 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1726                 if (ret == 0)
1727                         {
1728                         BIO_printf(bio_err,"RSA sign failure.  No RSA sign will be done.\n");
1729                         ERR_print_errors(bio_err);
1730                         rsa_count=1;
1731                         }
1732                 else
1733                         {
1734                         pkey_print_message("private","rsa",
1735                                 rsa_c[j][0],rsa_bits[j],
1736                                 RSA_SECONDS);
1737 /*                      RSA_blinding_on(rsa_key[j],NULL); */
1738                         Time_F(START);
1739                         for (count=0,run=1; COND(rsa_c[j][0]); count++)
1740                                 {
1741                                 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1742                                         &rsa_num, rsa_key[j]);
1743                                 if (ret == 0)
1744                                         {
1745                                         BIO_printf(bio_err,
1746                                                 "RSA sign failure\n");
1747                                         ERR_print_errors(bio_err);
1748                                         count=1;
1749                                         break;
1750                                         }
1751                                 }
1752                         d=Time_F(STOP);
1753                         BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1754                                    : "%ld %d bit private RSA's in %.2fs\n",
1755                                    count,rsa_bits[j],d);
1756                         rsa_results[j][0]=d/(double)count;
1757                         rsa_count=count;
1758                         }
1759
1760 #if 1
1761                 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1762                 if (ret <= 0)
1763                         {
1764                         BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
1765                         ERR_print_errors(bio_err);
1766                         rsa_doit[j] = 0;
1767                         }
1768                 else
1769                         {
1770                         pkey_print_message("public","rsa",
1771                                 rsa_c[j][1],rsa_bits[j],
1772                                 RSA_SECONDS);
1773                         Time_F(START);
1774                         for (count=0,run=1; COND(rsa_c[j][1]); count++)
1775                                 {
1776                                 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1777                                         rsa_num, rsa_key[j]);
1778                                 if (ret == 0)
1779                                         {
1780                                         BIO_printf(bio_err,
1781                                                 "RSA verify failure\n");
1782                                         ERR_print_errors(bio_err);
1783                                         count=1;
1784                                         break;
1785                                         }
1786                                 }
1787                         d=Time_F(STOP);
1788                         BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1789                                    : "%ld %d bit public RSA's in %.2fs\n",
1790                                    count,rsa_bits[j],d);
1791                         rsa_results[j][1]=d/(double)count;
1792                         }
1793 #endif
1794
1795                 if (rsa_count <= 1)
1796                         {
1797                         /* if longer than 10s, don't do any more */
1798                         for (j++; j<RSA_NUM; j++)
1799                                 rsa_doit[j]=0;
1800                         }
1801                 }
1802 #endif
1803
1804         RAND_pseudo_bytes(buf,20);
1805 #ifndef OPENSSL_NO_DSA
1806         if (RAND_status() != 1)
1807                 {
1808                 RAND_seed(rnd_seed, sizeof rnd_seed);
1809                 rnd_fake = 1;
1810                 }
1811         for (j=0; j<DSA_NUM; j++)
1812                 {
1813                 unsigned int kk;
1814                 int ret;
1815
1816                 if (!dsa_doit[j]) continue;
1817 /*              DSA_generate_key(dsa_key[j]); */
1818 /*              DSA_sign_setup(dsa_key[j],NULL); */
1819                 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1820                         &kk,dsa_key[j]);
1821                 if (ret == 0)
1822                         {
1823                         BIO_printf(bio_err,"DSA sign failure.  No DSA sign will be done.\n");
1824                         ERR_print_errors(bio_err);
1825                         rsa_count=1;
1826                         }
1827                 else
1828                         {
1829                         pkey_print_message("sign","dsa",
1830                                 dsa_c[j][0],dsa_bits[j],
1831                                 DSA_SECONDS);
1832                         Time_F(START);
1833                         for (count=0,run=1; COND(dsa_c[j][0]); count++)
1834                                 {
1835                                 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1836                                         &kk,dsa_key[j]);
1837                                 if (ret == 0)
1838                                         {
1839                                         BIO_printf(bio_err,
1840                                                 "DSA sign failure\n");
1841                                         ERR_print_errors(bio_err);
1842                                         count=1;
1843                                         break;
1844                                         }
1845                                 }
1846                         d=Time_F(STOP);
1847                         BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1848                                    : "%ld %d bit DSA signs in %.2fs\n",
1849                                    count,dsa_bits[j],d);
1850                         dsa_results[j][0]=d/(double)count;
1851                         rsa_count=count;
1852                         }
1853
1854                 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1855                         kk,dsa_key[j]);
1856                 if (ret <= 0)
1857                         {
1858                         BIO_printf(bio_err,"DSA verify failure.  No DSA verify will be done.\n");
1859                         ERR_print_errors(bio_err);
1860                         dsa_doit[j] = 0;
1861                         }
1862                 else
1863                         {
1864                         pkey_print_message("verify","dsa",
1865                                 dsa_c[j][1],dsa_bits[j],
1866                                 DSA_SECONDS);
1867                         Time_F(START);
1868                         for (count=0,run=1; COND(dsa_c[j][1]); count++)
1869                                 {
1870                                 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1871                                         kk,dsa_key[j]);
1872                                 if (ret <= 0)
1873                                         {
1874                                         BIO_printf(bio_err,
1875                                                 "DSA verify failure\n");
1876                                         ERR_print_errors(bio_err);
1877                                         count=1;
1878                                         break;
1879                                         }
1880                                 }
1881                         d=Time_F(STOP);
1882                         BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1883                                    : "%ld %d bit DSA verify in %.2fs\n",
1884                                    count,dsa_bits[j],d);
1885                         dsa_results[j][1]=d/(double)count;
1886                         }
1887
1888                 if (rsa_count <= 1)
1889                         {
1890                         /* if longer than 10s, don't do any more */
1891                         for (j++; j<DSA_NUM; j++)
1892                                 dsa_doit[j]=0;
1893                         }
1894                 }
1895         if (rnd_fake) RAND_cleanup();
1896 #endif
1897
1898 #ifndef OPENSSL_NO_ECDSA
1899         if (RAND_status() != 1) 
1900                 {
1901                 RAND_seed(rnd_seed, sizeof rnd_seed);
1902                 rnd_fake = 1;
1903                 }
1904         for (j=0; j<EC_NUM; j++) 
1905                 {
1906                 int ret;
1907
1908                 if (!ecdsa_doit[j]) continue; /* Ignore Curve */ 
1909                 ecdsa[j] = EC_KEY_new();
1910                 if (ecdsa[j] == NULL) 
1911                         {
1912                         BIO_printf(bio_err,"ECDSA failure.\n");
1913                         ERR_print_errors(bio_err);
1914                         rsa_count=1;
1915                         } 
1916                 else 
1917                         {
1918                         ecdsa[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
1919                         /* Could not obtain group information */
1920                         if (ecdsa[j]->group == NULL) 
1921                                 {
1922                                 BIO_printf(bio_err,"ECDSA failure.Could not obtain group information\n");
1923                                 ERR_print_errors(bio_err);
1924                                 rsa_count=1;
1925                                 } 
1926                         else 
1927                                 {
1928                                 /* Perform ECDSA signature test */
1929                                 EC_KEY_generate_key(ecdsa[j]);
1930                                 ret = ECDSA_sign(0, buf, 20, ecdsasig, 
1931                                         &ecdsasiglen, ecdsa[j]);
1932                                 if (ret == 0) 
1933                                         {
1934                                         BIO_printf(bio_err,"ECDSA sign failure.  No ECDSA sign will be done.\n");
1935                                         ERR_print_errors(bio_err);
1936                                         rsa_count=1;
1937                                         } 
1938                                 else 
1939                                         {
1940                                         pkey_print_message("sign","ecdsa",
1941                                                 ecdsa_c[j][0], 
1942                                                 test_curves_bits[j],
1943                                                 ECDSA_SECONDS);
1944
1945                                         Time_F(START);
1946                                         for (count=0,run=1; COND(ecdsa_c[j][0]);
1947                                                 count++) 
1948                                                 {
1949                                                 ret=ECDSA_sign(0, buf, 20, 
1950                                                         ecdsasig, &ecdsasiglen,
1951                                                         ecdsa[j]);
1952                                                 if (ret == 0) 
1953                                                         {
1954                                                         BIO_printf(bio_err, "ECDSA sign failure\n");
1955                                                         ERR_print_errors(bio_err);
1956                                                         count=1;
1957                                                         break;
1958                                                         }
1959                                                 }
1960                                                 d=Time_F(STOP);
1961
1962                                                 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
1963                                                 "%ld %d bit ECDSA signs in %.2fs \n", 
1964                                                 count, test_curves_bits[j], d);
1965                                                 ecdsa_results[j][0]=d/(double)count;
1966                                                 rsa_count=count;
1967                                         }
1968
1969                                 /* Perform ECDSA verification test */
1970                                 ret=ECDSA_verify(0, buf, 20, ecdsasig, 
1971                                         ecdsasiglen, ecdsa[j]);
1972                                 if (ret != 1) 
1973                                         {
1974                                         BIO_printf(bio_err,"ECDSA verify failure.  No ECDSA verify will be done.\n");
1975                                         ERR_print_errors(bio_err);
1976                                         ecdsa_doit[j] = 0;
1977                                         } 
1978                                 else 
1979                                         {
1980                                         pkey_print_message("verify","ecdsa",
1981                                         ecdsa_c[j][1],
1982                                         test_curves_bits[j],
1983                                         ECDSA_SECONDS);
1984                                         Time_F(START);
1985                                         for (count=0,run=1; COND(ecdsa_c[j][1]); count++) 
1986                                                 {
1987                                                 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
1988                                                 if (ret != 1) 
1989                                                         {
1990                                                         BIO_printf(bio_err, "ECDSA verify failure\n");
1991                                                         ERR_print_errors(bio_err);
1992                                                         count=1;
1993                                                         break;
1994                                                         }
1995                                                 }
1996                                                 d=Time_F(STOP);
1997                                                 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
1998                                                         : "%ld %d bit ECDSA verify in %.2fs\n",
1999                                                 count, test_curves_bits[j], d);
2000                                                 ecdsa_results[j][1]=d/(double)count;
2001                                         }
2002
2003                                 if (rsa_count <= 1) 
2004                                         {
2005                                         /* if longer than 10s, don't do any more */
2006                                         for (j++; j<EC_NUM; j++)
2007                                         ecdsa_doit[j]=0;
2008                                         }
2009                                 }
2010                         }
2011                 }
2012         if (rnd_fake) RAND_cleanup();
2013 #endif
2014
2015 #ifndef OPENSSL_NO_ECDH
2016         if (RAND_status() != 1)
2017                 {
2018                 RAND_seed(rnd_seed, sizeof rnd_seed);
2019                 rnd_fake = 1;
2020                 }
2021         for (j=0; j<EC_NUM; j++)
2022                 {
2023                 if (!ecdh_doit[j]) continue;
2024                 ecdh_a[j] = EC_KEY_new();
2025                 ecdh_b[j] = EC_KEY_new();
2026                 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2027                         {
2028                         BIO_printf(bio_err,"ECDH failure.\n");
2029                         ERR_print_errors(bio_err);
2030                         rsa_count=1;
2031                         }
2032                 else
2033                         {
2034                         ecdh_a[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
2035                         if (ecdh_a[j]->group == NULL)
2036                                 {
2037                                 BIO_printf(bio_err,"ECDH failure.\n");
2038                                 ERR_print_errors(bio_err);
2039                                 rsa_count=1;
2040                                 }
2041                         else
2042                                 {
2043                                 ecdh_b[j]->group = ecdh_a[j]->group;
2044
2045                                 /* generate two ECDH key pairs */
2046                                 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2047                                         !EC_KEY_generate_key(ecdh_b[j]))
2048                                         {
2049                                         BIO_printf(bio_err,"ECDH key generation failure.\n");
2050                                         ERR_print_errors(bio_err);
2051                                         rsa_count=1;            
2052                                         }
2053                                 else
2054                                         {
2055                                         secret_size_a = ECDH_compute_key(secret_a, 
2056                                                 ecdh_b[j]->pub_key,
2057                                                 ecdh_a[j]);
2058                                         secret_size_b = ECDH_compute_key(secret_b, 
2059                                                 ecdh_a[j]->pub_key,
2060                                                 ecdh_b[j]);
2061                                         if (secret_size_a != secret_size_b) 
2062                                                 ecdh_checks = 0;
2063                                         else
2064                                                 ecdh_checks = 1;
2065
2066                                         for (secret_idx = 0; 
2067                                             (secret_idx < secret_size_a)
2068                                                 && (ecdh_checks == 1);
2069                                             secret_idx++)
2070                                                 {
2071                                                 if (secret_a[secret_idx] != secret_b[secret_idx])
2072                                                 ecdh_checks = 0;
2073                                                 }
2074
2075                                         if (ecdh_checks == 0)
2076                                                 {
2077                                                 BIO_printf(bio_err,"ECDH computations don't match.\n");
2078                                                 ERR_print_errors(bio_err);
2079                                                 rsa_count=1;            
2080                                                 }
2081
2082                                         pkey_print_message("","ecdh",
2083                                         ecdh_c[j][0], 
2084                                         test_curves_bits[j],
2085                                         ECDH_SECONDS);
2086                                         Time_F(START);
2087                                         for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2088                                                 {
2089                                                 ECDH_compute_key(secret_a, 
2090                                                 ecdh_b[j]->pub_key,
2091                                                 ecdh_a[j]);
2092                                                 }
2093                                         d=Time_F(STOP);
2094                                         BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2095                                         count, test_curves_bits[j], d);
2096                                         ecdh_results[j][0]=d/(double)count;
2097                                         rsa_count=count;
2098                                         }
2099                                 }
2100                         }
2101
2102                 if (rsa_count <= 1)
2103                         {
2104                         /* if longer than 10s, don't do any more */
2105                         for (j++; j<EC_NUM; j++)
2106                         ecdh_doit[j]=0;
2107                         }
2108                 }
2109         if (rnd_fake) RAND_cleanup();
2110 #endif
2111 #ifdef HAVE_FORK
2112 show_res:
2113 #endif
2114         if(!mr)
2115                 {
2116                 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
2117         fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
2118                 printf("options:");
2119                 printf("%s ",BN_options());
2120 #ifndef OPENSSL_NO_MD2
2121                 printf("%s ",MD2_options());
2122 #endif
2123 #ifndef OPENSSL_NO_RC4
2124                 printf("%s ",RC4_options());
2125 #endif
2126 #ifndef OPENSSL_NO_DES
2127                 printf("%s ",DES_options());
2128 #endif
2129 #ifndef OPENSSL_NO_AES
2130                 printf("%s ",AES_options());
2131 #endif
2132 #ifndef OPENSSL_NO_IDEA
2133                 printf("%s ",idea_options());
2134 #endif
2135 #ifndef OPENSSL_NO_BF
2136                 printf("%s ",BF_options());
2137 #endif
2138                 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2139                 printf("available timing options: ");
2140 #ifdef TIMES
2141                 printf("TIMES ");
2142 #endif
2143 #ifdef TIMEB
2144                 printf("TIMEB ");
2145 #endif
2146 #ifdef USE_TOD
2147                 printf("USE_TOD ");
2148 #endif
2149 #ifdef HZ
2150 #define as_string(s) (#s)
2151                 printf("HZ=%g", (double)HZ);
2152 # ifdef _SC_CLK_TCK
2153                 printf(" [sysconf value]");
2154 # endif
2155 #endif
2156                 printf("\n");
2157                 printf("timing function used: %s%s%s%s%s%s%s\n",
2158                        (ftime_used ? "ftime" : ""),
2159                        (ftime_used + times_used > 1 ? "," : ""),
2160                        (times_used ? "times" : ""),
2161                        (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
2162                        (gettimeofday_used ? "gettimeofday" : ""),
2163                        (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
2164                        (getrusage_used ? "getrusage" : ""));
2165                 }
2166
2167         if (pr_header)
2168                 {
2169                 if(mr)
2170                         fprintf(stdout,"+H");
2171                 else
2172                         {
2173                         fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n"); 
2174                         fprintf(stdout,"type        ");
2175                         }
2176                 for (j=0;  j<SIZE_NUM; j++)
2177                         fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
2178                 fprintf(stdout,"\n");
2179                 }
2180
2181         for (k=0; k<ALGOR_NUM; k++)
2182                 {
2183                 if (!doit[k]) continue;
2184                 if(mr)
2185                         fprintf(stdout,"+F:%d:%s",k,names[k]);
2186                 else
2187                         fprintf(stdout,"%-13s",names[k]);
2188                 for (j=0; j<SIZE_NUM; j++)
2189                         {
2190                         if (results[k][j] > 10000 && !mr)
2191                                 fprintf(stdout," %11.2fk",results[k][j]/1e3);
2192                         else
2193                                 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
2194                         }
2195                 fprintf(stdout,"\n");
2196                 }
2197 #ifndef OPENSSL_NO_RSA
2198         j=1;
2199         for (k=0; k<RSA_NUM; k++)
2200                 {
2201                 if (!rsa_doit[k]) continue;
2202                 if (j && !mr)
2203                         {
2204                         printf("%18ssign    verify    sign/s verify/s\n"," ");
2205                         j=0;
2206                         }
2207                 if(mr)
2208                         fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2209                                 k,rsa_bits[k],rsa_results[k][0],
2210                                 rsa_results[k][1]);
2211                 else
2212                         fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2213                                 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2214                                 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
2215                 }
2216 #endif
2217 #ifndef OPENSSL_NO_DSA
2218         j=1;
2219         for (k=0; k<DSA_NUM; k++)
2220                 {
2221                 if (!dsa_doit[k]) continue;
2222                 if (j && !mr)
2223                         {
2224                         printf("%18ssign    verify    sign/s verify/s\n"," ");
2225                         j=0;
2226                         }
2227                 if(mr)
2228                         fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2229                                 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2230                 else
2231                         fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2232                                 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2233                                 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
2234                 }
2235 #endif
2236 #ifndef OPENSSL_NO_ECDSA
2237         j=1;
2238         for (k=0; k<EC_NUM; k++)
2239                 {
2240                 if (!ecdsa_doit[k]) continue;
2241                 if (j && !mr)
2242                         {
2243                         printf("%30ssign    verify    sign/s verify/s\n"," ");
2244                         j=0;
2245                         }
2246
2247                 if (mr)
2248                         fprintf(stdout,"+F4:%u:%u:%f:%f\n", 
2249                                 k, test_curves_bits[k],
2250                                 ecdsa_results[k][0],ecdsa_results[k][1]);
2251                 else
2252                         fprintf(stdout,
2253                                 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n", 
2254                                 test_curves_bits[k],
2255                                 test_curves_names[k],
2256                                 ecdsa_results[k][0],ecdsa_results[k][1], 
2257                                 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2258                 }
2259 #endif
2260
2261
2262 #ifndef OPENSSL_NO_ECDH
2263         j=1;
2264         for (k=0; k<EC_NUM; k++)
2265                 {
2266                 if (!ecdh_doit[k]) continue;
2267                 if (j && !mr)
2268                         {
2269                         printf("%30sop      op/s\n"," ");
2270                         j=0;
2271                         }
2272                 if (mr)
2273                         fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2274                                 k, test_curves_bits[k],
2275                                 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2276
2277                 else
2278                         fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2279                                 test_curves_bits[k],
2280                                 test_curves_names[k],
2281                                 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2282                 }
2283 #endif
2284
2285         mret=0;
2286
2287 end:
2288         ERR_print_errors(bio_err);
2289         if (buf != NULL) OPENSSL_free(buf);
2290         if (buf2 != NULL) OPENSSL_free(buf2);
2291 #ifndef OPENSSL_NO_RSA
2292         for (i=0; i<RSA_NUM; i++)
2293                 if (rsa_key[i] != NULL)
2294                         RSA_free(rsa_key[i]);
2295 #endif
2296 #ifndef OPENSSL_NO_DSA
2297         for (i=0; i<DSA_NUM; i++)
2298                 if (dsa_key[i] != NULL)
2299                         DSA_free(dsa_key[i]);
2300 #endif
2301
2302 #ifndef OPENSSL_NO_ECDSA
2303         for (i=0; i<EC_NUM; i++)
2304                 if (ecdsa[i] != NULL)
2305                         EC_KEY_free(ecdsa[i]);
2306 #endif
2307 #ifndef OPENSSL_NO_ECDH
2308         for (i=0; i<EC_NUM; i++)
2309         {
2310                 if (ecdh_a[i] != NULL)
2311                         EC_KEY_free(ecdh_a[i]);
2312                 if (ecdh_b[i] != NULL)
2313                         EC_KEY_free(ecdh_b[i]);
2314         }
2315 #endif
2316
2317         apps_shutdown();
2318         EXIT(mret);
2319         }
2320
2321 static void print_message(const char *s, long num, int length)
2322         {
2323 #ifdef SIGALRM
2324         BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2325                    : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
2326         (void)BIO_flush(bio_err);
2327         alarm(SECONDS);
2328 #else
2329         BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2330                    : "Doing %s %ld times on %d size blocks: ",s,num,length);
2331         (void)BIO_flush(bio_err);
2332 #endif
2333 #ifdef LINT
2334         num=num;
2335 #endif
2336         }
2337
2338 static void pkey_print_message(char *str, char *str2, long num, int bits,
2339              int tm)
2340         {
2341 #ifdef SIGALRM
2342         BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2343                            : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
2344         (void)BIO_flush(bio_err);
2345         alarm(RSA_SECONDS);
2346 #else
2347         BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2348                            : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
2349         (void)BIO_flush(bio_err);
2350 #endif
2351 #ifdef LINT
2352         num=num;
2353 #endif
2354         }
2355
2356 static void print_result(int alg,int run_no,int count,double time_used)
2357         {
2358         BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
2359                    : "%ld %s's in %.2fs\n",count,names[alg],time_used);
2360         results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2361         }
2362
2363 static char *sstrsep(char **string, const char *delim)
2364     {
2365     char isdelim[256];
2366     char *token = *string;
2367
2368     if (**string == 0)
2369         return NULL;
2370
2371     memset(isdelim, 0, sizeof isdelim);
2372     isdelim[0] = 1;
2373
2374     while (*delim)
2375         {
2376         isdelim[(unsigned char)(*delim)] = 1;
2377         delim++;
2378         }
2379
2380     while (!isdelim[(unsigned char)(**string)])
2381         {
2382         (*string)++;
2383         }
2384
2385     if (**string)
2386         {
2387         **string = 0;
2388         (*string)++;
2389         }
2390
2391     return token;
2392     }
2393
2394 #ifdef HAVE_FORK
2395 static int do_multi(int multi)
2396         {
2397         int n;
2398         int fd[2];
2399         int *fds;
2400         static char sep[]=":";
2401
2402         fds=malloc(multi*sizeof *fds);
2403         for(n=0 ; n < multi ; ++n)
2404                 {
2405                 pipe(fd);
2406                 if(fork())
2407                         {
2408                         close(fd[1]);
2409                         fds[n]=fd[0];
2410                         }
2411                 else
2412                         {
2413                         close(fd[0]);
2414                         close(1);
2415                         dup(fd[1]);
2416                         close(fd[1]);
2417                         mr=1;
2418                         usertime=0;
2419                         return 0;
2420                         }
2421                 printf("Forked child %d\n",n);
2422                 }
2423
2424         /* for now, assume the pipe is long enough to take all the output */
2425         for(n=0 ; n < multi ; ++n)
2426                 {
2427                 FILE *f;
2428                 char buf[1024];
2429                 char *p;
2430
2431                 f=fdopen(fds[n],"r");
2432                 while(fgets(buf,sizeof buf,f))
2433                         {
2434                         p=strchr(buf,'\n');
2435                         if(p)
2436                                 *p='\0';
2437                         if(buf[0] != '+')
2438                                 {
2439                                 fprintf(stderr,"Don't understand line '%s' from child %d\n",
2440                                                 buf,n);
2441                                 continue;
2442                                 }
2443                         printf("Got: %s from %d\n",buf,n);
2444                         if(!strncmp(buf,"+F:",3))
2445                                 {
2446                                 int alg;
2447                                 int j;
2448
2449                                 p=buf+3;
2450                                 alg=atoi(sstrsep(&p,sep));
2451                                 sstrsep(&p,sep);
2452                                 for(j=0 ; j < SIZE_NUM ; ++j)
2453                                         results[alg][j]+=atof(sstrsep(&p,sep));
2454                                 }
2455                         else if(!strncmp(buf,"+F2:",4))
2456                                 {
2457                                 int k;
2458                                 double d;
2459                                 
2460                                 p=buf+4;
2461                                 k=atoi(sstrsep(&p,sep));
2462                                 sstrsep(&p,sep);
2463
2464                                 d=atof(sstrsep(&p,sep));
2465                                 if(n)
2466                                         rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2467                                 else
2468                                         rsa_results[k][0]=d;
2469
2470                                 d=atof(sstrsep(&p,sep));
2471                                 if(n)
2472                                         rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2473                                 else
2474                                         rsa_results[k][1]=d;
2475                                 }
2476                         else if(!strncmp(buf,"+F2:",4))
2477                                 {
2478                                 int k;
2479                                 double d;
2480                                 
2481                                 p=buf+4;
2482                                 k=atoi(sstrsep(&p,sep));
2483                                 sstrsep(&p,sep);
2484
2485                                 d=atof(sstrsep(&p,sep));
2486                                 if(n)
2487                                         rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2488                                 else
2489                                         rsa_results[k][0]=d;
2490
2491                                 d=atof(sstrsep(&p,sep));
2492                                 if(n)
2493                                         rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2494                                 else
2495                                         rsa_results[k][1]=d;
2496                                 }
2497                         else if(!strncmp(buf,"+F3:",4))
2498                                 {
2499                                 int k;
2500                                 double d;
2501                                 
2502                                 p=buf+4;
2503                                 k=atoi(sstrsep(&p,sep));
2504                                 sstrsep(&p,sep);
2505
2506                                 d=atof(sstrsep(&p,sep));
2507                                 if(n)
2508                                         dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2509                                 else
2510                                         dsa_results[k][0]=d;
2511
2512                                 d=atof(sstrsep(&p,sep));
2513                                 if(n)
2514                                         dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2515                                 else
2516                                         dsa_results[k][1]=d;
2517                                 }
2518 #ifndef OPENSSL_NO_ECDSA
2519                         else if(!strncmp(buf,"+F4:",4))
2520                                 {
2521                                 int k;
2522                                 double d;
2523                                 
2524                                 p=buf+4;
2525                                 k=atoi(sstrsep(&p,sep));
2526                                 sstrsep(&p,sep);
2527
2528                                 d=atof(sstrsep(&p,sep));
2529                                 if(n)
2530                                         ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2531                                 else
2532                                         ecdsa_results[k][0]=d;
2533
2534                                 d=atof(sstrsep(&p,sep));
2535                                 if(n)
2536                                         ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2537                                 else
2538                                         ecdsa_results[k][1]=d;
2539                                 }
2540 #endif 
2541
2542 #ifndef OPENSSL_NO_ECDH
2543                         else if(!strncmp(buf,"+F5:",4))
2544                                 {
2545                                 int k;
2546                                 double d;
2547                                 
2548                                 p=buf+4;
2549                                 k=atoi(sstrsep(&p,sep));
2550                                 sstrsep(&p,sep);
2551
2552                                 d=atof(sstrsep(&p,sep));
2553                                 if(n)
2554                                         ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2555                                 else
2556                                         ecdh_results[k][0]=d;
2557
2558                                 }
2559 #endif
2560
2561                         else if(!strncmp(buf,"+H:",3))
2562                                 {
2563                                 }
2564                         else
2565                                 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);
2566                         }
2567                 }
2568         return 1;
2569         }
2570 #endif