summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorTero Kristo <t-kristo@ti.com>2019-11-05 16:00:56 +0200
committerHerbert Xu <herbert@gondor.apana.org.au>2019-12-11 16:36:58 +0800
commita9befcf46913bd70d1421ea6b77e8b47a8b70483 (patch)
tree546b30a5338dc56072c7597817498ac486f34dc0 /drivers
parent2b352489d0d6398f6d47383b48ed3527f7d078f8 (diff)
downloadlinux-a9befcf46913bd70d1421ea6b77e8b47a8b70483.tar.gz
linux-a9befcf46913bd70d1421ea6b77e8b47a8b70483.tar.bz2
linux-a9befcf46913bd70d1421ea6b77e8b47a8b70483.zip
crypto: omap-aes-gcm - fix corner case with only auth data
Fix a corner case where only authdata is generated, without any provided assocdata / cryptdata. Passing the empty scatterlists to OMAP AES core driver in this case would confuse it, failing to map DMAs. Signed-off-by: Tero Kristo <t-kristo@ti.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/crypto/omap-aes-gcm.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/crypto/omap-aes-gcm.c b/drivers/crypto/omap-aes-gcm.c
index 9bbedbccfadf..dfd4d1cac421 100644
--- a/drivers/crypto/omap-aes-gcm.c
+++ b/drivers/crypto/omap-aes-gcm.c
@@ -148,12 +148,14 @@ static int omap_aes_gcm_copy_buffers(struct omap_aes_dev *dd,
if (req->src == req->dst || dd->out_sg == sg_arr)
flags |= OMAP_CRYPTO_FORCE_COPY;
- ret = omap_crypto_align_sg(&dd->out_sg, cryptlen,
- AES_BLOCK_SIZE, &dd->out_sgl,
- flags,
- FLAGS_OUT_DATA_ST_SHIFT, &dd->flags);
- if (ret)
- return ret;
+ if (cryptlen) {
+ ret = omap_crypto_align_sg(&dd->out_sg, cryptlen,
+ AES_BLOCK_SIZE, &dd->out_sgl,
+ flags,
+ FLAGS_OUT_DATA_ST_SHIFT, &dd->flags);
+ if (ret)
+ return ret;
+ }
dd->in_sg_len = sg_nents_for_len(dd->in_sg, alen + clen);
dd->out_sg_len = sg_nents_for_len(dd->out_sg, clen);
@@ -287,8 +289,12 @@ static int omap_aes_gcm_handle_queue(struct omap_aes_dev *dd,
return err;
err = omap_aes_write_ctrl(dd);
- if (!err)
- err = omap_aes_crypt_dma_start(dd);
+ if (!err) {
+ if (dd->in_sg_len && dd->out_sg_len)
+ err = omap_aes_crypt_dma_start(dd);
+ else
+ omap_aes_gcm_dma_out_callback(dd);
+ }
if (err) {
omap_aes_gcm_finish_req(dd, err);