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 dsa_doit[R_DSA_2048]=1; 777 } 778 else 779 #endif 780 { 781 BIO_printf(bio_err,"Error: bad option or value\n"); 782 BIO_printf(bio_err,"\n"); 783 BIO_printf(bio_err,"Available values:\n"); 784 #ifndef OPENSSL_NO_MD2 785 BIO_printf(bio_err,"md2 "); 786 #endif 787 #ifndef OPENSSL_NO_MDC2 788 BIO_printf(bio_err,"mdc2 "); 789 #endif 790 #ifndef OPENSSL_NO_MD4 791 BIO_printf(bio_err,"md4 "); 792 #endif 793 #ifndef OPENSSL_NO_MD5 794 BIO_printf(bio_err,"md5 "); 795 #ifndef OPENSSL_NO_HMAC 796 BIO_printf(bio_err,"hmac "); 797 #endif 798 #endif 799 #ifndef OPENSSL_NO_SHA1 800 BIO_printf(bio_err,"sha1 "); 801 #endif 802 #ifndef OPENSSL_NO_RIPEMD160 803 BIO_printf(bio_err,"rmd160"); 804 #endif 805 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \ 806 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \ 807 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160) 808 BIO_printf(bio_err,"\n"); 809 #endif 810 811 #ifndef OPENSSL_NO_IDEA 812 BIO_printf(bio_err,"idea-cbc "); 813 #endif 814 #ifndef OPENSSL_NO_RC2 815 BIO_printf(bio_err,"rc2-cbc "); 816 #endif 817 #ifndef OPENSSL_NO_RC5 818 BIO_printf(bio_err,"rc5-cbc "); 819 #endif 820 #ifndef OPENSSL_NO_BF 821 BIO_printf(bio_err,"bf-cbc"); 822 #endif 823 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \ 824 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5) 825 BIO_printf(bio_err,"\n"); 826 #endif 827 #ifndef OPENSSL_NO_DES 828 BIO_printf(bio_err,"des-cbc des-ede3 "); 829 #endif 830 #ifndef OPENSSL_NO_AES 831 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc "); 832 #endif 833 #ifndef OPENSSL_NO_RC4 834 BIO_printf(bio_err,"rc4"); 835 #endif 836 BIO_printf(bio_err,"\n"); 837 838 #ifndef OPENSSL_NO_RSA 839 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n"); 840 #endif 841 842 #ifndef OPENSSL_NO_DSA 843 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n"); 844 #endif 845 846 #ifndef OPENSSL_NO_IDEA 847 BIO_printf(bio_err,"idea "); 848 #endif 849 #ifndef OPENSSL_NO_RC2 850 BIO_printf(bio_err,"rc2 "); 851 #endif 852 #ifndef OPENSSL_NO_DES 853 BIO_printf(bio_err,"des "); 854 #endif 855 #ifndef OPENSSL_NO_AES 856 BIO_printf(bio_err,"aes "); 857 #endif 858 #ifndef OPENSSL_NO_RSA 859 BIO_printf(bio_err,"rsa "); 860 #endif 861 #ifndef OPENSSL_NO_BF 862 BIO_printf(bio_err,"blowfish"); 863 #endif 864 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \ 865 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \ 866 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES) 867 BIO_printf(bio_err,"\n"); 868 #endif 869 870 BIO_printf(bio_err,"\n"); 871 BIO_printf(bio_err,"Available options:\n"); 872 #if defined(TIMES) || defined(USE_TOD) 873 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n"); 874 #endif 875 #ifndef OPENSSL_NO_ENGINE 876 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n"); 877 #endif 878 BIO_printf(bio_err,"-evp e use EVP e.\n"); 879 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n"); 880 BIO_printf(bio_err,"-mr produce machine readable output.\n"); 881 #ifdef HAVE_FORK 882 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n"); 883 #endif 884 goto end; 885 } 886 argc--; 887 argv++; 888 j++; 889 } 890 891 #ifdef HAVE_FORK 892 if(multi && do_multi(multi)) 893 goto show_res; 894 #endif 895 896 if (j == 0) 897 { 898 for (i=0; i<ALGOR_NUM; i++) 899 { 900 if (i != D_EVP) 901 doit[i]=1; 902 } 903 for (i=0; i<RSA_NUM; i++) 904 rsa_doit[i]=1; 905 for (i=0; i<DSA_NUM; i++) 906 dsa_doit[i]=1; 907 } 908 for (i=0; i<ALGOR_NUM; i++) 909 if (doit[i]) pr_header++; 910 911 if (usertime == 0 && !mr) 912 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n"); 913 if (usertime <= 0 && !mr) 914 { 915 BIO_printf(bio_err,"To get the most accurate results, try to run this\n"); 916 BIO_printf(bio_err,"program when this computer is idle.\n"); 917 } 918 919 #ifndef OPENSSL_NO_RSA 920 for (i=0; i<RSA_NUM; i++) 921 { 922 const unsigned char *p; 923 924 p=rsa_data[i]; 925 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]); 926 if (rsa_key[i] == NULL) 927 { 928 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i); 929 goto end; 930 } 931 #if 0 932 else 933 { 934 BIO_printf(bio_err,mr ? "+RK:%d:" 935 : "Loaded RSA key, %d bit modulus and e= 0x", 936 BN_num_bits(rsa_key[i]->n)); 937 BN_print(bio_err,rsa_key[i]->e); 938 BIO_printf(bio_err,"\n"); 939 } 940 #endif 941 } 942 #endif 943 944 #ifndef OPENSSL_NO_DSA 945 dsa_key[0]=get_dsa512(); 946 dsa_key[1]=get_dsa1024(); 947 dsa_key[2]=get_dsa2048(); 948 #endif 949 950 #ifndef OPENSSL_NO_DES 951 DES_set_key_unchecked(&key,&sch); 952 DES_set_key_unchecked(&key2,&sch2); 953 DES_set_key_unchecked(&key3,&sch3); 954 #endif 955 #ifndef OPENSSL_NO_AES 956 AES_set_encrypt_key(key16,128,&aes_ks1); 957 AES_set_encrypt_key(key24,192,&aes_ks2); 958 AES_set_encrypt_key(key32,256,&aes_ks3); 959 #endif 960 #ifndef OPENSSL_NO_IDEA 961 idea_set_encrypt_key(key16,&idea_ks); 962 #endif 963 #ifndef OPENSSL_NO_RC4 964 RC4_set_key(&rc4_ks,16,key16); 965 #endif 966 #ifndef OPENSSL_NO_RC2 967 RC2_set_key(&rc2_ks,16,key16,128); 968 #endif 969 #ifndef OPENSSL_NO_RC5 970 RC5_32_set_key(&rc5_ks,16,key16,12); 971 #endif 972 #ifndef OPENSSL_NO_BF 973 BF_set_key(&bf_ks,16,key16); 974 #endif 975 #ifndef OPENSSL_NO_CAST 976 CAST_set_key(&cast_ks,16,key16); 977 #endif 978 #ifndef OPENSSL_NO_RSA 979 memset(rsa_c,0,sizeof(rsa_c)); 980 #endif 981 #ifndef SIGALRM 982 #ifndef OPENSSL_NO_DES 983 BIO_printf(bio_err,"First we calculate the approximate speed ...\n"); 984 count=10; 985 do { 986 long i; 987 count*=2; 988 Time_F(START); 989 for (i=count; i; i--) 990 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock, 991 &sch,DES_ENCRYPT); 992 d=Time_F(STOP); 993 } while (d <3); 994 save_count=count; 995 c[D_MD2][0]=count/10; 996 c[D_MDC2][0]=count/10; 997 c[D_MD4][0]=count; 998 c[D_MD5][0]=count; 999 c[D_HMAC][0]=count; 1000 c[D_SHA1][0]=count; 1001 c[D_RMD160][0]=count; 1002 c[D_RC4][0]=count*5; 1003 c[D_CBC_DES][0]=count; 1004 c[D_EDE3_DES][0]=count/3; 1005 c[D_CBC_IDEA][0]=count; 1006 c[D_CBC_RC2][0]=count; 1007 c[D_CBC_RC5][0]=count; 1008 c[D_CBC_BF][0]=count; 1009 c[D_CBC_CAST][0]=count; 1010 c[D_CBC_128_AES][0]=count; 1011 c[D_CBC_192_AES][0]=count; 1012 c[D_CBC_256_AES][0]=count; 1013 1014 for (i=1; i<SIZE_NUM; i++) 1015 { 1016 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i]; 1017 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i]; 1018 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i]; 1019 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i]; 1020 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i]; 1021 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i]; 1022 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i]; 1023 } 1024 for (i=1; i<SIZE_NUM; i++) 1025 { 1026 long l0,l1; 1027 1028 l0=(long)lengths[i-1]; 1029 l1=(long)lengths[i]; 1030 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1; 1031 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1; 1032 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1; 1033 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1; 1034 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1; 1035 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1; 1036 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1; 1037 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1; 1038 c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1; 1039 c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1; 1040 c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1; 1041 } 1042 #ifndef OPENSSL_NO_RSA 1043 rsa_c[R_RSA_512][0]=count/2000; 1044 rsa_c[R_RSA_512][1]=count/400; 1045 for (i=1; i<RSA_NUM; i++) 1046 { 1047 rsa_c[i][0]=rsa_c[i-1][0]/8; 1048 rsa_c[i][1]=rsa_c[i-1][1]/4; 1049 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0)) 1050 rsa_doit[i]=0; 1051 else 1052 { 1053 if (rsa_c[i][0] == 0) 1054 { 1055 rsa_c[i][0]=1; 1056 rsa_c[i][1]=20; 1057 } 1058 } 1059 } 1060 #endif 1061 1062 #ifndef OPENSSL_NO_DSA 1063 dsa_c[R_DSA_512][0]=count/1000; 1064 dsa_c[R_DSA_512][1]=count/1000/2; 1065 for (i=1; i<DSA_NUM; i++) 1066 { 1067 dsa_c[i][0]=dsa_c[i-1][0]/4; 1068 dsa_c[i][1]=dsa_c[i-1][1]/4; 1069 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0)) 1070 dsa_doit[i]=0; 1071 else 1072 { 1073 if (dsa_c[i] == 0) 1074 { 1075 dsa_c[i][0]=1; 1076 dsa_c[i][1]=1; 1077 } 1078 } 1079 } 1080 #endif 1081 1082 #define COND(d) (count < (d)) 1083 #define COUNT(d) (d) 1084 #else 1085 /* not worth fixing */ 1086 # error "You cannot disable DES on systems without SIGALRM." 1087 #endif /* OPENSSL_NO_DES */ 1088 #else 1089 #define COND(c) (run) 1090 #define COUNT(d) (count) 1091 signal(SIGALRM,sig_done); 1092 #endif /* SIGALRM */ 1093 1094 #ifndef OPENSSL_NO_MD2 1095 if (doit[D_MD2]) 1096 { 1097 for (j=0; j<SIZE_NUM; j++) 1098 { 1099 print_message(names[D_MD2],c[D_MD2][j],lengths[j]); 1100 Time_F(START); 1101 for (count=0,run=1; COND(c[D_MD2][j]); count++) 1102 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL); 1103 d=Time_F(STOP); 1104 print_result(D_MD2,j,count,d); 1105 } 1106 } 1107 #endif 1108 #ifndef OPENSSL_NO_MDC2 1109 if (doit[D_MDC2]) 1110 { 1111 for (j=0; j<SIZE_NUM; j++) 1112 { 1113 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]); 1114 Time_F(START); 1115 for (count=0,run=1; COND(c[D_MDC2][j]); count++) 1116 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL); 1117 d=Time_F(STOP); 1118 print_result(D_MDC2,j,count,d); 1119 } 1120 } 1121 #endif 1122 1123 #ifndef OPENSSL_NO_MD4 1124 if (doit[D_MD4]) 1125 { 1126 for (j=0; j<SIZE_NUM; j++) 1127 { 1128 print_message(names[D_MD4],c[D_MD4][j],lengths[j]); 1129 Time_F(START); 1130 for (count=0,run=1; COND(c[D_MD4][j]); count++) 1131 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL); 1132 d=Time_F(STOP); 1133 print_result(D_MD4,j,count,d); 1134 } 1135 } 1136 #endif 1137 1138 #ifndef OPENSSL_NO_MD5 1139 if (doit[D_MD5]) 1140 { 1141 for (j=0; j<SIZE_NUM; j++) 1142 { 1143 print_message(names[D_MD5],c[D_MD5][j],lengths[j]); 1144 Time_F(START); 1145 for (count=0,run=1; COND(c[D_MD5][j]); count++) 1146 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL); 1147 d=Time_F(STOP); 1148 print_result(D_MD5,j,count,d); 1149 } 1150 } 1151 #endif 1152 1153 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC) 1154 if (doit[D_HMAC]) 1155 { 1156 HMAC_CTX hctx; 1157 1158 HMAC_CTX_init(&hctx); 1159 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...", 1160 16,EVP_md5(), NULL); 1161 1162 for (j=0; j<SIZE_NUM; j++) 1163 { 1164 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]); 1165 Time_F(START); 1166 for (count=0,run=1; COND(c[D_HMAC][j]); count++) 1167 { 1168 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL); 1169 HMAC_Update(&hctx,buf,lengths[j]); 1170 HMAC_Final(&hctx,&(hmac[0]),NULL); 1171 } 1172 d=Time_F(STOP); 1173 print_result(D_HMAC,j,count,d); 1174 } 1175 HMAC_CTX_cleanup(&hctx); 1176 } 1177 #endif 1178 #ifndef OPENSSL_NO_SHA 1179 if (doit[D_SHA1]) 1180 { 1181 for (j=0; j<SIZE_NUM; j++) 1182 { 1183 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]); 1184 Time_F(START); 1185 for (count=0,run=1; COND(c[D_SHA1][j]); count++) 1186 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL); 1187 d=Time_F(STOP); 1188 print_result(D_SHA1,j,count,d); 1189 } 1190 } 1191 #endif 1192 #ifndef OPENSSL_NO_RIPEMD 1193 if (doit[D_RMD160]) 1194 { 1195 for (j=0; j<SIZE_NUM; j++) 1196 { 1197 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]); 1198 Time_F(START); 1199 for (count=0,run=1; COND(c[D_RMD160][j]); count++) 1200 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL); 1201 d=Time_F(STOP); 1202 print_result(D_RMD160,j,count,d); 1203 } 1204 } 1205 #endif 1206 #ifndef OPENSSL_NO_RC4 1207 if (doit[D_RC4]) 1208 { 1209 for (j=0; j<SIZE_NUM; j++) 1210 { 1211 print_message(names[D_RC4],c[D_RC4][j],lengths[j]); 1212 Time_F(START); 1213 for (count=0,run=1; COND(c[D_RC4][j]); count++) 1214 RC4(&rc4_ks,(unsigned int)lengths[j], 1215 buf,buf); 1216 d=Time_F(STOP); 1217 print_result(D_RC4,j,count,d); 1218 } 1219 } 1220 #endif 1221 #ifndef OPENSSL_NO_DES 1222 if (doit[D_CBC_DES]) 1223 { 1224 for (j=0; j<SIZE_NUM; j++) 1225 { 1226 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]); 1227 Time_F(START); 1228 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++) 1229 DES_ncbc_encrypt(buf,buf,lengths[j],&sch, 1230 &DES_iv,DES_ENCRYPT); 1231 d=Time_F(STOP); 1232 print_result(D_CBC_DES,j,count,d); 1233 } 1234 } 1235 1236 if (doit[D_EDE3_DES]) 1237 { 1238 for (j=0; j<SIZE_NUM; j++) 1239 { 1240 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]); 1241 Time_F(START); 1242 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++) 1243 DES_ede3_cbc_encrypt(buf,buf,lengths[j], 1244 &sch,&sch2,&sch3, 1245 &DES_iv,DES_ENCRYPT); 1246 d=Time_F(STOP); 1247 print_result(D_EDE3_DES,j,count,d); 1248 } 1249 } 1250 #endif 1251 #ifndef OPENSSL_NO_AES 1252 if (doit[D_CBC_128_AES]) 1253 { 1254 for (j=0; j<SIZE_NUM; j++) 1255 { 1256 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]); 1257 Time_F(START); 1258 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++) 1259 AES_cbc_encrypt(buf,buf, 1260 (unsigned long)lengths[j],&aes_ks1, 1261 iv,AES_ENCRYPT); 1262 d=Time_F(STOP); 1263 print_result(D_CBC_128_AES,j,count,d); 1264 } 1265 } 1266 if (doit[D_CBC_192_AES]) 1267 { 1268 for (j=0; j<SIZE_NUM; j++) 1269 { 1270 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]); 1271 Time_F(START); 1272 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++) 1273 AES_cbc_encrypt(buf,buf, 1274 (unsigned long)lengths[j],&aes_ks2, 1275 iv,AES_ENCRYPT); 1276 d=Time_F(STOP); 1277 print_result(D_CBC_192_AES,j,count,d); 1278 } 1279 } 1280 if (doit[D_CBC_256_AES]) 1281 { 1282 for (j=0; j<SIZE_NUM; j++) 1283 { 1284 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]); 1285 Time_F(START); 1286 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++) 1287 AES_cbc_encrypt(buf,buf, 1288 (unsigned long)lengths[j],&aes_ks3, 1289 iv,AES_ENCRYPT); 1290 d=Time_F(STOP); 1291 print_result(D_CBC_256_AES,j,count,d); 1292 } 1293 } 1294 1295 #endif 1296 #ifndef OPENSSL_NO_IDEA 1297 if (doit[D_CBC_IDEA]) 1298 { 1299 for (j=0; j<SIZE_NUM; j++) 1300 { 1301 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]); 1302 Time_F(START); 1303 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++) 1304 idea_cbc_encrypt(buf,buf, 1305 (unsigned long)lengths[j],&idea_ks, 1306 iv,IDEA_ENCRYPT); 1307 d=Time_F(STOP); 1308 print_result(D_CBC_IDEA,j,count,d); 1309 } 1310 } 1311 #endif 1312 #ifndef OPENSSL_NO_RC2 1313 if (doit[D_CBC_RC2]) 1314 { 1315 for (j=0; j<SIZE_NUM; j++) 1316 { 1317 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]); 1318 Time_F(START); 1319 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++) 1320 RC2_cbc_encrypt(buf,buf, 1321 (unsigned long)lengths[j],&rc2_ks, 1322 iv,RC2_ENCRYPT); 1323 d=Time_F(STOP); 1324 print_result(D_CBC_RC2,j,count,d); 1325 } 1326 } 1327 #endif 1328 #ifndef OPENSSL_NO_RC5 1329 if (doit[D_CBC_RC5]) 1330 { 1331 for (j=0; j<SIZE_NUM; j++) 1332 { 1333 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]); 1334 Time_F(START); 1335 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++) 1336 RC5_32_cbc_encrypt(buf,buf, 1337 (unsigned long)lengths[j],&rc5_ks, 1338 iv,RC5_ENCRYPT); 1339 d=Time_F(STOP); 1340 print_result(D_CBC_RC5,j,count,d); 1341 } 1342 } 1343 #endif 1344 #ifndef OPENSSL_NO_BF 1345 if (doit[D_CBC_BF]) 1346 { 1347 for (j=0; j<SIZE_NUM; j++) 1348 { 1349 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]); 1350 Time_F(START); 1351 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++) 1352 BF_cbc_encrypt(buf,buf, 1353 (unsigned long)lengths[j],&bf_ks, 1354 iv,BF_ENCRYPT); 1355 d=Time_F(STOP); 1356 print_result(D_CBC_BF,j,count,d); 1357 } 1358 } 1359 #endif 1360 #ifndef OPENSSL_NO_CAST 1361 if (doit[D_CBC_CAST]) 1362 { 1363 for (j=0; j<SIZE_NUM; j++) 1364 { 1365 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]); 1366 Time_F(START); 1367 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++) 1368 CAST_cbc_encrypt(buf,buf, 1369 (unsigned long)lengths[j],&cast_ks, 1370 iv,CAST_ENCRYPT); 1371 d=Time_F(STOP); 1372 print_result(D_CBC_CAST,j,count,d); 1373 } 1374 } 1375 #endif 1376 1377 if (doit[D_EVP]) 1378 { 1379 for (j=0; j<SIZE_NUM; j++) 1380 { 1381 if (evp_cipher) 1382 { 1383 EVP_CIPHER_CTX ctx; 1384 int outl; 1385 1386 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid); 1387 /* -O3 -fschedule-insns messes up an 1388 * optimization here! names[D_EVP] 1389 * somehow becomes NULL */ 1390 print_message(names[D_EVP],save_count, 1391 lengths[j]); 1392 1393 EVP_CIPHER_CTX_init(&ctx); 1394 if(decrypt) 1395 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv); 1396 else 1397 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv); 1398 1399 Time_F(START); 1400 if(decrypt) 1401 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++) 1402 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]); 1403 else 1404 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++) 1405 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]); 1406 if(decrypt) 1407 EVP_DecryptFinal_ex(&ctx,buf,&outl); 1408 else 1409 EVP_EncryptFinal_ex(&ctx,buf,&outl); 1410 d=Time_F(STOP); 1411 EVP_CIPHER_CTX_cleanup(&ctx); 1412 } 1413 if (evp_md) 1414 { 1415 names[D_EVP]=OBJ_nid2ln(evp_md->type); 1416 print_message(names[D_EVP],save_count, 1417 lengths[j]); 1418 1419 Time_F(START); 1420 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++) 1421 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL); 1422 1423 d=Time_F(STOP); 1424 } 1425 print_result(D_EVP,j,count,d); 1426 } 1427 } 1428 1429 RAND_pseudo_bytes(buf,36); 1430 #ifndef OPENSSL_NO_RSA 1431 for (j=0; j<RSA_NUM; j++) 1432 { 1433 int ret; 1434 if (!rsa_doit[j]) continue; 1435 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]); 1436 if (ret == 0) 1437 { 1438 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n"); 1439 ERR_print_errors(bio_err); 1440 rsa_count=1; 1441 } 1442 else 1443 { 1444 pkey_print_message("private","rsa", 1445 rsa_c[j][0],rsa_bits[j], 1446 RSA_SECONDS); 1447 /* RSA_blinding_on(rsa_key[j],NULL); */ 1448 Time_F(START); 1449 for (count=0,run=1; COND(rsa_c[j][0]); count++) 1450 { 1451 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, 1452 &rsa_num, rsa_key[j]); 1453 if (ret == 0) 1454 { 1455 BIO_printf(bio_err, 1456 "RSA sign failure\n"); 1457 ERR_print_errors(bio_err); 1458 count=1; 1459 break; 1460 } 1461 } 1462 d=Time_F(STOP); 1463 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n" 1464 : "%ld %d bit private RSA's in %.2fs\n", 1465 count,rsa_bits[j],d); 1466 rsa_results[j][0]=d/(double)count; 1467 rsa_count=count; 1468 } 1469 1470 #if 1 1471 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]); 1472 if (ret <= 0) 1473 { 1474 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n"); 1475 ERR_print_errors(bio_err); 1476 rsa_doit[j] = 0; 1477 } 1478 else 1479 { 1480 pkey_print_message("public","rsa", 1481 rsa_c[j][1],rsa_bits[j], 1482 RSA_SECONDS); 1483 Time_F(START); 1484 for (count=0,run=1; COND(rsa_c[j][1]); count++) 1485 { 1486 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, 1487 rsa_num, rsa_key[j]); 1488 if (ret == 0) 1489 { 1490 BIO_printf(bio_err, 1491 "RSA verify failure\n"); 1492 ERR_print_errors(bio_err); 1493 count=1; 1494 break; 1495 } 1496 } 1497 d=Time_F(STOP); 1498 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n" 1499 : "%ld %d bit public RSA's in %.2fs\n", 1500 count,rsa_bits[j],d); 1501 rsa_results[j][1]=d/(double)count; 1502 } 1503 #endif 1504 1505 if (rsa_count <= 1) 1506 { 1507 /* if longer than 10s, don't do any more */ 1508 for (j++; j<RSA_NUM; j++) 1509 rsa_doit[j]=0; 1510 } 1511 } 1512 #endif 1513 1514 RAND_pseudo_bytes(buf,20); 1515 #ifndef OPENSSL_NO_DSA 1516 if (RAND_status() != 1) 1517 { 1518 RAND_seed(rnd_seed, sizeof rnd_seed); 1519 rnd_fake = 1; 1520 } 1521 for (j=0; j<DSA_NUM; j++) 1522 { 1523 unsigned int kk; 1524 int ret; 1525 1526 if (!dsa_doit[j]) continue; 1527 /* DSA_generate_key(dsa_key[j]); */ 1528 /* DSA_sign_setup(dsa_key[j],NULL); */ 1529 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2, 1530 &kk,dsa_key[j]); 1531 if (ret == 0) 1532 { 1533 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n"); 1534 ERR_print_errors(bio_err); 1535 rsa_count=1; 1536 } 1537 else 1538 { 1539 pkey_print_message("sign","dsa", 1540 dsa_c[j][0],dsa_bits[j], 1541 DSA_SECONDS); 1542 Time_F(START); 1543 for (count=0,run=1; COND(dsa_c[j][0]); count++) 1544 { 1545 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2, 1546 &kk,dsa_key[j]); 1547 if (ret == 0) 1548 { 1549 BIO_printf(bio_err, 1550 "DSA sign failure\n"); 1551 ERR_print_errors(bio_err); 1552 count=1; 1553 break; 1554 } 1555 } 1556 d=Time_F(STOP); 1557 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n" 1558 : "%ld %d bit DSA signs in %.2fs\n", 1559 count,dsa_bits[j],d); 1560 dsa_results[j][0]=d/(double)count; 1561 rsa_count=count; 1562 } 1563 1564 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2, 1565 kk,dsa_key[j]); 1566 if (ret <= 0) 1567 { 1568 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n"); 1569 ERR_print_errors(bio_err); 1570 dsa_doit[j] = 0; 1571 } 1572 else 1573 { 1574 pkey_print_message("verify","dsa", 1575 dsa_c[j][1],dsa_bits[j], 1576 DSA_SECONDS); 1577 Time_F(START); 1578 for (count=0,run=1; COND(dsa_c[j][1]); count++) 1579 { 1580 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2, 1581 kk,dsa_key[j]); 1582 if (ret <= 0) 1583 { 1584 BIO_printf(bio_err, 1585 "DSA verify failure\n"); 1586 ERR_print_errors(bio_err); 1587 count=1; 1588 break; 1589 } 1590 } 1591 d=Time_F(STOP); 1592 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n" 1593 : "%ld %d bit DSA verify in %.2fs\n", 1594 count,dsa_bits[j],d); 1595 dsa_results[j][1]=d/(double)count; 1596 } 1597 1598 if (rsa_count <= 1) 1599 { 1600 /* if longer than 10s, don't do any more */ 1601 for (j++; j<DSA_NUM; j++) 1602 dsa_doit[j]=0; 1603 } 1604 } 1605 if (rnd_fake) RAND_cleanup(); 1606 #endif 1607 #ifdef HAVE_FORK 1608 show_res: 1609 #endif 1610 if(!mr) 1611 { 1612 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION)); 1613 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON)); 1614 printf("options:"); 1615 printf("%s ",BN_options()); 1616 #ifndef OPENSSL_NO_MD2 1617 printf("%s ",MD2_options()); 1618 #endif 1619 #ifndef OPENSSL_NO_RC4 1620 printf("%s ",RC4_options()); 1621 #endif 1622 #ifndef OPENSSL_NO_DES 1623 printf("%s ",DES_options()); 1624 #endif 1625 #ifndef OPENSSL_NO_AES 1626 printf("%s ",AES_options()); 1627 #endif 1628 #ifndef OPENSSL_NO_IDEA 1629 printf("%s ",idea_options()); 1630 #endif 1631 #ifndef OPENSSL_NO_BF 1632 printf("%s ",BF_options()); 1633 #endif 1634 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS)); 1635 printf("available timing options: "); 1636 #ifdef TIMES 1637 printf("TIMES "); 1638 #endif 1639 #ifdef TIMEB 1640 printf("TIMEB "); 1641 #endif 1642 #ifdef USE_TOD 1643 printf("USE_TOD "); 1644 #endif 1645 #ifdef HZ 1646 #define as_string(s) (#s) 1647 printf("HZ=%g", (double)HZ); 1648 # ifdef _SC_CLK_TCK 1649 printf(" [sysconf value]"); 1650 # endif 1651 #endif 1652 printf("\n"); 1653 printf("timing function used: %s%s%s%s%s%s%s\n", 1654 (ftime_used ? "ftime" : ""), 1655 (ftime_used + times_used > 1 ? "," : ""), 1656 (times_used ? "times" : ""), 1657 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""), 1658 (gettimeofday_used ? "gettimeofday" : ""), 1659 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""), 1660 (getrusage_used ? "getrusage" : "")); 1661 } 1662 1663 if (pr_header) 1664 { 1665 if(mr) 1666 fprintf(stdout,"+H"); 1667 else 1668 { 1669 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n"); 1670 fprintf(stdout,"type "); 1671 } 1672 for (j=0; j<SIZE_NUM; j++) 1673 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]); 1674 fprintf(stdout,"\n"); 1675 } 1676 1677 for (k=0; k<ALGOR_NUM; k++) 1678 { 1679 if (!doit[k]) continue; 1680 if(mr) 1681 fprintf(stdout,"+F:%d:%s",k,names[k]); 1682 else 1683 fprintf(stdout,"%-13s",names[k]); 1684 for (j=0; j<SIZE_NUM; j++) 1685 { 1686 if (results[k][j] > 10000 && !mr) 1687 fprintf(stdout," %11.2fk",results[k][j]/1e3); 1688 else 1689 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]); 1690 } 1691 fprintf(stdout,"\n"); 1692 } 1693 #ifndef OPENSSL_NO_RSA 1694 j=1; 1695 for (k=0; k<RSA_NUM; k++) 1696 { 1697 if (!rsa_doit[k]) continue; 1698 if (j && !mr) 1699 { 1700 printf("%18ssign verify sign/s verify/s\n"," "); 1701 j=0; 1702 } 1703 if(mr) 1704 fprintf(stdout,"+F2:%u:%u:%f:%f\n", 1705 k,rsa_bits[k],rsa_results[k][0], 1706 rsa_results[k][1]); 1707 else 1708 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n", 1709 rsa_bits[k],rsa_results[k][0],rsa_results[k][1], 1710 1.0/rsa_results[k][0],1.0/rsa_results[k][1]); 1711 } 1712 #endif 1713 #ifndef OPENSSL_NO_DSA 1714 j=1; 1715 for (k=0; k<DSA_NUM; k++) 1716 { 1717 if (!dsa_doit[k]) continue; 1718 if (j && !mr) 1719 { 1720 printf("%18ssign verify sign/s verify/s\n"," "); 1721 j=0; 1722 } 1723 if(mr) 1724 fprintf(stdout,"+F3:%u:%u:%f:%f\n", 1725 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]); 1726 else 1727 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n", 1728 dsa_bits[k],dsa_results[k][0],dsa_results[k][1], 1729 1.0/dsa_results[k][0],1.0/dsa_results[k][1]); 1730 } 1731 #endif 1732 mret=0; 1733 end: 1734 ERR_print_errors(bio_err); 1735 if (buf != NULL) OPENSSL_free(buf); 1736 if (buf2 != NULL) OPENSSL_free(buf2); 1737 #ifndef OPENSSL_NO_RSA 1738 for (i=0; i<RSA_NUM; i++) 1739 if (rsa_key[i] != NULL) 1740 RSA_free(rsa_key[i]); 1741 #endif 1742 #ifndef OPENSSL_NO_DSA 1743 for (i=0; i<DSA_NUM; i++) 1744 if (dsa_key[i] != NULL) 1745 DSA_free(dsa_key[i]); 1746 #endif 1747 apps_shutdown(); 1748 OPENSSL_EXIT(mret); 1749 } 1750 1751 static void print_message(const char *s, long num, int length) 1752 { 1753 #ifdef SIGALRM 1754 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n" 1755 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length); 1756 (void)BIO_flush(bio_err); 1757 alarm(SECONDS); 1758 #else 1759 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n" 1760 : "Doing %s %ld times on %d size blocks: ",s,num,length); 1761 (void)BIO_flush(bio_err); 1762 #endif 1763 #ifdef LINT 1764 num=num; 1765 #endif 1766 } 1767 1768 static void pkey_print_message(char *str, char *str2, long num, int bits, 1769 int tm) 1770 { 1771 #ifdef SIGALRM 1772 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n" 1773 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm); 1774 (void)BIO_flush(bio_err); 1775 alarm(RSA_SECONDS); 1776 #else 1777 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n" 1778 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2); 1779 (void)BIO_flush(bio_err); 1780 #endif 1781 #ifdef LINT 1782 num=num; 1783 #endif 1784 } 1785 1786 static void print_result(int alg,int run_no,int count,double time_used) 1787 { 1788 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n" 1789 : "%ld %s's in %.2fs\n",count,names[alg],time_used); 1790 results[alg][run_no]=((double)count)/time_used*lengths[run_no]; 1791 } 1792 1793 static char *sstrsep(char **string, const char *delim) 1794 { 1795 char isdelim[256]; 1796 char *token = *string; 1797 1798 if (**string == 0) 1799 return NULL; 1800 1801 memset(isdelim, 0, sizeof isdelim); 1802 isdelim[0] = 1; 1803 1804 while (*delim) 1805 { 1806 isdelim[(unsigned char)(*delim)] = 1; 1807 delim++; 1808 } 1809 1810 while (!isdelim[(unsigned char)(**string)]) 1811 { 1812 (*string)++; 1813 } 1814 1815 if (**string) 1816 { 1817 **string = 0; 1818 (*string)++; 1819 } 1820 1821 return token; 1822 } 1823 1824 #ifdef HAVE_FORK 1825 static int do_multi(int multi) 1826 { 1827 int n; 1828 int fd[2]; 1829 int *fds; 1830 static char sep[]=":"; 1831 1832 fds=malloc(multi*sizeof *fds); 1833 for(n=0 ; n < multi ; ++n) 1834 { 1835 pipe(fd); 1836 if(fork()) 1837 { 1838 close(fd[1]); 1839 fds[n]=fd[0]; 1840 } 1841 else 1842 { 1843 close(fd[0]); 1844 close(1); 1845 dup(fd[1]); 1846 close(fd[1]); 1847 mr=1; 1848 usertime=0; 1849 return 0; 1850 } 1851 printf("Forked child %d\n",n); 1852 } 1853 1854 /* for now, assume the pipe is long enough to take all the output */ 1855 for(n=0 ; n < multi ; ++n) 1856 { 1857 FILE *f; 1858 char buf[1024]; 1859 char *p; 1860 1861 f=fdopen(fds[n],"r"); 1862 while(fgets(buf,sizeof buf,f)) 1863 { 1864 p=strchr(buf,'\n'); 1865 if(p) 1866 *p='\0'; 1867 if(buf[0] != '+') 1868 { 1869 fprintf(stderr,"Don't understand line '%s' from child %d\n", 1870 buf,n); 1871 continue; 1872 } 1873 printf("Got: %s from %d\n",buf,n); 1874 if(!strncmp(buf,"+F:",3)) 1875 { 1876 int alg; 1877 int j; 1878 1879 p=buf+3; 1880 alg=atoi(sstrsep(&p,sep)); 1881 sstrsep(&p,sep); 1882 for(j=0 ; j < SIZE_NUM ; ++j) 1883 results[alg][j]+=atof(sstrsep(&p,sep)); 1884 } 1885 else if(!strncmp(buf,"+F2:",4)) 1886 { 1887 int k; 1888 double d; 1889 1890 p=buf+4; 1891 k=atoi(sstrsep(&p,sep)); 1892 sstrsep(&p,sep); 1893 1894 d=atof(sstrsep(&p,sep)); 1895 if(n) 1896 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d); 1897 else 1898 rsa_results[k][0]=d; 1899 1900 d=atof(sstrsep(&p,sep)); 1901 if(n) 1902 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d); 1903 else 1904 rsa_results[k][1]=d; 1905 } 1906 else if(!strncmp(buf,"+F2:",4)) 1907 { 1908 int k; 1909 double d; 1910 1911 p=buf+4; 1912 k=atoi(sstrsep(&p,sep)); 1913 sstrsep(&p,sep); 1914 1915 d=atof(sstrsep(&p,sep)); 1916 if(n) 1917 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d); 1918 else 1919 rsa_results[k][0]=d; 1920 1921 d=atof(sstrsep(&p,sep)); 1922 if(n) 1923 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d); 1924 else 1925 rsa_results[k][1]=d; 1926 } 1927 else if(!strncmp(buf,"+F3:",4)) 1928 { 1929 int k; 1930 double d; 1931 1932 p=buf+4; 1933 k=atoi(sstrsep(&p,sep)); 1934 sstrsep(&p,sep); 1935 1936 d=atof(sstrsep(&p,sep)); 1937 if(n) 1938 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d); 1939 else 1940 dsa_results[k][0]=d; 1941 1942 d=atof(sstrsep(&p,sep)); 1943 if(n) 1944 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d); 1945 else 1946 dsa_results[k][1]=d; 1947 } 1948 else if(!strncmp(buf,"+H:",3)) 1949 { 1950 } 1951 else 1952 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n); 1953 } 1954 } 1955 return 1; 1956 } 1957 #endif 1958 #endif 1959