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