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 #if !defined(OPENSSL_SYS_MSDOS)
87 #include OPENSSL_UNISTD
90 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
92 #elif !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
95 #if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_MPE) && !defined(__NetBSD__) /* FIXME */
103 # include <sys/types.h>
104 # include <sys/times.h>
107 # include <sys/time.h>
108 # include <sys/resource.h>
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)
120 #include <sys/timeb.h>
123 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD)
124 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
127 #if defined(sun) || defined(__ultrix)
128 #define _POSIX_SOURCE
130 #include <sys/param.h>
133 #ifndef OPENSSL_NO_DES
134 #include <openssl/des_old.h>
136 #ifndef OPENSSL_NO_MD2
137 #include <openssl/md2.h>
139 #ifndef OPENSSL_NO_MDC2
140 #include <openssl/mdc2.h>
142 #ifndef OPENSSL_NO_MD4
143 #include <openssl/md4.h>
145 #ifndef OPENSSL_NO_MD5
146 #include <openssl/md5.h>
148 #ifndef OPENSSL_NO_HMAC
149 #include <openssl/hmac.h>
151 #include <openssl/evp.h>
152 #ifndef OPENSSL_NO_SHA
153 #include <openssl/sha.h>
155 #ifndef OPENSSL_NO_RIPEMD
156 #include <openssl/ripemd.h>
158 #ifndef OPENSSL_NO_RC4
159 #include <openssl/rc4.h>
161 #ifndef OPENSSL_NO_RC5
162 #include <openssl/rc5.h>
164 #ifndef OPENSSL_NO_RC2
165 #include <openssl/rc2.h>
167 #ifndef OPENSSL_NO_IDEA
168 #include <openssl/idea.h>
170 #ifndef OPENSSL_NO_BF
171 #include <openssl/blowfish.h>
173 #ifndef OPENSSL_NO_CAST
174 #include <openssl/cast.h>
176 #ifndef OPENSSL_NO_RSA
177 #include <openssl/rsa.h>
178 #include "./testrsa.h"
180 #include <openssl/x509.h>
181 #ifndef OPENSSL_NO_DSA
182 #include "./testdsa.h"
185 /* The following if from times(3) man page. It may need to be changed */
188 # define HZ ((double)sysconf(_SC_CLK_TCK))
191 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
193 # else /* _BSD_CLK_TCK_ */
194 # define HZ ((double)_BSD_CLK_TCK_)
197 # define HZ ((double)CLK_TCK)
202 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
207 #define BUFSIZE ((long)1024*8+1)
210 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
212 static int usertime=1;
214 static double Time_F(int s);
215 static void print_message(const char *s,long num,int length);
216 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
217 static void print_result(int alg,int run_no,int count,double time_used);
219 static int do_multi(int multi);
226 static const char *names[ALGOR_NUM]={
227 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
228 "des cbc","des ede3","idea cbc",
229 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
230 static double results[ALGOR_NUM][SIZE_NUM];
231 static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
232 static double rsa_results[RSA_NUM][2];
233 static double dsa_results[DSA_NUM][2];
236 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
237 #define SIGRETTYPE void
239 #define SIGRETTYPE int
242 static SIGRETTYPE sig_done(int sig);
243 static SIGRETTYPE sig_done(int sig)
245 signal(SIGALRM,sig_done);
256 static double Time_F(int s)
263 static struct rusage tstart,tend;
268 getrusage(RUSAGE_SELF,&tstart);
275 getrusage(RUSAGE_SELF,&tend);
276 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
277 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
278 +((double)i)/1000000.0;
279 return((ret < 0.001)?0.001:ret);
284 static struct timeval tstart,tend;
287 gettimeofday_used = 1;
290 gettimeofday(&tstart,NULL);
295 gettimeofday(&tend,NULL);
296 i=(long)tend.tv_usec-(long)tstart.tv_usec;
297 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
298 return((ret < 0.001)?0.001:ret);
301 #else /* ndef USE_TOD */
306 static struct tms tstart,tend;
317 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
318 return((ret < 1e-3)?1e-3:ret);
321 # endif /* times() */
322 # if defined(TIMES) && defined(TIMEB)
327 static struct timeb tstart,tend;
339 i=(long)tend.millitm-(long)tstart.millitm;
340 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
341 return((ret < 0.001)?0.001:ret);
348 int MAIN(int, char **);
350 int MAIN(int argc, char **argv)
353 unsigned char *buf=NULL,*buf2=NULL;
355 long count,rsa_count,save_count=0;
357 #ifndef OPENSSL_NO_RSA
360 #ifndef OPENSSL_NO_MD2
361 unsigned char md2[MD2_DIGEST_LENGTH];
363 #ifndef OPENSSL_NO_MDC2
364 unsigned char mdc2[MDC2_DIGEST_LENGTH];
366 #ifndef OPENSSL_NO_MD4
367 unsigned char md4[MD4_DIGEST_LENGTH];
369 #ifndef OPENSSL_NO_MD5
370 unsigned char md5[MD5_DIGEST_LENGTH];
371 unsigned char hmac[MD5_DIGEST_LENGTH];
373 #ifndef OPENSSL_NO_SHA
374 unsigned char sha[SHA_DIGEST_LENGTH];
376 #ifndef OPENSSL_NO_RIPEMD
377 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
379 #ifndef OPENSSL_NO_RC4
382 #ifndef OPENSSL_NO_RC5
385 #ifndef OPENSSL_NO_RC2
388 #ifndef OPENSSL_NO_IDEA
389 IDEA_KEY_SCHEDULE idea_ks;
391 #ifndef OPENSSL_NO_BF
394 #ifndef OPENSSL_NO_CAST
397 static unsigned char key16[16]=
398 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
399 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
401 #ifndef OPENSSL_NO_DES
402 DES_cblock *buf_as_des_cblock = NULL;
403 static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
404 static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
405 static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
406 DES_key_schedule sch;
407 DES_key_schedule sch2;
408 DES_key_schedule sch3;
420 #define D_CBC_IDEA 10
424 #define D_CBC_CAST 14
427 long c[ALGOR_NUM][SIZE_NUM];
435 #ifndef OPENSSL_NO_RSA
436 RSA *rsa_key[RSA_NUM];
437 long rsa_c[RSA_NUM][2];
438 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
439 static unsigned char *rsa_data[RSA_NUM]=
440 {test512,test1024,test2048,test4096};
441 static int rsa_data_length[RSA_NUM]={
442 sizeof(test512),sizeof(test1024),
443 sizeof(test2048),sizeof(test4096)};
445 #ifndef OPENSSL_NO_DSA
446 DSA *dsa_key[DSA_NUM];
447 long dsa_c[DSA_NUM][2];
448 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
450 int rsa_doit[RSA_NUM];
451 int dsa_doit[DSA_NUM];
454 const EVP_CIPHER *evp=NULL;
465 memset(results, 0, sizeof(results));
466 #ifndef OPENSSL_NO_DSA
467 memset(dsa_key,0,sizeof(dsa_key));
471 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
472 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
474 #ifndef OPENSSL_NO_RSA
475 memset(rsa_key,0,sizeof(rsa_key));
476 for (i=0; i<RSA_NUM; i++)
480 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
482 BIO_printf(bio_err,"out of memory\n");
485 #ifndef OPENSSL_NO_DES
486 buf_as_des_cblock = (des_cblock *)buf;
488 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
490 BIO_printf(bio_err,"out of memory\n");
494 memset(c,0,sizeof(c));
495 memset(iv,0,sizeof(iv));
497 for (i=0; i<ALGOR_NUM; i++)
499 for (i=0; i<RSA_NUM; i++)
501 for (i=0; i<DSA_NUM; i++)
509 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
512 j--; /* Otherwise, -elapsed gets confused with
515 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
521 BIO_printf(bio_err,"no EVP given\n");
524 evp=EVP_get_cipherbyname(*argv);
527 BIO_printf(bio_err,"%s is an unknown cipher\n",*argv);
532 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
535 j--; /* Otherwise, -elapsed gets confused with
538 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
544 BIO_printf(bio_err,"no engine given\n");
547 e = setup_engine(bio_err, *argv, 0);
548 /* j will be increased again further down. We just
549 don't want speed to confuse an engine with an
550 algorithm, especially when none is given (which
551 means all of them should be run) */
555 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
561 BIO_printf(bio_err,"no multi count given\n");
567 BIO_printf(bio_err,"bad multi count\n");
570 j--; /* Otherwise, -mr gets confused with
574 else if (argc > 0 && !strcmp(*argv,"-mr"))
577 j--; /* Otherwise, -mr gets confused with
581 #ifndef OPENSSL_NO_MD2
582 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
585 #ifndef OPENSSL_NO_MDC2
586 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
589 #ifndef OPENSSL_NO_MD4
590 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
593 #ifndef OPENSSL_NO_MD5
594 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
597 #ifndef OPENSSL_NO_MD5
598 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
601 #ifndef OPENSSL_NO_SHA
602 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
604 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
607 #ifndef OPENSSL_NO_RIPEMD
608 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
610 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
612 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
615 #ifndef OPENSSL_NO_RC4
616 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
619 #ifndef OPENSSL_NO_DES
620 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
621 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
624 #ifndef OPENSSL_NO_RSA
625 #if 0 /* was: #ifdef RSAref */
626 if (strcmp(*argv,"rsaref") == 0)
628 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
634 if (strcmp(*argv,"openssl") == 0)
636 RSA_set_default_method(RSA_PKCS1_SSLeay());
641 #endif /* !OPENSSL_NO_RSA */
642 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
643 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
644 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
645 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
646 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
647 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
648 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
650 #ifndef OPENSSL_NO_RC2
651 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
652 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
655 #ifndef OPENSSL_NO_RC5
656 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
657 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
660 #ifndef OPENSSL_NO_IDEA
661 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
662 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
665 #ifndef OPENSSL_NO_BF
666 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
667 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
668 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
671 #ifndef OPENSSL_NO_CAST
672 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
673 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
674 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
677 #ifndef OPENSSL_NO_DES
678 if (strcmp(*argv,"des") == 0)
685 #ifndef OPENSSL_NO_RSA
686 if (strcmp(*argv,"rsa") == 0)
688 rsa_doit[R_RSA_512]=1;
689 rsa_doit[R_RSA_1024]=1;
690 rsa_doit[R_RSA_2048]=1;
691 rsa_doit[R_RSA_4096]=1;
695 #ifndef OPENSSL_NO_DSA
696 if (strcmp(*argv,"dsa") == 0)
698 dsa_doit[R_DSA_512]=1;
699 dsa_doit[R_DSA_1024]=1;
704 BIO_printf(bio_err,"Error: bad option or value\n");
705 BIO_printf(bio_err,"\n");
706 BIO_printf(bio_err,"Available values:\n");
707 #ifndef OPENSSL_NO_MD2
708 BIO_printf(bio_err,"md2 ");
710 #ifndef OPENSSL_NO_MDC2
711 BIO_printf(bio_err,"mdc2 ");
713 #ifndef OPENSSL_NO_MD4
714 BIO_printf(bio_err,"md4 ");
716 #ifndef OPENSSL_NO_MD5
717 BIO_printf(bio_err,"md5 ");
718 #ifndef OPENSSL_NO_HMAC
719 BIO_printf(bio_err,"hmac ");
722 #ifndef OPENSSL_NO_SHA1
723 BIO_printf(bio_err,"sha1 ");
725 #ifndef OPENSSL_NO_RIPEMD160
726 BIO_printf(bio_err,"rmd160");
728 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
729 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
730 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
731 BIO_printf(bio_err,"\n");
734 #ifndef OPENSSL_NO_IDEA
735 BIO_printf(bio_err,"idea-cbc ");
737 #ifndef OPENSSL_NO_RC2
738 BIO_printf(bio_err,"rc2-cbc ");
740 #ifndef OPENSSL_NO_RC5
741 BIO_printf(bio_err,"rc5-cbc ");
743 #ifndef OPENSSL_NO_BF
744 BIO_printf(bio_err,"bf-cbc");
746 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
747 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
748 BIO_printf(bio_err,"\n");
751 BIO_printf(bio_err,"des-cbc des-ede3 ");
752 #ifndef OPENSSL_NO_RC4
753 BIO_printf(bio_err,"rc4");
755 BIO_printf(bio_err,"\n");
757 #ifndef OPENSSL_NO_RSA
758 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
761 #ifndef OPENSSL_NO_DSA
762 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
765 #ifndef OPENSSL_NO_IDEA
766 BIO_printf(bio_err,"idea ");
768 #ifndef OPENSSL_NO_RC2
769 BIO_printf(bio_err,"rc2 ");
771 #ifndef OPENSSL_NO_DES
772 BIO_printf(bio_err,"des ");
774 #ifndef OPENSSL_NO_RSA
775 BIO_printf(bio_err,"rsa ");
777 #ifndef OPENSSL_NO_BF
778 BIO_printf(bio_err,"blowfish");
780 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
781 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
782 !defined(OPENSSL_NO_BF)
783 BIO_printf(bio_err,"\n");
786 BIO_printf(bio_err,"\n");
787 BIO_printf(bio_err,"Available options:\n");
789 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
791 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
792 BIO_printf(bio_err,"-evp e use EVP e.\n");
793 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
794 BIO_printf(bio_err,"-mr produce machine readable output.\n");
796 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
806 if(multi && do_multi(multi))
812 for (i=0; i<ALGOR_NUM; i++)
817 for (i=0; i<RSA_NUM; i++)
819 for (i=0; i<DSA_NUM; i++)
822 for (i=0; i<ALGOR_NUM; i++)
823 if (doit[i]) pr_header++;
825 if (usertime == 0 && !mr)
826 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
827 if (usertime <= 0 && !mr)
829 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
830 BIO_printf(bio_err,"program when this computer is idle.\n");
833 #ifndef OPENSSL_NO_RSA
834 for (i=0; i<RSA_NUM; i++)
836 const unsigned char *p;
839 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
840 if (rsa_key[i] == NULL)
842 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
848 BIO_printf(bio_err,mr ? "+RK:%d:"
849 : "Loaded RSA key, %d bit modulus and e= 0x",
850 BN_num_bits(rsa_key[i]->n));
851 BN_print(bio_err,rsa_key[i]->e);
852 BIO_printf(bio_err,"\n");
858 #ifndef OPENSSL_NO_DSA
859 dsa_key[0]=get_dsa512();
860 dsa_key[1]=get_dsa1024();
861 dsa_key[2]=get_dsa2048();
864 #ifndef OPENSSL_NO_DES
865 DES_set_key_unchecked(&key,&sch);
866 DES_set_key_unchecked(&key2,&sch2);
867 DES_set_key_unchecked(&key3,&sch3);
869 #ifndef OPENSSL_NO_IDEA
870 idea_set_encrypt_key(key16,&idea_ks);
872 #ifndef OPENSSL_NO_RC4
873 RC4_set_key(&rc4_ks,16,key16);
875 #ifndef OPENSSL_NO_RC2
876 RC2_set_key(&rc2_ks,16,key16,128);
878 #ifndef OPENSSL_NO_RC5
879 RC5_32_set_key(&rc5_ks,16,key16,12);
881 #ifndef OPENSSL_NO_BF
882 BF_set_key(&bf_ks,16,key16);
884 #ifndef OPENSSL_NO_CAST
885 CAST_set_key(&cast_ks,16,key16);
887 #ifndef OPENSSL_NO_RSA
888 memset(rsa_c,0,sizeof(rsa_c));
891 #ifndef OPENSSL_NO_DES
892 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
898 for (i=count; i; i--)
899 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
904 c[D_MD2][0]=count/10;
905 c[D_MDC2][0]=count/10;
910 c[D_RMD160][0]=count;
912 c[D_CBC_DES][0]=count;
913 c[D_EDE3_DES][0]=count/3;
914 c[D_CBC_IDEA][0]=count;
915 c[D_CBC_RC2][0]=count;
916 c[D_CBC_RC5][0]=count;
917 c[D_CBC_BF][0]=count;
918 c[D_CBC_CAST][0]=count;
920 for (i=1; i<SIZE_NUM; i++)
922 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
923 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
924 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
925 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
926 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
927 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
928 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
930 for (i=1; i<SIZE_NUM; i++)
934 l0=(long)lengths[i-1];
936 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
937 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
938 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
939 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
940 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
941 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
942 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
943 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
945 #ifndef OPENSSL_NO_RSA
946 rsa_c[R_RSA_512][0]=count/2000;
947 rsa_c[R_RSA_512][1]=count/400;
948 for (i=1; i<RSA_NUM; i++)
950 rsa_c[i][0]=rsa_c[i-1][0]/8;
951 rsa_c[i][1]=rsa_c[i-1][1]/4;
952 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
956 if (rsa_c[i][0] == 0)
965 #ifndef OPENSSL_NO_DSA
966 dsa_c[R_DSA_512][0]=count/1000;
967 dsa_c[R_DSA_512][1]=count/1000/2;
968 for (i=1; i<DSA_NUM; i++)
970 dsa_c[i][0]=dsa_c[i-1][0]/4;
971 dsa_c[i][1]=dsa_c[i-1][1]/4;
972 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
985 #define COND(d) (count < (d))
988 /* not worth fixing */
989 # error "You cannot disable DES on systems without SIGALRM."
990 #endif /* OPENSSL_NO_DES */
992 #define COND(c) (run)
993 #define COUNT(d) (count)
994 signal(SIGALRM,sig_done);
997 #ifndef OPENSSL_NO_MD2
1000 for (j=0; j<SIZE_NUM; j++)
1002 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1004 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1005 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1007 print_result(D_MD2,j,count,d);
1011 #ifndef OPENSSL_NO_MDC2
1014 for (j=0; j<SIZE_NUM; j++)
1016 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1018 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1019 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1021 print_result(D_MDC2,j,count,d);
1026 #ifndef OPENSSL_NO_MD4
1029 for (j=0; j<SIZE_NUM; j++)
1031 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1033 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1034 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1036 print_result(D_MD4,j,count,d);
1041 #ifndef OPENSSL_NO_MD5
1044 for (j=0; j<SIZE_NUM; j++)
1046 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1048 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1049 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1051 print_result(D_MD5,j,count,d);
1056 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1061 HMAC_CTX_init(&hctx);
1062 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
1065 for (j=0; j<SIZE_NUM; j++)
1067 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1069 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1071 HMAC_Init(&hctx,NULL,0,NULL);
1072 HMAC_Update(&hctx,buf,lengths[j]);
1073 HMAC_Final(&hctx,&(hmac[0]),NULL);
1076 print_result(D_HMAC,j,count,d);
1078 HMAC_CTX_cleanup(&hctx);
1081 #ifndef OPENSSL_NO_SHA
1084 for (j=0; j<SIZE_NUM; j++)
1086 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1088 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1089 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1091 print_result(D_SHA1,j,count,d);
1095 #ifndef OPENSSL_NO_RIPEMD
1098 for (j=0; j<SIZE_NUM; j++)
1100 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1102 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1103 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1105 print_result(D_RMD160,j,count,d);
1109 #ifndef OPENSSL_NO_RC4
1112 for (j=0; j<SIZE_NUM; j++)
1114 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1116 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1117 RC4(&rc4_ks,(unsigned int)lengths[j],
1120 print_result(D_RC4,j,count,d);
1124 #ifndef OPENSSL_NO_DES
1125 if (doit[D_CBC_DES])
1127 for (j=0; j<SIZE_NUM; j++)
1129 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1131 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1132 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1135 print_result(D_CBC_DES,j,count,d);
1139 if (doit[D_EDE3_DES])
1141 for (j=0; j<SIZE_NUM; j++)
1143 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1145 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1146 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1150 print_result(D_EDE3_DES,j,count,d);
1154 #ifndef OPENSSL_NO_IDEA
1155 if (doit[D_CBC_IDEA])
1157 for (j=0; j<SIZE_NUM; j++)
1159 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1161 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1162 idea_cbc_encrypt(buf,buf,
1163 (unsigned long)lengths[j],&idea_ks,
1166 print_result(D_CBC_IDEA,j,count,d);
1170 #ifndef OPENSSL_NO_RC2
1171 if (doit[D_CBC_RC2])
1173 for (j=0; j<SIZE_NUM; j++)
1175 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1177 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1178 RC2_cbc_encrypt(buf,buf,
1179 (unsigned long)lengths[j],&rc2_ks,
1182 print_result(D_CBC_RC2,j,count,d);
1186 #ifndef OPENSSL_NO_RC5
1187 if (doit[D_CBC_RC5])
1189 for (j=0; j<SIZE_NUM; j++)
1191 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1193 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1194 RC5_32_cbc_encrypt(buf,buf,
1195 (unsigned long)lengths[j],&rc5_ks,
1198 print_result(D_CBC_RC5,j,count,d);
1202 #ifndef OPENSSL_NO_BF
1205 for (j=0; j<SIZE_NUM; j++)
1207 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1209 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1210 BF_cbc_encrypt(buf,buf,
1211 (unsigned long)lengths[j],&bf_ks,
1214 print_result(D_CBC_BF,j,count,d);
1218 #ifndef OPENSSL_NO_CAST
1219 if (doit[D_CBC_CAST])
1221 for (j=0; j<SIZE_NUM; j++)
1223 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1225 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1226 CAST_cbc_encrypt(buf,buf,
1227 (unsigned long)lengths[j],&cast_ks,
1230 print_result(D_CBC_CAST,j,count,d);
1237 for (j=0; j<SIZE_NUM; j++)
1242 names[D_EVP]=OBJ_nid2ln(evp->nid);
1243 print_message(names[D_EVP],save_count,
1245 EVP_CIPHER_CTX_init(&ctx);
1247 EVP_DecryptInit_ex(&ctx,evp,NULL,key16,iv);
1249 EVP_EncryptInit_ex(&ctx,evp,NULL,key16,iv);
1253 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1254 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1256 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1257 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1259 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1261 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1263 print_result(D_EVP,j,count,d);
1267 RAND_pseudo_bytes(buf,36);
1268 #ifndef OPENSSL_NO_RSA
1269 for (j=0; j<RSA_NUM; j++)
1272 if (!rsa_doit[j]) continue;
1273 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1276 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1277 ERR_print_errors(bio_err);
1282 pkey_print_message("private","rsa",
1283 rsa_c[j][0],rsa_bits[j],
1285 /* RSA_blinding_on(rsa_key[j],NULL); */
1287 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1289 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1290 &rsa_num, rsa_key[j]);
1294 "RSA sign failure\n");
1295 ERR_print_errors(bio_err);
1301 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1302 : "%ld %d bit private RSA's in %.2fs\n",
1303 count,rsa_bits[j],d);
1304 rsa_results[j][0]=d/(double)count;
1309 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1312 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1313 ERR_print_errors(bio_err);
1318 pkey_print_message("public","rsa",
1319 rsa_c[j][1],rsa_bits[j],
1322 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1324 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1325 rsa_num, rsa_key[j]);
1329 "RSA verify failure\n");
1330 ERR_print_errors(bio_err);
1336 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1337 : "%ld %d bit public RSA's in %.2fs\n",
1338 count,rsa_bits[j],d);
1339 rsa_results[j][1]=d/(double)count;
1345 /* if longer than 10s, don't do any more */
1346 for (j++; j<RSA_NUM; j++)
1352 RAND_pseudo_bytes(buf,20);
1353 #ifndef OPENSSL_NO_DSA
1354 if (RAND_status() != 1)
1356 RAND_seed(rnd_seed, sizeof rnd_seed);
1359 for (j=0; j<DSA_NUM; j++)
1364 if (!dsa_doit[j]) continue;
1365 /* DSA_generate_key(dsa_key[j]); */
1366 /* DSA_sign_setup(dsa_key[j],NULL); */
1367 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1371 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1372 ERR_print_errors(bio_err);
1377 pkey_print_message("sign","dsa",
1378 dsa_c[j][0],dsa_bits[j],
1381 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1383 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1388 "DSA sign failure\n");
1389 ERR_print_errors(bio_err);
1395 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1396 : "%ld %d bit DSA signs in %.2fs\n",
1397 count,dsa_bits[j],d);
1398 dsa_results[j][0]=d/(double)count;
1402 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1406 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1407 ERR_print_errors(bio_err);
1412 pkey_print_message("verify","dsa",
1413 dsa_c[j][1],dsa_bits[j],
1416 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1418 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1423 "DSA verify failure\n");
1424 ERR_print_errors(bio_err);
1430 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1431 : "%ld %d bit DSA verify in %.2fs\n",
1432 count,dsa_bits[j],d);
1433 dsa_results[j][1]=d/(double)count;
1438 /* if longer than 10s, don't do any more */
1439 for (j++; j<DSA_NUM; j++)
1443 if (rnd_fake) RAND_cleanup();
1450 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1451 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1453 printf("%s ",BN_options());
1454 #ifndef OPENSSL_NO_MD2
1455 printf("%s ",MD2_options());
1457 #ifndef OPENSSL_NO_RC4
1458 printf("%s ",RC4_options());
1460 #ifndef OPENSSL_NO_DES
1461 printf("%s ",des_options());
1463 #ifndef OPENSSL_NO_IDEA
1464 printf("%s ",idea_options());
1466 #ifndef OPENSSL_NO_BF
1467 printf("%s ",BF_options());
1469 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1470 printf("available timing options: ");
1481 #define as_string(s) (#s)
1482 printf("HZ=%g", HZ);
1484 printf(" [sysconf value]");
1488 printf("timing function used: %s%s%s%s%s%s%s\n",
1489 (ftime_used ? "ftime" : ""),
1490 (ftime_used + times_used > 1 ? "," : ""),
1491 (times_used ? "times" : ""),
1492 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1493 (gettimeofday_used ? "gettimeofday" : ""),
1494 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1495 (getrusage_used ? "getrusage" : ""));
1501 fprintf(stdout,"+H");
1504 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1505 fprintf(stdout,"type ");
1507 for (j=0; j<SIZE_NUM; j++)
1508 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1509 fprintf(stdout,"\n");
1512 for (k=0; k<ALGOR_NUM; k++)
1514 if (!doit[k]) continue;
1516 fprintf(stdout,"+F:%d:%s",k,names[k]);
1518 fprintf(stdout,"%-13s",names[k]);
1519 for (j=0; j<SIZE_NUM; j++)
1521 if (results[k][j] > 10000 && !mr)
1522 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1524 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1526 fprintf(stdout,"\n");
1528 #ifndef OPENSSL_NO_RSA
1530 for (k=0; k<RSA_NUM; k++)
1532 if (!rsa_doit[k]) continue;
1535 printf("%18ssign verify sign/s verify/s\n"," ");
1539 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1540 k,rsa_bits[k],rsa_results[k][0],
1543 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1544 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1545 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1548 #ifndef OPENSSL_NO_DSA
1550 for (k=0; k<DSA_NUM; k++)
1552 if (!dsa_doit[k]) continue;
1555 printf("%18ssign verify sign/s verify/s\n"," ");
1559 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1560 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1562 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1563 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1564 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1569 ERR_print_errors(bio_err);
1570 if (buf != NULL) OPENSSL_free(buf);
1571 if (buf2 != NULL) OPENSSL_free(buf2);
1572 #ifndef OPENSSL_NO_RSA
1573 for (i=0; i<RSA_NUM; i++)
1574 if (rsa_key[i] != NULL)
1575 RSA_free(rsa_key[i]);
1577 #ifndef OPENSSL_NO_DSA
1578 for (i=0; i<DSA_NUM; i++)
1579 if (dsa_key[i] != NULL)
1580 DSA_free(dsa_key[i]);
1586 static void print_message(const char *s, long num, int length)
1589 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1590 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1591 (void)BIO_flush(bio_err);
1594 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1595 : "Doing %s %ld times on %d size blocks: ",s,num,length);
1596 (void)BIO_flush(bio_err);
1603 static void pkey_print_message(char *str, char *str2, long num, int bits,
1607 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1608 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1609 (void)BIO_flush(bio_err);
1612 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1613 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1614 (void)BIO_flush(bio_err);
1621 static void print_result(int alg,int run_no,int count,double time_used)
1623 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1624 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1625 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1628 static char *sstrsep(char **string, const char *delim)
1631 char *token = *string;
1636 memset(isdelim, 0, 256);
1641 isdelim[(unsigned char)(*delim)] = 1;
1645 while (!isdelim[(unsigned char)(**string)])
1660 static int do_multi(int multi)
1665 static char sep[]=":";
1667 fds=malloc(multi*sizeof *fds);
1668 for(n=0 ; n < multi ; ++n)
1686 printf("Forked child %d\n",n);
1689 /* for now, assume the pipe is long enough to take all the output */
1690 for(n=0 ; n < multi ; ++n)
1696 f=fdopen(fds[n],"r");
1697 while(fgets(buf,sizeof buf,f))
1704 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1708 printf("Got: %s from %d\n",buf,n);
1709 if(!strncmp(buf,"+F:",3))
1715 alg=atoi(sstrsep(&p,sep));
1717 for(j=0 ; j < SIZE_NUM ; ++j)
1718 results[alg][j]+=atof(sstrsep(&p,sep));
1720 else if(!strncmp(buf,"+F2:",4))
1726 k=atoi(sstrsep(&p,sep));
1729 d=atof(sstrsep(&p,sep));
1731 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1733 rsa_results[k][0]=d;
1735 d=atof(sstrsep(&p,sep));
1737 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1739 rsa_results[k][1]=d;
1741 else if(!strncmp(buf,"+F2:",4))
1747 k=atoi(sstrsep(&p,sep));
1750 d=atof(sstrsep(&p,sep));
1752 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1754 rsa_results[k][0]=d;
1756 d=atof(sstrsep(&p,sep));
1758 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1760 rsa_results[k][1]=d;
1762 else if(!strncmp(buf,"+F3:",4))
1768 k=atoi(sstrsep(&p,sep));
1771 d=atof(sstrsep(&p,sep));
1773 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1775 dsa_results[k][0]=d;
1777 d=atof(sstrsep(&p,sep));
1779 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1781 dsa_results[k][1]=d;
1783 else if(!strncmp(buf,"+H:",3))
1787 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);