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