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