Update hkdf.c to avoid potentially vulnerable code pattern
authorNicky Mouha <nmouha@users.noreply.github.com>
Wed, 17 May 2023 20:46:41 +0000 (16:46 -0400)
committerTomas Mraz <tomas@openssl.org>
Fri, 19 May 2023 10:43:27 +0000 (12:43 +0200)
The expression "if (a+b>c) a=c-b" is incorrect if "a+b" overflows.
It should be replaced by "if (a>c-b) a=c-b", which avoids the
potential overflow and is much easier to understand.

This pattern is the root cause of CVE-2022-37454, a buffer overflow
vulnerability in the "official" SHA-3 implementation.

It has been confirmed that the addition in
https://github.com/openssl/openssl/blob/master/providers/implementations/kdfs/hkdf.c#L534
cannot overflow. So this is only a minor change proposal to avoid
a potentially vulnerable code pattern and to improve readability.
More information: https://github.com/github/codeql/pull/12036#issuecomment-1466056959

CLA: trivial

Reviewed-by: Paul Dale <pauli@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/20990)

(cherry picked from commit 56a51b5a1ecd54eadc80bed4bfe5044a340787c1)

providers/implementations/kdfs/hkdf.c

index 6701b05f240169c29481bb2db422260305032b38..5ff1db6fa882360ca0673735d9d4b273c0f5531b 100644 (file)
@@ -586,7 +586,7 @@ static int HKDF_Expand(const EVP_MD *evp_md,
         if (!HMAC_Final(hmac, prev, NULL))
             goto err;
 
-        copy_len = (done_len + dig_len > okm_len) ?
+        copy_len = (dig_len > okm_len - done_len) ?
                        okm_len - done_len :
                        dig_len;