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