vtls: more large buffer support and error checks for SHA-256

- 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
This commit is contained in:
Viktor Szakats 2026-05-27 10:06:34 +02:00
parent a1baacc670
commit 40f2da6ec3
No known key found for this signature in database
3 changed files with 29 additions and 15 deletions

View file

@ -2269,14 +2269,19 @@ static CURLcode gtls_random(struct Curl_easy *data,
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);

View file

@ -5454,26 +5454,28 @@ static CURLcode ossl_random(struct Curl_easy *data,
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)

View file

@ -2284,8 +2284,8 @@ static CURLcode wssl_random(struct Curl_easy *data,
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)
{
@ -2293,8 +2293,15 @@ static CURLcode wssl_sha256sum(const unsigned char *tmp, /* input */
(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;
}