Skip to content

Commit 5aa58c3

Browse files
lexiaoxherbertx
authored andcommitted
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: d887c52 ("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>
1 parent d7e20b9 commit 5aa58c3

1 file changed

Lines changed: 8 additions & 2 deletions

File tree

crypto/algif_aead.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,10 @@ static int _aead_recvmsg(struct socket *sock, struct msghdr *msg,
7272
struct af_alg_ctx *ctx = ask->private;
7373
struct crypto_aead *tfm = pask->private;
7474
unsigned int as = crypto_aead_authsize(tfm);
75+
unsigned int ivsize = crypto_aead_ivsize(tfm);
7576
struct af_alg_async_req *areq;
7677
struct scatterlist *rsgl_src, *tsgl_src = NULL;
78+
void *iv;
7779
int err = 0;
7880
size_t used = 0; /* [in] TX bufs to be en/decrypted */
7981
size_t outlen = 0; /* [out] RX bufs produced by kernel */
@@ -125,10 +127,14 @@ static int _aead_recvmsg(struct socket *sock, struct msghdr *msg,
125127

126128
/* Allocate cipher request for current operation. */
127129
areq = af_alg_alloc_areq(sk, sizeof(struct af_alg_async_req) +
128-
crypto_aead_reqsize(tfm));
130+
crypto_aead_reqsize(tfm) + ivsize);
129131
if (IS_ERR(areq))
130132
return PTR_ERR(areq);
131133

134+
iv = (u8 *)aead_request_ctx(&areq->cra_u.aead_req) +
135+
crypto_aead_reqsize(tfm);
136+
memcpy(iv, ctx->iv, ivsize);
137+
132138
/* convert iovecs of output buffers into RX SGL */
133139
err = af_alg_get_rsgl(sk, msg, flags, areq, outlen, &usedpages);
134140
if (err)
@@ -187,7 +193,7 @@ static int _aead_recvmsg(struct socket *sock, struct msghdr *msg,
187193

188194
/* Initialize the crypto operation */
189195
aead_request_set_crypt(&areq->cra_u.aead_req, tsgl_src,
190-
areq->first_rsgl.sgl.sgt.sgl, used, ctx->iv);
196+
areq->first_rsgl.sgl.sgt.sgl, used, iv);
191197
aead_request_set_ad(&areq->cra_u.aead_req, ctx->aead_assoclen);
192198
aead_request_set_tfm(&areq->cra_u.aead_req, tfm);
193199

0 commit comments

Comments
 (0)