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