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