1 /* $OpenBSD: speed.c,v 1.19 2016/08/22 04:33:07 deraadt Exp $ */ 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 #define SECONDS 3 77 #define RSA_SECONDS 10 78 #define DSA_SECONDS 10 79 #define ECDSA_SECONDS 10 80 #define ECDH_SECONDS 10 81 82 #include <math.h> 83 #include <signal.h> 84 #include <stdio.h> 85 #include <stdlib.h> 86 #include <limits.h> 87 #include <string.h> 88 #include <unistd.h> 89 90 #include "apps.h" 91 92 #include <openssl/bn.h> 93 #include <openssl/crypto.h> 94 #include <openssl/err.h> 95 #include <openssl/evp.h> 96 #include <openssl/modes.h> 97 #include <openssl/objects.h> 98 #include <openssl/x509.h> 99 100 #ifndef OPENSSL_NO_AES 101 #include <openssl/aes.h> 102 #endif 103 #ifndef OPENSSL_NO_BF 104 #include <openssl/blowfish.h> 105 #endif 106 #ifndef OPENSSL_NO_CAST 107 #include <openssl/cast.h> 108 #endif 109 #ifndef OPENSSL_NO_CAMELLIA 110 #include <openssl/camellia.h> 111 #endif 112 #ifndef OPENSSL_NO_DES 113 #include <openssl/des.h> 114 #endif 115 #include <openssl/dsa.h> 116 #include <openssl/ecdh.h> 117 #include <openssl/ecdsa.h> 118 #ifndef OPENSSL_NO_HMAC 119 #include <openssl/hmac.h> 120 #endif 121 #ifndef OPENSSL_NO_IDEA 122 #include <openssl/idea.h> 123 #endif 124 #ifndef OPENSSL_NO_MD4 125 #include <openssl/md4.h> 126 #endif 127 #ifndef OPENSSL_NO_MD5 128 #include <openssl/md5.h> 129 #endif 130 #ifndef OPENSSL_NO_RC2 131 #include <openssl/rc2.h> 132 #endif 133 #ifndef OPENSSL_NO_RC4 134 #include <openssl/rc4.h> 135 #endif 136 #include <openssl/rsa.h> 137 #ifndef OPENSSL_NO_RIPEMD 138 #include <openssl/ripemd.h> 139 #endif 140 #ifndef OPENSSL_NO_SHA 141 #include <openssl/sha.h> 142 #endif 143 #ifndef OPENSSL_NO_WHIRLPOOL 144 #include <openssl/whrlpool.h> 145 #endif 146 147 #include "./testdsa.h" 148 #include "./testrsa.h" 149 150 #define BUFSIZE (1024*8+64) 151 int run = 0; 152 153 static int mr = 0; 154 static int usertime = 1; 155 156 static double Time_F(int s); 157 static void print_message(const char *s, long num, int length); 158 static void 159 pkey_print_message(const char *str, const char *str2, 160 long num, int bits, int sec); 161 static void print_result(int alg, int run_no, int count, double time_used); 162 static int do_multi(int multi); 163 164 #define ALGOR_NUM 32 165 #define SIZE_NUM 5 166 #define RSA_NUM 4 167 #define DSA_NUM 3 168 169 #define EC_NUM 16 170 #define MAX_ECDH_SIZE 256 171 172 static const char *names[ALGOR_NUM] = { 173 "md2", "md4", "md5", "hmac(md5)", "sha1", "rmd160", 174 "rc4", "des cbc", "des ede3", "idea cbc", "seed cbc", 175 "rc2 cbc", "rc5-32/12 cbc", "blowfish cbc", "cast cbc", 176 "aes-128 cbc", "aes-192 cbc", "aes-256 cbc", 177 "camellia-128 cbc", "camellia-192 cbc", "camellia-256 cbc", 178 "evp", "sha256", "sha512", "whirlpool", 179 "aes-128 ige", "aes-192 ige", "aes-256 ige", "ghash", 180 "aes-128 gcm", "aes-256 gcm", "chacha20 poly1305", 181 }; 182 static double results[ALGOR_NUM][SIZE_NUM]; 183 static int lengths[SIZE_NUM] = {16, 64, 256, 1024, 8 * 1024}; 184 static double rsa_results[RSA_NUM][2]; 185 static double dsa_results[DSA_NUM][2]; 186 static double ecdsa_results[EC_NUM][2]; 187 static double ecdh_results[EC_NUM][1]; 188 189 static void sig_done(int sig); 190 191 static void 192 sig_done(int sig) 193 { 194 signal(SIGALRM, sig_done); 195 run = 0; 196 } 197 198 #define START 0 199 #define STOP 1 200 201 202 static double 203 Time_F(int s) 204 { 205 return app_tminterval(s, usertime); 206 } 207 208 209 static const int KDF1_SHA1_len = 20; 210 static void * 211 KDF1_SHA1(const void *in, size_t inlen, void *out, size_t * outlen) 212 { 213 #ifndef OPENSSL_NO_SHA 214 if (*outlen < SHA_DIGEST_LENGTH) 215 return NULL; 216 else 217 *outlen = SHA_DIGEST_LENGTH; 218 return SHA1(in, inlen, out); 219 #else 220 return NULL; 221 #endif /* OPENSSL_NO_SHA */ 222 } 223 224 int 225 speed_main(int argc, char **argv) 226 { 227 unsigned char *buf = NULL, *buf2 = NULL; 228 int mret = 1; 229 long count = 0, save_count = 0; 230 int i, j, k; 231 long rsa_count; 232 unsigned rsa_num; 233 unsigned char md[EVP_MAX_MD_SIZE]; 234 #ifndef OPENSSL_NO_MD4 235 unsigned char md4[MD4_DIGEST_LENGTH]; 236 #endif 237 #ifndef OPENSSL_NO_MD5 238 unsigned char md5[MD5_DIGEST_LENGTH]; 239 unsigned char hmac[MD5_DIGEST_LENGTH]; 240 #endif 241 #ifndef OPENSSL_NO_SHA 242 unsigned char sha[SHA_DIGEST_LENGTH]; 243 #ifndef OPENSSL_NO_SHA256 244 unsigned char sha256[SHA256_DIGEST_LENGTH]; 245 #endif 246 #ifndef OPENSSL_NO_SHA512 247 unsigned char sha512[SHA512_DIGEST_LENGTH]; 248 #endif 249 #endif 250 #ifndef OPENSSL_NO_WHIRLPOOL 251 unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH]; 252 #endif 253 #ifndef OPENSSL_NO_RIPEMD 254 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH]; 255 #endif 256 #ifndef OPENSSL_NO_RC4 257 RC4_KEY rc4_ks; 258 #endif 259 #ifndef OPENSSL_NO_RC2 260 RC2_KEY rc2_ks; 261 #endif 262 #ifndef OPENSSL_NO_IDEA 263 IDEA_KEY_SCHEDULE idea_ks; 264 #endif 265 #ifndef OPENSSL_NO_BF 266 BF_KEY bf_ks; 267 #endif 268 #ifndef OPENSSL_NO_CAST 269 CAST_KEY cast_ks; 270 #endif 271 static const unsigned char key16[16] = 272 {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 273 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12}; 274 #ifndef OPENSSL_NO_AES 275 static const unsigned char key24[24] = 276 {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 277 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 278 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34}; 279 static const unsigned char key32[32] = 280 {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 281 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 282 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 283 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56}; 284 #endif 285 #ifndef OPENSSL_NO_CAMELLIA 286 static const unsigned char ckey24[24] = 287 {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 288 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 289 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34}; 290 static const unsigned char ckey32[32] = 291 {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 292 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 293 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 294 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56}; 295 #endif 296 #ifndef OPENSSL_NO_AES 297 #define MAX_BLOCK_SIZE 128 298 #else 299 #define MAX_BLOCK_SIZE 64 300 #endif 301 unsigned char DES_iv[8]; 302 unsigned char iv[2 * MAX_BLOCK_SIZE / 8]; 303 #ifndef OPENSSL_NO_DES 304 static DES_cblock key = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0}; 305 static DES_cblock key2 = {0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12}; 306 static DES_cblock key3 = {0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34}; 307 DES_key_schedule sch; 308 DES_key_schedule sch2; 309 DES_key_schedule sch3; 310 #endif 311 #ifndef OPENSSL_NO_AES 312 AES_KEY aes_ks1, aes_ks2, aes_ks3; 313 #endif 314 #ifndef OPENSSL_NO_CAMELLIA 315 CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3; 316 #endif 317 #define D_MD2 0 318 #define D_MD4 1 319 #define D_MD5 2 320 #define D_HMAC 3 321 #define D_SHA1 4 322 #define D_RMD160 5 323 #define D_RC4 6 324 #define D_CBC_DES 7 325 #define D_EDE3_DES 8 326 #define D_CBC_IDEA 9 327 #define D_CBC_SEED 10 328 #define D_CBC_RC2 11 329 #define D_CBC_RC5 12 330 #define D_CBC_BF 13 331 #define D_CBC_CAST 14 332 #define D_CBC_128_AES 15 333 #define D_CBC_192_AES 16 334 #define D_CBC_256_AES 17 335 #define D_CBC_128_CML 18 336 #define D_CBC_192_CML 19 337 #define D_CBC_256_CML 20 338 #define D_EVP 21 339 #define D_SHA256 22 340 #define D_SHA512 23 341 #define D_WHIRLPOOL 24 342 #define D_IGE_128_AES 25 343 #define D_IGE_192_AES 26 344 #define D_IGE_256_AES 27 345 #define D_GHASH 28 346 #define D_AES_128_GCM 29 347 #define D_AES_256_GCM 30 348 #define D_CHACHA20_POLY1305 31 349 double d = 0.0; 350 long c[ALGOR_NUM][SIZE_NUM]; 351 #define R_DSA_512 0 352 #define R_DSA_1024 1 353 #define R_DSA_2048 2 354 #define R_RSA_512 0 355 #define R_RSA_1024 1 356 #define R_RSA_2048 2 357 #define R_RSA_4096 3 358 359 #define R_EC_P160 0 360 #define R_EC_P192 1 361 #define R_EC_P224 2 362 #define R_EC_P256 3 363 #define R_EC_P384 4 364 #define R_EC_P521 5 365 #define R_EC_K163 6 366 #define R_EC_K233 7 367 #define R_EC_K283 8 368 #define R_EC_K409 9 369 #define R_EC_K571 10 370 #define R_EC_B163 11 371 #define R_EC_B233 12 372 #define R_EC_B283 13 373 #define R_EC_B409 14 374 #define R_EC_B571 15 375 376 RSA *rsa_key[RSA_NUM]; 377 long rsa_c[RSA_NUM][2]; 378 static unsigned int rsa_bits[RSA_NUM] = {512, 1024, 2048, 4096}; 379 static unsigned char *rsa_data[RSA_NUM] = 380 {test512, test1024, test2048, test4096}; 381 static int rsa_data_length[RSA_NUM] = { 382 sizeof(test512), sizeof(test1024), 383 sizeof(test2048), sizeof(test4096)}; 384 DSA *dsa_key[DSA_NUM]; 385 long dsa_c[DSA_NUM][2]; 386 static unsigned int dsa_bits[DSA_NUM] = {512, 1024, 2048}; 387 #ifndef OPENSSL_NO_EC 388 /* 389 * We only test over the following curves as they are representative, 390 * To add tests over more curves, simply add the curve NID and curve 391 * name to the following arrays and increase the EC_NUM value 392 * accordingly. 393 */ 394 static unsigned int test_curves[EC_NUM] = 395 { 396 /* Prime Curves */ 397 NID_secp160r1, 398 NID_X9_62_prime192v1, 399 NID_secp224r1, 400 NID_X9_62_prime256v1, 401 NID_secp384r1, 402 NID_secp521r1, 403 /* Binary Curves */ 404 NID_sect163k1, 405 NID_sect233k1, 406 NID_sect283k1, 407 NID_sect409k1, 408 NID_sect571k1, 409 NID_sect163r2, 410 NID_sect233r1, 411 NID_sect283r1, 412 NID_sect409r1, 413 NID_sect571r1 414 }; 415 static const char *test_curves_names[EC_NUM] = 416 { 417 /* Prime Curves */ 418 "secp160r1", 419 "nistp192", 420 "nistp224", 421 "nistp256", 422 "nistp384", 423 "nistp521", 424 /* Binary Curves */ 425 "nistk163", 426 "nistk233", 427 "nistk283", 428 "nistk409", 429 "nistk571", 430 "nistb163", 431 "nistb233", 432 "nistb283", 433 "nistb409", 434 "nistb571" 435 }; 436 static int test_curves_bits[EC_NUM] = 437 { 438 160, 192, 224, 256, 384, 521, 439 163, 233, 283, 409, 571, 440 163, 233, 283, 409, 571 441 }; 442 443 #endif 444 445 unsigned char ecdsasig[256]; 446 unsigned int ecdsasiglen; 447 EC_KEY *ecdsa[EC_NUM]; 448 long ecdsa_c[EC_NUM][2]; 449 450 EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM]; 451 unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE]; 452 int secret_size_a, secret_size_b; 453 int ecdh_checks = 0; 454 int secret_idx = 0; 455 long ecdh_c[EC_NUM][2]; 456 457 int rsa_doit[RSA_NUM]; 458 int dsa_doit[DSA_NUM]; 459 int ecdsa_doit[EC_NUM]; 460 int ecdh_doit[EC_NUM]; 461 int doit[ALGOR_NUM]; 462 int pr_header = 0; 463 const EVP_CIPHER *evp_cipher = NULL; 464 const EVP_MD *evp_md = NULL; 465 int decrypt = 0; 466 int multi = 0; 467 const char *errstr = NULL; 468 469 if (single_execution) { 470 if (pledge("stdio proc", NULL) == -1) { 471 perror("pledge"); 472 exit(1); 473 } 474 } 475 476 usertime = -1; 477 478 memset(results, 0, sizeof(results)); 479 memset(dsa_key, 0, sizeof(dsa_key)); 480 for (i = 0; i < EC_NUM; i++) 481 ecdsa[i] = NULL; 482 for (i = 0; i < EC_NUM; i++) { 483 ecdh_a[i] = NULL; 484 ecdh_b[i] = NULL; 485 } 486 487 memset(rsa_key, 0, sizeof(rsa_key)); 488 for (i = 0; i < RSA_NUM; i++) 489 rsa_key[i] = NULL; 490 491 if ((buf = malloc(BUFSIZE)) == NULL) { 492 BIO_printf(bio_err, "out of memory\n"); 493 goto end; 494 } 495 if ((buf2 = malloc(BUFSIZE)) == NULL) { 496 BIO_printf(bio_err, "out of memory\n"); 497 goto end; 498 } 499 memset(c, 0, sizeof(c)); 500 memset(DES_iv, 0, sizeof(DES_iv)); 501 memset(iv, 0, sizeof(iv)); 502 503 for (i = 0; i < ALGOR_NUM; i++) 504 doit[i] = 0; 505 for (i = 0; i < RSA_NUM; i++) 506 rsa_doit[i] = 0; 507 for (i = 0; i < DSA_NUM; i++) 508 dsa_doit[i] = 0; 509 for (i = 0; i < EC_NUM; i++) 510 ecdsa_doit[i] = 0; 511 for (i = 0; i < EC_NUM; i++) 512 ecdh_doit[i] = 0; 513 514 515 j = 0; 516 argc--; 517 argv++; 518 while (argc) { 519 if ((argc > 0) && (strcmp(*argv, "-elapsed") == 0)) { 520 usertime = 0; 521 j--; /* Otherwise, -elapsed gets confused with an 522 * algorithm. */ 523 } else if ((argc > 0) && (strcmp(*argv, "-evp") == 0)) { 524 argc--; 525 argv++; 526 if (argc == 0) { 527 BIO_printf(bio_err, "no EVP given\n"); 528 goto end; 529 } 530 evp_cipher = EVP_get_cipherbyname(*argv); 531 if (!evp_cipher) { 532 evp_md = EVP_get_digestbyname(*argv); 533 } 534 if (!evp_cipher && !evp_md) { 535 BIO_printf(bio_err, "%s is an unknown cipher or digest\n", *argv); 536 goto end; 537 } 538 doit[D_EVP] = 1; 539 } else if (argc > 0 && !strcmp(*argv, "-decrypt")) { 540 decrypt = 1; 541 j--; /* Otherwise, -elapsed gets confused with an 542 * algorithm. */ 543 } 544 else if ((argc > 0) && (strcmp(*argv, "-multi") == 0)) { 545 argc--; 546 argv++; 547 if (argc == 0) { 548 BIO_printf(bio_err, "no multi count given\n"); 549 goto end; 550 } 551 multi = strtonum(argv[0], 1, INT_MAX, &errstr); 552 if (errstr) { 553 BIO_printf(bio_err, "bad multi count: %s", errstr); 554 goto end; 555 } 556 j--; /* Otherwise, -mr gets confused with an 557 * algorithm. */ 558 } 559 else if (argc > 0 && !strcmp(*argv, "-mr")) { 560 mr = 1; 561 j--; /* Otherwise, -mr gets confused with an 562 * algorithm. */ 563 } else 564 #ifndef OPENSSL_NO_MD4 565 if (strcmp(*argv, "md4") == 0) 566 doit[D_MD4] = 1; 567 else 568 #endif 569 #ifndef OPENSSL_NO_MD5 570 if (strcmp(*argv, "md5") == 0) 571 doit[D_MD5] = 1; 572 else 573 #endif 574 #ifndef OPENSSL_NO_MD5 575 if (strcmp(*argv, "hmac") == 0) 576 doit[D_HMAC] = 1; 577 else 578 #endif 579 #ifndef OPENSSL_NO_SHA 580 if (strcmp(*argv, "sha1") == 0) 581 doit[D_SHA1] = 1; 582 else if (strcmp(*argv, "sha") == 0) 583 doit[D_SHA1] = 1, 584 doit[D_SHA256] = 1, 585 doit[D_SHA512] = 1; 586 else 587 #ifndef OPENSSL_NO_SHA256 588 if (strcmp(*argv, "sha256") == 0) 589 doit[D_SHA256] = 1; 590 else 591 #endif 592 #ifndef OPENSSL_NO_SHA512 593 if (strcmp(*argv, "sha512") == 0) 594 doit[D_SHA512] = 1; 595 else 596 #endif 597 #endif 598 #ifndef OPENSSL_NO_WHIRLPOOL 599 if (strcmp(*argv, "whirlpool") == 0) 600 doit[D_WHIRLPOOL] = 1; 601 else 602 #endif 603 #ifndef OPENSSL_NO_RIPEMD 604 if (strcmp(*argv, "ripemd") == 0) 605 doit[D_RMD160] = 1; 606 else if (strcmp(*argv, "rmd160") == 0) 607 doit[D_RMD160] = 1; 608 else if (strcmp(*argv, "ripemd160") == 0) 609 doit[D_RMD160] = 1; 610 else 611 #endif 612 #ifndef OPENSSL_NO_RC4 613 if (strcmp(*argv, "rc4") == 0) 614 doit[D_RC4] = 1; 615 else 616 #endif 617 #ifndef OPENSSL_NO_DES 618 if (strcmp(*argv, "des-cbc") == 0) 619 doit[D_CBC_DES] = 1; 620 else if (strcmp(*argv, "des-ede3") == 0) 621 doit[D_EDE3_DES] = 1; 622 else 623 #endif 624 #ifndef OPENSSL_NO_AES 625 if (strcmp(*argv, "aes-128-cbc") == 0) 626 doit[D_CBC_128_AES] = 1; 627 else if (strcmp(*argv, "aes-192-cbc") == 0) 628 doit[D_CBC_192_AES] = 1; 629 else if (strcmp(*argv, "aes-256-cbc") == 0) 630 doit[D_CBC_256_AES] = 1; 631 else if (strcmp(*argv, "aes-128-ige") == 0) 632 doit[D_IGE_128_AES] = 1; 633 else if (strcmp(*argv, "aes-192-ige") == 0) 634 doit[D_IGE_192_AES] = 1; 635 else if (strcmp(*argv, "aes-256-ige") == 0) 636 doit[D_IGE_256_AES] = 1; 637 else 638 #endif 639 #ifndef OPENSSL_NO_CAMELLIA 640 if (strcmp(*argv, "camellia-128-cbc") == 0) 641 doit[D_CBC_128_CML] = 1; 642 else if (strcmp(*argv, "camellia-192-cbc") == 0) 643 doit[D_CBC_192_CML] = 1; 644 else if (strcmp(*argv, "camellia-256-cbc") == 0) 645 doit[D_CBC_256_CML] = 1; 646 else 647 #endif 648 #ifndef RSA_NULL 649 if (strcmp(*argv, "openssl") == 0) { 650 RSA_set_default_method(RSA_PKCS1_SSLeay()); 651 j--; 652 } else 653 #endif 654 if (strcmp(*argv, "dsa512") == 0) 655 dsa_doit[R_DSA_512] = 2; 656 else if (strcmp(*argv, "dsa1024") == 0) 657 dsa_doit[R_DSA_1024] = 2; 658 else if (strcmp(*argv, "dsa2048") == 0) 659 dsa_doit[R_DSA_2048] = 2; 660 else if (strcmp(*argv, "rsa512") == 0) 661 rsa_doit[R_RSA_512] = 2; 662 else if (strcmp(*argv, "rsa1024") == 0) 663 rsa_doit[R_RSA_1024] = 2; 664 else if (strcmp(*argv, "rsa2048") == 0) 665 rsa_doit[R_RSA_2048] = 2; 666 else if (strcmp(*argv, "rsa4096") == 0) 667 rsa_doit[R_RSA_4096] = 2; 668 else 669 #ifndef OPENSSL_NO_RC2 670 if (strcmp(*argv, "rc2-cbc") == 0) 671 doit[D_CBC_RC2] = 1; 672 else if (strcmp(*argv, "rc2") == 0) 673 doit[D_CBC_RC2] = 1; 674 else 675 #endif 676 #ifndef OPENSSL_NO_IDEA 677 if (strcmp(*argv, "idea-cbc") == 0) 678 doit[D_CBC_IDEA] = 1; 679 else if (strcmp(*argv, "idea") == 0) 680 doit[D_CBC_IDEA] = 1; 681 else 682 #endif 683 #ifndef OPENSSL_NO_BF 684 if (strcmp(*argv, "bf-cbc") == 0) 685 doit[D_CBC_BF] = 1; 686 else if (strcmp(*argv, "blowfish") == 0) 687 doit[D_CBC_BF] = 1; 688 else if (strcmp(*argv, "bf") == 0) 689 doit[D_CBC_BF] = 1; 690 else 691 #endif 692 #ifndef OPENSSL_NO_CAST 693 if (strcmp(*argv, "cast-cbc") == 0) 694 doit[D_CBC_CAST] = 1; 695 else if (strcmp(*argv, "cast") == 0) 696 doit[D_CBC_CAST] = 1; 697 else if (strcmp(*argv, "cast5") == 0) 698 doit[D_CBC_CAST] = 1; 699 else 700 #endif 701 #ifndef OPENSSL_NO_DES 702 if (strcmp(*argv, "des") == 0) { 703 doit[D_CBC_DES] = 1; 704 doit[D_EDE3_DES] = 1; 705 } else 706 #endif 707 #ifndef OPENSSL_NO_AES 708 if (strcmp(*argv, "aes") == 0) { 709 doit[D_CBC_128_AES] = 1; 710 doit[D_CBC_192_AES] = 1; 711 doit[D_CBC_256_AES] = 1; 712 } else if (strcmp(*argv, "ghash") == 0) 713 doit[D_GHASH] = 1; 714 else if (strcmp(*argv,"aes-128-gcm") == 0) 715 doit[D_AES_128_GCM]=1; 716 else if (strcmp(*argv,"aes-256-gcm") == 0) 717 doit[D_AES_256_GCM]=1; 718 else 719 #endif 720 #ifndef OPENSSL_NO_CAMELLIA 721 if (strcmp(*argv, "camellia") == 0) { 722 doit[D_CBC_128_CML] = 1; 723 doit[D_CBC_192_CML] = 1; 724 doit[D_CBC_256_CML] = 1; 725 } else 726 #endif 727 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305) 728 if (strcmp(*argv,"chacha20-poly1305") == 0) 729 doit[D_CHACHA20_POLY1305]=1; 730 else 731 #endif 732 if (strcmp(*argv, "rsa") == 0) { 733 rsa_doit[R_RSA_512] = 1; 734 rsa_doit[R_RSA_1024] = 1; 735 rsa_doit[R_RSA_2048] = 1; 736 rsa_doit[R_RSA_4096] = 1; 737 } else 738 if (strcmp(*argv, "dsa") == 0) { 739 dsa_doit[R_DSA_512] = 1; 740 dsa_doit[R_DSA_1024] = 1; 741 dsa_doit[R_DSA_2048] = 1; 742 } else 743 if (strcmp(*argv, "ecdsap160") == 0) 744 ecdsa_doit[R_EC_P160] = 2; 745 else if (strcmp(*argv, "ecdsap192") == 0) 746 ecdsa_doit[R_EC_P192] = 2; 747 else if (strcmp(*argv, "ecdsap224") == 0) 748 ecdsa_doit[R_EC_P224] = 2; 749 else if (strcmp(*argv, "ecdsap256") == 0) 750 ecdsa_doit[R_EC_P256] = 2; 751 else if (strcmp(*argv, "ecdsap384") == 0) 752 ecdsa_doit[R_EC_P384] = 2; 753 else if (strcmp(*argv, "ecdsap521") == 0) 754 ecdsa_doit[R_EC_P521] = 2; 755 else if (strcmp(*argv, "ecdsak163") == 0) 756 ecdsa_doit[R_EC_K163] = 2; 757 else if (strcmp(*argv, "ecdsak233") == 0) 758 ecdsa_doit[R_EC_K233] = 2; 759 else if (strcmp(*argv, "ecdsak283") == 0) 760 ecdsa_doit[R_EC_K283] = 2; 761 else if (strcmp(*argv, "ecdsak409") == 0) 762 ecdsa_doit[R_EC_K409] = 2; 763 else if (strcmp(*argv, "ecdsak571") == 0) 764 ecdsa_doit[R_EC_K571] = 2; 765 else if (strcmp(*argv, "ecdsab163") == 0) 766 ecdsa_doit[R_EC_B163] = 2; 767 else if (strcmp(*argv, "ecdsab233") == 0) 768 ecdsa_doit[R_EC_B233] = 2; 769 else if (strcmp(*argv, "ecdsab283") == 0) 770 ecdsa_doit[R_EC_B283] = 2; 771 else if (strcmp(*argv, "ecdsab409") == 0) 772 ecdsa_doit[R_EC_B409] = 2; 773 else if (strcmp(*argv, "ecdsab571") == 0) 774 ecdsa_doit[R_EC_B571] = 2; 775 else if (strcmp(*argv, "ecdsa") == 0) { 776 for (i = 0; i < EC_NUM; i++) 777 ecdsa_doit[i] = 1; 778 } else 779 if (strcmp(*argv, "ecdhp160") == 0) 780 ecdh_doit[R_EC_P160] = 2; 781 else if (strcmp(*argv, "ecdhp192") == 0) 782 ecdh_doit[R_EC_P192] = 2; 783 else if (strcmp(*argv, "ecdhp224") == 0) 784 ecdh_doit[R_EC_P224] = 2; 785 else if (strcmp(*argv, "ecdhp256") == 0) 786 ecdh_doit[R_EC_P256] = 2; 787 else if (strcmp(*argv, "ecdhp384") == 0) 788 ecdh_doit[R_EC_P384] = 2; 789 else if (strcmp(*argv, "ecdhp521") == 0) 790 ecdh_doit[R_EC_P521] = 2; 791 else if (strcmp(*argv, "ecdhk163") == 0) 792 ecdh_doit[R_EC_K163] = 2; 793 else if (strcmp(*argv, "ecdhk233") == 0) 794 ecdh_doit[R_EC_K233] = 2; 795 else if (strcmp(*argv, "ecdhk283") == 0) 796 ecdh_doit[R_EC_K283] = 2; 797 else if (strcmp(*argv, "ecdhk409") == 0) 798 ecdh_doit[R_EC_K409] = 2; 799 else if (strcmp(*argv, "ecdhk571") == 0) 800 ecdh_doit[R_EC_K571] = 2; 801 else if (strcmp(*argv, "ecdhb163") == 0) 802 ecdh_doit[R_EC_B163] = 2; 803 else if (strcmp(*argv, "ecdhb233") == 0) 804 ecdh_doit[R_EC_B233] = 2; 805 else if (strcmp(*argv, "ecdhb283") == 0) 806 ecdh_doit[R_EC_B283] = 2; 807 else if (strcmp(*argv, "ecdhb409") == 0) 808 ecdh_doit[R_EC_B409] = 2; 809 else if (strcmp(*argv, "ecdhb571") == 0) 810 ecdh_doit[R_EC_B571] = 2; 811 else if (strcmp(*argv, "ecdh") == 0) { 812 for (i = 0; i < EC_NUM; i++) 813 ecdh_doit[i] = 1; 814 } else 815 { 816 BIO_printf(bio_err, "Error: bad option or value\n"); 817 BIO_printf(bio_err, "\n"); 818 BIO_printf(bio_err, "Available values:\n"); 819 #ifndef OPENSSL_NO_MD4 820 BIO_printf(bio_err, "md4 "); 821 #endif 822 #ifndef OPENSSL_NO_MD5 823 BIO_printf(bio_err, "md5 "); 824 #ifndef OPENSSL_NO_HMAC 825 BIO_printf(bio_err, "hmac "); 826 #endif 827 #endif 828 #ifndef OPENSSL_NO_SHA1 829 BIO_printf(bio_err, "sha1 "); 830 #endif 831 #ifndef OPENSSL_NO_SHA256 832 BIO_printf(bio_err, "sha256 "); 833 #endif 834 #ifndef OPENSSL_NO_SHA512 835 BIO_printf(bio_err, "sha512 "); 836 #endif 837 #ifndef OPENSSL_NO_WHIRLPOOL 838 BIO_printf(bio_err, "whirlpool"); 839 #endif 840 #ifndef OPENSSL_NO_RIPEMD160 841 BIO_printf(bio_err, "rmd160"); 842 #endif 843 #if !defined(OPENSSL_NO_MD2) || \ 844 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \ 845 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160) || \ 846 !defined(OPENSSL_NO_WHIRLPOOL) 847 BIO_printf(bio_err, "\n"); 848 #endif 849 850 #ifndef OPENSSL_NO_IDEA 851 BIO_printf(bio_err, "idea-cbc "); 852 #endif 853 #ifndef OPENSSL_NO_RC2 854 BIO_printf(bio_err, "rc2-cbc "); 855 #endif 856 #ifndef OPENSSL_NO_BF 857 BIO_printf(bio_err, "bf-cbc "); 858 #endif 859 #ifndef OPENSSL_NO_DES 860 BIO_printf(bio_err, "des-cbc des-ede3\n"); 861 #endif 862 #ifndef OPENSSL_NO_AES 863 BIO_printf(bio_err, "aes-128-cbc aes-192-cbc aes-256-cbc "); 864 BIO_printf(bio_err, "aes-128-ige aes-192-ige aes-256-ige\n"); 865 BIO_printf(bio_err, "aes-128-gcm aes-256-gcm "); 866 #endif 867 #ifndef OPENSSL_NO_CAMELLIA 868 BIO_printf(bio_err, "\n"); 869 BIO_printf(bio_err, "camellia-128-cbc camellia-192-cbc camellia-256-cbc "); 870 #endif 871 #ifndef OPENSSL_NO_RC4 872 BIO_printf(bio_err, "rc4"); 873 #endif 874 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305) 875 BIO_printf(bio_err," chacha20-poly1305"); 876 #endif 877 BIO_printf(bio_err, "\n"); 878 879 BIO_printf(bio_err, "rsa512 rsa1024 rsa2048 rsa4096\n"); 880 881 BIO_printf(bio_err, "dsa512 dsa1024 dsa2048\n"); 882 BIO_printf(bio_err, "ecdsap160 ecdsap192 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n"); 883 BIO_printf(bio_err, "ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n"); 884 BIO_printf(bio_err, "ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571 ecdsa\n"); 885 BIO_printf(bio_err, "ecdhp160 ecdhp192 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n"); 886 BIO_printf(bio_err, "ecdhk163 ecdhk233 ecdhk283 ecdhk409 ecdhk571\n"); 887 BIO_printf(bio_err, "ecdhb163 ecdhb233 ecdhb283 ecdhb409 ecdhb571 ecdh\n"); 888 889 #ifndef OPENSSL_NO_IDEA 890 BIO_printf(bio_err, "idea "); 891 #endif 892 #ifndef OPENSSL_NO_RC2 893 BIO_printf(bio_err, "rc2 "); 894 #endif 895 #ifndef OPENSSL_NO_DES 896 BIO_printf(bio_err, "des "); 897 #endif 898 #ifndef OPENSSL_NO_AES 899 BIO_printf(bio_err, "aes "); 900 #endif 901 #ifndef OPENSSL_NO_CAMELLIA 902 BIO_printf(bio_err, "camellia "); 903 #endif 904 BIO_printf(bio_err, "rsa "); 905 #ifndef OPENSSL_NO_BF 906 BIO_printf(bio_err, "blowfish"); 907 #endif 908 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_SEED) || \ 909 !defined(OPENSSL_NO_RC2) || !defined(OPENSSL_NO_DES) || \ 910 !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_BF) || \ 911 !defined(OPENSSL_NO_AES) || !defined(OPENSSL_NO_CAMELLIA) 912 BIO_printf(bio_err, "\n"); 913 #endif 914 915 BIO_printf(bio_err, "\n"); 916 BIO_printf(bio_err, "Available options:\n"); 917 BIO_printf(bio_err, "-elapsed measure time in real time instead of CPU user time.\n"); 918 BIO_printf(bio_err, "-evp e use EVP e.\n"); 919 BIO_printf(bio_err, "-decrypt time decryption instead of encryption (only EVP).\n"); 920 BIO_printf(bio_err, "-mr produce machine readable output.\n"); 921 BIO_printf(bio_err, "-multi n run n benchmarks in parallel.\n"); 922 goto end; 923 } 924 argc--; 925 argv++; 926 j++; 927 } 928 929 if (multi && do_multi(multi)) 930 goto show_res; 931 932 if (j == 0) { 933 for (i = 0; i < ALGOR_NUM; i++) { 934 if (i != D_EVP) 935 doit[i] = 1; 936 } 937 for (i = 0; i < RSA_NUM; i++) 938 rsa_doit[i] = 1; 939 for (i = 0; i < DSA_NUM; i++) 940 dsa_doit[i] = 1; 941 for (i = 0; i < EC_NUM; i++) 942 ecdsa_doit[i] = 1; 943 for (i = 0; i < EC_NUM; i++) 944 ecdh_doit[i] = 1; 945 } 946 for (i = 0; i < ALGOR_NUM; i++) 947 if (doit[i]) 948 pr_header++; 949 950 if (usertime == 0 && !mr) 951 BIO_printf(bio_err, "You have chosen to measure elapsed time instead of user CPU time.\n"); 952 953 for (i = 0; i < RSA_NUM; i++) { 954 const unsigned char *p; 955 956 p = rsa_data[i]; 957 rsa_key[i] = d2i_RSAPrivateKey(NULL, &p, rsa_data_length[i]); 958 if (rsa_key[i] == NULL) { 959 BIO_printf(bio_err, "internal error loading RSA key number %d\n", i); 960 goto end; 961 } 962 } 963 964 dsa_key[0] = get_dsa512(); 965 dsa_key[1] = get_dsa1024(); 966 dsa_key[2] = get_dsa2048(); 967 968 #ifndef OPENSSL_NO_DES 969 DES_set_key_unchecked(&key, &sch); 970 DES_set_key_unchecked(&key2, &sch2); 971 DES_set_key_unchecked(&key3, &sch3); 972 #endif 973 #ifndef OPENSSL_NO_AES 974 AES_set_encrypt_key(key16, 128, &aes_ks1); 975 AES_set_encrypt_key(key24, 192, &aes_ks2); 976 AES_set_encrypt_key(key32, 256, &aes_ks3); 977 #endif 978 #ifndef OPENSSL_NO_CAMELLIA 979 Camellia_set_key(key16, 128, &camellia_ks1); 980 Camellia_set_key(ckey24, 192, &camellia_ks2); 981 Camellia_set_key(ckey32, 256, &camellia_ks3); 982 #endif 983 #ifndef OPENSSL_NO_IDEA 984 idea_set_encrypt_key(key16, &idea_ks); 985 #endif 986 #ifndef OPENSSL_NO_RC4 987 RC4_set_key(&rc4_ks, 16, key16); 988 #endif 989 #ifndef OPENSSL_NO_RC2 990 RC2_set_key(&rc2_ks, 16, key16, 128); 991 #endif 992 #ifndef OPENSSL_NO_BF 993 BF_set_key(&bf_ks, 16, key16); 994 #endif 995 #ifndef OPENSSL_NO_CAST 996 CAST_set_key(&cast_ks, 16, key16); 997 #endif 998 memset(rsa_c, 0, sizeof(rsa_c)); 999 #define COND(c) (run && count<0x7fffffff) 1000 #define COUNT(d) (count) 1001 signal(SIGALRM, sig_done); 1002 1003 #ifndef OPENSSL_NO_MD4 1004 if (doit[D_MD4]) { 1005 for (j = 0; j < SIZE_NUM; j++) { 1006 print_message(names[D_MD4], c[D_MD4][j], lengths[j]); 1007 Time_F(START); 1008 for (count = 0, run = 1; COND(c[D_MD4][j]); count++) 1009 EVP_Digest(&(buf[0]), (unsigned long) lengths[j], &(md4[0]), NULL, EVP_md4(), NULL); 1010 d = Time_F(STOP); 1011 print_result(D_MD4, j, count, d); 1012 } 1013 } 1014 #endif 1015 1016 #ifndef OPENSSL_NO_MD5 1017 if (doit[D_MD5]) { 1018 for (j = 0; j < SIZE_NUM; j++) { 1019 print_message(names[D_MD5], c[D_MD5][j], lengths[j]); 1020 Time_F(START); 1021 for (count = 0, run = 1; COND(c[D_MD5][j]); count++) 1022 EVP_Digest(&(buf[0]), (unsigned long) lengths[j], &(md5[0]), NULL, EVP_get_digestbyname("md5"), NULL); 1023 d = Time_F(STOP); 1024 print_result(D_MD5, j, count, d); 1025 } 1026 } 1027 #endif 1028 1029 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC) 1030 if (doit[D_HMAC]) { 1031 HMAC_CTX hctx; 1032 1033 HMAC_CTX_init(&hctx); 1034 HMAC_Init_ex(&hctx, (unsigned char *) "This is a key...", 1035 16, EVP_md5(), NULL); 1036 1037 for (j = 0; j < SIZE_NUM; j++) { 1038 print_message(names[D_HMAC], c[D_HMAC][j], lengths[j]); 1039 Time_F(START); 1040 for (count = 0, run = 1; COND(c[D_HMAC][j]); count++) { 1041 HMAC_Init_ex(&hctx, NULL, 0, NULL, NULL); 1042 HMAC_Update(&hctx, buf, lengths[j]); 1043 HMAC_Final(&hctx, &(hmac[0]), NULL); 1044 } 1045 d = Time_F(STOP); 1046 print_result(D_HMAC, j, count, d); 1047 } 1048 HMAC_CTX_cleanup(&hctx); 1049 } 1050 #endif 1051 #ifndef OPENSSL_NO_SHA 1052 if (doit[D_SHA1]) { 1053 for (j = 0; j < SIZE_NUM; j++) { 1054 print_message(names[D_SHA1], c[D_SHA1][j], lengths[j]); 1055 Time_F(START); 1056 for (count = 0, run = 1; COND(c[D_SHA1][j]); count++) 1057 EVP_Digest(buf, (unsigned long) lengths[j], &(sha[0]), NULL, EVP_sha1(), NULL); 1058 d = Time_F(STOP); 1059 print_result(D_SHA1, j, count, d); 1060 } 1061 } 1062 #ifndef OPENSSL_NO_SHA256 1063 if (doit[D_SHA256]) { 1064 for (j = 0; j < SIZE_NUM; j++) { 1065 print_message(names[D_SHA256], c[D_SHA256][j], lengths[j]); 1066 Time_F(START); 1067 for (count = 0, run = 1; COND(c[D_SHA256][j]); count++) 1068 SHA256(buf, lengths[j], sha256); 1069 d = Time_F(STOP); 1070 print_result(D_SHA256, j, count, d); 1071 } 1072 } 1073 #endif 1074 1075 #ifndef OPENSSL_NO_SHA512 1076 if (doit[D_SHA512]) { 1077 for (j = 0; j < SIZE_NUM; j++) { 1078 print_message(names[D_SHA512], c[D_SHA512][j], lengths[j]); 1079 Time_F(START); 1080 for (count = 0, run = 1; COND(c[D_SHA512][j]); count++) 1081 SHA512(buf, lengths[j], sha512); 1082 d = Time_F(STOP); 1083 print_result(D_SHA512, j, count, d); 1084 } 1085 } 1086 #endif 1087 #endif 1088 1089 #ifndef OPENSSL_NO_WHIRLPOOL 1090 if (doit[D_WHIRLPOOL]) { 1091 for (j = 0; j < SIZE_NUM; j++) { 1092 print_message(names[D_WHIRLPOOL], c[D_WHIRLPOOL][j], lengths[j]); 1093 Time_F(START); 1094 for (count = 0, run = 1; COND(c[D_WHIRLPOOL][j]); count++) 1095 WHIRLPOOL(buf, lengths[j], whirlpool); 1096 d = Time_F(STOP); 1097 print_result(D_WHIRLPOOL, j, count, d); 1098 } 1099 } 1100 #endif 1101 1102 #ifndef OPENSSL_NO_RIPEMD 1103 if (doit[D_RMD160]) { 1104 for (j = 0; j < SIZE_NUM; j++) { 1105 print_message(names[D_RMD160], c[D_RMD160][j], lengths[j]); 1106 Time_F(START); 1107 for (count = 0, run = 1; COND(c[D_RMD160][j]); count++) 1108 EVP_Digest(buf, (unsigned long) lengths[j], &(rmd160[0]), NULL, EVP_ripemd160(), NULL); 1109 d = Time_F(STOP); 1110 print_result(D_RMD160, j, count, d); 1111 } 1112 } 1113 #endif 1114 #ifndef OPENSSL_NO_RC4 1115 if (doit[D_RC4]) { 1116 for (j = 0; j < SIZE_NUM; j++) { 1117 print_message(names[D_RC4], c[D_RC4][j], lengths[j]); 1118 Time_F(START); 1119 for (count = 0, run = 1; COND(c[D_RC4][j]); count++) 1120 RC4(&rc4_ks, (unsigned int) lengths[j], 1121 buf, buf); 1122 d = Time_F(STOP); 1123 print_result(D_RC4, j, count, d); 1124 } 1125 } 1126 #endif 1127 #ifndef OPENSSL_NO_DES 1128 if (doit[D_CBC_DES]) { 1129 for (j = 0; j < SIZE_NUM; j++) { 1130 print_message(names[D_CBC_DES], c[D_CBC_DES][j], lengths[j]); 1131 Time_F(START); 1132 for (count = 0, run = 1; COND(c[D_CBC_DES][j]); count++) 1133 DES_ncbc_encrypt(buf, buf, lengths[j], &sch, 1134 &DES_iv, DES_ENCRYPT); 1135 d = Time_F(STOP); 1136 print_result(D_CBC_DES, j, count, d); 1137 } 1138 } 1139 if (doit[D_EDE3_DES]) { 1140 for (j = 0; j < SIZE_NUM; j++) { 1141 print_message(names[D_EDE3_DES], c[D_EDE3_DES][j], lengths[j]); 1142 Time_F(START); 1143 for (count = 0, run = 1; COND(c[D_EDE3_DES][j]); count++) 1144 DES_ede3_cbc_encrypt(buf, buf, lengths[j], 1145 &sch, &sch2, &sch3, 1146 &DES_iv, DES_ENCRYPT); 1147 d = Time_F(STOP); 1148 print_result(D_EDE3_DES, j, count, d); 1149 } 1150 } 1151 #endif 1152 #ifndef OPENSSL_NO_AES 1153 if (doit[D_CBC_128_AES]) { 1154 for (j = 0; j < SIZE_NUM; j++) { 1155 print_message(names[D_CBC_128_AES], c[D_CBC_128_AES][j], lengths[j]); 1156 Time_F(START); 1157 for (count = 0, run = 1; COND(c[D_CBC_128_AES][j]); count++) 1158 AES_cbc_encrypt(buf, buf, 1159 (unsigned long) lengths[j], &aes_ks1, 1160 iv, AES_ENCRYPT); 1161 d = Time_F(STOP); 1162 print_result(D_CBC_128_AES, j, count, d); 1163 } 1164 } 1165 if (doit[D_CBC_192_AES]) { 1166 for (j = 0; j < SIZE_NUM; j++) { 1167 print_message(names[D_CBC_192_AES], c[D_CBC_192_AES][j], lengths[j]); 1168 Time_F(START); 1169 for (count = 0, run = 1; COND(c[D_CBC_192_AES][j]); count++) 1170 AES_cbc_encrypt(buf, buf, 1171 (unsigned long) lengths[j], &aes_ks2, 1172 iv, AES_ENCRYPT); 1173 d = Time_F(STOP); 1174 print_result(D_CBC_192_AES, j, count, d); 1175 } 1176 } 1177 if (doit[D_CBC_256_AES]) { 1178 for (j = 0; j < SIZE_NUM; j++) { 1179 print_message(names[D_CBC_256_AES], c[D_CBC_256_AES][j], lengths[j]); 1180 Time_F(START); 1181 for (count = 0, run = 1; COND(c[D_CBC_256_AES][j]); count++) 1182 AES_cbc_encrypt(buf, buf, 1183 (unsigned long) lengths[j], &aes_ks3, 1184 iv, AES_ENCRYPT); 1185 d = Time_F(STOP); 1186 print_result(D_CBC_256_AES, j, count, d); 1187 } 1188 } 1189 if (doit[D_IGE_128_AES]) { 1190 for (j = 0; j < SIZE_NUM; j++) { 1191 print_message(names[D_IGE_128_AES], c[D_IGE_128_AES][j], lengths[j]); 1192 Time_F(START); 1193 for (count = 0, run = 1; COND(c[D_IGE_128_AES][j]); count++) 1194 AES_ige_encrypt(buf, buf2, 1195 (unsigned long) lengths[j], &aes_ks1, 1196 iv, AES_ENCRYPT); 1197 d = Time_F(STOP); 1198 print_result(D_IGE_128_AES, j, count, d); 1199 } 1200 } 1201 if (doit[D_IGE_192_AES]) { 1202 for (j = 0; j < SIZE_NUM; j++) { 1203 print_message(names[D_IGE_192_AES], c[D_IGE_192_AES][j], lengths[j]); 1204 Time_F(START); 1205 for (count = 0, run = 1; COND(c[D_IGE_192_AES][j]); count++) 1206 AES_ige_encrypt(buf, buf2, 1207 (unsigned long) lengths[j], &aes_ks2, 1208 iv, AES_ENCRYPT); 1209 d = Time_F(STOP); 1210 print_result(D_IGE_192_AES, j, count, d); 1211 } 1212 } 1213 if (doit[D_IGE_256_AES]) { 1214 for (j = 0; j < SIZE_NUM; j++) { 1215 print_message(names[D_IGE_256_AES], c[D_IGE_256_AES][j], lengths[j]); 1216 Time_F(START); 1217 for (count = 0, run = 1; COND(c[D_IGE_256_AES][j]); count++) 1218 AES_ige_encrypt(buf, buf2, 1219 (unsigned long) lengths[j], &aes_ks3, 1220 iv, AES_ENCRYPT); 1221 d = Time_F(STOP); 1222 print_result(D_IGE_256_AES, j, count, d); 1223 } 1224 } 1225 if (doit[D_GHASH]) { 1226 GCM128_CONTEXT *ctx = CRYPTO_gcm128_new(&aes_ks1, (block128_f) AES_encrypt); 1227 CRYPTO_gcm128_setiv(ctx, (unsigned char *) "0123456789ab", 12); 1228 1229 for (j = 0; j < SIZE_NUM; j++) { 1230 print_message(names[D_GHASH], c[D_GHASH][j], lengths[j]); 1231 Time_F(START); 1232 for (count = 0, run = 1; COND(c[D_GHASH][j]); count++) 1233 CRYPTO_gcm128_aad(ctx, buf, lengths[j]); 1234 d = Time_F(STOP); 1235 print_result(D_GHASH, j, count, d); 1236 } 1237 CRYPTO_gcm128_release(ctx); 1238 } 1239 if (doit[D_AES_128_GCM]) { 1240 const EVP_AEAD *aead = EVP_aead_aes_128_gcm(); 1241 static const unsigned char nonce[32] = {0}; 1242 size_t buf_len, nonce_len; 1243 EVP_AEAD_CTX ctx; 1244 1245 EVP_AEAD_CTX_init(&ctx, aead, key32, EVP_AEAD_key_length(aead), 1246 EVP_AEAD_DEFAULT_TAG_LENGTH, NULL); 1247 nonce_len = EVP_AEAD_nonce_length(aead); 1248 1249 for (j = 0; j < SIZE_NUM; j++) { 1250 print_message(names[D_AES_128_GCM],c[D_AES_128_GCM][j],lengths[j]); 1251 Time_F(START); 1252 for (count = 0, run = 1; COND(c[D_AES_128_GCM][j]); count++) 1253 EVP_AEAD_CTX_seal(&ctx, buf, &buf_len, BUFSIZE, nonce, 1254 nonce_len, buf, lengths[j], NULL, 0); 1255 d=Time_F(STOP); 1256 print_result(D_AES_128_GCM,j,count,d); 1257 } 1258 EVP_AEAD_CTX_cleanup(&ctx); 1259 } 1260 1261 if (doit[D_AES_256_GCM]) { 1262 const EVP_AEAD *aead = EVP_aead_aes_256_gcm(); 1263 static const unsigned char nonce[32] = {0}; 1264 size_t buf_len, nonce_len; 1265 EVP_AEAD_CTX ctx; 1266 1267 EVP_AEAD_CTX_init(&ctx, aead, key32, EVP_AEAD_key_length(aead), 1268 EVP_AEAD_DEFAULT_TAG_LENGTH, NULL); 1269 nonce_len = EVP_AEAD_nonce_length(aead); 1270 1271 for (j = 0; j < SIZE_NUM; j++) { 1272 print_message(names[D_AES_256_GCM],c[D_AES_256_GCM][j],lengths[j]); 1273 Time_F(START); 1274 for (count = 0, run = 1; COND(c[D_AES_256_GCM][j]); count++) 1275 EVP_AEAD_CTX_seal(&ctx, buf, &buf_len, BUFSIZE, nonce, 1276 nonce_len, buf, lengths[j], NULL, 0); 1277 d=Time_F(STOP); 1278 print_result(D_AES_256_GCM, j, count, d); 1279 } 1280 EVP_AEAD_CTX_cleanup(&ctx); 1281 } 1282 #endif 1283 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305) 1284 if (doit[D_CHACHA20_POLY1305]) { 1285 const EVP_AEAD *aead = EVP_aead_chacha20_poly1305(); 1286 static const unsigned char nonce[32] = {0}; 1287 size_t buf_len, nonce_len; 1288 EVP_AEAD_CTX ctx; 1289 1290 EVP_AEAD_CTX_init(&ctx, aead, key32, EVP_AEAD_key_length(aead), 1291 EVP_AEAD_DEFAULT_TAG_LENGTH, NULL); 1292 nonce_len = EVP_AEAD_nonce_length(aead); 1293 1294 for (j = 0; j < SIZE_NUM; j++) { 1295 print_message(names[D_CHACHA20_POLY1305], 1296 c[D_CHACHA20_POLY1305][j], lengths[j]); 1297 Time_F(START); 1298 for (count = 0, run = 1; COND(c[D_CHACHA20_POLY1305][j]); count++) 1299 EVP_AEAD_CTX_seal(&ctx, buf, &buf_len, BUFSIZE, nonce, 1300 nonce_len, buf, lengths[j], NULL, 0); 1301 d=Time_F(STOP); 1302 print_result(D_CHACHA20_POLY1305, j, count, d); 1303 } 1304 EVP_AEAD_CTX_cleanup(&ctx); 1305 } 1306 #endif 1307 #ifndef OPENSSL_NO_CAMELLIA 1308 if (doit[D_CBC_128_CML]) { 1309 for (j = 0; j < SIZE_NUM; j++) { 1310 print_message(names[D_CBC_128_CML], c[D_CBC_128_CML][j], lengths[j]); 1311 Time_F(START); 1312 for (count = 0, run = 1; COND(c[D_CBC_128_CML][j]); count++) 1313 Camellia_cbc_encrypt(buf, buf, 1314 (unsigned long) lengths[j], &camellia_ks1, 1315 iv, CAMELLIA_ENCRYPT); 1316 d = Time_F(STOP); 1317 print_result(D_CBC_128_CML, j, count, d); 1318 } 1319 } 1320 if (doit[D_CBC_192_CML]) { 1321 for (j = 0; j < SIZE_NUM; j++) { 1322 print_message(names[D_CBC_192_CML], c[D_CBC_192_CML][j], lengths[j]); 1323 Time_F(START); 1324 for (count = 0, run = 1; COND(c[D_CBC_192_CML][j]); count++) 1325 Camellia_cbc_encrypt(buf, buf, 1326 (unsigned long) lengths[j], &camellia_ks2, 1327 iv, CAMELLIA_ENCRYPT); 1328 d = Time_F(STOP); 1329 print_result(D_CBC_192_CML, j, count, d); 1330 } 1331 } 1332 if (doit[D_CBC_256_CML]) { 1333 for (j = 0; j < SIZE_NUM; j++) { 1334 print_message(names[D_CBC_256_CML], c[D_CBC_256_CML][j], lengths[j]); 1335 Time_F(START); 1336 for (count = 0, run = 1; COND(c[D_CBC_256_CML][j]); count++) 1337 Camellia_cbc_encrypt(buf, buf, 1338 (unsigned long) lengths[j], &camellia_ks3, 1339 iv, CAMELLIA_ENCRYPT); 1340 d = Time_F(STOP); 1341 print_result(D_CBC_256_CML, j, count, d); 1342 } 1343 } 1344 #endif 1345 #ifndef OPENSSL_NO_IDEA 1346 if (doit[D_CBC_IDEA]) { 1347 for (j = 0; j < SIZE_NUM; j++) { 1348 print_message(names[D_CBC_IDEA], c[D_CBC_IDEA][j], lengths[j]); 1349 Time_F(START); 1350 for (count = 0, run = 1; COND(c[D_CBC_IDEA][j]); count++) 1351 idea_cbc_encrypt(buf, buf, 1352 (unsigned long) lengths[j], &idea_ks, 1353 iv, IDEA_ENCRYPT); 1354 d = Time_F(STOP); 1355 print_result(D_CBC_IDEA, j, count, d); 1356 } 1357 } 1358 #endif 1359 #ifndef OPENSSL_NO_RC2 1360 if (doit[D_CBC_RC2]) { 1361 for (j = 0; j < SIZE_NUM; j++) { 1362 print_message(names[D_CBC_RC2], c[D_CBC_RC2][j], lengths[j]); 1363 Time_F(START); 1364 for (count = 0, run = 1; COND(c[D_CBC_RC2][j]); count++) 1365 RC2_cbc_encrypt(buf, buf, 1366 (unsigned long) lengths[j], &rc2_ks, 1367 iv, RC2_ENCRYPT); 1368 d = Time_F(STOP); 1369 print_result(D_CBC_RC2, j, count, d); 1370 } 1371 } 1372 #endif 1373 #ifndef OPENSSL_NO_BF 1374 if (doit[D_CBC_BF]) { 1375 for (j = 0; j < SIZE_NUM; j++) { 1376 print_message(names[D_CBC_BF], c[D_CBC_BF][j], lengths[j]); 1377 Time_F(START); 1378 for (count = 0, run = 1; COND(c[D_CBC_BF][j]); count++) 1379 BF_cbc_encrypt(buf, buf, 1380 (unsigned long) lengths[j], &bf_ks, 1381 iv, BF_ENCRYPT); 1382 d = Time_F(STOP); 1383 print_result(D_CBC_BF, j, count, d); 1384 } 1385 } 1386 #endif 1387 #ifndef OPENSSL_NO_CAST 1388 if (doit[D_CBC_CAST]) { 1389 for (j = 0; j < SIZE_NUM; j++) { 1390 print_message(names[D_CBC_CAST], c[D_CBC_CAST][j], lengths[j]); 1391 Time_F(START); 1392 for (count = 0, run = 1; COND(c[D_CBC_CAST][j]); count++) 1393 CAST_cbc_encrypt(buf, buf, 1394 (unsigned long) lengths[j], &cast_ks, 1395 iv, CAST_ENCRYPT); 1396 d = Time_F(STOP); 1397 print_result(D_CBC_CAST, j, count, d); 1398 } 1399 } 1400 #endif 1401 1402 if (doit[D_EVP]) { 1403 for (j = 0; j < SIZE_NUM; j++) { 1404 if (evp_cipher) { 1405 EVP_CIPHER_CTX ctx; 1406 int outl; 1407 1408 names[D_EVP] = OBJ_nid2ln(evp_cipher->nid); 1409 /* 1410 * -O3 -fschedule-insns messes up an 1411 * optimization here! names[D_EVP] somehow 1412 * becomes NULL 1413 */ 1414 print_message(names[D_EVP], save_count, 1415 lengths[j]); 1416 1417 EVP_CIPHER_CTX_init(&ctx); 1418 if (decrypt) 1419 EVP_DecryptInit_ex(&ctx, evp_cipher, NULL, key16, iv); 1420 else 1421 EVP_EncryptInit_ex(&ctx, evp_cipher, NULL, key16, iv); 1422 EVP_CIPHER_CTX_set_padding(&ctx, 0); 1423 1424 Time_F(START); 1425 if (decrypt) 1426 for (count = 0, run = 1; COND(save_count * 4 * lengths[0] / lengths[j]); count++) 1427 EVP_DecryptUpdate(&ctx, buf, &outl, buf, lengths[j]); 1428 else 1429 for (count = 0, run = 1; COND(save_count * 4 * lengths[0] / lengths[j]); count++) 1430 EVP_EncryptUpdate(&ctx, buf, &outl, buf, lengths[j]); 1431 if (decrypt) 1432 EVP_DecryptFinal_ex(&ctx, buf, &outl); 1433 else 1434 EVP_EncryptFinal_ex(&ctx, buf, &outl); 1435 d = Time_F(STOP); 1436 EVP_CIPHER_CTX_cleanup(&ctx); 1437 } 1438 if (evp_md) { 1439 names[D_EVP] = OBJ_nid2ln(evp_md->type); 1440 print_message(names[D_EVP], save_count, 1441 lengths[j]); 1442 1443 Time_F(START); 1444 for (count = 0, run = 1; COND(save_count * 4 * lengths[0] / lengths[j]); count++) 1445 EVP_Digest(buf, lengths[j], &(md[0]), NULL, evp_md, NULL); 1446 1447 d = Time_F(STOP); 1448 } 1449 print_result(D_EVP, j, count, d); 1450 } 1451 } 1452 arc4random_buf(buf, 36); 1453 for (j = 0; j < RSA_NUM; j++) { 1454 int ret; 1455 if (!rsa_doit[j]) 1456 continue; 1457 ret = RSA_sign(NID_md5_sha1, buf, 36, buf2, &rsa_num, rsa_key[j]); 1458 if (ret == 0) { 1459 BIO_printf(bio_err, "RSA sign failure. No RSA sign will be done.\n"); 1460 ERR_print_errors(bio_err); 1461 rsa_count = 1; 1462 } else { 1463 pkey_print_message("private", "rsa", 1464 rsa_c[j][0], rsa_bits[j], 1465 RSA_SECONDS); 1466 /* RSA_blinding_on(rsa_key[j],NULL); */ 1467 Time_F(START); 1468 for (count = 0, run = 1; COND(rsa_c[j][0]); count++) { 1469 ret = RSA_sign(NID_md5_sha1, buf, 36, buf2, 1470 &rsa_num, rsa_key[j]); 1471 if (ret == 0) { 1472 BIO_printf(bio_err, 1473 "RSA sign failure\n"); 1474 ERR_print_errors(bio_err); 1475 count = 1; 1476 break; 1477 } 1478 } 1479 d = Time_F(STOP); 1480 BIO_printf(bio_err, mr ? "+R1:%ld:%d:%.2f\n" 1481 : "%ld %d bit private RSA's in %.2fs\n", 1482 count, rsa_bits[j], d); 1483 rsa_results[j][0] = d / (double) count; 1484 rsa_count = count; 1485 } 1486 1487 ret = RSA_verify(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[j]); 1488 if (ret <= 0) { 1489 BIO_printf(bio_err, "RSA verify failure. No RSA verify will be done.\n"); 1490 ERR_print_errors(bio_err); 1491 rsa_doit[j] = 0; 1492 } else { 1493 pkey_print_message("public", "rsa", 1494 rsa_c[j][1], rsa_bits[j], 1495 RSA_SECONDS); 1496 Time_F(START); 1497 for (count = 0, run = 1; COND(rsa_c[j][1]); count++) { 1498 ret = RSA_verify(NID_md5_sha1, buf, 36, buf2, 1499 rsa_num, rsa_key[j]); 1500 if (ret <= 0) { 1501 BIO_printf(bio_err, 1502 "RSA verify failure\n"); 1503 ERR_print_errors(bio_err); 1504 count = 1; 1505 break; 1506 } 1507 } 1508 d = Time_F(STOP); 1509 BIO_printf(bio_err, mr ? "+R2:%ld:%d:%.2f\n" 1510 : "%ld %d bit public RSA's in %.2fs\n", 1511 count, rsa_bits[j], d); 1512 rsa_results[j][1] = d / (double) count; 1513 } 1514 1515 if (rsa_count <= 1) { 1516 /* if longer than 10s, don't do any more */ 1517 for (j++; j < RSA_NUM; j++) 1518 rsa_doit[j] = 0; 1519 } 1520 } 1521 1522 arc4random_buf(buf, 20); 1523 for (j = 0; j < DSA_NUM; j++) { 1524 unsigned int kk; 1525 int ret; 1526 1527 if (!dsa_doit[j]) 1528 continue; 1529 /* DSA_generate_key(dsa_key[j]); */ 1530 /* DSA_sign_setup(dsa_key[j],NULL); */ 1531 ret = DSA_sign(EVP_PKEY_DSA, buf, 20, buf2, 1532 &kk, dsa_key[j]); 1533 if (ret == 0) { 1534 BIO_printf(bio_err, "DSA sign failure. No DSA sign will be done.\n"); 1535 ERR_print_errors(bio_err); 1536 rsa_count = 1; 1537 } else { 1538 pkey_print_message("sign", "dsa", 1539 dsa_c[j][0], dsa_bits[j], 1540 DSA_SECONDS); 1541 Time_F(START); 1542 for (count = 0, run = 1; COND(dsa_c[j][0]); count++) { 1543 ret = DSA_sign(EVP_PKEY_DSA, buf, 20, buf2, 1544 &kk, dsa_key[j]); 1545 if (ret == 0) { 1546 BIO_printf(bio_err, 1547 "DSA sign failure\n"); 1548 ERR_print_errors(bio_err); 1549 count = 1; 1550 break; 1551 } 1552 } 1553 d = Time_F(STOP); 1554 BIO_printf(bio_err, mr ? "+R3:%ld:%d:%.2f\n" 1555 : "%ld %d bit DSA signs in %.2fs\n", 1556 count, dsa_bits[j], d); 1557 dsa_results[j][0] = d / (double) count; 1558 rsa_count = count; 1559 } 1560 1561 ret = DSA_verify(EVP_PKEY_DSA, buf, 20, buf2, 1562 kk, dsa_key[j]); 1563 if (ret <= 0) { 1564 BIO_printf(bio_err, "DSA verify failure. No DSA verify will be done.\n"); 1565 ERR_print_errors(bio_err); 1566 dsa_doit[j] = 0; 1567 } else { 1568 pkey_print_message("verify", "dsa", 1569 dsa_c[j][1], dsa_bits[j], 1570 DSA_SECONDS); 1571 Time_F(START); 1572 for (count = 0, run = 1; COND(dsa_c[j][1]); count++) { 1573 ret = DSA_verify(EVP_PKEY_DSA, buf, 20, buf2, 1574 kk, dsa_key[j]); 1575 if (ret <= 0) { 1576 BIO_printf(bio_err, 1577 "DSA verify failure\n"); 1578 ERR_print_errors(bio_err); 1579 count = 1; 1580 break; 1581 } 1582 } 1583 d = Time_F(STOP); 1584 BIO_printf(bio_err, mr ? "+R4:%ld:%d:%.2f\n" 1585 : "%ld %d bit DSA verify in %.2fs\n", 1586 count, dsa_bits[j], d); 1587 dsa_results[j][1] = d / (double) count; 1588 } 1589 1590 if (rsa_count <= 1) { 1591 /* if longer than 10s, don't do any more */ 1592 for (j++; j < DSA_NUM; j++) 1593 dsa_doit[j] = 0; 1594 } 1595 } 1596 1597 for (j = 0; j < EC_NUM; j++) { 1598 int ret; 1599 1600 if (!ecdsa_doit[j]) 1601 continue; /* Ignore Curve */ 1602 ecdsa[j] = EC_KEY_new_by_curve_name(test_curves[j]); 1603 if (ecdsa[j] == NULL) { 1604 BIO_printf(bio_err, "ECDSA failure.\n"); 1605 ERR_print_errors(bio_err); 1606 rsa_count = 1; 1607 } else { 1608 EC_KEY_precompute_mult(ecdsa[j], NULL); 1609 1610 /* Perform ECDSA signature test */ 1611 EC_KEY_generate_key(ecdsa[j]); 1612 ret = ECDSA_sign(0, buf, 20, ecdsasig, 1613 &ecdsasiglen, ecdsa[j]); 1614 if (ret == 0) { 1615 BIO_printf(bio_err, "ECDSA sign failure. No ECDSA sign will be done.\n"); 1616 ERR_print_errors(bio_err); 1617 rsa_count = 1; 1618 } else { 1619 pkey_print_message("sign", "ecdsa", 1620 ecdsa_c[j][0], 1621 test_curves_bits[j], 1622 ECDSA_SECONDS); 1623 1624 Time_F(START); 1625 for (count = 0, run = 1; COND(ecdsa_c[j][0]); 1626 count++) { 1627 ret = ECDSA_sign(0, buf, 20, 1628 ecdsasig, &ecdsasiglen, 1629 ecdsa[j]); 1630 if (ret == 0) { 1631 BIO_printf(bio_err, "ECDSA sign failure\n"); 1632 ERR_print_errors(bio_err); 1633 count = 1; 1634 break; 1635 } 1636 } 1637 d = Time_F(STOP); 1638 1639 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" : 1640 "%ld %d bit ECDSA signs in %.2fs \n", 1641 count, test_curves_bits[j], d); 1642 ecdsa_results[j][0] = d / (double) count; 1643 rsa_count = count; 1644 } 1645 1646 /* Perform ECDSA verification test */ 1647 ret = ECDSA_verify(0, buf, 20, ecdsasig, 1648 ecdsasiglen, ecdsa[j]); 1649 if (ret != 1) { 1650 BIO_printf(bio_err, "ECDSA verify failure. No ECDSA verify will be done.\n"); 1651 ERR_print_errors(bio_err); 1652 ecdsa_doit[j] = 0; 1653 } else { 1654 pkey_print_message("verify", "ecdsa", 1655 ecdsa_c[j][1], 1656 test_curves_bits[j], 1657 ECDSA_SECONDS); 1658 Time_F(START); 1659 for (count = 0, run = 1; COND(ecdsa_c[j][1]); count++) { 1660 ret = ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]); 1661 if (ret != 1) { 1662 BIO_printf(bio_err, "ECDSA verify failure\n"); 1663 ERR_print_errors(bio_err); 1664 count = 1; 1665 break; 1666 } 1667 } 1668 d = Time_F(STOP); 1669 BIO_printf(bio_err, mr ? "+R6:%ld:%d:%.2f\n" 1670 : "%ld %d bit ECDSA verify in %.2fs\n", 1671 count, test_curves_bits[j], d); 1672 ecdsa_results[j][1] = d / (double) count; 1673 } 1674 1675 if (rsa_count <= 1) { 1676 /* if longer than 10s, don't do any more */ 1677 for (j++; j < EC_NUM; j++) 1678 ecdsa_doit[j] = 0; 1679 } 1680 } 1681 } 1682 1683 for (j = 0; j < EC_NUM; j++) { 1684 if (!ecdh_doit[j]) 1685 continue; 1686 ecdh_a[j] = EC_KEY_new_by_curve_name(test_curves[j]); 1687 ecdh_b[j] = EC_KEY_new_by_curve_name(test_curves[j]); 1688 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL)) { 1689 BIO_printf(bio_err, "ECDH failure.\n"); 1690 ERR_print_errors(bio_err); 1691 rsa_count = 1; 1692 } else { 1693 /* generate two ECDH key pairs */ 1694 if (!EC_KEY_generate_key(ecdh_a[j]) || 1695 !EC_KEY_generate_key(ecdh_b[j])) { 1696 BIO_printf(bio_err, "ECDH key generation failure.\n"); 1697 ERR_print_errors(bio_err); 1698 rsa_count = 1; 1699 } else { 1700 /* 1701 * If field size is not more than 24 octets, 1702 * then use SHA-1 hash of result; otherwise, 1703 * use result (see section 4.8 of 1704 * draft-ietf-tls-ecc-03.txt). 1705 */ 1706 int field_size, outlen; 1707 void *(*kdf) (const void *in, size_t inlen, void *out, size_t * xoutlen); 1708 field_size = EC_GROUP_get_degree(EC_KEY_get0_group(ecdh_a[j])); 1709 if (field_size <= 24 * 8) { 1710 outlen = KDF1_SHA1_len; 1711 kdf = KDF1_SHA1; 1712 } else { 1713 outlen = (field_size + 7) / 8; 1714 kdf = NULL; 1715 } 1716 secret_size_a = ECDH_compute_key(secret_a, outlen, 1717 EC_KEY_get0_public_key(ecdh_b[j]), 1718 ecdh_a[j], kdf); 1719 secret_size_b = ECDH_compute_key(secret_b, outlen, 1720 EC_KEY_get0_public_key(ecdh_a[j]), 1721 ecdh_b[j], kdf); 1722 if (secret_size_a != secret_size_b) 1723 ecdh_checks = 0; 1724 else 1725 ecdh_checks = 1; 1726 1727 for (secret_idx = 0; 1728 (secret_idx < secret_size_a) 1729 && (ecdh_checks == 1); 1730 secret_idx++) { 1731 if (secret_a[secret_idx] != secret_b[secret_idx]) 1732 ecdh_checks = 0; 1733 } 1734 1735 if (ecdh_checks == 0) { 1736 BIO_printf(bio_err, 1737 "ECDH computations don't match.\n"); 1738 ERR_print_errors(bio_err); 1739 rsa_count = 1; 1740 } else { 1741 pkey_print_message("", "ecdh", 1742 ecdh_c[j][0], 1743 test_curves_bits[j], 1744 ECDH_SECONDS); 1745 Time_F(START); 1746 for (count = 0, run = 1; 1747 COND(ecdh_c[j][0]); count++) { 1748 ECDH_compute_key(secret_a, 1749 outlen, 1750 EC_KEY_get0_public_key(ecdh_b[j]), 1751 ecdh_a[j], kdf); 1752 } 1753 d = Time_F(STOP); 1754 BIO_printf(bio_err, mr 1755 ? "+R7:%ld:%d:%.2f\n" 1756 : "%ld %d-bit ECDH ops in %.2fs\n", 1757 count, test_curves_bits[j], d); 1758 ecdh_results[j][0] = d / (double) count; 1759 rsa_count = count; 1760 } 1761 } 1762 } 1763 1764 1765 if (rsa_count <= 1) { 1766 /* if longer than 10s, don't do any more */ 1767 for (j++; j < EC_NUM; j++) 1768 ecdh_doit[j] = 0; 1769 } 1770 } 1771 show_res: 1772 if (!mr) { 1773 fprintf(stdout, "%s\n", SSLeay_version(SSLEAY_VERSION)); 1774 fprintf(stdout, "%s\n", SSLeay_version(SSLEAY_BUILT_ON)); 1775 printf("options:"); 1776 printf("%s ", BN_options()); 1777 #ifndef OPENSSL_NO_RC4 1778 printf("%s ", RC4_options()); 1779 #endif 1780 #ifndef OPENSSL_NO_DES 1781 printf("%s ", DES_options()); 1782 #endif 1783 #ifndef OPENSSL_NO_AES 1784 printf("%s ", AES_options()); 1785 #endif 1786 #ifndef OPENSSL_NO_IDEA 1787 printf("%s ", idea_options()); 1788 #endif 1789 #ifndef OPENSSL_NO_BF 1790 printf("%s ", BF_options()); 1791 #endif 1792 fprintf(stdout, "\n%s\n", SSLeay_version(SSLEAY_CFLAGS)); 1793 } 1794 if (pr_header) { 1795 if (mr) 1796 fprintf(stdout, "+H"); 1797 else { 1798 fprintf(stdout, "The 'numbers' are in 1000s of bytes per second processed.\n"); 1799 fprintf(stdout, "type "); 1800 } 1801 for (j = 0; j < SIZE_NUM; j++) 1802 fprintf(stdout, mr ? ":%d" : "%7d bytes", lengths[j]); 1803 fprintf(stdout, "\n"); 1804 } 1805 for (k = 0; k < ALGOR_NUM; k++) { 1806 if (!doit[k]) 1807 continue; 1808 if (mr) 1809 fprintf(stdout, "+F:%d:%s", k, names[k]); 1810 else 1811 fprintf(stdout, "%-13s", names[k]); 1812 for (j = 0; j < SIZE_NUM; j++) { 1813 if (results[k][j] > 10000 && !mr) 1814 fprintf(stdout, " %11.2fk", results[k][j] / 1e3); 1815 else 1816 fprintf(stdout, mr ? ":%.2f" : " %11.2f ", results[k][j]); 1817 } 1818 fprintf(stdout, "\n"); 1819 } 1820 j = 1; 1821 for (k = 0; k < RSA_NUM; k++) { 1822 if (!rsa_doit[k]) 1823 continue; 1824 if (j && !mr) { 1825 printf("%18ssign verify sign/s verify/s\n", " "); 1826 j = 0; 1827 } 1828 if (mr) 1829 fprintf(stdout, "+F2:%u:%u:%f:%f\n", 1830 k, rsa_bits[k], rsa_results[k][0], 1831 rsa_results[k][1]); 1832 else 1833 fprintf(stdout, "rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n", 1834 rsa_bits[k], rsa_results[k][0], rsa_results[k][1], 1835 1.0 / rsa_results[k][0], 1.0 / rsa_results[k][1]); 1836 } 1837 j = 1; 1838 for (k = 0; k < DSA_NUM; k++) { 1839 if (!dsa_doit[k]) 1840 continue; 1841 if (j && !mr) { 1842 printf("%18ssign verify sign/s verify/s\n", " "); 1843 j = 0; 1844 } 1845 if (mr) 1846 fprintf(stdout, "+F3:%u:%u:%f:%f\n", 1847 k, dsa_bits[k], dsa_results[k][0], dsa_results[k][1]); 1848 else 1849 fprintf(stdout, "dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n", 1850 dsa_bits[k], dsa_results[k][0], dsa_results[k][1], 1851 1.0 / dsa_results[k][0], 1.0 / dsa_results[k][1]); 1852 } 1853 j = 1; 1854 for (k = 0; k < EC_NUM; k++) { 1855 if (!ecdsa_doit[k]) 1856 continue; 1857 if (j && !mr) { 1858 printf("%30ssign verify sign/s verify/s\n", " "); 1859 j = 0; 1860 } 1861 if (mr) 1862 fprintf(stdout, "+F4:%u:%u:%f:%f\n", 1863 k, test_curves_bits[k], 1864 ecdsa_results[k][0], ecdsa_results[k][1]); 1865 else 1866 fprintf(stdout, 1867 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n", 1868 test_curves_bits[k], 1869 test_curves_names[k], 1870 ecdsa_results[k][0], ecdsa_results[k][1], 1871 1.0 / ecdsa_results[k][0], 1.0 / ecdsa_results[k][1]); 1872 } 1873 1874 1875 j = 1; 1876 for (k = 0; k < EC_NUM; k++) { 1877 if (!ecdh_doit[k]) 1878 continue; 1879 if (j && !mr) { 1880 printf("%30sop op/s\n", " "); 1881 j = 0; 1882 } 1883 if (mr) 1884 fprintf(stdout, "+F5:%u:%u:%f:%f\n", 1885 k, test_curves_bits[k], 1886 ecdh_results[k][0], 1.0 / ecdh_results[k][0]); 1887 1888 else 1889 fprintf(stdout, "%4u bit ecdh (%s) %8.4fs %8.1f\n", 1890 test_curves_bits[k], 1891 test_curves_names[k], 1892 ecdh_results[k][0], 1.0 / ecdh_results[k][0]); 1893 } 1894 1895 mret = 0; 1896 1897 end: 1898 ERR_print_errors(bio_err); 1899 free(buf); 1900 free(buf2); 1901 for (i = 0; i < RSA_NUM; i++) 1902 if (rsa_key[i] != NULL) 1903 RSA_free(rsa_key[i]); 1904 for (i = 0; i < DSA_NUM; i++) 1905 if (dsa_key[i] != NULL) 1906 DSA_free(dsa_key[i]); 1907 1908 for (i = 0; i < EC_NUM; i++) 1909 if (ecdsa[i] != NULL) 1910 EC_KEY_free(ecdsa[i]); 1911 for (i = 0; i < EC_NUM; i++) { 1912 if (ecdh_a[i] != NULL) 1913 EC_KEY_free(ecdh_a[i]); 1914 if (ecdh_b[i] != NULL) 1915 EC_KEY_free(ecdh_b[i]); 1916 } 1917 1918 1919 return (mret); 1920 } 1921 1922 static void 1923 print_message(const char *s, long num, int length) 1924 { 1925 BIO_printf(bio_err, mr ? "+DT:%s:%d:%d\n" 1926 : "Doing %s for %ds on %d size blocks: ", s, SECONDS, length); 1927 (void) BIO_flush(bio_err); 1928 alarm(SECONDS); 1929 } 1930 1931 static void 1932 pkey_print_message(const char *str, const char *str2, long num, 1933 int bits, int tm) 1934 { 1935 BIO_printf(bio_err, mr ? "+DTP:%d:%s:%s:%d\n" 1936 : "Doing %d bit %s %s's for %ds: ", bits, str, str2, tm); 1937 (void) BIO_flush(bio_err); 1938 alarm(tm); 1939 } 1940 1941 static void 1942 print_result(int alg, int run_no, int count, double time_used) 1943 { 1944 BIO_printf(bio_err, mr ? "+R:%d:%s:%f\n" 1945 : "%d %s's in %.2fs\n", count, names[alg], time_used); 1946 results[alg][run_no] = ((double) count) / time_used * lengths[run_no]; 1947 } 1948 1949 static char * 1950 sstrsep(char **string, const char *delim) 1951 { 1952 char isdelim[256]; 1953 char *token = *string; 1954 1955 if (**string == 0) 1956 return NULL; 1957 1958 memset(isdelim, 0, sizeof isdelim); 1959 isdelim[0] = 1; 1960 1961 while (*delim) { 1962 isdelim[(unsigned char) (*delim)] = 1; 1963 delim++; 1964 } 1965 1966 while (!isdelim[(unsigned char) (**string)]) { 1967 (*string)++; 1968 } 1969 1970 if (**string) { 1971 **string = 0; 1972 (*string)++; 1973 } 1974 return token; 1975 } 1976 1977 static int 1978 do_multi(int multi) 1979 { 1980 int n; 1981 int fd[2]; 1982 int *fds; 1983 static char sep[] = ":"; 1984 const char *errstr = NULL; 1985 1986 fds = reallocarray(NULL, multi, sizeof *fds); 1987 if (fds == NULL) { 1988 fprintf(stderr, "reallocarray failure\n"); 1989 exit(1); 1990 } 1991 for (n = 0; n < multi; ++n) { 1992 if (pipe(fd) == -1) { 1993 fprintf(stderr, "pipe failure\n"); 1994 exit(1); 1995 } 1996 fflush(stdout); 1997 fflush(stderr); 1998 if (fork()) { 1999 close(fd[1]); 2000 fds[n] = fd[0]; 2001 } else { 2002 close(fd[0]); 2003 close(1); 2004 if (dup(fd[1]) == -1) { 2005 fprintf(stderr, "dup failed\n"); 2006 exit(1); 2007 } 2008 close(fd[1]); 2009 mr = 1; 2010 usertime = 0; 2011 free(fds); 2012 return 0; 2013 } 2014 printf("Forked child %d\n", n); 2015 } 2016 2017 /* for now, assume the pipe is long enough to take all the output */ 2018 for (n = 0; n < multi; ++n) { 2019 FILE *f; 2020 char buf[1024]; 2021 char *p; 2022 2023 f = fdopen(fds[n], "r"); 2024 while (fgets(buf, sizeof buf, f)) { 2025 p = strchr(buf, '\n'); 2026 if (p) 2027 *p = '\0'; 2028 if (buf[0] != '+') { 2029 fprintf(stderr, "Don't understand line '%s' from child %d\n", 2030 buf, n); 2031 continue; 2032 } 2033 printf("Got: %s from %d\n", buf, n); 2034 if (!strncmp(buf, "+F:", 3)) { 2035 int alg; 2036 int j; 2037 2038 p = buf + 3; 2039 alg = strtonum(sstrsep(&p, sep), 2040 0, ALGOR_NUM - 1, &errstr); 2041 sstrsep(&p, sep); 2042 for (j = 0; j < SIZE_NUM; ++j) 2043 results[alg][j] += atof(sstrsep(&p, sep)); 2044 } else if (!strncmp(buf, "+F2:", 4)) { 2045 int k; 2046 double d; 2047 2048 p = buf + 4; 2049 k = strtonum(sstrsep(&p, sep), 2050 0, ALGOR_NUM - 1, &errstr); 2051 sstrsep(&p, sep); 2052 2053 d = atof(sstrsep(&p, sep)); 2054 if (n) 2055 rsa_results[k][0] = 1 / (1 / rsa_results[k][0] + 1 / d); 2056 else 2057 rsa_results[k][0] = d; 2058 2059 d = atof(sstrsep(&p, sep)); 2060 if (n) 2061 rsa_results[k][1] = 1 / (1 / rsa_results[k][1] + 1 / d); 2062 else 2063 rsa_results[k][1] = d; 2064 } else if (!strncmp(buf, "+F2:", 4)) { 2065 int k; 2066 double d; 2067 2068 p = buf + 4; 2069 k = strtonum(sstrsep(&p, sep), 2070 0, ALGOR_NUM - 1, &errstr); 2071 sstrsep(&p, sep); 2072 2073 d = atof(sstrsep(&p, sep)); 2074 if (n) 2075 rsa_results[k][0] = 1 / (1 / rsa_results[k][0] + 1 / d); 2076 else 2077 rsa_results[k][0] = d; 2078 2079 d = atof(sstrsep(&p, sep)); 2080 if (n) 2081 rsa_results[k][1] = 1 / (1 / rsa_results[k][1] + 1 / d); 2082 else 2083 rsa_results[k][1] = d; 2084 } 2085 else if (!strncmp(buf, "+F3:", 4)) { 2086 int k; 2087 double d; 2088 2089 p = buf + 4; 2090 k = strtonum(sstrsep(&p, sep), 2091 0, ALGOR_NUM - 1, &errstr); 2092 sstrsep(&p, sep); 2093 2094 d = atof(sstrsep(&p, sep)); 2095 if (n) 2096 dsa_results[k][0] = 1 / (1 / dsa_results[k][0] + 1 / d); 2097 else 2098 dsa_results[k][0] = d; 2099 2100 d = atof(sstrsep(&p, sep)); 2101 if (n) 2102 dsa_results[k][1] = 1 / (1 / dsa_results[k][1] + 1 / d); 2103 else 2104 dsa_results[k][1] = d; 2105 } 2106 else if (!strncmp(buf, "+F4:", 4)) { 2107 int k; 2108 double d; 2109 2110 p = buf + 4; 2111 k = strtonum(sstrsep(&p, sep), 2112 0, ALGOR_NUM - 1, &errstr); 2113 sstrsep(&p, sep); 2114 2115 d = atof(sstrsep(&p, sep)); 2116 if (n) 2117 ecdsa_results[k][0] = 1 / (1 / ecdsa_results[k][0] + 1 / d); 2118 else 2119 ecdsa_results[k][0] = d; 2120 2121 d = atof(sstrsep(&p, sep)); 2122 if (n) 2123 ecdsa_results[k][1] = 1 / (1 / ecdsa_results[k][1] + 1 / d); 2124 else 2125 ecdsa_results[k][1] = d; 2126 } 2127 2128 else if (!strncmp(buf, "+F5:", 4)) { 2129 int k; 2130 double d; 2131 2132 p = buf + 4; 2133 k = strtonum(sstrsep(&p, sep), 2134 0, ALGOR_NUM - 1, &errstr); 2135 sstrsep(&p, sep); 2136 2137 d = atof(sstrsep(&p, sep)); 2138 if (n) 2139 ecdh_results[k][0] = 1 / (1 / ecdh_results[k][0] + 1 / d); 2140 else 2141 ecdh_results[k][0] = d; 2142 2143 } 2144 2145 else if (!strncmp(buf, "+H:", 3)) { 2146 } else 2147 fprintf(stderr, "Unknown type '%s' from child %d\n", buf, n); 2148 } 2149 2150 fclose(f); 2151 } 2152 free(fds); 2153 return 1; 2154 } 2155 #endif 2156