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