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