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=0,save_count=0;
357 #ifndef OPENSSL_NO_RSA
361 unsigned char md[EVP_MAX_MD_SIZE];
362 #ifndef OPENSSL_NO_MD2
363 unsigned char md2[MD2_DIGEST_LENGTH];
365 #ifndef OPENSSL_NO_MDC2
366 unsigned char mdc2[MDC2_DIGEST_LENGTH];
368 #ifndef OPENSSL_NO_MD4
369 unsigned char md4[MD4_DIGEST_LENGTH];
371 #ifndef OPENSSL_NO_MD5
372 unsigned char md5[MD5_DIGEST_LENGTH];
373 unsigned char hmac[MD5_DIGEST_LENGTH];
375 #ifndef OPENSSL_NO_SHA
376 unsigned char sha[SHA_DIGEST_LENGTH];
378 #ifndef OPENSSL_NO_RIPEMD
379 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
381 #ifndef OPENSSL_NO_RC4
384 #ifndef OPENSSL_NO_RC5
387 #ifndef OPENSSL_NO_RC2
390 #ifndef OPENSSL_NO_IDEA
391 IDEA_KEY_SCHEDULE idea_ks;
393 #ifndef OPENSSL_NO_BF
396 #ifndef OPENSSL_NO_CAST
399 static unsigned char key16[16]=
400 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
401 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
403 #ifndef OPENSSL_NO_DES
404 DES_cblock *buf_as_des_cblock = NULL;
405 static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
406 static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
407 static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
408 DES_key_schedule sch;
409 DES_key_schedule sch2;
410 DES_key_schedule sch3;
422 #define D_CBC_IDEA 10
426 #define D_CBC_CAST 14
429 long c[ALGOR_NUM][SIZE_NUM];
437 #ifndef OPENSSL_NO_RSA
438 RSA *rsa_key[RSA_NUM];
439 long rsa_c[RSA_NUM][2];
440 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
441 static unsigned char *rsa_data[RSA_NUM]=
442 {test512,test1024,test2048,test4096};
443 static int rsa_data_length[RSA_NUM]={
444 sizeof(test512),sizeof(test1024),
445 sizeof(test2048),sizeof(test4096)};
447 #ifndef OPENSSL_NO_DSA
448 DSA *dsa_key[DSA_NUM];
449 long dsa_c[DSA_NUM][2];
450 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
452 int rsa_doit[RSA_NUM];
453 int dsa_doit[DSA_NUM];
456 const EVP_CIPHER *evp_cipher=NULL;
457 const EVP_MD *evp_md=NULL;
468 memset(results, 0, sizeof(results));
469 #ifndef OPENSSL_NO_DSA
470 memset(dsa_key,0,sizeof(dsa_key));
474 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
475 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
477 #ifndef OPENSSL_NO_RSA
478 memset(rsa_key,0,sizeof(rsa_key));
479 for (i=0; i<RSA_NUM; i++)
483 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
485 BIO_printf(bio_err,"out of memory\n");
488 #ifndef OPENSSL_NO_DES
489 buf_as_des_cblock = (des_cblock *)buf;
491 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
493 BIO_printf(bio_err,"out of memory\n");
497 memset(c,0,sizeof(c));
498 memset(iv,0,sizeof(iv));
500 for (i=0; i<ALGOR_NUM; i++)
502 for (i=0; i<RSA_NUM; i++)
504 for (i=0; i<DSA_NUM; i++)
512 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
515 j--; /* Otherwise, -elapsed gets confused with
518 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
524 BIO_printf(bio_err,"no EVP given\n");
527 evp_cipher=EVP_get_cipherbyname(*argv);
530 evp_md=EVP_get_digestbyname(*argv);
532 if(!evp_cipher && !evp_md)
534 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
539 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
542 j--; /* Otherwise, -elapsed gets confused with
545 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
551 BIO_printf(bio_err,"no engine given\n");
554 e = setup_engine(bio_err, *argv, 0);
555 /* j will be increased again further down. We just
556 don't want speed to confuse an engine with an
557 algorithm, especially when none is given (which
558 means all of them should be run) */
562 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
568 BIO_printf(bio_err,"no multi count given\n");
574 BIO_printf(bio_err,"bad multi count\n");
577 j--; /* Otherwise, -mr gets confused with
581 else if (argc > 0 && !strcmp(*argv,"-mr"))
584 j--; /* Otherwise, -mr gets confused with
588 #ifndef OPENSSL_NO_MD2
589 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
592 #ifndef OPENSSL_NO_MDC2
593 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
596 #ifndef OPENSSL_NO_MD4
597 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
600 #ifndef OPENSSL_NO_MD5
601 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
604 #ifndef OPENSSL_NO_MD5
605 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
608 #ifndef OPENSSL_NO_SHA
609 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
611 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
614 #ifndef OPENSSL_NO_RIPEMD
615 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
617 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
619 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
622 #ifndef OPENSSL_NO_RC4
623 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
626 #ifndef OPENSSL_NO_DES
627 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
628 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
631 #ifndef OPENSSL_NO_RSA
632 #if 0 /* was: #ifdef RSAref */
633 if (strcmp(*argv,"rsaref") == 0)
635 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
641 if (strcmp(*argv,"openssl") == 0)
643 RSA_set_default_method(RSA_PKCS1_SSLeay());
648 #endif /* !OPENSSL_NO_RSA */
649 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
650 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
651 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
652 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
653 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
654 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
655 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
657 #ifndef OPENSSL_NO_RC2
658 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
659 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
662 #ifndef OPENSSL_NO_RC5
663 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
664 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
667 #ifndef OPENSSL_NO_IDEA
668 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
669 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
672 #ifndef OPENSSL_NO_BF
673 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
674 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
675 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
678 #ifndef OPENSSL_NO_CAST
679 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
680 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
681 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
684 #ifndef OPENSSL_NO_DES
685 if (strcmp(*argv,"des") == 0)
692 #ifndef OPENSSL_NO_RSA
693 if (strcmp(*argv,"rsa") == 0)
695 rsa_doit[R_RSA_512]=1;
696 rsa_doit[R_RSA_1024]=1;
697 rsa_doit[R_RSA_2048]=1;
698 rsa_doit[R_RSA_4096]=1;
702 #ifndef OPENSSL_NO_DSA
703 if (strcmp(*argv,"dsa") == 0)
705 dsa_doit[R_DSA_512]=1;
706 dsa_doit[R_DSA_1024]=1;
711 BIO_printf(bio_err,"Error: bad option or value\n");
712 BIO_printf(bio_err,"\n");
713 BIO_printf(bio_err,"Available values:\n");
714 #ifndef OPENSSL_NO_MD2
715 BIO_printf(bio_err,"md2 ");
717 #ifndef OPENSSL_NO_MDC2
718 BIO_printf(bio_err,"mdc2 ");
720 #ifndef OPENSSL_NO_MD4
721 BIO_printf(bio_err,"md4 ");
723 #ifndef OPENSSL_NO_MD5
724 BIO_printf(bio_err,"md5 ");
725 #ifndef OPENSSL_NO_HMAC
726 BIO_printf(bio_err,"hmac ");
729 #ifndef OPENSSL_NO_SHA1
730 BIO_printf(bio_err,"sha1 ");
732 #ifndef OPENSSL_NO_RIPEMD160
733 BIO_printf(bio_err,"rmd160");
735 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
736 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
737 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
738 BIO_printf(bio_err,"\n");
741 #ifndef OPENSSL_NO_IDEA
742 BIO_printf(bio_err,"idea-cbc ");
744 #ifndef OPENSSL_NO_RC2
745 BIO_printf(bio_err,"rc2-cbc ");
747 #ifndef OPENSSL_NO_RC5
748 BIO_printf(bio_err,"rc5-cbc ");
750 #ifndef OPENSSL_NO_BF
751 BIO_printf(bio_err,"bf-cbc");
753 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
754 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
755 BIO_printf(bio_err,"\n");
758 BIO_printf(bio_err,"des-cbc des-ede3 ");
759 #ifndef OPENSSL_NO_RC4
760 BIO_printf(bio_err,"rc4");
762 BIO_printf(bio_err,"\n");
764 #ifndef OPENSSL_NO_RSA
765 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
768 #ifndef OPENSSL_NO_DSA
769 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
772 #ifndef OPENSSL_NO_IDEA
773 BIO_printf(bio_err,"idea ");
775 #ifndef OPENSSL_NO_RC2
776 BIO_printf(bio_err,"rc2 ");
778 #ifndef OPENSSL_NO_DES
779 BIO_printf(bio_err,"des ");
781 #ifndef OPENSSL_NO_RSA
782 BIO_printf(bio_err,"rsa ");
784 #ifndef OPENSSL_NO_BF
785 BIO_printf(bio_err,"blowfish");
787 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
788 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
789 !defined(OPENSSL_NO_BF)
790 BIO_printf(bio_err,"\n");
793 BIO_printf(bio_err,"\n");
794 BIO_printf(bio_err,"Available options:\n");
796 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
798 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
799 BIO_printf(bio_err,"-evp e use EVP e.\n");
800 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
801 BIO_printf(bio_err,"-mr produce machine readable output.\n");
803 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
813 if(multi && do_multi(multi))
819 for (i=0; i<ALGOR_NUM; i++)
824 for (i=0; i<RSA_NUM; i++)
826 for (i=0; i<DSA_NUM; i++)
829 for (i=0; i<ALGOR_NUM; i++)
830 if (doit[i]) pr_header++;
832 if (usertime == 0 && !mr)
833 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
834 if (usertime <= 0 && !mr)
836 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
837 BIO_printf(bio_err,"program when this computer is idle.\n");
840 #ifndef OPENSSL_NO_RSA
841 for (i=0; i<RSA_NUM; i++)
843 const unsigned char *p;
846 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
847 if (rsa_key[i] == NULL)
849 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
855 BIO_printf(bio_err,mr ? "+RK:%d:"
856 : "Loaded RSA key, %d bit modulus and e= 0x",
857 BN_num_bits(rsa_key[i]->n));
858 BN_print(bio_err,rsa_key[i]->e);
859 BIO_printf(bio_err,"\n");
865 #ifndef OPENSSL_NO_DSA
866 dsa_key[0]=get_dsa512();
867 dsa_key[1]=get_dsa1024();
868 dsa_key[2]=get_dsa2048();
871 #ifndef OPENSSL_NO_DES
872 DES_set_key_unchecked(&key,&sch);
873 DES_set_key_unchecked(&key2,&sch2);
874 DES_set_key_unchecked(&key3,&sch3);
876 #ifndef OPENSSL_NO_IDEA
877 idea_set_encrypt_key(key16,&idea_ks);
879 #ifndef OPENSSL_NO_RC4
880 RC4_set_key(&rc4_ks,16,key16);
882 #ifndef OPENSSL_NO_RC2
883 RC2_set_key(&rc2_ks,16,key16,128);
885 #ifndef OPENSSL_NO_RC5
886 RC5_32_set_key(&rc5_ks,16,key16,12);
888 #ifndef OPENSSL_NO_BF
889 BF_set_key(&bf_ks,16,key16);
891 #ifndef OPENSSL_NO_CAST
892 CAST_set_key(&cast_ks,16,key16);
894 #ifndef OPENSSL_NO_RSA
895 memset(rsa_c,0,sizeof(rsa_c));
898 #ifndef OPENSSL_NO_DES
899 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
905 for (i=count; i; i--)
906 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
911 c[D_MD2][0]=count/10;
912 c[D_MDC2][0]=count/10;
917 c[D_RMD160][0]=count;
919 c[D_CBC_DES][0]=count;
920 c[D_EDE3_DES][0]=count/3;
921 c[D_CBC_IDEA][0]=count;
922 c[D_CBC_RC2][0]=count;
923 c[D_CBC_RC5][0]=count;
924 c[D_CBC_BF][0]=count;
925 c[D_CBC_CAST][0]=count;
927 for (i=1; i<SIZE_NUM; i++)
929 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
930 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
931 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
932 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
933 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
934 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
935 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
937 for (i=1; i<SIZE_NUM; i++)
941 l0=(long)lengths[i-1];
943 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
944 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
945 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
946 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
947 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
948 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
949 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
950 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
952 #ifndef OPENSSL_NO_RSA
953 rsa_c[R_RSA_512][0]=count/2000;
954 rsa_c[R_RSA_512][1]=count/400;
955 for (i=1; i<RSA_NUM; i++)
957 rsa_c[i][0]=rsa_c[i-1][0]/8;
958 rsa_c[i][1]=rsa_c[i-1][1]/4;
959 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
963 if (rsa_c[i][0] == 0)
972 #ifndef OPENSSL_NO_DSA
973 dsa_c[R_DSA_512][0]=count/1000;
974 dsa_c[R_DSA_512][1]=count/1000/2;
975 for (i=1; i<DSA_NUM; i++)
977 dsa_c[i][0]=dsa_c[i-1][0]/4;
978 dsa_c[i][1]=dsa_c[i-1][1]/4;
979 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
992 #define COND(d) (count < (d))
995 /* not worth fixing */
996 # error "You cannot disable DES on systems without SIGALRM."
997 #endif /* OPENSSL_NO_DES */
999 #define COND(c) (run)
1000 #define COUNT(d) (count)
1001 signal(SIGALRM,sig_done);
1002 #endif /* SIGALRM */
1004 #ifndef OPENSSL_NO_MD2
1007 for (j=0; j<SIZE_NUM; j++)
1009 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1011 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1012 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1014 print_result(D_MD2,j,count,d);
1018 #ifndef OPENSSL_NO_MDC2
1021 for (j=0; j<SIZE_NUM; j++)
1023 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1025 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1026 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1028 print_result(D_MDC2,j,count,d);
1033 #ifndef OPENSSL_NO_MD4
1036 for (j=0; j<SIZE_NUM; j++)
1038 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1040 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1041 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1043 print_result(D_MD4,j,count,d);
1048 #ifndef OPENSSL_NO_MD5
1051 for (j=0; j<SIZE_NUM; j++)
1053 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1055 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1056 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1058 print_result(D_MD5,j,count,d);
1063 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1068 HMAC_CTX_init(&hctx);
1069 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1072 for (j=0; j<SIZE_NUM; j++)
1074 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1076 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1078 HMAC_Init_ex(&hctx,NULL,0,NULL);
1079 HMAC_Update(&hctx,buf,lengths[j]);
1080 HMAC_Final(&hctx,&(hmac[0]),NULL);
1083 print_result(D_HMAC,j,count,d);
1085 HMAC_CTX_cleanup(&hctx);
1088 #ifndef OPENSSL_NO_SHA
1091 for (j=0; j<SIZE_NUM; j++)
1093 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1095 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1096 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1098 print_result(D_SHA1,j,count,d);
1102 #ifndef OPENSSL_NO_RIPEMD
1105 for (j=0; j<SIZE_NUM; j++)
1107 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1109 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1110 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1112 print_result(D_RMD160,j,count,d);
1116 #ifndef OPENSSL_NO_RC4
1119 for (j=0; j<SIZE_NUM; j++)
1121 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1123 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1124 RC4(&rc4_ks,(unsigned int)lengths[j],
1127 print_result(D_RC4,j,count,d);
1131 #ifndef OPENSSL_NO_DES
1132 if (doit[D_CBC_DES])
1134 for (j=0; j<SIZE_NUM; j++)
1136 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1138 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1139 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1142 print_result(D_CBC_DES,j,count,d);
1146 if (doit[D_EDE3_DES])
1148 for (j=0; j<SIZE_NUM; j++)
1150 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1152 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1153 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1157 print_result(D_EDE3_DES,j,count,d);
1161 #ifndef OPENSSL_NO_IDEA
1162 if (doit[D_CBC_IDEA])
1164 for (j=0; j<SIZE_NUM; j++)
1166 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1168 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1169 idea_cbc_encrypt(buf,buf,
1170 (unsigned long)lengths[j],&idea_ks,
1173 print_result(D_CBC_IDEA,j,count,d);
1177 #ifndef OPENSSL_NO_RC2
1178 if (doit[D_CBC_RC2])
1180 for (j=0; j<SIZE_NUM; j++)
1182 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1184 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1185 RC2_cbc_encrypt(buf,buf,
1186 (unsigned long)lengths[j],&rc2_ks,
1189 print_result(D_CBC_RC2,j,count,d);
1193 #ifndef OPENSSL_NO_RC5
1194 if (doit[D_CBC_RC5])
1196 for (j=0; j<SIZE_NUM; j++)
1198 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1200 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1201 RC5_32_cbc_encrypt(buf,buf,
1202 (unsigned long)lengths[j],&rc5_ks,
1205 print_result(D_CBC_RC5,j,count,d);
1209 #ifndef OPENSSL_NO_BF
1212 for (j=0; j<SIZE_NUM; j++)
1214 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1216 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1217 BF_cbc_encrypt(buf,buf,
1218 (unsigned long)lengths[j],&bf_ks,
1221 print_result(D_CBC_BF,j,count,d);
1225 #ifndef OPENSSL_NO_CAST
1226 if (doit[D_CBC_CAST])
1228 for (j=0; j<SIZE_NUM; j++)
1230 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1232 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1233 CAST_cbc_encrypt(buf,buf,
1234 (unsigned long)lengths[j],&cast_ks,
1237 print_result(D_CBC_CAST,j,count,d);
1244 for (j=0; j<SIZE_NUM; j++)
1251 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1252 print_message(names[D_EVP],save_count,
1255 EVP_CIPHER_CTX_init(&ctx);
1257 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1259 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1263 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1264 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1266 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1267 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1269 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1271 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1276 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1277 print_message(names[D_EVP],save_count,
1281 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1282 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1286 print_result(D_EVP,j,count,d);
1290 RAND_pseudo_bytes(buf,36);
1291 #ifndef OPENSSL_NO_RSA
1292 for (j=0; j<RSA_NUM; j++)
1295 if (!rsa_doit[j]) continue;
1296 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1299 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1300 ERR_print_errors(bio_err);
1305 pkey_print_message("private","rsa",
1306 rsa_c[j][0],rsa_bits[j],
1308 /* RSA_blinding_on(rsa_key[j],NULL); */
1310 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1312 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1313 &rsa_num, rsa_key[j]);
1317 "RSA sign failure\n");
1318 ERR_print_errors(bio_err);
1324 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1325 : "%ld %d bit private RSA's in %.2fs\n",
1326 count,rsa_bits[j],d);
1327 rsa_results[j][0]=d/(double)count;
1332 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1335 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1336 ERR_print_errors(bio_err);
1341 pkey_print_message("public","rsa",
1342 rsa_c[j][1],rsa_bits[j],
1345 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1347 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1348 rsa_num, rsa_key[j]);
1352 "RSA verify failure\n");
1353 ERR_print_errors(bio_err);
1359 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1360 : "%ld %d bit public RSA's in %.2fs\n",
1361 count,rsa_bits[j],d);
1362 rsa_results[j][1]=d/(double)count;
1368 /* if longer than 10s, don't do any more */
1369 for (j++; j<RSA_NUM; j++)
1375 RAND_pseudo_bytes(buf,20);
1376 #ifndef OPENSSL_NO_DSA
1377 if (RAND_status() != 1)
1379 RAND_seed(rnd_seed, sizeof rnd_seed);
1382 for (j=0; j<DSA_NUM; j++)
1387 if (!dsa_doit[j]) continue;
1388 /* DSA_generate_key(dsa_key[j]); */
1389 /* DSA_sign_setup(dsa_key[j],NULL); */
1390 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1394 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1395 ERR_print_errors(bio_err);
1400 pkey_print_message("sign","dsa",
1401 dsa_c[j][0],dsa_bits[j],
1404 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1406 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1411 "DSA sign failure\n");
1412 ERR_print_errors(bio_err);
1418 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1419 : "%ld %d bit DSA signs in %.2fs\n",
1420 count,dsa_bits[j],d);
1421 dsa_results[j][0]=d/(double)count;
1425 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1429 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1430 ERR_print_errors(bio_err);
1435 pkey_print_message("verify","dsa",
1436 dsa_c[j][1],dsa_bits[j],
1439 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1441 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1446 "DSA verify failure\n");
1447 ERR_print_errors(bio_err);
1453 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1454 : "%ld %d bit DSA verify in %.2fs\n",
1455 count,dsa_bits[j],d);
1456 dsa_results[j][1]=d/(double)count;
1461 /* if longer than 10s, don't do any more */
1462 for (j++; j<DSA_NUM; j++)
1466 if (rnd_fake) RAND_cleanup();
1473 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1474 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1476 printf("%s ",BN_options());
1477 #ifndef OPENSSL_NO_MD2
1478 printf("%s ",MD2_options());
1480 #ifndef OPENSSL_NO_RC4
1481 printf("%s ",RC4_options());
1483 #ifndef OPENSSL_NO_DES
1484 printf("%s ",des_options());
1486 #ifndef OPENSSL_NO_IDEA
1487 printf("%s ",idea_options());
1489 #ifndef OPENSSL_NO_BF
1490 printf("%s ",BF_options());
1492 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1493 printf("available timing options: ");
1504 #define as_string(s) (#s)
1505 printf("HZ=%g", (double)HZ);
1507 printf(" [sysconf value]");
1511 printf("timing function used: %s%s%s%s%s%s%s\n",
1512 (ftime_used ? "ftime" : ""),
1513 (ftime_used + times_used > 1 ? "," : ""),
1514 (times_used ? "times" : ""),
1515 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1516 (gettimeofday_used ? "gettimeofday" : ""),
1517 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1518 (getrusage_used ? "getrusage" : ""));
1524 fprintf(stdout,"+H");
1527 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1528 fprintf(stdout,"type ");
1530 for (j=0; j<SIZE_NUM; j++)
1531 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1532 fprintf(stdout,"\n");
1535 for (k=0; k<ALGOR_NUM; k++)
1537 if (!doit[k]) continue;
1539 fprintf(stdout,"+F:%d:%s",k,names[k]);
1541 fprintf(stdout,"%-13s",names[k]);
1542 for (j=0; j<SIZE_NUM; j++)
1544 if (results[k][j] > 10000 && !mr)
1545 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1547 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1549 fprintf(stdout,"\n");
1551 #ifndef OPENSSL_NO_RSA
1553 for (k=0; k<RSA_NUM; k++)
1555 if (!rsa_doit[k]) continue;
1558 printf("%18ssign verify sign/s verify/s\n"," ");
1562 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1563 k,rsa_bits[k],rsa_results[k][0],
1566 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1567 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1568 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1571 #ifndef OPENSSL_NO_DSA
1573 for (k=0; k<DSA_NUM; k++)
1575 if (!dsa_doit[k]) continue;
1578 printf("%18ssign verify sign/s verify/s\n"," ");
1582 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1583 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1585 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1586 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1587 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1592 ERR_print_errors(bio_err);
1593 if (buf != NULL) OPENSSL_free(buf);
1594 if (buf2 != NULL) OPENSSL_free(buf2);
1595 #ifndef OPENSSL_NO_RSA
1596 for (i=0; i<RSA_NUM; i++)
1597 if (rsa_key[i] != NULL)
1598 RSA_free(rsa_key[i]);
1600 #ifndef OPENSSL_NO_DSA
1601 for (i=0; i<DSA_NUM; i++)
1602 if (dsa_key[i] != NULL)
1603 DSA_free(dsa_key[i]);
1609 static void print_message(const char *s, long num, int length)
1612 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1613 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1614 (void)BIO_flush(bio_err);
1617 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1618 : "Doing %s %ld times on %d size blocks: ",s,num,length);
1619 (void)BIO_flush(bio_err);
1626 static void pkey_print_message(char *str, char *str2, long num, int bits,
1630 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1631 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1632 (void)BIO_flush(bio_err);
1635 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1636 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1637 (void)BIO_flush(bio_err);
1644 static void print_result(int alg,int run_no,int count,double time_used)
1646 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1647 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1648 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1651 static char *sstrsep(char **string, const char *delim)
1654 char *token = *string;
1659 memset(isdelim, 0, 256);
1664 isdelim[(unsigned char)(*delim)] = 1;
1668 while (!isdelim[(unsigned char)(**string)])
1683 static int do_multi(int multi)
1688 static char sep[]=":";
1690 fds=malloc(multi*sizeof *fds);
1691 for(n=0 ; n < multi ; ++n)
1709 printf("Forked child %d\n",n);
1712 /* for now, assume the pipe is long enough to take all the output */
1713 for(n=0 ; n < multi ; ++n)
1719 f=fdopen(fds[n],"r");
1720 while(fgets(buf,sizeof buf,f))
1727 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1731 printf("Got: %s from %d\n",buf,n);
1732 if(!strncmp(buf,"+F:",3))
1738 alg=atoi(sstrsep(&p,sep));
1740 for(j=0 ; j < SIZE_NUM ; ++j)
1741 results[alg][j]+=atof(sstrsep(&p,sep));
1743 else if(!strncmp(buf,"+F2:",4))
1749 k=atoi(sstrsep(&p,sep));
1752 d=atof(sstrsep(&p,sep));
1754 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1756 rsa_results[k][0]=d;
1758 d=atof(sstrsep(&p,sep));
1760 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1762 rsa_results[k][1]=d;
1764 else if(!strncmp(buf,"+F2:",4))
1770 k=atoi(sstrsep(&p,sep));
1773 d=atof(sstrsep(&p,sep));
1775 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1777 rsa_results[k][0]=d;
1779 d=atof(sstrsep(&p,sep));
1781 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1783 rsa_results[k][1]=d;
1785 else if(!strncmp(buf,"+F3:",4))
1791 k=atoi(sstrsep(&p,sep));
1794 d=atof(sstrsep(&p,sep));
1796 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1798 dsa_results[k][0]=d;
1800 d=atof(sstrsep(&p,sep));
1802 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1804 dsa_results[k][1]=d;
1806 else if(!strncmp(buf,"+H:",3))
1810 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);