X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=apps%2Fspeed.c;h=66271fddd9dbc7e35cd20bb7b436390277db92ec;hp=271472eb09c627eea22cfea86ae084da3238db82;hb=a6f5b1163452a36da1c8378eab3f29ae234e5c7f;hpb=a00cceb22ca2bbe394e235345760d1fe54ee2eea diff --git a/apps/speed.c b/apps/speed.c index 271472eb09..66271fddd9 100644 --- a/apps/speed.c +++ b/apps/speed.c @@ -1,5 +1,5 @@ /* - * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved * * Licensed under the OpenSSL license (the "License"). You may not use @@ -20,6 +20,7 @@ #include #include #include "apps.h" +#include "progs.h" #include #include #include @@ -117,17 +118,17 @@ #define RSA_NUM 7 #define DSA_NUM 3 -#define EC_NUM 17 +#define EC_NUM 18 #define MAX_ECDH_SIZE 256 #define MISALIGN 64 -typedef struct sec_st { +typedef struct openssl_speed_sec_st { int sym; int rsa; int dsa; int ecdsa; int ecdh; -} SEC; +} openssl_speed_sec_t; static volatile int run = 0; @@ -141,6 +142,7 @@ typedef struct loopargs_st { unsigned char *buf2; unsigned char *buf_malloc; unsigned char *buf2_malloc; + unsigned char *key; unsigned int siglen; #ifndef OPENSSL_NO_RSA RSA *rsa_key[RSA_NUM]; @@ -333,7 +335,7 @@ static double Time_F(int s) #endif static void multiblock_speed(const EVP_CIPHER *evp_cipher, - const SEC *seconds); + const openssl_speed_sec_t *seconds); static int found(const char *name, const OPT_PAIR *pairs, int *result) { @@ -531,6 +533,7 @@ static OPT_PAIR rsa_choices[] = { #define R_EC_B409 14 #define R_EC_B571 15 #define R_EC_X25519 16 +#define R_EC_X448 17 #ifndef OPENSSL_NO_EC static OPT_PAIR ecdsa_choices[] = { {"ecdsap160", R_EC_P160}, @@ -570,6 +573,7 @@ static OPT_PAIR ecdh_choices[] = { {"ecdhb409", R_EC_B409}, {"ecdhb571", R_EC_B571}, {"ecdhx25519", R_EC_X25519}, + {"ecdhx448", R_EC_X448}, {NULL} }; #endif @@ -872,16 +876,23 @@ static int EVP_Update_loop(void *args) loopargs_t *tempargs = *(loopargs_t **) args; unsigned char *buf = tempargs->buf; EVP_CIPHER_CTX *ctx = tempargs->ctx; - int outl, count; + int outl, count, rc; #ifndef SIGALRM int nb_iter = save_count * 4 * lengths[0] / lengths[testnum]; #endif - if (decrypt) - for (count = 0; COND(nb_iter); count++) - EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]); - else - for (count = 0; COND(nb_iter); count++) - EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]); + if (decrypt) { + for (count = 0; COND(nb_iter); count++) { + rc = EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]); + if (rc != 1) + EVP_CipherInit_ex(ctx, NULL, NULL, NULL, iv, -1); + } + } else { + for (count = 0; COND(nb_iter); count++) { + rc = EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]); + if (rc != 1) + EVP_CipherInit_ex(ctx, NULL, NULL, NULL, iv, -1); + } + } if (decrypt) EVP_DecryptFinal_ex(ctx, buf, &outl); else @@ -1259,6 +1270,8 @@ int speed_main(int argc, char **argv) int ret = 1, i, k, misalign = 0; long count = 0; int size_num = OSSL_NELEM(lengths_list); + int keylen; + int buflen; #ifndef NO_FORK int multi = 0; #endif @@ -1267,6 +1280,9 @@ int speed_main(int argc, char **argv) || !defined(OPENSSL_NO_EC) long rsa_count = 1; #endif +#ifndef OPENSSL_NO_EC + size_t loop; +#endif /* What follows are the buffers and key material. */ #ifndef OPENSSL_NO_RC5 @@ -1363,7 +1379,7 @@ int speed_main(int argc, char **argv) NID_sect233r1, NID_sect283r1, NID_sect409r1, NID_sect571r1, /* Other */ - NID_X25519 + NID_X25519, NID_X448 }; static const char *test_curves_names[EC_NUM] = { /* Prime Curves */ @@ -1375,7 +1391,7 @@ int speed_main(int argc, char **argv) "nistb233", "nistb283", "nistb409", "nistb571", /* Other */ - "X25519" + "X25519", "X448" }; static const int test_curves_bits[EC_NUM] = { 160, 192, 224, @@ -1383,15 +1399,15 @@ int speed_main(int argc, char **argv) 163, 233, 283, 409, 571, 163, 233, 283, 409, - 571, 253 /* X25519 */ + 571, 253, 448 }; int ecdsa_doit[EC_NUM] = { 0 }; int ecdh_doit[EC_NUM] = { 0 }; #endif /* ndef OPENSSL_NO_EC */ - SEC seconds = {SECONDS, RSA_SECONDS, DSA_SECONDS, ECDSA_SECONDS, - ECDH_SECONDS}; + openssl_speed_sec_t seconds = { SECONDS, RSA_SECONDS, DSA_SECONDS, + ECDSA_SECONDS, ECDH_SECONDS }; prog = opt_init(argc, argv, speed_options); while ((o = opt_next()) != OPT_EOF) { @@ -1551,8 +1567,8 @@ int speed_main(int argc, char **argv) #endif #ifndef OPENSSL_NO_EC if (strcmp(*argv, "ecdsa") == 0) { - for (i = 0; i < EC_NUM; i++) - ecdsa_doit[i] = 1; + for (loop = 0; loop < OSSL_NELEM(ecdsa_choices); loop++) + ecdsa_doit[ecdsa_choices[loop].retval] = 1; continue; } if (found(*argv, ecdsa_choices, &i)) { @@ -1560,8 +1576,8 @@ int speed_main(int argc, char **argv) continue; } if (strcmp(*argv, "ecdh") == 0) { - for (i = 0; i < EC_NUM; i++) - ecdh_doit[i] = 1; + for (loop = 0; loop < OSSL_NELEM(ecdh_choices); loop++) + ecdh_doit[ecdh_choices[loop].retval] = 1; continue; } if (found(*argv, ecdh_choices, &i)) { @@ -1596,12 +1612,12 @@ int speed_main(int argc, char **argv) } } - loopargs[i].buf_malloc = - app_malloc(lengths[size_num - 1] + MAX_MISALIGNMENT + 1, - "input buffer"); - loopargs[i].buf2_malloc = - app_malloc(lengths[size_num - 1] + MAX_MISALIGNMENT + 1, - "input buffer"); + buflen = lengths[size_num - 1] + MAX_MISALIGNMENT + 1; + loopargs[i].buf_malloc = app_malloc(buflen, "input buffer"); + loopargs[i].buf2_malloc = app_malloc(buflen, "input buffer"); + memset(loopargs[i].buf_malloc, 0, buflen); + memset(loopargs[i].buf2_malloc, 0, buflen); + /* Align the start of buffers on a 64 byte boundary */ loopargs[i].buf = loopargs[i].buf_malloc + misalign; loopargs[i].buf2 = loopargs[i].buf2_malloc + misalign; @@ -1633,10 +1649,10 @@ int speed_main(int argc, char **argv) dsa_doit[i] = 1; #endif #ifndef OPENSSL_NO_EC - for (i = 0; i < EC_NUM; i++) - ecdsa_doit[i] = 1; - for (i = 0; i < EC_NUM; i++) - ecdh_doit[i] = 1; + for (loop = 0; loop < OSSL_NELEM(ecdsa_choices); loop++) + ecdsa_doit[ecdsa_choices[loop].retval] = 1; + for (loop = 0; loop < OSSL_NELEM(ecdh_choices); loop++) + ecdh_doit[ecdh_choices[loop].retval] = 1; #endif } for (i = 0; i < ALGOR_NUM; i++) @@ -2400,13 +2416,17 @@ int speed_main(int argc, char **argv) for (k = 0; k < loopargs_len; k++) { loopargs[k].ctx = EVP_CIPHER_CTX_new(); - if (decrypt) - EVP_DecryptInit_ex(loopargs[k].ctx, evp_cipher, NULL, - key32, iv); - else - EVP_EncryptInit_ex(loopargs[k].ctx, evp_cipher, NULL, - key32, iv); + EVP_CipherInit_ex(loopargs[k].ctx, evp_cipher, NULL, NULL, + iv, decrypt ? 0 : 1); + EVP_CIPHER_CTX_set_padding(loopargs[k].ctx, 0); + + keylen = EVP_CIPHER_CTX_key_length(loopargs[k].ctx); + loopargs[k].key = app_malloc(keylen, "evp_cipher key"); + EVP_CIPHER_CTX_rand_key(loopargs[k].ctx, loopargs[k].key); + EVP_CipherInit_ex(loopargs[k].ctx, NULL, NULL, + loopargs[k].key, NULL, -1); + OPENSSL_clear_free(loopargs[k].key, keylen); } switch (EVP_CIPHER_mode(evp_cipher)) { case EVP_CIPH_CCM_MODE: @@ -3077,7 +3097,7 @@ static char *sstrsep(char **string, const char *delim) if (**string == 0) return NULL; - memset(isdelim, 0, sizeof isdelim); + memset(isdelim, 0, sizeof(isdelim)); isdelim[0] = 1; while (*delim) { @@ -3138,7 +3158,7 @@ static int do_multi(int multi, int size_num) char *p; f = fdopen(fds[n], "r"); - while (fgets(buf, sizeof buf, f)) { + while (fgets(buf, sizeof(buf), f)) { p = strchr(buf, '\n'); if (p) *p = '\0'; @@ -3229,14 +3249,15 @@ static int do_multi(int multi, int size_num) } #endif -static void multiblock_speed(const EVP_CIPHER *evp_cipher, const SEC *seconds) +static void multiblock_speed(const EVP_CIPHER *evp_cipher, + const openssl_speed_sec_t *seconds) { static const int mblengths_list[] = { 8 * 1024, 2 * 8 * 1024, 4 * 8 * 1024, 8 * 8 * 1024, 8 * 16 * 1024 }; const int *mblengths = mblengths_list; - int j, count, num = OSSL_NELEM(mblengths_list); + int j, count, keylen, num = OSSL_NELEM(mblengths_list); const char *alg_name; - unsigned char *inp, *out, no_key[32], no_iv[16]; + unsigned char *inp, *out, *key, no_key[32], no_iv[16]; EVP_CIPHER_CTX *ctx; double d = 0.0; @@ -3248,7 +3269,14 @@ static void multiblock_speed(const EVP_CIPHER *evp_cipher, const SEC *seconds) inp = app_malloc(mblengths[num - 1], "multiblock input buffer"); out = app_malloc(mblengths[num - 1] + 1024, "multiblock output buffer"); ctx = EVP_CIPHER_CTX_new(); - EVP_EncryptInit_ex(ctx, evp_cipher, NULL, no_key, no_iv); + EVP_EncryptInit_ex(ctx, evp_cipher, NULL, NULL, no_iv); + + keylen = EVP_CIPHER_CTX_key_length(ctx); + key = app_malloc(keylen, "evp_cipher key"); + EVP_CIPHER_CTX_rand_key(ctx, key); + EVP_EncryptInit_ex(ctx, NULL, NULL, key, NULL); + OPENSSL_clear_free(key, keylen); + EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_MAC_KEY, sizeof(no_key), no_key); alg_name = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));