crypto: omap-aes-gcm - fix corner case with only auth data
authorTero Kristo <t-kristo@ti.com>
Tue, 5 Nov 2019 14:00:56 +0000 (16:00 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 11 Dec 2019 08:36:58 +0000 (16:36 +0800)
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>
drivers/crypto/omap-aes-gcm.c

index 9bbedbc..dfd4d1c 100644 (file)
@@ -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);