Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

crypto: algif_aead - snapshot IV for async AEAD requests

AF_ALG AEAD AIO requests currently use the socket-wide IV buffer during
request processing. For async requests, later socket activity can
update that shared state before the original request has fully
completed, which can lead to inconsistent IV handling.

Snapshot the IV into per-request storage when preparing the AEAD
request, so in-flight operations no longer depend on mutable socket
state.

Fixes: d887c52d6ae4 ("crypto: algif_aead - overhaul memory management")
Cc: stable@kernel.org
Reported-by: Yuan Tan <yuantan098@gmail.com>
Reported-by: Yifan Wu <yifanwucs@gmail.com>
Reported-by: Juefei Pu <tomapufckgml@gmail.com>
Reported-by: Xin Liu <bird@lzu.edu.cn>
Co-developed-by: Luxing Yin <tr0jan@lzu.edu.cn>
Signed-off-by: Luxing Yin <tr0jan@lzu.edu.cn>
Tested-by: Yucheng Lu <kanolyc@gmail.com>
Signed-off-by: Douya Le <ldy3087146292@gmail.com>
Signed-off-by: Ren Wei <n05ec@lzu.edu.cn>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Douya Le and committed by
Herbert Xu
5aa58c3a d7e20b9b

+8 -2
+8 -2
crypto/algif_aead.c
··· 72 72 struct af_alg_ctx *ctx = ask->private; 73 73 struct crypto_aead *tfm = pask->private; 74 74 unsigned int as = crypto_aead_authsize(tfm); 75 + unsigned int ivsize = crypto_aead_ivsize(tfm); 75 76 struct af_alg_async_req *areq; 76 77 struct scatterlist *rsgl_src, *tsgl_src = NULL; 78 + void *iv; 77 79 int err = 0; 78 80 size_t used = 0; /* [in] TX bufs to be en/decrypted */ 79 81 size_t outlen = 0; /* [out] RX bufs produced by kernel */ ··· 127 125 128 126 /* Allocate cipher request for current operation. */ 129 127 areq = af_alg_alloc_areq(sk, sizeof(struct af_alg_async_req) + 130 - crypto_aead_reqsize(tfm)); 128 + crypto_aead_reqsize(tfm) + ivsize); 131 129 if (IS_ERR(areq)) 132 130 return PTR_ERR(areq); 131 + 132 + iv = (u8 *)aead_request_ctx(&areq->cra_u.aead_req) + 133 + crypto_aead_reqsize(tfm); 134 + memcpy(iv, ctx->iv, ivsize); 133 135 134 136 /* convert iovecs of output buffers into RX SGL */ 135 137 err = af_alg_get_rsgl(sk, msg, flags, areq, outlen, &usedpages); ··· 193 187 194 188 /* Initialize the crypto operation */ 195 189 aead_request_set_crypt(&areq->cra_u.aead_req, tsgl_src, 196 - areq->first_rsgl.sgl.sgt.sgl, used, ctx->iv); 190 + areq->first_rsgl.sgl.sgt.sgl, used, iv); 197 191 aead_request_set_ad(&areq->cra_u.aead_req, ctx->aead_assoclen); 198 192 aead_request_set_tfm(&areq->cra_u.aead_req, tfm); 199 193