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 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. 60 * 61 * Portions of the attached software ("Contribution") are developed by 62 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. 63 * 64 * The Contribution is licensed pursuant to the OpenSSL open source 65 * license provided above. 66 * 67 * The ECDH and ECDSA speed test software is originally written by 68 * Sumit Gupta of Sun Microsystems Laboratories. 69 * 70 */ 71 72 /* most of this code has been pilfered from my libdes speed.c program */ 73 74 #ifndef OPENSSL_NO_SPEED 75 76 #undef SECONDS 77 #define SECONDS 3 78 #define RSA_SECONDS 10 79 #define DSA_SECONDS 10 80 #define ECDSA_SECONDS 10 81 #define ECDH_SECONDS 10 82 83 /* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */ 84 /* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */ 85 86 #undef PROG 87 #define PROG speed_main 88 89 #include <stdio.h> 90 #include <stdlib.h> 91 92 #include <string.h> 93 #include <math.h> 94 #include "apps.h" 95 #ifdef OPENSSL_NO_STDIO 96 #define APPS_WIN16 97 #endif 98 #include <openssl/crypto.h> 99 #include <openssl/rand.h> 100 #include <openssl/err.h> 101 #include <openssl/evp.h> 102 #include <openssl/objects.h> 103 #if !defined(OPENSSL_SYS_MSDOS) 104 #include OPENSSL_UNISTD 105 #endif 106 107 #ifndef OPENSSL_SYS_NETWARE 108 #include <signal.h> 109 #endif 110 111 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX) 112 # define USE_TOD 113 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC)) 114 # define TIMES 115 #endif 116 #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 */ 117 # define TIMEB 118 #endif 119 120 #if defined(OPENSSL_SYS_NETWARE) 121 #undef TIMES 122 #undef TIMEB 123 #include <time.h> 124 #endif 125 126 #ifndef _IRIX 127 # include <time.h> 128 #endif 129 #ifdef TIMES 130 # include <sys/types.h> 131 # include <sys/times.h> 132 #endif 133 #ifdef USE_TOD 134 # include <sys/time.h> 135 # include <sys/resource.h> 136 #endif 137 138 /* Depending on the VMS version, the tms structure is perhaps defined. 139 The __TMS macro will show if it was. If it wasn't defined, we should 140 undefine TIMES, since that tells the rest of the program how things 141 should be handled. -- Richard Levitte */ 142 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS) 143 #undef TIMES 144 #endif 145 146 #ifdef TIMEB 147 #include <sys/timeb.h> 148 #endif 149 150 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS) && !defined(OPENSSL_SYS_NETWARE) 151 #error "It seems neither struct tms nor struct timeb is supported in this platform!" 152 #endif 153 154 #if defined(sun) || defined(__ultrix) 155 #define _POSIX_SOURCE 156 #include <limits.h> 157 #include <sys/param.h> 158 #endif 159 160 #include <openssl/bn.h> 161 #ifndef OPENSSL_NO_DES 162 #include <openssl/des.h> 163 #endif 164 #ifndef OPENSSL_NO_AES 165 #include <openssl/aes.h> 166 #endif 167 #ifndef OPENSSL_NO_CAMELLIA 168 #include <openssl/camellia.h> 169 #endif 170 #ifndef OPENSSL_NO_MD2 171 #include <openssl/md2.h> 172 #endif 173 #ifndef OPENSSL_NO_MDC2 174 #include <openssl/mdc2.h> 175 #endif 176 #ifndef OPENSSL_NO_MD4 177 #include <openssl/md4.h> 178 #endif 179 #ifndef OPENSSL_NO_MD5 180 #include <openssl/md5.h> 181 #endif 182 #ifndef OPENSSL_NO_HMAC 183 #include <openssl/hmac.h> 184 #endif 185 #include <openssl/evp.h> 186 #ifndef OPENSSL_NO_SHA 187 #include <openssl/sha.h> 188 #endif 189 #ifndef OPENSSL_NO_RIPEMD 190 #include <openssl/ripemd.h> 191 #endif 192 #ifndef OPENSSL_NO_RC4 193 #include <openssl/rc4.h> 194 #endif 195 #ifndef OPENSSL_NO_RC5 196 #include <openssl/rc5.h> 197 #endif 198 #ifndef OPENSSL_NO_RC2 199 #include <openssl/rc2.h> 200 #endif 201 #ifndef OPENSSL_NO_IDEA 202 #include <openssl/idea.h> 203 #endif 204 #ifndef OPENSSL_NO_SEED 205 #include <openssl/seed.h> 206 #endif 207 #ifndef OPENSSL_NO_BF 208 #include <openssl/blowfish.h> 209 #endif 210 #ifndef OPENSSL_NO_CAST 211 #include <openssl/cast.h> 212 #endif 213 #ifndef OPENSSL_NO_RSA 214 #include <openssl/rsa.h> 215 #include "./testrsa.h" 216 #endif 217 #include <openssl/x509.h> 218 #ifndef OPENSSL_NO_DSA 219 #include <openssl/dsa.h> 220 #include "./testdsa.h" 221 #endif 222 #ifndef OPENSSL_NO_ECDSA 223 #include <openssl/ecdsa.h> 224 #endif 225 #ifndef OPENSSL_NO_ECDH 226 #include <openssl/ecdh.h> 227 #endif 228 229 /* 230 * The following "HZ" timing stuff should be sync'd up with the code in 231 * crypto/tmdiff.[ch]. That appears to try to do the same job, though I think 232 * this code is more up to date than libcrypto's so there may be features to 233 * migrate over first. This is used in two places further down AFAICS. 234 * The point is that nothing in openssl actually *uses* that tmdiff stuff, so 235 * either speed.c should be using it or it should go because it's obviously not 236 * useful enough. Anyone want to do a janitorial job on this? 237 */ 238 239 /* The following if from times(3) man page. It may need to be changed */ 240 #ifndef HZ 241 # if defined(_SC_CLK_TCK) \ 242 && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000) 243 # define HZ sysconf(_SC_CLK_TCK) 244 # else 245 # ifndef CLK_TCK 246 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */ 247 # define HZ 100.0 248 # else /* _BSD_CLK_TCK_ */ 249 # define HZ ((double)_BSD_CLK_TCK_) 250 # endif 251 # else /* CLK_TCK */ 252 # define HZ ((double)CLK_TCK) 253 # endif 254 # endif 255 #endif 256 257 #ifndef HAVE_FORK 258 # if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_NETWARE) 259 # define HAVE_FORK 0 260 # else 261 # define HAVE_FORK 1 262 # endif 263 #endif 264 265 #if HAVE_FORK 266 # undef NO_FORK 267 #else 268 # define NO_FORK 269 #endif 270 271 #undef BUFSIZE 272 #define BUFSIZE ((long)1024*8+1) 273 int run=0; 274 275 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0; 276 static int mr=0; 277 static int usertime=1; 278 279 static double Time_F(int s); 280 static void print_message(const char *s,long num,int length); 281 static void pkey_print_message(const char *str, const char *str2, 282 long num, int bits, int sec); 283 static void print_result(int alg,int run_no,int count,double time_used); 284 #ifndef NO_FORK 285 static int do_multi(int multi); 286 #endif 287 288 #define ALGOR_NUM 28 289 #define SIZE_NUM 5 290 #define RSA_NUM 4 291 #define DSA_NUM 3 292 293 #define EC_NUM 16 294 #define MAX_ECDH_SIZE 256 295 296 static const char *names[ALGOR_NUM]={ 297 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4", 298 "des cbc","des ede3","idea cbc","seed cbc", 299 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc", 300 "aes-128 cbc","aes-192 cbc","aes-256 cbc", 301 "camellia-128 cbc","camellia-192 cbc","camellia-256 cbc", 302 "evp","sha256","sha512", 303 "aes-128 ige","aes-192 ige","aes-256 ige"}; 304 static double results[ALGOR_NUM][SIZE_NUM]; 305 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024}; 306 #ifndef OPENSSL_NO_RSA 307 static double rsa_results[RSA_NUM][2]; 308 #endif 309 #ifndef OPENSSL_NO_DSA 310 static double dsa_results[DSA_NUM][2]; 311 #endif 312 #ifndef OPENSSL_NO_ECDSA 313 static double ecdsa_results[EC_NUM][2]; 314 #endif 315 #ifndef OPENSSL_NO_ECDH 316 static double ecdh_results[EC_NUM][1]; 317 #endif 318 319 #if defined(OPENSSL_NO_DSA) && !(defined(OPENSSL_NO_ECDSA) && defined(OPENSSL_NO_ECDH)) 320 static const char rnd_seed[] = "string to make the random number generator think it has entropy"; 321 static int rnd_fake = 0; 322 #endif 323 324 #ifdef SIGALRM 325 #if defined(__STDC__) || defined(sgi) || defined(_AIX) 326 #define SIGRETTYPE void 327 #else 328 #define SIGRETTYPE int 329 #endif 330 331 static SIGRETTYPE sig_done(int sig); 332 static SIGRETTYPE sig_done(int sig) 333 { 334 signal(SIGALRM,sig_done); 335 run=0; 336 #ifdef LINT 337 sig=sig; 338 #endif 339 } 340 #endif 341 342 #define START 0 343 #define STOP 1 344 345 #if defined(OPENSSL_SYS_NETWARE) 346 347 /* for NetWare the best we can do is use clock() which returns the 348 * time, in hundredths of a second, since the NLM began executing 349 */ 350 static double Time_F(int s) 351 { 352 double ret; 353 354 static clock_t tstart,tend; 355 356 if (s == START) 357 { 358 tstart=clock(); 359 return(0); 360 } 361 else 362 { 363 tend=clock(); 364 ret=(double)((double)(tend)-(double)(tstart)); 365 return((ret < 0.001)?0.001:ret); 366 } 367 } 368 369 #else 370 371 static double Time_F(int s) 372 { 373 double ret; 374 375 #ifdef USE_TOD 376 if(usertime) 377 { 378 static struct rusage tstart,tend; 379 380 getrusage_used = 1; 381 if (s == START) 382 { 383 getrusage(RUSAGE_SELF,&tstart); 384 return(0); 385 } 386 else 387 { 388 long i; 389 390 getrusage(RUSAGE_SELF,&tend); 391 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec; 392 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec)) 393 +((double)i)/1000000.0; 394 return((ret < 0.001)?0.001:ret); 395 } 396 } 397 else 398 { 399 static struct timeval tstart,tend; 400 long i; 401 402 gettimeofday_used = 1; 403 if (s == START) 404 { 405 gettimeofday(&tstart,NULL); 406 return(0); 407 } 408 else 409 { 410 gettimeofday(&tend,NULL); 411 i=(long)tend.tv_usec-(long)tstart.tv_usec; 412 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0; 413 return((ret < 0.001)?0.001:ret); 414 } 415 } 416 #else /* ndef USE_TOD */ 417 418 # ifdef TIMES 419 if (usertime) 420 { 421 static struct tms tstart,tend; 422 423 times_used = 1; 424 if (s == START) 425 { 426 times(&tstart); 427 return(0); 428 } 429 else 430 { 431 times(&tend); 432 ret = HZ; 433 ret=(double)(tend.tms_utime-tstart.tms_utime) / ret; 434 return((ret < 1e-3)?1e-3:ret); 435 } 436 } 437 # endif /* times() */ 438 # if defined(TIMES) && defined(TIMEB) 439 else 440 # endif 441 # ifdef OPENSSL_SYS_VXWORKS 442 { 443 static unsigned long tick_start, tick_end; 444 445 if( s == START ) 446 { 447 tick_start = tickGet(); 448 return 0; 449 } 450 else 451 { 452 tick_end = tickGet(); 453 ret = (double)(tick_end - tick_start) / (double)sysClkRateGet(); 454 return((ret < 0.001)?0.001:ret); 455 } 456 } 457 # elif defined(TIMEB) 458 { 459 static struct timeb tstart,tend; 460 long i; 461 462 ftime_used = 1; 463 if (s == START) 464 { 465 ftime(&tstart); 466 return(0); 467 } 468 else 469 { 470 ftime(&tend); 471 i=(long)tend.millitm-(long)tstart.millitm; 472 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0; 473 return((ret < 0.001)?0.001:ret); 474 } 475 } 476 # endif 477 #endif 478 } 479 #endif /* if defined(OPENSSL_SYS_NETWARE) */ 480 481 482 #ifndef OPENSSL_NO_ECDH 483 static const int KDF1_SHA1_len = 20; 484 static void *KDF1_SHA1(const void *in, size_t inlen, void *out, size_t *outlen) 485 { 486 #ifndef OPENSSL_NO_SHA 487 if (*outlen < SHA_DIGEST_LENGTH) 488 return NULL; 489 else 490 *outlen = SHA_DIGEST_LENGTH; 491 return SHA1(in, inlen, out); 492 #else 493 return NULL; 494 #endif /* OPENSSL_NO_SHA */ 495 } 496 #endif /* OPENSSL_NO_ECDH */ 497 498 499 int MAIN(int, char **); 500 501 int MAIN(int argc, char **argv) 502 { 503 unsigned char *buf=NULL,*buf2=NULL; 504 int mret=1; 505 long count=0,save_count=0; 506 int i,j,k; 507 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) 508 long rsa_count; 509 #endif 510 #ifndef OPENSSL_NO_RSA 511 unsigned rsa_num; 512 #endif 513 unsigned char md[EVP_MAX_MD_SIZE]; 514 #ifndef OPENSSL_NO_MD2 515 unsigned char md2[MD2_DIGEST_LENGTH]; 516 #endif 517 #ifndef OPENSSL_NO_MDC2 518 unsigned char mdc2[MDC2_DIGEST_LENGTH]; 519 #endif 520 #ifndef OPENSSL_NO_MD4 521 unsigned char md4[MD4_DIGEST_LENGTH]; 522 #endif 523 #ifndef OPENSSL_NO_MD5 524 unsigned char md5[MD5_DIGEST_LENGTH]; 525 unsigned char hmac[MD5_DIGEST_LENGTH]; 526 #endif 527 #ifndef OPENSSL_NO_SHA 528 unsigned char sha[SHA_DIGEST_LENGTH]; 529 #ifndef OPENSSL_NO_SHA256 530 unsigned char sha256[SHA256_DIGEST_LENGTH]; 531 #endif 532 #ifndef OPENSSL_NO_SHA512 533 unsigned char sha512[SHA512_DIGEST_LENGTH]; 534 #endif 535 #endif 536 #ifndef OPENSSL_NO_RIPEMD 537 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH]; 538 #endif 539 #ifndef OPENSSL_NO_RC4 540 RC4_KEY rc4_ks; 541 #endif 542 #ifndef OPENSSL_NO_RC5 543 RC5_32_KEY rc5_ks; 544 #endif 545 #ifndef OPENSSL_NO_RC2 546 RC2_KEY rc2_ks; 547 #endif 548 #ifndef OPENSSL_NO_IDEA 549 IDEA_KEY_SCHEDULE idea_ks; 550 #endif 551 #ifndef OPENSSL_NO_SEED 552 SEED_KEY_SCHEDULE seed_ks; 553 #endif 554 #ifndef OPENSSL_NO_BF 555 BF_KEY bf_ks; 556 #endif 557 #ifndef OPENSSL_NO_CAST 558 CAST_KEY cast_ks; 559 #endif 560 static const unsigned char key16[16]= 561 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0, 562 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12}; 563 #ifndef OPENSSL_NO_AES 564 static const unsigned char key24[24]= 565 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0, 566 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12, 567 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34}; 568 static const unsigned char key32[32]= 569 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0, 570 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12, 571 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34, 572 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56}; 573 #endif 574 #ifndef OPENSSL_NO_CAMELLIA 575 static const unsigned char ckey24[24]= 576 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0, 577 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12, 578 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34}; 579 static const unsigned char ckey32[32]= 580 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0, 581 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12, 582 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34, 583 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56}; 584 #endif 585 #ifndef OPENSSL_NO_AES 586 #define MAX_BLOCK_SIZE 128 587 #else 588 #define MAX_BLOCK_SIZE 64 589 #endif 590 unsigned char DES_iv[8]; 591 unsigned char iv[2*MAX_BLOCK_SIZE/8]; 592 #ifndef OPENSSL_NO_DES 593 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}; 594 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12}; 595 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34}; 596 DES_key_schedule sch; 597 DES_key_schedule sch2; 598 DES_key_schedule sch3; 599 #endif 600 #ifndef OPENSSL_NO_AES 601 AES_KEY aes_ks1, aes_ks2, aes_ks3; 602 #endif 603 #ifndef OPENSSL_NO_CAMELLIA 604 CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3; 605 #endif 606 #define D_MD2 0 607 #define D_MDC2 1 608 #define D_MD4 2 609 #define D_MD5 3 610 #define D_HMAC 4 611 #define D_SHA1 5 612 #define D_RMD160 6 613 #define D_RC4 7 614 #define D_CBC_DES 8 615 #define D_EDE3_DES 9 616 #define D_CBC_IDEA 10 617 #define D_CBC_SEED 11 618 #define D_CBC_RC2 12 619 #define D_CBC_RC5 13 620 #define D_CBC_BF 14 621 #define D_CBC_CAST 15 622 #define D_CBC_128_AES 16 623 #define D_CBC_192_AES 17 624 #define D_CBC_256_AES 18 625 #define D_CBC_128_CML 19 626 #define D_CBC_192_CML 20 627 #define D_CBC_256_CML 21 628 #define D_EVP 22 629 #define D_SHA256 23 630 #define D_SHA512 24 631 #define D_IGE_128_AES 25 632 #define D_IGE_192_AES 26 633 #define D_IGE_256_AES 27 634 double d=0.0; 635 long c[ALGOR_NUM][SIZE_NUM]; 636 #define R_DSA_512 0 637 #define R_DSA_1024 1 638 #define R_DSA_2048 2 639 #define R_RSA_512 0 640 #define R_RSA_1024 1 641 #define R_RSA_2048 2 642 #define R_RSA_4096 3 643 644 #define R_EC_P160 0 645 #define R_EC_P192 1 646 #define R_EC_P224 2 647 #define R_EC_P256 3 648 #define R_EC_P384 4 649 #define R_EC_P521 5 650 #define R_EC_K163 6 651 #define R_EC_K233 7 652 #define R_EC_K283 8 653 #define R_EC_K409 9 654 #define R_EC_K571 10 655 #define R_EC_B163 11 656 #define R_EC_B233 12 657 #define R_EC_B283 13 658 #define R_EC_B409 14 659 #define R_EC_B571 15 660 661 #ifndef OPENSSL_NO_RSA 662 RSA *rsa_key[RSA_NUM]; 663 long rsa_c[RSA_NUM][2]; 664 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096}; 665 static unsigned char *rsa_data[RSA_NUM]= 666 {test512,test1024,test2048,test4096}; 667 static int rsa_data_length[RSA_NUM]={ 668 sizeof(test512),sizeof(test1024), 669 sizeof(test2048),sizeof(test4096)}; 670 #endif 671 #ifndef OPENSSL_NO_DSA 672 DSA *dsa_key[DSA_NUM]; 673 long dsa_c[DSA_NUM][2]; 674 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048}; 675 #endif 676 #ifndef OPENSSL_NO_EC 677 /* We only test over the following curves as they are representative, 678 * To add tests over more curves, simply add the curve NID 679 * and curve name to the following arrays and increase the 680 * EC_NUM value accordingly. 681 */ 682 static unsigned int test_curves[EC_NUM] = 683 { 684 /* Prime Curves */ 685 NID_secp160r1, 686 NID_X9_62_prime192v1, 687 NID_secp224r1, 688 NID_X9_62_prime256v1, 689 NID_secp384r1, 690 NID_secp521r1, 691 /* Binary Curves */ 692 NID_sect163k1, 693 NID_sect233k1, 694 NID_sect283k1, 695 NID_sect409k1, 696 NID_sect571k1, 697 NID_sect163r2, 698 NID_sect233r1, 699 NID_sect283r1, 700 NID_sect409r1, 701 NID_sect571r1 702 }; 703 static const char * test_curves_names[EC_NUM] = 704 { 705 /* Prime Curves */ 706 "secp160r1", 707 "nistp192", 708 "nistp224", 709 "nistp256", 710 "nistp384", 711 "nistp521", 712 /* Binary Curves */ 713 "nistk163", 714 "nistk233", 715 "nistk283", 716 "nistk409", 717 "nistk571", 718 "nistb163", 719 "nistb233", 720 "nistb283", 721 "nistb409", 722 "nistb571" 723 }; 724 static int test_curves_bits[EC_NUM] = 725 { 726 160, 192, 224, 256, 384, 521, 727 163, 233, 283, 409, 571, 728 163, 233, 283, 409, 571 729 }; 730 731 #endif 732 733 #ifndef OPENSSL_NO_ECDSA 734 unsigned char ecdsasig[256]; 735 unsigned int ecdsasiglen; 736 EC_KEY *ecdsa[EC_NUM]; 737 long ecdsa_c[EC_NUM][2]; 738 #endif 739 740 #ifndef OPENSSL_NO_ECDH 741 EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM]; 742 unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE]; 743 int secret_size_a, secret_size_b; 744 int ecdh_checks = 0; 745 int secret_idx = 0; 746 long ecdh_c[EC_NUM][2]; 747 #endif 748 749 int rsa_doit[RSA_NUM]; 750 int dsa_doit[DSA_NUM]; 751 #ifndef OPENSSL_NO_ECDSA 752 int ecdsa_doit[EC_NUM]; 753 #endif 754 #ifndef OPENSSL_NO_ECDH 755 int ecdh_doit[EC_NUM]; 756 #endif 757 int doit[ALGOR_NUM]; 758 int pr_header=0; 759 const EVP_CIPHER *evp_cipher=NULL; 760 const EVP_MD *evp_md=NULL; 761 int decrypt=0; 762 #ifndef NO_FORK 763 int multi=0; 764 #endif 765 766 #ifndef TIMES 767 usertime=-1; 768 #endif 769 770 apps_startup(); 771 memset(results, 0, sizeof(results)); 772 #ifndef OPENSSL_NO_DSA 773 memset(dsa_key,0,sizeof(dsa_key)); 774 #endif 775 #ifndef OPENSSL_NO_ECDSA 776 for (i=0; i<EC_NUM; i++) ecdsa[i] = NULL; 777 #endif 778 #ifndef OPENSSL_NO_ECDH 779 for (i=0; i<EC_NUM; i++) 780 { 781 ecdh_a[i] = NULL; 782 ecdh_b[i] = NULL; 783 } 784 #endif 785 786 787 if (bio_err == NULL) 788 if ((bio_err=BIO_new(BIO_s_file())) != NULL) 789 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); 790 791 if (!load_config(bio_err, NULL)) 792 goto end; 793 794 #ifndef OPENSSL_NO_RSA 795 memset(rsa_key,0,sizeof(rsa_key)); 796 for (i=0; i<RSA_NUM; i++) 797 rsa_key[i]=NULL; 798 #endif 799 800 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL) 801 { 802 BIO_printf(bio_err,"out of memory\n"); 803 goto end; 804 } 805 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL) 806 { 807 BIO_printf(bio_err,"out of memory\n"); 808 goto end; 809 } 810 811 memset(c,0,sizeof(c)); 812 memset(DES_iv,0,sizeof(DES_iv)); 813 memset(iv,0,sizeof(iv)); 814 815 for (i=0; i<ALGOR_NUM; i++) 816 doit[i]=0; 817 for (i=0; i<RSA_NUM; i++) 818 rsa_doit[i]=0; 819 for (i=0; i<DSA_NUM; i++) 820 dsa_doit[i]=0; 821 #ifndef OPENSSL_NO_ECDSA 822 for (i=0; i<EC_NUM; i++) 823 ecdsa_doit[i]=0; 824 #endif 825 #ifndef OPENSSL_NO_ECDH 826 for (i=0; i<EC_NUM; i++) 827 ecdh_doit[i]=0; 828 #endif 829 830 831 j=0; 832 argc--; 833 argv++; 834 while (argc) 835 { 836 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0)) 837 { 838 usertime = 0; 839 j--; /* Otherwise, -elapsed gets confused with 840 an algorithm. */ 841 } 842 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0)) 843 { 844 argc--; 845 argv++; 846 if(argc == 0) 847 { 848 BIO_printf(bio_err,"no EVP given\n"); 849 goto end; 850 } 851 evp_cipher=EVP_get_cipherbyname(*argv); 852 if(!evp_cipher) 853 { 854 evp_md=EVP_get_digestbyname(*argv); 855 } 856 if(!evp_cipher && !evp_md) 857 { 858 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv); 859 goto end; 860 } 861 doit[D_EVP]=1; 862 } 863 else if (argc > 0 && !strcmp(*argv,"-decrypt")) 864 { 865 decrypt=1; 866 j--; /* Otherwise, -elapsed gets confused with 867 an algorithm. */ 868 } 869 #ifndef OPENSSL_NO_ENGINE 870 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0)) 871 { 872 argc--; 873 argv++; 874 if(argc == 0) 875 { 876 BIO_printf(bio_err,"no engine given\n"); 877 goto end; 878 } 879 setup_engine(bio_err, *argv, 0); 880 /* j will be increased again further down. We just 881 don't want speed to confuse an engine with an 882 algorithm, especially when none is given (which 883 means all of them should be run) */ 884 j--; 885 } 886 #endif 887 #ifndef NO_FORK 888 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0)) 889 { 890 argc--; 891 argv++; 892 if(argc == 0) 893 { 894 BIO_printf(bio_err,"no multi count given\n"); 895 goto end; 896 } 897 multi=atoi(argv[0]); 898 if(multi <= 0) 899 { 900 BIO_printf(bio_err,"bad multi count\n"); 901 goto end; 902 } 903 j--; /* Otherwise, -mr gets confused with 904 an algorithm. */ 905 } 906 #endif 907 else if (argc > 0 && !strcmp(*argv,"-mr")) 908 { 909 mr=1; 910 j--; /* Otherwise, -mr gets confused with 911 an algorithm. */ 912 } 913 else 914 #ifndef OPENSSL_NO_MD2 915 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1; 916 else 917 #endif 918 #ifndef OPENSSL_NO_MDC2 919 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1; 920 else 921 #endif 922 #ifndef OPENSSL_NO_MD4 923 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1; 924 else 925 #endif 926 #ifndef OPENSSL_NO_MD5 927 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1; 928 else 929 #endif 930 #ifndef OPENSSL_NO_MD5 931 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1; 932 else 933 #endif 934 #ifndef OPENSSL_NO_SHA 935 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1; 936 else 937 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1, 938 doit[D_SHA256]=1, 939 doit[D_SHA512]=1; 940 else 941 #ifndef OPENSSL_NO_SHA256 942 if (strcmp(*argv,"sha256") == 0) doit[D_SHA256]=1; 943 else 944 #endif 945 #ifndef OPENSSL_NO_SHA512 946 if (strcmp(*argv,"sha512") == 0) doit[D_SHA512]=1; 947 else 948 #endif 949 #endif 950 #ifndef OPENSSL_NO_RIPEMD 951 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1; 952 else 953 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1; 954 else 955 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1; 956 else 957 #endif 958 #ifndef OPENSSL_NO_RC4 959 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1; 960 else 961 #endif 962 #ifndef OPENSSL_NO_DES 963 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1; 964 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1; 965 else 966 #endif 967 #ifndef OPENSSL_NO_AES 968 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1; 969 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1; 970 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1; 971 else if (strcmp(*argv,"aes-128-ige") == 0) doit[D_IGE_128_AES]=1; 972 else if (strcmp(*argv,"aes-192-ige") == 0) doit[D_IGE_192_AES]=1; 973 else if (strcmp(*argv,"aes-256-ige") == 0) doit[D_IGE_256_AES]=1; 974 else 975 #endif 976 #ifndef OPENSSL_NO_CAMELLIA 977 if (strcmp(*argv,"camellia-128-cbc") == 0) doit[D_CBC_128_CML]=1; 978 else if (strcmp(*argv,"camellia-192-cbc") == 0) doit[D_CBC_192_CML]=1; 979 else if (strcmp(*argv,"camellia-256-cbc") == 0) doit[D_CBC_256_CML]=1; 980 else 981 #endif 982 #ifndef OPENSSL_NO_RSA 983 #if 0 /* was: #ifdef RSAref */ 984 if (strcmp(*argv,"rsaref") == 0) 985 { 986 RSA_set_default_openssl_method(RSA_PKCS1_RSAref()); 987 j--; 988 } 989 else 990 #endif 991 #ifndef RSA_NULL 992 if (strcmp(*argv,"openssl") == 0) 993 { 994 RSA_set_default_method(RSA_PKCS1_SSLeay()); 995 j--; 996 } 997 else 998 #endif 999 #endif /* !OPENSSL_NO_RSA */ 1000 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2; 1001 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2; 1002 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2; 1003 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2; 1004 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2; 1005 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2; 1006 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2; 1007 else 1008 #ifndef OPENSSL_NO_RC2 1009 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1; 1010 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1; 1011 else 1012 #endif 1013 #ifndef OPENSSL_NO_RC5 1014 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1; 1015 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1; 1016 else 1017 #endif 1018 #ifndef OPENSSL_NO_IDEA 1019 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1; 1020 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1; 1021 else 1022 #endif 1023 #ifndef OPENSSL_NO_SEED 1024 if (strcmp(*argv,"seed-cbc") == 0) doit[D_CBC_SEED]=1; 1025 else if (strcmp(*argv,"seed") == 0) doit[D_CBC_SEED]=1; 1026 else 1027 #endif 1028 #ifndef OPENSSL_NO_BF 1029 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1; 1030 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1; 1031 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1; 1032 else 1033 #endif 1034 #ifndef OPENSSL_NO_CAST 1035 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1; 1036 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1; 1037 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1; 1038 else 1039 #endif 1040 #ifndef OPENSSL_NO_DES 1041 if (strcmp(*argv,"des") == 0) 1042 { 1043 doit[D_CBC_DES]=1; 1044 doit[D_EDE3_DES]=1; 1045 } 1046 else 1047 #endif 1048 #ifndef OPENSSL_NO_AES 1049 if (strcmp(*argv,"aes") == 0) 1050 { 1051 doit[D_CBC_128_AES]=1; 1052 doit[D_CBC_192_AES]=1; 1053 doit[D_CBC_256_AES]=1; 1054 } 1055 else 1056 #endif 1057 #ifndef OPENSSL_NO_CAMELLIA 1058 if (strcmp(*argv,"camellia") == 0) 1059 { 1060 doit[D_CBC_128_CML]=1; 1061 doit[D_CBC_192_CML]=1; 1062 doit[D_CBC_256_CML]=1; 1063 } 1064 else 1065 #endif 1066 #ifndef OPENSSL_NO_RSA 1067 if (strcmp(*argv,"rsa") == 0) 1068 { 1069 rsa_doit[R_RSA_512]=1; 1070 rsa_doit[R_RSA_1024]=1; 1071 rsa_doit[R_RSA_2048]=1; 1072 rsa_doit[R_RSA_4096]=1; 1073 } 1074 else 1075 #endif 1076 #ifndef OPENSSL_NO_DSA 1077 if (strcmp(*argv,"dsa") == 0) 1078 { 1079 dsa_doit[R_DSA_512]=1; 1080 dsa_doit[R_DSA_1024]=1; 1081 dsa_doit[R_DSA_2048]=1; 1082 } 1083 else 1084 #endif 1085 #ifndef OPENSSL_NO_ECDSA 1086 if (strcmp(*argv,"ecdsap160") == 0) ecdsa_doit[R_EC_P160]=2; 1087 else if (strcmp(*argv,"ecdsap192") == 0) ecdsa_doit[R_EC_P192]=2; 1088 else if (strcmp(*argv,"ecdsap224") == 0) ecdsa_doit[R_EC_P224]=2; 1089 else if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2; 1090 else if (strcmp(*argv,"ecdsap384") == 0) ecdsa_doit[R_EC_P384]=2; 1091 else if (strcmp(*argv,"ecdsap521") == 0) ecdsa_doit[R_EC_P521]=2; 1092 else if (strcmp(*argv,"ecdsak163") == 0) ecdsa_doit[R_EC_K163]=2; 1093 else if (strcmp(*argv,"ecdsak233") == 0) ecdsa_doit[R_EC_K233]=2; 1094 else if (strcmp(*argv,"ecdsak283") == 0) ecdsa_doit[R_EC_K283]=2; 1095 else if (strcmp(*argv,"ecdsak409") == 0) ecdsa_doit[R_EC_K409]=2; 1096 else if (strcmp(*argv,"ecdsak571") == 0) ecdsa_doit[R_EC_K571]=2; 1097 else if (strcmp(*argv,"ecdsab163") == 0) ecdsa_doit[R_EC_B163]=2; 1098 else if (strcmp(*argv,"ecdsab233") == 0) ecdsa_doit[R_EC_B233]=2; 1099 else if (strcmp(*argv,"ecdsab283") == 0) ecdsa_doit[R_EC_B283]=2; 1100 else if (strcmp(*argv,"ecdsab409") == 0) ecdsa_doit[R_EC_B409]=2; 1101 else if (strcmp(*argv,"ecdsab571") == 0) ecdsa_doit[R_EC_B571]=2; 1102 else if (strcmp(*argv,"ecdsa") == 0) 1103 { 1104 for (i=0; i < EC_NUM; i++) 1105 ecdsa_doit[i]=1; 1106 } 1107 else 1108 #endif 1109 #ifndef OPENSSL_NO_ECDH 1110 if (strcmp(*argv,"ecdhp160") == 0) ecdh_doit[R_EC_P160]=2; 1111 else if (strcmp(*argv,"ecdhp192") == 0) ecdh_doit[R_EC_P192]=2; 1112 else if (strcmp(*argv,"ecdhp224") == 0) ecdh_doit[R_EC_P224]=2; 1113 else if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2; 1114 else if (strcmp(*argv,"ecdhp384") == 0) ecdh_doit[R_EC_P384]=2; 1115 else if (strcmp(*argv,"ecdhp521") == 0) ecdh_doit[R_EC_P521]=2; 1116 else if (strcmp(*argv,"ecdhk163") == 0) ecdh_doit[R_EC_K163]=2; 1117 else if (strcmp(*argv,"ecdhk233") == 0) ecdh_doit[R_EC_K233]=2; 1118 else if (strcmp(*argv,"ecdhk283") == 0) ecdh_doit[R_EC_K283]=2; 1119 else if (strcmp(*argv,"ecdhk409") == 0) ecdh_doit[R_EC_K409]=2; 1120 else if (strcmp(*argv,"ecdhk571") == 0) ecdh_doit[R_EC_K571]=2; 1121 else if (strcmp(*argv,"ecdhb163") == 0) ecdh_doit[R_EC_B163]=2; 1122 else if (strcmp(*argv,"ecdhb233") == 0) ecdh_doit[R_EC_B233]=2; 1123 else if (strcmp(*argv,"ecdhb283") == 0) ecdh_doit[R_EC_B283]=2; 1124 else if (strcmp(*argv,"ecdhb409") == 0) ecdh_doit[R_EC_B409]=2; 1125 else if (strcmp(*argv,"ecdhb571") == 0) ecdh_doit[R_EC_B571]=2; 1126 else if (strcmp(*argv,"ecdh") == 0) 1127 { 1128 for (i=0; i < EC_NUM; i++) 1129 ecdh_doit[i]=1; 1130 } 1131 else 1132 #endif 1133 { 1134 BIO_printf(bio_err,"Error: bad option or value\n"); 1135 BIO_printf(bio_err,"\n"); 1136 BIO_printf(bio_err,"Available values:\n"); 1137 #ifndef OPENSSL_NO_MD2 1138 BIO_printf(bio_err,"md2 "); 1139 #endif 1140 #ifndef OPENSSL_NO_MDC2 1141 BIO_printf(bio_err,"mdc2 "); 1142 #endif 1143 #ifndef OPENSSL_NO_MD4 1144 BIO_printf(bio_err,"md4 "); 1145 #endif 1146 #ifndef OPENSSL_NO_MD5 1147 BIO_printf(bio_err,"md5 "); 1148 #ifndef OPENSSL_NO_HMAC 1149 BIO_printf(bio_err,"hmac "); 1150 #endif 1151 #endif 1152 #ifndef OPENSSL_NO_SHA1 1153 BIO_printf(bio_err,"sha1 "); 1154 #endif 1155 #ifndef OPENSSL_NO_SHA256 1156 BIO_printf(bio_err,"sha256 "); 1157 #endif 1158 #ifndef OPENSSL_NO_SHA512 1159 BIO_printf(bio_err,"sha512 "); 1160 #endif 1161 #ifndef OPENSSL_NO_RIPEMD160 1162 BIO_printf(bio_err,"rmd160"); 1163 #endif 1164 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \ 1165 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \ 1166 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160) 1167 BIO_printf(bio_err,"\n"); 1168 #endif 1169 1170 #ifndef OPENSSL_NO_IDEA 1171 BIO_printf(bio_err,"idea-cbc "); 1172 #endif 1173 #ifndef OPENSSL_NO_SEED 1174 BIO_printf(bio_err,"seed-cbc "); 1175 #endif 1176 #ifndef OPENSSL_NO_RC2 1177 BIO_printf(bio_err,"rc2-cbc "); 1178 #endif 1179 #ifndef OPENSSL_NO_RC5 1180 BIO_printf(bio_err,"rc5-cbc "); 1181 #endif 1182 #ifndef OPENSSL_NO_BF 1183 BIO_printf(bio_err,"bf-cbc"); 1184 #endif 1185 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_SEED) || !defined(OPENSSL_NO_RC2) || \ 1186 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5) 1187 BIO_printf(bio_err,"\n"); 1188 #endif 1189 #ifndef OPENSSL_NO_DES 1190 BIO_printf(bio_err,"des-cbc des-ede3 "); 1191 #endif 1192 #ifndef OPENSSL_NO_AES 1193 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc "); 1194 BIO_printf(bio_err,"aes-128-ige aes-192-ige aes-256-ige "); 1195 #endif 1196 #ifndef OPENSSL_NO_CAMELLIA 1197 BIO_printf(bio_err,"\n"); 1198 BIO_printf(bio_err,"camellia-128-cbc camellia-192-cbc camellia-256-cbc "); 1199 #endif 1200 #ifndef OPENSSL_NO_RC4 1201 BIO_printf(bio_err,"rc4"); 1202 #endif 1203 BIO_printf(bio_err,"\n"); 1204 1205 #ifndef OPENSSL_NO_RSA 1206 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n"); 1207 #endif 1208 1209 #ifndef OPENSSL_NO_DSA 1210 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n"); 1211 #endif 1212 #ifndef OPENSSL_NO_ECDSA 1213 BIO_printf(bio_err,"ecdsap160 ecdsap192 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n"); 1214 BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n"); 1215 BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n"); 1216 BIO_printf(bio_err,"ecdsa\n"); 1217 #endif 1218 #ifndef OPENSSL_NO_ECDH 1219 BIO_printf(bio_err,"ecdhp160 ecdhp192 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n"); 1220 BIO_printf(bio_err,"ecdhk163 ecdhk233 ecdhk283 ecdhk409 ecdhk571\n"); 1221 BIO_printf(bio_err,"ecdhb163 ecdhb233 ecdhb283 ecdhb409 ecdhb571\n"); 1222 BIO_printf(bio_err,"ecdh\n"); 1223 #endif 1224 1225 #ifndef OPENSSL_NO_IDEA 1226 BIO_printf(bio_err,"idea "); 1227 #endif 1228 #ifndef OPENSSL_NO_SEED 1229 BIO_printf(bio_err,"seed "); 1230 #endif 1231 #ifndef OPENSSL_NO_RC2 1232 BIO_printf(bio_err,"rc2 "); 1233 #endif 1234 #ifndef OPENSSL_NO_DES 1235 BIO_printf(bio_err,"des "); 1236 #endif 1237 #ifndef OPENSSL_NO_AES 1238 BIO_printf(bio_err,"aes "); 1239 #endif 1240 #ifndef OPENSSL_NO_CAMELLIA 1241 BIO_printf(bio_err,"camellia "); 1242 #endif 1243 #ifndef OPENSSL_NO_RSA 1244 BIO_printf(bio_err,"rsa "); 1245 #endif 1246 #ifndef OPENSSL_NO_BF 1247 BIO_printf(bio_err,"blowfish"); 1248 #endif 1249 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_SEED) || \ 1250 !defined(OPENSSL_NO_RC2) || !defined(OPENSSL_NO_DES) || \ 1251 !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_BF) || \ 1252 !defined(OPENSSL_NO_AES) || !defined(OPENSSL_NO_CAMELLIA) 1253 BIO_printf(bio_err,"\n"); 1254 #endif 1255 1256 BIO_printf(bio_err,"\n"); 1257 BIO_printf(bio_err,"Available options:\n"); 1258 #if defined(TIMES) || defined(USE_TOD) 1259 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n"); 1260 #endif 1261 #ifndef OPENSSL_NO_ENGINE 1262 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n"); 1263 #endif 1264 BIO_printf(bio_err,"-evp e use EVP e.\n"); 1265 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n"); 1266 BIO_printf(bio_err,"-mr produce machine readable output.\n"); 1267 #ifndef NO_FORK 1268 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n"); 1269 #endif 1270 goto end; 1271 } 1272 argc--; 1273 argv++; 1274 j++; 1275 } 1276 1277 #ifndef NO_FORK 1278 if(multi && do_multi(multi)) 1279 goto show_res; 1280 #endif 1281 1282 if (j == 0) 1283 { 1284 for (i=0; i<ALGOR_NUM; i++) 1285 { 1286 if (i != D_EVP) 1287 doit[i]=1; 1288 } 1289 for (i=0; i<RSA_NUM; i++) 1290 rsa_doit[i]=1; 1291 for (i=0; i<DSA_NUM; i++) 1292 dsa_doit[i]=1; 1293 } 1294 for (i=0; i<ALGOR_NUM; i++) 1295 if (doit[i]) pr_header++; 1296 1297 if (usertime == 0 && !mr) 1298 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n"); 1299 if (usertime <= 0 && !mr) 1300 { 1301 BIO_printf(bio_err,"To get the most accurate results, try to run this\n"); 1302 BIO_printf(bio_err,"program when this computer is idle.\n"); 1303 } 1304 1305 #ifndef OPENSSL_NO_RSA 1306 for (i=0; i<RSA_NUM; i++) 1307 { 1308 const unsigned char *p; 1309 1310 p=rsa_data[i]; 1311 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]); 1312 if (rsa_key[i] == NULL) 1313 { 1314 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i); 1315 goto end; 1316 } 1317 #if 0 1318 else 1319 { 1320 BIO_printf(bio_err,mr ? "+RK:%d:" 1321 : "Loaded RSA key, %d bit modulus and e= 0x", 1322 BN_num_bits(rsa_key[i]->n)); 1323 BN_print(bio_err,rsa_key[i]->e); 1324 BIO_printf(bio_err,"\n"); 1325 } 1326 #endif 1327 } 1328 #endif 1329 1330 #ifndef OPENSSL_NO_DSA 1331 dsa_key[0]=get_dsa512(); 1332 dsa_key[1]=get_dsa1024(); 1333 dsa_key[2]=get_dsa2048(); 1334 #endif 1335 1336 #ifndef OPENSSL_NO_DES 1337 DES_set_key_unchecked(&key,&sch); 1338 DES_set_key_unchecked(&key2,&sch2); 1339 DES_set_key_unchecked(&key3,&sch3); 1340 #endif 1341 #ifndef OPENSSL_NO_AES 1342 AES_set_encrypt_key(key16,128,&aes_ks1); 1343 AES_set_encrypt_key(key24,192,&aes_ks2); 1344 AES_set_encrypt_key(key32,256,&aes_ks3); 1345 #endif 1346 #ifndef OPENSSL_NO_CAMELLIA 1347 Camellia_set_key(key16,128,&camellia_ks1); 1348 Camellia_set_key(ckey24,192,&camellia_ks2); 1349 Camellia_set_key(ckey32,256,&camellia_ks3); 1350 #endif 1351 #ifndef OPENSSL_NO_IDEA 1352 idea_set_encrypt_key(key16,&idea_ks); 1353 #endif 1354 #ifndef OPENSSL_NO_SEED 1355 SEED_set_key(key16,&seed_ks); 1356 #endif 1357 #ifndef OPENSSL_NO_RC4 1358 RC4_set_key(&rc4_ks,16,key16); 1359 #endif 1360 #ifndef OPENSSL_NO_RC2 1361 RC2_set_key(&rc2_ks,16,key16,128); 1362 #endif 1363 #ifndef OPENSSL_NO_RC5 1364 RC5_32_set_key(&rc5_ks,16,key16,12); 1365 #endif 1366 #ifndef OPENSSL_NO_BF 1367 BF_set_key(&bf_ks,16,key16); 1368 #endif 1369 #ifndef OPENSSL_NO_CAST 1370 CAST_set_key(&cast_ks,16,key16); 1371 #endif 1372 #ifndef OPENSSL_NO_RSA 1373 memset(rsa_c,0,sizeof(rsa_c)); 1374 #endif 1375 #ifndef SIGALRM 1376 #ifndef OPENSSL_NO_DES 1377 BIO_printf(bio_err,"First we calculate the approximate speed ...\n"); 1378 count=10; 1379 do { 1380 long it; 1381 count*=2; 1382 Time_F(START); 1383 for (it=count; it; it--) 1384 DES_ecb_encrypt((DES_cblock *)buf, 1385 (DES_cblock *)buf, 1386 &sch,DES_ENCRYPT); 1387 d=Time_F(STOP); 1388 } while (d <3); 1389 save_count=count; 1390 c[D_MD2][0]=count/10; 1391 c[D_MDC2][0]=count/10; 1392 c[D_MD4][0]=count; 1393 c[D_MD5][0]=count; 1394 c[D_HMAC][0]=count; 1395 c[D_SHA1][0]=count; 1396 c[D_RMD160][0]=count; 1397 c[D_RC4][0]=count*5; 1398 c[D_CBC_DES][0]=count; 1399 c[D_EDE3_DES][0]=count/3; 1400 c[D_CBC_IDEA][0]=count; 1401 c[D_CBC_SEED][0]=count; 1402 c[D_CBC_RC2][0]=count; 1403 c[D_CBC_RC5][0]=count; 1404 c[D_CBC_BF][0]=count; 1405 c[D_CBC_CAST][0]=count; 1406 c[D_CBC_128_AES][0]=count; 1407 c[D_CBC_192_AES][0]=count; 1408 c[D_CBC_256_AES][0]=count; 1409 c[D_CBC_128_CML][0]=count; 1410 c[D_CBC_192_CML][0]=count; 1411 c[D_CBC_256_CML][0]=count; 1412 c[D_SHA256][0]=count; 1413 c[D_SHA512][0]=count; 1414 c[D_IGE_128_AES][0]=count; 1415 c[D_IGE_192_AES][0]=count; 1416 c[D_IGE_256_AES][0]=count; 1417 1418 for (i=1; i<SIZE_NUM; i++) 1419 { 1420 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i]; 1421 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i]; 1422 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i]; 1423 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i]; 1424 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i]; 1425 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i]; 1426 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i]; 1427 c[D_SHA256][i]=c[D_SHA256][0]*4*lengths[0]/lengths[i]; 1428 c[D_SHA512][i]=c[D_SHA512][0]*4*lengths[0]/lengths[i]; 1429 } 1430 for (i=1; i<SIZE_NUM; i++) 1431 { 1432 long l0,l1; 1433 1434 l0=(long)lengths[i-1]; 1435 l1=(long)lengths[i]; 1436 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1; 1437 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1; 1438 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1; 1439 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1; 1440 c[D_CBC_SEED][i]=c[D_CBC_SEED][i-1]*l0/l1; 1441 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1; 1442 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1; 1443 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1; 1444 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1; 1445 c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1; 1446 c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1; 1447 c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1; 1448 c[D_CBC_128_CML][i]=c[D_CBC_128_CML][i-1]*l0/l1; 1449 c[D_CBC_192_CML][i]=c[D_CBC_192_CML][i-1]*l0/l1; 1450 c[D_CBC_256_CML][i]=c[D_CBC_256_CML][i-1]*l0/l1; 1451 c[D_IGE_128_AES][i]=c[D_IGE_128_AES][i-1]*l0/l1; 1452 c[D_IGE_192_AES][i]=c[D_IGE_192_AES][i-1]*l0/l1; 1453 c[D_IGE_256_AES][i]=c[D_IGE_256_AES][i-1]*l0/l1; 1454 } 1455 #ifndef OPENSSL_NO_RSA 1456 rsa_c[R_RSA_512][0]=count/2000; 1457 rsa_c[R_RSA_512][1]=count/400; 1458 for (i=1; i<RSA_NUM; i++) 1459 { 1460 rsa_c[i][0]=rsa_c[i-1][0]/8; 1461 rsa_c[i][1]=rsa_c[i-1][1]/4; 1462 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0)) 1463 rsa_doit[i]=0; 1464 else 1465 { 1466 if (rsa_c[i][0] == 0) 1467 { 1468 rsa_c[i][0]=1; 1469 rsa_c[i][1]=20; 1470 } 1471 } 1472 } 1473 #endif 1474 1475 #ifndef OPENSSL_NO_DSA 1476 dsa_c[R_DSA_512][0]=count/1000; 1477 dsa_c[R_DSA_512][1]=count/1000/2; 1478 for (i=1; i<DSA_NUM; i++) 1479 { 1480 dsa_c[i][0]=dsa_c[i-1][0]/4; 1481 dsa_c[i][1]=dsa_c[i-1][1]/4; 1482 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0)) 1483 dsa_doit[i]=0; 1484 else 1485 { 1486 if (dsa_c[i] == 0) 1487 { 1488 dsa_c[i][0]=1; 1489 dsa_c[i][1]=1; 1490 } 1491 } 1492 } 1493 #endif 1494 1495 #ifndef OPENSSL_NO_ECDSA 1496 ecdsa_c[R_EC_P160][0]=count/1000; 1497 ecdsa_c[R_EC_P160][1]=count/1000/2; 1498 for (i=R_EC_P192; i<=R_EC_P521; i++) 1499 { 1500 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2; 1501 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2; 1502 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0)) 1503 ecdsa_doit[i]=0; 1504 else 1505 { 1506 if (ecdsa_c[i] == 0) 1507 { 1508 ecdsa_c[i][0]=1; 1509 ecdsa_c[i][1]=1; 1510 } 1511 } 1512 } 1513 ecdsa_c[R_EC_K163][0]=count/1000; 1514 ecdsa_c[R_EC_K163][1]=count/1000/2; 1515 for (i=R_EC_K233; i<=R_EC_K571; i++) 1516 { 1517 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2; 1518 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2; 1519 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0)) 1520 ecdsa_doit[i]=0; 1521 else 1522 { 1523 if (ecdsa_c[i] == 0) 1524 { 1525 ecdsa_c[i][0]=1; 1526 ecdsa_c[i][1]=1; 1527 } 1528 } 1529 } 1530 ecdsa_c[R_EC_B163][0]=count/1000; 1531 ecdsa_c[R_EC_B163][1]=count/1000/2; 1532 for (i=R_EC_B233; i<=R_EC_B571; i++) 1533 { 1534 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2; 1535 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2; 1536 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0)) 1537 ecdsa_doit[i]=0; 1538 else 1539 { 1540 if (ecdsa_c[i] == 0) 1541 { 1542 ecdsa_c[i][0]=1; 1543 ecdsa_c[i][1]=1; 1544 } 1545 } 1546 } 1547 #endif 1548 1549 #ifndef OPENSSL_NO_ECDH 1550 ecdh_c[R_EC_P160][0]=count/1000; 1551 ecdh_c[R_EC_P160][1]=count/1000; 1552 for (i=R_EC_P192; i<=R_EC_P521; i++) 1553 { 1554 ecdh_c[i][0]=ecdh_c[i-1][0]/2; 1555 ecdh_c[i][1]=ecdh_c[i-1][1]/2; 1556 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0)) 1557 ecdh_doit[i]=0; 1558 else 1559 { 1560 if (ecdh_c[i] == 0) 1561 { 1562 ecdh_c[i][0]=1; 1563 ecdh_c[i][1]=1; 1564 } 1565 } 1566 } 1567 ecdh_c[R_EC_K163][0]=count/1000; 1568 ecdh_c[R_EC_K163][1]=count/1000; 1569 for (i=R_EC_K233; i<=R_EC_K571; i++) 1570 { 1571 ecdh_c[i][0]=ecdh_c[i-1][0]/2; 1572 ecdh_c[i][1]=ecdh_c[i-1][1]/2; 1573 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0)) 1574 ecdh_doit[i]=0; 1575 else 1576 { 1577 if (ecdh_c[i] == 0) 1578 { 1579 ecdh_c[i][0]=1; 1580 ecdh_c[i][1]=1; 1581 } 1582 } 1583 } 1584 ecdh_c[R_EC_B163][0]=count/1000; 1585 ecdh_c[R_EC_B163][1]=count/1000; 1586 for (i=R_EC_B233; i<=R_EC_B571; i++) 1587 { 1588 ecdh_c[i][0]=ecdh_c[i-1][0]/2; 1589 ecdh_c[i][1]=ecdh_c[i-1][1]/2; 1590 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0)) 1591 ecdh_doit[i]=0; 1592 else 1593 { 1594 if (ecdh_c[i] == 0) 1595 { 1596 ecdh_c[i][0]=1; 1597 ecdh_c[i][1]=1; 1598 } 1599 } 1600 } 1601 #endif 1602 1603 #define COND(d) (count < (d)) 1604 #define COUNT(d) (d) 1605 #else 1606 /* not worth fixing */ 1607 # error "You cannot disable DES on systems without SIGALRM." 1608 #endif /* OPENSSL_NO_DES */ 1609 #else 1610 #define COND(c) (run) 1611 #define COUNT(d) (count) 1612 signal(SIGALRM,sig_done); 1613 #endif /* SIGALRM */ 1614 1615 #ifndef OPENSSL_NO_MD2 1616 if (doit[D_MD2]) 1617 { 1618 for (j=0; j<SIZE_NUM; j++) 1619 { 1620 print_message(names[D_MD2],c[D_MD2][j],lengths[j]); 1621 Time_F(START); 1622 for (count=0,run=1; COND(c[D_MD2][j]); count++) 1623 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL); 1624 d=Time_F(STOP); 1625 print_result(D_MD2,j,count,d); 1626 } 1627 } 1628 #endif 1629 #ifndef OPENSSL_NO_MDC2 1630 if (doit[D_MDC2]) 1631 { 1632 for (j=0; j<SIZE_NUM; j++) 1633 { 1634 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]); 1635 Time_F(START); 1636 for (count=0,run=1; COND(c[D_MDC2][j]); count++) 1637 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL); 1638 d=Time_F(STOP); 1639 print_result(D_MDC2,j,count,d); 1640 } 1641 } 1642 #endif 1643 1644 #ifndef OPENSSL_NO_MD4 1645 if (doit[D_MD4]) 1646 { 1647 for (j=0; j<SIZE_NUM; j++) 1648 { 1649 print_message(names[D_MD4],c[D_MD4][j],lengths[j]); 1650 Time_F(START); 1651 for (count=0,run=1; COND(c[D_MD4][j]); count++) 1652 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL); 1653 d=Time_F(STOP); 1654 print_result(D_MD4,j,count,d); 1655 } 1656 } 1657 #endif 1658 1659 #ifndef OPENSSL_NO_MD5 1660 if (doit[D_MD5]) 1661 { 1662 for (j=0; j<SIZE_NUM; j++) 1663 { 1664 print_message(names[D_MD5],c[D_MD5][j],lengths[j]); 1665 Time_F(START); 1666 for (count=0,run=1; COND(c[D_MD5][j]); count++) 1667 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL); 1668 d=Time_F(STOP); 1669 print_result(D_MD5,j,count,d); 1670 } 1671 } 1672 #endif 1673 1674 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC) 1675 if (doit[D_HMAC]) 1676 { 1677 HMAC_CTX hctx; 1678 1679 HMAC_CTX_init(&hctx); 1680 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...", 1681 16,EVP_md5(), NULL); 1682 1683 for (j=0; j<SIZE_NUM; j++) 1684 { 1685 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]); 1686 Time_F(START); 1687 for (count=0,run=1; COND(c[D_HMAC][j]); count++) 1688 { 1689 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL); 1690 HMAC_Update(&hctx,buf,lengths[j]); 1691 HMAC_Final(&hctx,&(hmac[0]),NULL); 1692 } 1693 d=Time_F(STOP); 1694 print_result(D_HMAC,j,count,d); 1695 } 1696 HMAC_CTX_cleanup(&hctx); 1697 } 1698 #endif 1699 #ifndef OPENSSL_NO_SHA 1700 if (doit[D_SHA1]) 1701 { 1702 for (j=0; j<SIZE_NUM; j++) 1703 { 1704 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]); 1705 Time_F(START); 1706 for (count=0,run=1; COND(c[D_SHA1][j]); count++) 1707 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL); 1708 d=Time_F(STOP); 1709 print_result(D_SHA1,j,count,d); 1710 } 1711 } 1712 1713 #ifndef OPENSSL_NO_SHA256 1714 if (doit[D_SHA256]) 1715 { 1716 for (j=0; j<SIZE_NUM; j++) 1717 { 1718 print_message(names[D_SHA256],c[D_SHA256][j],lengths[j]); 1719 Time_F(START); 1720 for (count=0,run=1; COND(c[D_SHA256][j]); count++) 1721 SHA256(buf,lengths[j],sha256); 1722 d=Time_F(STOP); 1723 print_result(D_SHA256,j,count,d); 1724 } 1725 } 1726 #endif 1727 1728 #ifndef OPENSSL_NO_SHA512 1729 if (doit[D_SHA512]) 1730 { 1731 for (j=0; j<SIZE_NUM; j++) 1732 { 1733 print_message(names[D_SHA512],c[D_SHA512][j],lengths[j]); 1734 Time_F(START); 1735 for (count=0,run=1; COND(c[D_SHA512][j]); count++) 1736 SHA512(buf,lengths[j],sha512); 1737 d=Time_F(STOP); 1738 print_result(D_SHA512,j,count,d); 1739 } 1740 } 1741 #endif 1742 1743 #endif 1744 #ifndef OPENSSL_NO_RIPEMD 1745 if (doit[D_RMD160]) 1746 { 1747 for (j=0; j<SIZE_NUM; j++) 1748 { 1749 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]); 1750 Time_F(START); 1751 for (count=0,run=1; COND(c[D_RMD160][j]); count++) 1752 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL); 1753 d=Time_F(STOP); 1754 print_result(D_RMD160,j,count,d); 1755 } 1756 } 1757 #endif 1758 #ifndef OPENSSL_NO_RC4 1759 if (doit[D_RC4]) 1760 { 1761 for (j=0; j<SIZE_NUM; j++) 1762 { 1763 print_message(names[D_RC4],c[D_RC4][j],lengths[j]); 1764 Time_F(START); 1765 for (count=0,run=1; COND(c[D_RC4][j]); count++) 1766 RC4(&rc4_ks,(unsigned int)lengths[j], 1767 buf,buf); 1768 d=Time_F(STOP); 1769 print_result(D_RC4,j,count,d); 1770 } 1771 } 1772 #endif 1773 #ifndef OPENSSL_NO_DES 1774 if (doit[D_CBC_DES]) 1775 { 1776 for (j=0; j<SIZE_NUM; j++) 1777 { 1778 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]); 1779 Time_F(START); 1780 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++) 1781 DES_ncbc_encrypt(buf,buf,lengths[j],&sch, 1782 &DES_iv,DES_ENCRYPT); 1783 d=Time_F(STOP); 1784 print_result(D_CBC_DES,j,count,d); 1785 } 1786 } 1787 1788 if (doit[D_EDE3_DES]) 1789 { 1790 for (j=0; j<SIZE_NUM; j++) 1791 { 1792 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]); 1793 Time_F(START); 1794 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++) 1795 DES_ede3_cbc_encrypt(buf,buf,lengths[j], 1796 &sch,&sch2,&sch3, 1797 &DES_iv,DES_ENCRYPT); 1798 d=Time_F(STOP); 1799 print_result(D_EDE3_DES,j,count,d); 1800 } 1801 } 1802 #endif 1803 #ifndef OPENSSL_NO_AES 1804 if (doit[D_CBC_128_AES]) 1805 { 1806 for (j=0; j<SIZE_NUM; j++) 1807 { 1808 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]); 1809 Time_F(START); 1810 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++) 1811 AES_cbc_encrypt(buf,buf, 1812 (unsigned long)lengths[j],&aes_ks1, 1813 iv,AES_ENCRYPT); 1814 d=Time_F(STOP); 1815 print_result(D_CBC_128_AES,j,count,d); 1816 } 1817 } 1818 if (doit[D_CBC_192_AES]) 1819 { 1820 for (j=0; j<SIZE_NUM; j++) 1821 { 1822 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]); 1823 Time_F(START); 1824 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++) 1825 AES_cbc_encrypt(buf,buf, 1826 (unsigned long)lengths[j],&aes_ks2, 1827 iv,AES_ENCRYPT); 1828 d=Time_F(STOP); 1829 print_result(D_CBC_192_AES,j,count,d); 1830 } 1831 } 1832 if (doit[D_CBC_256_AES]) 1833 { 1834 for (j=0; j<SIZE_NUM; j++) 1835 { 1836 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]); 1837 Time_F(START); 1838 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++) 1839 AES_cbc_encrypt(buf,buf, 1840 (unsigned long)lengths[j],&aes_ks3, 1841 iv,AES_ENCRYPT); 1842 d=Time_F(STOP); 1843 print_result(D_CBC_256_AES,j,count,d); 1844 } 1845 } 1846 1847 if (doit[D_IGE_128_AES]) 1848 { 1849 for (j=0; j<SIZE_NUM; j++) 1850 { 1851 print_message(names[D_IGE_128_AES],c[D_IGE_128_AES][j],lengths[j]); 1852 Time_F(START); 1853 for (count=0,run=1; COND(c[D_IGE_128_AES][j]); count++) 1854 AES_ige_encrypt(buf,buf2, 1855 (unsigned long)lengths[j],&aes_ks1, 1856 iv,AES_ENCRYPT); 1857 d=Time_F(STOP); 1858 print_result(D_IGE_128_AES,j,count,d); 1859 } 1860 } 1861 if (doit[D_IGE_192_AES]) 1862 { 1863 for (j=0; j<SIZE_NUM; j++) 1864 { 1865 print_message(names[D_IGE_192_AES],c[D_IGE_192_AES][j],lengths[j]); 1866 Time_F(START); 1867 for (count=0,run=1; COND(c[D_IGE_192_AES][j]); count++) 1868 AES_ige_encrypt(buf,buf2, 1869 (unsigned long)lengths[j],&aes_ks2, 1870 iv,AES_ENCRYPT); 1871 d=Time_F(STOP); 1872 print_result(D_IGE_192_AES,j,count,d); 1873 } 1874 } 1875 if (doit[D_IGE_256_AES]) 1876 { 1877 for (j=0; j<SIZE_NUM; j++) 1878 { 1879 print_message(names[D_IGE_256_AES],c[D_IGE_256_AES][j],lengths[j]); 1880 Time_F(START); 1881 for (count=0,run=1; COND(c[D_IGE_256_AES][j]); count++) 1882 AES_ige_encrypt(buf,buf2, 1883 (unsigned long)lengths[j],&aes_ks3, 1884 iv,AES_ENCRYPT); 1885 d=Time_F(STOP); 1886 print_result(D_IGE_256_AES,j,count,d); 1887 } 1888 } 1889 #endif 1890 #ifndef OPENSSL_NO_CAMELLIA 1891 if (doit[D_CBC_128_CML]) 1892 { 1893 for (j=0; j<SIZE_NUM; j++) 1894 { 1895 print_message(names[D_CBC_128_CML],c[D_CBC_128_CML][j],lengths[j]); 1896 Time_F(START); 1897 for (count=0,run=1; COND(c[D_CBC_128_CML][j]); count++) 1898 Camellia_cbc_encrypt(buf,buf, 1899 (unsigned long)lengths[j],&camellia_ks1, 1900 iv,CAMELLIA_ENCRYPT); 1901 d=Time_F(STOP); 1902 print_result(D_CBC_128_CML,j,count,d); 1903 } 1904 } 1905 if (doit[D_CBC_192_CML]) 1906 { 1907 for (j=0; j<SIZE_NUM; j++) 1908 { 1909 print_message(names[D_CBC_192_CML],c[D_CBC_192_CML][j],lengths[j]); 1910 Time_F(START); 1911 for (count=0,run=1; COND(c[D_CBC_192_CML][j]); count++) 1912 Camellia_cbc_encrypt(buf,buf, 1913 (unsigned long)lengths[j],&camellia_ks2, 1914 iv,CAMELLIA_ENCRYPT); 1915 d=Time_F(STOP); 1916 print_result(D_CBC_192_CML,j,count,d); 1917 } 1918 } 1919 if (doit[D_CBC_256_CML]) 1920 { 1921 for (j=0; j<SIZE_NUM; j++) 1922 { 1923 print_message(names[D_CBC_256_CML],c[D_CBC_256_CML][j],lengths[j]); 1924 Time_F(START); 1925 for (count=0,run=1; COND(c[D_CBC_256_CML][j]); count++) 1926 Camellia_cbc_encrypt(buf,buf, 1927 (unsigned long)lengths[j],&camellia_ks3, 1928 iv,CAMELLIA_ENCRYPT); 1929 d=Time_F(STOP); 1930 print_result(D_CBC_256_CML,j,count,d); 1931 } 1932 } 1933 1934 #endif 1935 #ifndef OPENSSL_NO_IDEA 1936 if (doit[D_CBC_IDEA]) 1937 { 1938 for (j=0; j<SIZE_NUM; j++) 1939 { 1940 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]); 1941 Time_F(START); 1942 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++) 1943 idea_cbc_encrypt(buf,buf, 1944 (unsigned long)lengths[j],&idea_ks, 1945 iv,IDEA_ENCRYPT); 1946 d=Time_F(STOP); 1947 print_result(D_CBC_IDEA,j,count,d); 1948 } 1949 } 1950 #endif 1951 #ifndef OPENSSL_NO_SEED 1952 if (doit[D_CBC_SEED]) 1953 { 1954 for (j=0; j<SIZE_NUM; j++) 1955 { 1956 print_message(names[D_CBC_SEED],c[D_CBC_SEED][j],lengths[j]); 1957 Time_F(START); 1958 for (count=0,run=1; COND(c[D_CBC_SEED][j]); count++) 1959 SEED_cbc_encrypt(buf,buf, 1960 (unsigned long)lengths[j],&seed_ks,iv,1); 1961 d=Time_F(STOP); 1962 print_result(D_CBC_SEED,j,count,d); 1963 } 1964 } 1965 #endif 1966 #ifndef OPENSSL_NO_RC2 1967 if (doit[D_CBC_RC2]) 1968 { 1969 for (j=0; j<SIZE_NUM; j++) 1970 { 1971 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]); 1972 Time_F(START); 1973 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++) 1974 RC2_cbc_encrypt(buf,buf, 1975 (unsigned long)lengths[j],&rc2_ks, 1976 iv,RC2_ENCRYPT); 1977 d=Time_F(STOP); 1978 print_result(D_CBC_RC2,j,count,d); 1979 } 1980 } 1981 #endif 1982 #ifndef OPENSSL_NO_RC5 1983 if (doit[D_CBC_RC5]) 1984 { 1985 for (j=0; j<SIZE_NUM; j++) 1986 { 1987 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]); 1988 Time_F(START); 1989 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++) 1990 RC5_32_cbc_encrypt(buf,buf, 1991 (unsigned long)lengths[j],&rc5_ks, 1992 iv,RC5_ENCRYPT); 1993 d=Time_F(STOP); 1994 print_result(D_CBC_RC5,j,count,d); 1995 } 1996 } 1997 #endif 1998 #ifndef OPENSSL_NO_BF 1999 if (doit[D_CBC_BF]) 2000 { 2001 for (j=0; j<SIZE_NUM; j++) 2002 { 2003 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]); 2004 Time_F(START); 2005 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++) 2006 BF_cbc_encrypt(buf,buf, 2007 (unsigned long)lengths[j],&bf_ks, 2008 iv,BF_ENCRYPT); 2009 d=Time_F(STOP); 2010 print_result(D_CBC_BF,j,count,d); 2011 } 2012 } 2013 #endif 2014 #ifndef OPENSSL_NO_CAST 2015 if (doit[D_CBC_CAST]) 2016 { 2017 for (j=0; j<SIZE_NUM; j++) 2018 { 2019 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]); 2020 Time_F(START); 2021 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++) 2022 CAST_cbc_encrypt(buf,buf, 2023 (unsigned long)lengths[j],&cast_ks, 2024 iv,CAST_ENCRYPT); 2025 d=Time_F(STOP); 2026 print_result(D_CBC_CAST,j,count,d); 2027 } 2028 } 2029 #endif 2030 2031 if (doit[D_EVP]) 2032 { 2033 for (j=0; j<SIZE_NUM; j++) 2034 { 2035 if (evp_cipher) 2036 { 2037 EVP_CIPHER_CTX ctx; 2038 int outl; 2039 2040 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid); 2041 /* -O3 -fschedule-insns messes up an 2042 * optimization here! names[D_EVP] 2043 * somehow becomes NULL */ 2044 print_message(names[D_EVP],save_count, 2045 lengths[j]); 2046 2047 EVP_CIPHER_CTX_init(&ctx); 2048 if(decrypt) 2049 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv); 2050 else 2051 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv); 2052 EVP_CIPHER_CTX_set_padding(&ctx, 0); 2053 2054 Time_F(START); 2055 if(decrypt) 2056 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++) 2057 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]); 2058 else 2059 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++) 2060 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]); 2061 if(decrypt) 2062 EVP_DecryptFinal_ex(&ctx,buf,&outl); 2063 else 2064 EVP_EncryptFinal_ex(&ctx,buf,&outl); 2065 d=Time_F(STOP); 2066 EVP_CIPHER_CTX_cleanup(&ctx); 2067 } 2068 if (evp_md) 2069 { 2070 names[D_EVP]=OBJ_nid2ln(evp_md->type); 2071 print_message(names[D_EVP],save_count, 2072 lengths[j]); 2073 2074 Time_F(START); 2075 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++) 2076 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL); 2077 2078 d=Time_F(STOP); 2079 } 2080 print_result(D_EVP,j,count,d); 2081 } 2082 } 2083 2084 RAND_pseudo_bytes(buf,36); 2085 #ifndef OPENSSL_NO_RSA 2086 for (j=0; j<RSA_NUM; j++) 2087 { 2088 int ret; 2089 if (!rsa_doit[j]) continue; 2090 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]); 2091 if (ret == 0) 2092 { 2093 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n"); 2094 ERR_print_errors(bio_err); 2095 rsa_count=1; 2096 } 2097 else 2098 { 2099 pkey_print_message("private","rsa", 2100 rsa_c[j][0],rsa_bits[j], 2101 RSA_SECONDS); 2102 /* RSA_blinding_on(rsa_key[j],NULL); */ 2103 Time_F(START); 2104 for (count=0,run=1; COND(rsa_c[j][0]); count++) 2105 { 2106 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, 2107 &rsa_num, rsa_key[j]); 2108 if (ret == 0) 2109 { 2110 BIO_printf(bio_err, 2111 "RSA sign failure\n"); 2112 ERR_print_errors(bio_err); 2113 count=1; 2114 break; 2115 } 2116 } 2117 d=Time_F(STOP); 2118 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n" 2119 : "%ld %d bit private RSA's in %.2fs\n", 2120 count,rsa_bits[j],d); 2121 rsa_results[j][0]=d/(double)count; 2122 rsa_count=count; 2123 } 2124 2125 #if 1 2126 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]); 2127 if (ret <= 0) 2128 { 2129 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n"); 2130 ERR_print_errors(bio_err); 2131 rsa_doit[j] = 0; 2132 } 2133 else 2134 { 2135 pkey_print_message("public","rsa", 2136 rsa_c[j][1],rsa_bits[j], 2137 RSA_SECONDS); 2138 Time_F(START); 2139 for (count=0,run=1; COND(rsa_c[j][1]); count++) 2140 { 2141 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, 2142 rsa_num, rsa_key[j]); 2143 if (ret <= 0) 2144 { 2145 BIO_printf(bio_err, 2146 "RSA verify failure\n"); 2147 ERR_print_errors(bio_err); 2148 count=1; 2149 break; 2150 } 2151 } 2152 d=Time_F(STOP); 2153 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n" 2154 : "%ld %d bit public RSA's in %.2fs\n", 2155 count,rsa_bits[j],d); 2156 rsa_results[j][1]=d/(double)count; 2157 } 2158 #endif 2159 2160 if (rsa_count <= 1) 2161 { 2162 /* if longer than 10s, don't do any more */ 2163 for (j++; j<RSA_NUM; j++) 2164 rsa_doit[j]=0; 2165 } 2166 } 2167 #endif 2168 2169 RAND_pseudo_bytes(buf,20); 2170 #ifndef OPENSSL_NO_DSA 2171 if (RAND_status() != 1) 2172 { 2173 RAND_seed(rnd_seed, sizeof rnd_seed); 2174 rnd_fake = 1; 2175 } 2176 for (j=0; j<DSA_NUM; j++) 2177 { 2178 unsigned int kk; 2179 int ret; 2180 2181 if (!dsa_doit[j]) continue; 2182 /* DSA_generate_key(dsa_key[j]); */ 2183 /* DSA_sign_setup(dsa_key[j],NULL); */ 2184 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2, 2185 &kk,dsa_key[j]); 2186 if (ret == 0) 2187 { 2188 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n"); 2189 ERR_print_errors(bio_err); 2190 rsa_count=1; 2191 } 2192 else 2193 { 2194 pkey_print_message("sign","dsa", 2195 dsa_c[j][0],dsa_bits[j], 2196 DSA_SECONDS); 2197 Time_F(START); 2198 for (count=0,run=1; COND(dsa_c[j][0]); count++) 2199 { 2200 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2, 2201 &kk,dsa_key[j]); 2202 if (ret == 0) 2203 { 2204 BIO_printf(bio_err, 2205 "DSA sign failure\n"); 2206 ERR_print_errors(bio_err); 2207 count=1; 2208 break; 2209 } 2210 } 2211 d=Time_F(STOP); 2212 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n" 2213 : "%ld %d bit DSA signs in %.2fs\n", 2214 count,dsa_bits[j],d); 2215 dsa_results[j][0]=d/(double)count; 2216 rsa_count=count; 2217 } 2218 2219 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2, 2220 kk,dsa_key[j]); 2221 if (ret <= 0) 2222 { 2223 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n"); 2224 ERR_print_errors(bio_err); 2225 dsa_doit[j] = 0; 2226 } 2227 else 2228 { 2229 pkey_print_message("verify","dsa", 2230 dsa_c[j][1],dsa_bits[j], 2231 DSA_SECONDS); 2232 Time_F(START); 2233 for (count=0,run=1; COND(dsa_c[j][1]); count++) 2234 { 2235 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2, 2236 kk,dsa_key[j]); 2237 if (ret <= 0) 2238 { 2239 BIO_printf(bio_err, 2240 "DSA verify failure\n"); 2241 ERR_print_errors(bio_err); 2242 count=1; 2243 break; 2244 } 2245 } 2246 d=Time_F(STOP); 2247 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n" 2248 : "%ld %d bit DSA verify in %.2fs\n", 2249 count,dsa_bits[j],d); 2250 dsa_results[j][1]=d/(double)count; 2251 } 2252 2253 if (rsa_count <= 1) 2254 { 2255 /* if longer than 10s, don't do any more */ 2256 for (j++; j<DSA_NUM; j++) 2257 dsa_doit[j]=0; 2258 } 2259 } 2260 if (rnd_fake) RAND_cleanup(); 2261 #endif 2262 2263 #ifndef OPENSSL_NO_ECDSA 2264 if (RAND_status() != 1) 2265 { 2266 RAND_seed(rnd_seed, sizeof rnd_seed); 2267 rnd_fake = 1; 2268 } 2269 for (j=0; j<EC_NUM; j++) 2270 { 2271 int ret; 2272 2273 if (!ecdsa_doit[j]) continue; /* Ignore Curve */ 2274 ecdsa[j] = EC_KEY_new_by_curve_name(test_curves[j]); 2275 if (ecdsa[j] == NULL) 2276 { 2277 BIO_printf(bio_err,"ECDSA failure.\n"); 2278 ERR_print_errors(bio_err); 2279 rsa_count=1; 2280 } 2281 else 2282 { 2283 #if 1 2284 EC_KEY_precompute_mult(ecdsa[j], NULL); 2285 #endif 2286 /* Perform ECDSA signature test */ 2287 EC_KEY_generate_key(ecdsa[j]); 2288 ret = ECDSA_sign(0, buf, 20, ecdsasig, 2289 &ecdsasiglen, ecdsa[j]); 2290 if (ret == 0) 2291 { 2292 BIO_printf(bio_err,"ECDSA sign failure. No ECDSA sign will be done.\n"); 2293 ERR_print_errors(bio_err); 2294 rsa_count=1; 2295 } 2296 else 2297 { 2298 pkey_print_message("sign","ecdsa", 2299 ecdsa_c[j][0], 2300 test_curves_bits[j], 2301 ECDSA_SECONDS); 2302 2303 Time_F(START); 2304 for (count=0,run=1; COND(ecdsa_c[j][0]); 2305 count++) 2306 { 2307 ret=ECDSA_sign(0, buf, 20, 2308 ecdsasig, &ecdsasiglen, 2309 ecdsa[j]); 2310 if (ret == 0) 2311 { 2312 BIO_printf(bio_err, "ECDSA sign failure\n"); 2313 ERR_print_errors(bio_err); 2314 count=1; 2315 break; 2316 } 2317 } 2318 d=Time_F(STOP); 2319 2320 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" : 2321 "%ld %d bit ECDSA signs in %.2fs \n", 2322 count, test_curves_bits[j], d); 2323 ecdsa_results[j][0]=d/(double)count; 2324 rsa_count=count; 2325 } 2326 2327 /* Perform ECDSA verification test */ 2328 ret=ECDSA_verify(0, buf, 20, ecdsasig, 2329 ecdsasiglen, ecdsa[j]); 2330 if (ret != 1) 2331 { 2332 BIO_printf(bio_err,"ECDSA verify failure. No ECDSA verify will be done.\n"); 2333 ERR_print_errors(bio_err); 2334 ecdsa_doit[j] = 0; 2335 } 2336 else 2337 { 2338 pkey_print_message("verify","ecdsa", 2339 ecdsa_c[j][1], 2340 test_curves_bits[j], 2341 ECDSA_SECONDS); 2342 Time_F(START); 2343 for (count=0,run=1; COND(ecdsa_c[j][1]); count++) 2344 { 2345 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]); 2346 if (ret != 1) 2347 { 2348 BIO_printf(bio_err, "ECDSA verify failure\n"); 2349 ERR_print_errors(bio_err); 2350 count=1; 2351 break; 2352 } 2353 } 2354 d=Time_F(STOP); 2355 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n" 2356 : "%ld %d bit ECDSA verify in %.2fs\n", 2357 count, test_curves_bits[j], d); 2358 ecdsa_results[j][1]=d/(double)count; 2359 } 2360 2361 if (rsa_count <= 1) 2362 { 2363 /* if longer than 10s, don't do any more */ 2364 for (j++; j<EC_NUM; j++) 2365 ecdsa_doit[j]=0; 2366 } 2367 } 2368 } 2369 if (rnd_fake) RAND_cleanup(); 2370 #endif 2371 2372 #ifndef OPENSSL_NO_ECDH 2373 if (RAND_status() != 1) 2374 { 2375 RAND_seed(rnd_seed, sizeof rnd_seed); 2376 rnd_fake = 1; 2377 } 2378 for (j=0; j<EC_NUM; j++) 2379 { 2380 if (!ecdh_doit[j]) continue; 2381 ecdh_a[j] = EC_KEY_new_by_curve_name(test_curves[j]); 2382 ecdh_b[j] = EC_KEY_new_by_curve_name(test_curves[j]); 2383 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL)) 2384 { 2385 BIO_printf(bio_err,"ECDH failure.\n"); 2386 ERR_print_errors(bio_err); 2387 rsa_count=1; 2388 } 2389 else 2390 { 2391 /* generate two ECDH key pairs */ 2392 if (!EC_KEY_generate_key(ecdh_a[j]) || 2393 !EC_KEY_generate_key(ecdh_b[j])) 2394 { 2395 BIO_printf(bio_err,"ECDH key generation failure.\n"); 2396 ERR_print_errors(bio_err); 2397 rsa_count=1; 2398 } 2399 else 2400 { 2401 /* If field size is not more than 24 octets, then use SHA-1 hash of result; 2402 * otherwise, use result (see section 4.8 of draft-ietf-tls-ecc-03.txt). 2403 */ 2404 int field_size, outlen; 2405 void *(*kdf)(const void *in, size_t inlen, void *out, size_t *xoutlen); 2406 field_size = EC_GROUP_get_degree(EC_KEY_get0_group(ecdh_a[j])); 2407 if (field_size <= 24 * 8) 2408 { 2409 outlen = KDF1_SHA1_len; 2410 kdf = KDF1_SHA1; 2411 } 2412 else 2413 { 2414 outlen = (field_size+7)/8; 2415 kdf = NULL; 2416 } 2417 secret_size_a = ECDH_compute_key(secret_a, outlen, 2418 EC_KEY_get0_public_key(ecdh_b[j]), 2419 ecdh_a[j], kdf); 2420 secret_size_b = ECDH_compute_key(secret_b, outlen, 2421 EC_KEY_get0_public_key(ecdh_a[j]), 2422 ecdh_b[j], kdf); 2423 if (secret_size_a != secret_size_b) 2424 ecdh_checks = 0; 2425 else 2426 ecdh_checks = 1; 2427 2428 for (secret_idx = 0; 2429 (secret_idx < secret_size_a) 2430 && (ecdh_checks == 1); 2431 secret_idx++) 2432 { 2433 if (secret_a[secret_idx] != secret_b[secret_idx]) 2434 ecdh_checks = 0; 2435 } 2436 2437 if (ecdh_checks == 0) 2438 { 2439 BIO_printf(bio_err,"ECDH computations don't match.\n"); 2440 ERR_print_errors(bio_err); 2441 rsa_count=1; 2442 } 2443 2444 pkey_print_message("","ecdh", 2445 ecdh_c[j][0], 2446 test_curves_bits[j], 2447 ECDH_SECONDS); 2448 Time_F(START); 2449 for (count=0,run=1; COND(ecdh_c[j][0]); count++) 2450 { 2451 ECDH_compute_key(secret_a, outlen, 2452 EC_KEY_get0_public_key(ecdh_b[j]), 2453 ecdh_a[j], kdf); 2454 } 2455 d=Time_F(STOP); 2456 BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n", 2457 count, test_curves_bits[j], d); 2458 ecdh_results[j][0]=d/(double)count; 2459 rsa_count=count; 2460 } 2461 } 2462 2463 2464 if (rsa_count <= 1) 2465 { 2466 /* if longer than 10s, don't do any more */ 2467 for (j++; j<EC_NUM; j++) 2468 ecdh_doit[j]=0; 2469 } 2470 } 2471 if (rnd_fake) RAND_cleanup(); 2472 #endif 2473 #ifndef NO_FORK 2474 show_res: 2475 #endif 2476 if(!mr) 2477 { 2478 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION)); 2479 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON)); 2480 printf("options:"); 2481 printf("%s ",BN_options()); 2482 #ifndef OPENSSL_NO_MD2 2483 printf("%s ",MD2_options()); 2484 #endif 2485 #ifndef OPENSSL_NO_RC4 2486 printf("%s ",RC4_options()); 2487 #endif 2488 #ifndef OPENSSL_NO_DES 2489 printf("%s ",DES_options()); 2490 #endif 2491 #ifndef OPENSSL_NO_AES 2492 printf("%s ",AES_options()); 2493 #endif 2494 #ifndef OPENSSL_NO_IDEA 2495 printf("%s ",idea_options()); 2496 #endif 2497 #ifndef OPENSSL_NO_BF 2498 printf("%s ",BF_options()); 2499 #endif 2500 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS)); 2501 printf("available timing options: "); 2502 #ifdef TIMES 2503 printf("TIMES "); 2504 #endif 2505 #ifdef TIMEB 2506 printf("TIMEB "); 2507 #endif 2508 #ifdef USE_TOD 2509 printf("USE_TOD "); 2510 #endif 2511 #ifdef HZ 2512 #define as_string(s) (#s) 2513 { 2514 double dbl = HZ; 2515 printf("HZ=%g", dbl); 2516 } 2517 # ifdef _SC_CLK_TCK 2518 printf(" [sysconf value]"); 2519 # endif 2520 #endif 2521 printf("\n"); 2522 printf("timing function used: %s%s%s%s%s%s%s\n", 2523 (ftime_used ? "ftime" : ""), 2524 (ftime_used + times_used > 1 ? "," : ""), 2525 (times_used ? "times" : ""), 2526 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""), 2527 (gettimeofday_used ? "gettimeofday" : ""), 2528 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""), 2529 (getrusage_used ? "getrusage" : "")); 2530 } 2531 2532 if (pr_header) 2533 { 2534 if(mr) 2535 fprintf(stdout,"+H"); 2536 else 2537 { 2538 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n"); 2539 fprintf(stdout,"type "); 2540 } 2541 for (j=0; j<SIZE_NUM; j++) 2542 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]); 2543 fprintf(stdout,"\n"); 2544 } 2545 2546 for (k=0; k<ALGOR_NUM; k++) 2547 { 2548 if (!doit[k]) continue; 2549 if(mr) 2550 fprintf(stdout,"+F:%d:%s",k,names[k]); 2551 else 2552 fprintf(stdout,"%-13s",names[k]); 2553 for (j=0; j<SIZE_NUM; j++) 2554 { 2555 if (results[k][j] > 10000 && !mr) 2556 fprintf(stdout," %11.2fk",results[k][j]/1e3); 2557 else 2558 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]); 2559 } 2560 fprintf(stdout,"\n"); 2561 } 2562 #ifndef OPENSSL_NO_RSA 2563 j=1; 2564 for (k=0; k<RSA_NUM; k++) 2565 { 2566 if (!rsa_doit[k]) continue; 2567 if (j && !mr) 2568 { 2569 printf("%18ssign verify sign/s verify/s\n"," "); 2570 j=0; 2571 } 2572 if(mr) 2573 fprintf(stdout,"+F2:%u:%u:%f:%f\n", 2574 k,rsa_bits[k],rsa_results[k][0], 2575 rsa_results[k][1]); 2576 else 2577 fprintf(stdout,"rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n", 2578 rsa_bits[k],rsa_results[k][0],rsa_results[k][1], 2579 1.0/rsa_results[k][0],1.0/rsa_results[k][1]); 2580 } 2581 #endif 2582 #ifndef OPENSSL_NO_DSA 2583 j=1; 2584 for (k=0; k<DSA_NUM; k++) 2585 { 2586 if (!dsa_doit[k]) continue; 2587 if (j && !mr) 2588 { 2589 printf("%18ssign verify sign/s verify/s\n"," "); 2590 j=0; 2591 } 2592 if(mr) 2593 fprintf(stdout,"+F3:%u:%u:%f:%f\n", 2594 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]); 2595 else 2596 fprintf(stdout,"dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n", 2597 dsa_bits[k],dsa_results[k][0],dsa_results[k][1], 2598 1.0/dsa_results[k][0],1.0/dsa_results[k][1]); 2599 } 2600 #endif 2601 #ifndef OPENSSL_NO_ECDSA 2602 j=1; 2603 for (k=0; k<EC_NUM; k++) 2604 { 2605 if (!ecdsa_doit[k]) continue; 2606 if (j && !mr) 2607 { 2608 printf("%30ssign verify sign/s verify/s\n"," "); 2609 j=0; 2610 } 2611 2612 if (mr) 2613 fprintf(stdout,"+F4:%u:%u:%f:%f\n", 2614 k, test_curves_bits[k], 2615 ecdsa_results[k][0],ecdsa_results[k][1]); 2616 else 2617 fprintf(stdout, 2618 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n", 2619 test_curves_bits[k], 2620 test_curves_names[k], 2621 ecdsa_results[k][0],ecdsa_results[k][1], 2622 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]); 2623 } 2624 #endif 2625 2626 2627 #ifndef OPENSSL_NO_ECDH 2628 j=1; 2629 for (k=0; k<EC_NUM; k++) 2630 { 2631 if (!ecdh_doit[k]) continue; 2632 if (j && !mr) 2633 { 2634 printf("%30sop op/s\n"," "); 2635 j=0; 2636 } 2637 if (mr) 2638 fprintf(stdout,"+F5:%u:%u:%f:%f\n", 2639 k, test_curves_bits[k], 2640 ecdh_results[k][0], 1.0/ecdh_results[k][0]); 2641 2642 else 2643 fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n", 2644 test_curves_bits[k], 2645 test_curves_names[k], 2646 ecdh_results[k][0], 1.0/ecdh_results[k][0]); 2647 } 2648 #endif 2649 2650 mret=0; 2651 2652 end: 2653 ERR_print_errors(bio_err); 2654 if (buf != NULL) OPENSSL_free(buf); 2655 if (buf2 != NULL) OPENSSL_free(buf2); 2656 #ifndef OPENSSL_NO_RSA 2657 for (i=0; i<RSA_NUM; i++) 2658 if (rsa_key[i] != NULL) 2659 RSA_free(rsa_key[i]); 2660 #endif 2661 #ifndef OPENSSL_NO_DSA 2662 for (i=0; i<DSA_NUM; i++) 2663 if (dsa_key[i] != NULL) 2664 DSA_free(dsa_key[i]); 2665 #endif 2666 2667 #ifndef OPENSSL_NO_ECDSA 2668 for (i=0; i<EC_NUM; i++) 2669 if (ecdsa[i] != NULL) 2670 EC_KEY_free(ecdsa[i]); 2671 #endif 2672 #ifndef OPENSSL_NO_ECDH 2673 for (i=0; i<EC_NUM; i++) 2674 { 2675 if (ecdh_a[i] != NULL) 2676 EC_KEY_free(ecdh_a[i]); 2677 if (ecdh_b[i] != NULL) 2678 EC_KEY_free(ecdh_b[i]); 2679 } 2680 #endif 2681 2682 apps_shutdown(); 2683 OPENSSL_EXIT(mret); 2684 } 2685 2686 static void print_message(const char *s, long num, int length) 2687 { 2688 #ifdef SIGALRM 2689 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n" 2690 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length); 2691 (void)BIO_flush(bio_err); 2692 alarm(SECONDS); 2693 #else 2694 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n" 2695 : "Doing %s %ld times on %d size blocks: ",s,num,length); 2696 (void)BIO_flush(bio_err); 2697 #endif 2698 #ifdef LINT 2699 num=num; 2700 #endif 2701 } 2702 2703 static void pkey_print_message(const char *str, const char *str2, long num, 2704 int bits, int tm) 2705 { 2706 #ifdef SIGALRM 2707 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n" 2708 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm); 2709 (void)BIO_flush(bio_err); 2710 alarm(RSA_SECONDS); 2711 #else 2712 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n" 2713 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2); 2714 (void)BIO_flush(bio_err); 2715 #endif 2716 #ifdef LINT 2717 num=num; 2718 #endif 2719 } 2720 2721 static void print_result(int alg,int run_no,int count,double time_used) 2722 { 2723 BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n" 2724 : "%d %s's in %.2fs\n",count,names[alg],time_used); 2725 results[alg][run_no]=((double)count)/time_used*lengths[run_no]; 2726 } 2727 2728 #ifndef NO_FORK 2729 static char *sstrsep(char **string, const char *delim) 2730 { 2731 char isdelim[256]; 2732 char *token = *string; 2733 2734 if (**string == 0) 2735 return NULL; 2736 2737 memset(isdelim, 0, sizeof isdelim); 2738 isdelim[0] = 1; 2739 2740 while (*delim) 2741 { 2742 isdelim[(unsigned char)(*delim)] = 1; 2743 delim++; 2744 } 2745 2746 while (!isdelim[(unsigned char)(**string)]) 2747 { 2748 (*string)++; 2749 } 2750 2751 if (**string) 2752 { 2753 **string = 0; 2754 (*string)++; 2755 } 2756 2757 return token; 2758 } 2759 2760 static int do_multi(int multi) 2761 { 2762 int n; 2763 int fd[2]; 2764 int *fds; 2765 static char sep[]=":"; 2766 2767 fds=malloc(multi*sizeof *fds); 2768 for(n=0 ; n < multi ; ++n) 2769 { 2770 pipe(fd); 2771 fflush(stdout); 2772 fflush(stderr); 2773 if(fork()) 2774 { 2775 close(fd[1]); 2776 fds[n]=fd[0]; 2777 } 2778 else 2779 { 2780 close(fd[0]); 2781 close(1); 2782 dup(fd[1]); 2783 close(fd[1]); 2784 mr=1; 2785 usertime=0; 2786 return 0; 2787 } 2788 printf("Forked child %d\n",n); 2789 } 2790 2791 /* for now, assume the pipe is long enough to take all the output */ 2792 for(n=0 ; n < multi ; ++n) 2793 { 2794 FILE *f; 2795 char buf[1024]; 2796 char *p; 2797 2798 f=fdopen(fds[n],"r"); 2799 while(fgets(buf,sizeof buf,f)) 2800 { 2801 p=strchr(buf,'\n'); 2802 if(p) 2803 *p='\0'; 2804 if(buf[0] != '+') 2805 { 2806 fprintf(stderr,"Don't understand line '%s' from child %d\n", 2807 buf,n); 2808 continue; 2809 } 2810 printf("Got: %s from %d\n",buf,n); 2811 if(!strncmp(buf,"+F:",3)) 2812 { 2813 int alg; 2814 int j; 2815 2816 p=buf+3; 2817 alg=atoi(sstrsep(&p,sep)); 2818 sstrsep(&p,sep); 2819 for(j=0 ; j < SIZE_NUM ; ++j) 2820 results[alg][j]+=atof(sstrsep(&p,sep)); 2821 } 2822 else if(!strncmp(buf,"+F2:",4)) 2823 { 2824 int k; 2825 double d; 2826 2827 p=buf+4; 2828 k=atoi(sstrsep(&p,sep)); 2829 sstrsep(&p,sep); 2830 2831 d=atof(sstrsep(&p,sep)); 2832 if(n) 2833 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d); 2834 else 2835 rsa_results[k][0]=d; 2836 2837 d=atof(sstrsep(&p,sep)); 2838 if(n) 2839 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d); 2840 else 2841 rsa_results[k][1]=d; 2842 } 2843 else if(!strncmp(buf,"+F2:",4)) 2844 { 2845 int k; 2846 double d; 2847 2848 p=buf+4; 2849 k=atoi(sstrsep(&p,sep)); 2850 sstrsep(&p,sep); 2851 2852 d=atof(sstrsep(&p,sep)); 2853 if(n) 2854 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d); 2855 else 2856 rsa_results[k][0]=d; 2857 2858 d=atof(sstrsep(&p,sep)); 2859 if(n) 2860 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d); 2861 else 2862 rsa_results[k][1]=d; 2863 } 2864 else if(!strncmp(buf,"+F3:",4)) 2865 { 2866 int k; 2867 double d; 2868 2869 p=buf+4; 2870 k=atoi(sstrsep(&p,sep)); 2871 sstrsep(&p,sep); 2872 2873 d=atof(sstrsep(&p,sep)); 2874 if(n) 2875 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d); 2876 else 2877 dsa_results[k][0]=d; 2878 2879 d=atof(sstrsep(&p,sep)); 2880 if(n) 2881 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d); 2882 else 2883 dsa_results[k][1]=d; 2884 } 2885 #ifndef OPENSSL_NO_ECDSA 2886 else if(!strncmp(buf,"+F4:",4)) 2887 { 2888 int k; 2889 double d; 2890 2891 p=buf+4; 2892 k=atoi(sstrsep(&p,sep)); 2893 sstrsep(&p,sep); 2894 2895 d=atof(sstrsep(&p,sep)); 2896 if(n) 2897 ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d); 2898 else 2899 ecdsa_results[k][0]=d; 2900 2901 d=atof(sstrsep(&p,sep)); 2902 if(n) 2903 ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d); 2904 else 2905 ecdsa_results[k][1]=d; 2906 } 2907 #endif 2908 2909 #ifndef OPENSSL_NO_ECDH 2910 else if(!strncmp(buf,"+F5:",4)) 2911 { 2912 int k; 2913 double d; 2914 2915 p=buf+4; 2916 k=atoi(sstrsep(&p,sep)); 2917 sstrsep(&p,sep); 2918 2919 d=atof(sstrsep(&p,sep)); 2920 if(n) 2921 ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d); 2922 else 2923 ecdh_results[k][0]=d; 2924 2925 } 2926 #endif 2927 2928 else if(!strncmp(buf,"+H:",3)) 2929 { 2930 } 2931 else 2932 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n); 2933 } 2934 } 2935 return 1; 2936 } 2937 #endif 2938 #endif 2939