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