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