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