speed.c revision 127134
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
1399				Time_F(START);
1400				if(decrypt)
1401					for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1402						EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1403				else
1404					for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1405						EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1406				if(decrypt)
1407					EVP_DecryptFinal_ex(&ctx,buf,&outl);
1408				else
1409					EVP_EncryptFinal_ex(&ctx,buf,&outl);
1410				d=Time_F(STOP);
1411				EVP_CIPHER_CTX_cleanup(&ctx);
1412				}
1413			if (evp_md)
1414				{
1415				names[D_EVP]=OBJ_nid2ln(evp_md->type);
1416				print_message(names[D_EVP],save_count,
1417					lengths[j]);
1418
1419				Time_F(START);
1420				for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1421					EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1422
1423				d=Time_F(STOP);
1424				}
1425			print_result(D_EVP,j,count,d);
1426			}
1427		}
1428
1429	RAND_pseudo_bytes(buf,36);
1430#ifndef OPENSSL_NO_RSA
1431	for (j=0; j<RSA_NUM; j++)
1432		{
1433		int ret;
1434		if (!rsa_doit[j]) continue;
1435		ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1436		if (ret == 0)
1437			{
1438			BIO_printf(bio_err,"RSA sign failure.  No RSA sign will be done.\n");
1439			ERR_print_errors(bio_err);
1440			rsa_count=1;
1441			}
1442		else
1443			{
1444			pkey_print_message("private","rsa",
1445				rsa_c[j][0],rsa_bits[j],
1446				RSA_SECONDS);
1447/*			RSA_blinding_on(rsa_key[j],NULL); */
1448			Time_F(START);
1449			for (count=0,run=1; COND(rsa_c[j][0]); count++)
1450				{
1451				ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1452					&rsa_num, rsa_key[j]);
1453				if (ret == 0)
1454					{
1455					BIO_printf(bio_err,
1456						"RSA sign failure\n");
1457					ERR_print_errors(bio_err);
1458					count=1;
1459					break;
1460					}
1461				}
1462			d=Time_F(STOP);
1463			BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1464				   : "%ld %d bit private RSA's in %.2fs\n",
1465				   count,rsa_bits[j],d);
1466			rsa_results[j][0]=d/(double)count;
1467			rsa_count=count;
1468			}
1469
1470#if 1
1471		ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1472		if (ret <= 0)
1473			{
1474			BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
1475			ERR_print_errors(bio_err);
1476			rsa_doit[j] = 0;
1477			}
1478		else
1479			{
1480			pkey_print_message("public","rsa",
1481				rsa_c[j][1],rsa_bits[j],
1482				RSA_SECONDS);
1483			Time_F(START);
1484			for (count=0,run=1; COND(rsa_c[j][1]); count++)
1485				{
1486				ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1487					rsa_num, rsa_key[j]);
1488				if (ret == 0)
1489					{
1490					BIO_printf(bio_err,
1491						"RSA verify failure\n");
1492					ERR_print_errors(bio_err);
1493					count=1;
1494					break;
1495					}
1496				}
1497			d=Time_F(STOP);
1498			BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1499				   : "%ld %d bit public RSA's in %.2fs\n",
1500				   count,rsa_bits[j],d);
1501			rsa_results[j][1]=d/(double)count;
1502			}
1503#endif
1504
1505		if (rsa_count <= 1)
1506			{
1507			/* if longer than 10s, don't do any more */
1508			for (j++; j<RSA_NUM; j++)
1509				rsa_doit[j]=0;
1510			}
1511		}
1512#endif
1513
1514	RAND_pseudo_bytes(buf,20);
1515#ifndef OPENSSL_NO_DSA
1516	if (RAND_status() != 1)
1517		{
1518		RAND_seed(rnd_seed, sizeof rnd_seed);
1519		rnd_fake = 1;
1520		}
1521	for (j=0; j<DSA_NUM; j++)
1522		{
1523		unsigned int kk;
1524		int ret;
1525
1526		if (!dsa_doit[j]) continue;
1527/*		DSA_generate_key(dsa_key[j]); */
1528/*		DSA_sign_setup(dsa_key[j],NULL); */
1529		ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1530			&kk,dsa_key[j]);
1531		if (ret == 0)
1532			{
1533			BIO_printf(bio_err,"DSA sign failure.  No DSA sign will be done.\n");
1534			ERR_print_errors(bio_err);
1535			rsa_count=1;
1536			}
1537		else
1538			{
1539			pkey_print_message("sign","dsa",
1540				dsa_c[j][0],dsa_bits[j],
1541				DSA_SECONDS);
1542			Time_F(START);
1543			for (count=0,run=1; COND(dsa_c[j][0]); count++)
1544				{
1545				ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1546					&kk,dsa_key[j]);
1547				if (ret == 0)
1548					{
1549					BIO_printf(bio_err,
1550						"DSA sign failure\n");
1551					ERR_print_errors(bio_err);
1552					count=1;
1553					break;
1554					}
1555				}
1556			d=Time_F(STOP);
1557			BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1558				   : "%ld %d bit DSA signs in %.2fs\n",
1559				   count,dsa_bits[j],d);
1560			dsa_results[j][0]=d/(double)count;
1561			rsa_count=count;
1562			}
1563
1564		ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1565			kk,dsa_key[j]);
1566		if (ret <= 0)
1567			{
1568			BIO_printf(bio_err,"DSA verify failure.  No DSA verify will be done.\n");
1569			ERR_print_errors(bio_err);
1570			dsa_doit[j] = 0;
1571			}
1572		else
1573			{
1574			pkey_print_message("verify","dsa",
1575				dsa_c[j][1],dsa_bits[j],
1576				DSA_SECONDS);
1577			Time_F(START);
1578			for (count=0,run=1; COND(dsa_c[j][1]); count++)
1579				{
1580				ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1581					kk,dsa_key[j]);
1582				if (ret <= 0)
1583					{
1584					BIO_printf(bio_err,
1585						"DSA verify failure\n");
1586					ERR_print_errors(bio_err);
1587					count=1;
1588					break;
1589					}
1590				}
1591			d=Time_F(STOP);
1592			BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1593				   : "%ld %d bit DSA verify in %.2fs\n",
1594				   count,dsa_bits[j],d);
1595			dsa_results[j][1]=d/(double)count;
1596			}
1597
1598		if (rsa_count <= 1)
1599			{
1600			/* if longer than 10s, don't do any more */
1601			for (j++; j<DSA_NUM; j++)
1602				dsa_doit[j]=0;
1603			}
1604		}
1605	if (rnd_fake) RAND_cleanup();
1606#endif
1607#ifdef HAVE_FORK
1608show_res:
1609#endif
1610	if(!mr)
1611		{
1612		fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1613        fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1614		printf("options:");
1615		printf("%s ",BN_options());
1616#ifndef OPENSSL_NO_MD2
1617		printf("%s ",MD2_options());
1618#endif
1619#ifndef OPENSSL_NO_RC4
1620		printf("%s ",RC4_options());
1621#endif
1622#ifndef OPENSSL_NO_DES
1623		printf("%s ",DES_options());
1624#endif
1625#ifndef OPENSSL_NO_AES
1626		printf("%s ",AES_options());
1627#endif
1628#ifndef OPENSSL_NO_IDEA
1629		printf("%s ",idea_options());
1630#endif
1631#ifndef OPENSSL_NO_BF
1632		printf("%s ",BF_options());
1633#endif
1634		fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1635		printf("available timing options: ");
1636#ifdef TIMES
1637		printf("TIMES ");
1638#endif
1639#ifdef TIMEB
1640		printf("TIMEB ");
1641#endif
1642#ifdef USE_TOD
1643		printf("USE_TOD ");
1644#endif
1645#ifdef HZ
1646#define as_string(s) (#s)
1647		printf("HZ=%g", (double)HZ);
1648# ifdef _SC_CLK_TCK
1649		printf(" [sysconf value]");
1650# endif
1651#endif
1652		printf("\n");
1653		printf("timing function used: %s%s%s%s%s%s%s\n",
1654		       (ftime_used ? "ftime" : ""),
1655		       (ftime_used + times_used > 1 ? "," : ""),
1656		       (times_used ? "times" : ""),
1657		       (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1658		       (gettimeofday_used ? "gettimeofday" : ""),
1659		       (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1660		       (getrusage_used ? "getrusage" : ""));
1661		}
1662
1663	if (pr_header)
1664		{
1665		if(mr)
1666			fprintf(stdout,"+H");
1667		else
1668			{
1669			fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1670			fprintf(stdout,"type        ");
1671			}
1672		for (j=0;  j<SIZE_NUM; j++)
1673			fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1674		fprintf(stdout,"\n");
1675		}
1676
1677	for (k=0; k<ALGOR_NUM; k++)
1678		{
1679		if (!doit[k]) continue;
1680		if(mr)
1681			fprintf(stdout,"+F:%d:%s",k,names[k]);
1682		else
1683			fprintf(stdout,"%-13s",names[k]);
1684		for (j=0; j<SIZE_NUM; j++)
1685			{
1686			if (results[k][j] > 10000 && !mr)
1687				fprintf(stdout," %11.2fk",results[k][j]/1e3);
1688			else
1689				fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1690			}
1691		fprintf(stdout,"\n");
1692		}
1693#ifndef OPENSSL_NO_RSA
1694	j=1;
1695	for (k=0; k<RSA_NUM; k++)
1696		{
1697		if (!rsa_doit[k]) continue;
1698		if (j && !mr)
1699			{
1700			printf("%18ssign    verify    sign/s verify/s\n"," ");
1701			j=0;
1702			}
1703		if(mr)
1704			fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1705				k,rsa_bits[k],rsa_results[k][0],
1706				rsa_results[k][1]);
1707		else
1708			fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1709				rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1710				1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1711		}
1712#endif
1713#ifndef OPENSSL_NO_DSA
1714	j=1;
1715	for (k=0; k<DSA_NUM; k++)
1716		{
1717		if (!dsa_doit[k]) continue;
1718		if (j && !mr)
1719			{
1720			printf("%18ssign    verify    sign/s verify/s\n"," ");
1721			j=0;
1722			}
1723		if(mr)
1724			fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1725				k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1726		else
1727			fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1728				dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1729				1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1730		}
1731#endif
1732	mret=0;
1733end:
1734	ERR_print_errors(bio_err);
1735	if (buf != NULL) OPENSSL_free(buf);
1736	if (buf2 != NULL) OPENSSL_free(buf2);
1737#ifndef OPENSSL_NO_RSA
1738	for (i=0; i<RSA_NUM; i++)
1739		if (rsa_key[i] != NULL)
1740			RSA_free(rsa_key[i]);
1741#endif
1742#ifndef OPENSSL_NO_DSA
1743	for (i=0; i<DSA_NUM; i++)
1744		if (dsa_key[i] != NULL)
1745			DSA_free(dsa_key[i]);
1746#endif
1747	apps_shutdown();
1748	OPENSSL_EXIT(mret);
1749	}
1750
1751static void print_message(const char *s, long num, int length)
1752	{
1753#ifdef SIGALRM
1754	BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1755		   : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1756	(void)BIO_flush(bio_err);
1757	alarm(SECONDS);
1758#else
1759	BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1760		   : "Doing %s %ld times on %d size blocks: ",s,num,length);
1761	(void)BIO_flush(bio_err);
1762#endif
1763#ifdef LINT
1764	num=num;
1765#endif
1766	}
1767
1768static void pkey_print_message(char *str, char *str2, long num, int bits,
1769	     int tm)
1770	{
1771#ifdef SIGALRM
1772	BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1773			   : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1774	(void)BIO_flush(bio_err);
1775	alarm(RSA_SECONDS);
1776#else
1777	BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1778			   : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1779	(void)BIO_flush(bio_err);
1780#endif
1781#ifdef LINT
1782	num=num;
1783#endif
1784	}
1785
1786static void print_result(int alg,int run_no,int count,double time_used)
1787	{
1788	BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1789		   : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1790	results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1791	}
1792
1793static char *sstrsep(char **string, const char *delim)
1794    {
1795    char isdelim[256];
1796    char *token = *string;
1797
1798    if (**string == 0)
1799        return NULL;
1800
1801    memset(isdelim, 0, sizeof isdelim);
1802    isdelim[0] = 1;
1803
1804    while (*delim)
1805        {
1806        isdelim[(unsigned char)(*delim)] = 1;
1807        delim++;
1808        }
1809
1810    while (!isdelim[(unsigned char)(**string)])
1811        {
1812        (*string)++;
1813        }
1814
1815    if (**string)
1816        {
1817        **string = 0;
1818        (*string)++;
1819        }
1820
1821    return token;
1822    }
1823
1824#ifdef HAVE_FORK
1825static int do_multi(int multi)
1826	{
1827	int n;
1828	int fd[2];
1829	int *fds;
1830	static char sep[]=":";
1831
1832	fds=malloc(multi*sizeof *fds);
1833	for(n=0 ; n < multi ; ++n)
1834		{
1835		pipe(fd);
1836		if(fork())
1837			{
1838			close(fd[1]);
1839			fds[n]=fd[0];
1840			}
1841		else
1842			{
1843			close(fd[0]);
1844			close(1);
1845			dup(fd[1]);
1846			close(fd[1]);
1847			mr=1;
1848			usertime=0;
1849			return 0;
1850			}
1851		printf("Forked child %d\n",n);
1852		}
1853
1854	/* for now, assume the pipe is long enough to take all the output */
1855	for(n=0 ; n < multi ; ++n)
1856		{
1857		FILE *f;
1858		char buf[1024];
1859		char *p;
1860
1861		f=fdopen(fds[n],"r");
1862		while(fgets(buf,sizeof buf,f))
1863			{
1864			p=strchr(buf,'\n');
1865			if(p)
1866				*p='\0';
1867			if(buf[0] != '+')
1868				{
1869				fprintf(stderr,"Don't understand line '%s' from child %d\n",
1870						buf,n);
1871				continue;
1872				}
1873			printf("Got: %s from %d\n",buf,n);
1874			if(!strncmp(buf,"+F:",3))
1875				{
1876				int alg;
1877				int j;
1878
1879				p=buf+3;
1880				alg=atoi(sstrsep(&p,sep));
1881				sstrsep(&p,sep);
1882				for(j=0 ; j < SIZE_NUM ; ++j)
1883					results[alg][j]+=atof(sstrsep(&p,sep));
1884				}
1885			else if(!strncmp(buf,"+F2:",4))
1886				{
1887				int k;
1888				double d;
1889
1890				p=buf+4;
1891				k=atoi(sstrsep(&p,sep));
1892				sstrsep(&p,sep);
1893
1894				d=atof(sstrsep(&p,sep));
1895				if(n)
1896					rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1897				else
1898					rsa_results[k][0]=d;
1899
1900				d=atof(sstrsep(&p,sep));
1901				if(n)
1902					rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1903				else
1904					rsa_results[k][1]=d;
1905				}
1906			else if(!strncmp(buf,"+F2:",4))
1907				{
1908				int k;
1909				double d;
1910
1911				p=buf+4;
1912				k=atoi(sstrsep(&p,sep));
1913				sstrsep(&p,sep);
1914
1915				d=atof(sstrsep(&p,sep));
1916				if(n)
1917					rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1918				else
1919					rsa_results[k][0]=d;
1920
1921				d=atof(sstrsep(&p,sep));
1922				if(n)
1923					rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1924				else
1925					rsa_results[k][1]=d;
1926				}
1927			else if(!strncmp(buf,"+F3:",4))
1928				{
1929				int k;
1930				double d;
1931
1932				p=buf+4;
1933				k=atoi(sstrsep(&p,sep));
1934				sstrsep(&p,sep);
1935
1936				d=atof(sstrsep(&p,sep));
1937				if(n)
1938					dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1939				else
1940					dsa_results[k][0]=d;
1941
1942				d=atof(sstrsep(&p,sep));
1943				if(n)
1944					dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1945				else
1946					dsa_results[k][1]=d;
1947				}
1948			else if(!strncmp(buf,"+H:",3))
1949				{
1950				}
1951			else
1952				fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);
1953			}
1954		}
1955	return 1;
1956	}
1957#endif
1958#endif
1959