]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
KEYS: trusted_tpm1: Compare HMAC values in constant time
authorEric Biggers <ebiggers@kernel.org>
Mon, 20 Oct 2025 16:26:11 +0000 (12:26 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 29 Oct 2025 13:01:24 +0000 (14:01 +0100)
[ Upstream commit eed0e3d305530066b4fc5370107cff8ef1a0d229 ]

To prevent timing attacks, HMAC value comparison needs to be constant
time.  Replace the memcmp() with the correct function, crypto_memneq().

[For the Fixes commit I used the commit that introduced the memcmp().
It predates the introduction of crypto_memneq(), but it was still a bug
at the time even though a helper function didn't exist yet.]

Fixes: d00a1c72f7f4 ("keys: add new trusted key-type")
Cc: stable@vger.kernel.org
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
[ replaced crypto/utils.h include with crypto/algapi.h ]
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
security/keys/trusted-keys/trusted_tpm1.c

index 4c3cffcd296aca430e64d11d2aef9908de453915..3e9dc03d59c91e35a4c86bdf098e16e10fb2d001 100644 (file)
@@ -9,6 +9,7 @@
  */
 
 #include <crypto/hash_info.h>
+#include <crypto/algapi.h>
 #include <linux/uaccess.h>
 #include <linux/module.h>
 #include <linux/init.h>
@@ -248,7 +249,7 @@ int TSS_checkhmac1(unsigned char *buffer,
        if (ret < 0)
                goto out;
 
-       if (memcmp(testhmac, authdata, SHA1_DIGEST_SIZE))
+       if (crypto_memneq(testhmac, authdata, SHA1_DIGEST_SIZE))
                ret = -EINVAL;
 out:
        kfree_sensitive(sdesc);
@@ -341,7 +342,7 @@ static int TSS_checkhmac2(unsigned char *buffer,
                          TPM_NONCE_SIZE, ononce, 1, continueflag1, 0, 0);
        if (ret < 0)
                goto out;
-       if (memcmp(testhmac1, authdata1, SHA1_DIGEST_SIZE)) {
+       if (crypto_memneq(testhmac1, authdata1, SHA1_DIGEST_SIZE)) {
                ret = -EINVAL;
                goto out;
        }
@@ -350,7 +351,7 @@ static int TSS_checkhmac2(unsigned char *buffer,
                          TPM_NONCE_SIZE, ononce, 1, continueflag2, 0, 0);
        if (ret < 0)
                goto out;
-       if (memcmp(testhmac2, authdata2, SHA1_DIGEST_SIZE))
+       if (crypto_memneq(testhmac2, authdata2, SHA1_DIGEST_SIZE))
                ret = -EINVAL;
 out:
        kfree_sensitive(sdesc);