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