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