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