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