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