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