xref: /freebsd/crypto/openssl/apps/speed.c (revision 41466b50c1d5bfd1cf6adaae547a579a75d7c04e)
1 /* apps/speed.c */
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  * $FreeBSD$
59  */
60 
61 /* most of this code has been pilfered from my libdes speed.c program */
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 NO_STDIO
81 #define APPS_WIN16
82 #endif
83 #include <openssl/crypto.h>
84 #include <openssl/rand.h>
85 #include <openssl/err.h>
86 
87 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
88 # define USE_TOD
89 #elif !defined(MSDOS) && (!defined(VMS) || defined(__DECC))
90 # define TIMES
91 #endif
92 #if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(MPE) && !defined(__NetBSD__)
93 # define TIMEB
94 #endif
95 
96 #ifndef _IRIX
97 # include <time.h>
98 #endif
99 #ifdef TIMES
100 # include <sys/types.h>
101 # include <sys/times.h>
102 #endif
103 #ifdef USE_TOD
104 # include <sys/time.h>
105 # include <sys/resource.h>
106 #endif
107 
108 /* Depending on the VMS version, the tms structure is perhaps defined.
109    The __TMS macro will show if it was.  If it wasn't defined, we should
110    undefine TIMES, since that tells the rest of the program how things
111    should be handled.				-- Richard Levitte */
112 #if defined(VMS) && defined(__DECC) && !defined(__TMS)
113 #undef TIMES
114 #endif
115 
116 #ifdef TIMEB
117 #include <sys/timeb.h>
118 #endif
119 
120 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD)
121 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
122 #endif
123 
124 #if defined(sun) || defined(__ultrix)
125 #define _POSIX_SOURCE
126 #include <limits.h>
127 #include <sys/param.h>
128 #endif
129 
130 #ifndef NO_DES
131 #include <openssl/des.h>
132 #endif
133 #ifndef NO_MD2
134 #include <openssl/md2.h>
135 #endif
136 #ifndef NO_MDC2
137 #include <openssl/mdc2.h>
138 #endif
139 #ifndef NO_MD4
140 #include <openssl/md4.h>
141 #endif
142 #ifndef NO_MD5
143 #include <openssl/md5.h>
144 #endif
145 #ifndef NO_HMAC
146 #include <openssl/hmac.h>
147 #endif
148 #include <openssl/evp.h>
149 #ifndef NO_SHA
150 #include <openssl/sha.h>
151 #endif
152 #ifndef NO_RIPEMD
153 #include <openssl/ripemd.h>
154 #endif
155 #ifndef NO_RC4
156 #include <openssl/rc4.h>
157 #endif
158 #ifndef NO_RC5
159 #include <openssl/rc5.h>
160 #endif
161 #ifndef NO_RC2
162 #include <openssl/rc2.h>
163 #endif
164 #ifndef NO_IDEA
165 #include <openssl/idea.h>
166 #endif
167 #ifndef NO_BF
168 #include <openssl/blowfish.h>
169 #endif
170 #ifndef NO_CAST
171 #include <openssl/cast.h>
172 #endif
173 #ifndef NO_RSA
174 #include <openssl/rsa.h>
175 #include "./testrsa.h"
176 #endif
177 #include <openssl/x509.h>
178 #ifndef NO_DSA
179 #include "./testdsa.h"
180 #endif
181 
182 /* The following if from times(3) man page.  It may need to be changed */
183 #ifndef HZ
184 # ifndef CLK_TCK
185 #  ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
186 #   define HZ	100.0
187 #  else /* _BSD_CLK_TCK_ */
188 #   define HZ ((double)_BSD_CLK_TCK_)
189 #  endif
190 # else /* CLK_TCK */
191 #  define HZ ((double)CLK_TCK)
192 # endif
193 #endif
194 
195 #undef BUFSIZE
196 #define BUFSIZE	((long)1024*8+1)
197 int run=0;
198 
199 static double Time_F(int s, int usertime);
200 static void print_message(char *s,long num,int length);
201 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
202 #ifdef SIGALRM
203 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
204 #define SIGRETTYPE void
205 #else
206 #define SIGRETTYPE int
207 #endif
208 
209 static SIGRETTYPE sig_done(int sig);
210 static SIGRETTYPE sig_done(int sig)
211 	{
212 	signal(SIGALRM,sig_done);
213 	run=0;
214 #ifdef LINT
215 	sig=sig;
216 #endif
217 	}
218 #endif
219 
220 #define START	0
221 #define STOP	1
222 
223 static double Time_F(int s, int usertime)
224 	{
225 	double ret;
226 
227 #ifdef USE_TOD
228 	if(usertime)
229 	    {
230 		static struct rusage tstart,tend;
231 
232 		if (s == START)
233 			{
234 			getrusage(RUSAGE_SELF,&tstart);
235 			return(0);
236 			}
237 		else
238 			{
239 			long i;
240 
241 			getrusage(RUSAGE_SELF,&tend);
242 			i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
243 			ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
244 			  +((double)i)/1000000.0;
245 			return((ret < 0.001)?0.001:ret);
246 			}
247 		}
248 	else
249 		{
250 		static struct timeval tstart,tend;
251 		long i;
252 
253 		if (s == START)
254 			{
255 			gettimeofday(&tstart,NULL);
256 			return(0);
257 			}
258 		else
259 			{
260 			gettimeofday(&tend,NULL);
261 			i=(long)tend.tv_usec-(long)tstart.tv_usec;
262 			ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
263 			return((ret < 0.001)?0.001:ret);
264 			}
265 		}
266 #else  /* ndef USE_TOD */
267 
268 # ifdef TIMES
269 	if (usertime)
270 		{
271 		static struct tms tstart,tend;
272 
273 		if (s == START)
274 			{
275 			times(&tstart);
276 			return(0);
277 			}
278 		else
279 			{
280 			times(&tend);
281 			ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
282 			return((ret < 1e-3)?1e-3:ret);
283 			}
284 		}
285 # endif /* times() */
286 # if defined(TIMES) && defined(TIMEB)
287 	else
288 # endif
289 # ifdef TIMEB
290 		{
291 		static struct timeb tstart,tend;
292 		long i;
293 
294 		if (s == START)
295 			{
296 			ftime(&tstart);
297 			return(0);
298 			}
299 		else
300 			{
301 			ftime(&tend);
302 			i=(long)tend.millitm-(long)tstart.millitm;
303 			ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
304 			return((ret < 0.001)?0.001:ret);
305 			}
306 		}
307 # endif
308 #endif
309 	}
310 
311 int MAIN(int, char **);
312 
313 int MAIN(int argc, char **argv)
314 	{
315 	unsigned char *buf=NULL,*buf2=NULL;
316 	int mret=1;
317 #define ALGOR_NUM	15
318 #define SIZE_NUM	5
319 #define RSA_NUM		4
320 #define DSA_NUM		3
321 	long count,rsa_count;
322 	int i,j,k;
323 	unsigned rsa_num;
324 #ifndef NO_MD2
325 	unsigned char md2[MD2_DIGEST_LENGTH];
326 #endif
327 #ifndef NO_MDC2
328 	unsigned char mdc2[MDC2_DIGEST_LENGTH];
329 #endif
330 #ifndef NO_MD4
331 	unsigned char md4[MD4_DIGEST_LENGTH];
332 #endif
333 #ifndef NO_MD5
334 	unsigned char md5[MD5_DIGEST_LENGTH];
335 	unsigned char hmac[MD5_DIGEST_LENGTH];
336 #endif
337 #ifndef NO_SHA
338 	unsigned char sha[SHA_DIGEST_LENGTH];
339 #endif
340 #ifndef NO_RIPEMD
341 	unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
342 #endif
343 #ifndef NO_RC4
344 	RC4_KEY rc4_ks;
345 #endif
346 #ifndef NO_RC5
347 	RC5_32_KEY rc5_ks;
348 #endif
349 #ifndef NO_RC2
350 	RC2_KEY rc2_ks;
351 #endif
352 #ifndef NO_IDEA
353 	IDEA_KEY_SCHEDULE idea_ks;
354 #endif
355 #ifndef NO_BF
356 	BF_KEY bf_ks;
357 #endif
358 #ifndef NO_CAST
359 	CAST_KEY cast_ks;
360 #endif
361 	static unsigned char key16[16]=
362 		{0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
363 		 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
364 	unsigned char iv[8];
365 #ifndef NO_DES
366 	des_cblock *buf_as_des_cblock = NULL;
367 	static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
368 	static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
369 	static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
370 	des_key_schedule sch,sch2,sch3;
371 #endif
372 #define	D_MD2		0
373 #define	D_MDC2		1
374 #define	D_MD4		2
375 #define	D_MD5		3
376 #define	D_HMAC		4
377 #define	D_SHA1		5
378 #define D_RMD160	6
379 #define	D_RC4		7
380 #define	D_CBC_DES	8
381 #define	D_EDE3_DES	9
382 #define	D_CBC_IDEA	10
383 #define	D_CBC_RC2	11
384 #define	D_CBC_RC5	12
385 #define	D_CBC_BF	13
386 #define	D_CBC_CAST	14
387 	double d,results[ALGOR_NUM][SIZE_NUM];
388 	static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
389 	long c[ALGOR_NUM][SIZE_NUM];
390 	static char *names[ALGOR_NUM]={
391 		"md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
392 		"des cbc","des ede3","idea cbc",
393 		"rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
394 #define	R_DSA_512	0
395 #define	R_DSA_1024	1
396 #define	R_DSA_2048	2
397 #define	R_RSA_512	0
398 #define	R_RSA_1024	1
399 #define	R_RSA_2048	2
400 #define	R_RSA_4096	3
401 #ifndef NO_RSA
402 	RSA *rsa_key[RSA_NUM];
403 	long rsa_c[RSA_NUM][2];
404 	double rsa_results[RSA_NUM][2];
405 	static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
406 	static unsigned char *rsa_data[RSA_NUM]=
407 		{test512,test1024,test2048,test4096};
408 	static int rsa_data_length[RSA_NUM]={
409 		sizeof(test512),sizeof(test1024),
410 		sizeof(test2048),sizeof(test4096)};
411 #endif
412 #ifndef NO_DSA
413 	DSA *dsa_key[DSA_NUM];
414 	long dsa_c[DSA_NUM][2];
415 	double dsa_results[DSA_NUM][2];
416 	static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
417 #endif
418 	int rsa_doit[RSA_NUM];
419 	int dsa_doit[DSA_NUM];
420 	int doit[ALGOR_NUM];
421 	int pr_header=0;
422 	int usertime=1;
423 
424 #ifndef TIMES
425 	usertime=-1;
426 #endif
427 
428 	apps_startup();
429 	memset(results, 0, sizeof(results));
430 #ifndef NO_DSA
431 	memset(dsa_key,0,sizeof(dsa_key));
432 #endif
433 
434 	if (bio_err == NULL)
435 		if ((bio_err=BIO_new(BIO_s_file())) != NULL)
436 			BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
437 
438 #ifndef NO_RSA
439 	memset(rsa_key,0,sizeof(rsa_key));
440 	for (i=0; i<RSA_NUM; i++)
441 		rsa_key[i]=NULL;
442 #endif
443 
444 	if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
445 		{
446 		BIO_printf(bio_err,"out of memory\n");
447 		goto end;
448 		}
449 #ifndef NO_DES
450 	buf_as_des_cblock = (des_cblock *)buf;
451 #endif
452 	if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
453 		{
454 		BIO_printf(bio_err,"out of memory\n");
455 		goto end;
456 		}
457 
458 	memset(c,0,sizeof(c));
459 	memset(iv,0,sizeof(iv));
460 
461 	for (i=0; i<ALGOR_NUM; i++)
462 		doit[i]=0;
463 	for (i=0; i<RSA_NUM; i++)
464 		rsa_doit[i]=0;
465 	for (i=0; i<DSA_NUM; i++)
466 		dsa_doit[i]=0;
467 
468 	j=0;
469 	argc--;
470 	argv++;
471 	while (argc)
472 		{
473 		if	((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
474 			usertime = 0;
475 #ifndef NO_MD2
476 		if	(strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
477 		else
478 #endif
479 #ifndef NO_MDC2
480 			if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
481 		else
482 #endif
483 #ifndef NO_MD4
484 			if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
485 		else
486 #endif
487 #ifndef NO_MD5
488 			if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
489 		else
490 #endif
491 #ifndef NO_MD5
492 			if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
493 		else
494 #endif
495 #ifndef NO_SHA
496 			if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
497 		else
498 			if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
499 		else
500 #endif
501 #ifndef NO_RIPEMD
502 			if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
503 		else
504 			if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
505 		else
506 			if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
507 		else
508 #endif
509 #ifndef NO_RC4
510 			if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
511 		else
512 #endif
513 #ifndef NO_DES
514 			if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
515 		else	if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
516 		else
517 #endif
518 #ifndef NO_RSA
519 #ifdef RSAref
520 			if (strcmp(*argv,"rsaref") == 0)
521 			{
522 			RSA_set_default_method(RSA_PKCS1_RSAref());
523 			j--;
524 			}
525 		else
526 #endif
527 #ifndef RSA_NULL
528 			if (strcmp(*argv,"openssl") == 0)
529 			{
530 			RSA_set_default_method(RSA_PKCS1_SSLeay());
531 			j--;
532 			}
533 		else
534 #endif
535 #endif /* !NO_RSA */
536 		     if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
537 		else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
538 		else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
539 		else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
540 		else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
541 		else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
542 		else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
543 		else
544 #ifndef NO_RC2
545 		     if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
546 		else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
547 		else
548 #endif
549 #ifndef NO_RC5
550 		     if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
551 		else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
552 		else
553 #endif
554 #ifndef NO_IDEA
555 		     if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
556 		else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
557 		else
558 #endif
559 #ifndef NO_BF
560 		     if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
561 		else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
562 		else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
563 		else
564 #endif
565 #ifndef NO_CAST
566 		     if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
567 		else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
568 		else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
569 		else
570 #endif
571 #ifndef NO_DES
572 			if (strcmp(*argv,"des") == 0)
573 			{
574 			doit[D_CBC_DES]=1;
575 			doit[D_EDE3_DES]=1;
576 			}
577 		else
578 #endif
579 #ifndef NO_RSA
580 			if (strcmp(*argv,"rsa") == 0)
581 			{
582 			rsa_doit[R_RSA_512]=1;
583 			rsa_doit[R_RSA_1024]=1;
584 			rsa_doit[R_RSA_2048]=1;
585 			rsa_doit[R_RSA_4096]=1;
586 			}
587 		else
588 #endif
589 #ifndef NO_DSA
590 			if (strcmp(*argv,"dsa") == 0)
591 			{
592 			dsa_doit[R_DSA_512]=1;
593 			dsa_doit[R_DSA_1024]=1;
594 			}
595 		else
596 #endif
597 			{
598 			BIO_printf(bio_err,"Error: bad option or value\n");
599 			BIO_printf(bio_err,"\n");
600 			BIO_printf(bio_err,"Available values:\n");
601 #ifndef NO_MD2
602 			BIO_printf(bio_err,"md2      ");
603 #endif
604 #ifndef NO_MDC2
605 			BIO_printf(bio_err,"mdc2     ");
606 #endif
607 #ifndef NO_MD4
608 			BIO_printf(bio_err,"md4      ");
609 #endif
610 #ifndef NO_MD5
611 			BIO_printf(bio_err,"md5      ");
612 #ifndef NO_HMAC
613 			BIO_printf(bio_err,"hmac     ");
614 #endif
615 #endif
616 #ifndef NO_SHA1
617 			BIO_printf(bio_err,"sha1     ");
618 #endif
619 #ifndef NO_RIPEMD160
620 			BIO_printf(bio_err,"rmd160");
621 #endif
622 #if !defined(NO_MD2) || !defined(NO_MDC2) || !defined(NO_MD4) || !defined(NO_MD5) || !defined(NO_SHA1) || !defined(NO_RIPEMD160)
623 			BIO_printf(bio_err,"\n");
624 #endif
625 
626 #ifndef NO_IDEA
627 			BIO_printf(bio_err,"idea-cbc ");
628 #endif
629 #ifndef NO_RC2
630 			BIO_printf(bio_err,"rc2-cbc  ");
631 #endif
632 #ifndef NO_RC5
633 			BIO_printf(bio_err,"rc5-cbc  ");
634 #endif
635 #ifndef NO_BF
636 			BIO_printf(bio_err,"bf-cbc");
637 #endif
638 #if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_BF) || !defined(NO_RC5)
639 			BIO_printf(bio_err,"\n");
640 #endif
641 
642 			BIO_printf(bio_err,"des-cbc  des-ede3 ");
643 #ifndef NO_RC4
644 			BIO_printf(bio_err,"rc4");
645 #endif
646 			BIO_printf(bio_err,"\n");
647 
648 #ifndef NO_RSA
649 			BIO_printf(bio_err,"rsa512   rsa1024  rsa2048  rsa4096\n");
650 #endif
651 
652 #ifndef NO_DSA
653 			BIO_printf(bio_err,"dsa512   dsa1024  dsa2048\n");
654 #endif
655 
656 #ifndef NO_IDEA
657 			BIO_printf(bio_err,"idea     ");
658 #endif
659 #ifndef NO_RC2
660 			BIO_printf(bio_err,"rc2      ");
661 #endif
662 #ifndef NO_DES
663 			BIO_printf(bio_err,"des      ");
664 #endif
665 #ifndef NO_RSA
666 			BIO_printf(bio_err,"rsa      ");
667 #endif
668 #ifndef NO_BF
669 			BIO_printf(bio_err,"blowfish");
670 #endif
671 #if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_DES) || !defined(NO_RSA) || !defined(NO_BF)
672 			BIO_printf(bio_err,"\n");
673 #endif
674 
675 #ifdef TIMES
676 			BIO_printf(bio_err,"\n");
677 			BIO_printf(bio_err,"Available options:\n");
678 			BIO_printf(bio_err,"-elapsed        measure time in real time instead of CPU user time.\n");
679 #endif
680 			goto end;
681 			}
682 		argc--;
683 		argv++;
684 		j++;
685 		}
686 
687 	if (j == 0)
688 		{
689 		for (i=0; i<ALGOR_NUM; i++)
690 			doit[i]=1;
691 		for (i=0; i<RSA_NUM; i++)
692 			rsa_doit[i]=1;
693 		for (i=0; i<DSA_NUM; i++)
694 			dsa_doit[i]=1;
695 		}
696 	for (i=0; i<ALGOR_NUM; i++)
697 		if (doit[i]) pr_header++;
698 
699 	if (usertime == 0)
700 		BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
701 	if (usertime <= 0)
702 		{
703 		BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
704 		BIO_printf(bio_err,"program when this computer is idle.\n");
705 		}
706 
707 #ifndef NO_RSA
708 	for (i=0; i<RSA_NUM; i++)
709 		{
710 		unsigned char *p;
711 
712 		p=rsa_data[i];
713 		rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
714 		if (rsa_key[i] == NULL)
715 			{
716 			BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
717 			goto end;
718 			}
719 #if 0
720 		else
721 			{
722 			BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
723 			BN_print(bio_err,rsa_key[i]->e);
724 			BIO_printf(bio_err,"\n");
725 			}
726 #endif
727 		}
728 #endif
729 
730 #ifndef NO_DSA
731 	dsa_key[0]=get_dsa512();
732 	dsa_key[1]=get_dsa1024();
733 	dsa_key[2]=get_dsa2048();
734 #endif
735 
736 #ifndef NO_DES
737 	des_set_key_unchecked(&key,sch);
738 	des_set_key_unchecked(&key2,sch2);
739 	des_set_key_unchecked(&key3,sch3);
740 #endif
741 #ifndef NO_IDEA
742 	idea_set_encrypt_key(key16,&idea_ks);
743 #endif
744 #ifndef NO_RC4
745 	RC4_set_key(&rc4_ks,16,key16);
746 #endif
747 #ifndef NO_RC2
748 	RC2_set_key(&rc2_ks,16,key16,128);
749 #endif
750 #ifndef NO_RC5
751 	RC5_32_set_key(&rc5_ks,16,key16,12);
752 #endif
753 #ifndef NO_BF
754 	BF_set_key(&bf_ks,16,key16);
755 #endif
756 #ifndef NO_CAST
757 	CAST_set_key(&cast_ks,16,key16);
758 #endif
759 #ifndef NO_RSA
760 	memset(rsa_c,0,sizeof(rsa_c));
761 #endif
762 #ifndef SIGALRM
763 #ifndef NO_DES
764 	BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
765 	count=10;
766 	do	{
767 		long i;
768 		count*=2;
769 		Time_F(START,usertime);
770 		for (i=count; i; i--)
771 			des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
772 				&(sch[0]),DES_ENCRYPT);
773 		d=Time_F(STOP,usertime);
774 		} while (d <3);
775 	c[D_MD2][0]=count/10;
776 	c[D_MDC2][0]=count/10;
777 	c[D_MD4][0]=count;
778 	c[D_MD5][0]=count;
779 	c[D_HMAC][0]=count;
780 	c[D_SHA1][0]=count;
781 	c[D_RMD160][0]=count;
782 	c[D_RC4][0]=count*5;
783 	c[D_CBC_DES][0]=count;
784 	c[D_EDE3_DES][0]=count/3;
785 	c[D_CBC_IDEA][0]=count;
786 	c[D_CBC_RC2][0]=count;
787 	c[D_CBC_RC5][0]=count;
788 	c[D_CBC_BF][0]=count;
789 	c[D_CBC_CAST][0]=count;
790 
791 	for (i=1; i<SIZE_NUM; i++)
792 		{
793 		c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
794 		c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
795 		c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
796 		c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
797 		c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
798 		c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
799 		c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
800 		}
801 	for (i=1; i<SIZE_NUM; i++)
802 		{
803 		long l0,l1;
804 
805 		l0=(long)lengths[i-1];
806 		l1=(long)lengths[i];
807 		c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
808 		c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
809 		c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
810 		c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
811 		c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
812 		c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
813 		c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
814 		c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
815 		}
816 #ifndef NO_RSA
817 	rsa_c[R_RSA_512][0]=count/2000;
818 	rsa_c[R_RSA_512][1]=count/400;
819 	for (i=1; i<RSA_NUM; i++)
820 		{
821 		rsa_c[i][0]=rsa_c[i-1][0]/8;
822 		rsa_c[i][1]=rsa_c[i-1][1]/4;
823 		if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
824 			rsa_doit[i]=0;
825 		else
826 			{
827 			if (rsa_c[i][0] == 0)
828 				{
829 				rsa_c[i][0]=1;
830 				rsa_c[i][1]=20;
831 				}
832 			}
833 		}
834 #endif
835 
836 #ifndef NO_DSA
837 	dsa_c[R_DSA_512][0]=count/1000;
838 	dsa_c[R_DSA_512][1]=count/1000/2;
839 	for (i=1; i<DSA_NUM; i++)
840 		{
841 		dsa_c[i][0]=dsa_c[i-1][0]/4;
842 		dsa_c[i][1]=dsa_c[i-1][1]/4;
843 		if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
844 			dsa_doit[i]=0;
845 		else
846 			{
847 			if (dsa_c[i] == 0)
848 				{
849 				dsa_c[i][0]=1;
850 				dsa_c[i][1]=1;
851 				}
852 			}
853 		}
854 #endif
855 
856 #define COND(d)	(count < (d))
857 #define COUNT(d) (d)
858 #else
859 /* not worth fixing */
860 # error "You cannot disable DES on systems without SIGALRM."
861 #endif /* NO_DES */
862 #else
863 #define COND(c)	(run)
864 #define COUNT(d) (count)
865 	signal(SIGALRM,sig_done);
866 #endif /* SIGALRM */
867 
868 #ifndef NO_MD2
869 	if (doit[D_MD2])
870 		{
871 		for (j=0; j<SIZE_NUM; j++)
872 			{
873 			print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
874 			Time_F(START,usertime);
875 			for (count=0,run=1; COND(c[D_MD2][j]); count++)
876 				MD2(buf,(unsigned long)lengths[j],&(md2[0]));
877 			d=Time_F(STOP,usertime);
878 			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
879 				count,names[D_MD2],d);
880 			results[D_MD2][j]=((double)count)/d*lengths[j];
881 			}
882 		}
883 #endif
884 #ifndef NO_MDC2
885 	if (doit[D_MDC2])
886 		{
887 		for (j=0; j<SIZE_NUM; j++)
888 			{
889 			print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
890 			Time_F(START,usertime);
891 			for (count=0,run=1; COND(c[D_MDC2][j]); count++)
892 				MDC2(buf,(unsigned long)lengths[j],&(mdc2[0]));
893 			d=Time_F(STOP,usertime);
894 			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
895 				count,names[D_MDC2],d);
896 			results[D_MDC2][j]=((double)count)/d*lengths[j];
897 			}
898 		}
899 #endif
900 
901 #ifndef NO_MD4
902 	if (doit[D_MD4])
903 		{
904 		for (j=0; j<SIZE_NUM; j++)
905 			{
906 			print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
907 			Time_F(START,usertime);
908 			for (count=0,run=1; COND(c[D_MD4][j]); count++)
909 				MD4(&(buf[0]),(unsigned long)lengths[j],&(md4[0]));
910 			d=Time_F(STOP,usertime);
911 			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
912 				count,names[D_MD4],d);
913 			results[D_MD4][j]=((double)count)/d*lengths[j];
914 			}
915 		}
916 #endif
917 
918 #ifndef NO_MD5
919 	if (doit[D_MD5])
920 		{
921 		for (j=0; j<SIZE_NUM; j++)
922 			{
923 			print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
924 			Time_F(START,usertime);
925 			for (count=0,run=1; COND(c[D_MD5][j]); count++)
926 				MD5(&(buf[0]),(unsigned long)lengths[j],&(md5[0]));
927 			d=Time_F(STOP,usertime);
928 			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
929 				count,names[D_MD5],d);
930 			results[D_MD5][j]=((double)count)/d*lengths[j];
931 			}
932 		}
933 #endif
934 
935 #if !defined(NO_MD5) && !defined(NO_HMAC)
936 	if (doit[D_HMAC])
937 		{
938 		HMAC_CTX hctx;
939 		HMAC_Init(&hctx,(unsigned char *)"This is a key...",
940 			16,EVP_md5());
941 
942 		for (j=0; j<SIZE_NUM; j++)
943 			{
944 			print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
945 			Time_F(START,usertime);
946 			for (count=0,run=1; COND(c[D_HMAC][j]); count++)
947 				{
948 				HMAC_Init(&hctx,NULL,0,NULL);
949                                 HMAC_Update(&hctx,buf,lengths[j]);
950                                 HMAC_Final(&hctx,&(hmac[0]),NULL);
951 				}
952 			d=Time_F(STOP,usertime);
953 			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
954 				count,names[D_HMAC],d);
955 			results[D_HMAC][j]=((double)count)/d*lengths[j];
956 			}
957 		}
958 #endif
959 #ifndef NO_SHA
960 	if (doit[D_SHA1])
961 		{
962 		for (j=0; j<SIZE_NUM; j++)
963 			{
964 			print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
965 			Time_F(START,usertime);
966 			for (count=0,run=1; COND(c[D_SHA1][j]); count++)
967 				SHA1(buf,(unsigned long)lengths[j],&(sha[0]));
968 			d=Time_F(STOP,usertime);
969 			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
970 				count,names[D_SHA1],d);
971 			results[D_SHA1][j]=((double)count)/d*lengths[j];
972 			}
973 		}
974 #endif
975 #ifndef NO_RIPEMD
976 	if (doit[D_RMD160])
977 		{
978 		for (j=0; j<SIZE_NUM; j++)
979 			{
980 			print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
981 			Time_F(START,usertime);
982 			for (count=0,run=1; COND(c[D_RMD160][j]); count++)
983 				RIPEMD160(buf,(unsigned long)lengths[j],&(rmd160[0]));
984 			d=Time_F(STOP,usertime);
985 			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
986 				count,names[D_RMD160],d);
987 			results[D_RMD160][j]=((double)count)/d*lengths[j];
988 			}
989 		}
990 #endif
991 #ifndef NO_RC4
992 	if (doit[D_RC4])
993 		{
994 		for (j=0; j<SIZE_NUM; j++)
995 			{
996 			print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
997 			Time_F(START,usertime);
998 			for (count=0,run=1; COND(c[D_RC4][j]); count++)
999 				RC4(&rc4_ks,(unsigned int)lengths[j],
1000 					buf,buf);
1001 			d=Time_F(STOP,usertime);
1002 			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1003 				count,names[D_RC4],d);
1004 			results[D_RC4][j]=((double)count)/d*lengths[j];
1005 			}
1006 		}
1007 #endif
1008 #ifndef NO_DES
1009 	if (doit[D_CBC_DES])
1010 		{
1011 		for (j=0; j<SIZE_NUM; j++)
1012 			{
1013 			print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1014 			Time_F(START,usertime);
1015 			for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1016 				des_ncbc_encrypt(buf,buf,lengths[j],sch,
1017 						 &iv,DES_ENCRYPT);
1018 			d=Time_F(STOP,usertime);
1019 			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1020 				count,names[D_CBC_DES],d);
1021 			results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1022 			}
1023 		}
1024 
1025 	if (doit[D_EDE3_DES])
1026 		{
1027 		for (j=0; j<SIZE_NUM; j++)
1028 			{
1029 			print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1030 			Time_F(START,usertime);
1031 			for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1032 				des_ede3_cbc_encrypt(buf,buf,lengths[j],
1033 						     sch,sch2,sch3,
1034 						     &iv,DES_ENCRYPT);
1035 			d=Time_F(STOP,usertime);
1036 			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1037 				count,names[D_EDE3_DES],d);
1038 			results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1039 			}
1040 		}
1041 #endif
1042 #ifndef NO_IDEA
1043 	if (doit[D_CBC_IDEA])
1044 		{
1045 		for (j=0; j<SIZE_NUM; j++)
1046 			{
1047 			print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1048 			Time_F(START,usertime);
1049 			for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1050 				idea_cbc_encrypt(buf,buf,
1051 					(unsigned long)lengths[j],&idea_ks,
1052 					iv,IDEA_ENCRYPT);
1053 			d=Time_F(STOP,usertime);
1054 			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1055 				count,names[D_CBC_IDEA],d);
1056 			results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1057 			}
1058 		}
1059 #endif
1060 #ifndef NO_RC2
1061 	if (doit[D_CBC_RC2])
1062 		{
1063 		for (j=0; j<SIZE_NUM; j++)
1064 			{
1065 			print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1066 			Time_F(START,usertime);
1067 			for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1068 				RC2_cbc_encrypt(buf,buf,
1069 					(unsigned long)lengths[j],&rc2_ks,
1070 					iv,RC2_ENCRYPT);
1071 			d=Time_F(STOP,usertime);
1072 			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1073 				count,names[D_CBC_RC2],d);
1074 			results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1075 			}
1076 		}
1077 #endif
1078 #ifndef NO_RC5
1079 	if (doit[D_CBC_RC5])
1080 		{
1081 		for (j=0; j<SIZE_NUM; j++)
1082 			{
1083 			print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1084 			Time_F(START,usertime);
1085 			for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1086 				RC5_32_cbc_encrypt(buf,buf,
1087 					(unsigned long)lengths[j],&rc5_ks,
1088 					iv,RC5_ENCRYPT);
1089 			d=Time_F(STOP,usertime);
1090 			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1091 				count,names[D_CBC_RC5],d);
1092 			results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1093 			}
1094 		}
1095 #endif
1096 #ifndef NO_BF
1097 	if (doit[D_CBC_BF])
1098 		{
1099 		for (j=0; j<SIZE_NUM; j++)
1100 			{
1101 			print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1102 			Time_F(START,usertime);
1103 			for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1104 				BF_cbc_encrypt(buf,buf,
1105 					(unsigned long)lengths[j],&bf_ks,
1106 					iv,BF_ENCRYPT);
1107 			d=Time_F(STOP,usertime);
1108 			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1109 				count,names[D_CBC_BF],d);
1110 			results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1111 			}
1112 		}
1113 #endif
1114 #ifndef NO_CAST
1115 	if (doit[D_CBC_CAST])
1116 		{
1117 		for (j=0; j<SIZE_NUM; j++)
1118 			{
1119 			print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1120 			Time_F(START,usertime);
1121 			for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1122 				CAST_cbc_encrypt(buf,buf,
1123 					(unsigned long)lengths[j],&cast_ks,
1124 					iv,CAST_ENCRYPT);
1125 			d=Time_F(STOP,usertime);
1126 			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1127 				count,names[D_CBC_CAST],d);
1128 			results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1129 			}
1130 		}
1131 #endif
1132 
1133 	RAND_pseudo_bytes(buf,36);
1134 #ifndef NO_RSA
1135 	for (j=0; j<RSA_NUM; j++)
1136 		{
1137 		int ret;
1138 		if (!rsa_doit[j]) continue;
1139 		ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1140 		if (ret == 0)
1141 			{
1142 			BIO_printf(bio_err,"RSA sign failure.  No RSA sign will be done.\n");
1143 			ERR_print_errors(bio_err);
1144 			rsa_count=1;
1145 			}
1146 		else
1147 			{
1148 			pkey_print_message("private","rsa",
1149 				rsa_c[j][0],rsa_bits[j],
1150 				RSA_SECONDS);
1151 /*			RSA_blinding_on(rsa_key[j],NULL); */
1152 			Time_F(START,usertime);
1153 			for (count=0,run=1; COND(rsa_c[j][0]); count++)
1154 				{
1155 				ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1156 					&rsa_num, rsa_key[j]);
1157 				if (ret == 0)
1158 					{
1159 					BIO_printf(bio_err,
1160 						"RSA sign failure\n");
1161 					ERR_print_errors(bio_err);
1162 					count=1;
1163 					break;
1164 					}
1165 				}
1166 			d=Time_F(STOP,usertime);
1167 			BIO_printf(bio_err,
1168 				"%ld %d bit private RSA's in %.2fs\n",
1169 				count,rsa_bits[j],d);
1170 			rsa_results[j][0]=d/(double)count;
1171 			rsa_count=count;
1172 			}
1173 
1174 #if 1
1175 		ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1176 		if (ret <= 0)
1177 			{
1178 			BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
1179 			ERR_print_errors(bio_err);
1180 			rsa_doit[j] = 0;
1181 			}
1182 		else
1183 			{
1184 			pkey_print_message("public","rsa",
1185 				rsa_c[j][1],rsa_bits[j],
1186 				RSA_SECONDS);
1187 			Time_F(START,usertime);
1188 			for (count=0,run=1; COND(rsa_c[j][1]); count++)
1189 				{
1190 				ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1191 					rsa_num, rsa_key[j]);
1192 				if (ret == 0)
1193 					{
1194 					BIO_printf(bio_err,
1195 						"RSA verify failure\n");
1196 					ERR_print_errors(bio_err);
1197 					count=1;
1198 					break;
1199 					}
1200 				}
1201 			d=Time_F(STOP,usertime);
1202 			BIO_printf(bio_err,
1203 				"%ld %d bit public RSA's in %.2fs\n",
1204 				count,rsa_bits[j],d);
1205 			rsa_results[j][1]=d/(double)count;
1206 			}
1207 #endif
1208 
1209 		if (rsa_count <= 1)
1210 			{
1211 			/* if longer than 10s, don't do any more */
1212 			for (j++; j<RSA_NUM; j++)
1213 				rsa_doit[j]=0;
1214 			}
1215 		}
1216 #endif
1217 
1218 	RAND_pseudo_bytes(buf,20);
1219 #ifndef NO_DSA
1220 	if (RAND_status() != 1)
1221 		{
1222 		RAND_seed(rnd_seed, sizeof rnd_seed);
1223 		rnd_fake = 1;
1224 		}
1225 	for (j=0; j<DSA_NUM; j++)
1226 		{
1227 		unsigned int kk;
1228 		int ret;
1229 
1230 		if (!dsa_doit[j]) continue;
1231 		DSA_generate_key(dsa_key[j]);
1232 /*		DSA_sign_setup(dsa_key[j],NULL); */
1233 		ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1234 			&kk,dsa_key[j]);
1235 		if (ret == 0)
1236 			{
1237 			BIO_printf(bio_err,"DSA sign failure.  No DSA sign will be done.\n");
1238 			ERR_print_errors(bio_err);
1239 			rsa_count=1;
1240 			}
1241 		else
1242 			{
1243 			pkey_print_message("sign","dsa",
1244 				dsa_c[j][0],dsa_bits[j],
1245 				DSA_SECONDS);
1246 			Time_F(START,usertime);
1247 			for (count=0,run=1; COND(dsa_c[j][0]); count++)
1248 				{
1249 				ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1250 					&kk,dsa_key[j]);
1251 				if (ret == 0)
1252 					{
1253 					BIO_printf(bio_err,
1254 						"DSA sign failure\n");
1255 					ERR_print_errors(bio_err);
1256 					count=1;
1257 					break;
1258 					}
1259 				}
1260 			d=Time_F(STOP,usertime);
1261 			BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1262 				count,dsa_bits[j],d);
1263 			dsa_results[j][0]=d/(double)count;
1264 			rsa_count=count;
1265 			}
1266 
1267 		ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1268 			kk,dsa_key[j]);
1269 		if (ret <= 0)
1270 			{
1271 			BIO_printf(bio_err,"DSA verify failure.  No DSA verify will be done.\n");
1272 			ERR_print_errors(bio_err);
1273 			dsa_doit[j] = 0;
1274 			}
1275 		else
1276 			{
1277 			pkey_print_message("verify","dsa",
1278 				dsa_c[j][1],dsa_bits[j],
1279 				DSA_SECONDS);
1280 			Time_F(START,usertime);
1281 			for (count=0,run=1; COND(dsa_c[j][1]); count++)
1282 				{
1283 				ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1284 					kk,dsa_key[j]);
1285 				if (ret <= 0)
1286 					{
1287 					BIO_printf(bio_err,
1288 						"DSA verify failure\n");
1289 					ERR_print_errors(bio_err);
1290 					count=1;
1291 					break;
1292 					}
1293 				}
1294 			d=Time_F(STOP,usertime);
1295 			BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1296 				count,dsa_bits[j],d);
1297 			dsa_results[j][1]=d/(double)count;
1298 			}
1299 
1300 		if (rsa_count <= 1)
1301 			{
1302 			/* if longer than 10s, don't do any more */
1303 			for (j++; j<DSA_NUM; j++)
1304 				dsa_doit[j]=0;
1305 			}
1306 		}
1307 	if (rnd_fake) RAND_cleanup();
1308 #endif
1309 
1310 	fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1311         fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1312 	printf("options:");
1313 	printf("%s ",BN_options());
1314 #ifndef NO_MD2
1315 	printf("%s ",MD2_options());
1316 #endif
1317 #ifndef NO_RC4
1318 	printf("%s ",RC4_options());
1319 #endif
1320 #ifndef NO_DES
1321 	printf("%s ",des_options());
1322 #endif
1323 #ifndef NO_IDEA
1324 	printf("%s ",idea_options());
1325 #endif
1326 #ifndef NO_BF
1327 	printf("%s ",BF_options());
1328 #endif
1329 	fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1330 
1331 	if (pr_header)
1332 		{
1333 		fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1334 		fprintf(stdout,"type        ");
1335 		for (j=0;  j<SIZE_NUM; j++)
1336 			fprintf(stdout,"%7d bytes",lengths[j]);
1337 		fprintf(stdout,"\n");
1338 		}
1339 
1340 	for (k=0; k<ALGOR_NUM; k++)
1341 		{
1342 		if (!doit[k]) continue;
1343 		fprintf(stdout,"%-13s",names[k]);
1344 		for (j=0; j<SIZE_NUM; j++)
1345 			{
1346 			if (results[k][j] > 10000)
1347 				fprintf(stdout," %11.2fk",results[k][j]/1e3);
1348 			else
1349 				fprintf(stdout," %11.2f ",results[k][j]);
1350 			}
1351 		fprintf(stdout,"\n");
1352 		}
1353 #ifndef NO_RSA
1354 	j=1;
1355 	for (k=0; k<RSA_NUM; k++)
1356 		{
1357 		if (!rsa_doit[k]) continue;
1358 		if (j)
1359 			{
1360 			printf("%18ssign    verify    sign/s verify/s\n"," ");
1361 			j=0;
1362 			}
1363 		fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1364 			rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1365 			1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1366 		fprintf(stdout,"\n");
1367 		}
1368 #endif
1369 #ifndef NO_DSA
1370 	j=1;
1371 	for (k=0; k<DSA_NUM; k++)
1372 		{
1373 		if (!dsa_doit[k]) continue;
1374 		if (j)	{
1375 			printf("%18ssign    verify    sign/s verify/s\n"," ");
1376 			j=0;
1377 			}
1378 		fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1379 			dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1380 			1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1381 		fprintf(stdout,"\n");
1382 		}
1383 #endif
1384 	mret=0;
1385 end:
1386 	if (buf != NULL) OPENSSL_free(buf);
1387 	if (buf2 != NULL) OPENSSL_free(buf2);
1388 #ifndef NO_RSA
1389 	for (i=0; i<RSA_NUM; i++)
1390 		if (rsa_key[i] != NULL)
1391 			RSA_free(rsa_key[i]);
1392 #endif
1393 #ifndef NO_DSA
1394 	for (i=0; i<DSA_NUM; i++)
1395 		if (dsa_key[i] != NULL)
1396 			DSA_free(dsa_key[i]);
1397 #endif
1398 	EXIT(mret);
1399 	}
1400 
1401 static void print_message(char *s, long num, int length)
1402 	{
1403 #ifdef SIGALRM
1404 	BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1405 	(void)BIO_flush(bio_err);
1406 	alarm(SECONDS);
1407 #else
1408 	BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
1409 	(void)BIO_flush(bio_err);
1410 #endif
1411 #ifdef LINT
1412 	num=num;
1413 #endif
1414 	}
1415 
1416 static void pkey_print_message(char *str, char *str2, long num, int bits,
1417 	     int tm)
1418 	{
1419 #ifdef SIGALRM
1420 	BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1421 	(void)BIO_flush(bio_err);
1422 	alarm(RSA_SECONDS);
1423 #else
1424 	BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1425 	(void)BIO_flush(bio_err);
1426 #endif
1427 #ifdef LINT
1428 	num=num;
1429 #endif
1430 	}
1431 
1432