From d166ed8c11e10e9fdaeac182effb9dd318843924 Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Sat, 18 Jun 2016 15:46:13 +0100 Subject: check return values for EVP_Digest*() APIs Reviewed-by: Richard Levitte --- apps/passwd.c | 85 +++++++++++++++++++++++++++++++++++++---------------------- apps/speed.c | 43 +++++++++++++++++++----------- apps/ts.c | 23 +++++++++------- 3 files changed, 95 insertions(+), 56 deletions(-) (limited to 'apps') diff --git a/apps/passwd.c b/apps/passwd.c index e2825219c9..8404d8cc7a 100644 --- a/apps/passwd.c +++ b/apps/passwd.c @@ -287,7 +287,7 @@ static char *md5crypt(const char *passwd, const char *magic, const char *salt) char *salt_out; int n; unsigned int i; - EVP_MD_CTX *md, *md2; + EVP_MD_CTX *md = NULL, *md2 = NULL; size_t passwd_len, salt_len; passwd_len = strlen(passwd); @@ -303,49 +303,65 @@ static char *md5crypt(const char *passwd, const char *magic, const char *salt) assert(salt_len <= 8); md = EVP_MD_CTX_new(); - if (md == NULL) - return NULL; - EVP_DigestInit_ex(md, EVP_md5(), NULL); - EVP_DigestUpdate(md, passwd, passwd_len); - EVP_DigestUpdate(md, "$", 1); - EVP_DigestUpdate(md, magic, strlen(magic)); - EVP_DigestUpdate(md, "$", 1); - EVP_DigestUpdate(md, salt_out, salt_len); + if (md == NULL + || !EVP_DigestInit_ex(md, EVP_md5(), NULL) + || !EVP_DigestUpdate(md, passwd, passwd_len) + || !EVP_DigestUpdate(md, "$", 1) + || !EVP_DigestUpdate(md, magic, strlen(magic)) + || !EVP_DigestUpdate(md, "$", 1) + || !EVP_DigestUpdate(md, salt_out, salt_len)) md2 = EVP_MD_CTX_new(); - if (md2 == NULL) - return NULL; - EVP_DigestInit_ex(md2, EVP_md5(), NULL); - EVP_DigestUpdate(md2, passwd, passwd_len); - EVP_DigestUpdate(md2, salt_out, salt_len); - EVP_DigestUpdate(md2, passwd, passwd_len); - EVP_DigestFinal_ex(md2, buf, NULL); - - for (i = passwd_len; i > sizeof buf; i -= sizeof buf) - EVP_DigestUpdate(md, buf, sizeof buf); - EVP_DigestUpdate(md, buf, i); + if (md2 == NULL + || !EVP_DigestInit_ex(md2, EVP_md5(), NULL) + || !EVP_DigestUpdate(md2, passwd, passwd_len) + || !EVP_DigestUpdate(md2, salt_out, salt_len) + || !EVP_DigestUpdate(md2, passwd, passwd_len) + || !EVP_DigestFinal_ex(md2, buf, NULL)) + goto err; + + for (i = passwd_len; i > sizeof buf; i -= sizeof buf) { + if (!EVP_DigestUpdate(md, buf, sizeof buf)) + goto err; + } + if (!EVP_DigestUpdate(md, buf, i)) + goto err; n = passwd_len; while (n) { - EVP_DigestUpdate(md, (n & 1) ? "\0" : passwd, 1); + if (!EVP_DigestUpdate(md, (n & 1) ? "\0" : passwd, 1)) + goto err; n >>= 1; } - EVP_DigestFinal_ex(md, buf, NULL); + if (!EVP_DigestFinal_ex(md, buf, NULL)) + return NULL; for (i = 0; i < 1000; i++) { - EVP_DigestInit_ex(md2, EVP_md5(), NULL); - EVP_DigestUpdate(md2, (i & 1) ? (unsigned const char *)passwd : buf, - (i & 1) ? passwd_len : sizeof buf); - if (i % 3) - EVP_DigestUpdate(md2, salt_out, salt_len); - if (i % 7) - EVP_DigestUpdate(md2, passwd, passwd_len); - EVP_DigestUpdate(md2, (i & 1) ? buf : (unsigned const char *)passwd, - (i & 1) ? sizeof buf : passwd_len); - EVP_DigestFinal_ex(md2, buf, NULL); + if (!EVP_DigestInit_ex(md2, EVP_md5(), NULL)) + goto err; + if (!EVP_DigestUpdate(md2, + (i & 1) ? (unsigned const char *)passwd : buf, + (i & 1) ? passwd_len : sizeof buf)) + goto err; + if (i % 3) { + if (!EVP_DigestUpdate(md2, salt_out, salt_len)) + goto err; + } + if (i % 7) { + if (!EVP_DigestUpdate(md2, passwd, passwd_len)) + goto err; + } + if (!EVP_DigestUpdate(md2, + (i & 1) ? buf : (unsigned const char *)passwd, + (i & 1) ? sizeof buf : passwd_len)) + goto err; + if (!EVP_DigestFinal_ex(md2, buf, NULL)) + goto err; } EVP_MD_CTX_free(md2); EVP_MD_CTX_free(md); + md2 = NULL; + md = NULL; { /* transform buf into output string */ @@ -386,6 +402,11 @@ static char *md5crypt(const char *passwd, const char *magic, const char *salt) } return out_buf; + + err: + EVP_MD_CTX_free(md2); + EVP_MD_CTX_free(md); + return NULL; } # endif diff --git a/apps/speed.c b/apps/speed.c index 3b162e1058..f5f3b8cb51 100644 --- a/apps/speed.c +++ b/apps/speed.c @@ -601,9 +601,11 @@ static int EVP_Digest_MD2_loop(void *args) unsigned char *buf = tempargs->buf; unsigned char md2[MD2_DIGEST_LENGTH]; int count; - for (count = 0; COND(c[D_MD2][testnum]); count++) - EVP_Digest(buf, (unsigned long)lengths[testnum], &(md2[0]), NULL, - EVP_md2(), NULL); + for (count = 0; COND(c[D_MD2][testnum]); count++) { + if (!EVP_Digest(buf, (unsigned long)lengths[testnum], &(md2[0]), NULL, + EVP_md2(), NULL)) + return -1; + } return count; } #endif @@ -615,9 +617,11 @@ static int EVP_Digest_MDC2_loop(void *args) unsigned char *buf = tempargs->buf; unsigned char mdc2[MDC2_DIGEST_LENGTH]; int count; - for (count = 0; COND(c[D_MDC2][testnum]); count++) - EVP_Digest(buf, (unsigned long)lengths[testnum], &(mdc2[0]), NULL, - EVP_mdc2(), NULL); + for (count = 0; COND(c[D_MDC2][testnum]); count++) { + if (!EVP_Digest(buf, (unsigned long)lengths[testnum], &(mdc2[0]), NULL, + EVP_mdc2(), NULL)) + return -1; + } return count; } #endif @@ -629,9 +633,11 @@ static int EVP_Digest_MD4_loop(void *args) unsigned char *buf = tempargs->buf; unsigned char md4[MD4_DIGEST_LENGTH]; int count; - for (count = 0; COND(c[D_MD4][testnum]); count++) - EVP_Digest(&(buf[0]), (unsigned long)lengths[testnum], &(md4[0]), - NULL, EVP_md4(), NULL); + for (count = 0; COND(c[D_MD4][testnum]); count++) { + if (!EVP_Digest(&(buf[0]), (unsigned long)lengths[testnum], &(md4[0]), + NULL, EVP_md4(), NULL)) + return -1; + } return count; } #endif @@ -717,9 +723,11 @@ static int EVP_Digest_RMD160_loop(void *args) unsigned char *buf = tempargs->buf; unsigned char rmd160[RIPEMD160_DIGEST_LENGTH]; int count; - for (count = 0; COND(c[D_RMD160][testnum]); count++) - EVP_Digest(buf, (unsigned long)lengths[testnum], &(rmd160[0]), NULL, - EVP_ripemd160(), NULL); + for (count = 0; COND(c[D_RMD160][testnum]); count++) { + if (!EVP_Digest(buf, (unsigned long)lengths[testnum], &(rmd160[0]), + NULL, EVP_ripemd160(), NULL)) + return -1; + } return count; } #endif @@ -888,9 +896,10 @@ static int EVP_Digest_loop(void *args) unsigned char md[EVP_MAX_MD_SIZE]; int count; for (count = 0; - COND(save_count * 4 * lengths[0] / lengths[testnum]); count++) - EVP_Digest(buf, lengths[testnum], &(md[0]), NULL, evp_md, NULL); - + COND(save_count * 4 * lengths[0] / lengths[testnum]); count++) { + if (!EVP_Digest(buf, lengths[testnum], &(md[0]), NULL, evp_md, NULL)) + return -1; + } return count; } @@ -2845,6 +2854,10 @@ static void pkey_print_message(const char *str, const char *str2, long num, static void print_result(int alg, int run_no, int count, double time_used) { + if (count == -1) { + BIO_puts(bio_err, "EVP error!\n"); + exit(1); + } BIO_printf(bio_err, mr ? "+R:%d:%s:%f\n" : "%d %s's in %.2fs\n", count, names[alg], time_used); diff --git a/apps/ts.c b/apps/ts.c index 1ae57d2535..ffffe8a66a 100644 --- a/apps/ts.c +++ b/apps/ts.c @@ -492,28 +492,30 @@ static int create_digest(BIO *input, char *digest, const EVP_MD *md, unsigned char **md_value) { int md_value_len; + int rv = 0; + EVP_MD_CTX *md_ctx = NULL; md_value_len = EVP_MD_size(md); if (md_value_len < 0) return 0; if (input) { - EVP_MD_CTX *md_ctx = EVP_MD_CTX_new(); unsigned char buffer[4096]; int length; + md_ctx = EVP_MD_CTX_new(); if (md_ctx == NULL) return 0; *md_value = app_malloc(md_value_len, "digest buffer"); - EVP_DigestInit(md_ctx, md); + if (!EVP_DigestInit(md_ctx, md)) + goto err; while ((length = BIO_read(input, buffer, sizeof(buffer))) > 0) { - EVP_DigestUpdate(md_ctx, buffer, length); - } - if (!EVP_DigestFinal(md_ctx, *md_value, NULL)) { - EVP_MD_CTX_free(md_ctx); - return 0; + if (!EVP_DigestUpdate(md_ctx, buffer, length)) + goto err; } - EVP_MD_CTX_free(md_ctx); + if (!EVP_DigestFinal(md_ctx, *md_value, NULL)) + goto err; + md_value_len = EVP_MD_size(md); } else { long digest_len; *md_value = OPENSSL_hexstr2buf(digest, &digest_len); @@ -525,7 +527,10 @@ static int create_digest(BIO *input, char *digest, const EVP_MD *md, return 0; } } - return md_value_len; + rv = md_value_len; + err: + EVP_MD_CTX_free(md_ctx); + return rv; } static ASN1_INTEGER *create_nonce(int bits) -- cgit v1.2.3