1 /* apps/speed.c -*- mode:C; c-file-style: "eay" -*- */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
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.
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).
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.
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
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)"
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
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.]
59 /* most of this code has been pilfered from my libdes speed.c program */
63 #define RSA_SECONDS 10
64 #define DSA_SECONDS 10
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 */
70 #define PROG speed_main
78 #ifdef OPENSSL_NO_STDIO
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 #include OPENSSL_UNISTD
88 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
90 #elif !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
93 #if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_MPE) && !defined(__NetBSD__) /* FIXME */
101 # include <sys/types.h>
102 # include <sys/times.h>
105 # include <sys/time.h>
106 # include <sys/resource.h>
109 /* Depending on the VMS version, the tms structure is perhaps defined.
110 The __TMS macro will show if it was. If it wasn't defined, we should
111 undefine TIMES, since that tells the rest of the program how things
112 should be handled. -- Richard Levitte */
113 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
118 #include <sys/timeb.h>
121 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD)
122 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
125 #if defined(sun) || defined(__ultrix)
126 #define _POSIX_SOURCE
128 #include <sys/param.h>
131 #ifndef OPENSSL_NO_DES
132 #include <openssl/des_old.h>
134 #ifndef OPENSSL_NO_MD2
135 #include <openssl/md2.h>
137 #ifndef OPENSSL_NO_MDC2
138 #include <openssl/mdc2.h>
140 #ifndef OPENSSL_NO_MD4
141 #include <openssl/md4.h>
143 #ifndef OPENSSL_NO_MD5
144 #include <openssl/md5.h>
146 #ifndef OPENSSL_NO_HMAC
147 #include <openssl/hmac.h>
149 #include <openssl/evp.h>
150 #ifndef OPENSSL_NO_SHA
151 #include <openssl/sha.h>
153 #ifndef OPENSSL_NO_RIPEMD
154 #include <openssl/ripemd.h>
156 #ifndef OPENSSL_NO_RC4
157 #include <openssl/rc4.h>
159 #ifndef OPENSSL_NO_RC5
160 #include <openssl/rc5.h>
162 #ifndef OPENSSL_NO_RC2
163 #include <openssl/rc2.h>
165 #ifndef OPENSSL_NO_IDEA
166 #include <openssl/idea.h>
168 #ifndef OPENSSL_NO_BF
169 #include <openssl/blowfish.h>
171 #ifndef OPENSSL_NO_CAST
172 #include <openssl/cast.h>
174 #ifndef OPENSSL_NO_RSA
175 #include <openssl/rsa.h>
176 #include "./testrsa.h"
178 #include <openssl/x509.h>
179 #ifndef OPENSSL_NO_DSA
180 #include "./testdsa.h"
183 /* The following if from times(3) man page. It may need to be changed */
186 # define HZ ((double)sysconf(_SC_CLK_TCK))
189 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
191 # else /* _BSD_CLK_TCK_ */
192 # define HZ ((double)_BSD_CLK_TCK_)
195 # define HZ ((double)CLK_TCK)
200 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
205 #define BUFSIZE ((long)1024*8+1)
208 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
210 static int usertime=1;
212 static double Time_F(int s);
213 static void print_message(const char *s,long num,int length);
214 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
215 static void print_result(int alg,int run_no,int count,double time_used);
217 static int do_multi(int multi);
220 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
221 #define SIGRETTYPE void
223 #define SIGRETTYPE int
230 static 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 static double results[ALGOR_NUM][SIZE_NUM];
235 static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
236 static double rsa_results[RSA_NUM][2];
237 static double dsa_results[DSA_NUM][2];
239 static SIGRETTYPE sig_done(int sig);
240 static SIGRETTYPE sig_done(int sig)
242 signal(SIGALRM,sig_done);
253 static double Time_F(int s)
260 static struct rusage tstart,tend;
265 getrusage(RUSAGE_SELF,&tstart);
272 getrusage(RUSAGE_SELF,&tend);
273 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
274 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
275 +((double)i)/1000000.0;
276 return((ret < 0.001)?0.001:ret);
281 static struct timeval tstart,tend;
284 gettimeofday_used = 1;
287 gettimeofday(&tstart,NULL);
292 gettimeofday(&tend,NULL);
293 i=(long)tend.tv_usec-(long)tstart.tv_usec;
294 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
295 return((ret < 0.001)?0.001:ret);
298 #else /* ndef USE_TOD */
303 static struct tms tstart,tend;
314 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
315 return((ret < 1e-3)?1e-3:ret);
318 # endif /* times() */
319 # if defined(TIMES) && defined(TIMEB)
324 static struct timeb tstart,tend;
336 i=(long)tend.millitm-(long)tstart.millitm;
337 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
338 return((ret < 0.001)?0.001:ret);
345 int MAIN(int, char **);
347 int MAIN(int argc, char **argv)
350 unsigned char *buf=NULL,*buf2=NULL;
352 long count,rsa_count,save_count=0;
354 #ifndef OPENSSL_NO_RSA
357 #ifndef OPENSSL_NO_MD2
358 unsigned char md2[MD2_DIGEST_LENGTH];
360 #ifndef OPENSSL_NO_MDC2
361 unsigned char mdc2[MDC2_DIGEST_LENGTH];
363 #ifndef OPENSSL_NO_MD4
364 unsigned char md4[MD4_DIGEST_LENGTH];
366 #ifndef OPENSSL_NO_MD5
367 unsigned char md5[MD5_DIGEST_LENGTH];
368 unsigned char hmac[MD5_DIGEST_LENGTH];
370 #ifndef OPENSSL_NO_SHA
371 unsigned char sha[SHA_DIGEST_LENGTH];
373 #ifndef OPENSSL_NO_RIPEMD
374 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
376 #ifndef OPENSSL_NO_RC4
379 #ifndef OPENSSL_NO_RC5
382 #ifndef OPENSSL_NO_RC2
385 #ifndef OPENSSL_NO_IDEA
386 IDEA_KEY_SCHEDULE idea_ks;
388 #ifndef OPENSSL_NO_BF
391 #ifndef OPENSSL_NO_CAST
394 static unsigned char key16[16]=
395 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
396 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
398 #ifndef OPENSSL_NO_DES
399 DES_cblock *buf_as_des_cblock = NULL;
400 static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
401 static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
402 static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
403 DES_key_schedule sch;
404 DES_key_schedule sch2;
405 DES_key_schedule sch3;
417 #define D_CBC_IDEA 10
421 #define D_CBC_CAST 14
424 long c[ALGOR_NUM][SIZE_NUM];
432 #ifndef OPENSSL_NO_RSA
433 RSA *rsa_key[RSA_NUM];
434 long rsa_c[RSA_NUM][2];
435 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
436 static unsigned char *rsa_data[RSA_NUM]=
437 {test512,test1024,test2048,test4096};
438 static int rsa_data_length[RSA_NUM]={
439 sizeof(test512),sizeof(test1024),
440 sizeof(test2048),sizeof(test4096)};
442 #ifndef OPENSSL_NO_DSA
443 DSA *dsa_key[DSA_NUM];
444 long dsa_c[DSA_NUM][2];
445 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
447 int rsa_doit[RSA_NUM];
448 int dsa_doit[DSA_NUM];
451 const EVP_CIPHER *evp=NULL;
462 memset(results, 0, sizeof(results));
463 #ifndef OPENSSL_NO_DSA
464 memset(dsa_key,0,sizeof(dsa_key));
468 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
469 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
471 #ifndef OPENSSL_NO_RSA
472 memset(rsa_key,0,sizeof(rsa_key));
473 for (i=0; i<RSA_NUM; i++)
477 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
479 BIO_printf(bio_err,"out of memory\n");
482 #ifndef OPENSSL_NO_DES
483 buf_as_des_cblock = (des_cblock *)buf;
485 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
487 BIO_printf(bio_err,"out of memory\n");
491 memset(c,0,sizeof(c));
492 memset(iv,0,sizeof(iv));
494 for (i=0; i<ALGOR_NUM; i++)
496 for (i=0; i<RSA_NUM; i++)
498 for (i=0; i<DSA_NUM; i++)
506 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
509 j--; /* Otherwise, -elapsed gets confused with
512 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
518 BIO_printf(bio_err,"no EVP given\n");
521 evp=EVP_get_cipherbyname(*argv);
524 BIO_printf(bio_err,"%s is an unknown cipher\n",*argv);
529 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
532 j--; /* Otherwise, -elapsed gets confused with
535 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
541 BIO_printf(bio_err,"no engine given\n");
544 e = setup_engine(bio_err, *argv, 0);
545 /* j will be increased again further down. We just
546 don't want speed to confuse an engine with an
547 algorithm, especially when none is given (which
548 means all of them should be run) */
552 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
558 BIO_printf(bio_err,"no multi count given\n");
564 BIO_printf(bio_err,"bad multi count\n");
567 j--; /* Otherwise, -mr gets confused with
571 else if (argc > 0 && !strcmp(*argv,"-mr"))
574 j--; /* Otherwise, -mr gets confused with
578 #ifndef OPENSSL_NO_MD2
579 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
582 #ifndef OPENSSL_NO_MDC2
583 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
586 #ifndef OPENSSL_NO_MD4
587 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
590 #ifndef OPENSSL_NO_MD5
591 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
594 #ifndef OPENSSL_NO_MD5
595 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
598 #ifndef OPENSSL_NO_SHA
599 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
601 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
604 #ifndef OPENSSL_NO_RIPEMD
605 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
607 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
609 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
612 #ifndef OPENSSL_NO_RC4
613 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
616 #ifndef OPENSSL_NO_DES
617 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
618 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
621 #ifndef OPENSSL_NO_RSA
622 #if 0 /* was: #ifdef RSAref */
623 if (strcmp(*argv,"rsaref") == 0)
625 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
631 if (strcmp(*argv,"openssl") == 0)
633 RSA_set_default_method(RSA_PKCS1_SSLeay());
638 #endif /* !OPENSSL_NO_RSA */
639 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
640 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
641 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
642 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
643 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
644 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
645 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
647 #ifndef OPENSSL_NO_RC2
648 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
649 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
652 #ifndef OPENSSL_NO_RC5
653 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
654 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
657 #ifndef OPENSSL_NO_IDEA
658 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
659 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
662 #ifndef OPENSSL_NO_BF
663 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
664 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
665 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
668 #ifndef OPENSSL_NO_CAST
669 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
670 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
671 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
674 #ifndef OPENSSL_NO_DES
675 if (strcmp(*argv,"des") == 0)
682 #ifndef OPENSSL_NO_RSA
683 if (strcmp(*argv,"rsa") == 0)
685 rsa_doit[R_RSA_512]=1;
686 rsa_doit[R_RSA_1024]=1;
687 rsa_doit[R_RSA_2048]=1;
688 rsa_doit[R_RSA_4096]=1;
692 #ifndef OPENSSL_NO_DSA
693 if (strcmp(*argv,"dsa") == 0)
695 dsa_doit[R_DSA_512]=1;
696 dsa_doit[R_DSA_1024]=1;
701 BIO_printf(bio_err,"Error: bad option or value\n");
702 BIO_printf(bio_err,"\n");
703 BIO_printf(bio_err,"Available values:\n");
704 #ifndef OPENSSL_NO_MD2
705 BIO_printf(bio_err,"md2 ");
707 #ifndef OPENSSL_NO_MDC2
708 BIO_printf(bio_err,"mdc2 ");
710 #ifndef OPENSSL_NO_MD4
711 BIO_printf(bio_err,"md4 ");
713 #ifndef OPENSSL_NO_MD5
714 BIO_printf(bio_err,"md5 ");
715 #ifndef OPENSSL_NO_HMAC
716 BIO_printf(bio_err,"hmac ");
719 #ifndef OPENSSL_NO_SHA1
720 BIO_printf(bio_err,"sha1 ");
722 #ifndef OPENSSL_NO_RIPEMD160
723 BIO_printf(bio_err,"rmd160");
725 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
726 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
727 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
728 BIO_printf(bio_err,"\n");
731 #ifndef OPENSSL_NO_IDEA
732 BIO_printf(bio_err,"idea-cbc ");
734 #ifndef OPENSSL_NO_RC2
735 BIO_printf(bio_err,"rc2-cbc ");
737 #ifndef OPENSSL_NO_RC5
738 BIO_printf(bio_err,"rc5-cbc ");
740 #ifndef OPENSSL_NO_BF
741 BIO_printf(bio_err,"bf-cbc");
743 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
744 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
745 BIO_printf(bio_err,"\n");
748 BIO_printf(bio_err,"des-cbc des-ede3 ");
749 #ifndef OPENSSL_NO_RC4
750 BIO_printf(bio_err,"rc4");
752 BIO_printf(bio_err,"\n");
754 #ifndef OPENSSL_NO_RSA
755 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
758 #ifndef OPENSSL_NO_DSA
759 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
762 #ifndef OPENSSL_NO_IDEA
763 BIO_printf(bio_err,"idea ");
765 #ifndef OPENSSL_NO_RC2
766 BIO_printf(bio_err,"rc2 ");
768 #ifndef OPENSSL_NO_DES
769 BIO_printf(bio_err,"des ");
771 #ifndef OPENSSL_NO_RSA
772 BIO_printf(bio_err,"rsa ");
774 #ifndef OPENSSL_NO_BF
775 BIO_printf(bio_err,"blowfish");
777 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
778 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
779 !defined(OPENSSL_NO_BF)
780 BIO_printf(bio_err,"\n");
783 BIO_printf(bio_err,"\n");
784 BIO_printf(bio_err,"Available options:\n");
786 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
788 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
789 BIO_printf(bio_err,"-evp e use EVP e.\n");
790 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
791 BIO_printf(bio_err,"-mr produce machine readable output.\n");
793 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
803 if(multi && do_multi(multi))
809 for (i=0; i<ALGOR_NUM; i++)
814 for (i=0; i<RSA_NUM; i++)
816 for (i=0; i<DSA_NUM; i++)
819 for (i=0; i<ALGOR_NUM; i++)
820 if (doit[i]) pr_header++;
822 if (usertime == 0 && !mr)
823 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
824 if (usertime <= 0 && !mr)
826 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
827 BIO_printf(bio_err,"program when this computer is idle.\n");
830 #ifndef OPENSSL_NO_RSA
831 for (i=0; i<RSA_NUM; i++)
833 const unsigned char *p;
836 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
837 if (rsa_key[i] == NULL)
839 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
845 BIO_printf(bio_err,mr ? "+RK:%d:"
846 : "Loaded RSA key, %d bit modulus and e= 0x",
847 BN_num_bits(rsa_key[i]->n));
848 BN_print(bio_err,rsa_key[i]->e);
849 BIO_printf(bio_err,"\n");
855 #ifndef OPENSSL_NO_DSA
856 dsa_key[0]=get_dsa512();
857 dsa_key[1]=get_dsa1024();
858 dsa_key[2]=get_dsa2048();
861 #ifndef OPENSSL_NO_DES
862 DES_set_key_unchecked(&key,&sch);
863 DES_set_key_unchecked(&key2,&sch2);
864 DES_set_key_unchecked(&key3,&sch3);
866 #ifndef OPENSSL_NO_IDEA
867 idea_set_encrypt_key(key16,&idea_ks);
869 #ifndef OPENSSL_NO_RC4
870 RC4_set_key(&rc4_ks,16,key16);
872 #ifndef OPENSSL_NO_RC2
873 RC2_set_key(&rc2_ks,16,key16,128);
875 #ifndef OPENSSL_NO_RC5
876 RC5_32_set_key(&rc5_ks,16,key16,12);
878 #ifndef OPENSSL_NO_BF
879 BF_set_key(&bf_ks,16,key16);
881 #ifndef OPENSSL_NO_CAST
882 CAST_set_key(&cast_ks,16,key16);
884 #ifndef OPENSSL_NO_RSA
885 memset(rsa_c,0,sizeof(rsa_c));
888 #ifndef OPENSSL_NO_DES
889 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
894 Time_F(START,usertime);
895 for (i=count; i; i--)
896 des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
901 c[D_MD2][0]=count/10;
902 c[D_MDC2][0]=count/10;
907 c[D_RMD160][0]=count;
909 c[D_CBC_DES][0]=count;
910 c[D_EDE3_DES][0]=count/3;
911 c[D_CBC_IDEA][0]=count;
912 c[D_CBC_RC2][0]=count;
913 c[D_CBC_RC5][0]=count;
914 c[D_CBC_BF][0]=count;
915 c[D_CBC_CAST][0]=count;
917 for (i=1; i<SIZE_NUM; i++)
919 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
920 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
921 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
922 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
923 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
924 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
925 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
927 for (i=1; i<SIZE_NUM; i++)
931 l0=(long)lengths[i-1];
933 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
934 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
935 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
936 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
937 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
938 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
939 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
940 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
942 #ifndef OPENSSL_NO_RSA
943 rsa_c[R_RSA_512][0]=count/2000;
944 rsa_c[R_RSA_512][1]=count/400;
945 for (i=1; i<RSA_NUM; i++)
947 rsa_c[i][0]=rsa_c[i-1][0]/8;
948 rsa_c[i][1]=rsa_c[i-1][1]/4;
949 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
953 if (rsa_c[i][0] == 0)
962 #ifndef OPENSSL_NO_DSA
963 dsa_c[R_DSA_512][0]=count/1000;
964 dsa_c[R_DSA_512][1]=count/1000/2;
965 for (i=1; i<DSA_NUM; i++)
967 dsa_c[i][0]=dsa_c[i-1][0]/4;
968 dsa_c[i][1]=dsa_c[i-1][1]/4;
969 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
982 #define COND(d) (count < (d))
985 /* not worth fixing */
986 # error "You cannot disable DES on systems without SIGALRM."
987 #endif /* OPENSSL_NO_DES */
989 #define COND(c) (run)
990 #define COUNT(d) (count)
991 signal(SIGALRM,sig_done);
994 #ifndef OPENSSL_NO_MD2
997 for (j=0; j<SIZE_NUM; j++)
999 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1001 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1002 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1004 print_result(D_MD2,j,count,d);
1008 #ifndef OPENSSL_NO_MDC2
1011 for (j=0; j<SIZE_NUM; j++)
1013 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1015 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1016 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1018 print_result(D_MDC2,j,count,d);
1023 #ifndef OPENSSL_NO_MD4
1026 for (j=0; j<SIZE_NUM; j++)
1028 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1030 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1031 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1033 print_result(D_MD4,j,count,d);
1038 #ifndef OPENSSL_NO_MD5
1041 for (j=0; j<SIZE_NUM; j++)
1043 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1045 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1046 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1048 print_result(D_MD5,j,count,d);
1053 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1058 HMAC_CTX_init(&hctx);
1059 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
1062 for (j=0; j<SIZE_NUM; j++)
1064 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1066 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1068 HMAC_Init(&hctx,NULL,0,NULL);
1069 HMAC_Update(&hctx,buf,lengths[j]);
1070 HMAC_Final(&hctx,&(hmac[0]),NULL);
1073 print_result(D_HMAC,j,count,d);
1075 HMAC_CTX_cleanup(&hctx);
1078 #ifndef OPENSSL_NO_SHA
1081 for (j=0; j<SIZE_NUM; j++)
1083 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1085 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1086 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1088 print_result(D_SHA1,j,count,d);
1092 #ifndef OPENSSL_NO_RIPEMD
1095 for (j=0; j<SIZE_NUM; j++)
1097 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1099 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1100 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1102 print_result(D_RMD160,j,count,d);
1106 #ifndef OPENSSL_NO_RC4
1109 for (j=0; j<SIZE_NUM; j++)
1111 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1113 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1114 RC4(&rc4_ks,(unsigned int)lengths[j],
1117 print_result(D_RC4,j,count,d);
1121 #ifndef OPENSSL_NO_DES
1122 if (doit[D_CBC_DES])
1124 for (j=0; j<SIZE_NUM; j++)
1126 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1128 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1129 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1132 print_result(D_CBC_DES,j,count,d);
1136 if (doit[D_EDE3_DES])
1138 for (j=0; j<SIZE_NUM; j++)
1140 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1142 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1143 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1147 print_result(D_EDE3_DES,j,count,d);
1151 #ifndef OPENSSL_NO_IDEA
1152 if (doit[D_CBC_IDEA])
1154 for (j=0; j<SIZE_NUM; j++)
1156 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1158 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1159 idea_cbc_encrypt(buf,buf,
1160 (unsigned long)lengths[j],&idea_ks,
1163 print_result(D_CBC_IDEA,j,count,d);
1167 #ifndef OPENSSL_NO_RC2
1168 if (doit[D_CBC_RC2])
1170 for (j=0; j<SIZE_NUM; j++)
1172 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1174 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1175 RC2_cbc_encrypt(buf,buf,
1176 (unsigned long)lengths[j],&rc2_ks,
1179 print_result(D_CBC_RC2,j,count,d);
1183 #ifndef OPENSSL_NO_RC5
1184 if (doit[D_CBC_RC5])
1186 for (j=0; j<SIZE_NUM; j++)
1188 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1190 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1191 RC5_32_cbc_encrypt(buf,buf,
1192 (unsigned long)lengths[j],&rc5_ks,
1195 print_result(D_CBC_RC5,j,count,d);
1199 #ifndef OPENSSL_NO_BF
1202 for (j=0; j<SIZE_NUM; j++)
1204 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1206 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1207 BF_cbc_encrypt(buf,buf,
1208 (unsigned long)lengths[j],&bf_ks,
1211 print_result(D_CBC_BF,j,count,d);
1215 #ifndef OPENSSL_NO_CAST
1216 if (doit[D_CBC_CAST])
1218 for (j=0; j<SIZE_NUM; j++)
1220 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1222 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1223 CAST_cbc_encrypt(buf,buf,
1224 (unsigned long)lengths[j],&cast_ks,
1227 print_result(D_CBC_CAST,j,count,d);
1234 for (j=0; j<SIZE_NUM; j++)
1239 names[D_EVP]=OBJ_nid2ln(evp->nid);
1240 print_message(names[D_EVP],save_count,
1242 EVP_CIPHER_CTX_init(&ctx);
1244 EVP_DecryptInit_ex(&ctx,evp,NULL,key16,iv);
1246 EVP_EncryptInit_ex(&ctx,evp,NULL,key16,iv);
1250 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1251 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1253 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1254 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1256 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1258 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1260 print_result(D_EVP,j,count,d);
1264 RAND_pseudo_bytes(buf,36);
1265 #ifndef OPENSSL_NO_RSA
1266 for (j=0; j<RSA_NUM; j++)
1269 if (!rsa_doit[j]) continue;
1270 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1273 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1274 ERR_print_errors(bio_err);
1279 pkey_print_message("private","rsa",
1280 rsa_c[j][0],rsa_bits[j],
1282 /* RSA_blinding_on(rsa_key[j],NULL); */
1284 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1286 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1287 &rsa_num, rsa_key[j]);
1291 "RSA sign failure\n");
1292 ERR_print_errors(bio_err);
1298 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1299 : "%ld %d bit private RSA's in %.2fs\n",
1300 count,rsa_bits[j],d);
1301 rsa_results[j][0]=d/(double)count;
1306 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1309 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1310 ERR_print_errors(bio_err);
1315 pkey_print_message("public","rsa",
1316 rsa_c[j][1],rsa_bits[j],
1319 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1321 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1322 rsa_num, rsa_key[j]);
1326 "RSA verify failure\n");
1327 ERR_print_errors(bio_err);
1333 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1334 : "%ld %d bit public RSA's in %.2fs\n",
1335 count,rsa_bits[j],d);
1336 rsa_results[j][1]=d/(double)count;
1342 /* if longer than 10s, don't do any more */
1343 for (j++; j<RSA_NUM; j++)
1349 RAND_pseudo_bytes(buf,20);
1350 #ifndef OPENSSL_NO_DSA
1351 if (RAND_status() != 1)
1353 RAND_seed(rnd_seed, sizeof rnd_seed);
1356 for (j=0; j<DSA_NUM; j++)
1361 if (!dsa_doit[j]) continue;
1362 /* DSA_generate_key(dsa_key[j]); */
1363 /* DSA_sign_setup(dsa_key[j],NULL); */
1364 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1368 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1369 ERR_print_errors(bio_err);
1374 pkey_print_message("sign","dsa",
1375 dsa_c[j][0],dsa_bits[j],
1378 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1380 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1385 "DSA sign failure\n");
1386 ERR_print_errors(bio_err);
1392 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1393 : "%ld %d bit DSA signs in %.2fs\n",
1394 count,dsa_bits[j],d);
1395 dsa_results[j][0]=d/(double)count;
1399 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1403 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1404 ERR_print_errors(bio_err);
1409 pkey_print_message("verify","dsa",
1410 dsa_c[j][1],dsa_bits[j],
1413 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1415 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1420 "DSA verify failure\n");
1421 ERR_print_errors(bio_err);
1427 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1428 : "%ld %d bit DSA verify in %.2fs\n",
1429 count,dsa_bits[j],d);
1430 dsa_results[j][1]=d/(double)count;
1435 /* if longer than 10s, don't do any more */
1436 for (j++; j<DSA_NUM; j++)
1440 if (rnd_fake) RAND_cleanup();
1445 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1446 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1448 printf("%s ",BN_options());
1449 #ifndef OPENSSL_NO_MD2
1450 printf("%s ",MD2_options());
1452 #ifndef OPENSSL_NO_RC4
1453 printf("%s ",RC4_options());
1455 #ifndef OPENSSL_NO_DES
1456 printf("%s ",des_options());
1458 #ifndef OPENSSL_NO_IDEA
1459 printf("%s ",idea_options());
1461 #ifndef OPENSSL_NO_BF
1462 printf("%s ",BF_options());
1464 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1465 printf("available timing options: ");
1476 #define as_string(s) (#s)
1477 printf("HZ=%g", HZ);
1479 printf(" [sysconf value]");
1483 printf("timing function used: %s%s%s%s%s%s%s\n",
1484 (ftime_used ? "ftime" : ""),
1485 (ftime_used + times_used > 1 ? "," : ""),
1486 (times_used ? "times" : ""),
1487 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1488 (gettimeofday_used ? "gettimeofday" : ""),
1489 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1490 (getrusage_used ? "getrusage" : ""));
1496 fprintf(stdout,"+H");
1499 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1500 fprintf(stdout,"type ");
1502 for (j=0; j<SIZE_NUM; j++)
1503 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1504 fprintf(stdout,"\n");
1507 for (k=0; k<ALGOR_NUM; k++)
1509 if (!doit[k]) continue;
1511 fprintf(stdout,"+F:%d:%s",k,names[k]);
1513 fprintf(stdout,"%-13s",names[k]);
1514 for (j=0; j<SIZE_NUM; j++)
1516 if (results[k][j] > 10000 && !mr)
1517 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1519 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1521 fprintf(stdout,"\n");
1523 #ifndef OPENSSL_NO_RSA
1525 for (k=0; k<RSA_NUM; k++)
1527 if (!rsa_doit[k]) continue;
1530 printf("%18ssign verify sign/s verify/s\n"," ");
1534 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1535 k,rsa_bits[k],rsa_results[k][0],
1538 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1539 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1540 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1543 #ifndef OPENSSL_NO_DSA
1545 for (k=0; k<DSA_NUM; k++)
1547 if (!dsa_doit[k]) continue;
1550 printf("%18ssign verify sign/s verify/s\n"," ");
1554 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1555 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1557 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1558 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1559 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1564 ERR_print_errors(bio_err);
1565 if (buf != NULL) OPENSSL_free(buf);
1566 if (buf2 != NULL) OPENSSL_free(buf2);
1567 #ifndef OPENSSL_NO_RSA
1568 for (i=0; i<RSA_NUM; i++)
1569 if (rsa_key[i] != NULL)
1570 RSA_free(rsa_key[i]);
1572 #ifndef OPENSSL_NO_DSA
1573 for (i=0; i<DSA_NUM; i++)
1574 if (dsa_key[i] != NULL)
1575 DSA_free(dsa_key[i]);
1581 static void print_message(const char *s, long num, int length)
1584 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1585 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1586 (void)BIO_flush(bio_err);
1589 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1590 : "Doing %s %ld times on %d size blocks: ",s,num,length);
1591 (void)BIO_flush(bio_err);
1598 static void pkey_print_message(char *str, char *str2, long num, int bits,
1602 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1603 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1604 (void)BIO_flush(bio_err);
1607 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1608 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1609 (void)BIO_flush(bio_err);
1616 static void print_result(int alg,int run_no,int count,double time_used)
1618 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1619 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1620 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1623 static char *sstrsep(char **string, const char *delim)
1626 char *token = *string;
1631 memset(isdelim, 0, 256);
1636 isdelim[(unsigned char)(*delim)] = 1;
1640 while (!isdelim[(unsigned char)(**string)])
1655 static int do_multi(int multi)
1660 static char sep[]=":";
1662 fds=malloc(multi*sizeof *fds);
1663 for(n=0 ; n < multi ; ++n)
1681 printf("Forked child %d\n",n);
1684 /* for now, assume the pipe is long enough to take all the output */
1685 for(n=0 ; n < multi ; ++n)
1691 f=fdopen(fds[n],"r");
1692 while(fgets(buf,sizeof buf,f))
1699 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1703 printf("Got: %s from %d\n",buf,n);
1704 if(!strncmp(buf,"+F:",3))
1710 alg=atoi(sstrsep(&p,sep));
1712 for(j=0 ; j < SIZE_NUM ; ++j)
1713 results[alg][j]+=atof(sstrsep(&p,sep));
1715 else if(!strncmp(buf,"+F2:",4))
1721 k=atoi(sstrsep(&p,sep));
1724 d=atof(sstrsep(&p,sep));
1726 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1728 rsa_results[k][0]=d;
1730 d=atof(sstrsep(&p,sep));
1732 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1734 rsa_results[k][1]=d;
1736 else if(!strncmp(buf,"+F2:",4))
1742 k=atoi(sstrsep(&p,sep));
1745 d=atof(sstrsep(&p,sep));
1747 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1749 rsa_results[k][0]=d;
1751 d=atof(sstrsep(&p,sep));
1753 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1755 rsa_results[k][1]=d;
1757 else if(!strncmp(buf,"+F3:",4))
1763 k=atoi(sstrsep(&p,sep));
1766 d=atof(sstrsep(&p,sep));
1768 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1770 dsa_results[k][0]=d;
1772 d=atof(sstrsep(&p,sep));
1774 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1776 dsa_results[k][1]=d;
1778 else if(!strncmp(buf,"+H:",3))
1782 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);