1 /* apps/speed.c */ 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 * $FreeBSD$ 59 */ 60 61 /* most of this code has been pilfered from my libdes speed.c program */ 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 NO_STDIO 81 #define APPS_WIN16 82 #endif 83 #include <openssl/crypto.h> 84 #include <openssl/rand.h> 85 #include <openssl/err.h> 86 87 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) 88 # define USE_TOD 89 #elif !defined(MSDOS) && (!defined(VMS) || defined(__DECC)) 90 # define TIMES 91 #endif 92 #if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(MPE) && !defined(__NetBSD__) 93 # define TIMEB 94 #endif 95 96 #ifndef _IRIX 97 # include <time.h> 98 #endif 99 #ifdef TIMES 100 # include <sys/types.h> 101 # include <sys/times.h> 102 #endif 103 #ifdef USE_TOD 104 # include <sys/time.h> 105 # include <sys/resource.h> 106 #endif 107 108 /* Depending on the VMS version, the tms structure is perhaps defined. 109 The __TMS macro will show if it was. If it wasn't defined, we should 110 undefine TIMES, since that tells the rest of the program how things 111 should be handled. -- Richard Levitte */ 112 #if defined(VMS) && defined(__DECC) && !defined(__TMS) 113 #undef TIMES 114 #endif 115 116 #ifdef TIMEB 117 #include <sys/timeb.h> 118 #endif 119 120 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) 121 #error "It seems neither struct tms nor struct timeb is supported in this platform!" 122 #endif 123 124 #if defined(sun) || defined(__ultrix) 125 #define _POSIX_SOURCE 126 #include <limits.h> 127 #include <sys/param.h> 128 #endif 129 130 #ifndef NO_DES 131 #include <openssl/des.h> 132 #endif 133 #ifndef NO_MD2 134 #include <openssl/md2.h> 135 #endif 136 #ifndef NO_MDC2 137 #include <openssl/mdc2.h> 138 #endif 139 #ifndef NO_MD4 140 #include <openssl/md4.h> 141 #endif 142 #ifndef NO_MD5 143 #include <openssl/md5.h> 144 #endif 145 #ifndef NO_HMAC 146 #include <openssl/hmac.h> 147 #endif 148 #include <openssl/evp.h> 149 #ifndef NO_SHA 150 #include <openssl/sha.h> 151 #endif 152 #ifndef NO_RIPEMD 153 #include <openssl/ripemd.h> 154 #endif 155 #ifndef NO_RC4 156 #include <openssl/rc4.h> 157 #endif 158 #ifndef NO_RC5 159 #include <openssl/rc5.h> 160 #endif 161 #ifndef NO_RC2 162 #include <openssl/rc2.h> 163 #endif 164 #ifndef NO_IDEA 165 #include <openssl/idea.h> 166 #endif 167 #ifndef NO_BF 168 #include <openssl/blowfish.h> 169 #endif 170 #ifndef NO_CAST 171 #include <openssl/cast.h> 172 #endif 173 #ifndef NO_RSA 174 #include <openssl/rsa.h> 175 #include "./testrsa.h" 176 #endif 177 #include <openssl/x509.h> 178 #ifndef NO_DSA 179 #include "./testdsa.h" 180 #endif 181 182 /* The following if from times(3) man page. It may need to be changed */ 183 #ifndef HZ 184 # ifndef CLK_TCK 185 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */ 186 # define HZ 100.0 187 # else /* _BSD_CLK_TCK_ */ 188 # define HZ ((double)_BSD_CLK_TCK_) 189 # endif 190 # else /* CLK_TCK */ 191 # define HZ ((double)CLK_TCK) 192 # endif 193 #endif 194 195 #undef BUFSIZE 196 #define BUFSIZE ((long)1024*8+1) 197 int run=0; 198 199 static double Time_F(int s, int usertime); 200 static void print_message(char *s,long num,int length); 201 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec); 202 #ifdef SIGALRM 203 #if defined(__STDC__) || defined(sgi) || defined(_AIX) 204 #define SIGRETTYPE void 205 #else 206 #define SIGRETTYPE int 207 #endif 208 209 static SIGRETTYPE sig_done(int sig); 210 static SIGRETTYPE sig_done(int sig) 211 { 212 signal(SIGALRM,sig_done); 213 run=0; 214 #ifdef LINT 215 sig=sig; 216 #endif 217 } 218 #endif 219 220 #define START 0 221 #define STOP 1 222 223 static double Time_F(int s, int usertime) 224 { 225 double ret; 226 227 #ifdef USE_TOD 228 if(usertime) 229 { 230 static struct rusage tstart,tend; 231 232 if (s == START) 233 { 234 getrusage(RUSAGE_SELF,&tstart); 235 return(0); 236 } 237 else 238 { 239 long i; 240 241 getrusage(RUSAGE_SELF,&tend); 242 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec; 243 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec)) 244 +((double)i)/1000000.0; 245 return((ret < 0.001)?0.001:ret); 246 } 247 } 248 else 249 { 250 static struct timeval tstart,tend; 251 long i; 252 253 if (s == START) 254 { 255 gettimeofday(&tstart,NULL); 256 return(0); 257 } 258 else 259 { 260 gettimeofday(&tend,NULL); 261 i=(long)tend.tv_usec-(long)tstart.tv_usec; 262 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0; 263 return((ret < 0.001)?0.001:ret); 264 } 265 } 266 #else /* ndef USE_TOD */ 267 268 # ifdef TIMES 269 if (usertime) 270 { 271 static struct tms tstart,tend; 272 273 if (s == START) 274 { 275 times(&tstart); 276 return(0); 277 } 278 else 279 { 280 times(&tend); 281 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ; 282 return((ret < 1e-3)?1e-3:ret); 283 } 284 } 285 # endif /* times() */ 286 # if defined(TIMES) && defined(TIMEB) 287 else 288 # endif 289 # ifdef TIMEB 290 { 291 static struct timeb tstart,tend; 292 long i; 293 294 if (s == START) 295 { 296 ftime(&tstart); 297 return(0); 298 } 299 else 300 { 301 ftime(&tend); 302 i=(long)tend.millitm-(long)tstart.millitm; 303 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0; 304 return((ret < 0.001)?0.001:ret); 305 } 306 } 307 # endif 308 #endif 309 } 310 311 int MAIN(int, char **); 312 313 int MAIN(int argc, char **argv) 314 { 315 unsigned char *buf=NULL,*buf2=NULL; 316 int mret=1; 317 #define ALGOR_NUM 15 318 #define SIZE_NUM 5 319 #define RSA_NUM 4 320 #define DSA_NUM 3 321 long count,rsa_count; 322 int i,j,k; 323 unsigned rsa_num; 324 #ifndef NO_MD2 325 unsigned char md2[MD2_DIGEST_LENGTH]; 326 #endif 327 #ifndef NO_MDC2 328 unsigned char mdc2[MDC2_DIGEST_LENGTH]; 329 #endif 330 #ifndef NO_MD4 331 unsigned char md4[MD4_DIGEST_LENGTH]; 332 #endif 333 #ifndef NO_MD5 334 unsigned char md5[MD5_DIGEST_LENGTH]; 335 unsigned char hmac[MD5_DIGEST_LENGTH]; 336 #endif 337 #ifndef NO_SHA 338 unsigned char sha[SHA_DIGEST_LENGTH]; 339 #endif 340 #ifndef NO_RIPEMD 341 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH]; 342 #endif 343 #ifndef NO_RC4 344 RC4_KEY rc4_ks; 345 #endif 346 #ifndef NO_RC5 347 RC5_32_KEY rc5_ks; 348 #endif 349 #ifndef NO_RC2 350 RC2_KEY rc2_ks; 351 #endif 352 #ifndef NO_IDEA 353 IDEA_KEY_SCHEDULE idea_ks; 354 #endif 355 #ifndef NO_BF 356 BF_KEY bf_ks; 357 #endif 358 #ifndef NO_CAST 359 CAST_KEY cast_ks; 360 #endif 361 static unsigned char key16[16]= 362 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0, 363 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12}; 364 unsigned char iv[8]; 365 #ifndef NO_DES 366 des_cblock *buf_as_des_cblock = NULL; 367 static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}; 368 static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12}; 369 static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34}; 370 des_key_schedule sch,sch2,sch3; 371 #endif 372 #define D_MD2 0 373 #define D_MDC2 1 374 #define D_MD4 2 375 #define D_MD5 3 376 #define D_HMAC 4 377 #define D_SHA1 5 378 #define D_RMD160 6 379 #define D_RC4 7 380 #define D_CBC_DES 8 381 #define D_EDE3_DES 9 382 #define D_CBC_IDEA 10 383 #define D_CBC_RC2 11 384 #define D_CBC_RC5 12 385 #define D_CBC_BF 13 386 #define D_CBC_CAST 14 387 double d,results[ALGOR_NUM][SIZE_NUM]; 388 static int lengths[SIZE_NUM]={8,64,256,1024,8*1024}; 389 long c[ALGOR_NUM][SIZE_NUM]; 390 static char *names[ALGOR_NUM]={ 391 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4", 392 "des cbc","des ede3","idea cbc", 393 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"}; 394 #define R_DSA_512 0 395 #define R_DSA_1024 1 396 #define R_DSA_2048 2 397 #define R_RSA_512 0 398 #define R_RSA_1024 1 399 #define R_RSA_2048 2 400 #define R_RSA_4096 3 401 #ifndef NO_RSA 402 RSA *rsa_key[RSA_NUM]; 403 long rsa_c[RSA_NUM][2]; 404 double rsa_results[RSA_NUM][2]; 405 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096}; 406 static unsigned char *rsa_data[RSA_NUM]= 407 {test512,test1024,test2048,test4096}; 408 static int rsa_data_length[RSA_NUM]={ 409 sizeof(test512),sizeof(test1024), 410 sizeof(test2048),sizeof(test4096)}; 411 #endif 412 #ifndef NO_DSA 413 DSA *dsa_key[DSA_NUM]; 414 long dsa_c[DSA_NUM][2]; 415 double dsa_results[DSA_NUM][2]; 416 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048}; 417 #endif 418 int rsa_doit[RSA_NUM]; 419 int dsa_doit[DSA_NUM]; 420 int doit[ALGOR_NUM]; 421 int pr_header=0; 422 int usertime=1; 423 424 #ifndef TIMES 425 usertime=-1; 426 #endif 427 428 apps_startup(); 429 memset(results, 0, sizeof(results)); 430 #ifndef NO_DSA 431 memset(dsa_key,0,sizeof(dsa_key)); 432 #endif 433 434 if (bio_err == NULL) 435 if ((bio_err=BIO_new(BIO_s_file())) != NULL) 436 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); 437 438 #ifndef NO_RSA 439 memset(rsa_key,0,sizeof(rsa_key)); 440 for (i=0; i<RSA_NUM; i++) 441 rsa_key[i]=NULL; 442 #endif 443 444 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL) 445 { 446 BIO_printf(bio_err,"out of memory\n"); 447 goto end; 448 } 449 #ifndef NO_DES 450 buf_as_des_cblock = (des_cblock *)buf; 451 #endif 452 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL) 453 { 454 BIO_printf(bio_err,"out of memory\n"); 455 goto end; 456 } 457 458 memset(c,0,sizeof(c)); 459 memset(iv,0,sizeof(iv)); 460 461 for (i=0; i<ALGOR_NUM; i++) 462 doit[i]=0; 463 for (i=0; i<RSA_NUM; i++) 464 rsa_doit[i]=0; 465 for (i=0; i<DSA_NUM; i++) 466 dsa_doit[i]=0; 467 468 j=0; 469 argc--; 470 argv++; 471 while (argc) 472 { 473 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0)) 474 usertime = 0; 475 #ifndef NO_MD2 476 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1; 477 else 478 #endif 479 #ifndef NO_MDC2 480 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1; 481 else 482 #endif 483 #ifndef NO_MD4 484 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1; 485 else 486 #endif 487 #ifndef NO_MD5 488 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1; 489 else 490 #endif 491 #ifndef NO_MD5 492 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1; 493 else 494 #endif 495 #ifndef NO_SHA 496 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1; 497 else 498 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1; 499 else 500 #endif 501 #ifndef NO_RIPEMD 502 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1; 503 else 504 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1; 505 else 506 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1; 507 else 508 #endif 509 #ifndef NO_RC4 510 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1; 511 else 512 #endif 513 #ifndef NO_DES 514 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1; 515 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1; 516 else 517 #endif 518 #ifndef NO_RSA 519 #ifdef RSAref 520 if (strcmp(*argv,"rsaref") == 0) 521 { 522 RSA_set_default_method(RSA_PKCS1_RSAref()); 523 j--; 524 } 525 else 526 #endif 527 #ifndef RSA_NULL 528 if (strcmp(*argv,"openssl") == 0) 529 { 530 RSA_set_default_method(RSA_PKCS1_SSLeay()); 531 j--; 532 } 533 else 534 #endif 535 #endif /* !NO_RSA */ 536 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2; 537 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2; 538 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2; 539 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2; 540 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2; 541 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2; 542 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2; 543 else 544 #ifndef NO_RC2 545 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1; 546 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1; 547 else 548 #endif 549 #ifndef NO_RC5 550 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1; 551 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1; 552 else 553 #endif 554 #ifndef NO_IDEA 555 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1; 556 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1; 557 else 558 #endif 559 #ifndef NO_BF 560 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1; 561 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1; 562 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1; 563 else 564 #endif 565 #ifndef NO_CAST 566 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1; 567 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1; 568 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1; 569 else 570 #endif 571 #ifndef NO_DES 572 if (strcmp(*argv,"des") == 0) 573 { 574 doit[D_CBC_DES]=1; 575 doit[D_EDE3_DES]=1; 576 } 577 else 578 #endif 579 #ifndef NO_RSA 580 if (strcmp(*argv,"rsa") == 0) 581 { 582 rsa_doit[R_RSA_512]=1; 583 rsa_doit[R_RSA_1024]=1; 584 rsa_doit[R_RSA_2048]=1; 585 rsa_doit[R_RSA_4096]=1; 586 } 587 else 588 #endif 589 #ifndef NO_DSA 590 if (strcmp(*argv,"dsa") == 0) 591 { 592 dsa_doit[R_DSA_512]=1; 593 dsa_doit[R_DSA_1024]=1; 594 } 595 else 596 #endif 597 { 598 BIO_printf(bio_err,"Error: bad option or value\n"); 599 BIO_printf(bio_err,"\n"); 600 BIO_printf(bio_err,"Available values:\n"); 601 #ifndef NO_MD2 602 BIO_printf(bio_err,"md2 "); 603 #endif 604 #ifndef NO_MDC2 605 BIO_printf(bio_err,"mdc2 "); 606 #endif 607 #ifndef NO_MD4 608 BIO_printf(bio_err,"md4 "); 609 #endif 610 #ifndef NO_MD5 611 BIO_printf(bio_err,"md5 "); 612 #ifndef NO_HMAC 613 BIO_printf(bio_err,"hmac "); 614 #endif 615 #endif 616 #ifndef NO_SHA1 617 BIO_printf(bio_err,"sha1 "); 618 #endif 619 #ifndef NO_RIPEMD160 620 BIO_printf(bio_err,"rmd160"); 621 #endif 622 #if !defined(NO_MD2) || !defined(NO_MDC2) || !defined(NO_MD4) || !defined(NO_MD5) || !defined(NO_SHA1) || !defined(NO_RIPEMD160) 623 BIO_printf(bio_err,"\n"); 624 #endif 625 626 #ifndef NO_IDEA 627 BIO_printf(bio_err,"idea-cbc "); 628 #endif 629 #ifndef NO_RC2 630 BIO_printf(bio_err,"rc2-cbc "); 631 #endif 632 #ifndef NO_RC5 633 BIO_printf(bio_err,"rc5-cbc "); 634 #endif 635 #ifndef NO_BF 636 BIO_printf(bio_err,"bf-cbc"); 637 #endif 638 #if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_BF) || !defined(NO_RC5) 639 BIO_printf(bio_err,"\n"); 640 #endif 641 642 BIO_printf(bio_err,"des-cbc des-ede3 "); 643 #ifndef NO_RC4 644 BIO_printf(bio_err,"rc4"); 645 #endif 646 BIO_printf(bio_err,"\n"); 647 648 #ifndef NO_RSA 649 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n"); 650 #endif 651 652 #ifndef NO_DSA 653 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n"); 654 #endif 655 656 #ifndef NO_IDEA 657 BIO_printf(bio_err,"idea "); 658 #endif 659 #ifndef NO_RC2 660 BIO_printf(bio_err,"rc2 "); 661 #endif 662 #ifndef NO_DES 663 BIO_printf(bio_err,"des "); 664 #endif 665 #ifndef NO_RSA 666 BIO_printf(bio_err,"rsa "); 667 #endif 668 #ifndef NO_BF 669 BIO_printf(bio_err,"blowfish"); 670 #endif 671 #if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_DES) || !defined(NO_RSA) || !defined(NO_BF) 672 BIO_printf(bio_err,"\n"); 673 #endif 674 675 #ifdef TIMES 676 BIO_printf(bio_err,"\n"); 677 BIO_printf(bio_err,"Available options:\n"); 678 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n"); 679 #endif 680 goto end; 681 } 682 argc--; 683 argv++; 684 j++; 685 } 686 687 if (j == 0) 688 { 689 for (i=0; i<ALGOR_NUM; i++) 690 doit[i]=1; 691 for (i=0; i<RSA_NUM; i++) 692 rsa_doit[i]=1; 693 for (i=0; i<DSA_NUM; i++) 694 dsa_doit[i]=1; 695 } 696 for (i=0; i<ALGOR_NUM; i++) 697 if (doit[i]) pr_header++; 698 699 if (usertime == 0) 700 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n"); 701 if (usertime <= 0) 702 { 703 BIO_printf(bio_err,"To get the most accurate results, try to run this\n"); 704 BIO_printf(bio_err,"program when this computer is idle.\n"); 705 } 706 707 #ifndef NO_RSA 708 for (i=0; i<RSA_NUM; i++) 709 { 710 unsigned char *p; 711 712 p=rsa_data[i]; 713 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]); 714 if (rsa_key[i] == NULL) 715 { 716 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i); 717 goto end; 718 } 719 #if 0 720 else 721 { 722 BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n)); 723 BN_print(bio_err,rsa_key[i]->e); 724 BIO_printf(bio_err,"\n"); 725 } 726 #endif 727 } 728 #endif 729 730 #ifndef NO_DSA 731 dsa_key[0]=get_dsa512(); 732 dsa_key[1]=get_dsa1024(); 733 dsa_key[2]=get_dsa2048(); 734 #endif 735 736 #ifndef NO_DES 737 des_set_key_unchecked(&key,sch); 738 des_set_key_unchecked(&key2,sch2); 739 des_set_key_unchecked(&key3,sch3); 740 #endif 741 #ifndef NO_IDEA 742 idea_set_encrypt_key(key16,&idea_ks); 743 #endif 744 #ifndef NO_RC4 745 RC4_set_key(&rc4_ks,16,key16); 746 #endif 747 #ifndef NO_RC2 748 RC2_set_key(&rc2_ks,16,key16,128); 749 #endif 750 #ifndef NO_RC5 751 RC5_32_set_key(&rc5_ks,16,key16,12); 752 #endif 753 #ifndef NO_BF 754 BF_set_key(&bf_ks,16,key16); 755 #endif 756 #ifndef NO_CAST 757 CAST_set_key(&cast_ks,16,key16); 758 #endif 759 #ifndef NO_RSA 760 memset(rsa_c,0,sizeof(rsa_c)); 761 #endif 762 #ifndef SIGALRM 763 #ifndef NO_DES 764 BIO_printf(bio_err,"First we calculate the approximate speed ...\n"); 765 count=10; 766 do { 767 long i; 768 count*=2; 769 Time_F(START,usertime); 770 for (i=count; i; i--) 771 des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock, 772 &(sch[0]),DES_ENCRYPT); 773 d=Time_F(STOP,usertime); 774 } while (d <3); 775 c[D_MD2][0]=count/10; 776 c[D_MDC2][0]=count/10; 777 c[D_MD4][0]=count; 778 c[D_MD5][0]=count; 779 c[D_HMAC][0]=count; 780 c[D_SHA1][0]=count; 781 c[D_RMD160][0]=count; 782 c[D_RC4][0]=count*5; 783 c[D_CBC_DES][0]=count; 784 c[D_EDE3_DES][0]=count/3; 785 c[D_CBC_IDEA][0]=count; 786 c[D_CBC_RC2][0]=count; 787 c[D_CBC_RC5][0]=count; 788 c[D_CBC_BF][0]=count; 789 c[D_CBC_CAST][0]=count; 790 791 for (i=1; i<SIZE_NUM; i++) 792 { 793 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i]; 794 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i]; 795 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i]; 796 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i]; 797 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i]; 798 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i]; 799 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i]; 800 } 801 for (i=1; i<SIZE_NUM; i++) 802 { 803 long l0,l1; 804 805 l0=(long)lengths[i-1]; 806 l1=(long)lengths[i]; 807 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1; 808 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1; 809 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1; 810 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1; 811 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1; 812 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1; 813 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1; 814 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1; 815 } 816 #ifndef NO_RSA 817 rsa_c[R_RSA_512][0]=count/2000; 818 rsa_c[R_RSA_512][1]=count/400; 819 for (i=1; i<RSA_NUM; i++) 820 { 821 rsa_c[i][0]=rsa_c[i-1][0]/8; 822 rsa_c[i][1]=rsa_c[i-1][1]/4; 823 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0)) 824 rsa_doit[i]=0; 825 else 826 { 827 if (rsa_c[i][0] == 0) 828 { 829 rsa_c[i][0]=1; 830 rsa_c[i][1]=20; 831 } 832 } 833 } 834 #endif 835 836 #ifndef NO_DSA 837 dsa_c[R_DSA_512][0]=count/1000; 838 dsa_c[R_DSA_512][1]=count/1000/2; 839 for (i=1; i<DSA_NUM; i++) 840 { 841 dsa_c[i][0]=dsa_c[i-1][0]/4; 842 dsa_c[i][1]=dsa_c[i-1][1]/4; 843 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0)) 844 dsa_doit[i]=0; 845 else 846 { 847 if (dsa_c[i] == 0) 848 { 849 dsa_c[i][0]=1; 850 dsa_c[i][1]=1; 851 } 852 } 853 } 854 #endif 855 856 #define COND(d) (count < (d)) 857 #define COUNT(d) (d) 858 #else 859 /* not worth fixing */ 860 # error "You cannot disable DES on systems without SIGALRM." 861 #endif /* NO_DES */ 862 #else 863 #define COND(c) (run) 864 #define COUNT(d) (count) 865 signal(SIGALRM,sig_done); 866 #endif /* SIGALRM */ 867 868 #ifndef NO_MD2 869 if (doit[D_MD2]) 870 { 871 for (j=0; j<SIZE_NUM; j++) 872 { 873 print_message(names[D_MD2],c[D_MD2][j],lengths[j]); 874 Time_F(START,usertime); 875 for (count=0,run=1; COND(c[D_MD2][j]); count++) 876 MD2(buf,(unsigned long)lengths[j],&(md2[0])); 877 d=Time_F(STOP,usertime); 878 BIO_printf(bio_err,"%ld %s's in %.2fs\n", 879 count,names[D_MD2],d); 880 results[D_MD2][j]=((double)count)/d*lengths[j]; 881 } 882 } 883 #endif 884 #ifndef NO_MDC2 885 if (doit[D_MDC2]) 886 { 887 for (j=0; j<SIZE_NUM; j++) 888 { 889 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]); 890 Time_F(START,usertime); 891 for (count=0,run=1; COND(c[D_MDC2][j]); count++) 892 MDC2(buf,(unsigned long)lengths[j],&(mdc2[0])); 893 d=Time_F(STOP,usertime); 894 BIO_printf(bio_err,"%ld %s's in %.2fs\n", 895 count,names[D_MDC2],d); 896 results[D_MDC2][j]=((double)count)/d*lengths[j]; 897 } 898 } 899 #endif 900 901 #ifndef NO_MD4 902 if (doit[D_MD4]) 903 { 904 for (j=0; j<SIZE_NUM; j++) 905 { 906 print_message(names[D_MD4],c[D_MD4][j],lengths[j]); 907 Time_F(START,usertime); 908 for (count=0,run=1; COND(c[D_MD4][j]); count++) 909 MD4(&(buf[0]),(unsigned long)lengths[j],&(md4[0])); 910 d=Time_F(STOP,usertime); 911 BIO_printf(bio_err,"%ld %s's in %.2fs\n", 912 count,names[D_MD4],d); 913 results[D_MD4][j]=((double)count)/d*lengths[j]; 914 } 915 } 916 #endif 917 918 #ifndef NO_MD5 919 if (doit[D_MD5]) 920 { 921 for (j=0; j<SIZE_NUM; j++) 922 { 923 print_message(names[D_MD5],c[D_MD5][j],lengths[j]); 924 Time_F(START,usertime); 925 for (count=0,run=1; COND(c[D_MD5][j]); count++) 926 MD5(&(buf[0]),(unsigned long)lengths[j],&(md5[0])); 927 d=Time_F(STOP,usertime); 928 BIO_printf(bio_err,"%ld %s's in %.2fs\n", 929 count,names[D_MD5],d); 930 results[D_MD5][j]=((double)count)/d*lengths[j]; 931 } 932 } 933 #endif 934 935 #if !defined(NO_MD5) && !defined(NO_HMAC) 936 if (doit[D_HMAC]) 937 { 938 HMAC_CTX hctx; 939 HMAC_Init(&hctx,(unsigned char *)"This is a key...", 940 16,EVP_md5()); 941 942 for (j=0; j<SIZE_NUM; j++) 943 { 944 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]); 945 Time_F(START,usertime); 946 for (count=0,run=1; COND(c[D_HMAC][j]); count++) 947 { 948 HMAC_Init(&hctx,NULL,0,NULL); 949 HMAC_Update(&hctx,buf,lengths[j]); 950 HMAC_Final(&hctx,&(hmac[0]),NULL); 951 } 952 d=Time_F(STOP,usertime); 953 BIO_printf(bio_err,"%ld %s's in %.2fs\n", 954 count,names[D_HMAC],d); 955 results[D_HMAC][j]=((double)count)/d*lengths[j]; 956 } 957 } 958 #endif 959 #ifndef NO_SHA 960 if (doit[D_SHA1]) 961 { 962 for (j=0; j<SIZE_NUM; j++) 963 { 964 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]); 965 Time_F(START,usertime); 966 for (count=0,run=1; COND(c[D_SHA1][j]); count++) 967 SHA1(buf,(unsigned long)lengths[j],&(sha[0])); 968 d=Time_F(STOP,usertime); 969 BIO_printf(bio_err,"%ld %s's in %.2fs\n", 970 count,names[D_SHA1],d); 971 results[D_SHA1][j]=((double)count)/d*lengths[j]; 972 } 973 } 974 #endif 975 #ifndef NO_RIPEMD 976 if (doit[D_RMD160]) 977 { 978 for (j=0; j<SIZE_NUM; j++) 979 { 980 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]); 981 Time_F(START,usertime); 982 for (count=0,run=1; COND(c[D_RMD160][j]); count++) 983 RIPEMD160(buf,(unsigned long)lengths[j],&(rmd160[0])); 984 d=Time_F(STOP,usertime); 985 BIO_printf(bio_err,"%ld %s's in %.2fs\n", 986 count,names[D_RMD160],d); 987 results[D_RMD160][j]=((double)count)/d*lengths[j]; 988 } 989 } 990 #endif 991 #ifndef NO_RC4 992 if (doit[D_RC4]) 993 { 994 for (j=0; j<SIZE_NUM; j++) 995 { 996 print_message(names[D_RC4],c[D_RC4][j],lengths[j]); 997 Time_F(START,usertime); 998 for (count=0,run=1; COND(c[D_RC4][j]); count++) 999 RC4(&rc4_ks,(unsigned int)lengths[j], 1000 buf,buf); 1001 d=Time_F(STOP,usertime); 1002 BIO_printf(bio_err,"%ld %s's in %.2fs\n", 1003 count,names[D_RC4],d); 1004 results[D_RC4][j]=((double)count)/d*lengths[j]; 1005 } 1006 } 1007 #endif 1008 #ifndef NO_DES 1009 if (doit[D_CBC_DES]) 1010 { 1011 for (j=0; j<SIZE_NUM; j++) 1012 { 1013 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]); 1014 Time_F(START,usertime); 1015 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++) 1016 des_ncbc_encrypt(buf,buf,lengths[j],sch, 1017 &iv,DES_ENCRYPT); 1018 d=Time_F(STOP,usertime); 1019 BIO_printf(bio_err,"%ld %s's in %.2fs\n", 1020 count,names[D_CBC_DES],d); 1021 results[D_CBC_DES][j]=((double)count)/d*lengths[j]; 1022 } 1023 } 1024 1025 if (doit[D_EDE3_DES]) 1026 { 1027 for (j=0; j<SIZE_NUM; j++) 1028 { 1029 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]); 1030 Time_F(START,usertime); 1031 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++) 1032 des_ede3_cbc_encrypt(buf,buf,lengths[j], 1033 sch,sch2,sch3, 1034 &iv,DES_ENCRYPT); 1035 d=Time_F(STOP,usertime); 1036 BIO_printf(bio_err,"%ld %s's in %.2fs\n", 1037 count,names[D_EDE3_DES],d); 1038 results[D_EDE3_DES][j]=((double)count)/d*lengths[j]; 1039 } 1040 } 1041 #endif 1042 #ifndef NO_IDEA 1043 if (doit[D_CBC_IDEA]) 1044 { 1045 for (j=0; j<SIZE_NUM; j++) 1046 { 1047 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]); 1048 Time_F(START,usertime); 1049 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++) 1050 idea_cbc_encrypt(buf,buf, 1051 (unsigned long)lengths[j],&idea_ks, 1052 iv,IDEA_ENCRYPT); 1053 d=Time_F(STOP,usertime); 1054 BIO_printf(bio_err,"%ld %s's in %.2fs\n", 1055 count,names[D_CBC_IDEA],d); 1056 results[D_CBC_IDEA][j]=((double)count)/d*lengths[j]; 1057 } 1058 } 1059 #endif 1060 #ifndef NO_RC2 1061 if (doit[D_CBC_RC2]) 1062 { 1063 for (j=0; j<SIZE_NUM; j++) 1064 { 1065 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]); 1066 Time_F(START,usertime); 1067 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++) 1068 RC2_cbc_encrypt(buf,buf, 1069 (unsigned long)lengths[j],&rc2_ks, 1070 iv,RC2_ENCRYPT); 1071 d=Time_F(STOP,usertime); 1072 BIO_printf(bio_err,"%ld %s's in %.2fs\n", 1073 count,names[D_CBC_RC2],d); 1074 results[D_CBC_RC2][j]=((double)count)/d*lengths[j]; 1075 } 1076 } 1077 #endif 1078 #ifndef NO_RC5 1079 if (doit[D_CBC_RC5]) 1080 { 1081 for (j=0; j<SIZE_NUM; j++) 1082 { 1083 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]); 1084 Time_F(START,usertime); 1085 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++) 1086 RC5_32_cbc_encrypt(buf,buf, 1087 (unsigned long)lengths[j],&rc5_ks, 1088 iv,RC5_ENCRYPT); 1089 d=Time_F(STOP,usertime); 1090 BIO_printf(bio_err,"%ld %s's in %.2fs\n", 1091 count,names[D_CBC_RC5],d); 1092 results[D_CBC_RC5][j]=((double)count)/d*lengths[j]; 1093 } 1094 } 1095 #endif 1096 #ifndef NO_BF 1097 if (doit[D_CBC_BF]) 1098 { 1099 for (j=0; j<SIZE_NUM; j++) 1100 { 1101 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]); 1102 Time_F(START,usertime); 1103 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++) 1104 BF_cbc_encrypt(buf,buf, 1105 (unsigned long)lengths[j],&bf_ks, 1106 iv,BF_ENCRYPT); 1107 d=Time_F(STOP,usertime); 1108 BIO_printf(bio_err,"%ld %s's in %.2fs\n", 1109 count,names[D_CBC_BF],d); 1110 results[D_CBC_BF][j]=((double)count)/d*lengths[j]; 1111 } 1112 } 1113 #endif 1114 #ifndef NO_CAST 1115 if (doit[D_CBC_CAST]) 1116 { 1117 for (j=0; j<SIZE_NUM; j++) 1118 { 1119 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]); 1120 Time_F(START,usertime); 1121 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++) 1122 CAST_cbc_encrypt(buf,buf, 1123 (unsigned long)lengths[j],&cast_ks, 1124 iv,CAST_ENCRYPT); 1125 d=Time_F(STOP,usertime); 1126 BIO_printf(bio_err,"%ld %s's in %.2fs\n", 1127 count,names[D_CBC_CAST],d); 1128 results[D_CBC_CAST][j]=((double)count)/d*lengths[j]; 1129 } 1130 } 1131 #endif 1132 1133 RAND_pseudo_bytes(buf,36); 1134 #ifndef NO_RSA 1135 for (j=0; j<RSA_NUM; j++) 1136 { 1137 int ret; 1138 if (!rsa_doit[j]) continue; 1139 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]); 1140 if (ret == 0) 1141 { 1142 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n"); 1143 ERR_print_errors(bio_err); 1144 rsa_count=1; 1145 } 1146 else 1147 { 1148 pkey_print_message("private","rsa", 1149 rsa_c[j][0],rsa_bits[j], 1150 RSA_SECONDS); 1151 /* RSA_blinding_on(rsa_key[j],NULL); */ 1152 Time_F(START,usertime); 1153 for (count=0,run=1; COND(rsa_c[j][0]); count++) 1154 { 1155 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, 1156 &rsa_num, rsa_key[j]); 1157 if (ret == 0) 1158 { 1159 BIO_printf(bio_err, 1160 "RSA sign failure\n"); 1161 ERR_print_errors(bio_err); 1162 count=1; 1163 break; 1164 } 1165 } 1166 d=Time_F(STOP,usertime); 1167 BIO_printf(bio_err, 1168 "%ld %d bit private RSA's in %.2fs\n", 1169 count,rsa_bits[j],d); 1170 rsa_results[j][0]=d/(double)count; 1171 rsa_count=count; 1172 } 1173 1174 #if 1 1175 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]); 1176 if (ret <= 0) 1177 { 1178 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n"); 1179 ERR_print_errors(bio_err); 1180 rsa_doit[j] = 0; 1181 } 1182 else 1183 { 1184 pkey_print_message("public","rsa", 1185 rsa_c[j][1],rsa_bits[j], 1186 RSA_SECONDS); 1187 Time_F(START,usertime); 1188 for (count=0,run=1; COND(rsa_c[j][1]); count++) 1189 { 1190 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, 1191 rsa_num, rsa_key[j]); 1192 if (ret == 0) 1193 { 1194 BIO_printf(bio_err, 1195 "RSA verify failure\n"); 1196 ERR_print_errors(bio_err); 1197 count=1; 1198 break; 1199 } 1200 } 1201 d=Time_F(STOP,usertime); 1202 BIO_printf(bio_err, 1203 "%ld %d bit public RSA's in %.2fs\n", 1204 count,rsa_bits[j],d); 1205 rsa_results[j][1]=d/(double)count; 1206 } 1207 #endif 1208 1209 if (rsa_count <= 1) 1210 { 1211 /* if longer than 10s, don't do any more */ 1212 for (j++; j<RSA_NUM; j++) 1213 rsa_doit[j]=0; 1214 } 1215 } 1216 #endif 1217 1218 RAND_pseudo_bytes(buf,20); 1219 #ifndef NO_DSA 1220 if (RAND_status() != 1) 1221 { 1222 RAND_seed(rnd_seed, sizeof rnd_seed); 1223 rnd_fake = 1; 1224 } 1225 for (j=0; j<DSA_NUM; j++) 1226 { 1227 unsigned int kk; 1228 int ret; 1229 1230 if (!dsa_doit[j]) continue; 1231 DSA_generate_key(dsa_key[j]); 1232 /* DSA_sign_setup(dsa_key[j],NULL); */ 1233 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2, 1234 &kk,dsa_key[j]); 1235 if (ret == 0) 1236 { 1237 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n"); 1238 ERR_print_errors(bio_err); 1239 rsa_count=1; 1240 } 1241 else 1242 { 1243 pkey_print_message("sign","dsa", 1244 dsa_c[j][0],dsa_bits[j], 1245 DSA_SECONDS); 1246 Time_F(START,usertime); 1247 for (count=0,run=1; COND(dsa_c[j][0]); count++) 1248 { 1249 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2, 1250 &kk,dsa_key[j]); 1251 if (ret == 0) 1252 { 1253 BIO_printf(bio_err, 1254 "DSA sign failure\n"); 1255 ERR_print_errors(bio_err); 1256 count=1; 1257 break; 1258 } 1259 } 1260 d=Time_F(STOP,usertime); 1261 BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n", 1262 count,dsa_bits[j],d); 1263 dsa_results[j][0]=d/(double)count; 1264 rsa_count=count; 1265 } 1266 1267 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2, 1268 kk,dsa_key[j]); 1269 if (ret <= 0) 1270 { 1271 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n"); 1272 ERR_print_errors(bio_err); 1273 dsa_doit[j] = 0; 1274 } 1275 else 1276 { 1277 pkey_print_message("verify","dsa", 1278 dsa_c[j][1],dsa_bits[j], 1279 DSA_SECONDS); 1280 Time_F(START,usertime); 1281 for (count=0,run=1; COND(dsa_c[j][1]); count++) 1282 { 1283 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2, 1284 kk,dsa_key[j]); 1285 if (ret <= 0) 1286 { 1287 BIO_printf(bio_err, 1288 "DSA verify failure\n"); 1289 ERR_print_errors(bio_err); 1290 count=1; 1291 break; 1292 } 1293 } 1294 d=Time_F(STOP,usertime); 1295 BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n", 1296 count,dsa_bits[j],d); 1297 dsa_results[j][1]=d/(double)count; 1298 } 1299 1300 if (rsa_count <= 1) 1301 { 1302 /* if longer than 10s, don't do any more */ 1303 for (j++; j<DSA_NUM; j++) 1304 dsa_doit[j]=0; 1305 } 1306 } 1307 if (rnd_fake) RAND_cleanup(); 1308 #endif 1309 1310 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION)); 1311 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON)); 1312 printf("options:"); 1313 printf("%s ",BN_options()); 1314 #ifndef NO_MD2 1315 printf("%s ",MD2_options()); 1316 #endif 1317 #ifndef NO_RC4 1318 printf("%s ",RC4_options()); 1319 #endif 1320 #ifndef NO_DES 1321 printf("%s ",des_options()); 1322 #endif 1323 #ifndef NO_IDEA 1324 printf("%s ",idea_options()); 1325 #endif 1326 #ifndef NO_BF 1327 printf("%s ",BF_options()); 1328 #endif 1329 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS)); 1330 1331 if (pr_header) 1332 { 1333 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n"); 1334 fprintf(stdout,"type "); 1335 for (j=0; j<SIZE_NUM; j++) 1336 fprintf(stdout,"%7d bytes",lengths[j]); 1337 fprintf(stdout,"\n"); 1338 } 1339 1340 for (k=0; k<ALGOR_NUM; k++) 1341 { 1342 if (!doit[k]) continue; 1343 fprintf(stdout,"%-13s",names[k]); 1344 for (j=0; j<SIZE_NUM; j++) 1345 { 1346 if (results[k][j] > 10000) 1347 fprintf(stdout," %11.2fk",results[k][j]/1e3); 1348 else 1349 fprintf(stdout," %11.2f ",results[k][j]); 1350 } 1351 fprintf(stdout,"\n"); 1352 } 1353 #ifndef NO_RSA 1354 j=1; 1355 for (k=0; k<RSA_NUM; k++) 1356 { 1357 if (!rsa_doit[k]) continue; 1358 if (j) 1359 { 1360 printf("%18ssign verify sign/s verify/s\n"," "); 1361 j=0; 1362 } 1363 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f", 1364 rsa_bits[k],rsa_results[k][0],rsa_results[k][1], 1365 1.0/rsa_results[k][0],1.0/rsa_results[k][1]); 1366 fprintf(stdout,"\n"); 1367 } 1368 #endif 1369 #ifndef NO_DSA 1370 j=1; 1371 for (k=0; k<DSA_NUM; k++) 1372 { 1373 if (!dsa_doit[k]) continue; 1374 if (j) { 1375 printf("%18ssign verify sign/s verify/s\n"," "); 1376 j=0; 1377 } 1378 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f", 1379 dsa_bits[k],dsa_results[k][0],dsa_results[k][1], 1380 1.0/dsa_results[k][0],1.0/dsa_results[k][1]); 1381 fprintf(stdout,"\n"); 1382 } 1383 #endif 1384 mret=0; 1385 end: 1386 if (buf != NULL) OPENSSL_free(buf); 1387 if (buf2 != NULL) OPENSSL_free(buf2); 1388 #ifndef NO_RSA 1389 for (i=0; i<RSA_NUM; i++) 1390 if (rsa_key[i] != NULL) 1391 RSA_free(rsa_key[i]); 1392 #endif 1393 #ifndef NO_DSA 1394 for (i=0; i<DSA_NUM; i++) 1395 if (dsa_key[i] != NULL) 1396 DSA_free(dsa_key[i]); 1397 #endif 1398 EXIT(mret); 1399 } 1400 1401 static void print_message(char *s, long num, int length) 1402 { 1403 #ifdef SIGALRM 1404 BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length); 1405 (void)BIO_flush(bio_err); 1406 alarm(SECONDS); 1407 #else 1408 BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length); 1409 (void)BIO_flush(bio_err); 1410 #endif 1411 #ifdef LINT 1412 num=num; 1413 #endif 1414 } 1415 1416 static void pkey_print_message(char *str, char *str2, long num, int bits, 1417 int tm) 1418 { 1419 #ifdef SIGALRM 1420 BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm); 1421 (void)BIO_flush(bio_err); 1422 alarm(RSA_SECONDS); 1423 #else 1424 BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2); 1425 (void)BIO_flush(bio_err); 1426 #endif 1427 #ifdef LINT 1428 num=num; 1429 #endif 1430 } 1431 1432