xref: /freebsd/crypto/openssl/apps/speed.c (revision 6b3455a7665208c366849f0b2b3bc916fb97516e)
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 			dsa_doit[R_DSA_2048]=1;
777 			}
778 		else
779 #endif
780 			{
781 			BIO_printf(bio_err,"Error: bad option or value\n");
782 			BIO_printf(bio_err,"\n");
783 			BIO_printf(bio_err,"Available values:\n");
784 #ifndef OPENSSL_NO_MD2
785 			BIO_printf(bio_err,"md2      ");
786 #endif
787 #ifndef OPENSSL_NO_MDC2
788 			BIO_printf(bio_err,"mdc2     ");
789 #endif
790 #ifndef OPENSSL_NO_MD4
791 			BIO_printf(bio_err,"md4      ");
792 #endif
793 #ifndef OPENSSL_NO_MD5
794 			BIO_printf(bio_err,"md5      ");
795 #ifndef OPENSSL_NO_HMAC
796 			BIO_printf(bio_err,"hmac     ");
797 #endif
798 #endif
799 #ifndef OPENSSL_NO_SHA1
800 			BIO_printf(bio_err,"sha1     ");
801 #endif
802 #ifndef OPENSSL_NO_RIPEMD160
803 			BIO_printf(bio_err,"rmd160");
804 #endif
805 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
806     !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
807     !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
808 			BIO_printf(bio_err,"\n");
809 #endif
810 
811 #ifndef OPENSSL_NO_IDEA
812 			BIO_printf(bio_err,"idea-cbc ");
813 #endif
814 #ifndef OPENSSL_NO_RC2
815 			BIO_printf(bio_err,"rc2-cbc  ");
816 #endif
817 #ifndef OPENSSL_NO_RC5
818 			BIO_printf(bio_err,"rc5-cbc  ");
819 #endif
820 #ifndef OPENSSL_NO_BF
821 			BIO_printf(bio_err,"bf-cbc");
822 #endif
823 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
824     !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
825 			BIO_printf(bio_err,"\n");
826 #endif
827 #ifndef OPENSSL_NO_DES
828 			BIO_printf(bio_err,"des-cbc  des-ede3 ");
829 #endif
830 #ifndef OPENSSL_NO_AES
831 			BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
832 #endif
833 #ifndef OPENSSL_NO_RC4
834 			BIO_printf(bio_err,"rc4");
835 #endif
836 			BIO_printf(bio_err,"\n");
837 
838 #ifndef OPENSSL_NO_RSA
839 			BIO_printf(bio_err,"rsa512   rsa1024  rsa2048  rsa4096\n");
840 #endif
841 
842 #ifndef OPENSSL_NO_DSA
843 			BIO_printf(bio_err,"dsa512   dsa1024  dsa2048\n");
844 #endif
845 
846 #ifndef OPENSSL_NO_IDEA
847 			BIO_printf(bio_err,"idea     ");
848 #endif
849 #ifndef OPENSSL_NO_RC2
850 			BIO_printf(bio_err,"rc2      ");
851 #endif
852 #ifndef OPENSSL_NO_DES
853 			BIO_printf(bio_err,"des      ");
854 #endif
855 #ifndef OPENSSL_NO_AES
856 			BIO_printf(bio_err,"aes      ");
857 #endif
858 #ifndef OPENSSL_NO_RSA
859 			BIO_printf(bio_err,"rsa      ");
860 #endif
861 #ifndef OPENSSL_NO_BF
862 			BIO_printf(bio_err,"blowfish");
863 #endif
864 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
865     !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
866     !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
867 			BIO_printf(bio_err,"\n");
868 #endif
869 
870 			BIO_printf(bio_err,"\n");
871 			BIO_printf(bio_err,"Available options:\n");
872 #if defined(TIMES) || defined(USE_TOD)
873 			BIO_printf(bio_err,"-elapsed        measure time in real time instead of CPU user time.\n");
874 #endif
875 #ifndef OPENSSL_NO_ENGINE
876 			BIO_printf(bio_err,"-engine e       use engine e, possibly a hardware device.\n");
877 #endif
878 			BIO_printf(bio_err,"-evp e          use EVP e.\n");
879 			BIO_printf(bio_err,"-decrypt        time decryption instead of encryption (only EVP).\n");
880 			BIO_printf(bio_err,"-mr             produce machine readable output.\n");
881 #ifdef HAVE_FORK
882 			BIO_printf(bio_err,"-multi n        run n benchmarks in parallel.\n");
883 #endif
884 			goto end;
885 			}
886 		argc--;
887 		argv++;
888 		j++;
889 		}
890 
891 #ifdef HAVE_FORK
892 	if(multi && do_multi(multi))
893 		goto show_res;
894 #endif
895 
896 	if (j == 0)
897 		{
898 		for (i=0; i<ALGOR_NUM; i++)
899 			{
900 			if (i != D_EVP)
901 				doit[i]=1;
902 			}
903 		for (i=0; i<RSA_NUM; i++)
904 			rsa_doit[i]=1;
905 		for (i=0; i<DSA_NUM; i++)
906 			dsa_doit[i]=1;
907 		}
908 	for (i=0; i<ALGOR_NUM; i++)
909 		if (doit[i]) pr_header++;
910 
911 	if (usertime == 0 && !mr)
912 		BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
913 	if (usertime <= 0 && !mr)
914 		{
915 		BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
916 		BIO_printf(bio_err,"program when this computer is idle.\n");
917 		}
918 
919 #ifndef OPENSSL_NO_RSA
920 	for (i=0; i<RSA_NUM; i++)
921 		{
922 		const unsigned char *p;
923 
924 		p=rsa_data[i];
925 		rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
926 		if (rsa_key[i] == NULL)
927 			{
928 			BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
929 			goto end;
930 			}
931 #if 0
932 		else
933 			{
934 			BIO_printf(bio_err,mr ? "+RK:%d:"
935 				   : "Loaded RSA key, %d bit modulus and e= 0x",
936 				   BN_num_bits(rsa_key[i]->n));
937 			BN_print(bio_err,rsa_key[i]->e);
938 			BIO_printf(bio_err,"\n");
939 			}
940 #endif
941 		}
942 #endif
943 
944 #ifndef OPENSSL_NO_DSA
945 	dsa_key[0]=get_dsa512();
946 	dsa_key[1]=get_dsa1024();
947 	dsa_key[2]=get_dsa2048();
948 #endif
949 
950 #ifndef OPENSSL_NO_DES
951 	DES_set_key_unchecked(&key,&sch);
952 	DES_set_key_unchecked(&key2,&sch2);
953 	DES_set_key_unchecked(&key3,&sch3);
954 #endif
955 #ifndef OPENSSL_NO_AES
956 	AES_set_encrypt_key(key16,128,&aes_ks1);
957 	AES_set_encrypt_key(key24,192,&aes_ks2);
958 	AES_set_encrypt_key(key32,256,&aes_ks3);
959 #endif
960 #ifndef OPENSSL_NO_IDEA
961 	idea_set_encrypt_key(key16,&idea_ks);
962 #endif
963 #ifndef OPENSSL_NO_RC4
964 	RC4_set_key(&rc4_ks,16,key16);
965 #endif
966 #ifndef OPENSSL_NO_RC2
967 	RC2_set_key(&rc2_ks,16,key16,128);
968 #endif
969 #ifndef OPENSSL_NO_RC5
970 	RC5_32_set_key(&rc5_ks,16,key16,12);
971 #endif
972 #ifndef OPENSSL_NO_BF
973 	BF_set_key(&bf_ks,16,key16);
974 #endif
975 #ifndef OPENSSL_NO_CAST
976 	CAST_set_key(&cast_ks,16,key16);
977 #endif
978 #ifndef OPENSSL_NO_RSA
979 	memset(rsa_c,0,sizeof(rsa_c));
980 #endif
981 #ifndef SIGALRM
982 #ifndef OPENSSL_NO_DES
983 	BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
984 	count=10;
985 	do	{
986 		long i;
987 		count*=2;
988 		Time_F(START);
989 		for (i=count; i; i--)
990 			DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
991 				&sch,DES_ENCRYPT);
992 		d=Time_F(STOP);
993 		} while (d <3);
994 	save_count=count;
995 	c[D_MD2][0]=count/10;
996 	c[D_MDC2][0]=count/10;
997 	c[D_MD4][0]=count;
998 	c[D_MD5][0]=count;
999 	c[D_HMAC][0]=count;
1000 	c[D_SHA1][0]=count;
1001 	c[D_RMD160][0]=count;
1002 	c[D_RC4][0]=count*5;
1003 	c[D_CBC_DES][0]=count;
1004 	c[D_EDE3_DES][0]=count/3;
1005 	c[D_CBC_IDEA][0]=count;
1006 	c[D_CBC_RC2][0]=count;
1007 	c[D_CBC_RC5][0]=count;
1008 	c[D_CBC_BF][0]=count;
1009 	c[D_CBC_CAST][0]=count;
1010 	c[D_CBC_128_AES][0]=count;
1011 	c[D_CBC_192_AES][0]=count;
1012 	c[D_CBC_256_AES][0]=count;
1013 
1014 	for (i=1; i<SIZE_NUM; i++)
1015 		{
1016 		c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1017 		c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1018 		c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1019 		c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1020 		c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1021 		c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1022 		c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1023 		}
1024 	for (i=1; i<SIZE_NUM; i++)
1025 		{
1026 		long l0,l1;
1027 
1028 		l0=(long)lengths[i-1];
1029 		l1=(long)lengths[i];
1030 		c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1031 		c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1032 		c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1033 		c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1034 		c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1035 		c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1036 		c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1037 		c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1038 		c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
1039 		c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
1040 		c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
1041 		}
1042 #ifndef OPENSSL_NO_RSA
1043 	rsa_c[R_RSA_512][0]=count/2000;
1044 	rsa_c[R_RSA_512][1]=count/400;
1045 	for (i=1; i<RSA_NUM; i++)
1046 		{
1047 		rsa_c[i][0]=rsa_c[i-1][0]/8;
1048 		rsa_c[i][1]=rsa_c[i-1][1]/4;
1049 		if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1050 			rsa_doit[i]=0;
1051 		else
1052 			{
1053 			if (rsa_c[i][0] == 0)
1054 				{
1055 				rsa_c[i][0]=1;
1056 				rsa_c[i][1]=20;
1057 				}
1058 			}
1059 		}
1060 #endif
1061 
1062 #ifndef OPENSSL_NO_DSA
1063 	dsa_c[R_DSA_512][0]=count/1000;
1064 	dsa_c[R_DSA_512][1]=count/1000/2;
1065 	for (i=1; i<DSA_NUM; i++)
1066 		{
1067 		dsa_c[i][0]=dsa_c[i-1][0]/4;
1068 		dsa_c[i][1]=dsa_c[i-1][1]/4;
1069 		if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1070 			dsa_doit[i]=0;
1071 		else
1072 			{
1073 			if (dsa_c[i] == 0)
1074 				{
1075 				dsa_c[i][0]=1;
1076 				dsa_c[i][1]=1;
1077 				}
1078 			}
1079 		}
1080 #endif
1081 
1082 #define COND(d)	(count < (d))
1083 #define COUNT(d) (d)
1084 #else
1085 /* not worth fixing */
1086 # error "You cannot disable DES on systems without SIGALRM."
1087 #endif /* OPENSSL_NO_DES */
1088 #else
1089 #define COND(c)	(run)
1090 #define COUNT(d) (count)
1091 	signal(SIGALRM,sig_done);
1092 #endif /* SIGALRM */
1093 
1094 #ifndef OPENSSL_NO_MD2
1095 	if (doit[D_MD2])
1096 		{
1097 		for (j=0; j<SIZE_NUM; j++)
1098 			{
1099 			print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1100 			Time_F(START);
1101 			for (count=0,run=1; COND(c[D_MD2][j]); count++)
1102 				EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1103 			d=Time_F(STOP);
1104 			print_result(D_MD2,j,count,d);
1105 			}
1106 		}
1107 #endif
1108 #ifndef OPENSSL_NO_MDC2
1109 	if (doit[D_MDC2])
1110 		{
1111 		for (j=0; j<SIZE_NUM; j++)
1112 			{
1113 			print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1114 			Time_F(START);
1115 			for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1116 				EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1117 			d=Time_F(STOP);
1118 			print_result(D_MDC2,j,count,d);
1119 			}
1120 		}
1121 #endif
1122 
1123 #ifndef OPENSSL_NO_MD4
1124 	if (doit[D_MD4])
1125 		{
1126 		for (j=0; j<SIZE_NUM; j++)
1127 			{
1128 			print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1129 			Time_F(START);
1130 			for (count=0,run=1; COND(c[D_MD4][j]); count++)
1131 				EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1132 			d=Time_F(STOP);
1133 			print_result(D_MD4,j,count,d);
1134 			}
1135 		}
1136 #endif
1137 
1138 #ifndef OPENSSL_NO_MD5
1139 	if (doit[D_MD5])
1140 		{
1141 		for (j=0; j<SIZE_NUM; j++)
1142 			{
1143 			print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1144 			Time_F(START);
1145 			for (count=0,run=1; COND(c[D_MD5][j]); count++)
1146 				EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1147 			d=Time_F(STOP);
1148 			print_result(D_MD5,j,count,d);
1149 			}
1150 		}
1151 #endif
1152 
1153 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1154 	if (doit[D_HMAC])
1155 		{
1156 		HMAC_CTX hctx;
1157 
1158 		HMAC_CTX_init(&hctx);
1159 		HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1160 			16,EVP_md5(), NULL);
1161 
1162 		for (j=0; j<SIZE_NUM; j++)
1163 			{
1164 			print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1165 			Time_F(START);
1166 			for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1167 				{
1168 				HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1169 				HMAC_Update(&hctx,buf,lengths[j]);
1170 				HMAC_Final(&hctx,&(hmac[0]),NULL);
1171 				}
1172 			d=Time_F(STOP);
1173 			print_result(D_HMAC,j,count,d);
1174 			}
1175 		HMAC_CTX_cleanup(&hctx);
1176 		}
1177 #endif
1178 #ifndef OPENSSL_NO_SHA
1179 	if (doit[D_SHA1])
1180 		{
1181 		for (j=0; j<SIZE_NUM; j++)
1182 			{
1183 			print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1184 			Time_F(START);
1185 			for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1186 				EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1187 			d=Time_F(STOP);
1188 			print_result(D_SHA1,j,count,d);
1189 			}
1190 		}
1191 #endif
1192 #ifndef OPENSSL_NO_RIPEMD
1193 	if (doit[D_RMD160])
1194 		{
1195 		for (j=0; j<SIZE_NUM; j++)
1196 			{
1197 			print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1198 			Time_F(START);
1199 			for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1200 				EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1201 			d=Time_F(STOP);
1202 			print_result(D_RMD160,j,count,d);
1203 			}
1204 		}
1205 #endif
1206 #ifndef OPENSSL_NO_RC4
1207 	if (doit[D_RC4])
1208 		{
1209 		for (j=0; j<SIZE_NUM; j++)
1210 			{
1211 			print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1212 			Time_F(START);
1213 			for (count=0,run=1; COND(c[D_RC4][j]); count++)
1214 				RC4(&rc4_ks,(unsigned int)lengths[j],
1215 					buf,buf);
1216 			d=Time_F(STOP);
1217 			print_result(D_RC4,j,count,d);
1218 			}
1219 		}
1220 #endif
1221 #ifndef OPENSSL_NO_DES
1222 	if (doit[D_CBC_DES])
1223 		{
1224 		for (j=0; j<SIZE_NUM; j++)
1225 			{
1226 			print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1227 			Time_F(START);
1228 			for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1229 				DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1230 						 &DES_iv,DES_ENCRYPT);
1231 			d=Time_F(STOP);
1232 			print_result(D_CBC_DES,j,count,d);
1233 			}
1234 		}
1235 
1236 	if (doit[D_EDE3_DES])
1237 		{
1238 		for (j=0; j<SIZE_NUM; j++)
1239 			{
1240 			print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1241 			Time_F(START);
1242 			for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1243 				DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1244 						     &sch,&sch2,&sch3,
1245 						     &DES_iv,DES_ENCRYPT);
1246 			d=Time_F(STOP);
1247 			print_result(D_EDE3_DES,j,count,d);
1248 			}
1249 		}
1250 #endif
1251 #ifndef OPENSSL_NO_AES
1252 	if (doit[D_CBC_128_AES])
1253 		{
1254 		for (j=0; j<SIZE_NUM; j++)
1255 			{
1256 			print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1257 			Time_F(START);
1258 			for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1259 				AES_cbc_encrypt(buf,buf,
1260 					(unsigned long)lengths[j],&aes_ks1,
1261 					iv,AES_ENCRYPT);
1262 			d=Time_F(STOP);
1263 			print_result(D_CBC_128_AES,j,count,d);
1264 			}
1265 		}
1266 	if (doit[D_CBC_192_AES])
1267 		{
1268 		for (j=0; j<SIZE_NUM; j++)
1269 			{
1270 			print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1271 			Time_F(START);
1272 			for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1273 				AES_cbc_encrypt(buf,buf,
1274 					(unsigned long)lengths[j],&aes_ks2,
1275 					iv,AES_ENCRYPT);
1276 			d=Time_F(STOP);
1277 			print_result(D_CBC_192_AES,j,count,d);
1278 			}
1279 		}
1280 	if (doit[D_CBC_256_AES])
1281 		{
1282 		for (j=0; j<SIZE_NUM; j++)
1283 			{
1284 			print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1285 			Time_F(START);
1286 			for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1287 				AES_cbc_encrypt(buf,buf,
1288 					(unsigned long)lengths[j],&aes_ks3,
1289 					iv,AES_ENCRYPT);
1290 			d=Time_F(STOP);
1291 			print_result(D_CBC_256_AES,j,count,d);
1292 			}
1293 		}
1294 
1295 #endif
1296 #ifndef OPENSSL_NO_IDEA
1297 	if (doit[D_CBC_IDEA])
1298 		{
1299 		for (j=0; j<SIZE_NUM; j++)
1300 			{
1301 			print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1302 			Time_F(START);
1303 			for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1304 				idea_cbc_encrypt(buf,buf,
1305 					(unsigned long)lengths[j],&idea_ks,
1306 					iv,IDEA_ENCRYPT);
1307 			d=Time_F(STOP);
1308 			print_result(D_CBC_IDEA,j,count,d);
1309 			}
1310 		}
1311 #endif
1312 #ifndef OPENSSL_NO_RC2
1313 	if (doit[D_CBC_RC2])
1314 		{
1315 		for (j=0; j<SIZE_NUM; j++)
1316 			{
1317 			print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1318 			Time_F(START);
1319 			for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1320 				RC2_cbc_encrypt(buf,buf,
1321 					(unsigned long)lengths[j],&rc2_ks,
1322 					iv,RC2_ENCRYPT);
1323 			d=Time_F(STOP);
1324 			print_result(D_CBC_RC2,j,count,d);
1325 			}
1326 		}
1327 #endif
1328 #ifndef OPENSSL_NO_RC5
1329 	if (doit[D_CBC_RC5])
1330 		{
1331 		for (j=0; j<SIZE_NUM; j++)
1332 			{
1333 			print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1334 			Time_F(START);
1335 			for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1336 				RC5_32_cbc_encrypt(buf,buf,
1337 					(unsigned long)lengths[j],&rc5_ks,
1338 					iv,RC5_ENCRYPT);
1339 			d=Time_F(STOP);
1340 			print_result(D_CBC_RC5,j,count,d);
1341 			}
1342 		}
1343 #endif
1344 #ifndef OPENSSL_NO_BF
1345 	if (doit[D_CBC_BF])
1346 		{
1347 		for (j=0; j<SIZE_NUM; j++)
1348 			{
1349 			print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1350 			Time_F(START);
1351 			for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1352 				BF_cbc_encrypt(buf,buf,
1353 					(unsigned long)lengths[j],&bf_ks,
1354 					iv,BF_ENCRYPT);
1355 			d=Time_F(STOP);
1356 			print_result(D_CBC_BF,j,count,d);
1357 			}
1358 		}
1359 #endif
1360 #ifndef OPENSSL_NO_CAST
1361 	if (doit[D_CBC_CAST])
1362 		{
1363 		for (j=0; j<SIZE_NUM; j++)
1364 			{
1365 			print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1366 			Time_F(START);
1367 			for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1368 				CAST_cbc_encrypt(buf,buf,
1369 					(unsigned long)lengths[j],&cast_ks,
1370 					iv,CAST_ENCRYPT);
1371 			d=Time_F(STOP);
1372 			print_result(D_CBC_CAST,j,count,d);
1373 			}
1374 		}
1375 #endif
1376 
1377 	if (doit[D_EVP])
1378 		{
1379 		for (j=0; j<SIZE_NUM; j++)
1380 			{
1381 			if (evp_cipher)
1382 				{
1383 				EVP_CIPHER_CTX ctx;
1384 				int outl;
1385 
1386 				names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1387 				/* -O3 -fschedule-insns messes up an
1388 				 * optimization here!  names[D_EVP]
1389 				 * somehow becomes NULL */
1390 				print_message(names[D_EVP],save_count,
1391 					lengths[j]);
1392 
1393 				EVP_CIPHER_CTX_init(&ctx);
1394 				if(decrypt)
1395 					EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1396 				else
1397 					EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1398 
1399 				Time_F(START);
1400 				if(decrypt)
1401 					for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1402 						EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1403 				else
1404 					for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1405 						EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1406 				if(decrypt)
1407 					EVP_DecryptFinal_ex(&ctx,buf,&outl);
1408 				else
1409 					EVP_EncryptFinal_ex(&ctx,buf,&outl);
1410 				d=Time_F(STOP);
1411 				EVP_CIPHER_CTX_cleanup(&ctx);
1412 				}
1413 			if (evp_md)
1414 				{
1415 				names[D_EVP]=OBJ_nid2ln(evp_md->type);
1416 				print_message(names[D_EVP],save_count,
1417 					lengths[j]);
1418 
1419 				Time_F(START);
1420 				for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1421 					EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1422 
1423 				d=Time_F(STOP);
1424 				}
1425 			print_result(D_EVP,j,count,d);
1426 			}
1427 		}
1428 
1429 	RAND_pseudo_bytes(buf,36);
1430 #ifndef OPENSSL_NO_RSA
1431 	for (j=0; j<RSA_NUM; j++)
1432 		{
1433 		int ret;
1434 		if (!rsa_doit[j]) continue;
1435 		ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1436 		if (ret == 0)
1437 			{
1438 			BIO_printf(bio_err,"RSA sign failure.  No RSA sign will be done.\n");
1439 			ERR_print_errors(bio_err);
1440 			rsa_count=1;
1441 			}
1442 		else
1443 			{
1444 			pkey_print_message("private","rsa",
1445 				rsa_c[j][0],rsa_bits[j],
1446 				RSA_SECONDS);
1447 /*			RSA_blinding_on(rsa_key[j],NULL); */
1448 			Time_F(START);
1449 			for (count=0,run=1; COND(rsa_c[j][0]); count++)
1450 				{
1451 				ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1452 					&rsa_num, rsa_key[j]);
1453 				if (ret == 0)
1454 					{
1455 					BIO_printf(bio_err,
1456 						"RSA sign failure\n");
1457 					ERR_print_errors(bio_err);
1458 					count=1;
1459 					break;
1460 					}
1461 				}
1462 			d=Time_F(STOP);
1463 			BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1464 				   : "%ld %d bit private RSA's in %.2fs\n",
1465 				   count,rsa_bits[j],d);
1466 			rsa_results[j][0]=d/(double)count;
1467 			rsa_count=count;
1468 			}
1469 
1470 #if 1
1471 		ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1472 		if (ret <= 0)
1473 			{
1474 			BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
1475 			ERR_print_errors(bio_err);
1476 			rsa_doit[j] = 0;
1477 			}
1478 		else
1479 			{
1480 			pkey_print_message("public","rsa",
1481 				rsa_c[j][1],rsa_bits[j],
1482 				RSA_SECONDS);
1483 			Time_F(START);
1484 			for (count=0,run=1; COND(rsa_c[j][1]); count++)
1485 				{
1486 				ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1487 					rsa_num, rsa_key[j]);
1488 				if (ret == 0)
1489 					{
1490 					BIO_printf(bio_err,
1491 						"RSA verify failure\n");
1492 					ERR_print_errors(bio_err);
1493 					count=1;
1494 					break;
1495 					}
1496 				}
1497 			d=Time_F(STOP);
1498 			BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1499 				   : "%ld %d bit public RSA's in %.2fs\n",
1500 				   count,rsa_bits[j],d);
1501 			rsa_results[j][1]=d/(double)count;
1502 			}
1503 #endif
1504 
1505 		if (rsa_count <= 1)
1506 			{
1507 			/* if longer than 10s, don't do any more */
1508 			for (j++; j<RSA_NUM; j++)
1509 				rsa_doit[j]=0;
1510 			}
1511 		}
1512 #endif
1513 
1514 	RAND_pseudo_bytes(buf,20);
1515 #ifndef OPENSSL_NO_DSA
1516 	if (RAND_status() != 1)
1517 		{
1518 		RAND_seed(rnd_seed, sizeof rnd_seed);
1519 		rnd_fake = 1;
1520 		}
1521 	for (j=0; j<DSA_NUM; j++)
1522 		{
1523 		unsigned int kk;
1524 		int ret;
1525 
1526 		if (!dsa_doit[j]) continue;
1527 /*		DSA_generate_key(dsa_key[j]); */
1528 /*		DSA_sign_setup(dsa_key[j],NULL); */
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,"DSA sign failure.  No DSA sign will be done.\n");
1534 			ERR_print_errors(bio_err);
1535 			rsa_count=1;
1536 			}
1537 		else
1538 			{
1539 			pkey_print_message("sign","dsa",
1540 				dsa_c[j][0],dsa_bits[j],
1541 				DSA_SECONDS);
1542 			Time_F(START);
1543 			for (count=0,run=1; COND(dsa_c[j][0]); count++)
1544 				{
1545 				ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1546 					&kk,dsa_key[j]);
1547 				if (ret == 0)
1548 					{
1549 					BIO_printf(bio_err,
1550 						"DSA sign failure\n");
1551 					ERR_print_errors(bio_err);
1552 					count=1;
1553 					break;
1554 					}
1555 				}
1556 			d=Time_F(STOP);
1557 			BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1558 				   : "%ld %d bit DSA signs in %.2fs\n",
1559 				   count,dsa_bits[j],d);
1560 			dsa_results[j][0]=d/(double)count;
1561 			rsa_count=count;
1562 			}
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,"DSA verify failure.  No DSA verify will be done.\n");
1569 			ERR_print_errors(bio_err);
1570 			dsa_doit[j] = 0;
1571 			}
1572 		else
1573 			{
1574 			pkey_print_message("verify","dsa",
1575 				dsa_c[j][1],dsa_bits[j],
1576 				DSA_SECONDS);
1577 			Time_F(START);
1578 			for (count=0,run=1; COND(dsa_c[j][1]); count++)
1579 				{
1580 				ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1581 					kk,dsa_key[j]);
1582 				if (ret <= 0)
1583 					{
1584 					BIO_printf(bio_err,
1585 						"DSA verify failure\n");
1586 					ERR_print_errors(bio_err);
1587 					count=1;
1588 					break;
1589 					}
1590 				}
1591 			d=Time_F(STOP);
1592 			BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1593 				   : "%ld %d bit DSA verify in %.2fs\n",
1594 				   count,dsa_bits[j],d);
1595 			dsa_results[j][1]=d/(double)count;
1596 			}
1597 
1598 		if (rsa_count <= 1)
1599 			{
1600 			/* if longer than 10s, don't do any more */
1601 			for (j++; j<DSA_NUM; j++)
1602 				dsa_doit[j]=0;
1603 			}
1604 		}
1605 	if (rnd_fake) RAND_cleanup();
1606 #endif
1607 #ifdef HAVE_FORK
1608 show_res:
1609 #endif
1610 	if(!mr)
1611 		{
1612 		fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1613         fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1614 		printf("options:");
1615 		printf("%s ",BN_options());
1616 #ifndef OPENSSL_NO_MD2
1617 		printf("%s ",MD2_options());
1618 #endif
1619 #ifndef OPENSSL_NO_RC4
1620 		printf("%s ",RC4_options());
1621 #endif
1622 #ifndef OPENSSL_NO_DES
1623 		printf("%s ",DES_options());
1624 #endif
1625 #ifndef OPENSSL_NO_AES
1626 		printf("%s ",AES_options());
1627 #endif
1628 #ifndef OPENSSL_NO_IDEA
1629 		printf("%s ",idea_options());
1630 #endif
1631 #ifndef OPENSSL_NO_BF
1632 		printf("%s ",BF_options());
1633 #endif
1634 		fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1635 		printf("available timing options: ");
1636 #ifdef TIMES
1637 		printf("TIMES ");
1638 #endif
1639 #ifdef TIMEB
1640 		printf("TIMEB ");
1641 #endif
1642 #ifdef USE_TOD
1643 		printf("USE_TOD ");
1644 #endif
1645 #ifdef HZ
1646 #define as_string(s) (#s)
1647 		printf("HZ=%g", (double)HZ);
1648 # ifdef _SC_CLK_TCK
1649 		printf(" [sysconf value]");
1650 # endif
1651 #endif
1652 		printf("\n");
1653 		printf("timing function used: %s%s%s%s%s%s%s\n",
1654 		       (ftime_used ? "ftime" : ""),
1655 		       (ftime_used + times_used > 1 ? "," : ""),
1656 		       (times_used ? "times" : ""),
1657 		       (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1658 		       (gettimeofday_used ? "gettimeofday" : ""),
1659 		       (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1660 		       (getrusage_used ? "getrusage" : ""));
1661 		}
1662 
1663 	if (pr_header)
1664 		{
1665 		if(mr)
1666 			fprintf(stdout,"+H");
1667 		else
1668 			{
1669 			fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1670 			fprintf(stdout,"type        ");
1671 			}
1672 		for (j=0;  j<SIZE_NUM; j++)
1673 			fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1674 		fprintf(stdout,"\n");
1675 		}
1676 
1677 	for (k=0; k<ALGOR_NUM; k++)
1678 		{
1679 		if (!doit[k]) continue;
1680 		if(mr)
1681 			fprintf(stdout,"+F:%d:%s",k,names[k]);
1682 		else
1683 			fprintf(stdout,"%-13s",names[k]);
1684 		for (j=0; j<SIZE_NUM; j++)
1685 			{
1686 			if (results[k][j] > 10000 && !mr)
1687 				fprintf(stdout," %11.2fk",results[k][j]/1e3);
1688 			else
1689 				fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1690 			}
1691 		fprintf(stdout,"\n");
1692 		}
1693 #ifndef OPENSSL_NO_RSA
1694 	j=1;
1695 	for (k=0; k<RSA_NUM; k++)
1696 		{
1697 		if (!rsa_doit[k]) continue;
1698 		if (j && !mr)
1699 			{
1700 			printf("%18ssign    verify    sign/s verify/s\n"," ");
1701 			j=0;
1702 			}
1703 		if(mr)
1704 			fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1705 				k,rsa_bits[k],rsa_results[k][0],
1706 				rsa_results[k][1]);
1707 		else
1708 			fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1709 				rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1710 				1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1711 		}
1712 #endif
1713 #ifndef OPENSSL_NO_DSA
1714 	j=1;
1715 	for (k=0; k<DSA_NUM; k++)
1716 		{
1717 		if (!dsa_doit[k]) continue;
1718 		if (j && !mr)
1719 			{
1720 			printf("%18ssign    verify    sign/s verify/s\n"," ");
1721 			j=0;
1722 			}
1723 		if(mr)
1724 			fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1725 				k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1726 		else
1727 			fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1728 				dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1729 				1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1730 		}
1731 #endif
1732 	mret=0;
1733 end:
1734 	ERR_print_errors(bio_err);
1735 	if (buf != NULL) OPENSSL_free(buf);
1736 	if (buf2 != NULL) OPENSSL_free(buf2);
1737 #ifndef OPENSSL_NO_RSA
1738 	for (i=0; i<RSA_NUM; i++)
1739 		if (rsa_key[i] != NULL)
1740 			RSA_free(rsa_key[i]);
1741 #endif
1742 #ifndef OPENSSL_NO_DSA
1743 	for (i=0; i<DSA_NUM; i++)
1744 		if (dsa_key[i] != NULL)
1745 			DSA_free(dsa_key[i]);
1746 #endif
1747 	apps_shutdown();
1748 	OPENSSL_EXIT(mret);
1749 	}
1750 
1751 static void print_message(const char *s, long num, int length)
1752 	{
1753 #ifdef SIGALRM
1754 	BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1755 		   : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1756 	(void)BIO_flush(bio_err);
1757 	alarm(SECONDS);
1758 #else
1759 	BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1760 		   : "Doing %s %ld times on %d size blocks: ",s,num,length);
1761 	(void)BIO_flush(bio_err);
1762 #endif
1763 #ifdef LINT
1764 	num=num;
1765 #endif
1766 	}
1767 
1768 static void pkey_print_message(char *str, char *str2, long num, int bits,
1769 	     int tm)
1770 	{
1771 #ifdef SIGALRM
1772 	BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1773 			   : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1774 	(void)BIO_flush(bio_err);
1775 	alarm(RSA_SECONDS);
1776 #else
1777 	BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1778 			   : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1779 	(void)BIO_flush(bio_err);
1780 #endif
1781 #ifdef LINT
1782 	num=num;
1783 #endif
1784 	}
1785 
1786 static void print_result(int alg,int run_no,int count,double time_used)
1787 	{
1788 	BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1789 		   : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1790 	results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1791 	}
1792 
1793 static char *sstrsep(char **string, const char *delim)
1794     {
1795     char isdelim[256];
1796     char *token = *string;
1797 
1798     if (**string == 0)
1799         return NULL;
1800 
1801     memset(isdelim, 0, sizeof isdelim);
1802     isdelim[0] = 1;
1803 
1804     while (*delim)
1805         {
1806         isdelim[(unsigned char)(*delim)] = 1;
1807         delim++;
1808         }
1809 
1810     while (!isdelim[(unsigned char)(**string)])
1811         {
1812         (*string)++;
1813         }
1814 
1815     if (**string)
1816         {
1817         **string = 0;
1818         (*string)++;
1819         }
1820 
1821     return token;
1822     }
1823 
1824 #ifdef HAVE_FORK
1825 static int do_multi(int multi)
1826 	{
1827 	int n;
1828 	int fd[2];
1829 	int *fds;
1830 	static char sep[]=":";
1831 
1832 	fds=malloc(multi*sizeof *fds);
1833 	for(n=0 ; n < multi ; ++n)
1834 		{
1835 		pipe(fd);
1836 		if(fork())
1837 			{
1838 			close(fd[1]);
1839 			fds[n]=fd[0];
1840 			}
1841 		else
1842 			{
1843 			close(fd[0]);
1844 			close(1);
1845 			dup(fd[1]);
1846 			close(fd[1]);
1847 			mr=1;
1848 			usertime=0;
1849 			return 0;
1850 			}
1851 		printf("Forked child %d\n",n);
1852 		}
1853 
1854 	/* for now, assume the pipe is long enough to take all the output */
1855 	for(n=0 ; n < multi ; ++n)
1856 		{
1857 		FILE *f;
1858 		char buf[1024];
1859 		char *p;
1860 
1861 		f=fdopen(fds[n],"r");
1862 		while(fgets(buf,sizeof buf,f))
1863 			{
1864 			p=strchr(buf,'\n');
1865 			if(p)
1866 				*p='\0';
1867 			if(buf[0] != '+')
1868 				{
1869 				fprintf(stderr,"Don't understand line '%s' from child %d\n",
1870 						buf,n);
1871 				continue;
1872 				}
1873 			printf("Got: %s from %d\n",buf,n);
1874 			if(!strncmp(buf,"+F:",3))
1875 				{
1876 				int alg;
1877 				int j;
1878 
1879 				p=buf+3;
1880 				alg=atoi(sstrsep(&p,sep));
1881 				sstrsep(&p,sep);
1882 				for(j=0 ; j < SIZE_NUM ; ++j)
1883 					results[alg][j]+=atof(sstrsep(&p,sep));
1884 				}
1885 			else if(!strncmp(buf,"+F2:",4))
1886 				{
1887 				int k;
1888 				double d;
1889 
1890 				p=buf+4;
1891 				k=atoi(sstrsep(&p,sep));
1892 				sstrsep(&p,sep);
1893 
1894 				d=atof(sstrsep(&p,sep));
1895 				if(n)
1896 					rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1897 				else
1898 					rsa_results[k][0]=d;
1899 
1900 				d=atof(sstrsep(&p,sep));
1901 				if(n)
1902 					rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1903 				else
1904 					rsa_results[k][1]=d;
1905 				}
1906 			else if(!strncmp(buf,"+F2:",4))
1907 				{
1908 				int k;
1909 				double d;
1910 
1911 				p=buf+4;
1912 				k=atoi(sstrsep(&p,sep));
1913 				sstrsep(&p,sep);
1914 
1915 				d=atof(sstrsep(&p,sep));
1916 				if(n)
1917 					rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1918 				else
1919 					rsa_results[k][0]=d;
1920 
1921 				d=atof(sstrsep(&p,sep));
1922 				if(n)
1923 					rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1924 				else
1925 					rsa_results[k][1]=d;
1926 				}
1927 			else if(!strncmp(buf,"+F3:",4))
1928 				{
1929 				int k;
1930 				double d;
1931 
1932 				p=buf+4;
1933 				k=atoi(sstrsep(&p,sep));
1934 				sstrsep(&p,sep);
1935 
1936 				d=atof(sstrsep(&p,sep));
1937 				if(n)
1938 					dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1939 				else
1940 					dsa_results[k][0]=d;
1941 
1942 				d=atof(sstrsep(&p,sep));
1943 				if(n)
1944 					dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1945 				else
1946 					dsa_results[k][1]=d;
1947 				}
1948 			else if(!strncmp(buf,"+H:",3))
1949 				{
1950 				}
1951 			else
1952 				fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);
1953 			}
1954 		}
1955 	return 1;
1956 	}
1957 #endif
1958 #endif
1959