* [PATCH v2 0/2] PAES - Fix rc handling at skcipher_walk_done
@ 2026-08-05 15:54 Harald Freudenberger
2026-08-05 15:54 ` [PATCH v2 1/2] s390/crypto: Fix return code handling at skcipher_walk_done in PAES algorithms Harald Freudenberger
2026-08-05 15:54 ` [PATCH v2 2/2] s390/crypto: Explicit scrub temp buffer in PAES ctr mode algorithm Harald Freudenberger
0 siblings, 2 replies; 5+ messages in thread
From: Harald Freudenberger @ 2026-08-05 15:54 UTC (permalink / raw)
To: dengler, fcallies, ifranzki
Cc: freude, linux-s390, Heiko Carstens, Vasily Gorbik,
Alexander Gordeev, linux-crypto
All the 4 PAES cipher processing loops were not checking the return
value of skcipher_walk_done() immediately after calling it. This could
lead to error masking when both the walk operation failed and a
subsequent key conversion was needed (k < n condition).
Add immediate error checks after skcipher_walk_done() in all main
processing loops (ECB, CBC, CTR, XTS modes) to ensure walk errors are
properly propagated and not masked by subsequent operations.
Patch #2 deals with a not scrubbed temp buffer.
Changelog:
v1: initial patch
v2: - Sashiko found that now there is a possibility to double
de-allocate resources held by the walk. So another check if the
walk has already been finalized is now part of the patch.
- Sashiko also stumbled over a not scrubbed temp buffer with the
PAES ctr mode implementation. So another patch added which
scrubs this buffer.
Harald Freudenberger (2):
s390/crypto: Fix return code handling at skcipher_walk_done in PAES
algorithms
s390/crypto: Explicit scrub temp buffer in PAES ctr mode algorithm
arch/s390/crypto/paes_s390.c | 39 ++++++++++++++++++++++++++----------
1 file changed, 28 insertions(+), 11 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH v2 1/2] s390/crypto: Fix return code handling at skcipher_walk_done in PAES algorithms 2026-08-05 15:54 [PATCH v2 0/2] PAES - Fix rc handling at skcipher_walk_done Harald Freudenberger @ 2026-08-05 15:54 ` Harald Freudenberger 2026-08-06 4:50 ` Finn Callies 2026-08-05 15:54 ` [PATCH v2 2/2] s390/crypto: Explicit scrub temp buffer in PAES ctr mode algorithm Harald Freudenberger 1 sibling, 1 reply; 5+ messages in thread From: Harald Freudenberger @ 2026-08-05 15:54 UTC (permalink / raw) To: dengler, fcallies, ifranzki Cc: freude, linux-s390, Heiko Carstens, Vasily Gorbik, Alexander Gordeev, linux-crypto All the 4 PAES cipher processing loops were not checking the return value of skcipher_walk_done() immediately after calling it. This could lead to error masking when both the walk operation failed and a subsequent key conversion was needed (k < n condition). Add immediate error checks after skcipher_walk_done() in all main processing loops (ECB, CBC, CTR, XTS modes) to ensure walk errors are properly propagated and not masked by subsequent operations. With that comes a slight rework around the skcipher_walk_done() invocation. It is now necessary to check if the walk has already been finalized (walk->nbytes is then 0) or not to avoid double de-allocation of resources held by the walk. Fixes: 6cd87cb5ef6c ("s390/crypto: Rework protected key AES for true asynch support") Signed-off-by: Harald Freudenberger <freude@linux.ibm.com> Cc: stable@vger.kernel.org # 6.16+ --- arch/s390/crypto/paes_s390.c | 38 +++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/arch/s390/crypto/paes_s390.c b/arch/s390/crypto/paes_s390.c index 973436592318..89785ab95e6b 100644 --- a/arch/s390/crypto/paes_s390.c +++ b/arch/s390/crypto/paes_s390.c @@ -432,8 +432,11 @@ static int ecb_paes_do_crypt(struct s390_paes_ctx *ctx, n = nbytes & ~(AES_BLOCK_SIZE - 1); k = cpacf_km(ctx->fc | req_ctx->modifier, param, walk->dst.virt.addr, walk->src.virt.addr, n); - if (k) + if (k) { rc = skcipher_walk_done(walk, nbytes - k); + if (rc) + goto out; + } if (k < n) { if (!maysleep) { rc = -EKEYEXPIRED; @@ -495,7 +498,7 @@ static int ecb_paes_crypt(struct skcipher_request *req, unsigned long modifier) atomic_dec(&ctx->via_engine_ctr); } - if (rc != -EINPROGRESS) + if (rc != -EINPROGRESS && walk->nbytes) skcipher_walk_done(walk, rc); out: @@ -549,7 +552,7 @@ static int ecb_paes_do_one_request(struct crypto_engine *engine, void *areq) rc = ecb_paes_do_crypt(ctx, req_ctx, tested, true); if (rc == -EKEYEXPIRED) { return pkey_handle_expired(); - } else if (rc) { + } else if (rc && walk->nbytes) { skcipher_walk_done(walk, rc); } @@ -690,6 +693,8 @@ static int cbc_paes_do_crypt(struct s390_paes_ctx *ctx, if (k) { memcpy(walk->iv, param->iv, AES_BLOCK_SIZE); rc = skcipher_walk_done(walk, nbytes - k); + if (rc) + goto out; } if (k < n) { if (!maysleep) { @@ -752,7 +757,7 @@ static int cbc_paes_crypt(struct skcipher_request *req, unsigned long modifier) atomic_dec(&ctx->via_engine_ctr); } - if (rc != -EINPROGRESS) + if (rc != -EINPROGRESS && walk->nbytes) skcipher_walk_done(walk, rc); out: @@ -806,7 +811,7 @@ static int cbc_paes_do_one_request(struct crypto_engine *engine, void *areq) rc = cbc_paes_do_crypt(ctx, req_ctx, tested, true); if (rc == -EKEYEXPIRED) { return pkey_handle_expired(); - } else if (rc) { + } else if (rc && walk->nbytes) { skcipher_walk_done(walk, rc); } @@ -968,6 +973,11 @@ static int ctr_paes_do_crypt(struct s390_paes_ctx *ctx, AES_BLOCK_SIZE); crypto_inc(walk->iv, AES_BLOCK_SIZE); rc = skcipher_walk_done(walk, nbytes - k); + if (rc) { + if (locked) + mutex_unlock(&ctrblk_lock); + goto out; + } } if (k < n) { if (!maysleep) { @@ -1061,7 +1071,7 @@ static int ctr_paes_crypt(struct skcipher_request *req) atomic_dec(&ctx->via_engine_ctr); } - if (rc != -EINPROGRESS) + if (rc != -EINPROGRESS && walk->nbytes) skcipher_walk_done(walk, rc); out: @@ -1105,7 +1115,7 @@ static int ctr_paes_do_one_request(struct crypto_engine *engine, void *areq) rc = ctr_paes_do_crypt(ctx, req_ctx, tested, true); if (rc == -EKEYEXPIRED) { return pkey_handle_expired(); - } else if (rc) { + } else if (rc && walk->nbytes) { skcipher_walk_done(walk, rc); } @@ -1283,8 +1293,11 @@ static int xts_paes_do_crypt_fullkey(struct s390_pxts_ctx *ctx, n = nbytes & ~(AES_BLOCK_SIZE - 1); k = cpacf_km(ctx->fc | req_ctx->modifier, param->key + offset, walk->dst.virt.addr, walk->src.virt.addr, n); - if (k) + if (k) { rc = skcipher_walk_done(walk, nbytes - k); + if (rc) + goto out; + } if (k < n) { if (!maysleep) { rc = -EKEYEXPIRED; @@ -1377,8 +1390,11 @@ static int xts_paes_do_crypt_2keys(struct s390_pxts_ctx *ctx, n = nbytes & ~(AES_BLOCK_SIZE - 1); k = cpacf_km(ctx->fc | req_ctx->modifier, param->key + offset, walk->dst.virt.addr, walk->src.virt.addr, n); - if (k) + if (k) { rc = skcipher_walk_done(walk, nbytes - k); + if (rc) + goto out; + } if (k < n) { if (!maysleep) { rc = -EKEYEXPIRED; @@ -1485,7 +1501,7 @@ static inline int xts_paes_crypt(struct skcipher_request *req, unsigned long mod atomic_dec(&ctx->via_engine_ctr); } - if (rc != -EINPROGRESS) + if (rc != -EINPROGRESS && walk->nbytes) skcipher_walk_done(walk, rc); out: @@ -1539,7 +1555,7 @@ static int xts_paes_do_one_request(struct crypto_engine *engine, void *areq) rc = xts_paes_do_crypt(ctx, req_ctx, tested, true); if (rc == -EKEYEXPIRED) { return pkey_handle_expired(); - } else if (rc) { + } else if (rc && walk->nbytes) { skcipher_walk_done(walk, rc); } -- 2.43.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] s390/crypto: Fix return code handling at skcipher_walk_done in PAES algorithms 2026-08-05 15:54 ` [PATCH v2 1/2] s390/crypto: Fix return code handling at skcipher_walk_done in PAES algorithms Harald Freudenberger @ 2026-08-06 4:50 ` Finn Callies 0 siblings, 0 replies; 5+ messages in thread From: Finn Callies @ 2026-08-06 4:50 UTC (permalink / raw) To: Harald Freudenberger, dengler, ifranzki Cc: linux-s390, Heiko Carstens, Vasily Gorbik, Alexander Gordeev, linux-crypto On 05.08.26 17:54, Harald Freudenberger wrote: > All the 4 PAES cipher processing loops were not checking the return > value of skcipher_walk_done() immediately after calling it. This could > lead to error masking when both the walk operation failed and a > subsequent key conversion was needed (k < n condition). > > Add immediate error checks after skcipher_walk_done() in all main > processing loops (ECB, CBC, CTR, XTS modes) to ensure walk errors are > properly propagated and not masked by subsequent operations. > > With that comes a slight rework around the skcipher_walk_done() > invocation. It is now necessary to check if the walk has already been > finalized (walk->nbytes is then 0) or not to avoid double > de-allocation of resources held by the walk. > > Fixes: 6cd87cb5ef6c ("s390/crypto: Rework protected key AES for true asynch support") > Signed-off-by: Harald Freudenberger <freude@linux.ibm.com> > Cc: stable@vger.kernel.org # 6.16+ > --- > arch/s390/crypto/paes_s390.c | 38 +++++++++++++++++++++++++----------- > 1 file changed, 27 insertions(+), 11 deletions(-) [ snip ] LGTM Reviewed-by: Finn Callies <fcallies@linux.ibm.com> ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] s390/crypto: Explicit scrub temp buffer in PAES ctr mode algorithm 2026-08-05 15:54 [PATCH v2 0/2] PAES - Fix rc handling at skcipher_walk_done Harald Freudenberger 2026-08-05 15:54 ` [PATCH v2 1/2] s390/crypto: Fix return code handling at skcipher_walk_done in PAES algorithms Harald Freudenberger @ 2026-08-05 15:54 ` Harald Freudenberger 2026-08-06 4:50 ` Finn Callies 1 sibling, 1 reply; 5+ messages in thread From: Harald Freudenberger @ 2026-08-05 15:54 UTC (permalink / raw) To: dengler, fcallies, ifranzki Cc: freude, linux-s390, Heiko Carstens, Vasily Gorbik, Alexander Gordeev, linux-crypto In function ctr_paes_do_crypt() there is a buffer used to process remaining bytes < AES_BLOCK_SIZE. This buffer was not scrubbed and thus could lead to expose of unwanted data. On exit of the function unconditionally scrub this buffer to avoid exposure of maybe sensitive data. Fixes: 6cd87cb5ef6c ("s390/crypto: Rework protected key AES for true asynch support") Signed-off-by: Harald Freudenberger <freude@linux.ibm.com> Cc: stable@vger.kernel.org # 6.16+ --- arch/s390/crypto/paes_s390.c | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/s390/crypto/paes_s390.c b/arch/s390/crypto/paes_s390.c index 89785ab95e6b..c95cc80b4205 100644 --- a/arch/s390/crypto/paes_s390.c +++ b/arch/s390/crypto/paes_s390.c @@ -1026,6 +1026,7 @@ static int ctr_paes_do_crypt(struct s390_paes_ctx *ctx, } out: + memzero_explicit(buf, sizeof(buf)); pr_debug("rc=%d\n", rc); return rc; } -- 2.43.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 2/2] s390/crypto: Explicit scrub temp buffer in PAES ctr mode algorithm 2026-08-05 15:54 ` [PATCH v2 2/2] s390/crypto: Explicit scrub temp buffer in PAES ctr mode algorithm Harald Freudenberger @ 2026-08-06 4:50 ` Finn Callies 0 siblings, 0 replies; 5+ messages in thread From: Finn Callies @ 2026-08-06 4:50 UTC (permalink / raw) To: Harald Freudenberger, dengler, ifranzki Cc: linux-s390, Heiko Carstens, Vasily Gorbik, Alexander Gordeev, linux-crypto On 05.08.26 17:54, Harald Freudenberger wrote: > In function ctr_paes_do_crypt() there is a buffer used to process > remaining bytes < AES_BLOCK_SIZE. This buffer was not scrubbed and > thus could lead to expose of unwanted data. > > On exit of the function unconditionally scrub this buffer to avoid > exposure of maybe sensitive data. > > Fixes: 6cd87cb5ef6c ("s390/crypto: Rework protected key AES for true asynch support") > Signed-off-by: Harald Freudenberger <freude@linux.ibm.com> > Cc: stable@vger.kernel.org # 6.16+ > --- > arch/s390/crypto/paes_s390.c | 1 + > 1 file changed, 1 insertion(+) [ snip ] LGTM Reviewed-by: Finn Callies <fcallies@linux.ibm.com> ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-08-06 4:50 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-08-05 15:54 [PATCH v2 0/2] PAES - Fix rc handling at skcipher_walk_done Harald Freudenberger 2026-08-05 15:54 ` [PATCH v2 1/2] s390/crypto: Fix return code handling at skcipher_walk_done in PAES algorithms Harald Freudenberger 2026-08-06 4:50 ` Finn Callies 2026-08-05 15:54 ` [PATCH v2 2/2] s390/crypto: Explicit scrub temp buffer in PAES ctr mode algorithm Harald Freudenberger 2026-08-06 4:50 ` Finn Callies
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox