| From 5d04b75c7bbc8f3b8d9cd563345fe94d3d8907ef Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 1 Dec 2023 19:06:25 +0200 |
| Subject: crypto: sahara - avoid skcipher fallback code duplication |
| |
| From: Ovidiu Panait <ovidiu.panait@windriver.com> |
| |
| [ Upstream commit 01d70a4bbff20ea05cadb4c208841985a7cc6596 ] |
| |
| Factor out duplicated skcipher fallback handling code to a helper function |
| sahara_aes_fallback(). Also, keep a single check if fallback is required in |
| sahara_aes_crypt(). |
| |
| Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Stable-dep-of: d1d6351e37aa ("crypto: sahara - handle zero-length aes requests") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/crypto/sahara.c | 85 ++++++++++++----------------------------- |
| 1 file changed, 25 insertions(+), 60 deletions(-) |
| |
| diff --git a/drivers/crypto/sahara.c b/drivers/crypto/sahara.c |
| index e86df3c51787..a109f9bdbe04 100644 |
| --- a/drivers/crypto/sahara.c |
| +++ b/drivers/crypto/sahara.c |
| @@ -648,12 +648,37 @@ static int sahara_aes_setkey(struct crypto_skcipher *tfm, const u8 *key, |
| return crypto_skcipher_setkey(ctx->fallback, key, keylen); |
| } |
| |
| +static int sahara_aes_fallback(struct skcipher_request *req, unsigned long mode) |
| +{ |
| + struct sahara_aes_reqctx *rctx = skcipher_request_ctx(req); |
| + struct sahara_ctx *ctx = crypto_skcipher_ctx( |
| + crypto_skcipher_reqtfm(req)); |
| + |
| + skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback); |
| + skcipher_request_set_callback(&rctx->fallback_req, |
| + req->base.flags, |
| + req->base.complete, |
| + req->base.data); |
| + skcipher_request_set_crypt(&rctx->fallback_req, req->src, |
| + req->dst, req->cryptlen, req->iv); |
| + |
| + if (mode & FLAGS_ENCRYPT) |
| + return crypto_skcipher_encrypt(&rctx->fallback_req); |
| + |
| + return crypto_skcipher_decrypt(&rctx->fallback_req); |
| +} |
| + |
| static int sahara_aes_crypt(struct skcipher_request *req, unsigned long mode) |
| { |
| struct sahara_aes_reqctx *rctx = skcipher_request_ctx(req); |
| + struct sahara_ctx *ctx = crypto_skcipher_ctx( |
| + crypto_skcipher_reqtfm(req)); |
| struct sahara_dev *dev = dev_ptr; |
| int err = 0; |
| |
| + if (unlikely(ctx->keylen != AES_KEYSIZE_128)) |
| + return sahara_aes_fallback(req, mode); |
| + |
| dev_dbg(dev->device, "nbytes: %d, enc: %d, cbc: %d\n", |
| req->cryptlen, !!(mode & FLAGS_ENCRYPT), !!(mode & FLAGS_CBC)); |
| |
| @@ -676,81 +701,21 @@ static int sahara_aes_crypt(struct skcipher_request *req, unsigned long mode) |
| |
| static int sahara_aes_ecb_encrypt(struct skcipher_request *req) |
| { |
| - struct sahara_aes_reqctx *rctx = skcipher_request_ctx(req); |
| - struct sahara_ctx *ctx = crypto_skcipher_ctx( |
| - crypto_skcipher_reqtfm(req)); |
| - |
| - if (unlikely(ctx->keylen != AES_KEYSIZE_128)) { |
| - skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback); |
| - skcipher_request_set_callback(&rctx->fallback_req, |
| - req->base.flags, |
| - req->base.complete, |
| - req->base.data); |
| - skcipher_request_set_crypt(&rctx->fallback_req, req->src, |
| - req->dst, req->cryptlen, req->iv); |
| - return crypto_skcipher_encrypt(&rctx->fallback_req); |
| - } |
| - |
| return sahara_aes_crypt(req, FLAGS_ENCRYPT); |
| } |
| |
| static int sahara_aes_ecb_decrypt(struct skcipher_request *req) |
| { |
| - struct sahara_aes_reqctx *rctx = skcipher_request_ctx(req); |
| - struct sahara_ctx *ctx = crypto_skcipher_ctx( |
| - crypto_skcipher_reqtfm(req)); |
| - |
| - if (unlikely(ctx->keylen != AES_KEYSIZE_128)) { |
| - skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback); |
| - skcipher_request_set_callback(&rctx->fallback_req, |
| - req->base.flags, |
| - req->base.complete, |
| - req->base.data); |
| - skcipher_request_set_crypt(&rctx->fallback_req, req->src, |
| - req->dst, req->cryptlen, req->iv); |
| - return crypto_skcipher_decrypt(&rctx->fallback_req); |
| - } |
| - |
| return sahara_aes_crypt(req, 0); |
| } |
| |
| static int sahara_aes_cbc_encrypt(struct skcipher_request *req) |
| { |
| - struct sahara_aes_reqctx *rctx = skcipher_request_ctx(req); |
| - struct sahara_ctx *ctx = crypto_skcipher_ctx( |
| - crypto_skcipher_reqtfm(req)); |
| - |
| - if (unlikely(ctx->keylen != AES_KEYSIZE_128)) { |
| - skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback); |
| - skcipher_request_set_callback(&rctx->fallback_req, |
| - req->base.flags, |
| - req->base.complete, |
| - req->base.data); |
| - skcipher_request_set_crypt(&rctx->fallback_req, req->src, |
| - req->dst, req->cryptlen, req->iv); |
| - return crypto_skcipher_encrypt(&rctx->fallback_req); |
| - } |
| - |
| return sahara_aes_crypt(req, FLAGS_ENCRYPT | FLAGS_CBC); |
| } |
| |
| static int sahara_aes_cbc_decrypt(struct skcipher_request *req) |
| { |
| - struct sahara_aes_reqctx *rctx = skcipher_request_ctx(req); |
| - struct sahara_ctx *ctx = crypto_skcipher_ctx( |
| - crypto_skcipher_reqtfm(req)); |
| - |
| - if (unlikely(ctx->keylen != AES_KEYSIZE_128)) { |
| - skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback); |
| - skcipher_request_set_callback(&rctx->fallback_req, |
| - req->base.flags, |
| - req->base.complete, |
| - req->base.data); |
| - skcipher_request_set_crypt(&rctx->fallback_req, req->src, |
| - req->dst, req->cryptlen, req->iv); |
| - return crypto_skcipher_decrypt(&rctx->fallback_req); |
| - } |
| - |
| return sahara_aes_crypt(req, FLAGS_CBC); |
| } |
| |
| -- |
| 2.43.0 |
| |