speed.c revision 142428
1/* apps/speed.c -*- mode:C; c-file-style: "eay" -*- */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to.  The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 *    notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 *    notice, this list of conditions and the following disclaimer in the
30 *    documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 *    must display the following acknowledgement:
33 *    "This product includes cryptographic software written by
34 *     Eric Young (eay@cryptsoft.com)"
35 *    The word 'cryptographic' can be left out if the rouines from the library
36 *    being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 *    the apps directory (application code) you must include an acknowledgement:
39 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed.  i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59/* most of this code has been pilfered from my libdes speed.c program */
60
61#ifndef OPENSSL_NO_SPEED
62
63#undef SECONDS
64#define SECONDS		3
65#define RSA_SECONDS	10
66#define DSA_SECONDS	10
67
68/* 11-Sep-92 Andrew Daviel   Support for Silicon Graphics IRIX added */
69/* 06-Apr-92 Luke Brennan    Support for VMS and add extra signal calls */
70
71#undef PROG
72#define PROG speed_main
73
74#include <stdio.h>
75#include <stdlib.h>
76#include <signal.h>
77#include <string.h>
78#include <math.h>
79#include "apps.h"
80#ifdef OPENSSL_NO_STDIO
81#define APPS_WIN16
82#endif
83#include <openssl/crypto.h>
84#include <openssl/rand.h>
85#include <openssl/err.h>
86#include <openssl/evp.h>
87#include <openssl/objects.h>
88#if !defined(OPENSSL_SYS_MSDOS)
89#include OPENSSL_UNISTD
90#endif
91
92#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
93# define USE_TOD
94#elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
95# define TIMES
96#endif
97#if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_MPE) && !defined(__NetBSD__) && !defined(OPENSSL_SYS_VXWORKS) /* FIXME */
98# define TIMEB
99#endif
100
101#ifndef _IRIX
102# include <time.h>
103#endif
104#ifdef TIMES
105# include <sys/types.h>
106# include <sys/times.h>
107#endif
108#ifdef USE_TOD
109# include <sys/time.h>
110# include <sys/resource.h>
111#endif
112
113/* Depending on the VMS version, the tms structure is perhaps defined.
114   The __TMS macro will show if it was.  If it wasn't defined, we should
115   undefine TIMES, since that tells the rest of the program how things
116   should be handled.				-- Richard Levitte */
117#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
118#undef TIMES
119#endif
120
121#ifdef TIMEB
122#include <sys/timeb.h>
123#endif
124
125#if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS)
126#error "It seems neither struct tms nor struct timeb is supported in this platform!"
127#endif
128
129#if defined(sun) || defined(__ultrix)
130#define _POSIX_SOURCE
131#include <limits.h>
132#include <sys/param.h>
133#endif
134
135#ifndef OPENSSL_NO_DES
136#include <openssl/des.h>
137#endif
138#ifndef OPENSSL_NO_AES
139#include <openssl/aes.h>
140#endif
141#ifndef OPENSSL_NO_MD2
142#include <openssl/md2.h>
143#endif
144#ifndef OPENSSL_NO_MDC2
145#include <openssl/mdc2.h>
146#endif
147#ifndef OPENSSL_NO_MD4
148#include <openssl/md4.h>
149#endif
150#ifndef OPENSSL_NO_MD5
151#include <openssl/md5.h>
152#endif
153#ifndef OPENSSL_NO_HMAC
154#include <openssl/hmac.h>
155#endif
156#include <openssl/evp.h>
157#ifndef OPENSSL_NO_SHA
158#include <openssl/sha.h>
159#endif
160#ifndef OPENSSL_NO_RIPEMD
161#include <openssl/ripemd.h>
162#endif
163#ifndef OPENSSL_NO_RC4
164#include <openssl/rc4.h>
165#endif
166#ifndef OPENSSL_NO_RC5
167#include <openssl/rc5.h>
168#endif
169#ifndef OPENSSL_NO_RC2
170#include <openssl/rc2.h>
171#endif
172#ifndef OPENSSL_NO_IDEA
173#include <openssl/idea.h>
174#endif
175#ifndef OPENSSL_NO_BF
176#include <openssl/blowfish.h>
177#endif
178#ifndef OPENSSL_NO_CAST
179#include <openssl/cast.h>
180#endif
181#ifndef OPENSSL_NO_RSA
182#include <openssl/rsa.h>
183#include "./testrsa.h"
184#endif
185#include <openssl/x509.h>
186#ifndef OPENSSL_NO_DSA
187#include "./testdsa.h"
188#endif
189
190/* The following if from times(3) man page.  It may need to be changed */
191#ifndef HZ
192# if defined(_SC_CLK_TCK) \
193     && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000)
194#  define HZ ((double)sysconf(_SC_CLK_TCK))
195# else
196#  ifndef CLK_TCK
197#   ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
198#    define HZ	100.0
199#   else /* _BSD_CLK_TCK_ */
200#    define HZ ((double)_BSD_CLK_TCK_)
201#   endif
202#  else /* CLK_TCK */
203#   define HZ ((double)CLK_TCK)
204#  endif
205# endif
206#endif
207
208#if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
209# define HAVE_FORK 1
210#endif
211
212#undef BUFSIZE
213#define BUFSIZE	((long)1024*8+1)
214int run=0;
215
216static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
217static int mr=0;
218static int usertime=1;
219
220static double Time_F(int s);
221static void print_message(const char *s,long num,int length);
222static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
223static void print_result(int alg,int run_no,int count,double time_used);
224#ifdef HAVE_FORK
225static int do_multi(int multi);
226#endif
227
228#define ALGOR_NUM	19
229#define SIZE_NUM	5
230#define RSA_NUM		4
231#define DSA_NUM		3
232static const char *names[ALGOR_NUM]={
233  "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
234  "des cbc","des ede3","idea cbc",
235  "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
236  "aes-128 cbc","aes-192 cbc","aes-256 cbc"};
237static double results[ALGOR_NUM][SIZE_NUM];
238static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
239static double rsa_results[RSA_NUM][2];
240static double dsa_results[DSA_NUM][2];
241
242#ifdef SIGALRM
243#if defined(__STDC__) || defined(sgi) || defined(_AIX)
244#define SIGRETTYPE void
245#else
246#define SIGRETTYPE int
247#endif
248
249static SIGRETTYPE sig_done(int sig);
250static SIGRETTYPE sig_done(int sig)
251	{
252	signal(SIGALRM,sig_done);
253	run=0;
254#ifdef LINT
255	sig=sig;
256#endif
257	}
258#endif
259
260#define START	0
261#define STOP	1
262
263static double Time_F(int s)
264	{
265	double ret;
266
267#ifdef USE_TOD
268	if(usertime)
269	    {
270		static struct rusage tstart,tend;
271
272		getrusage_used = 1;
273		if (s == START)
274			{
275			getrusage(RUSAGE_SELF,&tstart);
276			return(0);
277			}
278		else
279			{
280			long i;
281
282			getrusage(RUSAGE_SELF,&tend);
283			i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
284			ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
285			  +((double)i)/1000000.0;
286			return((ret < 0.001)?0.001:ret);
287			}
288		}
289	else
290		{
291		static struct timeval tstart,tend;
292		long i;
293
294		gettimeofday_used = 1;
295		if (s == START)
296			{
297			gettimeofday(&tstart,NULL);
298			return(0);
299			}
300		else
301			{
302			gettimeofday(&tend,NULL);
303			i=(long)tend.tv_usec-(long)tstart.tv_usec;
304			ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
305			return((ret < 0.001)?0.001:ret);
306			}
307		}
308#else  /* ndef USE_TOD */
309
310# ifdef TIMES
311	if (usertime)
312		{
313		static struct tms tstart,tend;
314
315		times_used = 1;
316		if (s == START)
317			{
318			times(&tstart);
319			return(0);
320			}
321		else
322			{
323			times(&tend);
324			ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
325			return((ret < 1e-3)?1e-3:ret);
326			}
327		}
328# endif /* times() */
329# if defined(TIMES) && defined(TIMEB)
330	else
331# endif
332# ifdef OPENSSL_SYS_VXWORKS
333                {
334		static unsigned long tick_start, tick_end;
335
336		if( s == START )
337			{
338			tick_start = tickGet();
339			return 0;
340			}
341		else
342			{
343			tick_end = tickGet();
344			ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
345			return((ret < 0.001)?0.001:ret);
346			}
347                }
348# elif defined(TIMEB)
349		{
350		static struct timeb tstart,tend;
351		long i;
352
353		ftime_used = 1;
354		if (s == START)
355			{
356			ftime(&tstart);
357			return(0);
358			}
359		else
360			{
361			ftime(&tend);
362			i=(long)tend.millitm-(long)tstart.millitm;
363			ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
364			return((ret < 0.001)?0.001:ret);
365			}
366		}
367# endif
368#endif
369	}
370
371int MAIN(int, char **);
372
373int MAIN(int argc, char **argv)
374	{
375#ifndef OPENSSL_NO_ENGINE
376	ENGINE *e = NULL;
377#endif
378	unsigned char *buf=NULL,*buf2=NULL;
379	int mret=1;
380	long count=0,save_count=0;
381	int i,j,k;
382#if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
383	long rsa_count;
384#endif
385#ifndef OPENSSL_NO_RSA
386	unsigned rsa_num;
387#endif
388	unsigned char md[EVP_MAX_MD_SIZE];
389#ifndef OPENSSL_NO_MD2
390	unsigned char md2[MD2_DIGEST_LENGTH];
391#endif
392#ifndef OPENSSL_NO_MDC2
393	unsigned char mdc2[MDC2_DIGEST_LENGTH];
394#endif
395#ifndef OPENSSL_NO_MD4
396	unsigned char md4[MD4_DIGEST_LENGTH];
397#endif
398#ifndef OPENSSL_NO_MD5
399	unsigned char md5[MD5_DIGEST_LENGTH];
400	unsigned char hmac[MD5_DIGEST_LENGTH];
401#endif
402#ifndef OPENSSL_NO_SHA
403	unsigned char sha[SHA_DIGEST_LENGTH];
404#endif
405#ifndef OPENSSL_NO_RIPEMD
406	unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
407#endif
408#ifndef OPENSSL_NO_RC4
409	RC4_KEY rc4_ks;
410#endif
411#ifndef OPENSSL_NO_RC5
412	RC5_32_KEY rc5_ks;
413#endif
414#ifndef OPENSSL_NO_RC2
415	RC2_KEY rc2_ks;
416#endif
417#ifndef OPENSSL_NO_IDEA
418	IDEA_KEY_SCHEDULE idea_ks;
419#endif
420#ifndef OPENSSL_NO_BF
421	BF_KEY bf_ks;
422#endif
423#ifndef OPENSSL_NO_CAST
424	CAST_KEY cast_ks;
425#endif
426	static const unsigned char key16[16]=
427		{0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
428		 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
429	static const unsigned char key24[24]=
430		{0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
431		 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
432		 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
433	static const unsigned char key32[32]=
434		{0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
435		 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
436		 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
437		 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
438#ifndef OPENSSL_NO_AES
439#define MAX_BLOCK_SIZE 128
440#else
441#define MAX_BLOCK_SIZE 64
442#endif
443	unsigned char DES_iv[8];
444	unsigned char iv[MAX_BLOCK_SIZE/8];
445#ifndef OPENSSL_NO_DES
446	DES_cblock *buf_as_des_cblock = NULL;
447	static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
448	static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
449	static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
450	DES_key_schedule sch;
451	DES_key_schedule sch2;
452	DES_key_schedule sch3;
453#endif
454#ifndef OPENSSL_NO_AES
455	AES_KEY aes_ks1, aes_ks2, aes_ks3;
456#endif
457#define	D_MD2		0
458#define	D_MDC2		1
459#define	D_MD4		2
460#define	D_MD5		3
461#define	D_HMAC		4
462#define	D_SHA1		5
463#define D_RMD160	6
464#define	D_RC4		7
465#define	D_CBC_DES	8
466#define	D_EDE3_DES	9
467#define	D_CBC_IDEA	10
468#define	D_CBC_RC2	11
469#define	D_CBC_RC5	12
470#define	D_CBC_BF	13
471#define	D_CBC_CAST	14
472#define D_CBC_128_AES	15
473#define D_CBC_192_AES	16
474#define D_CBC_256_AES	17
475#define D_EVP		18
476	double d=0.0;
477	long c[ALGOR_NUM][SIZE_NUM];
478#define	R_DSA_512	0
479#define	R_DSA_1024	1
480#define	R_DSA_2048	2
481#define	R_RSA_512	0
482#define	R_RSA_1024	1
483#define	R_RSA_2048	2
484#define	R_RSA_4096	3
485#ifndef OPENSSL_NO_RSA
486	RSA *rsa_key[RSA_NUM];
487	long rsa_c[RSA_NUM][2];
488	static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
489	static unsigned char *rsa_data[RSA_NUM]=
490		{test512,test1024,test2048,test4096};
491	static int rsa_data_length[RSA_NUM]={
492		sizeof(test512),sizeof(test1024),
493		sizeof(test2048),sizeof(test4096)};
494#endif
495#ifndef OPENSSL_NO_DSA
496	DSA *dsa_key[DSA_NUM];
497	long dsa_c[DSA_NUM][2];
498	static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
499#endif
500	int rsa_doit[RSA_NUM];
501	int dsa_doit[DSA_NUM];
502	int doit[ALGOR_NUM];
503	int pr_header=0;
504	const EVP_CIPHER *evp_cipher=NULL;
505	const EVP_MD *evp_md=NULL;
506	int decrypt=0;
507#ifdef HAVE_FORK
508	int multi=0;
509#endif
510
511#ifndef TIMES
512	usertime=-1;
513#endif
514
515	apps_startup();
516	memset(results, 0, sizeof(results));
517#ifndef OPENSSL_NO_DSA
518	memset(dsa_key,0,sizeof(dsa_key));
519#endif
520
521	if (bio_err == NULL)
522		if ((bio_err=BIO_new(BIO_s_file())) != NULL)
523			BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
524
525	if (!load_config(bio_err, NULL))
526		goto end;
527
528#ifndef OPENSSL_NO_RSA
529	memset(rsa_key,0,sizeof(rsa_key));
530	for (i=0; i<RSA_NUM; i++)
531		rsa_key[i]=NULL;
532#endif
533
534	if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
535		{
536		BIO_printf(bio_err,"out of memory\n");
537		goto end;
538		}
539#ifndef OPENSSL_NO_DES
540	buf_as_des_cblock = (DES_cblock *)buf;
541#endif
542	if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
543		{
544		BIO_printf(bio_err,"out of memory\n");
545		goto end;
546		}
547
548	memset(c,0,sizeof(c));
549	memset(DES_iv,0,sizeof(DES_iv));
550	memset(iv,0,sizeof(iv));
551
552	for (i=0; i<ALGOR_NUM; i++)
553		doit[i]=0;
554	for (i=0; i<RSA_NUM; i++)
555		rsa_doit[i]=0;
556	for (i=0; i<DSA_NUM; i++)
557		dsa_doit[i]=0;
558
559	j=0;
560	argc--;
561	argv++;
562	while (argc)
563		{
564		if	((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
565			{
566			usertime = 0;
567			j--;	/* Otherwise, -elapsed gets confused with
568				   an algorithm. */
569			}
570		else if	((argc > 0) && (strcmp(*argv,"-evp") == 0))
571			{
572			argc--;
573			argv++;
574			if(argc == 0)
575				{
576				BIO_printf(bio_err,"no EVP given\n");
577				goto end;
578				}
579			evp_cipher=EVP_get_cipherbyname(*argv);
580			if(!evp_cipher)
581				{
582				evp_md=EVP_get_digestbyname(*argv);
583				}
584			if(!evp_cipher && !evp_md)
585				{
586				BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
587				goto end;
588				}
589			doit[D_EVP]=1;
590			}
591		else if (argc > 0 && !strcmp(*argv,"-decrypt"))
592			{
593			decrypt=1;
594			j--;	/* Otherwise, -elapsed gets confused with
595				   an algorithm. */
596			}
597#ifndef OPENSSL_NO_ENGINE
598		else if	((argc > 0) && (strcmp(*argv,"-engine") == 0))
599			{
600			argc--;
601			argv++;
602			if(argc == 0)
603				{
604				BIO_printf(bio_err,"no engine given\n");
605				goto end;
606				}
607                        e = setup_engine(bio_err, *argv, 0);
608			/* j will be increased again further down.  We just
609			   don't want speed to confuse an engine with an
610			   algorithm, especially when none is given (which
611			   means all of them should be run) */
612			j--;
613			}
614#endif
615#ifdef HAVE_FORK
616		else if	((argc > 0) && (strcmp(*argv,"-multi") == 0))
617			{
618			argc--;
619			argv++;
620			if(argc == 0)
621				{
622				BIO_printf(bio_err,"no multi count given\n");
623				goto end;
624				}
625			multi=atoi(argv[0]);
626			if(multi <= 0)
627			    {
628				BIO_printf(bio_err,"bad multi count\n");
629				goto end;
630				}
631			j--;	/* Otherwise, -mr gets confused with
632				   an algorithm. */
633			}
634#endif
635		else if (argc > 0 && !strcmp(*argv,"-mr"))
636			{
637			mr=1;
638			j--;	/* Otherwise, -mr gets confused with
639				   an algorithm. */
640			}
641		else
642#ifndef OPENSSL_NO_MD2
643		if	(strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
644		else
645#endif
646#ifndef OPENSSL_NO_MDC2
647			if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
648		else
649#endif
650#ifndef OPENSSL_NO_MD4
651			if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
652		else
653#endif
654#ifndef OPENSSL_NO_MD5
655			if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
656		else
657#endif
658#ifndef OPENSSL_NO_MD5
659			if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
660		else
661#endif
662#ifndef OPENSSL_NO_SHA
663			if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
664		else
665			if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
666		else
667#endif
668#ifndef OPENSSL_NO_RIPEMD
669			if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
670		else
671			if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
672		else
673			if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
674		else
675#endif
676#ifndef OPENSSL_NO_RC4
677			if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
678		else
679#endif
680#ifndef OPENSSL_NO_DES
681			if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
682		else	if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
683		else
684#endif
685#ifndef OPENSSL_NO_AES
686			if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
687		else	if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
688		else	if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
689		else
690#endif
691#ifndef OPENSSL_NO_RSA
692#if 0 /* was: #ifdef RSAref */
693			if (strcmp(*argv,"rsaref") == 0)
694			{
695			RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
696			j--;
697			}
698		else
699#endif
700#ifndef RSA_NULL
701			if (strcmp(*argv,"openssl") == 0)
702			{
703			RSA_set_default_method(RSA_PKCS1_SSLeay());
704			j--;
705			}
706		else
707#endif
708#endif /* !OPENSSL_NO_RSA */
709		     if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
710		else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
711		else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
712		else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
713		else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
714		else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
715		else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
716		else
717#ifndef OPENSSL_NO_RC2
718		     if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
719		else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
720		else
721#endif
722#ifndef OPENSSL_NO_RC5
723		     if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
724		else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
725		else
726#endif
727#ifndef OPENSSL_NO_IDEA
728		     if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
729		else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
730		else
731#endif
732#ifndef OPENSSL_NO_BF
733		     if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
734		else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
735		else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
736		else
737#endif
738#ifndef OPENSSL_NO_CAST
739		     if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
740		else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
741		else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
742		else
743#endif
744#ifndef OPENSSL_NO_DES
745			if (strcmp(*argv,"des") == 0)
746			{
747			doit[D_CBC_DES]=1;
748			doit[D_EDE3_DES]=1;
749			}
750		else
751#endif
752#ifndef OPENSSL_NO_AES
753			if (strcmp(*argv,"aes") == 0)
754			{
755			doit[D_CBC_128_AES]=1;
756			doit[D_CBC_192_AES]=1;
757			doit[D_CBC_256_AES]=1;
758			}
759		else
760#endif
761#ifndef OPENSSL_NO_RSA
762			if (strcmp(*argv,"rsa") == 0)
763			{
764			rsa_doit[R_RSA_512]=1;
765			rsa_doit[R_RSA_1024]=1;
766			rsa_doit[R_RSA_2048]=1;
767			rsa_doit[R_RSA_4096]=1;
768			}
769		else
770#endif
771#ifndef OPENSSL_NO_DSA
772			if (strcmp(*argv,"dsa") == 0)
773			{
774			dsa_doit[R_DSA_512]=1;
775			dsa_doit[R_DSA_1024]=1;
776			dsa_doit[R_DSA_2048]=1;
777			}
778		else
779#endif
780			{
781			BIO_printf(bio_err,"Error: bad option or value\n");
782			BIO_printf(bio_err,"\n");
783			BIO_printf(bio_err,"Available values:\n");
784#ifndef OPENSSL_NO_MD2
785			BIO_printf(bio_err,"md2      ");
786#endif
787#ifndef OPENSSL_NO_MDC2
788			BIO_printf(bio_err,"mdc2     ");
789#endif
790#ifndef OPENSSL_NO_MD4
791			BIO_printf(bio_err,"md4      ");
792#endif
793#ifndef OPENSSL_NO_MD5
794			BIO_printf(bio_err,"md5      ");
795#ifndef OPENSSL_NO_HMAC
796			BIO_printf(bio_err,"hmac     ");
797#endif
798#endif
799#ifndef OPENSSL_NO_SHA1
800			BIO_printf(bio_err,"sha1     ");
801#endif
802#ifndef OPENSSL_NO_RIPEMD160
803			BIO_printf(bio_err,"rmd160");
804#endif
805#if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
806    !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
807    !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
808			BIO_printf(bio_err,"\n");
809#endif
810
811#ifndef OPENSSL_NO_IDEA
812			BIO_printf(bio_err,"idea-cbc ");
813#endif
814#ifndef OPENSSL_NO_RC2
815			BIO_printf(bio_err,"rc2-cbc  ");
816#endif
817#ifndef OPENSSL_NO_RC5
818			BIO_printf(bio_err,"rc5-cbc  ");
819#endif
820#ifndef OPENSSL_NO_BF
821			BIO_printf(bio_err,"bf-cbc");
822#endif
823#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
824    !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
825			BIO_printf(bio_err,"\n");
826#endif
827#ifndef OPENSSL_NO_DES
828			BIO_printf(bio_err,"des-cbc  des-ede3 ");
829#endif
830#ifndef OPENSSL_NO_AES
831			BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
832#endif
833#ifndef OPENSSL_NO_RC4
834			BIO_printf(bio_err,"rc4");
835#endif
836			BIO_printf(bio_err,"\n");
837
838#ifndef OPENSSL_NO_RSA
839			BIO_printf(bio_err,"rsa512   rsa1024  rsa2048  rsa4096\n");
840#endif
841
842#ifndef OPENSSL_NO_DSA
843			BIO_printf(bio_err,"dsa512   dsa1024  dsa2048\n");
844#endif
845
846#ifndef OPENSSL_NO_IDEA
847			BIO_printf(bio_err,"idea     ");
848#endif
849#ifndef OPENSSL_NO_RC2
850			BIO_printf(bio_err,"rc2      ");
851#endif
852#ifndef OPENSSL_NO_DES
853			BIO_printf(bio_err,"des      ");
854#endif
855#ifndef OPENSSL_NO_AES
856			BIO_printf(bio_err,"aes      ");
857#endif
858#ifndef OPENSSL_NO_RSA
859			BIO_printf(bio_err,"rsa      ");
860#endif
861#ifndef OPENSSL_NO_BF
862			BIO_printf(bio_err,"blowfish");
863#endif
864#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
865    !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
866    !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
867			BIO_printf(bio_err,"\n");
868#endif
869
870			BIO_printf(bio_err,"\n");
871			BIO_printf(bio_err,"Available options:\n");
872#if defined(TIMES) || defined(USE_TOD)
873			BIO_printf(bio_err,"-elapsed        measure time in real time instead of CPU user time.\n");
874#endif
875#ifndef OPENSSL_NO_ENGINE
876			BIO_printf(bio_err,"-engine e       use engine e, possibly a hardware device.\n");
877#endif
878			BIO_printf(bio_err,"-evp e          use EVP e.\n");
879			BIO_printf(bio_err,"-decrypt        time decryption instead of encryption (only EVP).\n");
880			BIO_printf(bio_err,"-mr             produce machine readable output.\n");
881#ifdef HAVE_FORK
882			BIO_printf(bio_err,"-multi n        run n benchmarks in parallel.\n");
883#endif
884			goto end;
885			}
886		argc--;
887		argv++;
888		j++;
889		}
890
891#ifdef HAVE_FORK
892	if(multi && do_multi(multi))
893		goto show_res;
894#endif
895
896	if (j == 0)
897		{
898		for (i=0; i<ALGOR_NUM; i++)
899			{
900			if (i != D_EVP)
901				doit[i]=1;
902			}
903		for (i=0; i<RSA_NUM; i++)
904			rsa_doit[i]=1;
905		for (i=0; i<DSA_NUM; i++)
906			dsa_doit[i]=1;
907		}
908	for (i=0; i<ALGOR_NUM; i++)
909		if (doit[i]) pr_header++;
910
911	if (usertime == 0 && !mr)
912		BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
913	if (usertime <= 0 && !mr)
914		{
915		BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
916		BIO_printf(bio_err,"program when this computer is idle.\n");
917		}
918
919#ifndef OPENSSL_NO_RSA
920	for (i=0; i<RSA_NUM; i++)
921		{
922		const unsigned char *p;
923
924		p=rsa_data[i];
925		rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
926		if (rsa_key[i] == NULL)
927			{
928			BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
929			goto end;
930			}
931#if 0
932		else
933			{
934			BIO_printf(bio_err,mr ? "+RK:%d:"
935				   : "Loaded RSA key, %d bit modulus and e= 0x",
936				   BN_num_bits(rsa_key[i]->n));
937			BN_print(bio_err,rsa_key[i]->e);
938			BIO_printf(bio_err,"\n");
939			}
940#endif
941		}
942#endif
943
944#ifndef OPENSSL_NO_DSA
945	dsa_key[0]=get_dsa512();
946	dsa_key[1]=get_dsa1024();
947	dsa_key[2]=get_dsa2048();
948#endif
949
950#ifndef OPENSSL_NO_DES
951	DES_set_key_unchecked(&key,&sch);
952	DES_set_key_unchecked(&key2,&sch2);
953	DES_set_key_unchecked(&key3,&sch3);
954#endif
955#ifndef OPENSSL_NO_AES
956	AES_set_encrypt_key(key16,128,&aes_ks1);
957	AES_set_encrypt_key(key24,192,&aes_ks2);
958	AES_set_encrypt_key(key32,256,&aes_ks3);
959#endif
960#ifndef OPENSSL_NO_IDEA
961	idea_set_encrypt_key(key16,&idea_ks);
962#endif
963#ifndef OPENSSL_NO_RC4
964	RC4_set_key(&rc4_ks,16,key16);
965#endif
966#ifndef OPENSSL_NO_RC2
967	RC2_set_key(&rc2_ks,16,key16,128);
968#endif
969#ifndef OPENSSL_NO_RC5
970	RC5_32_set_key(&rc5_ks,16,key16,12);
971#endif
972#ifndef OPENSSL_NO_BF
973	BF_set_key(&bf_ks,16,key16);
974#endif
975#ifndef OPENSSL_NO_CAST
976	CAST_set_key(&cast_ks,16,key16);
977#endif
978#ifndef OPENSSL_NO_RSA
979	memset(rsa_c,0,sizeof(rsa_c));
980#endif
981#ifndef SIGALRM
982#ifndef OPENSSL_NO_DES
983	BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
984	count=10;
985	do	{
986		long i;
987		count*=2;
988		Time_F(START);
989		for (i=count; i; i--)
990			DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
991				&sch,DES_ENCRYPT);
992		d=Time_F(STOP);
993		} while (d <3);
994	save_count=count;
995	c[D_MD2][0]=count/10;
996	c[D_MDC2][0]=count/10;
997	c[D_MD4][0]=count;
998	c[D_MD5][0]=count;
999	c[D_HMAC][0]=count;
1000	c[D_SHA1][0]=count;
1001	c[D_RMD160][0]=count;
1002	c[D_RC4][0]=count*5;
1003	c[D_CBC_DES][0]=count;
1004	c[D_EDE3_DES][0]=count/3;
1005	c[D_CBC_IDEA][0]=count;
1006	c[D_CBC_RC2][0]=count;
1007	c[D_CBC_RC5][0]=count;
1008	c[D_CBC_BF][0]=count;
1009	c[D_CBC_CAST][0]=count;
1010	c[D_CBC_128_AES][0]=count;
1011	c[D_CBC_192_AES][0]=count;
1012	c[D_CBC_256_AES][0]=count;
1013
1014	for (i=1; i<SIZE_NUM; i++)
1015		{
1016		c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1017		c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1018		c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1019		c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1020		c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1021		c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1022		c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1023		}
1024	for (i=1; i<SIZE_NUM; i++)
1025		{
1026		long l0,l1;
1027
1028		l0=(long)lengths[i-1];
1029		l1=(long)lengths[i];
1030		c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1031		c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1032		c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1033		c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1034		c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1035		c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1036		c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1037		c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1038		c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
1039		c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
1040		c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
1041		}
1042#ifndef OPENSSL_NO_RSA
1043	rsa_c[R_RSA_512][0]=count/2000;
1044	rsa_c[R_RSA_512][1]=count/400;
1045	for (i=1; i<RSA_NUM; i++)
1046		{
1047		rsa_c[i][0]=rsa_c[i-1][0]/8;
1048		rsa_c[i][1]=rsa_c[i-1][1]/4;
1049		if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1050			rsa_doit[i]=0;
1051		else
1052			{
1053			if (rsa_c[i][0] == 0)
1054				{
1055				rsa_c[i][0]=1;
1056				rsa_c[i][1]=20;
1057				}
1058			}
1059		}
1060#endif
1061
1062#ifndef OPENSSL_NO_DSA
1063	dsa_c[R_DSA_512][0]=count/1000;
1064	dsa_c[R_DSA_512][1]=count/1000/2;
1065	for (i=1; i<DSA_NUM; i++)
1066		{
1067		dsa_c[i][0]=dsa_c[i-1][0]/4;
1068		dsa_c[i][1]=dsa_c[i-1][1]/4;
1069		if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1070			dsa_doit[i]=0;
1071		else
1072			{
1073			if (dsa_c[i] == 0)
1074				{
1075				dsa_c[i][0]=1;
1076				dsa_c[i][1]=1;
1077				}
1078			}
1079		}
1080#endif
1081
1082#define COND(d)	(count < (d))
1083#define COUNT(d) (d)
1084#else
1085/* not worth fixing */
1086# error "You cannot disable DES on systems without SIGALRM."
1087#endif /* OPENSSL_NO_DES */
1088#else
1089#define COND(c)	(run)
1090#define COUNT(d) (count)
1091	signal(SIGALRM,sig_done);
1092#endif /* SIGALRM */
1093
1094#ifndef OPENSSL_NO_MD2
1095	if (doit[D_MD2])
1096		{
1097		for (j=0; j<SIZE_NUM; j++)
1098			{
1099			print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1100			Time_F(START);
1101			for (count=0,run=1; COND(c[D_MD2][j]); count++)
1102				EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1103			d=Time_F(STOP);
1104			print_result(D_MD2,j,count,d);
1105			}
1106		}
1107#endif
1108#ifndef OPENSSL_NO_MDC2
1109	if (doit[D_MDC2])
1110		{
1111		for (j=0; j<SIZE_NUM; j++)
1112			{
1113			print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1114			Time_F(START);
1115			for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1116				EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1117			d=Time_F(STOP);
1118			print_result(D_MDC2,j,count,d);
1119			}
1120		}
1121#endif
1122
1123#ifndef OPENSSL_NO_MD4
1124	if (doit[D_MD4])
1125		{
1126		for (j=0; j<SIZE_NUM; j++)
1127			{
1128			print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1129			Time_F(START);
1130			for (count=0,run=1; COND(c[D_MD4][j]); count++)
1131				EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1132			d=Time_F(STOP);
1133			print_result(D_MD4,j,count,d);
1134			}
1135		}
1136#endif
1137
1138#ifndef OPENSSL_NO_MD5
1139	if (doit[D_MD5])
1140		{
1141		for (j=0; j<SIZE_NUM; j++)
1142			{
1143			print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1144			Time_F(START);
1145			for (count=0,run=1; COND(c[D_MD5][j]); count++)
1146				EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1147			d=Time_F(STOP);
1148			print_result(D_MD5,j,count,d);
1149			}
1150		}
1151#endif
1152
1153#if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1154	if (doit[D_HMAC])
1155		{
1156		HMAC_CTX hctx;
1157
1158		HMAC_CTX_init(&hctx);
1159		HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1160			16,EVP_md5(), NULL);
1161
1162		for (j=0; j<SIZE_NUM; j++)
1163			{
1164			print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1165			Time_F(START);
1166			for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1167				{
1168				HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1169				HMAC_Update(&hctx,buf,lengths[j]);
1170				HMAC_Final(&hctx,&(hmac[0]),NULL);
1171				}
1172			d=Time_F(STOP);
1173			print_result(D_HMAC,j,count,d);
1174			}
1175		HMAC_CTX_cleanup(&hctx);
1176		}
1177#endif
1178#ifndef OPENSSL_NO_SHA
1179	if (doit[D_SHA1])
1180		{
1181		for (j=0; j<SIZE_NUM; j++)
1182			{
1183			print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1184			Time_F(START);
1185			for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1186				EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1187			d=Time_F(STOP);
1188			print_result(D_SHA1,j,count,d);
1189			}
1190		}
1191#endif
1192#ifndef OPENSSL_NO_RIPEMD
1193	if (doit[D_RMD160])
1194		{
1195		for (j=0; j<SIZE_NUM; j++)
1196			{
1197			print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1198			Time_F(START);
1199			for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1200				EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1201			d=Time_F(STOP);
1202			print_result(D_RMD160,j,count,d);
1203			}
1204		}
1205#endif
1206#ifndef OPENSSL_NO_RC4
1207	if (doit[D_RC4])
1208		{
1209		for (j=0; j<SIZE_NUM; j++)
1210			{
1211			print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1212			Time_F(START);
1213			for (count=0,run=1; COND(c[D_RC4][j]); count++)
1214				RC4(&rc4_ks,(unsigned int)lengths[j],
1215					buf,buf);
1216			d=Time_F(STOP);
1217			print_result(D_RC4,j,count,d);
1218			}
1219		}
1220#endif
1221#ifndef OPENSSL_NO_DES
1222	if (doit[D_CBC_DES])
1223		{
1224		for (j=0; j<SIZE_NUM; j++)
1225			{
1226			print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1227			Time_F(START);
1228			for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1229				DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1230						 &DES_iv,DES_ENCRYPT);
1231			d=Time_F(STOP);
1232			print_result(D_CBC_DES,j,count,d);
1233			}
1234		}
1235
1236	if (doit[D_EDE3_DES])
1237		{
1238		for (j=0; j<SIZE_NUM; j++)
1239			{
1240			print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1241			Time_F(START);
1242			for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1243				DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1244						     &sch,&sch2,&sch3,
1245						     &DES_iv,DES_ENCRYPT);
1246			d=Time_F(STOP);
1247			print_result(D_EDE3_DES,j,count,d);
1248			}
1249		}
1250#endif
1251#ifndef OPENSSL_NO_AES
1252	if (doit[D_CBC_128_AES])
1253		{
1254		for (j=0; j<SIZE_NUM; j++)
1255			{
1256			print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1257			Time_F(START);
1258			for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1259				AES_cbc_encrypt(buf,buf,
1260					(unsigned long)lengths[j],&aes_ks1,
1261					iv,AES_ENCRYPT);
1262			d=Time_F(STOP);
1263			print_result(D_CBC_128_AES,j,count,d);
1264			}
1265		}
1266	if (doit[D_CBC_192_AES])
1267		{
1268		for (j=0; j<SIZE_NUM; j++)
1269			{
1270			print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1271			Time_F(START);
1272			for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1273				AES_cbc_encrypt(buf,buf,
1274					(unsigned long)lengths[j],&aes_ks2,
1275					iv,AES_ENCRYPT);
1276			d=Time_F(STOP);
1277			print_result(D_CBC_192_AES,j,count,d);
1278			}
1279		}
1280	if (doit[D_CBC_256_AES])
1281		{
1282		for (j=0; j<SIZE_NUM; j++)
1283			{
1284			print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1285			Time_F(START);
1286			for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1287				AES_cbc_encrypt(buf,buf,
1288					(unsigned long)lengths[j],&aes_ks3,
1289					iv,AES_ENCRYPT);
1290			d=Time_F(STOP);
1291			print_result(D_CBC_256_AES,j,count,d);
1292			}
1293		}
1294
1295#endif
1296#ifndef OPENSSL_NO_IDEA
1297	if (doit[D_CBC_IDEA])
1298		{
1299		for (j=0; j<SIZE_NUM; j++)
1300			{
1301			print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1302			Time_F(START);
1303			for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1304				idea_cbc_encrypt(buf,buf,
1305					(unsigned long)lengths[j],&idea_ks,
1306					iv,IDEA_ENCRYPT);
1307			d=Time_F(STOP);
1308			print_result(D_CBC_IDEA,j,count,d);
1309			}
1310		}
1311#endif
1312#ifndef OPENSSL_NO_RC2
1313	if (doit[D_CBC_RC2])
1314		{
1315		for (j=0; j<SIZE_NUM; j++)
1316			{
1317			print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1318			Time_F(START);
1319			for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1320				RC2_cbc_encrypt(buf,buf,
1321					(unsigned long)lengths[j],&rc2_ks,
1322					iv,RC2_ENCRYPT);
1323			d=Time_F(STOP);
1324			print_result(D_CBC_RC2,j,count,d);
1325			}
1326		}
1327#endif
1328#ifndef OPENSSL_NO_RC5
1329	if (doit[D_CBC_RC5])
1330		{
1331		for (j=0; j<SIZE_NUM; j++)
1332			{
1333			print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1334			Time_F(START);
1335			for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1336				RC5_32_cbc_encrypt(buf,buf,
1337					(unsigned long)lengths[j],&rc5_ks,
1338					iv,RC5_ENCRYPT);
1339			d=Time_F(STOP);
1340			print_result(D_CBC_RC5,j,count,d);
1341			}
1342		}
1343#endif
1344#ifndef OPENSSL_NO_BF
1345	if (doit[D_CBC_BF])
1346		{
1347		for (j=0; j<SIZE_NUM; j++)
1348			{
1349			print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1350			Time_F(START);
1351			for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1352				BF_cbc_encrypt(buf,buf,
1353					(unsigned long)lengths[j],&bf_ks,
1354					iv,BF_ENCRYPT);
1355			d=Time_F(STOP);
1356			print_result(D_CBC_BF,j,count,d);
1357			}
1358		}
1359#endif
1360#ifndef OPENSSL_NO_CAST
1361	if (doit[D_CBC_CAST])
1362		{
1363		for (j=0; j<SIZE_NUM; j++)
1364			{
1365			print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1366			Time_F(START);
1367			for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1368				CAST_cbc_encrypt(buf,buf,
1369					(unsigned long)lengths[j],&cast_ks,
1370					iv,CAST_ENCRYPT);
1371			d=Time_F(STOP);
1372			print_result(D_CBC_CAST,j,count,d);
1373			}
1374		}
1375#endif
1376
1377	if (doit[D_EVP])
1378		{
1379		for (j=0; j<SIZE_NUM; j++)
1380			{
1381			if (evp_cipher)
1382				{
1383				EVP_CIPHER_CTX ctx;
1384				int outl;
1385
1386				names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1387				/* -O3 -fschedule-insns messes up an
1388				 * optimization here!  names[D_EVP]
1389				 * somehow becomes NULL */
1390				print_message(names[D_EVP],save_count,
1391					lengths[j]);
1392
1393				EVP_CIPHER_CTX_init(&ctx);
1394				if(decrypt)
1395					EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1396				else
1397					EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1398				EVP_CIPHER_CTX_set_padding(&ctx, 0);
1399
1400				Time_F(START);
1401				if(decrypt)
1402					for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1403						EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1404				else
1405					for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1406						EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1407				if(decrypt)
1408					EVP_DecryptFinal_ex(&ctx,buf,&outl);
1409				else
1410					EVP_EncryptFinal_ex(&ctx,buf,&outl);
1411				d=Time_F(STOP);
1412				EVP_CIPHER_CTX_cleanup(&ctx);
1413				}
1414			if (evp_md)
1415				{
1416				names[D_EVP]=OBJ_nid2ln(evp_md->type);
1417				print_message(names[D_EVP],save_count,
1418					lengths[j]);
1419
1420				Time_F(START);
1421				for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1422					EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1423
1424				d=Time_F(STOP);
1425				}
1426			print_result(D_EVP,j,count,d);
1427			}
1428		}
1429
1430	RAND_pseudo_bytes(buf,36);
1431#ifndef OPENSSL_NO_RSA
1432	for (j=0; j<RSA_NUM; j++)
1433		{
1434		int ret;
1435		if (!rsa_doit[j]) continue;
1436		ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1437		if (ret == 0)
1438			{
1439			BIO_printf(bio_err,"RSA sign failure.  No RSA sign will be done.\n");
1440			ERR_print_errors(bio_err);
1441			rsa_count=1;
1442			}
1443		else
1444			{
1445			pkey_print_message("private","rsa",
1446				rsa_c[j][0],rsa_bits[j],
1447				RSA_SECONDS);
1448/*			RSA_blinding_on(rsa_key[j],NULL); */
1449			Time_F(START);
1450			for (count=0,run=1; COND(rsa_c[j][0]); count++)
1451				{
1452				ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1453					&rsa_num, rsa_key[j]);
1454				if (ret == 0)
1455					{
1456					BIO_printf(bio_err,
1457						"RSA sign failure\n");
1458					ERR_print_errors(bio_err);
1459					count=1;
1460					break;
1461					}
1462				}
1463			d=Time_F(STOP);
1464			BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1465				   : "%ld %d bit private RSA's in %.2fs\n",
1466				   count,rsa_bits[j],d);
1467			rsa_results[j][0]=d/(double)count;
1468			rsa_count=count;
1469			}
1470
1471#if 1
1472		ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1473		if (ret <= 0)
1474			{
1475			BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
1476			ERR_print_errors(bio_err);
1477			rsa_doit[j] = 0;
1478			}
1479		else
1480			{
1481			pkey_print_message("public","rsa",
1482				rsa_c[j][1],rsa_bits[j],
1483				RSA_SECONDS);
1484			Time_F(START);
1485			for (count=0,run=1; COND(rsa_c[j][1]); count++)
1486				{
1487				ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1488					rsa_num, rsa_key[j]);
1489				if (ret == 0)
1490					{
1491					BIO_printf(bio_err,
1492						"RSA verify failure\n");
1493					ERR_print_errors(bio_err);
1494					count=1;
1495					break;
1496					}
1497				}
1498			d=Time_F(STOP);
1499			BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1500				   : "%ld %d bit public RSA's in %.2fs\n",
1501				   count,rsa_bits[j],d);
1502			rsa_results[j][1]=d/(double)count;
1503			}
1504#endif
1505
1506		if (rsa_count <= 1)
1507			{
1508			/* if longer than 10s, don't do any more */
1509			for (j++; j<RSA_NUM; j++)
1510				rsa_doit[j]=0;
1511			}
1512		}
1513#endif
1514
1515	RAND_pseudo_bytes(buf,20);
1516#ifndef OPENSSL_NO_DSA
1517	if (RAND_status() != 1)
1518		{
1519		RAND_seed(rnd_seed, sizeof rnd_seed);
1520		rnd_fake = 1;
1521		}
1522	for (j=0; j<DSA_NUM; j++)
1523		{
1524		unsigned int kk;
1525		int ret;
1526
1527		if (!dsa_doit[j]) continue;
1528/*		DSA_generate_key(dsa_key[j]); */
1529/*		DSA_sign_setup(dsa_key[j],NULL); */
1530		ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1531			&kk,dsa_key[j]);
1532		if (ret == 0)
1533			{
1534			BIO_printf(bio_err,"DSA sign failure.  No DSA sign will be done.\n");
1535			ERR_print_errors(bio_err);
1536			rsa_count=1;
1537			}
1538		else
1539			{
1540			pkey_print_message("sign","dsa",
1541				dsa_c[j][0],dsa_bits[j],
1542				DSA_SECONDS);
1543			Time_F(START);
1544			for (count=0,run=1; COND(dsa_c[j][0]); count++)
1545				{
1546				ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1547					&kk,dsa_key[j]);
1548				if (ret == 0)
1549					{
1550					BIO_printf(bio_err,
1551						"DSA sign failure\n");
1552					ERR_print_errors(bio_err);
1553					count=1;
1554					break;
1555					}
1556				}
1557			d=Time_F(STOP);
1558			BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1559				   : "%ld %d bit DSA signs in %.2fs\n",
1560				   count,dsa_bits[j],d);
1561			dsa_results[j][0]=d/(double)count;
1562			rsa_count=count;
1563			}
1564
1565		ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1566			kk,dsa_key[j]);
1567		if (ret <= 0)
1568			{
1569			BIO_printf(bio_err,"DSA verify failure.  No DSA verify will be done.\n");
1570			ERR_print_errors(bio_err);
1571			dsa_doit[j] = 0;
1572			}
1573		else
1574			{
1575			pkey_print_message("verify","dsa",
1576				dsa_c[j][1],dsa_bits[j],
1577				DSA_SECONDS);
1578			Time_F(START);
1579			for (count=0,run=1; COND(dsa_c[j][1]); count++)
1580				{
1581				ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1582					kk,dsa_key[j]);
1583				if (ret <= 0)
1584					{
1585					BIO_printf(bio_err,
1586						"DSA verify failure\n");
1587					ERR_print_errors(bio_err);
1588					count=1;
1589					break;
1590					}
1591				}
1592			d=Time_F(STOP);
1593			BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1594				   : "%ld %d bit DSA verify in %.2fs\n",
1595				   count,dsa_bits[j],d);
1596			dsa_results[j][1]=d/(double)count;
1597			}
1598
1599		if (rsa_count <= 1)
1600			{
1601			/* if longer than 10s, don't do any more */
1602			for (j++; j<DSA_NUM; j++)
1603				dsa_doit[j]=0;
1604			}
1605		}
1606	if (rnd_fake) RAND_cleanup();
1607#endif
1608#ifdef HAVE_FORK
1609show_res:
1610#endif
1611	if(!mr)
1612		{
1613		fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1614        fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1615		printf("options:");
1616		printf("%s ",BN_options());
1617#ifndef OPENSSL_NO_MD2
1618		printf("%s ",MD2_options());
1619#endif
1620#ifndef OPENSSL_NO_RC4
1621		printf("%s ",RC4_options());
1622#endif
1623#ifndef OPENSSL_NO_DES
1624		printf("%s ",DES_options());
1625#endif
1626#ifndef OPENSSL_NO_AES
1627		printf("%s ",AES_options());
1628#endif
1629#ifndef OPENSSL_NO_IDEA
1630		printf("%s ",idea_options());
1631#endif
1632#ifndef OPENSSL_NO_BF
1633		printf("%s ",BF_options());
1634#endif
1635		fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1636		printf("available timing options: ");
1637#ifdef TIMES
1638		printf("TIMES ");
1639#endif
1640#ifdef TIMEB
1641		printf("TIMEB ");
1642#endif
1643#ifdef USE_TOD
1644		printf("USE_TOD ");
1645#endif
1646#ifdef HZ
1647#define as_string(s) (#s)
1648		printf("HZ=%g", (double)HZ);
1649# ifdef _SC_CLK_TCK
1650		printf(" [sysconf value]");
1651# endif
1652#endif
1653		printf("\n");
1654		printf("timing function used: %s%s%s%s%s%s%s\n",
1655		       (ftime_used ? "ftime" : ""),
1656		       (ftime_used + times_used > 1 ? "," : ""),
1657		       (times_used ? "times" : ""),
1658		       (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1659		       (gettimeofday_used ? "gettimeofday" : ""),
1660		       (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1661		       (getrusage_used ? "getrusage" : ""));
1662		}
1663
1664	if (pr_header)
1665		{
1666		if(mr)
1667			fprintf(stdout,"+H");
1668		else
1669			{
1670			fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1671			fprintf(stdout,"type        ");
1672			}
1673		for (j=0;  j<SIZE_NUM; j++)
1674			fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1675		fprintf(stdout,"\n");
1676		}
1677
1678	for (k=0; k<ALGOR_NUM; k++)
1679		{
1680		if (!doit[k]) continue;
1681		if(mr)
1682			fprintf(stdout,"+F:%d:%s",k,names[k]);
1683		else
1684			fprintf(stdout,"%-13s",names[k]);
1685		for (j=0; j<SIZE_NUM; j++)
1686			{
1687			if (results[k][j] > 10000 && !mr)
1688				fprintf(stdout," %11.2fk",results[k][j]/1e3);
1689			else
1690				fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1691			}
1692		fprintf(stdout,"\n");
1693		}
1694#ifndef OPENSSL_NO_RSA
1695	j=1;
1696	for (k=0; k<RSA_NUM; k++)
1697		{
1698		if (!rsa_doit[k]) continue;
1699		if (j && !mr)
1700			{
1701			printf("%18ssign    verify    sign/s verify/s\n"," ");
1702			j=0;
1703			}
1704		if(mr)
1705			fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1706				k,rsa_bits[k],rsa_results[k][0],
1707				rsa_results[k][1]);
1708		else
1709			fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1710				rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1711				1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1712		}
1713#endif
1714#ifndef OPENSSL_NO_DSA
1715	j=1;
1716	for (k=0; k<DSA_NUM; k++)
1717		{
1718		if (!dsa_doit[k]) continue;
1719		if (j && !mr)
1720			{
1721			printf("%18ssign    verify    sign/s verify/s\n"," ");
1722			j=0;
1723			}
1724		if(mr)
1725			fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1726				k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1727		else
1728			fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1729				dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1730				1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1731		}
1732#endif
1733	mret=0;
1734end:
1735	ERR_print_errors(bio_err);
1736	if (buf != NULL) OPENSSL_free(buf);
1737	if (buf2 != NULL) OPENSSL_free(buf2);
1738#ifndef OPENSSL_NO_RSA
1739	for (i=0; i<RSA_NUM; i++)
1740		if (rsa_key[i] != NULL)
1741			RSA_free(rsa_key[i]);
1742#endif
1743#ifndef OPENSSL_NO_DSA
1744	for (i=0; i<DSA_NUM; i++)
1745		if (dsa_key[i] != NULL)
1746			DSA_free(dsa_key[i]);
1747#endif
1748	apps_shutdown();
1749	OPENSSL_EXIT(mret);
1750	}
1751
1752static void print_message(const char *s, long num, int length)
1753	{
1754#ifdef SIGALRM
1755	BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1756		   : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1757	(void)BIO_flush(bio_err);
1758	alarm(SECONDS);
1759#else
1760	BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1761		   : "Doing %s %ld times on %d size blocks: ",s,num,length);
1762	(void)BIO_flush(bio_err);
1763#endif
1764#ifdef LINT
1765	num=num;
1766#endif
1767	}
1768
1769static void pkey_print_message(char *str, char *str2, long num, int bits,
1770	     int tm)
1771	{
1772#ifdef SIGALRM
1773	BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1774			   : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1775	(void)BIO_flush(bio_err);
1776	alarm(RSA_SECONDS);
1777#else
1778	BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1779			   : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1780	(void)BIO_flush(bio_err);
1781#endif
1782#ifdef LINT
1783	num=num;
1784#endif
1785	}
1786
1787static void print_result(int alg,int run_no,int count,double time_used)
1788	{
1789	BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1790		   : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1791	results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1792	}
1793
1794static char *sstrsep(char **string, const char *delim)
1795    {
1796    char isdelim[256];
1797    char *token = *string;
1798
1799    if (**string == 0)
1800        return NULL;
1801
1802    memset(isdelim, 0, sizeof isdelim);
1803    isdelim[0] = 1;
1804
1805    while (*delim)
1806        {
1807        isdelim[(unsigned char)(*delim)] = 1;
1808        delim++;
1809        }
1810
1811    while (!isdelim[(unsigned char)(**string)])
1812        {
1813        (*string)++;
1814        }
1815
1816    if (**string)
1817        {
1818        **string = 0;
1819        (*string)++;
1820        }
1821
1822    return token;
1823    }
1824
1825#ifdef HAVE_FORK
1826static int do_multi(int multi)
1827	{
1828	int n;
1829	int fd[2];
1830	int *fds;
1831	static char sep[]=":";
1832
1833	fds=malloc(multi*sizeof *fds);
1834	for(n=0 ; n < multi ; ++n)
1835		{
1836		pipe(fd);
1837		if(fork())
1838			{
1839			close(fd[1]);
1840			fds[n]=fd[0];
1841			}
1842		else
1843			{
1844			close(fd[0]);
1845			close(1);
1846			dup(fd[1]);
1847			close(fd[1]);
1848			mr=1;
1849			usertime=0;
1850			return 0;
1851			}
1852		printf("Forked child %d\n",n);
1853		}
1854
1855	/* for now, assume the pipe is long enough to take all the output */
1856	for(n=0 ; n < multi ; ++n)
1857		{
1858		FILE *f;
1859		char buf[1024];
1860		char *p;
1861
1862		f=fdopen(fds[n],"r");
1863		while(fgets(buf,sizeof buf,f))
1864			{
1865			p=strchr(buf,'\n');
1866			if(p)
1867				*p='\0';
1868			if(buf[0] != '+')
1869				{
1870				fprintf(stderr,"Don't understand line '%s' from child %d\n",
1871						buf,n);
1872				continue;
1873				}
1874			printf("Got: %s from %d\n",buf,n);
1875			if(!strncmp(buf,"+F:",3))
1876				{
1877				int alg;
1878				int j;
1879
1880				p=buf+3;
1881				alg=atoi(sstrsep(&p,sep));
1882				sstrsep(&p,sep);
1883				for(j=0 ; j < SIZE_NUM ; ++j)
1884					results[alg][j]+=atof(sstrsep(&p,sep));
1885				}
1886			else if(!strncmp(buf,"+F2:",4))
1887				{
1888				int k;
1889				double d;
1890
1891				p=buf+4;
1892				k=atoi(sstrsep(&p,sep));
1893				sstrsep(&p,sep);
1894
1895				d=atof(sstrsep(&p,sep));
1896				if(n)
1897					rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1898				else
1899					rsa_results[k][0]=d;
1900
1901				d=atof(sstrsep(&p,sep));
1902				if(n)
1903					rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1904				else
1905					rsa_results[k][1]=d;
1906				}
1907			else if(!strncmp(buf,"+F2:",4))
1908				{
1909				int k;
1910				double d;
1911
1912				p=buf+4;
1913				k=atoi(sstrsep(&p,sep));
1914				sstrsep(&p,sep);
1915
1916				d=atof(sstrsep(&p,sep));
1917				if(n)
1918					rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1919				else
1920					rsa_results[k][0]=d;
1921
1922				d=atof(sstrsep(&p,sep));
1923				if(n)
1924					rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1925				else
1926					rsa_results[k][1]=d;
1927				}
1928			else if(!strncmp(buf,"+F3:",4))
1929				{
1930				int k;
1931				double d;
1932
1933				p=buf+4;
1934				k=atoi(sstrsep(&p,sep));
1935				sstrsep(&p,sep);
1936
1937				d=atof(sstrsep(&p,sep));
1938				if(n)
1939					dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1940				else
1941					dsa_results[k][0]=d;
1942
1943				d=atof(sstrsep(&p,sep));
1944				if(n)
1945					dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1946				else
1947					dsa_results[k][1]=d;
1948				}
1949			else if(!strncmp(buf,"+H:",3))
1950				{
1951				}
1952			else
1953				fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);
1954			}
1955		}
1956	return 1;
1957	}
1958#endif
1959#endif
1960