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

crypto/arm64: sm4/xts - Merge ksimd scopes to reduce stack bloat

Merge the two ksimd scopes in the implementation of SM4-XTS to prevent
stack bloat in cases where the compiler fails to combine the stack slots
for the kernel mode FP/SIMD buffers.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Tested-by: Arnd Bergmann <arnd@arndb.de>
Link: https://lore.kernel.org/r/20251203163803.157541-6-ardb@kernel.org
Signed-off-by: Eric Biggers <ebiggers@kernel.org>

authored by

Ard Biesheuvel and committed by
Eric Biggers
6f7d9481 a9a8b1a3

+22 -24
+22 -24
arch/arm64/crypto/sm4-ce-glue.c
··· 346 346 tail = 0; 347 347 } 348 348 349 - while ((nbytes = walk.nbytes) >= SM4_BLOCK_SIZE) { 350 - if (nbytes < walk.total) 351 - nbytes &= ~(SM4_BLOCK_SIZE - 1); 349 + scoped_ksimd() { 350 + while ((nbytes = walk.nbytes) >= SM4_BLOCK_SIZE) { 351 + if (nbytes < walk.total) 352 + nbytes &= ~(SM4_BLOCK_SIZE - 1); 352 353 353 - scoped_ksimd() { 354 354 if (encrypt) 355 355 sm4_ce_xts_enc(ctx->key1.rkey_enc, walk.dst.virt.addr, 356 356 walk.src.virt.addr, walk.iv, nbytes, ··· 359 359 sm4_ce_xts_dec(ctx->key1.rkey_dec, walk.dst.virt.addr, 360 360 walk.src.virt.addr, walk.iv, nbytes, 361 361 rkey2_enc); 362 + 363 + rkey2_enc = NULL; 364 + 365 + err = skcipher_walk_done(&walk, walk.nbytes - nbytes); 366 + if (err) 367 + return err; 362 368 } 363 369 364 - rkey2_enc = NULL; 370 + if (likely(tail == 0)) 371 + return 0; 365 372 366 - err = skcipher_walk_done(&walk, walk.nbytes - nbytes); 373 + /* handle ciphertext stealing */ 374 + 375 + dst = src = scatterwalk_ffwd(sg_src, req->src, subreq.cryptlen); 376 + if (req->dst != req->src) 377 + dst = scatterwalk_ffwd(sg_dst, req->dst, subreq.cryptlen); 378 + 379 + skcipher_request_set_crypt(&subreq, src, dst, 380 + SM4_BLOCK_SIZE + tail, req->iv); 381 + 382 + err = skcipher_walk_virt(&walk, &subreq, false); 367 383 if (err) 368 384 return err; 369 - } 370 385 371 - if (likely(tail == 0)) 372 - return 0; 373 - 374 - /* handle ciphertext stealing */ 375 - 376 - dst = src = scatterwalk_ffwd(sg_src, req->src, subreq.cryptlen); 377 - if (req->dst != req->src) 378 - dst = scatterwalk_ffwd(sg_dst, req->dst, subreq.cryptlen); 379 - 380 - skcipher_request_set_crypt(&subreq, src, dst, SM4_BLOCK_SIZE + tail, 381 - req->iv); 382 - 383 - err = skcipher_walk_virt(&walk, &subreq, false); 384 - if (err) 385 - return err; 386 - 387 - scoped_ksimd() { 388 386 if (encrypt) 389 387 sm4_ce_xts_enc(ctx->key1.rkey_enc, walk.dst.virt.addr, 390 388 walk.src.virt.addr, walk.iv, walk.nbytes,