- gnutls: support 4GiB+ SHA-256 digest inputs.
- openssl: check success of low-level update/finish digest calls.
- openssl: pass NULL to `EVP_DigestFinal_ex()` instead of discarding
returned value.
- wolfssl: support 4GiB+ SHA-256 digest inputs.
- wolfssl: check success of low-level update/finish digest calls.
- sync and tidy up argument names in low-level sha256_sum functions.
Closes #21771
return rc ? CURLE_FAILED_INIT : CURLE_OK;
}
-static CURLcode gtls_sha256sum(const unsigned char *tmp, /* input */
- size_t tmplen,
+static CURLcode gtls_sha256sum(const unsigned char *input,
+ size_t len,
unsigned char *sha256sum, /* output */
size_t sha256len)
{
struct sha256_ctx SHA256pw;
sha256_init(&SHA256pw);
- sha256_update(&SHA256pw, (unsigned int)tmplen, tmp);
+ do {
+ unsigned int ilen = (unsigned int)CURLMIN(len, UINT_MAX);
+ sha256_update(&SHA256pw, ilen, input);
+ len -= ilen;
+ input += ilen;
+ } while(len);
#if NETTLE_VERSION_MAJOR >= 4
(void)sha256len;
sha256_digest(&SHA256pw, sha256sum);
return rc == 1 ? CURLE_OK : CURLE_FAILED_INIT;
}
-static CURLcode ossl_sha256sum(const unsigned char *tmp, /* input */
- size_t tmplen,
+static CURLcode ossl_sha256sum(const unsigned char *input,
+ size_t len,
unsigned char *sha256sum /* output */,
size_t unused)
{
+ CURLcode result = CURLE_OK;
EVP_MD_CTX *mdctx;
- unsigned int len = 0;
(void)unused;
mdctx = EVP_MD_CTX_create();
if(!mdctx)
return CURLE_OUT_OF_MEMORY;
if(!EVP_DigestInit(mdctx, EVP_sha256())) {
- EVP_MD_CTX_destroy(mdctx);
- return CURLE_FAILED_INIT;
+ result = CURLE_FAILED_INIT;
+ goto out;
}
- EVP_DigestUpdate(mdctx, tmp, tmplen);
- EVP_DigestFinal_ex(mdctx, sha256sum, &len);
+ if(!EVP_DigestUpdate(mdctx, input, len) ||
+ !EVP_DigestFinal_ex(mdctx, sha256sum, NULL))
+ result = CURLE_BAD_FUNCTION_ARGUMENT;
+out:
EVP_MD_CTX_destroy(mdctx);
- return CURLE_OK;
+ return result;
}
static bool ossl_cert_status_request(void)
return CURLE_OK;
}
-static CURLcode wssl_sha256sum(const unsigned char *tmp, /* input */
- size_t tmplen,
+static CURLcode wssl_sha256sum(const unsigned char *input,
+ size_t len,
unsigned char *sha256sum /* output */,
size_t unused)
{
(void)unused;
if(wc_InitSha256(&SHA256pw))
return CURLE_FAILED_INIT;
- wc_Sha256Update(&SHA256pw, tmp, (word32)tmplen);
- wc_Sha256Final(&SHA256pw, sha256sum);
+ do {
+ word32 ilen = (word32)CURLMIN(len, UINT32_MAX);
+ if(wc_Sha256Update(&SHA256pw, input, ilen))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ len -= ilen;
+ input += ilen;
+ } while(len);
+ if(wc_Sha256Final(&SHA256pw, sha256sum))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
return CURLE_OK;
}