diff --git a/lib/md4.c b/lib/md4.c index ff783eec21..06cfbb0b3e 100644 --- a/lib/md4.c +++ b/lib/md4.c @@ -53,7 +53,7 @@ static int my_md4_init(my_md4_ctx *ctx) if(!*ctx) return 0; - if(!EVP_DigestInit_ex(*ctx, EVP_md4(), NULL)) + if(!EVP_DigestInit_ex(*ctx, EVP_md4(), NULL)) { EVP_MD_CTX_free(*ctx); return 0; } diff --git a/lib/md5.c b/lib/md5.c index 1d9ca6f7bd..a80f637fae 100644 --- a/lib/md5.c +++ b/lib/md5.c @@ -65,10 +65,11 @@ static void my_md5_update(void *ctx, static void my_md5_final(unsigned char *digest, void *ctx) { + if(digest) #if NETTLE_VERSION_MAJOR >= 4 - md5_digest(ctx, digest); + md5_digest(ctx, digest); #else - md5_digest(ctx, MD5_DIGEST_LEN, digest); + md5_digest(ctx, MD5_DIGEST_LEN, digest); #endif } @@ -102,7 +103,8 @@ static void my_md5_update(void *in, static void my_md5_final(unsigned char *digest, void *in) { EVP_MD_CTX **ctx = (EVP_MD_CTX **)in; - (void)EVP_DigestFinal_ex(*ctx, digest, NULL); + if(digest) + (void)EVP_DigestFinal_ex(*ctx, digest, NULL); EVP_MD_CTX_free(*ctx); *ctx = NULL; } @@ -127,7 +129,8 @@ static void my_md5_update(void *ctx, static void my_md5_final(unsigned char *digest, void *ctx) { - (void)wc_Md5Final(ctx, digest); + if(digest) + (void)wc_Md5Final(ctx, digest); } #elif defined(USE_MBEDTLS) && \ @@ -153,8 +156,10 @@ static void my_md5_update(void *ctx, static void my_md5_final(unsigned char *digest, void *ctx) { - size_t actual_length; - (void)psa_hash_finish(ctx, digest, MD5_DIGEST_LEN, &actual_length); + if(digest) { + size_t actual_length; + (void)psa_hash_finish(ctx, digest, MD5_DIGEST_LEN, &actual_length); + } } #elif (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && \ @@ -191,7 +196,8 @@ static void my_md5_update(void *ctx, static void my_md5_final(unsigned char *digest, void *ctx) { - CC_MD5_Final(digest, ctx); + if(digest) + CC_MD5_Final(digest, ctx); } #elif defined(USE_WIN32_CRYPTO) @@ -229,12 +235,17 @@ static void my_md5_update(void *in, static void my_md5_final(unsigned char *digest, void *in) { my_md5_ctx *ctx = (my_md5_ctx *)in; - unsigned long length = 0; - CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0); - if(length == MD5_DIGEST_LEN) - CryptGetHashParam(ctx->hHash, HP_HASHVAL, digest, &length, 0); + + if(digest) { + unsigned long length = 0; + CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0); + if(length == MD5_DIGEST_LEN) + CryptGetHashParam(ctx->hHash, HP_HASHVAL, digest, &length, 0); + } + if(ctx->hHash) CryptDestroyHash(ctx->hHash); + if(ctx->hCryptProv) CryptReleaseContext(ctx->hCryptProv, 0); } @@ -485,6 +496,9 @@ static void my_md5_final(unsigned char *digest, void *in) unsigned int used, available; my_md5_ctx *ctx = (my_md5_ctx *)in; + if(!digest) + return; + used = ctx->lo & 0x3f; ctx->buffer[used++] = 0x80; diff --git a/lib/sha256.c b/lib/sha256.c index bfe57f1d09..0ac53a0f51 100644 --- a/lib/sha256.c +++ b/lib/sha256.c @@ -81,7 +81,8 @@ static void my_sha256_update(void *in, static void my_sha256_final(unsigned char *digest, void *in) { EVP_MD_CTX **ctx = (EVP_MD_CTX **)in; - (void)EVP_DigestFinal_ex(*ctx, digest, NULL); + if(digest) + (void)EVP_DigestFinal_ex(*ctx, digest, NULL); EVP_MD_CTX_free(*ctx); *ctx = NULL; } @@ -108,7 +109,8 @@ static void my_sha256_update(void *in, static void my_sha256_final(unsigned char *digest, void *in) { - (void)wc_Sha256Final(in, digest); + if(digest) + (void)wc_Sha256Final(in, digest); } #elif defined(USE_GNUTLS) @@ -132,10 +134,11 @@ static void my_sha256_update(void *ctx, static void my_sha256_final(unsigned char *digest, void *ctx) { + if(digest) #if NETTLE_VERSION_MAJOR >= 4 - sha256_digest(ctx, digest); + sha256_digest(ctx, digest); #else - sha256_digest(ctx, SHA256_DIGEST_SIZE, digest); + sha256_digest(ctx, SHA256_DIGEST_SIZE, digest); #endif } @@ -163,9 +166,11 @@ static void my_sha256_update(void *ctx, static void my_sha256_final(unsigned char *digest, void *ctx) { - size_t actual_length; - (void)psa_hash_finish(ctx, digest, CURL_SHA256_DIGEST_LENGTH, - &actual_length); + if(digest) { + size_t actual_length; + (void)psa_hash_finish(ctx, digest, CURL_SHA256_DIGEST_LENGTH, + &actual_length); + } } #elif (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && \ @@ -191,7 +196,8 @@ static void my_sha256_update(void *ctx, static void my_sha256_final(unsigned char *digest, void *ctx) { - (void)CC_SHA256_Final(digest, ctx); + if(digest) + (void)CC_SHA256_Final(digest, ctx); } #elif defined(USE_WIN32_CRYPTO) @@ -230,11 +236,13 @@ static void my_sha256_update(void *in, static void my_sha256_final(unsigned char *digest, void *in) { my_sha256_ctx *ctx = (my_sha256_ctx *)in; - unsigned long length = 0; - CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0); - if(length == CURL_SHA256_DIGEST_LENGTH) - CryptGetHashParam(ctx->hHash, HP_HASHVAL, digest, &length, 0); + if(digest) { + unsigned long length = 0; + CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0); + if(length == CURL_SHA256_DIGEST_LENGTH) + CryptGetHashParam(ctx->hHash, HP_HASHVAL, digest, &length, 0); + } if(ctx->hHash) CryptDestroyHash(ctx->hHash); @@ -430,6 +438,9 @@ static void my_sha256_final(unsigned char *out, void *ctx) struct sha256_state *md = ctx; int i; + if(!out) + return; + if(md->curlen >= sizeof(md->buf)) return;