]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
lib: accept larger input to md5/hmac/sha256/sha512 functions
authorDaniel Stenberg <daniel@haxx.se>
Tue, 31 Mar 2026 09:22:34 +0000 (11:22 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 31 Mar 2026 15:19:56 +0000 (17:19 +0200)
Avoid unchecked data conversions from size_t to unsigned int.

Reported-by: James Fuller
Closes #21174

lib/curl_hmac.h
lib/curl_md5.h
lib/curl_sha256.h
lib/curl_sha512_256.c
lib/hmac.c
lib/md5.c
lib/sha256.c

index b9f218fac930074434dd50816ddbf4a2f2c29e1d..301d44fee8095a8f1662502fcd99c53cf4b65ea7 100644 (file)
@@ -57,14 +57,14 @@ struct HMAC_context {
 struct HMAC_context *Curl_HMAC_init(const struct HMAC_params *hashparams,
                                     const unsigned char *key,
                                     unsigned int keylen);
-int Curl_HMAC_update(struct HMAC_context *ctxt,
-                     const unsigned char *data,
-                     unsigned int len);
+void Curl_HMAC_update(struct HMAC_context *ctxt,
+                      const unsigned char *data,
+                      unsigned int len);
 int Curl_HMAC_final(struct HMAC_context *ctxt, unsigned char *output);
 
 CURLcode Curl_hmacit(const struct HMAC_params *hashparams,
                      const unsigned char *key, const size_t keylen,
-                     const unsigned char *data, const size_t datalen,
+                     const unsigned char *data, size_t datalen,
                      unsigned char *output);
 
 #endif
index 042c5f59ae5ecbb33a26f980be5da064629b370d..8a0cc2623e389a0b749c5fb90d4b17f4cdb2d54f 100644 (file)
@@ -54,7 +54,7 @@ extern const struct MD5_params Curl_DIGEST_MD5;
 extern const struct HMAC_params Curl_HMAC_MD5;
 
 CURLcode Curl_md5it(unsigned char *output, const unsigned char *input,
-                    const size_t len);
+                    size_t len);
 
 struct MD5_context *Curl_MD5_init(const struct MD5_params *md5params);
 CURLcode Curl_MD5_update(struct MD5_context *context,
index bc1512e6e8c20dd91e53c29704564ac7fb802091..6c48a8e1764c21abfff6a2e0b793925abb6b3df9 100644 (file)
@@ -38,7 +38,7 @@ extern const struct HMAC_params Curl_HMAC_SHA256;
 #endif
 
 CURLcode Curl_sha256it(unsigned char *output, const unsigned char *input,
-                       const size_t len);
+                       size_t len);
 
 #endif
 
index f3546d47862b18c421f24e6884a45e728f0f4c0b..57779886135026dd2dccff615683c4172ddcdeef 100644 (file)
@@ -202,8 +202,13 @@ static CURLcode Curl_sha512_256_update(void *ctx,
                                        const unsigned char *data,
                                        size_t length)
 {
-  if(wc_Sha512_256Update(ctx, data, (word32)length))
-    return CURLE_SSL_CIPHER;
+  do {
+    word32 ilen = (word32) CURLMIN(length, UINT_MAX);
+    if(wc_Sha512_256Update(ctx, data, ilen))
+      return CURLE_SSL_CIPHER;
+    length -= ilen;
+    data += ilen;
+  } while(length);
   return CURLE_OK;
 }
 
index 028b476c77a3bdeb67176c058410c5f8220463d5..6ae934d5474ce74dd1a6e3247e41117e83473a88 100644 (file)
@@ -98,13 +98,12 @@ fail:
   return NULL;
 }
 
-int Curl_HMAC_update(struct HMAC_context *ctxt,
-                     const unsigned char *data,
-                     unsigned int len)
+void Curl_HMAC_update(struct HMAC_context *ctxt,
+                      const unsigned char *data,
+                      unsigned int len)
 {
   /* Update first hash calculation. */
   ctxt->hash->hupdate(ctxt->hashctxt1, data, len);
-  return 0;
 }
 
 int Curl_HMAC_final(struct HMAC_context *ctxt, unsigned char *output)
@@ -143,17 +142,24 @@ int Curl_HMAC_final(struct HMAC_context *ctxt, unsigned char *output)
  */
 CURLcode Curl_hmacit(const struct HMAC_params *hashparams,
                      const unsigned char *key, const size_t keylen,
-                     const unsigned char *data, const size_t datalen,
+                     const unsigned char *data, size_t datalen,
                      unsigned char *output)
 {
-  struct HMAC_context *ctxt =
-    Curl_HMAC_init(hashparams, key, curlx_uztoui(keylen));
+  struct HMAC_context *ctxt;
+  if(keylen > UINT_MAX) /* unlikely to ever happen */
+    return CURLE_BAD_FUNCTION_ARGUMENT;
+  ctxt = Curl_HMAC_init(hashparams, key, curlx_uztoui(keylen));
 
   if(!ctxt)
     return CURLE_OUT_OF_MEMORY;
 
   /* Update the digest with the given challenge */
-  Curl_HMAC_update(ctxt, data, curlx_uztoui(datalen));
+  do {
+    unsigned int ilen = (unsigned int) CURLMIN(datalen, UINT_MAX);
+    Curl_HMAC_update(ctxt, data, ilen);
+    datalen -= ilen;
+    data += ilen;
+  } while(datalen);
 
   /* Finalise the digest */
   Curl_HMAC_final(ctxt, output);
index 88c18bce4eac25a8cdc54c0b8277e9fa930706d0..f44078ba1ea72096c26856391640ab925f76fbfb 100644 (file)
--- a/lib/md5.c
+++ b/lib/md5.c
@@ -540,14 +540,19 @@ const struct MD5_params Curl_DIGEST_MD5 = {
  * Returns CURLE_OK on success.
  */
 CURLcode Curl_md5it(unsigned char *output,
-                    const unsigned char *input, const size_t len)
+                    const unsigned char *input, size_t len)
 {
   CURLcode result;
   my_md5_ctx ctx;
 
   result = my_md5_init(&ctx);
   if(!result) {
-    my_md5_update(&ctx, input, curlx_uztoui(len));
+    do {
+      unsigned int ilen = (unsigned int) CURLMIN(len, UINT_MAX);
+      my_md5_update(&ctx, input, ilen);
+      input += ilen;
+      len -= len;
+    } while(len);
     my_md5_final(output, &ctx);
   }
   return result;
index a66832ad814781d84d33c78942275ce83ca4088a..ba747ec0424301b0b8204411ca92ccc67ed86d99 100644 (file)
@@ -478,14 +478,19 @@ static void my_sha256_final(unsigned char *out, void *ctx)
  * Returns CURLE_OK on success.
  */
 CURLcode Curl_sha256it(unsigned char *output, const unsigned char *input,
-                       const size_t len)
+                       size_t len)
 {
   CURLcode result;
   my_sha256_ctx ctx;
 
   result = my_sha256_init(&ctx);
   if(!result) {
-    my_sha256_update(&ctx, input, curlx_uztoui(len));
+    do {
+      unsigned int ilen = (unsigned int) CURLMIN(len, UINT_MAX);
+      my_sha256_update(&ctx, input, ilen);
+      len -= ilen;
+      input += ilen;
+    } while(len);
     my_sha256_final(output, &ctx);
   }
   return result;