| From ee483d32ee1a1a7f7d7e918fbc350c790a5af64a Mon Sep 17 00:00:00 2001 |
| From: Christophe Leroy <christophe.leroy@c-s.fr> |
| Date: Tue, 21 May 2019 13:34:12 +0000 |
| Subject: crypto: talitos - check data blocksize in ablkcipher. |
| |
| From: Christophe Leroy <christophe.leroy@c-s.fr> |
| |
| commit ee483d32ee1a1a7f7d7e918fbc350c790a5af64a upstream. |
| |
| When data size is not a multiple of the alg's block size, |
| the SEC generates an error interrupt and dumps the registers. |
| And for NULL size, the SEC does just nothing and the interrupt |
| is awaited forever. |
| |
| This patch ensures the data size is correct before submitting |
| the request to the SEC engine. |
| |
| Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> |
| Fixes: 4de9d0b547b9 ("crypto: talitos - Add ablkcipher algorithms") |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/crypto/talitos.c | 16 ++++++++++++++++ |
| 1 file changed, 16 insertions(+) |
| |
| --- a/drivers/crypto/talitos.c |
| +++ b/drivers/crypto/talitos.c |
| @@ -1668,6 +1668,14 @@ static int ablkcipher_encrypt(struct abl |
| struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq); |
| struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher); |
| struct talitos_edesc *edesc; |
| + unsigned int blocksize = |
| + crypto_tfm_alg_blocksize(crypto_ablkcipher_tfm(cipher)); |
| + |
| + if (!areq->nbytes) |
| + return 0; |
| + |
| + if (areq->nbytes % blocksize) |
| + return -EINVAL; |
| |
| /* allocate extended descriptor */ |
| edesc = ablkcipher_edesc_alloc(areq, true); |
| @@ -1685,6 +1693,14 @@ static int ablkcipher_decrypt(struct abl |
| struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq); |
| struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher); |
| struct talitos_edesc *edesc; |
| + unsigned int blocksize = |
| + crypto_tfm_alg_blocksize(crypto_ablkcipher_tfm(cipher)); |
| + |
| + if (!areq->nbytes) |
| + return 0; |
| + |
| + if (areq->nbytes % blocksize) |
| + return -EINVAL; |
| |
| /* allocate extended descriptor */ |
| edesc = ablkcipher_edesc_alloc(areq, false); |