speed.c revision 111150
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			}
777		else
778#endif
779			{
780			BIO_printf(bio_err,"Error: bad option or value\n");
781			BIO_printf(bio_err,"\n");
782			BIO_printf(bio_err,"Available values:\n");
783#ifndef OPENSSL_NO_MD2
784			BIO_printf(bio_err,"md2      ");
785#endif
786#ifndef OPENSSL_NO_MDC2
787			BIO_printf(bio_err,"mdc2     ");
788#endif
789#ifndef OPENSSL_NO_MD4
790			BIO_printf(bio_err,"md4      ");
791#endif
792#ifndef OPENSSL_NO_MD5
793			BIO_printf(bio_err,"md5      ");
794#ifndef OPENSSL_NO_HMAC
795			BIO_printf(bio_err,"hmac     ");
796#endif
797#endif
798#ifndef OPENSSL_NO_SHA1
799			BIO_printf(bio_err,"sha1     ");
800#endif
801#ifndef OPENSSL_NO_RIPEMD160
802			BIO_printf(bio_err,"rmd160");
803#endif
804#if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
805    !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
806    !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
807			BIO_printf(bio_err,"\n");
808#endif
809
810#ifndef OPENSSL_NO_IDEA
811			BIO_printf(bio_err,"idea-cbc ");
812#endif
813#ifndef OPENSSL_NO_RC2
814			BIO_printf(bio_err,"rc2-cbc  ");
815#endif
816#ifndef OPENSSL_NO_RC5
817			BIO_printf(bio_err,"rc5-cbc  ");
818#endif
819#ifndef OPENSSL_NO_BF
820			BIO_printf(bio_err,"bf-cbc");
821#endif
822#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
823    !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
824			BIO_printf(bio_err,"\n");
825#endif
826#ifndef OPENSSL_NO_DES
827			BIO_printf(bio_err,"des-cbc  des-ede3 ");
828#endif
829#ifndef OPENSSL_NO_AES
830			BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
831#endif
832#ifndef OPENSSL_NO_RC4
833			BIO_printf(bio_err,"rc4");
834#endif
835			BIO_printf(bio_err,"\n");
836
837#ifndef OPENSSL_NO_RSA
838			BIO_printf(bio_err,"rsa512   rsa1024  rsa2048  rsa4096\n");
839#endif
840
841#ifndef OPENSSL_NO_DSA
842			BIO_printf(bio_err,"dsa512   dsa1024  dsa2048\n");
843#endif
844
845#ifndef OPENSSL_NO_IDEA
846			BIO_printf(bio_err,"idea     ");
847#endif
848#ifndef OPENSSL_NO_RC2
849			BIO_printf(bio_err,"rc2      ");
850#endif
851#ifndef OPENSSL_NO_DES
852			BIO_printf(bio_err,"des      ");
853#endif
854#ifndef OPENSSL_NO_AES
855			BIO_printf(bio_err,"aes      ");
856#endif
857#ifndef OPENSSL_NO_RSA
858			BIO_printf(bio_err,"rsa      ");
859#endif
860#ifndef OPENSSL_NO_BF
861			BIO_printf(bio_err,"blowfish");
862#endif
863#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
864    !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
865    !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
866			BIO_printf(bio_err,"\n");
867#endif
868
869			BIO_printf(bio_err,"\n");
870			BIO_printf(bio_err,"Available options:\n");
871#if defined(TIMES) || defined(USE_TOD)
872			BIO_printf(bio_err,"-elapsed        measure time in real time instead of CPU user time.\n");
873#endif
874#ifndef OPENSSL_NO_ENGINE
875			BIO_printf(bio_err,"-engine e       use engine e, possibly a hardware device.\n");
876#endif
877			BIO_printf(bio_err,"-evp e          use EVP e.\n");
878			BIO_printf(bio_err,"-decrypt        time decryption instead of encryption (only EVP).\n");
879			BIO_printf(bio_err,"-mr             produce machine readable output.\n");
880#ifdef HAVE_FORK
881			BIO_printf(bio_err,"-multi n        run n benchmarks in parallel.\n");
882#endif
883			goto end;
884			}
885		argc--;
886		argv++;
887		j++;
888		}
889
890#ifdef HAVE_FORK
891	if(multi && do_multi(multi))
892		goto show_res;
893#endif
894
895	if (j == 0)
896		{
897		for (i=0; i<ALGOR_NUM; i++)
898			{
899			if (i != D_EVP)
900				doit[i]=1;
901			}
902		for (i=0; i<RSA_NUM; i++)
903			rsa_doit[i]=1;
904		for (i=0; i<DSA_NUM; i++)
905			dsa_doit[i]=1;
906		}
907	for (i=0; i<ALGOR_NUM; i++)
908		if (doit[i]) pr_header++;
909
910	if (usertime == 0 && !mr)
911		BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
912	if (usertime <= 0 && !mr)
913		{
914		BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
915		BIO_printf(bio_err,"program when this computer is idle.\n");
916		}
917
918#ifndef OPENSSL_NO_RSA
919	for (i=0; i<RSA_NUM; i++)
920		{
921		const unsigned char *p;
922
923		p=rsa_data[i];
924		rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
925		if (rsa_key[i] == NULL)
926			{
927			BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
928			goto end;
929			}
930#if 0
931		else
932			{
933			BIO_printf(bio_err,mr ? "+RK:%d:"
934				   : "Loaded RSA key, %d bit modulus and e= 0x",
935				   BN_num_bits(rsa_key[i]->n));
936			BN_print(bio_err,rsa_key[i]->e);
937			BIO_printf(bio_err,"\n");
938			}
939#endif
940		}
941#endif
942
943#ifndef OPENSSL_NO_DSA
944	dsa_key[0]=get_dsa512();
945	dsa_key[1]=get_dsa1024();
946	dsa_key[2]=get_dsa2048();
947#endif
948
949#ifndef OPENSSL_NO_DES
950	DES_set_key_unchecked(&key,&sch);
951	DES_set_key_unchecked(&key2,&sch2);
952	DES_set_key_unchecked(&key3,&sch3);
953#endif
954#ifndef OPENSSL_NO_AES
955	AES_set_encrypt_key(key16,128,&aes_ks1);
956	AES_set_encrypt_key(key24,192,&aes_ks2);
957	AES_set_encrypt_key(key32,256,&aes_ks3);
958#endif
959#ifndef OPENSSL_NO_IDEA
960	idea_set_encrypt_key(key16,&idea_ks);
961#endif
962#ifndef OPENSSL_NO_RC4
963	RC4_set_key(&rc4_ks,16,key16);
964#endif
965#ifndef OPENSSL_NO_RC2
966	RC2_set_key(&rc2_ks,16,key16,128);
967#endif
968#ifndef OPENSSL_NO_RC5
969	RC5_32_set_key(&rc5_ks,16,key16,12);
970#endif
971#ifndef OPENSSL_NO_BF
972	BF_set_key(&bf_ks,16,key16);
973#endif
974#ifndef OPENSSL_NO_CAST
975	CAST_set_key(&cast_ks,16,key16);
976#endif
977#ifndef OPENSSL_NO_RSA
978	memset(rsa_c,0,sizeof(rsa_c));
979#endif
980#ifndef SIGALRM
981#ifndef OPENSSL_NO_DES
982	BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
983	count=10;
984	do	{
985		long i;
986		count*=2;
987		Time_F(START);
988		for (i=count; i; i--)
989			DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
990				&sch,DES_ENCRYPT);
991		d=Time_F(STOP);
992		} while (d <3);
993	save_count=count;
994	c[D_MD2][0]=count/10;
995	c[D_MDC2][0]=count/10;
996	c[D_MD4][0]=count;
997	c[D_MD5][0]=count;
998	c[D_HMAC][0]=count;
999	c[D_SHA1][0]=count;
1000	c[D_RMD160][0]=count;
1001	c[D_RC4][0]=count*5;
1002	c[D_CBC_DES][0]=count;
1003	c[D_EDE3_DES][0]=count/3;
1004	c[D_CBC_IDEA][0]=count;
1005	c[D_CBC_RC2][0]=count;
1006	c[D_CBC_RC5][0]=count;
1007	c[D_CBC_BF][0]=count;
1008	c[D_CBC_CAST][0]=count;
1009
1010	for (i=1; i<SIZE_NUM; i++)
1011		{
1012		c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1013		c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1014		c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1015		c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1016		c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1017		c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1018		c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1019		}
1020	for (i=1; i<SIZE_NUM; i++)
1021		{
1022		long l0,l1;
1023
1024		l0=(long)lengths[i-1];
1025		l1=(long)lengths[i];
1026		c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1027		c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1028		c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1029		c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1030		c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1031		c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1032		c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1033		c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1034		}
1035#ifndef OPENSSL_NO_RSA
1036	rsa_c[R_RSA_512][0]=count/2000;
1037	rsa_c[R_RSA_512][1]=count/400;
1038	for (i=1; i<RSA_NUM; i++)
1039		{
1040		rsa_c[i][0]=rsa_c[i-1][0]/8;
1041		rsa_c[i][1]=rsa_c[i-1][1]/4;
1042		if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1043			rsa_doit[i]=0;
1044		else
1045			{
1046			if (rsa_c[i][0] == 0)
1047				{
1048				rsa_c[i][0]=1;
1049				rsa_c[i][1]=20;
1050				}
1051			}
1052		}
1053#endif
1054
1055#ifndef OPENSSL_NO_DSA
1056	dsa_c[R_DSA_512][0]=count/1000;
1057	dsa_c[R_DSA_512][1]=count/1000/2;
1058	for (i=1; i<DSA_NUM; i++)
1059		{
1060		dsa_c[i][0]=dsa_c[i-1][0]/4;
1061		dsa_c[i][1]=dsa_c[i-1][1]/4;
1062		if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1063			dsa_doit[i]=0;
1064		else
1065			{
1066			if (dsa_c[i] == 0)
1067				{
1068				dsa_c[i][0]=1;
1069				dsa_c[i][1]=1;
1070				}
1071			}
1072		}
1073#endif
1074
1075#define COND(d)	(count < (d))
1076#define COUNT(d) (d)
1077#else
1078/* not worth fixing */
1079# error "You cannot disable DES on systems without SIGALRM."
1080#endif /* OPENSSL_NO_DES */
1081#else
1082#define COND(c)	(run)
1083#define COUNT(d) (count)
1084	signal(SIGALRM,sig_done);
1085#endif /* SIGALRM */
1086
1087#ifndef OPENSSL_NO_MD2
1088	if (doit[D_MD2])
1089		{
1090		for (j=0; j<SIZE_NUM; j++)
1091			{
1092			print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1093			Time_F(START);
1094			for (count=0,run=1; COND(c[D_MD2][j]); count++)
1095				EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1096			d=Time_F(STOP);
1097			print_result(D_MD2,j,count,d);
1098			}
1099		}
1100#endif
1101#ifndef OPENSSL_NO_MDC2
1102	if (doit[D_MDC2])
1103		{
1104		for (j=0; j<SIZE_NUM; j++)
1105			{
1106			print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1107			Time_F(START);
1108			for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1109				EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1110			d=Time_F(STOP);
1111			print_result(D_MDC2,j,count,d);
1112			}
1113		}
1114#endif
1115
1116#ifndef OPENSSL_NO_MD4
1117	if (doit[D_MD4])
1118		{
1119		for (j=0; j<SIZE_NUM; j++)
1120			{
1121			print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1122			Time_F(START);
1123			for (count=0,run=1; COND(c[D_MD4][j]); count++)
1124				EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1125			d=Time_F(STOP);
1126			print_result(D_MD4,j,count,d);
1127			}
1128		}
1129#endif
1130
1131#ifndef OPENSSL_NO_MD5
1132	if (doit[D_MD5])
1133		{
1134		for (j=0; j<SIZE_NUM; j++)
1135			{
1136			print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1137			Time_F(START);
1138			for (count=0,run=1; COND(c[D_MD5][j]); count++)
1139				EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1140			d=Time_F(STOP);
1141			print_result(D_MD5,j,count,d);
1142			}
1143		}
1144#endif
1145
1146#if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1147	if (doit[D_HMAC])
1148		{
1149		HMAC_CTX hctx;
1150
1151		HMAC_CTX_init(&hctx);
1152		HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1153			16,EVP_md5(), NULL);
1154
1155		for (j=0; j<SIZE_NUM; j++)
1156			{
1157			print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1158			Time_F(START);
1159			for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1160				{
1161				HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1162				HMAC_Update(&hctx,buf,lengths[j]);
1163				HMAC_Final(&hctx,&(hmac[0]),NULL);
1164				}
1165			d=Time_F(STOP);
1166			print_result(D_HMAC,j,count,d);
1167			}
1168		HMAC_CTX_cleanup(&hctx);
1169		}
1170#endif
1171#ifndef OPENSSL_NO_SHA
1172	if (doit[D_SHA1])
1173		{
1174		for (j=0; j<SIZE_NUM; j++)
1175			{
1176			print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1177			Time_F(START);
1178			for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1179				EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1180			d=Time_F(STOP);
1181			print_result(D_SHA1,j,count,d);
1182			}
1183		}
1184#endif
1185#ifndef OPENSSL_NO_RIPEMD
1186	if (doit[D_RMD160])
1187		{
1188		for (j=0; j<SIZE_NUM; j++)
1189			{
1190			print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1191			Time_F(START);
1192			for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1193				EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1194			d=Time_F(STOP);
1195			print_result(D_RMD160,j,count,d);
1196			}
1197		}
1198#endif
1199#ifndef OPENSSL_NO_RC4
1200	if (doit[D_RC4])
1201		{
1202		for (j=0; j<SIZE_NUM; j++)
1203			{
1204			print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1205			Time_F(START);
1206			for (count=0,run=1; COND(c[D_RC4][j]); count++)
1207				RC4(&rc4_ks,(unsigned int)lengths[j],
1208					buf,buf);
1209			d=Time_F(STOP);
1210			print_result(D_RC4,j,count,d);
1211			}
1212		}
1213#endif
1214#ifndef OPENSSL_NO_DES
1215	if (doit[D_CBC_DES])
1216		{
1217		for (j=0; j<SIZE_NUM; j++)
1218			{
1219			print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1220			Time_F(START);
1221			for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1222				DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1223						 &DES_iv,DES_ENCRYPT);
1224			d=Time_F(STOP);
1225			print_result(D_CBC_DES,j,count,d);
1226			}
1227		}
1228
1229	if (doit[D_EDE3_DES])
1230		{
1231		for (j=0; j<SIZE_NUM; j++)
1232			{
1233			print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1234			Time_F(START);
1235			for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1236				DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1237						     &sch,&sch2,&sch3,
1238						     &DES_iv,DES_ENCRYPT);
1239			d=Time_F(STOP);
1240			print_result(D_EDE3_DES,j,count,d);
1241			}
1242		}
1243#endif
1244#ifndef OPENSSL_NO_AES
1245	if (doit[D_CBC_128_AES])
1246		{
1247		for (j=0; j<SIZE_NUM; j++)
1248			{
1249			print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1250			Time_F(START);
1251			for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1252				AES_cbc_encrypt(buf,buf,
1253					(unsigned long)lengths[j],&aes_ks1,
1254					iv,AES_ENCRYPT);
1255			d=Time_F(STOP);
1256			print_result(D_CBC_128_AES,j,count,d);
1257			}
1258		}
1259	if (doit[D_CBC_192_AES])
1260		{
1261		for (j=0; j<SIZE_NUM; j++)
1262			{
1263			print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1264			Time_F(START);
1265			for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1266				AES_cbc_encrypt(buf,buf,
1267					(unsigned long)lengths[j],&aes_ks2,
1268					iv,AES_ENCRYPT);
1269			d=Time_F(STOP);
1270			print_result(D_CBC_192_AES,j,count,d);
1271			}
1272		}
1273	if (doit[D_CBC_256_AES])
1274		{
1275		for (j=0; j<SIZE_NUM; j++)
1276			{
1277			print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1278			Time_F(START);
1279			for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1280				AES_cbc_encrypt(buf,buf,
1281					(unsigned long)lengths[j],&aes_ks3,
1282					iv,AES_ENCRYPT);
1283			d=Time_F(STOP);
1284			print_result(D_CBC_256_AES,j,count,d);
1285			}
1286		}
1287
1288#endif
1289#ifndef OPENSSL_NO_IDEA
1290	if (doit[D_CBC_IDEA])
1291		{
1292		for (j=0; j<SIZE_NUM; j++)
1293			{
1294			print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1295			Time_F(START);
1296			for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1297				idea_cbc_encrypt(buf,buf,
1298					(unsigned long)lengths[j],&idea_ks,
1299					iv,IDEA_ENCRYPT);
1300			d=Time_F(STOP);
1301			print_result(D_CBC_IDEA,j,count,d);
1302			}
1303		}
1304#endif
1305#ifndef OPENSSL_NO_RC2
1306	if (doit[D_CBC_RC2])
1307		{
1308		for (j=0; j<SIZE_NUM; j++)
1309			{
1310			print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1311			Time_F(START);
1312			for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1313				RC2_cbc_encrypt(buf,buf,
1314					(unsigned long)lengths[j],&rc2_ks,
1315					iv,RC2_ENCRYPT);
1316			d=Time_F(STOP);
1317			print_result(D_CBC_RC2,j,count,d);
1318			}
1319		}
1320#endif
1321#ifndef OPENSSL_NO_RC5
1322	if (doit[D_CBC_RC5])
1323		{
1324		for (j=0; j<SIZE_NUM; j++)
1325			{
1326			print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1327			Time_F(START);
1328			for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1329				RC5_32_cbc_encrypt(buf,buf,
1330					(unsigned long)lengths[j],&rc5_ks,
1331					iv,RC5_ENCRYPT);
1332			d=Time_F(STOP);
1333			print_result(D_CBC_RC5,j,count,d);
1334			}
1335		}
1336#endif
1337#ifndef OPENSSL_NO_BF
1338	if (doit[D_CBC_BF])
1339		{
1340		for (j=0; j<SIZE_NUM; j++)
1341			{
1342			print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1343			Time_F(START);
1344			for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1345				BF_cbc_encrypt(buf,buf,
1346					(unsigned long)lengths[j],&bf_ks,
1347					iv,BF_ENCRYPT);
1348			d=Time_F(STOP);
1349			print_result(D_CBC_BF,j,count,d);
1350			}
1351		}
1352#endif
1353#ifndef OPENSSL_NO_CAST
1354	if (doit[D_CBC_CAST])
1355		{
1356		for (j=0; j<SIZE_NUM; j++)
1357			{
1358			print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1359			Time_F(START);
1360			for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1361				CAST_cbc_encrypt(buf,buf,
1362					(unsigned long)lengths[j],&cast_ks,
1363					iv,CAST_ENCRYPT);
1364			d=Time_F(STOP);
1365			print_result(D_CBC_CAST,j,count,d);
1366			}
1367		}
1368#endif
1369
1370	if (doit[D_EVP])
1371		{
1372		for (j=0; j<SIZE_NUM; j++)
1373			{
1374			if (evp_cipher)
1375				{
1376				EVP_CIPHER_CTX ctx;
1377				int outl;
1378
1379				names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1380				/* -O3 -fschedule-insns messes up an
1381				 * optimization here!  names[D_EVP]
1382				 * somehow becomes NULL */
1383				print_message(names[D_EVP],save_count,
1384					lengths[j]);
1385
1386				EVP_CIPHER_CTX_init(&ctx);
1387				if(decrypt)
1388					EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1389				else
1390					EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1391
1392				Time_F(START);
1393				if(decrypt)
1394					for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1395						EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1396				else
1397					for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1398						EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1399				if(decrypt)
1400					EVP_DecryptFinal_ex(&ctx,buf,&outl);
1401				else
1402					EVP_EncryptFinal_ex(&ctx,buf,&outl);
1403				d=Time_F(STOP);
1404				EVP_CIPHER_CTX_cleanup(&ctx);
1405				}
1406			if (evp_md)
1407				{
1408				names[D_EVP]=OBJ_nid2ln(evp_md->type);
1409				print_message(names[D_EVP],save_count,
1410					lengths[j]);
1411
1412				Time_F(START);
1413				for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1414					EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1415
1416				d=Time_F(STOP);
1417				}
1418			print_result(D_EVP,j,count,d);
1419			}
1420		}
1421
1422	RAND_pseudo_bytes(buf,36);
1423#ifndef OPENSSL_NO_RSA
1424	for (j=0; j<RSA_NUM; j++)
1425		{
1426		int ret;
1427		if (!rsa_doit[j]) continue;
1428		ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1429		if (ret == 0)
1430			{
1431			BIO_printf(bio_err,"RSA sign failure.  No RSA sign will be done.\n");
1432			ERR_print_errors(bio_err);
1433			rsa_count=1;
1434			}
1435		else
1436			{
1437			pkey_print_message("private","rsa",
1438				rsa_c[j][0],rsa_bits[j],
1439				RSA_SECONDS);
1440/*			RSA_blinding_on(rsa_key[j],NULL); */
1441			Time_F(START);
1442			for (count=0,run=1; COND(rsa_c[j][0]); count++)
1443				{
1444				ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1445					&rsa_num, rsa_key[j]);
1446				if (ret == 0)
1447					{
1448					BIO_printf(bio_err,
1449						"RSA sign failure\n");
1450					ERR_print_errors(bio_err);
1451					count=1;
1452					break;
1453					}
1454				}
1455			d=Time_F(STOP);
1456			BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1457				   : "%ld %d bit private RSA's in %.2fs\n",
1458				   count,rsa_bits[j],d);
1459			rsa_results[j][0]=d/(double)count;
1460			rsa_count=count;
1461			}
1462
1463#if 1
1464		ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1465		if (ret <= 0)
1466			{
1467			BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
1468			ERR_print_errors(bio_err);
1469			rsa_doit[j] = 0;
1470			}
1471		else
1472			{
1473			pkey_print_message("public","rsa",
1474				rsa_c[j][1],rsa_bits[j],
1475				RSA_SECONDS);
1476			Time_F(START);
1477			for (count=0,run=1; COND(rsa_c[j][1]); count++)
1478				{
1479				ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1480					rsa_num, rsa_key[j]);
1481				if (ret == 0)
1482					{
1483					BIO_printf(bio_err,
1484						"RSA verify failure\n");
1485					ERR_print_errors(bio_err);
1486					count=1;
1487					break;
1488					}
1489				}
1490			d=Time_F(STOP);
1491			BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1492				   : "%ld %d bit public RSA's in %.2fs\n",
1493				   count,rsa_bits[j],d);
1494			rsa_results[j][1]=d/(double)count;
1495			}
1496#endif
1497
1498		if (rsa_count <= 1)
1499			{
1500			/* if longer than 10s, don't do any more */
1501			for (j++; j<RSA_NUM; j++)
1502				rsa_doit[j]=0;
1503			}
1504		}
1505#endif
1506
1507	RAND_pseudo_bytes(buf,20);
1508#ifndef OPENSSL_NO_DSA
1509	if (RAND_status() != 1)
1510		{
1511		RAND_seed(rnd_seed, sizeof rnd_seed);
1512		rnd_fake = 1;
1513		}
1514	for (j=0; j<DSA_NUM; j++)
1515		{
1516		unsigned int kk;
1517		int ret;
1518
1519		if (!dsa_doit[j]) continue;
1520/*		DSA_generate_key(dsa_key[j]); */
1521/*		DSA_sign_setup(dsa_key[j],NULL); */
1522		ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1523			&kk,dsa_key[j]);
1524		if (ret == 0)
1525			{
1526			BIO_printf(bio_err,"DSA sign failure.  No DSA sign will be done.\n");
1527			ERR_print_errors(bio_err);
1528			rsa_count=1;
1529			}
1530		else
1531			{
1532			pkey_print_message("sign","dsa",
1533				dsa_c[j][0],dsa_bits[j],
1534				DSA_SECONDS);
1535			Time_F(START);
1536			for (count=0,run=1; COND(dsa_c[j][0]); count++)
1537				{
1538				ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1539					&kk,dsa_key[j]);
1540				if (ret == 0)
1541					{
1542					BIO_printf(bio_err,
1543						"DSA sign failure\n");
1544					ERR_print_errors(bio_err);
1545					count=1;
1546					break;
1547					}
1548				}
1549			d=Time_F(STOP);
1550			BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1551				   : "%ld %d bit DSA signs in %.2fs\n",
1552				   count,dsa_bits[j],d);
1553			dsa_results[j][0]=d/(double)count;
1554			rsa_count=count;
1555			}
1556
1557		ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1558			kk,dsa_key[j]);
1559		if (ret <= 0)
1560			{
1561			BIO_printf(bio_err,"DSA verify failure.  No DSA verify will be done.\n");
1562			ERR_print_errors(bio_err);
1563			dsa_doit[j] = 0;
1564			}
1565		else
1566			{
1567			pkey_print_message("verify","dsa",
1568				dsa_c[j][1],dsa_bits[j],
1569				DSA_SECONDS);
1570			Time_F(START);
1571			for (count=0,run=1; COND(dsa_c[j][1]); count++)
1572				{
1573				ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1574					kk,dsa_key[j]);
1575				if (ret <= 0)
1576					{
1577					BIO_printf(bio_err,
1578						"DSA verify failure\n");
1579					ERR_print_errors(bio_err);
1580					count=1;
1581					break;
1582					}
1583				}
1584			d=Time_F(STOP);
1585			BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1586				   : "%ld %d bit DSA verify in %.2fs\n",
1587				   count,dsa_bits[j],d);
1588			dsa_results[j][1]=d/(double)count;
1589			}
1590
1591		if (rsa_count <= 1)
1592			{
1593			/* if longer than 10s, don't do any more */
1594			for (j++; j<DSA_NUM; j++)
1595				dsa_doit[j]=0;
1596			}
1597		}
1598	if (rnd_fake) RAND_cleanup();
1599#endif
1600#ifdef HAVE_FORK
1601show_res:
1602#endif
1603	if(!mr)
1604		{
1605		fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1606        fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1607		printf("options:");
1608		printf("%s ",BN_options());
1609#ifndef OPENSSL_NO_MD2
1610		printf("%s ",MD2_options());
1611#endif
1612#ifndef OPENSSL_NO_RC4
1613		printf("%s ",RC4_options());
1614#endif
1615#ifndef OPENSSL_NO_DES
1616		printf("%s ",DES_options());
1617#endif
1618#ifndef OPENSSL_NO_AES
1619		printf("%s ",AES_options());
1620#endif
1621#ifndef OPENSSL_NO_IDEA
1622		printf("%s ",idea_options());
1623#endif
1624#ifndef OPENSSL_NO_BF
1625		printf("%s ",BF_options());
1626#endif
1627		fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1628		printf("available timing options: ");
1629#ifdef TIMES
1630		printf("TIMES ");
1631#endif
1632#ifdef TIMEB
1633		printf("TIMEB ");
1634#endif
1635#ifdef USE_TOD
1636		printf("USE_TOD ");
1637#endif
1638#ifdef HZ
1639#define as_string(s) (#s)
1640		printf("HZ=%g", (double)HZ);
1641# ifdef _SC_CLK_TCK
1642		printf(" [sysconf value]");
1643# endif
1644#endif
1645		printf("\n");
1646		printf("timing function used: %s%s%s%s%s%s%s\n",
1647		       (ftime_used ? "ftime" : ""),
1648		       (ftime_used + times_used > 1 ? "," : ""),
1649		       (times_used ? "times" : ""),
1650		       (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1651		       (gettimeofday_used ? "gettimeofday" : ""),
1652		       (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1653		       (getrusage_used ? "getrusage" : ""));
1654		}
1655
1656	if (pr_header)
1657		{
1658		if(mr)
1659			fprintf(stdout,"+H");
1660		else
1661			{
1662			fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1663			fprintf(stdout,"type        ");
1664			}
1665		for (j=0;  j<SIZE_NUM; j++)
1666			fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1667		fprintf(stdout,"\n");
1668		}
1669
1670	for (k=0; k<ALGOR_NUM; k++)
1671		{
1672		if (!doit[k]) continue;
1673		if(mr)
1674			fprintf(stdout,"+F:%d:%s",k,names[k]);
1675		else
1676			fprintf(stdout,"%-13s",names[k]);
1677		for (j=0; j<SIZE_NUM; j++)
1678			{
1679			if (results[k][j] > 10000 && !mr)
1680				fprintf(stdout," %11.2fk",results[k][j]/1e3);
1681			else
1682				fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1683			}
1684		fprintf(stdout,"\n");
1685		}
1686#ifndef OPENSSL_NO_RSA
1687	j=1;
1688	for (k=0; k<RSA_NUM; k++)
1689		{
1690		if (!rsa_doit[k]) continue;
1691		if (j && !mr)
1692			{
1693			printf("%18ssign    verify    sign/s verify/s\n"," ");
1694			j=0;
1695			}
1696		if(mr)
1697			fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1698				k,rsa_bits[k],rsa_results[k][0],
1699				rsa_results[k][1]);
1700		else
1701			fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1702				rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1703				1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1704		}
1705#endif
1706#ifndef OPENSSL_NO_DSA
1707	j=1;
1708	for (k=0; k<DSA_NUM; k++)
1709		{
1710		if (!dsa_doit[k]) continue;
1711		if (j && !mr)
1712			{
1713			printf("%18ssign    verify    sign/s verify/s\n"," ");
1714			j=0;
1715			}
1716		if(mr)
1717			fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1718				k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1719		else
1720			fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1721				dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1722				1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1723		}
1724#endif
1725	mret=0;
1726end:
1727	ERR_print_errors(bio_err);
1728	if (buf != NULL) OPENSSL_free(buf);
1729	if (buf2 != NULL) OPENSSL_free(buf2);
1730#ifndef OPENSSL_NO_RSA
1731	for (i=0; i<RSA_NUM; i++)
1732		if (rsa_key[i] != NULL)
1733			RSA_free(rsa_key[i]);
1734#endif
1735#ifndef OPENSSL_NO_DSA
1736	for (i=0; i<DSA_NUM; i++)
1737		if (dsa_key[i] != NULL)
1738			DSA_free(dsa_key[i]);
1739#endif
1740	apps_shutdown();
1741	OPENSSL_EXIT(mret);
1742	}
1743
1744static void print_message(const char *s, long num, int length)
1745	{
1746#ifdef SIGALRM
1747	BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1748		   : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1749	(void)BIO_flush(bio_err);
1750	alarm(SECONDS);
1751#else
1752	BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1753		   : "Doing %s %ld times on %d size blocks: ",s,num,length);
1754	(void)BIO_flush(bio_err);
1755#endif
1756#ifdef LINT
1757	num=num;
1758#endif
1759	}
1760
1761static void pkey_print_message(char *str, char *str2, long num, int bits,
1762	     int tm)
1763	{
1764#ifdef SIGALRM
1765	BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1766			   : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1767	(void)BIO_flush(bio_err);
1768	alarm(RSA_SECONDS);
1769#else
1770	BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1771			   : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1772	(void)BIO_flush(bio_err);
1773#endif
1774#ifdef LINT
1775	num=num;
1776#endif
1777	}
1778
1779static void print_result(int alg,int run_no,int count,double time_used)
1780	{
1781	BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1782		   : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1783	results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1784	}
1785
1786static char *sstrsep(char **string, const char *delim)
1787    {
1788    char isdelim[256];
1789    char *token = *string;
1790
1791    if (**string == 0)
1792        return NULL;
1793
1794    memset(isdelim, 0, sizeof isdelim);
1795    isdelim[0] = 1;
1796
1797    while (*delim)
1798        {
1799        isdelim[(unsigned char)(*delim)] = 1;
1800        delim++;
1801        }
1802
1803    while (!isdelim[(unsigned char)(**string)])
1804        {
1805        (*string)++;
1806        }
1807
1808    if (**string)
1809        {
1810        **string = 0;
1811        (*string)++;
1812        }
1813
1814    return token;
1815    }
1816
1817#ifdef HAVE_FORK
1818static int do_multi(int multi)
1819	{
1820	int n;
1821	int fd[2];
1822	int *fds;
1823	static char sep[]=":";
1824
1825	fds=malloc(multi*sizeof *fds);
1826	for(n=0 ; n < multi ; ++n)
1827		{
1828		pipe(fd);
1829		if(fork())
1830			{
1831			close(fd[1]);
1832			fds[n]=fd[0];
1833			}
1834		else
1835			{
1836			close(fd[0]);
1837			close(1);
1838			dup(fd[1]);
1839			close(fd[1]);
1840			mr=1;
1841			usertime=0;
1842			return 0;
1843			}
1844		printf("Forked child %d\n",n);
1845		}
1846
1847	/* for now, assume the pipe is long enough to take all the output */
1848	for(n=0 ; n < multi ; ++n)
1849		{
1850		FILE *f;
1851		char buf[1024];
1852		char *p;
1853
1854		f=fdopen(fds[n],"r");
1855		while(fgets(buf,sizeof buf,f))
1856			{
1857			p=strchr(buf,'\n');
1858			if(p)
1859				*p='\0';
1860			if(buf[0] != '+')
1861				{
1862				fprintf(stderr,"Don't understand line '%s' from child %d\n",
1863						buf,n);
1864				continue;
1865				}
1866			printf("Got: %s from %d\n",buf,n);
1867			if(!strncmp(buf,"+F:",3))
1868				{
1869				int alg;
1870				int j;
1871
1872				p=buf+3;
1873				alg=atoi(sstrsep(&p,sep));
1874				sstrsep(&p,sep);
1875				for(j=0 ; j < SIZE_NUM ; ++j)
1876					results[alg][j]+=atof(sstrsep(&p,sep));
1877				}
1878			else if(!strncmp(buf,"+F2:",4))
1879				{
1880				int k;
1881				double d;
1882
1883				p=buf+4;
1884				k=atoi(sstrsep(&p,sep));
1885				sstrsep(&p,sep);
1886
1887				d=atof(sstrsep(&p,sep));
1888				if(n)
1889					rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1890				else
1891					rsa_results[k][0]=d;
1892
1893				d=atof(sstrsep(&p,sep));
1894				if(n)
1895					rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1896				else
1897					rsa_results[k][1]=d;
1898				}
1899			else if(!strncmp(buf,"+F2:",4))
1900				{
1901				int k;
1902				double d;
1903
1904				p=buf+4;
1905				k=atoi(sstrsep(&p,sep));
1906				sstrsep(&p,sep);
1907
1908				d=atof(sstrsep(&p,sep));
1909				if(n)
1910					rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1911				else
1912					rsa_results[k][0]=d;
1913
1914				d=atof(sstrsep(&p,sep));
1915				if(n)
1916					rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1917				else
1918					rsa_results[k][1]=d;
1919				}
1920			else if(!strncmp(buf,"+F3:",4))
1921				{
1922				int k;
1923				double d;
1924
1925				p=buf+4;
1926				k=atoi(sstrsep(&p,sep));
1927				sstrsep(&p,sep);
1928
1929				d=atof(sstrsep(&p,sep));
1930				if(n)
1931					dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1932				else
1933					dsa_results[k][0]=d;
1934
1935				d=atof(sstrsep(&p,sep));
1936				if(n)
1937					dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1938				else
1939					dsa_results[k][1]=d;
1940				}
1941			else if(!strncmp(buf,"+H:",3))
1942				{
1943				}
1944			else
1945				fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);
1946			}
1947		}
1948	return 1;
1949	}
1950#endif
1951#endif
1952