xref: /freebsd/crypto/openssl/apps/speed.c (revision f9218d3d4fd34f082473b3a021c6d4d109fb47cf)
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 /* most of this code has been pilfered from my libdes speed.c program */
60 
61 #ifndef OPENSSL_NO_SPEED
62 
63 #undef SECONDS
64 #define SECONDS		3
65 #define RSA_SECONDS	10
66 #define DSA_SECONDS	10
67 
68 /* 11-Sep-92 Andrew Daviel   Support for Silicon Graphics IRIX added */
69 /* 06-Apr-92 Luke Brennan    Support for VMS and add extra signal calls */
70 
71 #undef PROG
72 #define PROG speed_main
73 
74 #include <stdio.h>
75 #include <stdlib.h>
76 #include <signal.h>
77 #include <string.h>
78 #include <math.h>
79 #include "apps.h"
80 #ifdef OPENSSL_NO_STDIO
81 #define APPS_WIN16
82 #endif
83 #include <openssl/crypto.h>
84 #include <openssl/rand.h>
85 #include <openssl/err.h>
86 #include <openssl/evp.h>
87 #include <openssl/objects.h>
88 #if !defined(OPENSSL_SYS_MSDOS)
89 #include OPENSSL_UNISTD
90 #endif
91 
92 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
93 # define USE_TOD
94 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
95 # define TIMES
96 #endif
97 #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 */
98 # define TIMEB
99 #endif
100 
101 #ifndef _IRIX
102 # include <time.h>
103 #endif
104 #ifdef TIMES
105 # include <sys/types.h>
106 # include <sys/times.h>
107 #endif
108 #ifdef USE_TOD
109 # include <sys/time.h>
110 # include <sys/resource.h>
111 #endif
112 
113 /* Depending on the VMS version, the tms structure is perhaps defined.
114    The __TMS macro will show if it was.  If it wasn't defined, we should
115    undefine TIMES, since that tells the rest of the program how things
116    should be handled.				-- Richard Levitte */
117 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
118 #undef TIMES
119 #endif
120 
121 #ifdef TIMEB
122 #include <sys/timeb.h>
123 #endif
124 
125 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS)
126 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
127 #endif
128 
129 #if defined(sun) || defined(__ultrix)
130 #define _POSIX_SOURCE
131 #include <limits.h>
132 #include <sys/param.h>
133 #endif
134 
135 #ifndef OPENSSL_NO_DES
136 #include <openssl/des.h>
137 #endif
138 #ifndef OPENSSL_NO_AES
139 #include <openssl/aes.h>
140 #endif
141 #ifndef OPENSSL_NO_MD2
142 #include <openssl/md2.h>
143 #endif
144 #ifndef OPENSSL_NO_MDC2
145 #include <openssl/mdc2.h>
146 #endif
147 #ifndef OPENSSL_NO_MD4
148 #include <openssl/md4.h>
149 #endif
150 #ifndef OPENSSL_NO_MD5
151 #include <openssl/md5.h>
152 #endif
153 #ifndef OPENSSL_NO_HMAC
154 #include <openssl/hmac.h>
155 #endif
156 #include <openssl/evp.h>
157 #ifndef OPENSSL_NO_SHA
158 #include <openssl/sha.h>
159 #endif
160 #ifndef OPENSSL_NO_RIPEMD
161 #include <openssl/ripemd.h>
162 #endif
163 #ifndef OPENSSL_NO_RC4
164 #include <openssl/rc4.h>
165 #endif
166 #ifndef OPENSSL_NO_RC5
167 #include <openssl/rc5.h>
168 #endif
169 #ifndef OPENSSL_NO_RC2
170 #include <openssl/rc2.h>
171 #endif
172 #ifndef OPENSSL_NO_IDEA
173 #include <openssl/idea.h>
174 #endif
175 #ifndef OPENSSL_NO_BF
176 #include <openssl/blowfish.h>
177 #endif
178 #ifndef OPENSSL_NO_CAST
179 #include <openssl/cast.h>
180 #endif
181 #ifndef OPENSSL_NO_RSA
182 #include <openssl/rsa.h>
183 #include "./testrsa.h"
184 #endif
185 #include <openssl/x509.h>
186 #ifndef OPENSSL_NO_DSA
187 #include "./testdsa.h"
188 #endif
189 
190 /* The following if from times(3) man page.  It may need to be changed */
191 #ifndef HZ
192 # if defined(_SC_CLK_TCK) \
193      && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000)
194 #  define HZ ((double)sysconf(_SC_CLK_TCK))
195 # else
196 #  ifndef CLK_TCK
197 #   ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
198 #    define HZ	100.0
199 #   else /* _BSD_CLK_TCK_ */
200 #    define HZ ((double)_BSD_CLK_TCK_)
201 #   endif
202 #  else /* CLK_TCK */
203 #   define HZ ((double)CLK_TCK)
204 #  endif
205 # endif
206 #endif
207 
208 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
209 # define HAVE_FORK 1
210 #endif
211 
212 #undef BUFSIZE
213 #define BUFSIZE	((long)1024*8+1)
214 int run=0;
215 
216 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
217 static int mr=0;
218 static int usertime=1;
219 
220 static double Time_F(int s);
221 static void print_message(const char *s,long num,int length);
222 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
223 static void print_result(int alg,int run_no,int count,double time_used);
224 #ifdef HAVE_FORK
225 static int do_multi(int multi);
226 #endif
227 
228 #define ALGOR_NUM	19
229 #define SIZE_NUM	5
230 #define RSA_NUM		4
231 #define DSA_NUM		3
232 static const char *names[ALGOR_NUM]={
233   "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
234   "des cbc","des ede3","idea cbc",
235   "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
236   "aes-128 cbc","aes-192 cbc","aes-256 cbc"};
237 static double results[ALGOR_NUM][SIZE_NUM];
238 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
239 static double rsa_results[RSA_NUM][2];
240 static double dsa_results[DSA_NUM][2];
241 
242 #ifdef SIGALRM
243 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
244 #define SIGRETTYPE void
245 #else
246 #define SIGRETTYPE int
247 #endif
248 
249 static SIGRETTYPE sig_done(int sig);
250 static SIGRETTYPE sig_done(int sig)
251 	{
252 	signal(SIGALRM,sig_done);
253 	run=0;
254 #ifdef LINT
255 	sig=sig;
256 #endif
257 	}
258 #endif
259 
260 #define START	0
261 #define STOP	1
262 
263 static double Time_F(int s)
264 	{
265 	double ret;
266 
267 #ifdef USE_TOD
268 	if(usertime)
269 	    {
270 		static struct rusage tstart,tend;
271 
272 		getrusage_used = 1;
273 		if (s == START)
274 			{
275 			getrusage(RUSAGE_SELF,&tstart);
276 			return(0);
277 			}
278 		else
279 			{
280 			long i;
281 
282 			getrusage(RUSAGE_SELF,&tend);
283 			i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
284 			ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
285 			  +((double)i)/1000000.0;
286 			return((ret < 0.001)?0.001:ret);
287 			}
288 		}
289 	else
290 		{
291 		static struct timeval tstart,tend;
292 		long i;
293 
294 		gettimeofday_used = 1;
295 		if (s == START)
296 			{
297 			gettimeofday(&tstart,NULL);
298 			return(0);
299 			}
300 		else
301 			{
302 			gettimeofday(&tend,NULL);
303 			i=(long)tend.tv_usec-(long)tstart.tv_usec;
304 			ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
305 			return((ret < 0.001)?0.001:ret);
306 			}
307 		}
308 #else  /* ndef USE_TOD */
309 
310 # ifdef TIMES
311 	if (usertime)
312 		{
313 		static struct tms tstart,tend;
314 
315 		times_used = 1;
316 		if (s == START)
317 			{
318 			times(&tstart);
319 			return(0);
320 			}
321 		else
322 			{
323 			times(&tend);
324 			ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
325 			return((ret < 1e-3)?1e-3:ret);
326 			}
327 		}
328 # endif /* times() */
329 # if defined(TIMES) && defined(TIMEB)
330 	else
331 # endif
332 # ifdef OPENSSL_SYS_VXWORKS
333                 {
334 		static unsigned long tick_start, tick_end;
335 
336 		if( s == START )
337 			{
338 			tick_start = tickGet();
339 			return 0;
340 			}
341 		else
342 			{
343 			tick_end = tickGet();
344 			ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
345 			return((ret < 0.001)?0.001:ret);
346 			}
347                 }
348 # elif defined(TIMEB)
349 		{
350 		static struct timeb tstart,tend;
351 		long i;
352 
353 		ftime_used = 1;
354 		if (s == START)
355 			{
356 			ftime(&tstart);
357 			return(0);
358 			}
359 		else
360 			{
361 			ftime(&tend);
362 			i=(long)tend.millitm-(long)tstart.millitm;
363 			ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
364 			return((ret < 0.001)?0.001:ret);
365 			}
366 		}
367 # endif
368 #endif
369 	}
370 
371 int MAIN(int, char **);
372 
373 int MAIN(int argc, char **argv)
374 	{
375 #ifndef OPENSSL_NO_ENGINE
376 	ENGINE *e = NULL;
377 #endif
378 	unsigned char *buf=NULL,*buf2=NULL;
379 	int mret=1;
380 	long count=0,save_count=0;
381 	int i,j,k;
382 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
383 	long rsa_count;
384 #endif
385 #ifndef OPENSSL_NO_RSA
386 	unsigned rsa_num;
387 #endif
388 	unsigned char md[EVP_MAX_MD_SIZE];
389 #ifndef OPENSSL_NO_MD2
390 	unsigned char md2[MD2_DIGEST_LENGTH];
391 #endif
392 #ifndef OPENSSL_NO_MDC2
393 	unsigned char mdc2[MDC2_DIGEST_LENGTH];
394 #endif
395 #ifndef OPENSSL_NO_MD4
396 	unsigned char md4[MD4_DIGEST_LENGTH];
397 #endif
398 #ifndef OPENSSL_NO_MD5
399 	unsigned char md5[MD5_DIGEST_LENGTH];
400 	unsigned char hmac[MD5_DIGEST_LENGTH];
401 #endif
402 #ifndef OPENSSL_NO_SHA
403 	unsigned char sha[SHA_DIGEST_LENGTH];
404 #endif
405 #ifndef OPENSSL_NO_RIPEMD
406 	unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
407 #endif
408 #ifndef OPENSSL_NO_RC4
409 	RC4_KEY rc4_ks;
410 #endif
411 #ifndef OPENSSL_NO_RC5
412 	RC5_32_KEY rc5_ks;
413 #endif
414 #ifndef OPENSSL_NO_RC2
415 	RC2_KEY rc2_ks;
416 #endif
417 #ifndef OPENSSL_NO_IDEA
418 	IDEA_KEY_SCHEDULE idea_ks;
419 #endif
420 #ifndef OPENSSL_NO_BF
421 	BF_KEY bf_ks;
422 #endif
423 #ifndef OPENSSL_NO_CAST
424 	CAST_KEY cast_ks;
425 #endif
426 	static const unsigned char key16[16]=
427 		{0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
428 		 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
429 	static const unsigned char key24[24]=
430 		{0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
431 		 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
432 		 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
433 	static const unsigned char key32[32]=
434 		{0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
435 		 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
436 		 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
437 		 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
438 #ifndef OPENSSL_NO_AES
439 #define MAX_BLOCK_SIZE 128
440 #else
441 #define MAX_BLOCK_SIZE 64
442 #endif
443 	unsigned char DES_iv[8];
444 	unsigned char iv[MAX_BLOCK_SIZE/8];
445 #ifndef OPENSSL_NO_DES
446 	DES_cblock *buf_as_des_cblock = NULL;
447 	static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
448 	static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
449 	static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
450 	DES_key_schedule sch;
451 	DES_key_schedule sch2;
452 	DES_key_schedule sch3;
453 #endif
454 #ifndef OPENSSL_NO_AES
455 	AES_KEY aes_ks1, aes_ks2, aes_ks3;
456 #endif
457 #define	D_MD2		0
458 #define	D_MDC2		1
459 #define	D_MD4		2
460 #define	D_MD5		3
461 #define	D_HMAC		4
462 #define	D_SHA1		5
463 #define D_RMD160	6
464 #define	D_RC4		7
465 #define	D_CBC_DES	8
466 #define	D_EDE3_DES	9
467 #define	D_CBC_IDEA	10
468 #define	D_CBC_RC2	11
469 #define	D_CBC_RC5	12
470 #define	D_CBC_BF	13
471 #define	D_CBC_CAST	14
472 #define D_CBC_128_AES	15
473 #define D_CBC_192_AES	16
474 #define D_CBC_256_AES	17
475 #define D_EVP		18
476 	double d=0.0;
477 	long c[ALGOR_NUM][SIZE_NUM];
478 #define	R_DSA_512	0
479 #define	R_DSA_1024	1
480 #define	R_DSA_2048	2
481 #define	R_RSA_512	0
482 #define	R_RSA_1024	1
483 #define	R_RSA_2048	2
484 #define	R_RSA_4096	3
485 #ifndef OPENSSL_NO_RSA
486 	RSA *rsa_key[RSA_NUM];
487 	long rsa_c[RSA_NUM][2];
488 	static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
489 	static unsigned char *rsa_data[RSA_NUM]=
490 		{test512,test1024,test2048,test4096};
491 	static int rsa_data_length[RSA_NUM]={
492 		sizeof(test512),sizeof(test1024),
493 		sizeof(test2048),sizeof(test4096)};
494 #endif
495 #ifndef OPENSSL_NO_DSA
496 	DSA *dsa_key[DSA_NUM];
497 	long dsa_c[DSA_NUM][2];
498 	static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
499 #endif
500 	int rsa_doit[RSA_NUM];
501 	int dsa_doit[DSA_NUM];
502 	int doit[ALGOR_NUM];
503 	int pr_header=0;
504 	const EVP_CIPHER *evp_cipher=NULL;
505 	const EVP_MD *evp_md=NULL;
506 	int decrypt=0;
507 #ifdef HAVE_FORK
508 	int multi=0;
509 #endif
510 
511 #ifndef TIMES
512 	usertime=-1;
513 #endif
514 
515 	apps_startup();
516 	memset(results, 0, sizeof(results));
517 #ifndef OPENSSL_NO_DSA
518 	memset(dsa_key,0,sizeof(dsa_key));
519 #endif
520 
521 	if (bio_err == NULL)
522 		if ((bio_err=BIO_new(BIO_s_file())) != NULL)
523 			BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
524 
525 	if (!load_config(bio_err, NULL))
526 		goto end;
527 
528 #ifndef OPENSSL_NO_RSA
529 	memset(rsa_key,0,sizeof(rsa_key));
530 	for (i=0; i<RSA_NUM; i++)
531 		rsa_key[i]=NULL;
532 #endif
533 
534 	if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
535 		{
536 		BIO_printf(bio_err,"out of memory\n");
537 		goto end;
538 		}
539 #ifndef OPENSSL_NO_DES
540 	buf_as_des_cblock = (DES_cblock *)buf;
541 #endif
542 	if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
543 		{
544 		BIO_printf(bio_err,"out of memory\n");
545 		goto end;
546 		}
547 
548 	memset(c,0,sizeof(c));
549 	memset(DES_iv,0,sizeof(DES_iv));
550 	memset(iv,0,sizeof(iv));
551 
552 	for (i=0; i<ALGOR_NUM; i++)
553 		doit[i]=0;
554 	for (i=0; i<RSA_NUM; i++)
555 		rsa_doit[i]=0;
556 	for (i=0; i<DSA_NUM; i++)
557 		dsa_doit[i]=0;
558 
559 	j=0;
560 	argc--;
561 	argv++;
562 	while (argc)
563 		{
564 		if	((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
565 			{
566 			usertime = 0;
567 			j--;	/* Otherwise, -elapsed gets confused with
568 				   an algorithm. */
569 			}
570 		else if	((argc > 0) && (strcmp(*argv,"-evp") == 0))
571 			{
572 			argc--;
573 			argv++;
574 			if(argc == 0)
575 				{
576 				BIO_printf(bio_err,"no EVP given\n");
577 				goto end;
578 				}
579 			evp_cipher=EVP_get_cipherbyname(*argv);
580 			if(!evp_cipher)
581 				{
582 				evp_md=EVP_get_digestbyname(*argv);
583 				}
584 			if(!evp_cipher && !evp_md)
585 				{
586 				BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
587 				goto end;
588 				}
589 			doit[D_EVP]=1;
590 			}
591 		else if (argc > 0 && !strcmp(*argv,"-decrypt"))
592 			{
593 			decrypt=1;
594 			j--;	/* Otherwise, -elapsed gets confused with
595 				   an algorithm. */
596 			}
597 #ifndef OPENSSL_NO_ENGINE
598 		else if	((argc > 0) && (strcmp(*argv,"-engine") == 0))
599 			{
600 			argc--;
601 			argv++;
602 			if(argc == 0)
603 				{
604 				BIO_printf(bio_err,"no engine given\n");
605 				goto end;
606 				}
607                         e = setup_engine(bio_err, *argv, 0);
608 			/* j will be increased again further down.  We just
609 			   don't want speed to confuse an engine with an
610 			   algorithm, especially when none is given (which
611 			   means all of them should be run) */
612 			j--;
613 			}
614 #endif
615 #ifdef HAVE_FORK
616 		else if	((argc > 0) && (strcmp(*argv,"-multi") == 0))
617 			{
618 			argc--;
619 			argv++;
620 			if(argc == 0)
621 				{
622 				BIO_printf(bio_err,"no multi count given\n");
623 				goto end;
624 				}
625 			multi=atoi(argv[0]);
626 			if(multi <= 0)
627 			    {
628 				BIO_printf(bio_err,"bad multi count\n");
629 				goto end;
630 				}
631 			j--;	/* Otherwise, -mr gets confused with
632 				   an algorithm. */
633 			}
634 #endif
635 		else if (argc > 0 && !strcmp(*argv,"-mr"))
636 			{
637 			mr=1;
638 			j--;	/* Otherwise, -mr gets confused with
639 				   an algorithm. */
640 			}
641 		else
642 #ifndef OPENSSL_NO_MD2
643 		if	(strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
644 		else
645 #endif
646 #ifndef OPENSSL_NO_MDC2
647 			if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
648 		else
649 #endif
650 #ifndef OPENSSL_NO_MD4
651 			if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
652 		else
653 #endif
654 #ifndef OPENSSL_NO_MD5
655 			if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
656 		else
657 #endif
658 #ifndef OPENSSL_NO_MD5
659 			if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
660 		else
661 #endif
662 #ifndef OPENSSL_NO_SHA
663 			if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
664 		else
665 			if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
666 		else
667 #endif
668 #ifndef OPENSSL_NO_RIPEMD
669 			if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
670 		else
671 			if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
672 		else
673 			if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
674 		else
675 #endif
676 #ifndef OPENSSL_NO_RC4
677 			if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
678 		else
679 #endif
680 #ifndef OPENSSL_NO_DES
681 			if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
682 		else	if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
683 		else
684 #endif
685 #ifndef OPENSSL_NO_AES
686 			if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
687 		else	if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
688 		else	if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
689 		else
690 #endif
691 #ifndef OPENSSL_NO_RSA
692 #if 0 /* was: #ifdef RSAref */
693 			if (strcmp(*argv,"rsaref") == 0)
694 			{
695 			RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
696 			j--;
697 			}
698 		else
699 #endif
700 #ifndef RSA_NULL
701 			if (strcmp(*argv,"openssl") == 0)
702 			{
703 			RSA_set_default_method(RSA_PKCS1_SSLeay());
704 			j--;
705 			}
706 		else
707 #endif
708 #endif /* !OPENSSL_NO_RSA */
709 		     if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
710 		else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
711 		else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
712 		else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
713 		else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
714 		else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
715 		else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
716 		else
717 #ifndef OPENSSL_NO_RC2
718 		     if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
719 		else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
720 		else
721 #endif
722 #ifndef OPENSSL_NO_RC5
723 		     if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
724 		else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
725 		else
726 #endif
727 #ifndef OPENSSL_NO_IDEA
728 		     if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
729 		else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
730 		else
731 #endif
732 #ifndef OPENSSL_NO_BF
733 		     if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
734 		else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
735 		else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
736 		else
737 #endif
738 #ifndef OPENSSL_NO_CAST
739 		     if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
740 		else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
741 		else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
742 		else
743 #endif
744 #ifndef OPENSSL_NO_DES
745 			if (strcmp(*argv,"des") == 0)
746 			{
747 			doit[D_CBC_DES]=1;
748 			doit[D_EDE3_DES]=1;
749 			}
750 		else
751 #endif
752 #ifndef OPENSSL_NO_AES
753 			if (strcmp(*argv,"aes") == 0)
754 			{
755 			doit[D_CBC_128_AES]=1;
756 			doit[D_CBC_192_AES]=1;
757 			doit[D_CBC_256_AES]=1;
758 			}
759 		else
760 #endif
761 #ifndef OPENSSL_NO_RSA
762 			if (strcmp(*argv,"rsa") == 0)
763 			{
764 			rsa_doit[R_RSA_512]=1;
765 			rsa_doit[R_RSA_1024]=1;
766 			rsa_doit[R_RSA_2048]=1;
767 			rsa_doit[R_RSA_4096]=1;
768 			}
769 		else
770 #endif
771 #ifndef OPENSSL_NO_DSA
772 			if (strcmp(*argv,"dsa") == 0)
773 			{
774 			dsa_doit[R_DSA_512]=1;
775 			dsa_doit[R_DSA_1024]=1;
776 			}
777 		else
778 #endif
779 			{
780 			BIO_printf(bio_err,"Error: bad option or value\n");
781 			BIO_printf(bio_err,"\n");
782 			BIO_printf(bio_err,"Available values:\n");
783 #ifndef OPENSSL_NO_MD2
784 			BIO_printf(bio_err,"md2      ");
785 #endif
786 #ifndef OPENSSL_NO_MDC2
787 			BIO_printf(bio_err,"mdc2     ");
788 #endif
789 #ifndef OPENSSL_NO_MD4
790 			BIO_printf(bio_err,"md4      ");
791 #endif
792 #ifndef OPENSSL_NO_MD5
793 			BIO_printf(bio_err,"md5      ");
794 #ifndef OPENSSL_NO_HMAC
795 			BIO_printf(bio_err,"hmac     ");
796 #endif
797 #endif
798 #ifndef OPENSSL_NO_SHA1
799 			BIO_printf(bio_err,"sha1     ");
800 #endif
801 #ifndef OPENSSL_NO_RIPEMD160
802 			BIO_printf(bio_err,"rmd160");
803 #endif
804 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
805     !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
806     !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
807 			BIO_printf(bio_err,"\n");
808 #endif
809 
810 #ifndef OPENSSL_NO_IDEA
811 			BIO_printf(bio_err,"idea-cbc ");
812 #endif
813 #ifndef OPENSSL_NO_RC2
814 			BIO_printf(bio_err,"rc2-cbc  ");
815 #endif
816 #ifndef OPENSSL_NO_RC5
817 			BIO_printf(bio_err,"rc5-cbc  ");
818 #endif
819 #ifndef OPENSSL_NO_BF
820 			BIO_printf(bio_err,"bf-cbc");
821 #endif
822 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
823     !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
824 			BIO_printf(bio_err,"\n");
825 #endif
826 #ifndef OPENSSL_NO_DES
827 			BIO_printf(bio_err,"des-cbc  des-ede3 ");
828 #endif
829 #ifndef OPENSSL_NO_AES
830 			BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
831 #endif
832 #ifndef OPENSSL_NO_RC4
833 			BIO_printf(bio_err,"rc4");
834 #endif
835 			BIO_printf(bio_err,"\n");
836 
837 #ifndef OPENSSL_NO_RSA
838 			BIO_printf(bio_err,"rsa512   rsa1024  rsa2048  rsa4096\n");
839 #endif
840 
841 #ifndef OPENSSL_NO_DSA
842 			BIO_printf(bio_err,"dsa512   dsa1024  dsa2048\n");
843 #endif
844 
845 #ifndef OPENSSL_NO_IDEA
846 			BIO_printf(bio_err,"idea     ");
847 #endif
848 #ifndef OPENSSL_NO_RC2
849 			BIO_printf(bio_err,"rc2      ");
850 #endif
851 #ifndef OPENSSL_NO_DES
852 			BIO_printf(bio_err,"des      ");
853 #endif
854 #ifndef OPENSSL_NO_AES
855 			BIO_printf(bio_err,"aes      ");
856 #endif
857 #ifndef OPENSSL_NO_RSA
858 			BIO_printf(bio_err,"rsa      ");
859 #endif
860 #ifndef OPENSSL_NO_BF
861 			BIO_printf(bio_err,"blowfish");
862 #endif
863 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
864     !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
865     !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
866 			BIO_printf(bio_err,"\n");
867 #endif
868 
869 			BIO_printf(bio_err,"\n");
870 			BIO_printf(bio_err,"Available options:\n");
871 #if defined(TIMES) || defined(USE_TOD)
872 			BIO_printf(bio_err,"-elapsed        measure time in real time instead of CPU user time.\n");
873 #endif
874 #ifndef OPENSSL_NO_ENGINE
875 			BIO_printf(bio_err,"-engine e       use engine e, possibly a hardware device.\n");
876 #endif
877 			BIO_printf(bio_err,"-evp e          use EVP e.\n");
878 			BIO_printf(bio_err,"-decrypt        time decryption instead of encryption (only EVP).\n");
879 			BIO_printf(bio_err,"-mr             produce machine readable output.\n");
880 #ifdef HAVE_FORK
881 			BIO_printf(bio_err,"-multi n        run n benchmarks in parallel.\n");
882 #endif
883 			goto end;
884 			}
885 		argc--;
886 		argv++;
887 		j++;
888 		}
889 
890 #ifdef HAVE_FORK
891 	if(multi && do_multi(multi))
892 		goto show_res;
893 #endif
894 
895 	if (j == 0)
896 		{
897 		for (i=0; i<ALGOR_NUM; i++)
898 			{
899 			if (i != D_EVP)
900 				doit[i]=1;
901 			}
902 		for (i=0; i<RSA_NUM; i++)
903 			rsa_doit[i]=1;
904 		for (i=0; i<DSA_NUM; i++)
905 			dsa_doit[i]=1;
906 		}
907 	for (i=0; i<ALGOR_NUM; i++)
908 		if (doit[i]) pr_header++;
909 
910 	if (usertime == 0 && !mr)
911 		BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
912 	if (usertime <= 0 && !mr)
913 		{
914 		BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
915 		BIO_printf(bio_err,"program when this computer is idle.\n");
916 		}
917 
918 #ifndef OPENSSL_NO_RSA
919 	for (i=0; i<RSA_NUM; i++)
920 		{
921 		const unsigned char *p;
922 
923 		p=rsa_data[i];
924 		rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
925 		if (rsa_key[i] == NULL)
926 			{
927 			BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
928 			goto end;
929 			}
930 #if 0
931 		else
932 			{
933 			BIO_printf(bio_err,mr ? "+RK:%d:"
934 				   : "Loaded RSA key, %d bit modulus and e= 0x",
935 				   BN_num_bits(rsa_key[i]->n));
936 			BN_print(bio_err,rsa_key[i]->e);
937 			BIO_printf(bio_err,"\n");
938 			}
939 #endif
940 		}
941 #endif
942 
943 #ifndef OPENSSL_NO_DSA
944 	dsa_key[0]=get_dsa512();
945 	dsa_key[1]=get_dsa1024();
946 	dsa_key[2]=get_dsa2048();
947 #endif
948 
949 #ifndef OPENSSL_NO_DES
950 	DES_set_key_unchecked(&key,&sch);
951 	DES_set_key_unchecked(&key2,&sch2);
952 	DES_set_key_unchecked(&key3,&sch3);
953 #endif
954 #ifndef OPENSSL_NO_AES
955 	AES_set_encrypt_key(key16,128,&aes_ks1);
956 	AES_set_encrypt_key(key24,192,&aes_ks2);
957 	AES_set_encrypt_key(key32,256,&aes_ks3);
958 #endif
959 #ifndef OPENSSL_NO_IDEA
960 	idea_set_encrypt_key(key16,&idea_ks);
961 #endif
962 #ifndef OPENSSL_NO_RC4
963 	RC4_set_key(&rc4_ks,16,key16);
964 #endif
965 #ifndef OPENSSL_NO_RC2
966 	RC2_set_key(&rc2_ks,16,key16,128);
967 #endif
968 #ifndef OPENSSL_NO_RC5
969 	RC5_32_set_key(&rc5_ks,16,key16,12);
970 #endif
971 #ifndef OPENSSL_NO_BF
972 	BF_set_key(&bf_ks,16,key16);
973 #endif
974 #ifndef OPENSSL_NO_CAST
975 	CAST_set_key(&cast_ks,16,key16);
976 #endif
977 #ifndef OPENSSL_NO_RSA
978 	memset(rsa_c,0,sizeof(rsa_c));
979 #endif
980 #ifndef SIGALRM
981 #ifndef OPENSSL_NO_DES
982 	BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
983 	count=10;
984 	do	{
985 		long i;
986 		count*=2;
987 		Time_F(START);
988 		for (i=count; i; i--)
989 			DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
990 				&sch,DES_ENCRYPT);
991 		d=Time_F(STOP);
992 		} while (d <3);
993 	save_count=count;
994 	c[D_MD2][0]=count/10;
995 	c[D_MDC2][0]=count/10;
996 	c[D_MD4][0]=count;
997 	c[D_MD5][0]=count;
998 	c[D_HMAC][0]=count;
999 	c[D_SHA1][0]=count;
1000 	c[D_RMD160][0]=count;
1001 	c[D_RC4][0]=count*5;
1002 	c[D_CBC_DES][0]=count;
1003 	c[D_EDE3_DES][0]=count/3;
1004 	c[D_CBC_IDEA][0]=count;
1005 	c[D_CBC_RC2][0]=count;
1006 	c[D_CBC_RC5][0]=count;
1007 	c[D_CBC_BF][0]=count;
1008 	c[D_CBC_CAST][0]=count;
1009 
1010 	for (i=1; i<SIZE_NUM; i++)
1011 		{
1012 		c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1013 		c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1014 		c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1015 		c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1016 		c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1017 		c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1018 		c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1019 		}
1020 	for (i=1; i<SIZE_NUM; i++)
1021 		{
1022 		long l0,l1;
1023 
1024 		l0=(long)lengths[i-1];
1025 		l1=(long)lengths[i];
1026 		c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1027 		c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1028 		c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1029 		c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1030 		c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1031 		c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1032 		c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1033 		c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1034 		}
1035 #ifndef OPENSSL_NO_RSA
1036 	rsa_c[R_RSA_512][0]=count/2000;
1037 	rsa_c[R_RSA_512][1]=count/400;
1038 	for (i=1; i<RSA_NUM; i++)
1039 		{
1040 		rsa_c[i][0]=rsa_c[i-1][0]/8;
1041 		rsa_c[i][1]=rsa_c[i-1][1]/4;
1042 		if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1043 			rsa_doit[i]=0;
1044 		else
1045 			{
1046 			if (rsa_c[i][0] == 0)
1047 				{
1048 				rsa_c[i][0]=1;
1049 				rsa_c[i][1]=20;
1050 				}
1051 			}
1052 		}
1053 #endif
1054 
1055 #ifndef OPENSSL_NO_DSA
1056 	dsa_c[R_DSA_512][0]=count/1000;
1057 	dsa_c[R_DSA_512][1]=count/1000/2;
1058 	for (i=1; i<DSA_NUM; i++)
1059 		{
1060 		dsa_c[i][0]=dsa_c[i-1][0]/4;
1061 		dsa_c[i][1]=dsa_c[i-1][1]/4;
1062 		if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1063 			dsa_doit[i]=0;
1064 		else
1065 			{
1066 			if (dsa_c[i] == 0)
1067 				{
1068 				dsa_c[i][0]=1;
1069 				dsa_c[i][1]=1;
1070 				}
1071 			}
1072 		}
1073 #endif
1074 
1075 #define COND(d)	(count < (d))
1076 #define COUNT(d) (d)
1077 #else
1078 /* not worth fixing */
1079 # error "You cannot disable DES on systems without SIGALRM."
1080 #endif /* OPENSSL_NO_DES */
1081 #else
1082 #define COND(c)	(run)
1083 #define COUNT(d) (count)
1084 	signal(SIGALRM,sig_done);
1085 #endif /* SIGALRM */
1086 
1087 #ifndef OPENSSL_NO_MD2
1088 	if (doit[D_MD2])
1089 		{
1090 		for (j=0; j<SIZE_NUM; j++)
1091 			{
1092 			print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1093 			Time_F(START);
1094 			for (count=0,run=1; COND(c[D_MD2][j]); count++)
1095 				EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1096 			d=Time_F(STOP);
1097 			print_result(D_MD2,j,count,d);
1098 			}
1099 		}
1100 #endif
1101 #ifndef OPENSSL_NO_MDC2
1102 	if (doit[D_MDC2])
1103 		{
1104 		for (j=0; j<SIZE_NUM; j++)
1105 			{
1106 			print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1107 			Time_F(START);
1108 			for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1109 				EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1110 			d=Time_F(STOP);
1111 			print_result(D_MDC2,j,count,d);
1112 			}
1113 		}
1114 #endif
1115 
1116 #ifndef OPENSSL_NO_MD4
1117 	if (doit[D_MD4])
1118 		{
1119 		for (j=0; j<SIZE_NUM; j++)
1120 			{
1121 			print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1122 			Time_F(START);
1123 			for (count=0,run=1; COND(c[D_MD4][j]); count++)
1124 				EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1125 			d=Time_F(STOP);
1126 			print_result(D_MD4,j,count,d);
1127 			}
1128 		}
1129 #endif
1130 
1131 #ifndef OPENSSL_NO_MD5
1132 	if (doit[D_MD5])
1133 		{
1134 		for (j=0; j<SIZE_NUM; j++)
1135 			{
1136 			print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1137 			Time_F(START);
1138 			for (count=0,run=1; COND(c[D_MD5][j]); count++)
1139 				EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1140 			d=Time_F(STOP);
1141 			print_result(D_MD5,j,count,d);
1142 			}
1143 		}
1144 #endif
1145 
1146 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1147 	if (doit[D_HMAC])
1148 		{
1149 		HMAC_CTX hctx;
1150 
1151 		HMAC_CTX_init(&hctx);
1152 		HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1153 			16,EVP_md5(), NULL);
1154 
1155 		for (j=0; j<SIZE_NUM; j++)
1156 			{
1157 			print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1158 			Time_F(START);
1159 			for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1160 				{
1161 				HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1162 				HMAC_Update(&hctx,buf,lengths[j]);
1163 				HMAC_Final(&hctx,&(hmac[0]),NULL);
1164 				}
1165 			d=Time_F(STOP);
1166 			print_result(D_HMAC,j,count,d);
1167 			}
1168 		HMAC_CTX_cleanup(&hctx);
1169 		}
1170 #endif
1171 #ifndef OPENSSL_NO_SHA
1172 	if (doit[D_SHA1])
1173 		{
1174 		for (j=0; j<SIZE_NUM; j++)
1175 			{
1176 			print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1177 			Time_F(START);
1178 			for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1179 				EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1180 			d=Time_F(STOP);
1181 			print_result(D_SHA1,j,count,d);
1182 			}
1183 		}
1184 #endif
1185 #ifndef OPENSSL_NO_RIPEMD
1186 	if (doit[D_RMD160])
1187 		{
1188 		for (j=0; j<SIZE_NUM; j++)
1189 			{
1190 			print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1191 			Time_F(START);
1192 			for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1193 				EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1194 			d=Time_F(STOP);
1195 			print_result(D_RMD160,j,count,d);
1196 			}
1197 		}
1198 #endif
1199 #ifndef OPENSSL_NO_RC4
1200 	if (doit[D_RC4])
1201 		{
1202 		for (j=0; j<SIZE_NUM; j++)
1203 			{
1204 			print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1205 			Time_F(START);
1206 			for (count=0,run=1; COND(c[D_RC4][j]); count++)
1207 				RC4(&rc4_ks,(unsigned int)lengths[j],
1208 					buf,buf);
1209 			d=Time_F(STOP);
1210 			print_result(D_RC4,j,count,d);
1211 			}
1212 		}
1213 #endif
1214 #ifndef OPENSSL_NO_DES
1215 	if (doit[D_CBC_DES])
1216 		{
1217 		for (j=0; j<SIZE_NUM; j++)
1218 			{
1219 			print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1220 			Time_F(START);
1221 			for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1222 				DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1223 						 &DES_iv,DES_ENCRYPT);
1224 			d=Time_F(STOP);
1225 			print_result(D_CBC_DES,j,count,d);
1226 			}
1227 		}
1228 
1229 	if (doit[D_EDE3_DES])
1230 		{
1231 		for (j=0; j<SIZE_NUM; j++)
1232 			{
1233 			print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1234 			Time_F(START);
1235 			for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1236 				DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1237 						     &sch,&sch2,&sch3,
1238 						     &DES_iv,DES_ENCRYPT);
1239 			d=Time_F(STOP);
1240 			print_result(D_EDE3_DES,j,count,d);
1241 			}
1242 		}
1243 #endif
1244 #ifndef OPENSSL_NO_AES
1245 	if (doit[D_CBC_128_AES])
1246 		{
1247 		for (j=0; j<SIZE_NUM; j++)
1248 			{
1249 			print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1250 			Time_F(START);
1251 			for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1252 				AES_cbc_encrypt(buf,buf,
1253 					(unsigned long)lengths[j],&aes_ks1,
1254 					iv,AES_ENCRYPT);
1255 			d=Time_F(STOP);
1256 			print_result(D_CBC_128_AES,j,count,d);
1257 			}
1258 		}
1259 	if (doit[D_CBC_192_AES])
1260 		{
1261 		for (j=0; j<SIZE_NUM; j++)
1262 			{
1263 			print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1264 			Time_F(START);
1265 			for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1266 				AES_cbc_encrypt(buf,buf,
1267 					(unsigned long)lengths[j],&aes_ks2,
1268 					iv,AES_ENCRYPT);
1269 			d=Time_F(STOP);
1270 			print_result(D_CBC_192_AES,j,count,d);
1271 			}
1272 		}
1273 	if (doit[D_CBC_256_AES])
1274 		{
1275 		for (j=0; j<SIZE_NUM; j++)
1276 			{
1277 			print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1278 			Time_F(START);
1279 			for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1280 				AES_cbc_encrypt(buf,buf,
1281 					(unsigned long)lengths[j],&aes_ks3,
1282 					iv,AES_ENCRYPT);
1283 			d=Time_F(STOP);
1284 			print_result(D_CBC_256_AES,j,count,d);
1285 			}
1286 		}
1287 
1288 #endif
1289 #ifndef OPENSSL_NO_IDEA
1290 	if (doit[D_CBC_IDEA])
1291 		{
1292 		for (j=0; j<SIZE_NUM; j++)
1293 			{
1294 			print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1295 			Time_F(START);
1296 			for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1297 				idea_cbc_encrypt(buf,buf,
1298 					(unsigned long)lengths[j],&idea_ks,
1299 					iv,IDEA_ENCRYPT);
1300 			d=Time_F(STOP);
1301 			print_result(D_CBC_IDEA,j,count,d);
1302 			}
1303 		}
1304 #endif
1305 #ifndef OPENSSL_NO_RC2
1306 	if (doit[D_CBC_RC2])
1307 		{
1308 		for (j=0; j<SIZE_NUM; j++)
1309 			{
1310 			print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1311 			Time_F(START);
1312 			for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1313 				RC2_cbc_encrypt(buf,buf,
1314 					(unsigned long)lengths[j],&rc2_ks,
1315 					iv,RC2_ENCRYPT);
1316 			d=Time_F(STOP);
1317 			print_result(D_CBC_RC2,j,count,d);
1318 			}
1319 		}
1320 #endif
1321 #ifndef OPENSSL_NO_RC5
1322 	if (doit[D_CBC_RC5])
1323 		{
1324 		for (j=0; j<SIZE_NUM; j++)
1325 			{
1326 			print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1327 			Time_F(START);
1328 			for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1329 				RC5_32_cbc_encrypt(buf,buf,
1330 					(unsigned long)lengths[j],&rc5_ks,
1331 					iv,RC5_ENCRYPT);
1332 			d=Time_F(STOP);
1333 			print_result(D_CBC_RC5,j,count,d);
1334 			}
1335 		}
1336 #endif
1337 #ifndef OPENSSL_NO_BF
1338 	if (doit[D_CBC_BF])
1339 		{
1340 		for (j=0; j<SIZE_NUM; j++)
1341 			{
1342 			print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1343 			Time_F(START);
1344 			for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1345 				BF_cbc_encrypt(buf,buf,
1346 					(unsigned long)lengths[j],&bf_ks,
1347 					iv,BF_ENCRYPT);
1348 			d=Time_F(STOP);
1349 			print_result(D_CBC_BF,j,count,d);
1350 			}
1351 		}
1352 #endif
1353 #ifndef OPENSSL_NO_CAST
1354 	if (doit[D_CBC_CAST])
1355 		{
1356 		for (j=0; j<SIZE_NUM; j++)
1357 			{
1358 			print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1359 			Time_F(START);
1360 			for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1361 				CAST_cbc_encrypt(buf,buf,
1362 					(unsigned long)lengths[j],&cast_ks,
1363 					iv,CAST_ENCRYPT);
1364 			d=Time_F(STOP);
1365 			print_result(D_CBC_CAST,j,count,d);
1366 			}
1367 		}
1368 #endif
1369 
1370 	if (doit[D_EVP])
1371 		{
1372 		for (j=0; j<SIZE_NUM; j++)
1373 			{
1374 			if (evp_cipher)
1375 				{
1376 				EVP_CIPHER_CTX ctx;
1377 				int outl;
1378 
1379 				names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1380 				/* -O3 -fschedule-insns messes up an
1381 				 * optimization here!  names[D_EVP]
1382 				 * somehow becomes NULL */
1383 				print_message(names[D_EVP],save_count,
1384 					lengths[j]);
1385 
1386 				EVP_CIPHER_CTX_init(&ctx);
1387 				if(decrypt)
1388 					EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1389 				else
1390 					EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1391 
1392 				Time_F(START);
1393 				if(decrypt)
1394 					for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1395 						EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1396 				else
1397 					for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1398 						EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1399 				if(decrypt)
1400 					EVP_DecryptFinal_ex(&ctx,buf,&outl);
1401 				else
1402 					EVP_EncryptFinal_ex(&ctx,buf,&outl);
1403 				d=Time_F(STOP);
1404 				EVP_CIPHER_CTX_cleanup(&ctx);
1405 				}
1406 			if (evp_md)
1407 				{
1408 				names[D_EVP]=OBJ_nid2ln(evp_md->type);
1409 				print_message(names[D_EVP],save_count,
1410 					lengths[j]);
1411 
1412 				Time_F(START);
1413 				for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1414 					EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1415 
1416 				d=Time_F(STOP);
1417 				}
1418 			print_result(D_EVP,j,count,d);
1419 			}
1420 		}
1421 
1422 	RAND_pseudo_bytes(buf,36);
1423 #ifndef OPENSSL_NO_RSA
1424 	for (j=0; j<RSA_NUM; j++)
1425 		{
1426 		int ret;
1427 		if (!rsa_doit[j]) continue;
1428 		ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1429 		if (ret == 0)
1430 			{
1431 			BIO_printf(bio_err,"RSA sign failure.  No RSA sign will be done.\n");
1432 			ERR_print_errors(bio_err);
1433 			rsa_count=1;
1434 			}
1435 		else
1436 			{
1437 			pkey_print_message("private","rsa",
1438 				rsa_c[j][0],rsa_bits[j],
1439 				RSA_SECONDS);
1440 /*			RSA_blinding_on(rsa_key[j],NULL); */
1441 			Time_F(START);
1442 			for (count=0,run=1; COND(rsa_c[j][0]); count++)
1443 				{
1444 				ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1445 					&rsa_num, rsa_key[j]);
1446 				if (ret == 0)
1447 					{
1448 					BIO_printf(bio_err,
1449 						"RSA sign failure\n");
1450 					ERR_print_errors(bio_err);
1451 					count=1;
1452 					break;
1453 					}
1454 				}
1455 			d=Time_F(STOP);
1456 			BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1457 				   : "%ld %d bit private RSA's in %.2fs\n",
1458 				   count,rsa_bits[j],d);
1459 			rsa_results[j][0]=d/(double)count;
1460 			rsa_count=count;
1461 			}
1462 
1463 #if 1
1464 		ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1465 		if (ret <= 0)
1466 			{
1467 			BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
1468 			ERR_print_errors(bio_err);
1469 			rsa_doit[j] = 0;
1470 			}
1471 		else
1472 			{
1473 			pkey_print_message("public","rsa",
1474 				rsa_c[j][1],rsa_bits[j],
1475 				RSA_SECONDS);
1476 			Time_F(START);
1477 			for (count=0,run=1; COND(rsa_c[j][1]); count++)
1478 				{
1479 				ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1480 					rsa_num, rsa_key[j]);
1481 				if (ret == 0)
1482 					{
1483 					BIO_printf(bio_err,
1484 						"RSA verify failure\n");
1485 					ERR_print_errors(bio_err);
1486 					count=1;
1487 					break;
1488 					}
1489 				}
1490 			d=Time_F(STOP);
1491 			BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1492 				   : "%ld %d bit public RSA's in %.2fs\n",
1493 				   count,rsa_bits[j],d);
1494 			rsa_results[j][1]=d/(double)count;
1495 			}
1496 #endif
1497 
1498 		if (rsa_count <= 1)
1499 			{
1500 			/* if longer than 10s, don't do any more */
1501 			for (j++; j<RSA_NUM; j++)
1502 				rsa_doit[j]=0;
1503 			}
1504 		}
1505 #endif
1506 
1507 	RAND_pseudo_bytes(buf,20);
1508 #ifndef OPENSSL_NO_DSA
1509 	if (RAND_status() != 1)
1510 		{
1511 		RAND_seed(rnd_seed, sizeof rnd_seed);
1512 		rnd_fake = 1;
1513 		}
1514 	for (j=0; j<DSA_NUM; j++)
1515 		{
1516 		unsigned int kk;
1517 		int ret;
1518 
1519 		if (!dsa_doit[j]) continue;
1520 /*		DSA_generate_key(dsa_key[j]); */
1521 /*		DSA_sign_setup(dsa_key[j],NULL); */
1522 		ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1523 			&kk,dsa_key[j]);
1524 		if (ret == 0)
1525 			{
1526 			BIO_printf(bio_err,"DSA sign failure.  No DSA sign will be done.\n");
1527 			ERR_print_errors(bio_err);
1528 			rsa_count=1;
1529 			}
1530 		else
1531 			{
1532 			pkey_print_message("sign","dsa",
1533 				dsa_c[j][0],dsa_bits[j],
1534 				DSA_SECONDS);
1535 			Time_F(START);
1536 			for (count=0,run=1; COND(dsa_c[j][0]); count++)
1537 				{
1538 				ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1539 					&kk,dsa_key[j]);
1540 				if (ret == 0)
1541 					{
1542 					BIO_printf(bio_err,
1543 						"DSA sign failure\n");
1544 					ERR_print_errors(bio_err);
1545 					count=1;
1546 					break;
1547 					}
1548 				}
1549 			d=Time_F(STOP);
1550 			BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1551 				   : "%ld %d bit DSA signs in %.2fs\n",
1552 				   count,dsa_bits[j],d);
1553 			dsa_results[j][0]=d/(double)count;
1554 			rsa_count=count;
1555 			}
1556 
1557 		ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1558 			kk,dsa_key[j]);
1559 		if (ret <= 0)
1560 			{
1561 			BIO_printf(bio_err,"DSA verify failure.  No DSA verify will be done.\n");
1562 			ERR_print_errors(bio_err);
1563 			dsa_doit[j] = 0;
1564 			}
1565 		else
1566 			{
1567 			pkey_print_message("verify","dsa",
1568 				dsa_c[j][1],dsa_bits[j],
1569 				DSA_SECONDS);
1570 			Time_F(START);
1571 			for (count=0,run=1; COND(dsa_c[j][1]); count++)
1572 				{
1573 				ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1574 					kk,dsa_key[j]);
1575 				if (ret <= 0)
1576 					{
1577 					BIO_printf(bio_err,
1578 						"DSA verify failure\n");
1579 					ERR_print_errors(bio_err);
1580 					count=1;
1581 					break;
1582 					}
1583 				}
1584 			d=Time_F(STOP);
1585 			BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1586 				   : "%ld %d bit DSA verify in %.2fs\n",
1587 				   count,dsa_bits[j],d);
1588 			dsa_results[j][1]=d/(double)count;
1589 			}
1590 
1591 		if (rsa_count <= 1)
1592 			{
1593 			/* if longer than 10s, don't do any more */
1594 			for (j++; j<DSA_NUM; j++)
1595 				dsa_doit[j]=0;
1596 			}
1597 		}
1598 	if (rnd_fake) RAND_cleanup();
1599 #endif
1600 #ifdef HAVE_FORK
1601 show_res:
1602 #endif
1603 	if(!mr)
1604 		{
1605 		fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1606         fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1607 		printf("options:");
1608 		printf("%s ",BN_options());
1609 #ifndef OPENSSL_NO_MD2
1610 		printf("%s ",MD2_options());
1611 #endif
1612 #ifndef OPENSSL_NO_RC4
1613 		printf("%s ",RC4_options());
1614 #endif
1615 #ifndef OPENSSL_NO_DES
1616 		printf("%s ",DES_options());
1617 #endif
1618 #ifndef OPENSSL_NO_AES
1619 		printf("%s ",AES_options());
1620 #endif
1621 #ifndef OPENSSL_NO_IDEA
1622 		printf("%s ",idea_options());
1623 #endif
1624 #ifndef OPENSSL_NO_BF
1625 		printf("%s ",BF_options());
1626 #endif
1627 		fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1628 		printf("available timing options: ");
1629 #ifdef TIMES
1630 		printf("TIMES ");
1631 #endif
1632 #ifdef TIMEB
1633 		printf("TIMEB ");
1634 #endif
1635 #ifdef USE_TOD
1636 		printf("USE_TOD ");
1637 #endif
1638 #ifdef HZ
1639 #define as_string(s) (#s)
1640 		printf("HZ=%g", (double)HZ);
1641 # ifdef _SC_CLK_TCK
1642 		printf(" [sysconf value]");
1643 # endif
1644 #endif
1645 		printf("\n");
1646 		printf("timing function used: %s%s%s%s%s%s%s\n",
1647 		       (ftime_used ? "ftime" : ""),
1648 		       (ftime_used + times_used > 1 ? "," : ""),
1649 		       (times_used ? "times" : ""),
1650 		       (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1651 		       (gettimeofday_used ? "gettimeofday" : ""),
1652 		       (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1653 		       (getrusage_used ? "getrusage" : ""));
1654 		}
1655 
1656 	if (pr_header)
1657 		{
1658 		if(mr)
1659 			fprintf(stdout,"+H");
1660 		else
1661 			{
1662 			fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1663 			fprintf(stdout,"type        ");
1664 			}
1665 		for (j=0;  j<SIZE_NUM; j++)
1666 			fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1667 		fprintf(stdout,"\n");
1668 		}
1669 
1670 	for (k=0; k<ALGOR_NUM; k++)
1671 		{
1672 		if (!doit[k]) continue;
1673 		if(mr)
1674 			fprintf(stdout,"+F:%d:%s",k,names[k]);
1675 		else
1676 			fprintf(stdout,"%-13s",names[k]);
1677 		for (j=0; j<SIZE_NUM; j++)
1678 			{
1679 			if (results[k][j] > 10000 && !mr)
1680 				fprintf(stdout," %11.2fk",results[k][j]/1e3);
1681 			else
1682 				fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1683 			}
1684 		fprintf(stdout,"\n");
1685 		}
1686 #ifndef OPENSSL_NO_RSA
1687 	j=1;
1688 	for (k=0; k<RSA_NUM; k++)
1689 		{
1690 		if (!rsa_doit[k]) continue;
1691 		if (j && !mr)
1692 			{
1693 			printf("%18ssign    verify    sign/s verify/s\n"," ");
1694 			j=0;
1695 			}
1696 		if(mr)
1697 			fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1698 				k,rsa_bits[k],rsa_results[k][0],
1699 				rsa_results[k][1]);
1700 		else
1701 			fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1702 				rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1703 				1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1704 		}
1705 #endif
1706 #ifndef OPENSSL_NO_DSA
1707 	j=1;
1708 	for (k=0; k<DSA_NUM; k++)
1709 		{
1710 		if (!dsa_doit[k]) continue;
1711 		if (j && !mr)
1712 			{
1713 			printf("%18ssign    verify    sign/s verify/s\n"," ");
1714 			j=0;
1715 			}
1716 		if(mr)
1717 			fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1718 				k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1719 		else
1720 			fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1721 				dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1722 				1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1723 		}
1724 #endif
1725 	mret=0;
1726 end:
1727 	ERR_print_errors(bio_err);
1728 	if (buf != NULL) OPENSSL_free(buf);
1729 	if (buf2 != NULL) OPENSSL_free(buf2);
1730 #ifndef OPENSSL_NO_RSA
1731 	for (i=0; i<RSA_NUM; i++)
1732 		if (rsa_key[i] != NULL)
1733 			RSA_free(rsa_key[i]);
1734 #endif
1735 #ifndef OPENSSL_NO_DSA
1736 	for (i=0; i<DSA_NUM; i++)
1737 		if (dsa_key[i] != NULL)
1738 			DSA_free(dsa_key[i]);
1739 #endif
1740 	apps_shutdown();
1741 	OPENSSL_EXIT(mret);
1742 	}
1743 
1744 static void print_message(const char *s, long num, int length)
1745 	{
1746 #ifdef SIGALRM
1747 	BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1748 		   : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1749 	(void)BIO_flush(bio_err);
1750 	alarm(SECONDS);
1751 #else
1752 	BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1753 		   : "Doing %s %ld times on %d size blocks: ",s,num,length);
1754 	(void)BIO_flush(bio_err);
1755 #endif
1756 #ifdef LINT
1757 	num=num;
1758 #endif
1759 	}
1760 
1761 static void pkey_print_message(char *str, char *str2, long num, int bits,
1762 	     int tm)
1763 	{
1764 #ifdef SIGALRM
1765 	BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1766 			   : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1767 	(void)BIO_flush(bio_err);
1768 	alarm(RSA_SECONDS);
1769 #else
1770 	BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1771 			   : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1772 	(void)BIO_flush(bio_err);
1773 #endif
1774 #ifdef LINT
1775 	num=num;
1776 #endif
1777 	}
1778 
1779 static void print_result(int alg,int run_no,int count,double time_used)
1780 	{
1781 	BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1782 		   : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1783 	results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1784 	}
1785 
1786 static char *sstrsep(char **string, const char *delim)
1787     {
1788     char isdelim[256];
1789     char *token = *string;
1790 
1791     if (**string == 0)
1792         return NULL;
1793 
1794     memset(isdelim, 0, sizeof isdelim);
1795     isdelim[0] = 1;
1796 
1797     while (*delim)
1798         {
1799         isdelim[(unsigned char)(*delim)] = 1;
1800         delim++;
1801         }
1802 
1803     while (!isdelim[(unsigned char)(**string)])
1804         {
1805         (*string)++;
1806         }
1807 
1808     if (**string)
1809         {
1810         **string = 0;
1811         (*string)++;
1812         }
1813 
1814     return token;
1815     }
1816 
1817 #ifdef HAVE_FORK
1818 static int do_multi(int multi)
1819 	{
1820 	int n;
1821 	int fd[2];
1822 	int *fds;
1823 	static char sep[]=":";
1824 
1825 	fds=malloc(multi*sizeof *fds);
1826 	for(n=0 ; n < multi ; ++n)
1827 		{
1828 		pipe(fd);
1829 		if(fork())
1830 			{
1831 			close(fd[1]);
1832 			fds[n]=fd[0];
1833 			}
1834 		else
1835 			{
1836 			close(fd[0]);
1837 			close(1);
1838 			dup(fd[1]);
1839 			close(fd[1]);
1840 			mr=1;
1841 			usertime=0;
1842 			return 0;
1843 			}
1844 		printf("Forked child %d\n",n);
1845 		}
1846 
1847 	/* for now, assume the pipe is long enough to take all the output */
1848 	for(n=0 ; n < multi ; ++n)
1849 		{
1850 		FILE *f;
1851 		char buf[1024];
1852 		char *p;
1853 
1854 		f=fdopen(fds[n],"r");
1855 		while(fgets(buf,sizeof buf,f))
1856 			{
1857 			p=strchr(buf,'\n');
1858 			if(p)
1859 				*p='\0';
1860 			if(buf[0] != '+')
1861 				{
1862 				fprintf(stderr,"Don't understand line '%s' from child %d\n",
1863 						buf,n);
1864 				continue;
1865 				}
1866 			printf("Got: %s from %d\n",buf,n);
1867 			if(!strncmp(buf,"+F:",3))
1868 				{
1869 				int alg;
1870 				int j;
1871 
1872 				p=buf+3;
1873 				alg=atoi(sstrsep(&p,sep));
1874 				sstrsep(&p,sep);
1875 				for(j=0 ; j < SIZE_NUM ; ++j)
1876 					results[alg][j]+=atof(sstrsep(&p,sep));
1877 				}
1878 			else if(!strncmp(buf,"+F2:",4))
1879 				{
1880 				int k;
1881 				double d;
1882 
1883 				p=buf+4;
1884 				k=atoi(sstrsep(&p,sep));
1885 				sstrsep(&p,sep);
1886 
1887 				d=atof(sstrsep(&p,sep));
1888 				if(n)
1889 					rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1890 				else
1891 					rsa_results[k][0]=d;
1892 
1893 				d=atof(sstrsep(&p,sep));
1894 				if(n)
1895 					rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1896 				else
1897 					rsa_results[k][1]=d;
1898 				}
1899 			else if(!strncmp(buf,"+F2:",4))
1900 				{
1901 				int k;
1902 				double d;
1903 
1904 				p=buf+4;
1905 				k=atoi(sstrsep(&p,sep));
1906 				sstrsep(&p,sep);
1907 
1908 				d=atof(sstrsep(&p,sep));
1909 				if(n)
1910 					rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1911 				else
1912 					rsa_results[k][0]=d;
1913 
1914 				d=atof(sstrsep(&p,sep));
1915 				if(n)
1916 					rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1917 				else
1918 					rsa_results[k][1]=d;
1919 				}
1920 			else if(!strncmp(buf,"+F3:",4))
1921 				{
1922 				int k;
1923 				double d;
1924 
1925 				p=buf+4;
1926 				k=atoi(sstrsep(&p,sep));
1927 				sstrsep(&p,sep);
1928 
1929 				d=atof(sstrsep(&p,sep));
1930 				if(n)
1931 					dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1932 				else
1933 					dsa_results[k][0]=d;
1934 
1935 				d=atof(sstrsep(&p,sep));
1936 				if(n)
1937 					dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1938 				else
1939 					dsa_results[k][1]=d;
1940 				}
1941 			else if(!strncmp(buf,"+H:",3))
1942 				{
1943 				}
1944 			else
1945 				fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);
1946 			}
1947 		}
1948 	return 1;
1949 	}
1950 #endif
1951 #endif
1952