]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto: authencesn - reject short ahash digests during instance creation
authorYucheng Lu <kanolyc@gmail.com>
Wed, 22 Apr 2026 13:45:04 +0000 (21:45 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 23 Apr 2026 05:44:06 +0000 (13:44 +0800)
authencesn requires either a zero authsize or an authsize of at least
4 bytes because the ESN encrypt/decrypt paths always move 4 bytes of
high-order sequence number data at the end of the authenticated data.

While crypto_authenc_esn_setauthsize() already rejects explicit
non-zero authsizes in the range 1..3, crypto_authenc_esn_create()
still copied auth->digestsize into inst->alg.maxauthsize without
validating it.  The AEAD core then initialized the tfm's default
authsize from that value.

As a result, selecting an ahash with digest size 1..3, such as
cbcmac(cipher_null), exposed authencesn instances whose default
authsize was invalid even though setauthsize() would have rejected the
same value.  AF_ALG could then trigger the ESN tail handling with a
too-short tag and hit an out-of-bounds access.

Reject authencesn instances whose ahash digest size is in the invalid
non-zero range 1..3 so that no tfm can inherit an unsupported default
authsize.

Fixes: f15f05b0a5de ("crypto: ccm - switch to separate cbcmac driver")
Cc: stable@kernel.org
Reported-by: Yifan Wu <yifanwucs@gmail.com>
Reported-by: Juefei Pu <tomapufckgml@gmail.com>
Co-developed-by: Yuan Tan <yuantan098@gmail.com>
Signed-off-by: Yuan Tan <yuantan098@gmail.com>
Suggested-by: Xin Liu <bird@lzu.edu.cn>
Tested-by: Yuhang Zheng <z1652074432@gmail.com>
Reviewed-by: Eric Biggers <ebiggers@kernel.org>
Signed-off-by: Yucheng Lu <kanolyc@gmail.com>
Signed-off-by: Ren Wei <n05ec@lzu.edu.cn>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/authencesn.c

index af3d584e584fbc9383afa35dd9d748953f3b99ac..522df41365d8f97e27e3be219b747a3d84a541bb 100644 (file)
@@ -390,6 +390,11 @@ static int crypto_authenc_esn_create(struct crypto_template *tmpl,
        auth = crypto_spawn_ahash_alg(&ctx->auth);
        auth_base = &auth->base;
 
+       if (auth->digestsize > 0 && auth->digestsize < 4) {
+               err = -EINVAL;
+               goto err_free_inst;
+       }
+
        err = crypto_grab_skcipher(&ctx->enc, aead_crypto_instance(inst),
                                   crypto_attr_alg_name(tb[2]), 0, mask);
        if (err)