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