Commit 2ae78da5c0 for openssl.org
commit 2ae78da5c0ed3fc0c4d7d3f5231a1dba40744db3
Author: Abel Thomas <abeltom.kernel@gmail.com>
Date: Tue Oct 6 20:06:36 2026 +0200
crypto/evp/digest.c: Fix EVP_MD digest size bounds check against EVP_MAX_MD_SIZE
evp_md_cache_constants() only validated the provider-reported
digest size against INT_MAX before caching it into md->md_size.
Every other consumer of md_size assumes it never exceeds
EVP_MAX_MD_SIZE, so a provider reporting a size between
EVP_MAX_MD_SIZE and INT_MAX could lead to buffer overflows
in callers using EVP_MAX_MD_SIZE-sized output buffers.
Check mdsize against EVP_MAX_MD_SIZE instead of INT_MAX.
Resolves: https://github.com/openssl/openssl/issues/32205
Reviewed-by: Mounir Idrassi <mounir.idrassi@idrix.fr>
Reviewed-by: Jakub Zelenka <jakub.zelenka@openssl.foundation>
Reviewed-by: Eugene Syromiatnikov <esyr@openssl.org>
Merge-date: Tue Nov 10 16:21:27 2026
Merged-from: https://github.com/openssl/openssl/pull/32209
diff --git a/crypto/evp/digest.c b/crypto/evp/digest.c
index db7121f0a4..96d482cb0f 100644
--- a/crypto/evp/digest.c
+++ b/crypto/evp/digest.c
@@ -817,7 +817,7 @@ static int evp_md_cache_constants(EVP_MD *md)
&algid_absent);
params[4] = OSSL_PARAM_construct_end();
ok = evp_do_md_getparams(md, params) > 0;
- if (mdsize > INT_MAX || blksz > INT_MAX)
+ if ((mdsize > EVP_MAX_MD_SIZE) || (blksz > INT_MAX))
ok = 0;
if (ok) {
md->block_size = (int)blksz;