1110007Smarkm/* apps/speed.c -*- mode:C; c-file-style: "eay" -*- */
255714Skris/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
355714Skris * All rights reserved.
455714Skris *
555714Skris * This package is an SSL implementation written
655714Skris * by Eric Young (eay@cryptsoft.com).
755714Skris * The implementation was written so as to conform with Netscapes SSL.
855714Skris *
955714Skris * This library is free for commercial and non-commercial use as long as
1055714Skris * the following conditions are aheared to.  The following conditions
1155714Skris * apply to all code found in this distribution, be it the RC4, RSA,
1255714Skris * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
1355714Skris * included with this distribution is covered by the same copyright terms
1455714Skris * except that the holder is Tim Hudson (tjh@cryptsoft.com).
1555714Skris *
1655714Skris * Copyright remains Eric Young's, and as such any Copyright notices in
1755714Skris * the code are not to be removed.
1855714Skris * If this package is used in a product, Eric Young should be given attribution
1955714Skris * as the author of the parts of the library used.
2055714Skris * This can be in the form of a textual message at program startup or
2155714Skris * in documentation (online or textual) provided with the package.
2255714Skris *
2355714Skris * Redistribution and use in source and binary forms, with or without
2455714Skris * modification, are permitted provided that the following conditions
2555714Skris * are met:
2655714Skris * 1. Redistributions of source code must retain the copyright
2755714Skris *    notice, this list of conditions and the following disclaimer.
2855714Skris * 2. Redistributions in binary form must reproduce the above copyright
2955714Skris *    notice, this list of conditions and the following disclaimer in the
3055714Skris *    documentation and/or other materials provided with the distribution.
3155714Skris * 3. All advertising materials mentioning features or use of this software
3255714Skris *    must display the following acknowledgement:
3355714Skris *    "This product includes cryptographic software written by
3455714Skris *     Eric Young (eay@cryptsoft.com)"
3555714Skris *    The word 'cryptographic' can be left out if the rouines from the library
3655714Skris *    being used are not cryptographic related :-).
3755714Skris * 4. If you include any Windows specific code (or a derivative thereof) from
3855714Skris *    the apps directory (application code) you must include an acknowledgement:
3955714Skris *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
4055714Skris *
4155714Skris * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
4255714Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4355714Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4455714Skris * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4555714Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4655714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4755714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4855714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4955714Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
5055714Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5155714Skris * SUCH DAMAGE.
5255714Skris *
5355714Skris * The licence and distribution terms for any publically available version or
5455714Skris * derivative of this code cannot be changed.  i.e. this code cannot simply be
5555714Skris * copied and put under another distribution licence
5655714Skris * [including the GNU Public Licence.]
5755714Skris */
58160817Ssimon/* ====================================================================
59160817Ssimon * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
60160817Ssimon *
61160817Ssimon * Portions of the attached software ("Contribution") are developed by
62160817Ssimon * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
63160817Ssimon *
64160817Ssimon * The Contribution is licensed pursuant to the OpenSSL open source
65160817Ssimon * license provided above.
66160817Ssimon *
67160817Ssimon * The ECDH and ECDSA speed test software is originally written by
68160817Ssimon * Sumit Gupta of Sun Microsystems Laboratories.
69160817Ssimon *
70160817Ssimon */
7155714Skris
7255714Skris/* most of this code has been pilfered from my libdes speed.c program */
7355714Skris
74111150Snectar#ifndef OPENSSL_NO_SPEED
75111150Snectar
7655714Skris#undef SECONDS
7755714Skris#define SECONDS		3
7855714Skris#define RSA_SECONDS	10
7955714Skris#define DSA_SECONDS	10
80160817Ssimon#define ECDSA_SECONDS   10
81160817Ssimon#define ECDH_SECONDS    10
8255714Skris
8355714Skris/* 11-Sep-92 Andrew Daviel   Support for Silicon Graphics IRIX added */
8455714Skris/* 06-Apr-92 Luke Brennan    Support for VMS and add extra signal calls */
8555714Skris
8655714Skris#undef PROG
8755714Skris#define PROG speed_main
8855714Skris
8955714Skris#include <stdio.h>
9055714Skris#include <stdlib.h>
91160817Ssimon
9255714Skris#include <string.h>
9355714Skris#include <math.h>
9455714Skris#include "apps.h"
95110007Smarkm#ifdef OPENSSL_NO_STDIO
9655714Skris#define APPS_WIN16
9755714Skris#endif
9855714Skris#include <openssl/crypto.h>
9955714Skris#include <openssl/rand.h>
10055714Skris#include <openssl/err.h>
101110007Smarkm#include <openssl/evp.h>
102110007Smarkm#include <openssl/objects.h>
103110007Smarkm#if !defined(OPENSSL_SYS_MSDOS)
104110007Smarkm#include OPENSSL_UNISTD
105110007Smarkm#endif
10655714Skris
107160817Ssimon#ifndef OPENSSL_SYS_NETWARE
108160817Ssimon#include <signal.h>
109160817Ssimon#endif
110160817Ssimon
111238405Sjkim#if defined(_WIN32) || defined(__CYGWIN__)
112238405Sjkim#include <windows.h>
113238405Sjkim# if defined(__CYGWIN__) && !defined(_WIN32)
114238405Sjkim  /* <windows.h> should define _WIN32, which normally is mutually
115238405Sjkim   * exclusive with __CYGWIN__, but if it didn't... */
116238405Sjkim#  define _WIN32
117238405Sjkim  /* this is done because Cygwin alarm() fails sometimes. */
118238405Sjkim# endif
11955714Skris#endif
12055714Skris
121160817Ssimon#include <openssl/bn.h>
122110007Smarkm#ifndef OPENSSL_NO_DES
12355714Skris#include <openssl/des.h>
12455714Skris#endif
125110007Smarkm#ifndef OPENSSL_NO_AES
126110007Smarkm#include <openssl/aes.h>
127110007Smarkm#endif
128162914Ssimon#ifndef OPENSSL_NO_CAMELLIA
129162914Ssimon#include <openssl/camellia.h>
130162914Ssimon#endif
131110007Smarkm#ifndef OPENSSL_NO_MD2
13255714Skris#include <openssl/md2.h>
13355714Skris#endif
134110007Smarkm#ifndef OPENSSL_NO_MDC2
13555714Skris#include <openssl/mdc2.h>
13655714Skris#endif
137110007Smarkm#ifndef OPENSSL_NO_MD4
13868654Skris#include <openssl/md4.h>
13968654Skris#endif
140110007Smarkm#ifndef OPENSSL_NO_MD5
14155714Skris#include <openssl/md5.h>
14255714Skris#endif
143110007Smarkm#ifndef OPENSSL_NO_HMAC
14455714Skris#include <openssl/hmac.h>
14555714Skris#endif
14655714Skris#include <openssl/evp.h>
147110007Smarkm#ifndef OPENSSL_NO_SHA
14855714Skris#include <openssl/sha.h>
14955714Skris#endif
150110007Smarkm#ifndef OPENSSL_NO_RIPEMD
15155714Skris#include <openssl/ripemd.h>
15255714Skris#endif
153238405Sjkim#ifndef OPENSSL_NO_WHIRLPOOL
154238405Sjkim#include <openssl/whrlpool.h>
155238405Sjkim#endif
156110007Smarkm#ifndef OPENSSL_NO_RC4
15755714Skris#include <openssl/rc4.h>
15855714Skris#endif
159110007Smarkm#ifndef OPENSSL_NO_RC5
16055714Skris#include <openssl/rc5.h>
16155714Skris#endif
162110007Smarkm#ifndef OPENSSL_NO_RC2
16355714Skris#include <openssl/rc2.h>
16455714Skris#endif
165110007Smarkm#ifndef OPENSSL_NO_IDEA
16655714Skris#include <openssl/idea.h>
16755714Skris#endif
168194206Ssimon#ifndef OPENSSL_NO_SEED
169194206Ssimon#include <openssl/seed.h>
170194206Ssimon#endif
171110007Smarkm#ifndef OPENSSL_NO_BF
17255714Skris#include <openssl/blowfish.h>
17355714Skris#endif
174110007Smarkm#ifndef OPENSSL_NO_CAST
17555714Skris#include <openssl/cast.h>
17655714Skris#endif
177110007Smarkm#ifndef OPENSSL_NO_RSA
17855714Skris#include <openssl/rsa.h>
17955714Skris#include "./testrsa.h"
18055714Skris#endif
18155714Skris#include <openssl/x509.h>
182110007Smarkm#ifndef OPENSSL_NO_DSA
183160817Ssimon#include <openssl/dsa.h>
18455714Skris#include "./testdsa.h"
18555714Skris#endif
186160817Ssimon#ifndef OPENSSL_NO_ECDSA
187160817Ssimon#include <openssl/ecdsa.h>
188160817Ssimon#endif
189160817Ssimon#ifndef OPENSSL_NO_ECDH
190160817Ssimon#include <openssl/ecdh.h>
191160817Ssimon#endif
192238405Sjkim#include <openssl/modes.h>
19355714Skris
194238405Sjkim#ifdef OPENSSL_FIPS
195238405Sjkim#ifdef OPENSSL_DOING_MAKEDEPEND
196238405Sjkim#undef AES_set_encrypt_key
197238405Sjkim#undef AES_set_decrypt_key
198238405Sjkim#undef DES_set_key_unchecked
19955714Skris#endif
200238405Sjkim#define BF_set_key	private_BF_set_key
201238405Sjkim#define CAST_set_key	private_CAST_set_key
202238405Sjkim#define idea_set_encrypt_key	private_idea_set_encrypt_key
203238405Sjkim#define SEED_set_key	private_SEED_set_key
204238405Sjkim#define RC2_set_key	private_RC2_set_key
205238405Sjkim#define RC4_set_key	private_RC4_set_key
206238405Sjkim#define DES_set_key_unchecked	private_DES_set_key_unchecked
207238405Sjkim#define AES_set_encrypt_key	private_AES_set_encrypt_key
208238405Sjkim#define AES_set_decrypt_key	private_AES_set_decrypt_key
209238405Sjkim#define Camellia_set_key	private_Camellia_set_key
210238405Sjkim#endif
21155714Skris
212206046Ssimon#ifndef HAVE_FORK
213206046Ssimon# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_NETWARE)
214206046Ssimon#  define HAVE_FORK 0
215206046Ssimon# else
216206046Ssimon#  define HAVE_FORK 1
217206046Ssimon# endif
218206046Ssimon#endif
219206046Ssimon
220206046Ssimon#if HAVE_FORK
221238405Sjkim#undef NO_FORK
222205128Ssimon#else
223238405Sjkim#define NO_FORK
224110007Smarkm#endif
225110007Smarkm
22655714Skris#undef BUFSIZE
22755714Skris#define BUFSIZE	((long)1024*8+1)
228279264Sdelphijstatic volatile int run=0;
22955714Skris
230110007Smarkmstatic int mr=0;
231110007Smarkmstatic int usertime=1;
232110007Smarkm
233110007Smarkmstatic double Time_F(int s);
234110007Smarkmstatic void print_message(const char *s,long num,int length);
235160817Ssimonstatic void pkey_print_message(const char *str, const char *str2,
236160817Ssimon	long num, int bits, int sec);
237110007Smarkmstatic void print_result(int alg,int run_no,int count,double time_used);
238205128Ssimon#ifndef NO_FORK
239110007Smarkmstatic int do_multi(int multi);
240110007Smarkm#endif
241110007Smarkm
242238405Sjkim#define ALGOR_NUM	30
243110007Smarkm#define SIZE_NUM	5
244110007Smarkm#define RSA_NUM		4
245110007Smarkm#define DSA_NUM		3
246160817Ssimon
247160817Ssimon#define EC_NUM       16
248160817Ssimon#define MAX_ECDH_SIZE 256
249160817Ssimon
250110007Smarkmstatic const char *names[ALGOR_NUM]={
251110007Smarkm  "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
252194206Ssimon  "des cbc","des ede3","idea cbc","seed cbc",
253110007Smarkm  "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
254162914Ssimon  "aes-128 cbc","aes-192 cbc","aes-256 cbc",
255162914Ssimon  "camellia-128 cbc","camellia-192 cbc","camellia-256 cbc",
256238405Sjkim  "evp","sha256","sha512","whirlpool",
257246772Sjkim  "aes-128 ige","aes-192 ige","aes-256 ige","ghash" };
258110007Smarkmstatic double results[ALGOR_NUM][SIZE_NUM];
259110007Smarkmstatic int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
260205128Ssimon#ifndef OPENSSL_NO_RSA
261110007Smarkmstatic double rsa_results[RSA_NUM][2];
262205128Ssimon#endif
263205128Ssimon#ifndef OPENSSL_NO_DSA
264110007Smarkmstatic double dsa_results[DSA_NUM][2];
265205128Ssimon#endif
266160817Ssimon#ifndef OPENSSL_NO_ECDSA
267160817Ssimonstatic double ecdsa_results[EC_NUM][2];
268160817Ssimon#endif
269160817Ssimon#ifndef OPENSSL_NO_ECDH
270160817Ssimonstatic double ecdh_results[EC_NUM][1];
271160817Ssimon#endif
272110007Smarkm
273160817Ssimon#if defined(OPENSSL_NO_DSA) && !(defined(OPENSSL_NO_ECDSA) && defined(OPENSSL_NO_ECDH))
274160817Ssimonstatic const char rnd_seed[] = "string to make the random number generator think it has entropy";
275160817Ssimonstatic int rnd_fake = 0;
276160817Ssimon#endif
277160817Ssimon
27855714Skris#ifdef SIGALRM
27955714Skris#if defined(__STDC__) || defined(sgi) || defined(_AIX)
28055714Skris#define SIGRETTYPE void
28155714Skris#else
28255714Skris#define SIGRETTYPE int
28355714Skris#endif
28455714Skris
28555714Skrisstatic SIGRETTYPE sig_done(int sig);
28655714Skrisstatic SIGRETTYPE sig_done(int sig)
28755714Skris	{
28855714Skris	signal(SIGALRM,sig_done);
28955714Skris	run=0;
29055714Skris#ifdef LINT
29155714Skris	sig=sig;
29255714Skris#endif
29355714Skris	}
29455714Skris#endif
29555714Skris
29655714Skris#define START	0
29755714Skris#define STOP	1
29855714Skris
299238405Sjkim#if defined(_WIN32)
300160817Ssimon
301238405Sjkim#if !defined(SIGALRM)
302246772Sjkim# define SIGALRM
303238405Sjkim#endif
304238405Sjkimstatic unsigned int lapse,schlock;
305238405Sjkimstatic void alarm_win32(unsigned int secs) { lapse = secs*1000; }
306238405Sjkim#define alarm alarm_win32
307238405Sjkim
308238405Sjkimstatic DWORD WINAPI sleepy(VOID *arg)
30955714Skris	{
310238405Sjkim	schlock = 1;
311238405Sjkim	Sleep(lapse);
312238405Sjkim	run = 0;
313238405Sjkim	return 0;
314238405Sjkim	}
31555714Skris
316160817Ssimonstatic double Time_F(int s)
317160817Ssimon	{
318238405Sjkim	if (s == START)
319160817Ssimon		{
320238405Sjkim		HANDLE	thr;
321238405Sjkim		schlock = 0;
322238405Sjkim		thr = CreateThread(NULL,4096,sleepy,NULL,0,NULL);
323238405Sjkim		if (thr==NULL)
32468654Skris			{
325238405Sjkim			DWORD ret=GetLastError();
326238405Sjkim			BIO_printf(bio_err,"unable to CreateThread (%d)",ret);
327238405Sjkim			ExitProcess(ret);
32868654Skris			}
329238405Sjkim		CloseHandle(thr);		/* detach the thread	*/
330238405Sjkim		while (!schlock) Sleep(0);	/* scheduler spinlock	*/
33155714Skris		}
33268654Skris
333238405Sjkim	return app_tminterval(s,usertime);
334238405Sjkim	}
335238405Sjkim#else
33655714Skris
337238405Sjkimstatic double Time_F(int s)
338238405Sjkim	{
339238405Sjkim	return app_tminterval(s,usertime);
340238405Sjkim	}
34155714Skris#endif
34255714Skris
343160817Ssimon
344160817Ssimon#ifndef OPENSSL_NO_ECDH
345160817Ssimonstatic const int KDF1_SHA1_len = 20;
346160817Ssimonstatic void *KDF1_SHA1(const void *in, size_t inlen, void *out, size_t *outlen)
347160817Ssimon	{
348160817Ssimon#ifndef OPENSSL_NO_SHA
349160817Ssimon	if (*outlen < SHA_DIGEST_LENGTH)
350160817Ssimon		return NULL;
351160817Ssimon	else
352160817Ssimon		*outlen = SHA_DIGEST_LENGTH;
353160817Ssimon	return SHA1(in, inlen, out);
354160817Ssimon#else
355160817Ssimon	return NULL;
356160817Ssimon#endif	/* OPENSSL_NO_SHA */
357160817Ssimon	}
358160817Ssimon#endif	/* OPENSSL_NO_ECDH */
359160817Ssimon
360160817Ssimon
36159194Skrisint MAIN(int, char **);
36259194Skris
36355714Skrisint MAIN(int argc, char **argv)
36455714Skris	{
36555714Skris	unsigned char *buf=NULL,*buf2=NULL;
36659194Skris	int mret=1;
367110007Smarkm	long count=0,save_count=0;
36859194Skris	int i,j,k;
369110007Smarkm#if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
370110007Smarkm	long rsa_count;
371110007Smarkm#endif
372110007Smarkm#ifndef OPENSSL_NO_RSA
37368654Skris	unsigned rsa_num;
374100931Snectar#endif
375110007Smarkm	unsigned char md[EVP_MAX_MD_SIZE];
376110007Smarkm#ifndef OPENSSL_NO_MD2
37755714Skris	unsigned char md2[MD2_DIGEST_LENGTH];
37855714Skris#endif
379110007Smarkm#ifndef OPENSSL_NO_MDC2
38055714Skris	unsigned char mdc2[MDC2_DIGEST_LENGTH];
38155714Skris#endif
382110007Smarkm#ifndef OPENSSL_NO_MD4
38368654Skris	unsigned char md4[MD4_DIGEST_LENGTH];
38468654Skris#endif
385110007Smarkm#ifndef OPENSSL_NO_MD5
38655714Skris	unsigned char md5[MD5_DIGEST_LENGTH];
38755714Skris	unsigned char hmac[MD5_DIGEST_LENGTH];
38855714Skris#endif
389110007Smarkm#ifndef OPENSSL_NO_SHA
39055714Skris	unsigned char sha[SHA_DIGEST_LENGTH];
391160817Ssimon#ifndef OPENSSL_NO_SHA256
392160817Ssimon	unsigned char sha256[SHA256_DIGEST_LENGTH];
39355714Skris#endif
394160817Ssimon#ifndef OPENSSL_NO_SHA512
395160817Ssimon	unsigned char sha512[SHA512_DIGEST_LENGTH];
396160817Ssimon#endif
397160817Ssimon#endif
398238405Sjkim#ifndef OPENSSL_NO_WHIRLPOOL
399238405Sjkim	unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
400238405Sjkim#endif
401110007Smarkm#ifndef OPENSSL_NO_RIPEMD
40255714Skris	unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
40355714Skris#endif
404110007Smarkm#ifndef OPENSSL_NO_RC4
40555714Skris	RC4_KEY rc4_ks;
40655714Skris#endif
407110007Smarkm#ifndef OPENSSL_NO_RC5
40855714Skris	RC5_32_KEY rc5_ks;
40955714Skris#endif
410110007Smarkm#ifndef OPENSSL_NO_RC2
41155714Skris	RC2_KEY rc2_ks;
41255714Skris#endif
413110007Smarkm#ifndef OPENSSL_NO_IDEA
41455714Skris	IDEA_KEY_SCHEDULE idea_ks;
41555714Skris#endif
416194206Ssimon#ifndef OPENSSL_NO_SEED
417194206Ssimon	SEED_KEY_SCHEDULE seed_ks;
418194206Ssimon#endif
419110007Smarkm#ifndef OPENSSL_NO_BF
42055714Skris	BF_KEY bf_ks;
42155714Skris#endif
422110007Smarkm#ifndef OPENSSL_NO_CAST
42355714Skris	CAST_KEY cast_ks;
42455714Skris#endif
425110007Smarkm	static const unsigned char key16[16]=
42655714Skris		{0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
42755714Skris		 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
428160817Ssimon#ifndef OPENSSL_NO_AES
429110007Smarkm	static const unsigned char key24[24]=
430110007Smarkm		{0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
431110007Smarkm		 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
432110007Smarkm		 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
433110007Smarkm	static const unsigned char key32[32]=
434110007Smarkm		{0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
435110007Smarkm		 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
436110007Smarkm		 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
437110007Smarkm		 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
438160817Ssimon#endif
439162914Ssimon#ifndef OPENSSL_NO_CAMELLIA
440162914Ssimon	static const unsigned char ckey24[24]=
441162914Ssimon		{0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
442162914Ssimon		 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
443162914Ssimon		 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
444162914Ssimon	static const unsigned char ckey32[32]=
445162914Ssimon		{0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
446162914Ssimon		 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
447162914Ssimon		 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
448162914Ssimon		 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
449162914Ssimon#endif
450110007Smarkm#ifndef OPENSSL_NO_AES
451110007Smarkm#define MAX_BLOCK_SIZE 128
452110007Smarkm#else
453110007Smarkm#define MAX_BLOCK_SIZE 64
45455714Skris#endif
455110007Smarkm	unsigned char DES_iv[8];
456194206Ssimon	unsigned char iv[2*MAX_BLOCK_SIZE/8];
457110007Smarkm#ifndef OPENSSL_NO_DES
458110007Smarkm	static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
459110007Smarkm	static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
460110007Smarkm	static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
461110007Smarkm	DES_key_schedule sch;
462110007Smarkm	DES_key_schedule sch2;
463110007Smarkm	DES_key_schedule sch3;
464110007Smarkm#endif
465110007Smarkm#ifndef OPENSSL_NO_AES
466110007Smarkm	AES_KEY aes_ks1, aes_ks2, aes_ks3;
467110007Smarkm#endif
468162914Ssimon#ifndef OPENSSL_NO_CAMELLIA
469162914Ssimon	CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3;
470162914Ssimon#endif
47155714Skris#define	D_MD2		0
47255714Skris#define	D_MDC2		1
47368654Skris#define	D_MD4		2
47468654Skris#define	D_MD5		3
47568654Skris#define	D_HMAC		4
47668654Skris#define	D_SHA1		5
47768654Skris#define D_RMD160	6
47868654Skris#define	D_RC4		7
47968654Skris#define	D_CBC_DES	8
48068654Skris#define	D_EDE3_DES	9
48168654Skris#define	D_CBC_IDEA	10
482194206Ssimon#define	D_CBC_SEED	11
483194206Ssimon#define	D_CBC_RC2	12
484194206Ssimon#define	D_CBC_RC5	13
485194206Ssimon#define	D_CBC_BF	14
486194206Ssimon#define	D_CBC_CAST	15
487194206Ssimon#define D_CBC_128_AES	16
488194206Ssimon#define D_CBC_192_AES	17
489194206Ssimon#define D_CBC_256_AES	18
490194206Ssimon#define D_CBC_128_CML   19
491194206Ssimon#define D_CBC_192_CML   20
492194206Ssimon#define D_CBC_256_CML   21
493194206Ssimon#define D_EVP		22
494194206Ssimon#define D_SHA256	23
495194206Ssimon#define D_SHA512	24
496238405Sjkim#define D_WHIRLPOOL	25
497238405Sjkim#define D_IGE_128_AES   26
498238405Sjkim#define D_IGE_192_AES   27
499238405Sjkim#define D_IGE_256_AES   28
500238405Sjkim#define D_GHASH		29
501110007Smarkm	double d=0.0;
50255714Skris	long c[ALGOR_NUM][SIZE_NUM];
50355714Skris#define	R_DSA_512	0
50455714Skris#define	R_DSA_1024	1
50555714Skris#define	R_DSA_2048	2
50655714Skris#define	R_RSA_512	0
50755714Skris#define	R_RSA_1024	1
50855714Skris#define	R_RSA_2048	2
50955714Skris#define	R_RSA_4096	3
510160817Ssimon
511160817Ssimon#define R_EC_P160    0
512160817Ssimon#define R_EC_P192    1
513160817Ssimon#define R_EC_P224    2
514160817Ssimon#define R_EC_P256    3
515160817Ssimon#define R_EC_P384    4
516160817Ssimon#define R_EC_P521    5
517160817Ssimon#define R_EC_K163    6
518160817Ssimon#define R_EC_K233    7
519160817Ssimon#define R_EC_K283    8
520160817Ssimon#define R_EC_K409    9
521160817Ssimon#define R_EC_K571    10
522160817Ssimon#define R_EC_B163    11
523160817Ssimon#define R_EC_B233    12
524160817Ssimon#define R_EC_B283    13
525160817Ssimon#define R_EC_B409    14
526160817Ssimon#define R_EC_B571    15
527160817Ssimon
528110007Smarkm#ifndef OPENSSL_NO_RSA
52955714Skris	RSA *rsa_key[RSA_NUM];
53055714Skris	long rsa_c[RSA_NUM][2];
53155714Skris	static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
53255714Skris	static unsigned char *rsa_data[RSA_NUM]=
53355714Skris		{test512,test1024,test2048,test4096};
53455714Skris	static int rsa_data_length[RSA_NUM]={
53555714Skris		sizeof(test512),sizeof(test1024),
53655714Skris		sizeof(test2048),sizeof(test4096)};
53755714Skris#endif
538110007Smarkm#ifndef OPENSSL_NO_DSA
53955714Skris	DSA *dsa_key[DSA_NUM];
54055714Skris	long dsa_c[DSA_NUM][2];
54155714Skris	static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
54255714Skris#endif
543160817Ssimon#ifndef OPENSSL_NO_EC
544160817Ssimon	/* We only test over the following curves as they are representative,
545160817Ssimon	 * To add tests over more curves, simply add the curve NID
546160817Ssimon	 * and curve name to the following arrays and increase the
547160817Ssimon	 * EC_NUM value accordingly.
548160817Ssimon	 */
549160817Ssimon	static unsigned int test_curves[EC_NUM] =
550160817Ssimon	{
551160817Ssimon	/* Prime Curves */
552160817Ssimon	NID_secp160r1,
553160817Ssimon	NID_X9_62_prime192v1,
554160817Ssimon	NID_secp224r1,
555160817Ssimon	NID_X9_62_prime256v1,
556160817Ssimon	NID_secp384r1,
557160817Ssimon	NID_secp521r1,
558160817Ssimon	/* Binary Curves */
559160817Ssimon	NID_sect163k1,
560160817Ssimon	NID_sect233k1,
561160817Ssimon	NID_sect283k1,
562160817Ssimon	NID_sect409k1,
563160817Ssimon	NID_sect571k1,
564160817Ssimon	NID_sect163r2,
565160817Ssimon	NID_sect233r1,
566160817Ssimon	NID_sect283r1,
567160817Ssimon	NID_sect409r1,
568160817Ssimon	NID_sect571r1
569160817Ssimon	};
570160817Ssimon	static const char * test_curves_names[EC_NUM] =
571160817Ssimon	{
572160817Ssimon	/* Prime Curves */
573160817Ssimon	"secp160r1",
574160817Ssimon	"nistp192",
575160817Ssimon	"nistp224",
576160817Ssimon	"nistp256",
577160817Ssimon	"nistp384",
578160817Ssimon	"nistp521",
579160817Ssimon	/* Binary Curves */
580160817Ssimon	"nistk163",
581160817Ssimon	"nistk233",
582160817Ssimon	"nistk283",
583160817Ssimon	"nistk409",
584160817Ssimon	"nistk571",
585160817Ssimon	"nistb163",
586160817Ssimon	"nistb233",
587160817Ssimon	"nistb283",
588160817Ssimon	"nistb409",
589160817Ssimon	"nistb571"
590160817Ssimon	};
591160817Ssimon	static int test_curves_bits[EC_NUM] =
592160817Ssimon        {
593160817Ssimon        160, 192, 224, 256, 384, 521,
594160817Ssimon        163, 233, 283, 409, 571,
595160817Ssimon        163, 233, 283, 409, 571
596160817Ssimon        };
597160817Ssimon
598160817Ssimon#endif
599160817Ssimon
600160817Ssimon#ifndef OPENSSL_NO_ECDSA
601160817Ssimon	unsigned char ecdsasig[256];
602160817Ssimon	unsigned int ecdsasiglen;
603160817Ssimon	EC_KEY *ecdsa[EC_NUM];
604160817Ssimon	long ecdsa_c[EC_NUM][2];
605160817Ssimon#endif
606160817Ssimon
607160817Ssimon#ifndef OPENSSL_NO_ECDH
608160817Ssimon	EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
609160817Ssimon	unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
610160817Ssimon	int secret_size_a, secret_size_b;
611160817Ssimon	int ecdh_checks = 0;
612160817Ssimon	int secret_idx = 0;
613160817Ssimon	long ecdh_c[EC_NUM][2];
614160817Ssimon#endif
615160817Ssimon
61655714Skris	int rsa_doit[RSA_NUM];
61755714Skris	int dsa_doit[DSA_NUM];
618160817Ssimon#ifndef OPENSSL_NO_ECDSA
619160817Ssimon	int ecdsa_doit[EC_NUM];
620160817Ssimon#endif
621160817Ssimon#ifndef OPENSSL_NO_ECDH
622160817Ssimon        int ecdh_doit[EC_NUM];
623160817Ssimon#endif
62455714Skris	int doit[ALGOR_NUM];
62555714Skris	int pr_header=0;
626110007Smarkm	const EVP_CIPHER *evp_cipher=NULL;
627110007Smarkm	const EVP_MD *evp_md=NULL;
628110007Smarkm	int decrypt=0;
629205128Ssimon#ifndef NO_FORK
630110007Smarkm	int multi=0;
631110007Smarkm#endif
63255714Skris
63368654Skris#ifndef TIMES
63468654Skris	usertime=-1;
63568654Skris#endif
63668654Skris
63755714Skris	apps_startup();
63859194Skris	memset(results, 0, sizeof(results));
639110007Smarkm#ifndef OPENSSL_NO_DSA
64055714Skris	memset(dsa_key,0,sizeof(dsa_key));
64155714Skris#endif
642160817Ssimon#ifndef OPENSSL_NO_ECDSA
643160817Ssimon	for (i=0; i<EC_NUM; i++) ecdsa[i] = NULL;
644160817Ssimon#endif
645160817Ssimon#ifndef OPENSSL_NO_ECDH
646160817Ssimon	for (i=0; i<EC_NUM; i++)
647160817Ssimon		{
648160817Ssimon		ecdh_a[i] = NULL;
649160817Ssimon		ecdh_b[i] = NULL;
650160817Ssimon		}
651160817Ssimon#endif
65255714Skris
653160817Ssimon
65455714Skris	if (bio_err == NULL)
65555714Skris		if ((bio_err=BIO_new(BIO_s_file())) != NULL)
65655714Skris			BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
65755714Skris
658110007Smarkm	if (!load_config(bio_err, NULL))
659110007Smarkm		goto end;
660110007Smarkm
661110007Smarkm#ifndef OPENSSL_NO_RSA
66255714Skris	memset(rsa_key,0,sizeof(rsa_key));
66355714Skris	for (i=0; i<RSA_NUM; i++)
66455714Skris		rsa_key[i]=NULL;
66555714Skris#endif
66655714Skris
66768654Skris	if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
66855714Skris		{
66955714Skris		BIO_printf(bio_err,"out of memory\n");
67055714Skris		goto end;
67155714Skris		}
67268654Skris	if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
67355714Skris		{
67455714Skris		BIO_printf(bio_err,"out of memory\n");
67555714Skris		goto end;
67655714Skris		}
67755714Skris
67855714Skris	memset(c,0,sizeof(c));
679110007Smarkm	memset(DES_iv,0,sizeof(DES_iv));
68055714Skris	memset(iv,0,sizeof(iv));
68155714Skris
68255714Skris	for (i=0; i<ALGOR_NUM; i++)
68355714Skris		doit[i]=0;
68455714Skris	for (i=0; i<RSA_NUM; i++)
68555714Skris		rsa_doit[i]=0;
68655714Skris	for (i=0; i<DSA_NUM; i++)
68755714Skris		dsa_doit[i]=0;
688160817Ssimon#ifndef OPENSSL_NO_ECDSA
689160817Ssimon	for (i=0; i<EC_NUM; i++)
690160817Ssimon		ecdsa_doit[i]=0;
691160817Ssimon#endif
692160817Ssimon#ifndef OPENSSL_NO_ECDH
693160817Ssimon	for (i=0; i<EC_NUM; i++)
694160817Ssimon		ecdh_doit[i]=0;
695160817Ssimon#endif
696160817Ssimon
69755714Skris
69855714Skris	j=0;
69955714Skris	argc--;
70055714Skris	argv++;
70155714Skris	while (argc)
70255714Skris		{
70368654Skris		if	((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
704110007Smarkm			{
70568654Skris			usertime = 0;
706110007Smarkm			j--;	/* Otherwise, -elapsed gets confused with
707110007Smarkm				   an algorithm. */
708110007Smarkm			}
709110007Smarkm		else if	((argc > 0) && (strcmp(*argv,"-evp") == 0))
710110007Smarkm			{
711110007Smarkm			argc--;
712110007Smarkm			argv++;
713110007Smarkm			if(argc == 0)
714110007Smarkm				{
715110007Smarkm				BIO_printf(bio_err,"no EVP given\n");
716110007Smarkm				goto end;
717110007Smarkm				}
718110007Smarkm			evp_cipher=EVP_get_cipherbyname(*argv);
719110007Smarkm			if(!evp_cipher)
720110007Smarkm				{
721110007Smarkm				evp_md=EVP_get_digestbyname(*argv);
722110007Smarkm				}
723110007Smarkm			if(!evp_cipher && !evp_md)
724110007Smarkm				{
725110007Smarkm				BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
726110007Smarkm				goto end;
727110007Smarkm				}
728110007Smarkm			doit[D_EVP]=1;
729110007Smarkm			}
730110007Smarkm		else if (argc > 0 && !strcmp(*argv,"-decrypt"))
731110007Smarkm			{
732110007Smarkm			decrypt=1;
733110007Smarkm			j--;	/* Otherwise, -elapsed gets confused with
734110007Smarkm				   an algorithm. */
735110007Smarkm			}
736111150Snectar#ifndef OPENSSL_NO_ENGINE
737110007Smarkm		else if	((argc > 0) && (strcmp(*argv,"-engine") == 0))
738110007Smarkm			{
739110007Smarkm			argc--;
740110007Smarkm			argv++;
741110007Smarkm			if(argc == 0)
742110007Smarkm				{
743110007Smarkm				BIO_printf(bio_err,"no engine given\n");
744110007Smarkm				goto end;
745110007Smarkm				}
746215697Ssimon                        setup_engine(bio_err, *argv, 0);
747110007Smarkm			/* j will be increased again further down.  We just
748110007Smarkm			   don't want speed to confuse an engine with an
749110007Smarkm			   algorithm, especially when none is given (which
750110007Smarkm			   means all of them should be run) */
751110007Smarkm			j--;
752110007Smarkm			}
753111150Snectar#endif
754205128Ssimon#ifndef NO_FORK
755110007Smarkm		else if	((argc > 0) && (strcmp(*argv,"-multi") == 0))
756110007Smarkm			{
757110007Smarkm			argc--;
758110007Smarkm			argv++;
759110007Smarkm			if(argc == 0)
760110007Smarkm				{
761110007Smarkm				BIO_printf(bio_err,"no multi count given\n");
762110007Smarkm				goto end;
763110007Smarkm				}
764110007Smarkm			multi=atoi(argv[0]);
765110007Smarkm			if(multi <= 0)
766110007Smarkm			    {
767110007Smarkm				BIO_printf(bio_err,"bad multi count\n");
768110007Smarkm				goto end;
769110007Smarkm				}
770110007Smarkm			j--;	/* Otherwise, -mr gets confused with
771110007Smarkm				   an algorithm. */
772110007Smarkm			}
773110007Smarkm#endif
774110007Smarkm		else if (argc > 0 && !strcmp(*argv,"-mr"))
775110007Smarkm			{
776110007Smarkm			mr=1;
777110007Smarkm			j--;	/* Otherwise, -mr gets confused with
778110007Smarkm				   an algorithm. */
779110007Smarkm			}
780110007Smarkm		else
781110007Smarkm#ifndef OPENSSL_NO_MD2
78255714Skris		if	(strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
78355714Skris		else
78455714Skris#endif
785110007Smarkm#ifndef OPENSSL_NO_MDC2
78655714Skris			if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
78755714Skris		else
78855714Skris#endif
789110007Smarkm#ifndef OPENSSL_NO_MD4
79068654Skris			if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
79168654Skris		else
79268654Skris#endif
793110007Smarkm#ifndef OPENSSL_NO_MD5
79455714Skris			if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
79555714Skris		else
79655714Skris#endif
797110007Smarkm#ifndef OPENSSL_NO_MD5
79855714Skris			if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
79955714Skris		else
80055714Skris#endif
801110007Smarkm#ifndef OPENSSL_NO_SHA
80255714Skris			if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
80355714Skris		else
804160817Ssimon			if (strcmp(*argv,"sha") == 0)	doit[D_SHA1]=1,
805160817Ssimon							doit[D_SHA256]=1,
806160817Ssimon							doit[D_SHA512]=1;
80755714Skris		else
808160817Ssimon#ifndef OPENSSL_NO_SHA256
809160817Ssimon			if (strcmp(*argv,"sha256") == 0) doit[D_SHA256]=1;
810160817Ssimon		else
81155714Skris#endif
812160817Ssimon#ifndef OPENSSL_NO_SHA512
813160817Ssimon			if (strcmp(*argv,"sha512") == 0) doit[D_SHA512]=1;
814160817Ssimon		else
815160817Ssimon#endif
816160817Ssimon#endif
817238405Sjkim#ifndef OPENSSL_NO_WHIRLPOOL
818238405Sjkim			if (strcmp(*argv,"whirlpool") == 0) doit[D_WHIRLPOOL]=1;
819238405Sjkim		else
820238405Sjkim#endif
821110007Smarkm#ifndef OPENSSL_NO_RIPEMD
82255714Skris			if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
82355714Skris		else
82455714Skris			if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
82555714Skris		else
82655714Skris			if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
82755714Skris		else
82855714Skris#endif
829110007Smarkm#ifndef OPENSSL_NO_RC4
83055714Skris			if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
83155714Skris		else
83255714Skris#endif
833110007Smarkm#ifndef OPENSSL_NO_DES
83455714Skris			if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
83555714Skris		else	if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
83655714Skris		else
83755714Skris#endif
838110007Smarkm#ifndef OPENSSL_NO_AES
839110007Smarkm			if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
840110007Smarkm		else	if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
841110007Smarkm		else	if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
842194206Ssimon		else    if (strcmp(*argv,"aes-128-ige") == 0) doit[D_IGE_128_AES]=1;
843194206Ssimon		else	if (strcmp(*argv,"aes-192-ige") == 0) doit[D_IGE_192_AES]=1;
844194206Ssimon		else	if (strcmp(*argv,"aes-256-ige") == 0) doit[D_IGE_256_AES]=1;
845194206Ssimon                else
846110007Smarkm#endif
847162914Ssimon#ifndef OPENSSL_NO_CAMELLIA
848162914Ssimon			if (strcmp(*argv,"camellia-128-cbc") == 0) doit[D_CBC_128_CML]=1;
849162914Ssimon		else    if (strcmp(*argv,"camellia-192-cbc") == 0) doit[D_CBC_192_CML]=1;
850162914Ssimon		else    if (strcmp(*argv,"camellia-256-cbc") == 0) doit[D_CBC_256_CML]=1;
851162914Ssimon		else
852162914Ssimon#endif
853110007Smarkm#ifndef OPENSSL_NO_RSA
854110007Smarkm#if 0 /* was: #ifdef RSAref */
85568654Skris			if (strcmp(*argv,"rsaref") == 0)
85668654Skris			{
857110007Smarkm			RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
85868654Skris			j--;
85968654Skris			}
86068654Skris		else
86168654Skris#endif
86259194Skris#ifndef RSA_NULL
86355714Skris			if (strcmp(*argv,"openssl") == 0)
86455714Skris			{
86568654Skris			RSA_set_default_method(RSA_PKCS1_SSLeay());
86655714Skris			j--;
86755714Skris			}
86855714Skris		else
86959194Skris#endif
870110007Smarkm#endif /* !OPENSSL_NO_RSA */
87155714Skris		     if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
87255714Skris		else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
87355714Skris		else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
87455714Skris		else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
87555714Skris		else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
87655714Skris		else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
87755714Skris		else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
87855714Skris		else
879110007Smarkm#ifndef OPENSSL_NO_RC2
88055714Skris		     if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
88155714Skris		else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
88255714Skris		else
88355714Skris#endif
884110007Smarkm#ifndef OPENSSL_NO_RC5
88555714Skris		     if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
88655714Skris		else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
88755714Skris		else
88855714Skris#endif
889110007Smarkm#ifndef OPENSSL_NO_IDEA
89055714Skris		     if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
89155714Skris		else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
89255714Skris		else
89355714Skris#endif
894194206Ssimon#ifndef OPENSSL_NO_SEED
895194206Ssimon		     if (strcmp(*argv,"seed-cbc") == 0) doit[D_CBC_SEED]=1;
896194206Ssimon		else if (strcmp(*argv,"seed") == 0) doit[D_CBC_SEED]=1;
897194206Ssimon		else
898194206Ssimon#endif
899110007Smarkm#ifndef OPENSSL_NO_BF
90055714Skris		     if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
90155714Skris		else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
90255714Skris		else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
90355714Skris		else
90455714Skris#endif
905110007Smarkm#ifndef OPENSSL_NO_CAST
90655714Skris		     if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
90755714Skris		else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
90855714Skris		else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
90955714Skris		else
91055714Skris#endif
911110007Smarkm#ifndef OPENSSL_NO_DES
91255714Skris			if (strcmp(*argv,"des") == 0)
91355714Skris			{
91455714Skris			doit[D_CBC_DES]=1;
91555714Skris			doit[D_EDE3_DES]=1;
91655714Skris			}
91755714Skris		else
91855714Skris#endif
919110007Smarkm#ifndef OPENSSL_NO_AES
920110007Smarkm			if (strcmp(*argv,"aes") == 0)
921110007Smarkm			{
922110007Smarkm			doit[D_CBC_128_AES]=1;
923110007Smarkm			doit[D_CBC_192_AES]=1;
924110007Smarkm			doit[D_CBC_256_AES]=1;
925110007Smarkm			}
926238405Sjkim		else if (strcmp(*argv,"ghash") == 0)
927238405Sjkim			{
928238405Sjkim			doit[D_GHASH]=1;
929238405Sjkim			}
930110007Smarkm		else
931110007Smarkm#endif
932162914Ssimon#ifndef OPENSSL_NO_CAMELLIA
933162914Ssimon			if (strcmp(*argv,"camellia") == 0)
934162914Ssimon			{
935162914Ssimon			doit[D_CBC_128_CML]=1;
936162914Ssimon			doit[D_CBC_192_CML]=1;
937162914Ssimon			doit[D_CBC_256_CML]=1;
938162914Ssimon			}
939162914Ssimon		else
940162914Ssimon#endif
941110007Smarkm#ifndef OPENSSL_NO_RSA
94255714Skris			if (strcmp(*argv,"rsa") == 0)
94355714Skris			{
94455714Skris			rsa_doit[R_RSA_512]=1;
94555714Skris			rsa_doit[R_RSA_1024]=1;
94655714Skris			rsa_doit[R_RSA_2048]=1;
94755714Skris			rsa_doit[R_RSA_4096]=1;
94855714Skris			}
94955714Skris		else
95055714Skris#endif
951110007Smarkm#ifndef OPENSSL_NO_DSA
95255714Skris			if (strcmp(*argv,"dsa") == 0)
95355714Skris			{
95455714Skris			dsa_doit[R_DSA_512]=1;
95555714Skris			dsa_doit[R_DSA_1024]=1;
956127134Snectar			dsa_doit[R_DSA_2048]=1;
95755714Skris			}
95855714Skris		else
95955714Skris#endif
960160817Ssimon#ifndef OPENSSL_NO_ECDSA
961160817Ssimon		     if (strcmp(*argv,"ecdsap160") == 0) ecdsa_doit[R_EC_P160]=2;
962160817Ssimon		else if (strcmp(*argv,"ecdsap192") == 0) ecdsa_doit[R_EC_P192]=2;
963160817Ssimon		else if (strcmp(*argv,"ecdsap224") == 0) ecdsa_doit[R_EC_P224]=2;
964160817Ssimon		else if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2;
965160817Ssimon		else if (strcmp(*argv,"ecdsap384") == 0) ecdsa_doit[R_EC_P384]=2;
966160817Ssimon		else if (strcmp(*argv,"ecdsap521") == 0) ecdsa_doit[R_EC_P521]=2;
967160817Ssimon		else if (strcmp(*argv,"ecdsak163") == 0) ecdsa_doit[R_EC_K163]=2;
968160817Ssimon		else if (strcmp(*argv,"ecdsak233") == 0) ecdsa_doit[R_EC_K233]=2;
969160817Ssimon		else if (strcmp(*argv,"ecdsak283") == 0) ecdsa_doit[R_EC_K283]=2;
970160817Ssimon		else if (strcmp(*argv,"ecdsak409") == 0) ecdsa_doit[R_EC_K409]=2;
971160817Ssimon		else if (strcmp(*argv,"ecdsak571") == 0) ecdsa_doit[R_EC_K571]=2;
972160817Ssimon		else if (strcmp(*argv,"ecdsab163") == 0) ecdsa_doit[R_EC_B163]=2;
973160817Ssimon		else if (strcmp(*argv,"ecdsab233") == 0) ecdsa_doit[R_EC_B233]=2;
974160817Ssimon		else if (strcmp(*argv,"ecdsab283") == 0) ecdsa_doit[R_EC_B283]=2;
975160817Ssimon		else if (strcmp(*argv,"ecdsab409") == 0) ecdsa_doit[R_EC_B409]=2;
976160817Ssimon		else if (strcmp(*argv,"ecdsab571") == 0) ecdsa_doit[R_EC_B571]=2;
977160817Ssimon		else if (strcmp(*argv,"ecdsa") == 0)
97855714Skris			{
979160817Ssimon			for (i=0; i < EC_NUM; i++)
980160817Ssimon				ecdsa_doit[i]=1;
981160817Ssimon			}
982160817Ssimon		else
983160817Ssimon#endif
984160817Ssimon#ifndef OPENSSL_NO_ECDH
985160817Ssimon		     if (strcmp(*argv,"ecdhp160") == 0) ecdh_doit[R_EC_P160]=2;
986160817Ssimon		else if (strcmp(*argv,"ecdhp192") == 0) ecdh_doit[R_EC_P192]=2;
987160817Ssimon		else if (strcmp(*argv,"ecdhp224") == 0) ecdh_doit[R_EC_P224]=2;
988160817Ssimon		else if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2;
989160817Ssimon		else if (strcmp(*argv,"ecdhp384") == 0) ecdh_doit[R_EC_P384]=2;
990160817Ssimon		else if (strcmp(*argv,"ecdhp521") == 0) ecdh_doit[R_EC_P521]=2;
991160817Ssimon		else if (strcmp(*argv,"ecdhk163") == 0) ecdh_doit[R_EC_K163]=2;
992160817Ssimon		else if (strcmp(*argv,"ecdhk233") == 0) ecdh_doit[R_EC_K233]=2;
993160817Ssimon		else if (strcmp(*argv,"ecdhk283") == 0) ecdh_doit[R_EC_K283]=2;
994160817Ssimon		else if (strcmp(*argv,"ecdhk409") == 0) ecdh_doit[R_EC_K409]=2;
995160817Ssimon		else if (strcmp(*argv,"ecdhk571") == 0) ecdh_doit[R_EC_K571]=2;
996160817Ssimon		else if (strcmp(*argv,"ecdhb163") == 0) ecdh_doit[R_EC_B163]=2;
997160817Ssimon		else if (strcmp(*argv,"ecdhb233") == 0) ecdh_doit[R_EC_B233]=2;
998160817Ssimon		else if (strcmp(*argv,"ecdhb283") == 0) ecdh_doit[R_EC_B283]=2;
999160817Ssimon		else if (strcmp(*argv,"ecdhb409") == 0) ecdh_doit[R_EC_B409]=2;
1000160817Ssimon		else if (strcmp(*argv,"ecdhb571") == 0) ecdh_doit[R_EC_B571]=2;
1001160817Ssimon		else if (strcmp(*argv,"ecdh") == 0)
1002160817Ssimon			{
1003160817Ssimon			for (i=0; i < EC_NUM; i++)
1004160817Ssimon				ecdh_doit[i]=1;
1005160817Ssimon			}
1006160817Ssimon		else
1007160817Ssimon#endif
1008160817Ssimon			{
100968654Skris			BIO_printf(bio_err,"Error: bad option or value\n");
101068654Skris			BIO_printf(bio_err,"\n");
101168654Skris			BIO_printf(bio_err,"Available values:\n");
1012110007Smarkm#ifndef OPENSSL_NO_MD2
101368654Skris			BIO_printf(bio_err,"md2      ");
101468654Skris#endif
1015110007Smarkm#ifndef OPENSSL_NO_MDC2
101668654Skris			BIO_printf(bio_err,"mdc2     ");
101768654Skris#endif
1018110007Smarkm#ifndef OPENSSL_NO_MD4
101968654Skris			BIO_printf(bio_err,"md4      ");
102068654Skris#endif
1021110007Smarkm#ifndef OPENSSL_NO_MD5
102268654Skris			BIO_printf(bio_err,"md5      ");
1023110007Smarkm#ifndef OPENSSL_NO_HMAC
102468654Skris			BIO_printf(bio_err,"hmac     ");
102568654Skris#endif
102668654Skris#endif
1027110007Smarkm#ifndef OPENSSL_NO_SHA1
102868654Skris			BIO_printf(bio_err,"sha1     ");
102968654Skris#endif
1030160817Ssimon#ifndef OPENSSL_NO_SHA256
1031160817Ssimon			BIO_printf(bio_err,"sha256   ");
1032160817Ssimon#endif
1033160817Ssimon#ifndef OPENSSL_NO_SHA512
1034160817Ssimon			BIO_printf(bio_err,"sha512   ");
1035160817Ssimon#endif
1036238405Sjkim#ifndef OPENSSL_NO_WHIRLPOOL
1037238405Sjkim			BIO_printf(bio_err,"whirlpool");
1038238405Sjkim#endif
1039110007Smarkm#ifndef OPENSSL_NO_RIPEMD160
104068654Skris			BIO_printf(bio_err,"rmd160");
104168654Skris#endif
1042110007Smarkm#if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
1043110007Smarkm    !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
1044238405Sjkim    !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160) || \
1045238405Sjkim    !defined(OPENSSL_NO_WHIRLPOOL)
104668654Skris			BIO_printf(bio_err,"\n");
104768654Skris#endif
104868654Skris
1049110007Smarkm#ifndef OPENSSL_NO_IDEA
105055714Skris			BIO_printf(bio_err,"idea-cbc ");
105155714Skris#endif
1052194206Ssimon#ifndef OPENSSL_NO_SEED
1053194206Ssimon			BIO_printf(bio_err,"seed-cbc ");
1054194206Ssimon#endif
1055110007Smarkm#ifndef OPENSSL_NO_RC2
105655714Skris			BIO_printf(bio_err,"rc2-cbc  ");
105755714Skris#endif
1058110007Smarkm#ifndef OPENSSL_NO_RC5
105955714Skris			BIO_printf(bio_err,"rc5-cbc  ");
106055714Skris#endif
1061110007Smarkm#ifndef OPENSSL_NO_BF
106255714Skris			BIO_printf(bio_err,"bf-cbc");
106355714Skris#endif
1064194206Ssimon#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_SEED) || !defined(OPENSSL_NO_RC2) || \
1065110007Smarkm    !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
106655714Skris			BIO_printf(bio_err,"\n");
106755714Skris#endif
1068110007Smarkm#ifndef OPENSSL_NO_DES
106955714Skris			BIO_printf(bio_err,"des-cbc  des-ede3 ");
1070110007Smarkm#endif
1071110007Smarkm#ifndef OPENSSL_NO_AES
1072110007Smarkm			BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
1073194206Ssimon			BIO_printf(bio_err,"aes-128-ige aes-192-ige aes-256-ige ");
1074110007Smarkm#endif
1075162914Ssimon#ifndef OPENSSL_NO_CAMELLIA
1076162914Ssimon			BIO_printf(bio_err,"\n");
1077162914Ssimon			BIO_printf(bio_err,"camellia-128-cbc camellia-192-cbc camellia-256-cbc ");
1078162914Ssimon#endif
1079110007Smarkm#ifndef OPENSSL_NO_RC4
108055714Skris			BIO_printf(bio_err,"rc4");
108155714Skris#endif
108268654Skris			BIO_printf(bio_err,"\n");
108368654Skris
1084110007Smarkm#ifndef OPENSSL_NO_RSA
108568654Skris			BIO_printf(bio_err,"rsa512   rsa1024  rsa2048  rsa4096\n");
108655714Skris#endif
108768654Skris
1088110007Smarkm#ifndef OPENSSL_NO_DSA
108968654Skris			BIO_printf(bio_err,"dsa512   dsa1024  dsa2048\n");
109055714Skris#endif
1091160817Ssimon#ifndef OPENSSL_NO_ECDSA
1092160817Ssimon			BIO_printf(bio_err,"ecdsap160 ecdsap192 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
1093160817Ssimon			BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n");
1094160817Ssimon			BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n");
1095160817Ssimon			BIO_printf(bio_err,"ecdsa\n");
1096160817Ssimon#endif
1097160817Ssimon#ifndef OPENSSL_NO_ECDH
1098160817Ssimon			BIO_printf(bio_err,"ecdhp160  ecdhp192  ecdhp224  ecdhp256  ecdhp384  ecdhp521\n");
1099160817Ssimon			BIO_printf(bio_err,"ecdhk163  ecdhk233  ecdhk283  ecdhk409  ecdhk571\n");
1100160817Ssimon			BIO_printf(bio_err,"ecdhb163  ecdhb233  ecdhb283  ecdhb409  ecdhb571\n");
1101160817Ssimon			BIO_printf(bio_err,"ecdh\n");
1102160817Ssimon#endif
110368654Skris
1104110007Smarkm#ifndef OPENSSL_NO_IDEA
110568654Skris			BIO_printf(bio_err,"idea     ");
110668654Skris#endif
1107194206Ssimon#ifndef OPENSSL_NO_SEED
1108194206Ssimon			BIO_printf(bio_err,"seed     ");
1109194206Ssimon#endif
1110110007Smarkm#ifndef OPENSSL_NO_RC2
111168654Skris			BIO_printf(bio_err,"rc2      ");
111268654Skris#endif
1113110007Smarkm#ifndef OPENSSL_NO_DES
111468654Skris			BIO_printf(bio_err,"des      ");
111568654Skris#endif
1116110007Smarkm#ifndef OPENSSL_NO_AES
1117110007Smarkm			BIO_printf(bio_err,"aes      ");
1118110007Smarkm#endif
1119162914Ssimon#ifndef OPENSSL_NO_CAMELLIA
1120162914Ssimon			BIO_printf(bio_err,"camellia ");
1121162914Ssimon#endif
1122110007Smarkm#ifndef OPENSSL_NO_RSA
112368654Skris			BIO_printf(bio_err,"rsa      ");
112468654Skris#endif
1125110007Smarkm#ifndef OPENSSL_NO_BF
112668654Skris			BIO_printf(bio_err,"blowfish");
112768654Skris#endif
1128194206Ssimon#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_SEED) || \
1129194206Ssimon    !defined(OPENSSL_NO_RC2) || !defined(OPENSSL_NO_DES) || \
1130194206Ssimon    !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_BF) || \
1131194206Ssimon    !defined(OPENSSL_NO_AES) || !defined(OPENSSL_NO_CAMELLIA)
113268654Skris			BIO_printf(bio_err,"\n");
113368654Skris#endif
113468654Skris
113568654Skris			BIO_printf(bio_err,"\n");
113668654Skris			BIO_printf(bio_err,"Available options:\n");
1137110007Smarkm#if defined(TIMES) || defined(USE_TOD)
113868654Skris			BIO_printf(bio_err,"-elapsed        measure time in real time instead of CPU user time.\n");
113968654Skris#endif
1140111150Snectar#ifndef OPENSSL_NO_ENGINE
1141110007Smarkm			BIO_printf(bio_err,"-engine e       use engine e, possibly a hardware device.\n");
1142111150Snectar#endif
1143110007Smarkm			BIO_printf(bio_err,"-evp e          use EVP e.\n");
1144110007Smarkm			BIO_printf(bio_err,"-decrypt        time decryption instead of encryption (only EVP).\n");
1145110007Smarkm			BIO_printf(bio_err,"-mr             produce machine readable output.\n");
1146205128Ssimon#ifndef NO_FORK
1147110007Smarkm			BIO_printf(bio_err,"-multi n        run n benchmarks in parallel.\n");
1148110007Smarkm#endif
114955714Skris			goto end;
115055714Skris			}
115155714Skris		argc--;
115255714Skris		argv++;
115355714Skris		j++;
115455714Skris		}
115555714Skris
1156205128Ssimon#ifndef NO_FORK
1157110007Smarkm	if(multi && do_multi(multi))
1158110007Smarkm		goto show_res;
1159110007Smarkm#endif
1160110007Smarkm
116155714Skris	if (j == 0)
116255714Skris		{
116355714Skris		for (i=0; i<ALGOR_NUM; i++)
1164110007Smarkm			{
1165110007Smarkm			if (i != D_EVP)
1166110007Smarkm				doit[i]=1;
1167110007Smarkm			}
116855714Skris		for (i=0; i<RSA_NUM; i++)
116955714Skris			rsa_doit[i]=1;
117055714Skris		for (i=0; i<DSA_NUM; i++)
117155714Skris			dsa_doit[i]=1;
1172238405Sjkim#ifndef OPENSSL_NO_ECDSA
1173238405Sjkim		for (i=0; i<EC_NUM; i++)
1174238405Sjkim			ecdsa_doit[i]=1;
1175238405Sjkim#endif
1176238405Sjkim#ifndef OPENSSL_NO_ECDH
1177238405Sjkim		for (i=0; i<EC_NUM; i++)
1178238405Sjkim			ecdh_doit[i]=1;
1179238405Sjkim#endif
118055714Skris		}
118155714Skris	for (i=0; i<ALGOR_NUM; i++)
118255714Skris		if (doit[i]) pr_header++;
118355714Skris
1184110007Smarkm	if (usertime == 0 && !mr)
118568654Skris		BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
118655714Skris
1187110007Smarkm#ifndef OPENSSL_NO_RSA
118855714Skris	for (i=0; i<RSA_NUM; i++)
118955714Skris		{
1190110007Smarkm		const unsigned char *p;
119155714Skris
119255714Skris		p=rsa_data[i];
119355714Skris		rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
119455714Skris		if (rsa_key[i] == NULL)
119555714Skris			{
119655714Skris			BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
119755714Skris			goto end;
119855714Skris			}
119955714Skris#if 0
120055714Skris		else
120155714Skris			{
1202110007Smarkm			BIO_printf(bio_err,mr ? "+RK:%d:"
1203110007Smarkm				   : "Loaded RSA key, %d bit modulus and e= 0x",
1204110007Smarkm				   BN_num_bits(rsa_key[i]->n));
120555714Skris			BN_print(bio_err,rsa_key[i]->e);
120655714Skris			BIO_printf(bio_err,"\n");
120755714Skris			}
120855714Skris#endif
120955714Skris		}
121055714Skris#endif
121155714Skris
1212110007Smarkm#ifndef OPENSSL_NO_DSA
121355714Skris	dsa_key[0]=get_dsa512();
121455714Skris	dsa_key[1]=get_dsa1024();
121555714Skris	dsa_key[2]=get_dsa2048();
121655714Skris#endif
121755714Skris
1218110007Smarkm#ifndef OPENSSL_NO_DES
1219110007Smarkm	DES_set_key_unchecked(&key,&sch);
1220110007Smarkm	DES_set_key_unchecked(&key2,&sch2);
1221110007Smarkm	DES_set_key_unchecked(&key3,&sch3);
122255714Skris#endif
1223110007Smarkm#ifndef OPENSSL_NO_AES
1224110007Smarkm	AES_set_encrypt_key(key16,128,&aes_ks1);
1225110007Smarkm	AES_set_encrypt_key(key24,192,&aes_ks2);
1226110007Smarkm	AES_set_encrypt_key(key32,256,&aes_ks3);
1227110007Smarkm#endif
1228162914Ssimon#ifndef OPENSSL_NO_CAMELLIA
1229162914Ssimon	Camellia_set_key(key16,128,&camellia_ks1);
1230162914Ssimon	Camellia_set_key(ckey24,192,&camellia_ks2);
1231162914Ssimon	Camellia_set_key(ckey32,256,&camellia_ks3);
1232162914Ssimon#endif
1233110007Smarkm#ifndef OPENSSL_NO_IDEA
123455714Skris	idea_set_encrypt_key(key16,&idea_ks);
123555714Skris#endif
1236194206Ssimon#ifndef OPENSSL_NO_SEED
1237194206Ssimon	SEED_set_key(key16,&seed_ks);
1238194206Ssimon#endif
1239110007Smarkm#ifndef OPENSSL_NO_RC4
124055714Skris	RC4_set_key(&rc4_ks,16,key16);
124155714Skris#endif
1242110007Smarkm#ifndef OPENSSL_NO_RC2
124355714Skris	RC2_set_key(&rc2_ks,16,key16,128);
124455714Skris#endif
1245110007Smarkm#ifndef OPENSSL_NO_RC5
124655714Skris	RC5_32_set_key(&rc5_ks,16,key16,12);
124755714Skris#endif
1248110007Smarkm#ifndef OPENSSL_NO_BF
124955714Skris	BF_set_key(&bf_ks,16,key16);
125055714Skris#endif
1251110007Smarkm#ifndef OPENSSL_NO_CAST
125255714Skris	CAST_set_key(&cast_ks,16,key16);
125355714Skris#endif
1254110007Smarkm#ifndef OPENSSL_NO_RSA
125555714Skris	memset(rsa_c,0,sizeof(rsa_c));
125655714Skris#endif
125755714Skris#ifndef SIGALRM
1258110007Smarkm#ifndef OPENSSL_NO_DES
125955714Skris	BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
126055714Skris	count=10;
126155714Skris	do	{
1262160817Ssimon		long it;
126355714Skris		count*=2;
1264110007Smarkm		Time_F(START);
1265160817Ssimon		for (it=count; it; it--)
1266215697Ssimon			DES_ecb_encrypt((DES_cblock *)buf,
1267215697Ssimon				(DES_cblock *)buf,
1268110007Smarkm				&sch,DES_ENCRYPT);
1269110007Smarkm		d=Time_F(STOP);
127055714Skris		} while (d <3);
1271110007Smarkm	save_count=count;
127255714Skris	c[D_MD2][0]=count/10;
127355714Skris	c[D_MDC2][0]=count/10;
127468654Skris	c[D_MD4][0]=count;
127555714Skris	c[D_MD5][0]=count;
127655714Skris	c[D_HMAC][0]=count;
127755714Skris	c[D_SHA1][0]=count;
127855714Skris	c[D_RMD160][0]=count;
127955714Skris	c[D_RC4][0]=count*5;
128055714Skris	c[D_CBC_DES][0]=count;
128155714Skris	c[D_EDE3_DES][0]=count/3;
128255714Skris	c[D_CBC_IDEA][0]=count;
1283194206Ssimon	c[D_CBC_SEED][0]=count;
128455714Skris	c[D_CBC_RC2][0]=count;
128555714Skris	c[D_CBC_RC5][0]=count;
128655714Skris	c[D_CBC_BF][0]=count;
128755714Skris	c[D_CBC_CAST][0]=count;
1288127134Snectar	c[D_CBC_128_AES][0]=count;
1289127134Snectar	c[D_CBC_192_AES][0]=count;
1290127134Snectar	c[D_CBC_256_AES][0]=count;
1291162914Ssimon	c[D_CBC_128_CML][0]=count;
1292162914Ssimon	c[D_CBC_192_CML][0]=count;
1293162914Ssimon	c[D_CBC_256_CML][0]=count;
1294160817Ssimon	c[D_SHA256][0]=count;
1295160817Ssimon	c[D_SHA512][0]=count;
1296238405Sjkim	c[D_WHIRLPOOL][0]=count;
1297194206Ssimon	c[D_IGE_128_AES][0]=count;
1298194206Ssimon	c[D_IGE_192_AES][0]=count;
1299194206Ssimon	c[D_IGE_256_AES][0]=count;
1300238405Sjkim	c[D_GHASH][0]=count;
130155714Skris
130255714Skris	for (i=1; i<SIZE_NUM; i++)
130355714Skris		{
130455714Skris		c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
130555714Skris		c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
130668654Skris		c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
130755714Skris		c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
130855714Skris		c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
130955714Skris		c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
131055714Skris		c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1311160817Ssimon		c[D_SHA256][i]=c[D_SHA256][0]*4*lengths[0]/lengths[i];
1312160817Ssimon		c[D_SHA512][i]=c[D_SHA512][0]*4*lengths[0]/lengths[i];
1313238405Sjkim		c[D_WHIRLPOOL][i]=c[D_WHIRLPOOL][0]*4*lengths[0]/lengths[i];
131455714Skris		}
131555714Skris	for (i=1; i<SIZE_NUM; i++)
131655714Skris		{
131755714Skris		long l0,l1;
131855714Skris
131955714Skris		l0=(long)lengths[i-1];
132055714Skris		l1=(long)lengths[i];
132155714Skris		c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
132255714Skris		c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
132355714Skris		c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
132455714Skris		c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1325194206Ssimon		c[D_CBC_SEED][i]=c[D_CBC_SEED][i-1]*l0/l1;
132655714Skris		c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
132755714Skris		c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
132855714Skris		c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
132955714Skris		c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1330127134Snectar		c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
1331127134Snectar		c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
1332127134Snectar		c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
1333162914Ssimon 		c[D_CBC_128_CML][i]=c[D_CBC_128_CML][i-1]*l0/l1;
1334162914Ssimon		c[D_CBC_192_CML][i]=c[D_CBC_192_CML][i-1]*l0/l1;
1335162914Ssimon		c[D_CBC_256_CML][i]=c[D_CBC_256_CML][i-1]*l0/l1;
1336194206Ssimon		c[D_IGE_128_AES][i]=c[D_IGE_128_AES][i-1]*l0/l1;
1337194206Ssimon		c[D_IGE_192_AES][i]=c[D_IGE_192_AES][i-1]*l0/l1;
1338194206Ssimon		c[D_IGE_256_AES][i]=c[D_IGE_256_AES][i-1]*l0/l1;
133955714Skris		}
1340110007Smarkm#ifndef OPENSSL_NO_RSA
134155714Skris	rsa_c[R_RSA_512][0]=count/2000;
134255714Skris	rsa_c[R_RSA_512][1]=count/400;
134355714Skris	for (i=1; i<RSA_NUM; i++)
134455714Skris		{
134555714Skris		rsa_c[i][0]=rsa_c[i-1][0]/8;
134655714Skris		rsa_c[i][1]=rsa_c[i-1][1]/4;
134755714Skris		if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
134855714Skris			rsa_doit[i]=0;
134955714Skris		else
135055714Skris			{
135155714Skris			if (rsa_c[i][0] == 0)
135255714Skris				{
135355714Skris				rsa_c[i][0]=1;
135455714Skris				rsa_c[i][1]=20;
135555714Skris				}
135655714Skris			}
135755714Skris		}
135855714Skris#endif
135955714Skris
1360110007Smarkm#ifndef OPENSSL_NO_DSA
136155714Skris	dsa_c[R_DSA_512][0]=count/1000;
136255714Skris	dsa_c[R_DSA_512][1]=count/1000/2;
136355714Skris	for (i=1; i<DSA_NUM; i++)
136455714Skris		{
136555714Skris		dsa_c[i][0]=dsa_c[i-1][0]/4;
136655714Skris		dsa_c[i][1]=dsa_c[i-1][1]/4;
136755714Skris		if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
136855714Skris			dsa_doit[i]=0;
136955714Skris		else
137055714Skris			{
137155714Skris			if (dsa_c[i] == 0)
137255714Skris				{
137355714Skris				dsa_c[i][0]=1;
137455714Skris				dsa_c[i][1]=1;
137555714Skris				}
137655714Skris			}
137755714Skris		}
137876870Skris#endif
137955714Skris
1380160817Ssimon#ifndef OPENSSL_NO_ECDSA
1381160817Ssimon	ecdsa_c[R_EC_P160][0]=count/1000;
1382160817Ssimon	ecdsa_c[R_EC_P160][1]=count/1000/2;
1383160817Ssimon	for (i=R_EC_P192; i<=R_EC_P521; i++)
1384160817Ssimon		{
1385160817Ssimon		ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1386160817Ssimon		ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1387160817Ssimon		if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1388160817Ssimon			ecdsa_doit[i]=0;
1389160817Ssimon		else
1390160817Ssimon			{
1391160817Ssimon			if (ecdsa_c[i] == 0)
1392160817Ssimon				{
1393160817Ssimon				ecdsa_c[i][0]=1;
1394160817Ssimon				ecdsa_c[i][1]=1;
1395160817Ssimon				}
1396160817Ssimon			}
1397160817Ssimon		}
1398160817Ssimon	ecdsa_c[R_EC_K163][0]=count/1000;
1399160817Ssimon	ecdsa_c[R_EC_K163][1]=count/1000/2;
1400160817Ssimon	for (i=R_EC_K233; i<=R_EC_K571; i++)
1401160817Ssimon		{
1402160817Ssimon		ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1403160817Ssimon		ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1404160817Ssimon		if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1405160817Ssimon			ecdsa_doit[i]=0;
1406160817Ssimon		else
1407160817Ssimon			{
1408160817Ssimon			if (ecdsa_c[i] == 0)
1409160817Ssimon				{
1410160817Ssimon				ecdsa_c[i][0]=1;
1411160817Ssimon				ecdsa_c[i][1]=1;
1412160817Ssimon				}
1413160817Ssimon			}
1414160817Ssimon		}
1415160817Ssimon	ecdsa_c[R_EC_B163][0]=count/1000;
1416160817Ssimon	ecdsa_c[R_EC_B163][1]=count/1000/2;
1417160817Ssimon	for (i=R_EC_B233; i<=R_EC_B571; i++)
1418160817Ssimon		{
1419160817Ssimon		ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1420160817Ssimon		ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1421160817Ssimon		if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1422160817Ssimon			ecdsa_doit[i]=0;
1423160817Ssimon		else
1424160817Ssimon			{
1425160817Ssimon			if (ecdsa_c[i] == 0)
1426160817Ssimon				{
1427160817Ssimon				ecdsa_c[i][0]=1;
1428160817Ssimon				ecdsa_c[i][1]=1;
1429160817Ssimon				}
1430160817Ssimon			}
1431160817Ssimon		}
1432160817Ssimon#endif
1433160817Ssimon
1434160817Ssimon#ifndef OPENSSL_NO_ECDH
1435160817Ssimon	ecdh_c[R_EC_P160][0]=count/1000;
1436160817Ssimon	ecdh_c[R_EC_P160][1]=count/1000;
1437160817Ssimon	for (i=R_EC_P192; i<=R_EC_P521; i++)
1438160817Ssimon		{
1439160817Ssimon		ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1440160817Ssimon		ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1441160817Ssimon		if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1442160817Ssimon			ecdh_doit[i]=0;
1443160817Ssimon		else
1444160817Ssimon			{
1445160817Ssimon			if (ecdh_c[i] == 0)
1446160817Ssimon				{
1447160817Ssimon				ecdh_c[i][0]=1;
1448160817Ssimon				ecdh_c[i][1]=1;
1449160817Ssimon				}
1450160817Ssimon			}
1451160817Ssimon		}
1452160817Ssimon	ecdh_c[R_EC_K163][0]=count/1000;
1453160817Ssimon	ecdh_c[R_EC_K163][1]=count/1000;
1454160817Ssimon	for (i=R_EC_K233; i<=R_EC_K571; i++)
1455160817Ssimon		{
1456160817Ssimon		ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1457160817Ssimon		ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1458160817Ssimon		if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1459160817Ssimon			ecdh_doit[i]=0;
1460160817Ssimon		else
1461160817Ssimon			{
1462160817Ssimon			if (ecdh_c[i] == 0)
1463160817Ssimon				{
1464160817Ssimon				ecdh_c[i][0]=1;
1465160817Ssimon				ecdh_c[i][1]=1;
1466160817Ssimon				}
1467160817Ssimon			}
1468160817Ssimon		}
1469160817Ssimon	ecdh_c[R_EC_B163][0]=count/1000;
1470160817Ssimon	ecdh_c[R_EC_B163][1]=count/1000;
1471160817Ssimon	for (i=R_EC_B233; i<=R_EC_B571; i++)
1472160817Ssimon		{
1473160817Ssimon		ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1474160817Ssimon		ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1475160817Ssimon		if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1476160817Ssimon			ecdh_doit[i]=0;
1477160817Ssimon		else
1478160817Ssimon			{
1479160817Ssimon			if (ecdh_c[i] == 0)
1480160817Ssimon				{
1481160817Ssimon				ecdh_c[i][0]=1;
1482160817Ssimon				ecdh_c[i][1]=1;
1483160817Ssimon				}
1484160817Ssimon			}
1485160817Ssimon		}
1486160817Ssimon#endif
1487160817Ssimon
148855714Skris#define COND(d)	(count < (d))
148955714Skris#define COUNT(d) (d)
149055714Skris#else
149159194Skris/* not worth fixing */
149259194Skris# error "You cannot disable DES on systems without SIGALRM."
1493110007Smarkm#endif /* OPENSSL_NO_DES */
149459194Skris#else
1495238405Sjkim#define COND(c)	(run && count<0x7fffffff)
149655714Skris#define COUNT(d) (count)
1497238405Sjkim#ifndef _WIN32
149855714Skris	signal(SIGALRM,sig_done);
1499238405Sjkim#endif
150059194Skris#endif /* SIGALRM */
150155714Skris
1502110007Smarkm#ifndef OPENSSL_NO_MD2
150355714Skris	if (doit[D_MD2])
150455714Skris		{
150555714Skris		for (j=0; j<SIZE_NUM; j++)
150655714Skris			{
150755714Skris			print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1508110007Smarkm			Time_F(START);
150955714Skris			for (count=0,run=1; COND(c[D_MD2][j]); count++)
1510110007Smarkm				EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1511110007Smarkm			d=Time_F(STOP);
1512110007Smarkm			print_result(D_MD2,j,count,d);
151355714Skris			}
151455714Skris		}
151555714Skris#endif
1516110007Smarkm#ifndef OPENSSL_NO_MDC2
151755714Skris	if (doit[D_MDC2])
151855714Skris		{
151955714Skris		for (j=0; j<SIZE_NUM; j++)
152055714Skris			{
152155714Skris			print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1522110007Smarkm			Time_F(START);
152355714Skris			for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1524110007Smarkm				EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1525110007Smarkm			d=Time_F(STOP);
1526110007Smarkm			print_result(D_MDC2,j,count,d);
152755714Skris			}
152855714Skris		}
152955714Skris#endif
153055714Skris
1531110007Smarkm#ifndef OPENSSL_NO_MD4
153268654Skris	if (doit[D_MD4])
153368654Skris		{
153468654Skris		for (j=0; j<SIZE_NUM; j++)
153568654Skris			{
153668654Skris			print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1537110007Smarkm			Time_F(START);
153868654Skris			for (count=0,run=1; COND(c[D_MD4][j]); count++)
1539110007Smarkm				EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1540110007Smarkm			d=Time_F(STOP);
1541110007Smarkm			print_result(D_MD4,j,count,d);
154268654Skris			}
154368654Skris		}
154468654Skris#endif
154568654Skris
1546110007Smarkm#ifndef OPENSSL_NO_MD5
154755714Skris	if (doit[D_MD5])
154855714Skris		{
154955714Skris		for (j=0; j<SIZE_NUM; j++)
155055714Skris			{
155155714Skris			print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1552110007Smarkm			Time_F(START);
155355714Skris			for (count=0,run=1; COND(c[D_MD5][j]); count++)
1554110007Smarkm				EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1555110007Smarkm			d=Time_F(STOP);
1556110007Smarkm			print_result(D_MD5,j,count,d);
155755714Skris			}
155855714Skris		}
155955714Skris#endif
156055714Skris
1561110007Smarkm#if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
156255714Skris	if (doit[D_HMAC])
156355714Skris		{
156455714Skris		HMAC_CTX hctx;
156555714Skris
1566110007Smarkm		HMAC_CTX_init(&hctx);
1567110007Smarkm		HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1568110007Smarkm			16,EVP_md5(), NULL);
1569110007Smarkm
157055714Skris		for (j=0; j<SIZE_NUM; j++)
157155714Skris			{
157255714Skris			print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1573110007Smarkm			Time_F(START);
157455714Skris			for (count=0,run=1; COND(c[D_HMAC][j]); count++)
157555714Skris				{
1576110007Smarkm				HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1577110007Smarkm				HMAC_Update(&hctx,buf,lengths[j]);
1578110007Smarkm				HMAC_Final(&hctx,&(hmac[0]),NULL);
157955714Skris				}
1580110007Smarkm			d=Time_F(STOP);
1581110007Smarkm			print_result(D_HMAC,j,count,d);
158255714Skris			}
1583110007Smarkm		HMAC_CTX_cleanup(&hctx);
158455714Skris		}
158555714Skris#endif
1586110007Smarkm#ifndef OPENSSL_NO_SHA
158755714Skris	if (doit[D_SHA1])
158855714Skris		{
158955714Skris		for (j=0; j<SIZE_NUM; j++)
159055714Skris			{
159155714Skris			print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1592110007Smarkm			Time_F(START);
159355714Skris			for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1594110007Smarkm				EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1595110007Smarkm			d=Time_F(STOP);
1596110007Smarkm			print_result(D_SHA1,j,count,d);
159755714Skris			}
159855714Skris		}
1599160817Ssimon
1600160817Ssimon#ifndef OPENSSL_NO_SHA256
1601160817Ssimon	if (doit[D_SHA256])
1602160817Ssimon		{
1603160817Ssimon		for (j=0; j<SIZE_NUM; j++)
1604160817Ssimon			{
1605160817Ssimon			print_message(names[D_SHA256],c[D_SHA256][j],lengths[j]);
1606160817Ssimon			Time_F(START);
1607160817Ssimon			for (count=0,run=1; COND(c[D_SHA256][j]); count++)
1608160817Ssimon				SHA256(buf,lengths[j],sha256);
1609160817Ssimon			d=Time_F(STOP);
1610160817Ssimon			print_result(D_SHA256,j,count,d);
1611160817Ssimon			}
1612160817Ssimon		}
161355714Skris#endif
1614160817Ssimon
1615160817Ssimon#ifndef OPENSSL_NO_SHA512
1616160817Ssimon	if (doit[D_SHA512])
1617160817Ssimon		{
1618160817Ssimon		for (j=0; j<SIZE_NUM; j++)
1619160817Ssimon			{
1620160817Ssimon			print_message(names[D_SHA512],c[D_SHA512][j],lengths[j]);
1621160817Ssimon			Time_F(START);
1622160817Ssimon			for (count=0,run=1; COND(c[D_SHA512][j]); count++)
1623160817Ssimon				SHA512(buf,lengths[j],sha512);
1624160817Ssimon			d=Time_F(STOP);
1625160817Ssimon			print_result(D_SHA512,j,count,d);
1626160817Ssimon			}
1627160817Ssimon		}
1628160817Ssimon#endif
1629238405Sjkim#endif
1630160817Ssimon
1631238405Sjkim#ifndef OPENSSL_NO_WHIRLPOOL
1632238405Sjkim	if (doit[D_WHIRLPOOL])
1633238405Sjkim		{
1634238405Sjkim		for (j=0; j<SIZE_NUM; j++)
1635238405Sjkim			{
1636238405Sjkim			print_message(names[D_WHIRLPOOL],c[D_WHIRLPOOL][j],lengths[j]);
1637238405Sjkim			Time_F(START);
1638238405Sjkim			for (count=0,run=1; COND(c[D_WHIRLPOOL][j]); count++)
1639238405Sjkim				WHIRLPOOL(buf,lengths[j],whirlpool);
1640238405Sjkim			d=Time_F(STOP);
1641238405Sjkim			print_result(D_WHIRLPOOL,j,count,d);
1642238405Sjkim			}
1643238405Sjkim		}
1644160817Ssimon#endif
1645238405Sjkim
1646110007Smarkm#ifndef OPENSSL_NO_RIPEMD
164755714Skris	if (doit[D_RMD160])
164855714Skris		{
164955714Skris		for (j=0; j<SIZE_NUM; j++)
165055714Skris			{
165155714Skris			print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1652110007Smarkm			Time_F(START);
165355714Skris			for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1654110007Smarkm				EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1655110007Smarkm			d=Time_F(STOP);
1656110007Smarkm			print_result(D_RMD160,j,count,d);
165755714Skris			}
165855714Skris		}
165955714Skris#endif
1660110007Smarkm#ifndef OPENSSL_NO_RC4
166155714Skris	if (doit[D_RC4])
166255714Skris		{
166355714Skris		for (j=0; j<SIZE_NUM; j++)
166455714Skris			{
166555714Skris			print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1666110007Smarkm			Time_F(START);
166755714Skris			for (count=0,run=1; COND(c[D_RC4][j]); count++)
166855714Skris				RC4(&rc4_ks,(unsigned int)lengths[j],
166955714Skris					buf,buf);
1670110007Smarkm			d=Time_F(STOP);
1671110007Smarkm			print_result(D_RC4,j,count,d);
167255714Skris			}
167355714Skris		}
167455714Skris#endif
1675110007Smarkm#ifndef OPENSSL_NO_DES
167655714Skris	if (doit[D_CBC_DES])
167755714Skris		{
167855714Skris		for (j=0; j<SIZE_NUM; j++)
167955714Skris			{
168055714Skris			print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1681110007Smarkm			Time_F(START);
168255714Skris			for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1683110007Smarkm				DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1684110007Smarkm						 &DES_iv,DES_ENCRYPT);
1685110007Smarkm			d=Time_F(STOP);
1686110007Smarkm			print_result(D_CBC_DES,j,count,d);
168755714Skris			}
168855714Skris		}
168955714Skris
169055714Skris	if (doit[D_EDE3_DES])
169155714Skris		{
169255714Skris		for (j=0; j<SIZE_NUM; j++)
169355714Skris			{
169455714Skris			print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1695110007Smarkm			Time_F(START);
169655714Skris			for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1697110007Smarkm				DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1698110007Smarkm						     &sch,&sch2,&sch3,
1699110007Smarkm						     &DES_iv,DES_ENCRYPT);
1700110007Smarkm			d=Time_F(STOP);
1701110007Smarkm			print_result(D_EDE3_DES,j,count,d);
170255714Skris			}
170355714Skris		}
170455714Skris#endif
1705110007Smarkm#ifndef OPENSSL_NO_AES
1706110007Smarkm	if (doit[D_CBC_128_AES])
1707110007Smarkm		{
1708110007Smarkm		for (j=0; j<SIZE_NUM; j++)
1709110007Smarkm			{
1710110007Smarkm			print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1711110007Smarkm			Time_F(START);
1712110007Smarkm			for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1713110007Smarkm				AES_cbc_encrypt(buf,buf,
1714110007Smarkm					(unsigned long)lengths[j],&aes_ks1,
1715110007Smarkm					iv,AES_ENCRYPT);
1716110007Smarkm			d=Time_F(STOP);
1717110007Smarkm			print_result(D_CBC_128_AES,j,count,d);
1718110007Smarkm			}
1719110007Smarkm		}
1720110007Smarkm	if (doit[D_CBC_192_AES])
1721110007Smarkm		{
1722110007Smarkm		for (j=0; j<SIZE_NUM; j++)
1723110007Smarkm			{
1724110007Smarkm			print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1725110007Smarkm			Time_F(START);
1726110007Smarkm			for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1727110007Smarkm				AES_cbc_encrypt(buf,buf,
1728110007Smarkm					(unsigned long)lengths[j],&aes_ks2,
1729110007Smarkm					iv,AES_ENCRYPT);
1730110007Smarkm			d=Time_F(STOP);
1731110007Smarkm			print_result(D_CBC_192_AES,j,count,d);
1732110007Smarkm			}
1733110007Smarkm		}
1734110007Smarkm	if (doit[D_CBC_256_AES])
1735110007Smarkm		{
1736110007Smarkm		for (j=0; j<SIZE_NUM; j++)
1737110007Smarkm			{
1738110007Smarkm			print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1739110007Smarkm			Time_F(START);
1740110007Smarkm			for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1741110007Smarkm				AES_cbc_encrypt(buf,buf,
1742110007Smarkm					(unsigned long)lengths[j],&aes_ks3,
1743110007Smarkm					iv,AES_ENCRYPT);
1744110007Smarkm			d=Time_F(STOP);
1745110007Smarkm			print_result(D_CBC_256_AES,j,count,d);
1746110007Smarkm			}
1747110007Smarkm		}
1748110007Smarkm
1749194206Ssimon	if (doit[D_IGE_128_AES])
1750194206Ssimon		{
1751194206Ssimon		for (j=0; j<SIZE_NUM; j++)
1752194206Ssimon			{
1753194206Ssimon			print_message(names[D_IGE_128_AES],c[D_IGE_128_AES][j],lengths[j]);
1754194206Ssimon			Time_F(START);
1755194206Ssimon			for (count=0,run=1; COND(c[D_IGE_128_AES][j]); count++)
1756194206Ssimon				AES_ige_encrypt(buf,buf2,
1757194206Ssimon					(unsigned long)lengths[j],&aes_ks1,
1758194206Ssimon					iv,AES_ENCRYPT);
1759194206Ssimon			d=Time_F(STOP);
1760194206Ssimon			print_result(D_IGE_128_AES,j,count,d);
1761194206Ssimon			}
1762194206Ssimon		}
1763194206Ssimon	if (doit[D_IGE_192_AES])
1764194206Ssimon		{
1765194206Ssimon		for (j=0; j<SIZE_NUM; j++)
1766194206Ssimon			{
1767194206Ssimon			print_message(names[D_IGE_192_AES],c[D_IGE_192_AES][j],lengths[j]);
1768194206Ssimon			Time_F(START);
1769194206Ssimon			for (count=0,run=1; COND(c[D_IGE_192_AES][j]); count++)
1770194206Ssimon				AES_ige_encrypt(buf,buf2,
1771194206Ssimon					(unsigned long)lengths[j],&aes_ks2,
1772194206Ssimon					iv,AES_ENCRYPT);
1773194206Ssimon			d=Time_F(STOP);
1774194206Ssimon			print_result(D_IGE_192_AES,j,count,d);
1775194206Ssimon			}
1776194206Ssimon		}
1777194206Ssimon	if (doit[D_IGE_256_AES])
1778194206Ssimon		{
1779194206Ssimon		for (j=0; j<SIZE_NUM; j++)
1780194206Ssimon			{
1781194206Ssimon			print_message(names[D_IGE_256_AES],c[D_IGE_256_AES][j],lengths[j]);
1782194206Ssimon			Time_F(START);
1783194206Ssimon			for (count=0,run=1; COND(c[D_IGE_256_AES][j]); count++)
1784194206Ssimon				AES_ige_encrypt(buf,buf2,
1785194206Ssimon					(unsigned long)lengths[j],&aes_ks3,
1786194206Ssimon					iv,AES_ENCRYPT);
1787194206Ssimon			d=Time_F(STOP);
1788194206Ssimon			print_result(D_IGE_256_AES,j,count,d);
1789194206Ssimon			}
1790194206Ssimon		}
1791238405Sjkim	if (doit[D_GHASH])
1792238405Sjkim		{
1793238405Sjkim		GCM128_CONTEXT *ctx = CRYPTO_gcm128_new(&aes_ks1,(block128_f)AES_encrypt);
1794238405Sjkim		CRYPTO_gcm128_setiv (ctx,(unsigned char *)"0123456789ab",12);
1795238405Sjkim
1796238405Sjkim		for (j=0; j<SIZE_NUM; j++)
1797238405Sjkim			{
1798238405Sjkim			print_message(names[D_GHASH],c[D_GHASH][j],lengths[j]);
1799238405Sjkim			Time_F(START);
1800238405Sjkim			for (count=0,run=1; COND(c[D_GHASH][j]); count++)
1801238405Sjkim				CRYPTO_gcm128_aad(ctx,buf,lengths[j]);
1802238405Sjkim			d=Time_F(STOP);
1803238405Sjkim			print_result(D_GHASH,j,count,d);
1804238405Sjkim			}
1805238405Sjkim		CRYPTO_gcm128_release(ctx);
1806238405Sjkim		}
1807238405Sjkim
1808110007Smarkm#endif
1809162914Ssimon#ifndef OPENSSL_NO_CAMELLIA
1810162914Ssimon	if (doit[D_CBC_128_CML])
1811162914Ssimon		{
1812162914Ssimon		for (j=0; j<SIZE_NUM; j++)
1813162914Ssimon			{
1814162914Ssimon			print_message(names[D_CBC_128_CML],c[D_CBC_128_CML][j],lengths[j]);
1815162914Ssimon			Time_F(START);
1816162914Ssimon			for (count=0,run=1; COND(c[D_CBC_128_CML][j]); count++)
1817162914Ssimon				Camellia_cbc_encrypt(buf,buf,
1818162914Ssimon				        (unsigned long)lengths[j],&camellia_ks1,
1819162914Ssimon				        iv,CAMELLIA_ENCRYPT);
1820162914Ssimon			d=Time_F(STOP);
1821162914Ssimon			print_result(D_CBC_128_CML,j,count,d);
1822162914Ssimon			}
1823162914Ssimon		}
1824162914Ssimon	if (doit[D_CBC_192_CML])
1825162914Ssimon		{
1826162914Ssimon		for (j=0; j<SIZE_NUM; j++)
1827162914Ssimon			{
1828162914Ssimon			print_message(names[D_CBC_192_CML],c[D_CBC_192_CML][j],lengths[j]);
1829162914Ssimon			Time_F(START);
1830162914Ssimon			for (count=0,run=1; COND(c[D_CBC_192_CML][j]); count++)
1831162914Ssimon				Camellia_cbc_encrypt(buf,buf,
1832162914Ssimon				        (unsigned long)lengths[j],&camellia_ks2,
1833162914Ssimon				        iv,CAMELLIA_ENCRYPT);
1834162914Ssimon			d=Time_F(STOP);
1835162914Ssimon			print_result(D_CBC_192_CML,j,count,d);
1836162914Ssimon			}
1837162914Ssimon		}
1838162914Ssimon	if (doit[D_CBC_256_CML])
1839162914Ssimon		{
1840162914Ssimon		for (j=0; j<SIZE_NUM; j++)
1841162914Ssimon			{
1842162914Ssimon			print_message(names[D_CBC_256_CML],c[D_CBC_256_CML][j],lengths[j]);
1843162914Ssimon			Time_F(START);
1844162914Ssimon			for (count=0,run=1; COND(c[D_CBC_256_CML][j]); count++)
1845162914Ssimon				Camellia_cbc_encrypt(buf,buf,
1846162914Ssimon				        (unsigned long)lengths[j],&camellia_ks3,
1847162914Ssimon				        iv,CAMELLIA_ENCRYPT);
1848162914Ssimon			d=Time_F(STOP);
1849162914Ssimon			print_result(D_CBC_256_CML,j,count,d);
1850162914Ssimon			}
1851162914Ssimon		}
1852162914Ssimon
1853162914Ssimon#endif
1854110007Smarkm#ifndef OPENSSL_NO_IDEA
185555714Skris	if (doit[D_CBC_IDEA])
185655714Skris		{
185755714Skris		for (j=0; j<SIZE_NUM; j++)
185855714Skris			{
185955714Skris			print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1860110007Smarkm			Time_F(START);
186155714Skris			for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
186255714Skris				idea_cbc_encrypt(buf,buf,
186355714Skris					(unsigned long)lengths[j],&idea_ks,
186455714Skris					iv,IDEA_ENCRYPT);
1865110007Smarkm			d=Time_F(STOP);
1866110007Smarkm			print_result(D_CBC_IDEA,j,count,d);
186755714Skris			}
186855714Skris		}
186955714Skris#endif
1870194206Ssimon#ifndef OPENSSL_NO_SEED
1871194206Ssimon	if (doit[D_CBC_SEED])
1872194206Ssimon		{
1873194206Ssimon		for (j=0; j<SIZE_NUM; j++)
1874194206Ssimon			{
1875194206Ssimon			print_message(names[D_CBC_SEED],c[D_CBC_SEED][j],lengths[j]);
1876194206Ssimon			Time_F(START);
1877194206Ssimon			for (count=0,run=1; COND(c[D_CBC_SEED][j]); count++)
1878194206Ssimon				SEED_cbc_encrypt(buf,buf,
1879194206Ssimon					(unsigned long)lengths[j],&seed_ks,iv,1);
1880194206Ssimon			d=Time_F(STOP);
1881194206Ssimon			print_result(D_CBC_SEED,j,count,d);
1882194206Ssimon			}
1883194206Ssimon		}
1884194206Ssimon#endif
1885110007Smarkm#ifndef OPENSSL_NO_RC2
188655714Skris	if (doit[D_CBC_RC2])
188755714Skris		{
188855714Skris		for (j=0; j<SIZE_NUM; j++)
188955714Skris			{
189055714Skris			print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1891110007Smarkm			Time_F(START);
189255714Skris			for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
189355714Skris				RC2_cbc_encrypt(buf,buf,
189455714Skris					(unsigned long)lengths[j],&rc2_ks,
189555714Skris					iv,RC2_ENCRYPT);
1896110007Smarkm			d=Time_F(STOP);
1897110007Smarkm			print_result(D_CBC_RC2,j,count,d);
189855714Skris			}
189955714Skris		}
190055714Skris#endif
1901110007Smarkm#ifndef OPENSSL_NO_RC5
190255714Skris	if (doit[D_CBC_RC5])
190355714Skris		{
190455714Skris		for (j=0; j<SIZE_NUM; j++)
190555714Skris			{
190655714Skris			print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1907110007Smarkm			Time_F(START);
190855714Skris			for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
190955714Skris				RC5_32_cbc_encrypt(buf,buf,
191055714Skris					(unsigned long)lengths[j],&rc5_ks,
191155714Skris					iv,RC5_ENCRYPT);
1912110007Smarkm			d=Time_F(STOP);
1913110007Smarkm			print_result(D_CBC_RC5,j,count,d);
191455714Skris			}
191555714Skris		}
191655714Skris#endif
1917110007Smarkm#ifndef OPENSSL_NO_BF
191855714Skris	if (doit[D_CBC_BF])
191955714Skris		{
192055714Skris		for (j=0; j<SIZE_NUM; j++)
192155714Skris			{
192255714Skris			print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1923110007Smarkm			Time_F(START);
192455714Skris			for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
192555714Skris				BF_cbc_encrypt(buf,buf,
192655714Skris					(unsigned long)lengths[j],&bf_ks,
192755714Skris					iv,BF_ENCRYPT);
1928110007Smarkm			d=Time_F(STOP);
1929110007Smarkm			print_result(D_CBC_BF,j,count,d);
193055714Skris			}
193155714Skris		}
193255714Skris#endif
1933110007Smarkm#ifndef OPENSSL_NO_CAST
193455714Skris	if (doit[D_CBC_CAST])
193555714Skris		{
193655714Skris		for (j=0; j<SIZE_NUM; j++)
193755714Skris			{
193855714Skris			print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1939110007Smarkm			Time_F(START);
194055714Skris			for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
194155714Skris				CAST_cbc_encrypt(buf,buf,
194255714Skris					(unsigned long)lengths[j],&cast_ks,
194355714Skris					iv,CAST_ENCRYPT);
1944110007Smarkm			d=Time_F(STOP);
1945110007Smarkm			print_result(D_CBC_CAST,j,count,d);
194655714Skris			}
194755714Skris		}
194855714Skris#endif
194955714Skris
1950110007Smarkm	if (doit[D_EVP])
1951110007Smarkm		{
1952110007Smarkm		for (j=0; j<SIZE_NUM; j++)
1953110007Smarkm			{
1954110007Smarkm			if (evp_cipher)
1955110007Smarkm				{
1956110007Smarkm				EVP_CIPHER_CTX ctx;
1957110007Smarkm				int outl;
1958110007Smarkm
1959110007Smarkm				names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1960110007Smarkm				/* -O3 -fschedule-insns messes up an
1961110007Smarkm				 * optimization here!  names[D_EVP]
1962110007Smarkm				 * somehow becomes NULL */
1963110007Smarkm				print_message(names[D_EVP],save_count,
1964110007Smarkm					lengths[j]);
1965110007Smarkm
1966110007Smarkm				EVP_CIPHER_CTX_init(&ctx);
1967110007Smarkm				if(decrypt)
1968110007Smarkm					EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1969110007Smarkm				else
1970110007Smarkm					EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1971142428Snectar				EVP_CIPHER_CTX_set_padding(&ctx, 0);
1972110007Smarkm
1973110007Smarkm				Time_F(START);
1974110007Smarkm				if(decrypt)
1975110007Smarkm					for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1976110007Smarkm						EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1977110007Smarkm				else
1978110007Smarkm					for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1979110007Smarkm						EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1980110007Smarkm				if(decrypt)
1981110007Smarkm					EVP_DecryptFinal_ex(&ctx,buf,&outl);
1982110007Smarkm				else
1983110007Smarkm					EVP_EncryptFinal_ex(&ctx,buf,&outl);
1984110007Smarkm				d=Time_F(STOP);
1985111150Snectar				EVP_CIPHER_CTX_cleanup(&ctx);
1986110007Smarkm				}
1987110007Smarkm			if (evp_md)
1988110007Smarkm				{
1989110007Smarkm				names[D_EVP]=OBJ_nid2ln(evp_md->type);
1990110007Smarkm				print_message(names[D_EVP],save_count,
1991110007Smarkm					lengths[j]);
1992110007Smarkm
1993110007Smarkm				Time_F(START);
1994110007Smarkm				for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1995110007Smarkm					EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1996110007Smarkm
1997110007Smarkm				d=Time_F(STOP);
1998110007Smarkm				}
1999110007Smarkm			print_result(D_EVP,j,count,d);
2000110007Smarkm			}
2001110007Smarkm		}
2002110007Smarkm
200359194Skris	RAND_pseudo_bytes(buf,36);
2004110007Smarkm#ifndef OPENSSL_NO_RSA
200555714Skris	for (j=0; j<RSA_NUM; j++)
200655714Skris		{
200759194Skris		int ret;
200855714Skris		if (!rsa_doit[j]) continue;
200959194Skris		ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
201068654Skris		if (ret == 0)
201155714Skris			{
201268654Skris			BIO_printf(bio_err,"RSA sign failure.  No RSA sign will be done.\n");
201368654Skris			ERR_print_errors(bio_err);
201468654Skris			rsa_count=1;
201568654Skris			}
201668654Skris		else
201768654Skris			{
201868654Skris			pkey_print_message("private","rsa",
201968654Skris				rsa_c[j][0],rsa_bits[j],
202068654Skris				RSA_SECONDS);
202168654Skris/*			RSA_blinding_on(rsa_key[j],NULL); */
2022110007Smarkm			Time_F(START);
202368654Skris			for (count=0,run=1; COND(rsa_c[j][0]); count++)
202455714Skris				{
202568654Skris				ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
202668654Skris					&rsa_num, rsa_key[j]);
202768654Skris				if (ret == 0)
202868654Skris					{
202968654Skris					BIO_printf(bio_err,
203068654Skris						"RSA sign failure\n");
203168654Skris					ERR_print_errors(bio_err);
203268654Skris					count=1;
203368654Skris					break;
203468654Skris					}
203555714Skris				}
2036110007Smarkm			d=Time_F(STOP);
2037110007Smarkm			BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
2038110007Smarkm				   : "%ld %d bit private RSA's in %.2fs\n",
2039110007Smarkm				   count,rsa_bits[j],d);
204068654Skris			rsa_results[j][0]=d/(double)count;
204168654Skris			rsa_count=count;
204255714Skris			}
204355714Skris
204455714Skris#if 1
204559194Skris		ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
204668654Skris		if (ret <= 0)
204755714Skris			{
204868654Skris			BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
204968654Skris			ERR_print_errors(bio_err);
205076870Skris			rsa_doit[j] = 0;
205168654Skris			}
205268654Skris		else
205368654Skris			{
205468654Skris			pkey_print_message("public","rsa",
205568654Skris				rsa_c[j][1],rsa_bits[j],
205668654Skris				RSA_SECONDS);
2057110007Smarkm			Time_F(START);
205868654Skris			for (count=0,run=1; COND(rsa_c[j][1]); count++)
205955714Skris				{
206068654Skris				ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
206168654Skris					rsa_num, rsa_key[j]);
2062186872Ssimon				if (ret <= 0)
206368654Skris					{
206468654Skris					BIO_printf(bio_err,
206568654Skris						"RSA verify failure\n");
206668654Skris					ERR_print_errors(bio_err);
206768654Skris					count=1;
206868654Skris					break;
206968654Skris					}
207055714Skris				}
2071110007Smarkm			d=Time_F(STOP);
2072110007Smarkm			BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
2073110007Smarkm				   : "%ld %d bit public RSA's in %.2fs\n",
2074110007Smarkm				   count,rsa_bits[j],d);
207568654Skris			rsa_results[j][1]=d/(double)count;
207655714Skris			}
207755714Skris#endif
207855714Skris
207955714Skris		if (rsa_count <= 1)
208055714Skris			{
208155714Skris			/* if longer than 10s, don't do any more */
208255714Skris			for (j++; j<RSA_NUM; j++)
208355714Skris				rsa_doit[j]=0;
208455714Skris			}
208555714Skris		}
208655714Skris#endif
208755714Skris
208859194Skris	RAND_pseudo_bytes(buf,20);
2089110007Smarkm#ifndef OPENSSL_NO_DSA
209059194Skris	if (RAND_status() != 1)
209159194Skris		{
209259194Skris		RAND_seed(rnd_seed, sizeof rnd_seed);
209359194Skris		rnd_fake = 1;
209459194Skris		}
209555714Skris	for (j=0; j<DSA_NUM; j++)
209655714Skris		{
209755714Skris		unsigned int kk;
209868654Skris		int ret;
209955714Skris
210055714Skris		if (!dsa_doit[j]) continue;
2101110007Smarkm/*		DSA_generate_key(dsa_key[j]); */
210255714Skris/*		DSA_sign_setup(dsa_key[j],NULL); */
210368654Skris		ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
210455714Skris			&kk,dsa_key[j]);
210568654Skris		if (ret == 0)
210655714Skris			{
210768654Skris			BIO_printf(bio_err,"DSA sign failure.  No DSA sign will be done.\n");
210868654Skris			ERR_print_errors(bio_err);
210968654Skris			rsa_count=1;
211068654Skris			}
211168654Skris		else
211268654Skris			{
211368654Skris			pkey_print_message("sign","dsa",
211468654Skris				dsa_c[j][0],dsa_bits[j],
211568654Skris				DSA_SECONDS);
2116110007Smarkm			Time_F(START);
211768654Skris			for (count=0,run=1; COND(dsa_c[j][0]); count++)
211855714Skris				{
211968654Skris				ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
212068654Skris					&kk,dsa_key[j]);
212168654Skris				if (ret == 0)
212268654Skris					{
212368654Skris					BIO_printf(bio_err,
212468654Skris						"DSA sign failure\n");
212568654Skris					ERR_print_errors(bio_err);
212668654Skris					count=1;
212768654Skris					break;
212868654Skris					}
212955714Skris				}
2130110007Smarkm			d=Time_F(STOP);
2131110007Smarkm			BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
2132110007Smarkm				   : "%ld %d bit DSA signs in %.2fs\n",
2133110007Smarkm				   count,dsa_bits[j],d);
213468654Skris			dsa_results[j][0]=d/(double)count;
213568654Skris			rsa_count=count;
213655714Skris			}
213755714Skris
213868654Skris		ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
213955714Skris			kk,dsa_key[j]);
214068654Skris		if (ret <= 0)
214155714Skris			{
214268654Skris			BIO_printf(bio_err,"DSA verify failure.  No DSA verify will be done.\n");
214368654Skris			ERR_print_errors(bio_err);
214468654Skris			dsa_doit[j] = 0;
214568654Skris			}
214668654Skris		else
214768654Skris			{
214868654Skris			pkey_print_message("verify","dsa",
214968654Skris				dsa_c[j][1],dsa_bits[j],
215068654Skris				DSA_SECONDS);
2151110007Smarkm			Time_F(START);
215268654Skris			for (count=0,run=1; COND(dsa_c[j][1]); count++)
215355714Skris				{
215468654Skris				ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
215568654Skris					kk,dsa_key[j]);
215668654Skris				if (ret <= 0)
215768654Skris					{
215868654Skris					BIO_printf(bio_err,
215968654Skris						"DSA verify failure\n");
216068654Skris					ERR_print_errors(bio_err);
216168654Skris					count=1;
216268654Skris					break;
216368654Skris					}
216455714Skris				}
2165110007Smarkm			d=Time_F(STOP);
2166110007Smarkm			BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
2167110007Smarkm				   : "%ld %d bit DSA verify in %.2fs\n",
2168110007Smarkm				   count,dsa_bits[j],d);
216968654Skris			dsa_results[j][1]=d/(double)count;
217055714Skris			}
217155714Skris
217255714Skris		if (rsa_count <= 1)
217355714Skris			{
217455714Skris			/* if longer than 10s, don't do any more */
217555714Skris			for (j++; j<DSA_NUM; j++)
217655714Skris				dsa_doit[j]=0;
217755714Skris			}
217855714Skris		}
217959194Skris	if (rnd_fake) RAND_cleanup();
218055714Skris#endif
2181160817Ssimon
2182160817Ssimon#ifndef OPENSSL_NO_ECDSA
2183160817Ssimon	if (RAND_status() != 1)
2184160817Ssimon		{
2185160817Ssimon		RAND_seed(rnd_seed, sizeof rnd_seed);
2186160817Ssimon		rnd_fake = 1;
2187160817Ssimon		}
2188160817Ssimon	for (j=0; j<EC_NUM; j++)
2189160817Ssimon		{
2190160817Ssimon		int ret;
2191160817Ssimon
2192160817Ssimon		if (!ecdsa_doit[j]) continue; /* Ignore Curve */
2193160817Ssimon		ecdsa[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2194160817Ssimon		if (ecdsa[j] == NULL)
2195160817Ssimon			{
2196160817Ssimon			BIO_printf(bio_err,"ECDSA failure.\n");
2197160817Ssimon			ERR_print_errors(bio_err);
2198160817Ssimon			rsa_count=1;
2199160817Ssimon			}
2200160817Ssimon		else
2201160817Ssimon			{
2202160817Ssimon#if 1
2203160817Ssimon			EC_KEY_precompute_mult(ecdsa[j], NULL);
2204160817Ssimon#endif
2205160817Ssimon			/* Perform ECDSA signature test */
2206160817Ssimon			EC_KEY_generate_key(ecdsa[j]);
2207160817Ssimon			ret = ECDSA_sign(0, buf, 20, ecdsasig,
2208160817Ssimon				&ecdsasiglen, ecdsa[j]);
2209160817Ssimon			if (ret == 0)
2210160817Ssimon				{
2211160817Ssimon				BIO_printf(bio_err,"ECDSA sign failure.  No ECDSA sign will be done.\n");
2212160817Ssimon				ERR_print_errors(bio_err);
2213160817Ssimon				rsa_count=1;
2214160817Ssimon				}
2215160817Ssimon			else
2216160817Ssimon				{
2217160817Ssimon				pkey_print_message("sign","ecdsa",
2218160817Ssimon					ecdsa_c[j][0],
2219160817Ssimon					test_curves_bits[j],
2220160817Ssimon					ECDSA_SECONDS);
2221160817Ssimon
2222160817Ssimon				Time_F(START);
2223160817Ssimon				for (count=0,run=1; COND(ecdsa_c[j][0]);
2224160817Ssimon					count++)
2225160817Ssimon					{
2226160817Ssimon					ret=ECDSA_sign(0, buf, 20,
2227160817Ssimon						ecdsasig, &ecdsasiglen,
2228160817Ssimon						ecdsa[j]);
2229160817Ssimon					if (ret == 0)
2230160817Ssimon						{
2231160817Ssimon						BIO_printf(bio_err, "ECDSA sign failure\n");
2232160817Ssimon						ERR_print_errors(bio_err);
2233160817Ssimon						count=1;
2234160817Ssimon						break;
2235160817Ssimon						}
2236160817Ssimon					}
2237160817Ssimon				d=Time_F(STOP);
2238160817Ssimon
2239160817Ssimon				BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
2240160817Ssimon					"%ld %d bit ECDSA signs in %.2fs \n",
2241160817Ssimon					count, test_curves_bits[j], d);
2242160817Ssimon				ecdsa_results[j][0]=d/(double)count;
2243160817Ssimon				rsa_count=count;
2244160817Ssimon				}
2245160817Ssimon
2246160817Ssimon			/* Perform ECDSA verification test */
2247160817Ssimon			ret=ECDSA_verify(0, buf, 20, ecdsasig,
2248160817Ssimon				ecdsasiglen, ecdsa[j]);
2249160817Ssimon			if (ret != 1)
2250160817Ssimon				{
2251160817Ssimon				BIO_printf(bio_err,"ECDSA verify failure.  No ECDSA verify will be done.\n");
2252160817Ssimon				ERR_print_errors(bio_err);
2253160817Ssimon				ecdsa_doit[j] = 0;
2254160817Ssimon				}
2255160817Ssimon			else
2256160817Ssimon				{
2257160817Ssimon				pkey_print_message("verify","ecdsa",
2258160817Ssimon				ecdsa_c[j][1],
2259160817Ssimon				test_curves_bits[j],
2260160817Ssimon				ECDSA_SECONDS);
2261160817Ssimon				Time_F(START);
2262160817Ssimon				for (count=0,run=1; COND(ecdsa_c[j][1]); count++)
2263160817Ssimon					{
2264160817Ssimon					ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
2265160817Ssimon					if (ret != 1)
2266160817Ssimon						{
2267160817Ssimon						BIO_printf(bio_err, "ECDSA verify failure\n");
2268160817Ssimon						ERR_print_errors(bio_err);
2269160817Ssimon						count=1;
2270160817Ssimon						break;
2271160817Ssimon						}
2272160817Ssimon					}
2273160817Ssimon				d=Time_F(STOP);
2274160817Ssimon				BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
2275160817Ssimon						: "%ld %d bit ECDSA verify in %.2fs\n",
2276160817Ssimon				count, test_curves_bits[j], d);
2277160817Ssimon				ecdsa_results[j][1]=d/(double)count;
2278160817Ssimon				}
2279160817Ssimon
2280160817Ssimon			if (rsa_count <= 1)
2281160817Ssimon				{
2282160817Ssimon				/* if longer than 10s, don't do any more */
2283160817Ssimon				for (j++; j<EC_NUM; j++)
2284160817Ssimon				ecdsa_doit[j]=0;
2285160817Ssimon				}
2286160817Ssimon			}
2287160817Ssimon		}
2288160817Ssimon	if (rnd_fake) RAND_cleanup();
2289160817Ssimon#endif
2290160817Ssimon
2291160817Ssimon#ifndef OPENSSL_NO_ECDH
2292160817Ssimon	if (RAND_status() != 1)
2293160817Ssimon		{
2294160817Ssimon		RAND_seed(rnd_seed, sizeof rnd_seed);
2295160817Ssimon		rnd_fake = 1;
2296160817Ssimon		}
2297160817Ssimon	for (j=0; j<EC_NUM; j++)
2298160817Ssimon		{
2299160817Ssimon		if (!ecdh_doit[j]) continue;
2300160817Ssimon		ecdh_a[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2301160817Ssimon		ecdh_b[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2302160817Ssimon		if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2303160817Ssimon			{
2304160817Ssimon			BIO_printf(bio_err,"ECDH failure.\n");
2305160817Ssimon			ERR_print_errors(bio_err);
2306160817Ssimon			rsa_count=1;
2307160817Ssimon			}
2308160817Ssimon		else
2309160817Ssimon			{
2310160817Ssimon			/* generate two ECDH key pairs */
2311160817Ssimon			if (!EC_KEY_generate_key(ecdh_a[j]) ||
2312160817Ssimon				!EC_KEY_generate_key(ecdh_b[j]))
2313160817Ssimon				{
2314160817Ssimon				BIO_printf(bio_err,"ECDH key generation failure.\n");
2315160817Ssimon				ERR_print_errors(bio_err);
2316160817Ssimon				rsa_count=1;
2317160817Ssimon				}
2318160817Ssimon			else
2319160817Ssimon				{
2320160817Ssimon				/* If field size is not more than 24 octets, then use SHA-1 hash of result;
2321160817Ssimon				 * otherwise, use result (see section 4.8 of draft-ietf-tls-ecc-03.txt).
2322160817Ssimon				 */
2323160817Ssimon				int field_size, outlen;
2324160817Ssimon				void *(*kdf)(const void *in, size_t inlen, void *out, size_t *xoutlen);
2325160817Ssimon				field_size = EC_GROUP_get_degree(EC_KEY_get0_group(ecdh_a[j]));
2326160817Ssimon				if (field_size <= 24 * 8)
2327160817Ssimon					{
2328160817Ssimon					outlen = KDF1_SHA1_len;
2329160817Ssimon					kdf = KDF1_SHA1;
2330160817Ssimon					}
2331160817Ssimon				else
2332160817Ssimon					{
2333160817Ssimon					outlen = (field_size+7)/8;
2334160817Ssimon					kdf = NULL;
2335160817Ssimon					}
2336160817Ssimon				secret_size_a = ECDH_compute_key(secret_a, outlen,
2337160817Ssimon					EC_KEY_get0_public_key(ecdh_b[j]),
2338160817Ssimon					ecdh_a[j], kdf);
2339160817Ssimon				secret_size_b = ECDH_compute_key(secret_b, outlen,
2340160817Ssimon					EC_KEY_get0_public_key(ecdh_a[j]),
2341160817Ssimon					ecdh_b[j], kdf);
2342160817Ssimon				if (secret_size_a != secret_size_b)
2343160817Ssimon					ecdh_checks = 0;
2344160817Ssimon				else
2345160817Ssimon					ecdh_checks = 1;
2346160817Ssimon
2347160817Ssimon				for (secret_idx = 0;
2348160817Ssimon				    (secret_idx < secret_size_a)
2349160817Ssimon					&& (ecdh_checks == 1);
2350160817Ssimon				    secret_idx++)
2351160817Ssimon					{
2352160817Ssimon					if (secret_a[secret_idx] != secret_b[secret_idx])
2353160817Ssimon					ecdh_checks = 0;
2354160817Ssimon					}
2355160817Ssimon
2356160817Ssimon				if (ecdh_checks == 0)
2357160817Ssimon					{
2358160817Ssimon					BIO_printf(bio_err,"ECDH computations don't match.\n");
2359160817Ssimon					ERR_print_errors(bio_err);
2360160817Ssimon					rsa_count=1;
2361160817Ssimon					}
2362160817Ssimon
2363160817Ssimon				pkey_print_message("","ecdh",
2364160817Ssimon				ecdh_c[j][0],
2365160817Ssimon				test_curves_bits[j],
2366160817Ssimon				ECDH_SECONDS);
2367160817Ssimon				Time_F(START);
2368160817Ssimon				for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2369160817Ssimon					{
2370160817Ssimon					ECDH_compute_key(secret_a, outlen,
2371160817Ssimon					EC_KEY_get0_public_key(ecdh_b[j]),
2372160817Ssimon					ecdh_a[j], kdf);
2373160817Ssimon					}
2374160817Ssimon				d=Time_F(STOP);
2375160817Ssimon				BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2376160817Ssimon				count, test_curves_bits[j], d);
2377160817Ssimon				ecdh_results[j][0]=d/(double)count;
2378160817Ssimon				rsa_count=count;
2379160817Ssimon				}
2380160817Ssimon			}
2381160817Ssimon
2382160817Ssimon
2383160817Ssimon		if (rsa_count <= 1)
2384160817Ssimon			{
2385160817Ssimon			/* if longer than 10s, don't do any more */
2386160817Ssimon			for (j++; j<EC_NUM; j++)
2387160817Ssimon			ecdh_doit[j]=0;
2388160817Ssimon			}
2389160817Ssimon		}
2390160817Ssimon	if (rnd_fake) RAND_cleanup();
2391160817Ssimon#endif
2392205128Ssimon#ifndef NO_FORK
2393110007Smarkmshow_res:
2394110007Smarkm#endif
2395110007Smarkm	if(!mr)
2396110007Smarkm		{
2397110007Smarkm		fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
239855714Skris        fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
2399110007Smarkm		printf("options:");
2400110007Smarkm		printf("%s ",BN_options());
2401110007Smarkm#ifndef OPENSSL_NO_MD2
2402110007Smarkm		printf("%s ",MD2_options());
240355714Skris#endif
2404110007Smarkm#ifndef OPENSSL_NO_RC4
2405110007Smarkm		printf("%s ",RC4_options());
240655714Skris#endif
2407110007Smarkm#ifndef OPENSSL_NO_DES
2408110007Smarkm		printf("%s ",DES_options());
240955714Skris#endif
2410110007Smarkm#ifndef OPENSSL_NO_AES
2411110007Smarkm		printf("%s ",AES_options());
241255714Skris#endif
2413110007Smarkm#ifndef OPENSSL_NO_IDEA
2414110007Smarkm		printf("%s ",idea_options());
241555714Skris#endif
2416110007Smarkm#ifndef OPENSSL_NO_BF
2417110007Smarkm		printf("%s ",BF_options());
2418110007Smarkm#endif
2419110007Smarkm		fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2420160817Ssimon		}
242155714Skris
242255714Skris	if (pr_header)
242355714Skris		{
2424110007Smarkm		if(mr)
2425110007Smarkm			fprintf(stdout,"+H");
2426110007Smarkm		else
2427110007Smarkm			{
2428110007Smarkm			fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
2429110007Smarkm			fprintf(stdout,"type        ");
2430110007Smarkm			}
243155714Skris		for (j=0;  j<SIZE_NUM; j++)
2432110007Smarkm			fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
243355714Skris		fprintf(stdout,"\n");
243455714Skris		}
243555714Skris
243655714Skris	for (k=0; k<ALGOR_NUM; k++)
243755714Skris		{
243855714Skris		if (!doit[k]) continue;
2439110007Smarkm		if(mr)
2440110007Smarkm			fprintf(stdout,"+F:%d:%s",k,names[k]);
2441110007Smarkm		else
2442110007Smarkm			fprintf(stdout,"%-13s",names[k]);
244355714Skris		for (j=0; j<SIZE_NUM; j++)
244455714Skris			{
2445110007Smarkm			if (results[k][j] > 10000 && !mr)
244655714Skris				fprintf(stdout," %11.2fk",results[k][j]/1e3);
244755714Skris			else
2448110007Smarkm				fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
244955714Skris			}
245055714Skris		fprintf(stdout,"\n");
245155714Skris		}
2452110007Smarkm#ifndef OPENSSL_NO_RSA
245355714Skris	j=1;
245455714Skris	for (k=0; k<RSA_NUM; k++)
245555714Skris		{
245655714Skris		if (!rsa_doit[k]) continue;
2457110007Smarkm		if (j && !mr)
245855714Skris			{
245955714Skris			printf("%18ssign    verify    sign/s verify/s\n"," ");
246055714Skris			j=0;
246155714Skris			}
2462110007Smarkm		if(mr)
2463110007Smarkm			fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2464110007Smarkm				k,rsa_bits[k],rsa_results[k][0],
2465110007Smarkm				rsa_results[k][1]);
2466110007Smarkm		else
2467160817Ssimon			fprintf(stdout,"rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2468110007Smarkm				rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2469110007Smarkm				1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
247055714Skris		}
247155714Skris#endif
2472110007Smarkm#ifndef OPENSSL_NO_DSA
247355714Skris	j=1;
247455714Skris	for (k=0; k<DSA_NUM; k++)
247555714Skris		{
247655714Skris		if (!dsa_doit[k]) continue;
2477110007Smarkm		if (j && !mr)
2478110007Smarkm			{
247955714Skris			printf("%18ssign    verify    sign/s verify/s\n"," ");
248055714Skris			j=0;
248155714Skris			}
2482110007Smarkm		if(mr)
2483110007Smarkm			fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2484110007Smarkm				k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2485110007Smarkm		else
2486160817Ssimon			fprintf(stdout,"dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2487110007Smarkm				dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2488110007Smarkm				1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
248955714Skris		}
249055714Skris#endif
2491160817Ssimon#ifndef OPENSSL_NO_ECDSA
2492160817Ssimon	j=1;
2493160817Ssimon	for (k=0; k<EC_NUM; k++)
2494160817Ssimon		{
2495160817Ssimon		if (!ecdsa_doit[k]) continue;
2496160817Ssimon		if (j && !mr)
2497160817Ssimon			{
2498160817Ssimon			printf("%30ssign    verify    sign/s verify/s\n"," ");
2499160817Ssimon			j=0;
2500160817Ssimon			}
2501160817Ssimon
2502160817Ssimon		if (mr)
2503160817Ssimon			fprintf(stdout,"+F4:%u:%u:%f:%f\n",
2504160817Ssimon				k, test_curves_bits[k],
2505160817Ssimon				ecdsa_results[k][0],ecdsa_results[k][1]);
2506160817Ssimon		else
2507160817Ssimon			fprintf(stdout,
2508160817Ssimon				"%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2509160817Ssimon				test_curves_bits[k],
2510160817Ssimon				test_curves_names[k],
2511160817Ssimon				ecdsa_results[k][0],ecdsa_results[k][1],
2512160817Ssimon				1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2513160817Ssimon		}
2514160817Ssimon#endif
2515160817Ssimon
2516160817Ssimon
2517160817Ssimon#ifndef OPENSSL_NO_ECDH
2518160817Ssimon	j=1;
2519160817Ssimon	for (k=0; k<EC_NUM; k++)
2520160817Ssimon		{
2521160817Ssimon		if (!ecdh_doit[k]) continue;
2522160817Ssimon		if (j && !mr)
2523160817Ssimon			{
2524160817Ssimon			printf("%30sop      op/s\n"," ");
2525160817Ssimon			j=0;
2526160817Ssimon			}
2527160817Ssimon		if (mr)
2528160817Ssimon			fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2529160817Ssimon				k, test_curves_bits[k],
2530160817Ssimon				ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2531160817Ssimon
2532160817Ssimon		else
2533160817Ssimon			fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2534160817Ssimon				test_curves_bits[k],
2535160817Ssimon				test_curves_names[k],
2536160817Ssimon				ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2537160817Ssimon		}
2538160817Ssimon#endif
2539160817Ssimon
254059194Skris	mret=0;
2541160817Ssimon
254255714Skrisend:
2543110007Smarkm	ERR_print_errors(bio_err);
254468654Skris	if (buf != NULL) OPENSSL_free(buf);
254568654Skris	if (buf2 != NULL) OPENSSL_free(buf2);
2546110007Smarkm#ifndef OPENSSL_NO_RSA
254755714Skris	for (i=0; i<RSA_NUM; i++)
254855714Skris		if (rsa_key[i] != NULL)
254955714Skris			RSA_free(rsa_key[i]);
255055714Skris#endif
2551110007Smarkm#ifndef OPENSSL_NO_DSA
255255714Skris	for (i=0; i<DSA_NUM; i++)
255355714Skris		if (dsa_key[i] != NULL)
255455714Skris			DSA_free(dsa_key[i]);
255555714Skris#endif
2556160817Ssimon
2557160817Ssimon#ifndef OPENSSL_NO_ECDSA
2558160817Ssimon	for (i=0; i<EC_NUM; i++)
2559160817Ssimon		if (ecdsa[i] != NULL)
2560160817Ssimon			EC_KEY_free(ecdsa[i]);
2561160817Ssimon#endif
2562160817Ssimon#ifndef OPENSSL_NO_ECDH
2563160817Ssimon	for (i=0; i<EC_NUM; i++)
2564160817Ssimon	{
2565160817Ssimon		if (ecdh_a[i] != NULL)
2566160817Ssimon			EC_KEY_free(ecdh_a[i]);
2567160817Ssimon		if (ecdh_b[i] != NULL)
2568160817Ssimon			EC_KEY_free(ecdh_b[i]);
2569160817Ssimon	}
2570160817Ssimon#endif
2571160817Ssimon
2572110007Smarkm	apps_shutdown();
2573110007Smarkm	OPENSSL_EXIT(mret);
257455714Skris	}
257555714Skris
2576110007Smarkmstatic void print_message(const char *s, long num, int length)
257755714Skris	{
257855714Skris#ifdef SIGALRM
2579110007Smarkm	BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2580110007Smarkm		   : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
258155714Skris	(void)BIO_flush(bio_err);
258255714Skris	alarm(SECONDS);
258355714Skris#else
2584110007Smarkm	BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2585110007Smarkm		   : "Doing %s %ld times on %d size blocks: ",s,num,length);
258655714Skris	(void)BIO_flush(bio_err);
258755714Skris#endif
258855714Skris#ifdef LINT
258955714Skris	num=num;
259055714Skris#endif
259155714Skris	}
259255714Skris
2593160817Ssimonstatic void pkey_print_message(const char *str, const char *str2, long num,
2594160817Ssimon	int bits, int tm)
259555714Skris	{
259655714Skris#ifdef SIGALRM
2597110007Smarkm	BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2598110007Smarkm			   : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
259955714Skris	(void)BIO_flush(bio_err);
2600238405Sjkim	alarm(tm);
260155714Skris#else
2602110007Smarkm	BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2603110007Smarkm			   : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
260455714Skris	(void)BIO_flush(bio_err);
260555714Skris#endif
260655714Skris#ifdef LINT
260755714Skris	num=num;
260855714Skris#endif
260955714Skris	}
261055714Skris
2611110007Smarkmstatic void print_result(int alg,int run_no,int count,double time_used)
2612110007Smarkm	{
2613160817Ssimon	BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n"
2614160817Ssimon		   : "%d %s's in %.2fs\n",count,names[alg],time_used);
2615110007Smarkm	results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2616110007Smarkm	}
2617110007Smarkm
2618205128Ssimon#ifndef NO_FORK
2619110007Smarkmstatic char *sstrsep(char **string, const char *delim)
2620110007Smarkm    {
2621110007Smarkm    char isdelim[256];
2622110007Smarkm    char *token = *string;
2623110007Smarkm
2624110007Smarkm    if (**string == 0)
2625110007Smarkm        return NULL;
2626110007Smarkm
2627110007Smarkm    memset(isdelim, 0, sizeof isdelim);
2628110007Smarkm    isdelim[0] = 1;
2629110007Smarkm
2630110007Smarkm    while (*delim)
2631110007Smarkm        {
2632110007Smarkm        isdelim[(unsigned char)(*delim)] = 1;
2633110007Smarkm        delim++;
2634110007Smarkm        }
2635110007Smarkm
2636110007Smarkm    while (!isdelim[(unsigned char)(**string)])
2637110007Smarkm        {
2638110007Smarkm        (*string)++;
2639110007Smarkm        }
2640110007Smarkm
2641110007Smarkm    if (**string)
2642110007Smarkm        {
2643110007Smarkm        **string = 0;
2644110007Smarkm        (*string)++;
2645110007Smarkm        }
2646110007Smarkm
2647110007Smarkm    return token;
2648110007Smarkm    }
2649110007Smarkm
2650110007Smarkmstatic int do_multi(int multi)
2651110007Smarkm	{
2652110007Smarkm	int n;
2653110007Smarkm	int fd[2];
2654110007Smarkm	int *fds;
2655110007Smarkm	static char sep[]=":";
2656110007Smarkm
2657110007Smarkm	fds=malloc(multi*sizeof *fds);
2658110007Smarkm	for(n=0 ; n < multi ; ++n)
2659110007Smarkm		{
2660238405Sjkim		if (pipe(fd) == -1)
2661238405Sjkim			{
2662238405Sjkim			fprintf(stderr, "pipe failure\n");
2663238405Sjkim			exit(1);
2664238405Sjkim			}
2665194206Ssimon		fflush(stdout);
2666194206Ssimon		fflush(stderr);
2667110007Smarkm		if(fork())
2668110007Smarkm			{
2669110007Smarkm			close(fd[1]);
2670110007Smarkm			fds[n]=fd[0];
2671110007Smarkm			}
2672110007Smarkm		else
2673110007Smarkm			{
2674110007Smarkm			close(fd[0]);
2675110007Smarkm			close(1);
2676238405Sjkim			if (dup(fd[1]) == -1)
2677238405Sjkim				{
2678238405Sjkim				fprintf(stderr, "dup failed\n");
2679238405Sjkim				exit(1);
2680238405Sjkim				}
2681110007Smarkm			close(fd[1]);
2682110007Smarkm			mr=1;
2683110007Smarkm			usertime=0;
2684238405Sjkim			free(fds);
2685110007Smarkm			return 0;
2686110007Smarkm			}
2687110007Smarkm		printf("Forked child %d\n",n);
2688110007Smarkm		}
2689110007Smarkm
2690110007Smarkm	/* for now, assume the pipe is long enough to take all the output */
2691110007Smarkm	for(n=0 ; n < multi ; ++n)
2692110007Smarkm		{
2693110007Smarkm		FILE *f;
2694110007Smarkm		char buf[1024];
2695110007Smarkm		char *p;
2696110007Smarkm
2697110007Smarkm		f=fdopen(fds[n],"r");
2698110007Smarkm		while(fgets(buf,sizeof buf,f))
2699110007Smarkm			{
2700110007Smarkm			p=strchr(buf,'\n');
2701110007Smarkm			if(p)
2702110007Smarkm				*p='\0';
2703110007Smarkm			if(buf[0] != '+')
2704110007Smarkm				{
2705110007Smarkm				fprintf(stderr,"Don't understand line '%s' from child %d\n",
2706110007Smarkm						buf,n);
2707110007Smarkm				continue;
2708110007Smarkm				}
2709110007Smarkm			printf("Got: %s from %d\n",buf,n);
2710110007Smarkm			if(!strncmp(buf,"+F:",3))
2711110007Smarkm				{
2712110007Smarkm				int alg;
2713110007Smarkm				int j;
2714110007Smarkm
2715110007Smarkm				p=buf+3;
2716110007Smarkm				alg=atoi(sstrsep(&p,sep));
2717110007Smarkm				sstrsep(&p,sep);
2718110007Smarkm				for(j=0 ; j < SIZE_NUM ; ++j)
2719110007Smarkm					results[alg][j]+=atof(sstrsep(&p,sep));
2720110007Smarkm				}
2721110007Smarkm			else if(!strncmp(buf,"+F2:",4))
2722110007Smarkm				{
2723110007Smarkm				int k;
2724110007Smarkm				double d;
2725110007Smarkm
2726110007Smarkm				p=buf+4;
2727110007Smarkm				k=atoi(sstrsep(&p,sep));
2728110007Smarkm				sstrsep(&p,sep);
2729110007Smarkm
2730110007Smarkm				d=atof(sstrsep(&p,sep));
2731110007Smarkm				if(n)
2732110007Smarkm					rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2733110007Smarkm				else
2734110007Smarkm					rsa_results[k][0]=d;
2735110007Smarkm
2736110007Smarkm				d=atof(sstrsep(&p,sep));
2737110007Smarkm				if(n)
2738110007Smarkm					rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2739110007Smarkm				else
2740110007Smarkm					rsa_results[k][1]=d;
2741110007Smarkm				}
2742238405Sjkim#ifndef OPENSSL_NO_DSA
2743110007Smarkm			else if(!strncmp(buf,"+F3:",4))
2744110007Smarkm				{
2745110007Smarkm				int k;
2746110007Smarkm				double d;
2747110007Smarkm
2748110007Smarkm				p=buf+4;
2749110007Smarkm				k=atoi(sstrsep(&p,sep));
2750110007Smarkm				sstrsep(&p,sep);
2751110007Smarkm
2752110007Smarkm				d=atof(sstrsep(&p,sep));
2753110007Smarkm				if(n)
2754110007Smarkm					dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2755110007Smarkm				else
2756110007Smarkm					dsa_results[k][0]=d;
2757110007Smarkm
2758110007Smarkm				d=atof(sstrsep(&p,sep));
2759110007Smarkm				if(n)
2760110007Smarkm					dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2761110007Smarkm				else
2762110007Smarkm					dsa_results[k][1]=d;
2763110007Smarkm				}
2764238405Sjkim#endif
2765160817Ssimon#ifndef OPENSSL_NO_ECDSA
2766160817Ssimon			else if(!strncmp(buf,"+F4:",4))
2767160817Ssimon				{
2768160817Ssimon				int k;
2769160817Ssimon				double d;
2770160817Ssimon
2771160817Ssimon				p=buf+4;
2772160817Ssimon				k=atoi(sstrsep(&p,sep));
2773160817Ssimon				sstrsep(&p,sep);
2774160817Ssimon
2775160817Ssimon				d=atof(sstrsep(&p,sep));
2776160817Ssimon				if(n)
2777160817Ssimon					ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2778160817Ssimon				else
2779160817Ssimon					ecdsa_results[k][0]=d;
2780160817Ssimon
2781160817Ssimon				d=atof(sstrsep(&p,sep));
2782160817Ssimon				if(n)
2783160817Ssimon					ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2784160817Ssimon				else
2785160817Ssimon					ecdsa_results[k][1]=d;
2786160817Ssimon				}
2787160817Ssimon#endif
2788160817Ssimon
2789160817Ssimon#ifndef OPENSSL_NO_ECDH
2790160817Ssimon			else if(!strncmp(buf,"+F5:",4))
2791160817Ssimon				{
2792160817Ssimon				int k;
2793160817Ssimon				double d;
2794160817Ssimon
2795160817Ssimon				p=buf+4;
2796160817Ssimon				k=atoi(sstrsep(&p,sep));
2797160817Ssimon				sstrsep(&p,sep);
2798160817Ssimon
2799160817Ssimon				d=atof(sstrsep(&p,sep));
2800160817Ssimon				if(n)
2801160817Ssimon					ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2802160817Ssimon				else
2803160817Ssimon					ecdh_results[k][0]=d;
2804160817Ssimon
2805160817Ssimon				}
2806160817Ssimon#endif
2807160817Ssimon
2808110007Smarkm			else if(!strncmp(buf,"+H:",3))
2809110007Smarkm				{
2810110007Smarkm				}
2811110007Smarkm			else
2812110007Smarkm				fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);
2813110007Smarkm			}
2814238405Sjkim
2815238405Sjkim		fclose(f);
2816110007Smarkm		}
2817238405Sjkim	free(fds);
2818110007Smarkm	return 1;
2819110007Smarkm	}
2820110007Smarkm#endif
2821111150Snectar#endif
2822