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