Make sure sysconf exists (it doesn't in the VMS C RTL lesser than version 7).
[openssl.git] / apps / speed.c
1 /* apps/speed.c -*- mode:C; c-file-style: "eay" -*- */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  * 
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  * 
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  * 
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from 
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  * 
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  * 
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58 /* ====================================================================
59  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
60  *
61  * Portions of the attached software ("Contribution") are developed by 
62  * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
63  *
64  * The Contribution is licensed pursuant to the OpenSSL open source
65  * license provided above.
66  *
67  * The ECDH and ECDSA speed test software is originally written by 
68  * Sumit Gupta of Sun Microsystems Laboratories.
69  *
70  */
71
72 /* most of this code has been pilfered from my libdes speed.c program */
73
74 #undef SECONDS
75 #define SECONDS         3       
76 #define RSA_SECONDS     10
77 #define DSA_SECONDS     10
78 #define ECDSA_SECONDS   10
79 #define ECDH_SECONDS    10
80
81 /* 11-Sep-92 Andrew Daviel   Support for Silicon Graphics IRIX added */
82 /* 06-Apr-92 Luke Brennan    Support for VMS and add extra signal calls */
83
84 #undef PROG
85 #define PROG speed_main
86
87 #include <stdio.h>
88 #include <stdlib.h>
89 #include <signal.h>
90 #include <string.h>
91 #include <math.h>
92 #include "apps.h"
93 #ifdef OPENSSL_NO_STDIO
94 #define APPS_WIN16
95 #endif
96 #include <openssl/crypto.h>
97 #include <openssl/rand.h>
98 #include <openssl/err.h>
99 #include <openssl/evp.h>
100 #include <openssl/objects.h>
101 #if !defined(OPENSSL_SYS_MSDOS)
102 #include OPENSSL_UNISTD
103 #endif
104
105 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
106 # define USE_TOD
107 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
108 # define TIMES
109 #endif
110 #if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_MPE) && !defined(__NetBSD__) && !defined(OPENSSL_SYS_VXWORKS) /* FIXME */
111 # define TIMEB
112 #endif
113
114 #ifndef _IRIX
115 # include <time.h>
116 #endif
117 #ifdef TIMES
118 # include <sys/types.h>
119 # include <sys/times.h>
120 #endif
121 #ifdef USE_TOD
122 # include <sys/time.h>
123 # include <sys/resource.h>
124 #endif
125
126 /* Depending on the VMS version, the tms structure is perhaps defined.
127    The __TMS macro will show if it was.  If it wasn't defined, we should
128    undefine TIMES, since that tells the rest of the program how things
129    should be handled.                           -- Richard Levitte */
130 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
131 #undef TIMES
132 #endif
133
134 #ifdef TIMEB
135 #include <sys/timeb.h>
136 #endif
137
138 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS)
139 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
140 #endif
141
142 #if defined(sun) || defined(__ultrix)
143 #define _POSIX_SOURCE
144 #include <limits.h>
145 #include <sys/param.h>
146 #endif
147
148 #ifndef OPENSSL_NO_DES
149 #include <openssl/des.h>
150 #endif
151 #ifndef OPENSSL_NO_AES
152 #include <openssl/aes.h>
153 #endif
154 #ifndef OPENSSL_NO_MD2
155 #include <openssl/md2.h>
156 #endif
157 #ifndef OPENSSL_NO_MDC2
158 #include <openssl/mdc2.h>
159 #endif
160 #ifndef OPENSSL_NO_MD4
161 #include <openssl/md4.h>
162 #endif
163 #ifndef OPENSSL_NO_MD5
164 #include <openssl/md5.h>
165 #endif
166 #ifndef OPENSSL_NO_HMAC
167 #include <openssl/hmac.h>
168 #endif
169 #include <openssl/evp.h>
170 #ifndef OPENSSL_NO_SHA
171 #include <openssl/sha.h>
172 #endif
173 #ifndef OPENSSL_NO_RIPEMD
174 #include <openssl/ripemd.h>
175 #endif
176 #ifndef OPENSSL_NO_RC4
177 #include <openssl/rc4.h>
178 #endif
179 #ifndef OPENSSL_NO_RC5
180 #include <openssl/rc5.h>
181 #endif
182 #ifndef OPENSSL_NO_RC2
183 #include <openssl/rc2.h>
184 #endif
185 #ifndef OPENSSL_NO_IDEA
186 #include <openssl/idea.h>
187 #endif
188 #ifndef OPENSSL_NO_BF
189 #include <openssl/blowfish.h>
190 #endif
191 #ifndef OPENSSL_NO_CAST
192 #include <openssl/cast.h>
193 #endif
194 #ifndef OPENSSL_NO_RSA
195 #include <openssl/rsa.h>
196 #include "./testrsa.h"
197 #endif
198 #include <openssl/x509.h>
199 #ifndef OPENSSL_NO_DSA
200 #include "./testdsa.h"
201 #endif
202 #ifndef OPENSSL_NO_ECDSA
203 #include <openssl/ecdsa.h>
204 #endif
205 #ifndef OPENSSL_NO_ECDH
206 #include <openssl/ecdh.h>
207 #endif
208
209 /* The following if from times(3) man page.  It may need to be changed */
210 #ifndef HZ
211 # 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                                 }
1704                         if (evp_md)
1705                                 {
1706                                 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1707                                 print_message(names[D_EVP],save_count,
1708                                         lengths[j]);
1709
1710                                 Time_F(START);
1711                                 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1712                                         EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1713
1714                                 d=Time_F(STOP);
1715                                 }
1716                         print_result(D_EVP,j,count,d);
1717                         }
1718                 }
1719
1720         RAND_pseudo_bytes(buf,36);
1721 #ifndef OPENSSL_NO_RSA
1722         for (j=0; j<RSA_NUM; j++)
1723                 {
1724                 int ret;
1725                 if (!rsa_doit[j]) continue;
1726                 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1727                 if (ret == 0)
1728                         {
1729                         BIO_printf(bio_err,"RSA sign failure.  No RSA sign will be done.\n");
1730                         ERR_print_errors(bio_err);
1731                         rsa_count=1;
1732                         }
1733                 else
1734                         {
1735                         pkey_print_message("private","rsa",
1736                                 rsa_c[j][0],rsa_bits[j],
1737                                 RSA_SECONDS);
1738 /*                      RSA_blinding_on(rsa_key[j],NULL); */
1739                         Time_F(START);
1740                         for (count=0,run=1; COND(rsa_c[j][0]); count++)
1741                                 {
1742                                 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1743                                         &rsa_num, rsa_key[j]);
1744                                 if (ret == 0)
1745                                         {
1746                                         BIO_printf(bio_err,
1747                                                 "RSA sign failure\n");
1748                                         ERR_print_errors(bio_err);
1749                                         count=1;
1750                                         break;
1751                                         }
1752                                 }
1753                         d=Time_F(STOP);
1754                         BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1755                                    : "%ld %d bit private RSA's in %.2fs\n",
1756                                    count,rsa_bits[j],d);
1757                         rsa_results[j][0]=d/(double)count;
1758                         rsa_count=count;
1759                         }
1760
1761 #if 1
1762                 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1763                 if (ret <= 0)
1764                         {
1765                         BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
1766                         ERR_print_errors(bio_err);
1767                         rsa_doit[j] = 0;
1768                         }
1769                 else
1770                         {
1771                         pkey_print_message("public","rsa",
1772                                 rsa_c[j][1],rsa_bits[j],
1773                                 RSA_SECONDS);
1774                         Time_F(START);
1775                         for (count=0,run=1; COND(rsa_c[j][1]); count++)
1776                                 {
1777                                 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1778                                         rsa_num, rsa_key[j]);
1779                                 if (ret == 0)
1780                                         {
1781                                         BIO_printf(bio_err,
1782                                                 "RSA verify failure\n");
1783                                         ERR_print_errors(bio_err);
1784                                         count=1;
1785                                         break;
1786                                         }
1787                                 }
1788                         d=Time_F(STOP);
1789                         BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1790                                    : "%ld %d bit public RSA's in %.2fs\n",
1791                                    count,rsa_bits[j],d);
1792                         rsa_results[j][1]=d/(double)count;
1793                         }
1794 #endif
1795
1796                 if (rsa_count <= 1)
1797                         {
1798                         /* if longer than 10s, don't do any more */
1799                         for (j++; j<RSA_NUM; j++)
1800                                 rsa_doit[j]=0;
1801                         }
1802                 }
1803 #endif
1804
1805         RAND_pseudo_bytes(buf,20);
1806 #ifndef OPENSSL_NO_DSA
1807         if (RAND_status() != 1)
1808                 {
1809                 RAND_seed(rnd_seed, sizeof rnd_seed);
1810                 rnd_fake = 1;
1811                 }
1812         for (j=0; j<DSA_NUM; j++)
1813                 {
1814                 unsigned int kk;
1815                 int ret;
1816
1817                 if (!dsa_doit[j]) continue;
1818 /*              DSA_generate_key(dsa_key[j]); */
1819 /*              DSA_sign_setup(dsa_key[j],NULL); */
1820                 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1821                         &kk,dsa_key[j]);
1822                 if (ret == 0)
1823                         {
1824                         BIO_printf(bio_err,"DSA sign failure.  No DSA sign will be done.\n");
1825                         ERR_print_errors(bio_err);
1826                         rsa_count=1;
1827                         }
1828                 else
1829                         {
1830                         pkey_print_message("sign","dsa",
1831                                 dsa_c[j][0],dsa_bits[j],
1832                                 DSA_SECONDS);
1833                         Time_F(START);
1834                         for (count=0,run=1; COND(dsa_c[j][0]); count++)
1835                                 {
1836                                 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1837                                         &kk,dsa_key[j]);
1838                                 if (ret == 0)
1839                                         {
1840                                         BIO_printf(bio_err,
1841                                                 "DSA sign failure\n");
1842                                         ERR_print_errors(bio_err);
1843                                         count=1;
1844                                         break;
1845                                         }
1846                                 }
1847                         d=Time_F(STOP);
1848                         BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1849                                    : "%ld %d bit DSA signs in %.2fs\n",
1850                                    count,dsa_bits[j],d);
1851                         dsa_results[j][0]=d/(double)count;
1852                         rsa_count=count;
1853                         }
1854
1855                 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1856                         kk,dsa_key[j]);
1857                 if (ret <= 0)
1858                         {
1859                         BIO_printf(bio_err,"DSA verify failure.  No DSA verify will be done.\n");
1860                         ERR_print_errors(bio_err);
1861                         dsa_doit[j] = 0;
1862                         }
1863                 else
1864                         {
1865                         pkey_print_message("verify","dsa",
1866                                 dsa_c[j][1],dsa_bits[j],
1867                                 DSA_SECONDS);
1868                         Time_F(START);
1869                         for (count=0,run=1; COND(dsa_c[j][1]); count++)
1870                                 {
1871                                 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1872                                         kk,dsa_key[j]);
1873                                 if (ret <= 0)
1874                                         {
1875                                         BIO_printf(bio_err,
1876                                                 "DSA verify failure\n");
1877                                         ERR_print_errors(bio_err);
1878                                         count=1;
1879                                         break;
1880                                         }
1881                                 }
1882                         d=Time_F(STOP);
1883                         BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1884                                    : "%ld %d bit DSA verify in %.2fs\n",
1885                                    count,dsa_bits[j],d);
1886                         dsa_results[j][1]=d/(double)count;
1887                         }
1888
1889                 if (rsa_count <= 1)
1890                         {
1891                         /* if longer than 10s, don't do any more */
1892                         for (j++; j<DSA_NUM; j++)
1893                                 dsa_doit[j]=0;
1894                         }
1895                 }
1896         if (rnd_fake) RAND_cleanup();
1897 #endif
1898
1899 #ifndef OPENSSL_NO_ECDSA
1900         if (RAND_status() != 1) 
1901                 {
1902                 RAND_seed(rnd_seed, sizeof rnd_seed);
1903                 rnd_fake = 1;
1904                 }
1905         for (j=0; j<EC_NUM; j++) 
1906                 {
1907                 int ret;
1908
1909                 if (!ecdsa_doit[j]) continue; /* Ignore Curve */ 
1910                 ecdsa[j] = EC_KEY_new();
1911                 if (ecdsa[j] == NULL) 
1912                         {
1913                         BIO_printf(bio_err,"ECDSA failure.\n");
1914                         ERR_print_errors(bio_err);
1915                         rsa_count=1;
1916                         } 
1917                 else 
1918                         {
1919                         ecdsa[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
1920                         /* Could not obtain group information */
1921                         if (ecdsa[j]->group == NULL) 
1922                                 {
1923                                 BIO_printf(bio_err,"ECDSA failure.Could not obtain group information\n");
1924                                 ERR_print_errors(bio_err);
1925                                 rsa_count=1;
1926                                 } 
1927                         else 
1928                                 {
1929                                 /* Perform ECDSA signature test */
1930                                 EC_KEY_generate_key(ecdsa[j]);
1931                                 ret = ECDSA_sign(0, buf, 20, ecdsasig, 
1932                                         &ecdsasiglen, ecdsa[j]);
1933                                 if (ret == 0) 
1934                                         {
1935                                         BIO_printf(bio_err,"ECDSA sign failure.  No ECDSA sign will be done.\n");
1936                                         ERR_print_errors(bio_err);
1937                                         rsa_count=1;
1938                                         } 
1939                                 else 
1940                                         {
1941                                         pkey_print_message("sign","ecdsa",
1942                                                 ecdsa_c[j][0], 
1943                                                 test_curves_bits[j],
1944                                                 ECDSA_SECONDS);
1945
1946                                         Time_F(START);
1947                                         for (count=0,run=1; COND(ecdsa_c[j][0]);
1948                                                 count++) 
1949                                                 {
1950                                                 ret=ECDSA_sign(0, buf, 20, 
1951                                                         ecdsasig, &ecdsasiglen,
1952                                                         ecdsa[j]);
1953                                                 if (ret == 0) 
1954                                                         {
1955                                                         BIO_printf(bio_err, "ECDSA sign failure\n");
1956                                                         ERR_print_errors(bio_err);
1957                                                         count=1;
1958                                                         break;
1959                                                         }
1960                                                 }
1961                                                 d=Time_F(STOP);
1962
1963                                                 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
1964                                                 "%ld %d bit ECDSA signs in %.2fs \n", 
1965                                                 count, test_curves_bits[j], d);
1966                                                 ecdsa_results[j][0]=d/(double)count;
1967                                                 rsa_count=count;
1968                                         }
1969
1970                                 /* Perform ECDSA verification test */
1971                                 ret=ECDSA_verify(0, buf, 20, ecdsasig, 
1972                                         ecdsasiglen, ecdsa[j]);
1973                                 if (ret != 1) 
1974                                         {
1975                                         BIO_printf(bio_err,"ECDSA verify failure.  No ECDSA verify will be done.\n");
1976                                         ERR_print_errors(bio_err);
1977                                         ecdsa_doit[j] = 0;
1978                                         } 
1979                                 else 
1980                                         {
1981                                         pkey_print_message("verify","ecdsa",
1982                                         ecdsa_c[j][1],
1983                                         test_curves_bits[j],
1984                                         ECDSA_SECONDS);
1985                                         Time_F(START);
1986                                         for (count=0,run=1; COND(ecdsa_c[j][1]); count++) 
1987                                                 {
1988                                                 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
1989                                                 if (ret != 1) 
1990                                                         {
1991                                                         BIO_printf(bio_err, "ECDSA verify failure\n");
1992                                                         ERR_print_errors(bio_err);
1993                                                         count=1;
1994                                                         break;
1995                                                         }
1996                                                 }
1997                                                 d=Time_F(STOP);
1998                                                 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
1999                                                         : "%ld %d bit ECDSA verify in %.2fs\n",
2000                                                 count, test_curves_bits[j], d);
2001                                                 ecdsa_results[j][1]=d/(double)count;
2002                                         }
2003
2004                                 if (rsa_count <= 1) 
2005                                         {
2006                                         /* if longer than 10s, don't do any more */
2007                                         for (j++; j<EC_NUM; j++)
2008                                         ecdsa_doit[j]=0;
2009                                         }
2010                                 }
2011                         }
2012                 }
2013         if (rnd_fake) RAND_cleanup();
2014 #endif
2015
2016 #ifndef OPENSSL_NO_ECDH
2017         if (RAND_status() != 1)
2018                 {
2019                 RAND_seed(rnd_seed, sizeof rnd_seed);
2020                 rnd_fake = 1;
2021                 }
2022         for (j=0; j<EC_NUM; j++)
2023                 {
2024                 if (!ecdh_doit[j]) continue;
2025                 ecdh_a[j] = EC_KEY_new();
2026                 ecdh_b[j] = EC_KEY_new();
2027                 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2028                         {
2029                         BIO_printf(bio_err,"ECDH failure.\n");
2030                         ERR_print_errors(bio_err);
2031                         rsa_count=1;
2032                         }
2033                 else
2034                         {
2035                         ecdh_a[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
2036                         if (ecdh_a[j]->group == NULL)
2037                                 {
2038                                 BIO_printf(bio_err,"ECDH failure.\n");
2039                                 ERR_print_errors(bio_err);
2040                                 rsa_count=1;
2041                                 }
2042                         else
2043                                 {
2044                                 ecdh_b[j]->group = ecdh_a[j]->group;
2045
2046                                 /* generate two ECDH key pairs */
2047                                 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2048                                         !EC_KEY_generate_key(ecdh_b[j]))
2049                                         {
2050                                         BIO_printf(bio_err,"ECDH key generation failure.\n");
2051                                         ERR_print_errors(bio_err);
2052                                         rsa_count=1;            
2053                                         }
2054                                 else
2055                                         {
2056                                         secret_size_a = ECDH_compute_key(secret_a, 
2057                                                 ecdh_b[j]->pub_key,
2058                                                 ecdh_a[j]);
2059                                         secret_size_b = ECDH_compute_key(secret_b, 
2060                                                 ecdh_a[j]->pub_key,
2061                                                 ecdh_b[j]);
2062                                         if (secret_size_a != secret_size_b) 
2063                                                 ecdh_checks = 0;
2064                                         else
2065                                                 ecdh_checks = 1;
2066
2067                                         for (secret_idx = 0; 
2068                                             (secret_idx < secret_size_a)
2069                                                 && (ecdh_checks == 1);
2070                                             secret_idx++)
2071                                                 {
2072                                                 if (secret_a[secret_idx] != secret_b[secret_idx])
2073                                                 ecdh_checks = 0;
2074                                                 }
2075
2076                                         if (ecdh_checks == 0)
2077                                                 {
2078                                                 BIO_printf(bio_err,"ECDH computations don't match.\n");
2079                                                 ERR_print_errors(bio_err);
2080                                                 rsa_count=1;            
2081                                                 }
2082
2083                                         pkey_print_message("","ecdh",
2084                                         ecdh_c[j][0], 
2085                                         test_curves_bits[j],
2086                                         ECDH_SECONDS);
2087                                         Time_F(START);
2088                                         for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2089                                                 {
2090                                                 ECDH_compute_key(secret_a, 
2091                                                 ecdh_b[j]->pub_key,
2092                                                 ecdh_a[j]);
2093                                                 }
2094                                         d=Time_F(STOP);
2095                                         BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2096                                         count, test_curves_bits[j], d);
2097                                         ecdh_results[j][0]=d/(double)count;
2098                                         rsa_count=count;
2099                                         }
2100                                 }
2101                         }
2102
2103                 if (rsa_count <= 1)
2104                         {
2105                         /* if longer than 10s, don't do any more */
2106                         for (j++; j<EC_NUM; j++)
2107                         ecdh_doit[j]=0;
2108                         }
2109                 }
2110         if (rnd_fake) RAND_cleanup();
2111 #endif
2112 #ifdef HAVE_FORK
2113 show_res:
2114 #endif
2115         if(!mr)
2116                 {
2117                 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
2118         fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
2119                 printf("options:");
2120                 printf("%s ",BN_options());
2121 #ifndef OPENSSL_NO_MD2
2122                 printf("%s ",MD2_options());
2123 #endif
2124 #ifndef OPENSSL_NO_RC4
2125                 printf("%s ",RC4_options());
2126 #endif
2127 #ifndef OPENSSL_NO_DES
2128                 printf("%s ",DES_options());
2129 #endif
2130 #ifndef OPENSSL_NO_AES
2131                 printf("%s ",AES_options());
2132 #endif
2133 #ifndef OPENSSL_NO_IDEA
2134                 printf("%s ",idea_options());
2135 #endif
2136 #ifndef OPENSSL_NO_BF
2137                 printf("%s ",BF_options());
2138 #endif
2139                 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2140                 printf("available timing options: ");
2141 #ifdef TIMES
2142                 printf("TIMES ");
2143 #endif
2144 #ifdef TIMEB
2145                 printf("TIMEB ");
2146 #endif
2147 #ifdef USE_TOD
2148                 printf("USE_TOD ");
2149 #endif
2150 #ifdef HZ
2151 #define as_string(s) (#s)
2152                 printf("HZ=%g", (double)HZ);
2153 # ifdef _SC_CLK_TCK
2154                 printf(" [sysconf value]");
2155 # endif
2156 #endif
2157                 printf("\n");
2158                 printf("timing function used: %s%s%s%s%s%s%s\n",
2159                        (ftime_used ? "ftime" : ""),
2160                        (ftime_used + times_used > 1 ? "," : ""),
2161                        (times_used ? "times" : ""),
2162                        (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
2163                        (gettimeofday_used ? "gettimeofday" : ""),
2164                        (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
2165                        (getrusage_used ? "getrusage" : ""));
2166                 }
2167
2168         if (pr_header)
2169                 {
2170                 if(mr)
2171                         fprintf(stdout,"+H");
2172                 else
2173                         {
2174                         fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n"); 
2175                         fprintf(stdout,"type        ");
2176                         }
2177                 for (j=0;  j<SIZE_NUM; j++)
2178                         fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
2179                 fprintf(stdout,"\n");
2180                 }
2181
2182         for (k=0; k<ALGOR_NUM; k++)
2183                 {
2184                 if (!doit[k]) continue;
2185                 if(mr)
2186                         fprintf(stdout,"+F:%d:%s",k,names[k]);
2187                 else
2188                         fprintf(stdout,"%-13s",names[k]);
2189                 for (j=0; j<SIZE_NUM; j++)
2190                         {
2191                         if (results[k][j] > 10000 && !mr)
2192                                 fprintf(stdout," %11.2fk",results[k][j]/1e3);
2193                         else
2194                                 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
2195                         }
2196                 fprintf(stdout,"\n");
2197                 }
2198 #ifndef OPENSSL_NO_RSA
2199         j=1;
2200         for (k=0; k<RSA_NUM; k++)
2201                 {
2202                 if (!rsa_doit[k]) continue;
2203                 if (j && !mr)
2204                         {
2205                         printf("%18ssign    verify    sign/s verify/s\n"," ");
2206                         j=0;
2207                         }
2208                 if(mr)
2209                         fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2210                                 k,rsa_bits[k],rsa_results[k][0],
2211                                 rsa_results[k][1]);
2212                 else
2213                         fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2214                                 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2215                                 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
2216                 }
2217 #endif
2218 #ifndef OPENSSL_NO_DSA
2219         j=1;
2220         for (k=0; k<DSA_NUM; k++)
2221                 {
2222                 if (!dsa_doit[k]) continue;
2223                 if (j && !mr)
2224                         {
2225                         printf("%18ssign    verify    sign/s verify/s\n"," ");
2226                         j=0;
2227                         }
2228                 if(mr)
2229                         fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2230                                 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2231                 else
2232                         fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2233                                 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2234                                 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
2235                 }
2236 #endif
2237 #ifndef OPENSSL_NO_ECDSA
2238         j=1;
2239         for (k=0; k<EC_NUM; k++)
2240                 {
2241                 if (!ecdsa_doit[k]) continue;
2242                 if (j && !mr)
2243                         {
2244                         printf("%30ssign    verify    sign/s verify/s\n"," ");
2245                         j=0;
2246                         }
2247
2248                 if (mr)
2249                         fprintf(stdout,"+F4:%u:%u:%f:%f\n", 
2250                                 k, test_curves_bits[k],
2251                                 ecdsa_results[k][0],ecdsa_results[k][1]);
2252                 else
2253                         fprintf(stdout,
2254                                 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n", 
2255                                 test_curves_bits[k],
2256                                 test_curves_names[k],
2257                                 ecdsa_results[k][0],ecdsa_results[k][1], 
2258                                 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2259                 }
2260 #endif
2261
2262
2263 #ifndef OPENSSL_NO_ECDH
2264         j=1;
2265         for (k=0; k<EC_NUM; k++)
2266                 {
2267                 if (!ecdh_doit[k]) continue;
2268                 if (j && !mr)
2269                         {
2270                         printf("%30sop      op/s\n"," ");
2271                         j=0;
2272                         }
2273                 if (mr)
2274                         fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2275                                 k, test_curves_bits[k],
2276                                 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2277
2278                 else
2279                         fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2280                                 test_curves_bits[k],
2281                                 test_curves_names[k],
2282                                 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2283                 }
2284 #endif
2285
2286         mret=0;
2287
2288 end:
2289         ERR_print_errors(bio_err);
2290         if (buf != NULL) OPENSSL_free(buf);
2291         if (buf2 != NULL) OPENSSL_free(buf2);
2292 #ifndef OPENSSL_NO_RSA
2293         for (i=0; i<RSA_NUM; i++)
2294                 if (rsa_key[i] != NULL)
2295                         RSA_free(rsa_key[i]);
2296 #endif
2297 #ifndef OPENSSL_NO_DSA
2298         for (i=0; i<DSA_NUM; i++)
2299                 if (dsa_key[i] != NULL)
2300                         DSA_free(dsa_key[i]);
2301 #endif
2302
2303 #ifndef OPENSSL_NO_ECDSA
2304         for (i=0; i<EC_NUM; i++)
2305                 if (ecdsa[i] != NULL)
2306                         EC_KEY_free(ecdsa[i]);
2307 #endif
2308 #ifndef OPENSSL_NO_ECDH
2309         for (i=0; i<EC_NUM; i++)
2310         {
2311                 if (ecdh_a[i] != NULL)
2312                         EC_KEY_free(ecdh_a[i]);
2313                 if (ecdh_b[i] != NULL)
2314                         EC_KEY_free(ecdh_b[i]);
2315         }
2316 #endif
2317
2318         apps_shutdown();
2319         EXIT(mret);
2320         }
2321
2322 static void print_message(const char *s, long num, int length)
2323         {
2324 #ifdef SIGALRM
2325         BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2326                    : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
2327         (void)BIO_flush(bio_err);
2328         alarm(SECONDS);
2329 #else
2330         BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2331                    : "Doing %s %ld times on %d size blocks: ",s,num,length);
2332         (void)BIO_flush(bio_err);
2333 #endif
2334 #ifdef LINT
2335         num=num;
2336 #endif
2337         }
2338
2339 static void pkey_print_message(char *str, char *str2, long num, int bits,
2340              int tm)
2341         {
2342 #ifdef SIGALRM
2343         BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2344                            : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
2345         (void)BIO_flush(bio_err);
2346         alarm(RSA_SECONDS);
2347 #else
2348         BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2349                            : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
2350         (void)BIO_flush(bio_err);
2351 #endif
2352 #ifdef LINT
2353         num=num;
2354 #endif
2355         }
2356
2357 static void print_result(int alg,int run_no,int count,double time_used)
2358         {
2359         BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
2360                    : "%ld %s's in %.2fs\n",count,names[alg],time_used);
2361         results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2362         }
2363
2364 static char *sstrsep(char **string, const char *delim)
2365     {
2366     char isdelim[256];
2367     char *token = *string;
2368
2369     if (**string == 0)
2370         return NULL;
2371
2372     memset(isdelim, 0, sizeof isdelim);
2373     isdelim[0] = 1;
2374
2375     while (*delim)
2376         {
2377         isdelim[(unsigned char)(*delim)] = 1;
2378         delim++;
2379         }
2380
2381     while (!isdelim[(unsigned char)(**string)])
2382         {
2383         (*string)++;
2384         }
2385
2386     if (**string)
2387         {
2388         **string = 0;
2389         (*string)++;
2390         }
2391
2392     return token;
2393     }
2394
2395 #ifdef HAVE_FORK
2396 static int do_multi(int multi)
2397         {
2398         int n;
2399         int fd[2];
2400         int *fds;
2401         static char sep[]=":";
2402
2403         fds=malloc(multi*sizeof *fds);
2404         for(n=0 ; n < multi ; ++n)
2405                 {
2406                 pipe(fd);
2407                 if(fork())
2408                         {
2409                         close(fd[1]);
2410                         fds[n]=fd[0];
2411                         }
2412                 else
2413                         {
2414                         close(fd[0]);
2415                         close(1);
2416                         dup(fd[1]);
2417                         close(fd[1]);
2418                         mr=1;
2419                         usertime=0;
2420                         return 0;
2421                         }
2422                 printf("Forked child %d\n",n);
2423                 }
2424
2425         /* for now, assume the pipe is long enough to take all the output */
2426         for(n=0 ; n < multi ; ++n)
2427                 {
2428                 FILE *f;
2429                 char buf[1024];
2430                 char *p;
2431
2432                 f=fdopen(fds[n],"r");
2433                 while(fgets(buf,sizeof buf,f))
2434                         {
2435                         p=strchr(buf,'\n');
2436                         if(p)
2437                                 *p='\0';
2438                         if(buf[0] != '+')
2439                                 {
2440                                 fprintf(stderr,"Don't understand line '%s' from child %d\n",
2441                                                 buf,n);
2442                                 continue;
2443                                 }
2444                         printf("Got: %s from %d\n",buf,n);
2445                         if(!strncmp(buf,"+F:",3))
2446                                 {
2447                                 int alg;
2448                                 int j;
2449
2450                                 p=buf+3;
2451                                 alg=atoi(sstrsep(&p,sep));
2452                                 sstrsep(&p,sep);
2453                                 for(j=0 ; j < SIZE_NUM ; ++j)
2454                                         results[alg][j]+=atof(sstrsep(&p,sep));
2455                                 }
2456                         else if(!strncmp(buf,"+F2:",4))
2457                                 {
2458                                 int k;
2459                                 double d;
2460                                 
2461                                 p=buf+4;
2462                                 k=atoi(sstrsep(&p,sep));
2463                                 sstrsep(&p,sep);
2464
2465                                 d=atof(sstrsep(&p,sep));
2466                                 if(n)
2467                                         rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2468                                 else
2469                                         rsa_results[k][0]=d;
2470
2471                                 d=atof(sstrsep(&p,sep));
2472                                 if(n)
2473                                         rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2474                                 else
2475                                         rsa_results[k][1]=d;
2476                                 }
2477                         else if(!strncmp(buf,"+F2:",4))
2478                                 {
2479                                 int k;
2480                                 double d;
2481                                 
2482                                 p=buf+4;
2483                                 k=atoi(sstrsep(&p,sep));
2484                                 sstrsep(&p,sep);
2485
2486                                 d=atof(sstrsep(&p,sep));
2487                                 if(n)
2488                                         rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2489                                 else
2490                                         rsa_results[k][0]=d;
2491
2492                                 d=atof(sstrsep(&p,sep));
2493                                 if(n)
2494                                         rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2495                                 else
2496                                         rsa_results[k][1]=d;
2497                                 }
2498                         else if(!strncmp(buf,"+F3:",4))
2499                                 {
2500                                 int k;
2501                                 double d;
2502                                 
2503                                 p=buf+4;
2504                                 k=atoi(sstrsep(&p,sep));
2505                                 sstrsep(&p,sep);
2506
2507                                 d=atof(sstrsep(&p,sep));
2508                                 if(n)
2509                                         dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2510                                 else
2511                                         dsa_results[k][0]=d;
2512
2513                                 d=atof(sstrsep(&p,sep));
2514                                 if(n)
2515                                         dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2516                                 else
2517                                         dsa_results[k][1]=d;
2518                                 }
2519 #ifndef OPENSSL_NO_ECDSA
2520                         else if(!strncmp(buf,"+F4:",4))
2521                                 {
2522                                 int k;
2523                                 double d;
2524                                 
2525                                 p=buf+4;
2526                                 k=atoi(sstrsep(&p,sep));
2527                                 sstrsep(&p,sep);
2528
2529                                 d=atof(sstrsep(&p,sep));
2530                                 if(n)
2531                                         ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2532                                 else
2533                                         ecdsa_results[k][0]=d;
2534
2535                                 d=atof(sstrsep(&p,sep));
2536                                 if(n)
2537                                         ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2538                                 else
2539                                         ecdsa_results[k][1]=d;
2540                                 }
2541 #endif 
2542
2543 #ifndef OPENSSL_NO_ECDH
2544                         else if(!strncmp(buf,"+F5:",4))
2545                                 {
2546                                 int k;
2547                                 double d;
2548                                 
2549                                 p=buf+4;
2550                                 k=atoi(sstrsep(&p,sep));
2551                                 sstrsep(&p,sep);
2552
2553                                 d=atof(sstrsep(&p,sep));
2554                                 if(n)
2555                                         ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2556                                 else
2557                                         ecdh_results[k][0]=d;
2558
2559                                 }
2560 #endif
2561
2562                         else if(!strncmp(buf,"+H:",3))
2563                                 {
2564                                 }
2565                         else
2566                                 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);
2567                         }
2568                 }
2569         return 1;
2570         }
2571 #endif