crypto: mxs-dcp - Fix AES-CBC with hardware-bound keys
authorTomas Paukrt <tomaspaukrt@email.cz>
Fri, 13 Sep 2024 09:11:43 +0000 (11:11 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 5 Oct 2024 05:22:05 +0000 (13:22 +0800)
Fix passing an initialization vector in the payload field which
is necessary for AES in CBC mode even with hardware-bound keys.

Fixes: 3d16af0b4cfa ("crypto: mxs-dcp: Add support for hardware-bound keys")
Signed-off-by: Tomas Paukrt <tomaspaukrt@email.cz>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/mxs-dcp.c

index c82775d..77a6301 100644 (file)
@@ -225,21 +225,22 @@ static int mxs_dcp_start_dma(struct dcp_async_ctx *actx)
 static int mxs_dcp_run_aes(struct dcp_async_ctx *actx,
                           struct skcipher_request *req, int init)
 {
-       dma_addr_t key_phys = 0;
-       dma_addr_t src_phys, dst_phys;
+       dma_addr_t key_phys, src_phys, dst_phys;
        struct dcp *sdcp = global_sdcp;
        struct dcp_dma_desc *desc = &sdcp->coh->desc[actx->chan];
        struct dcp_aes_req_ctx *rctx = skcipher_request_ctx(req);
        bool key_referenced = actx->key_referenced;
        int ret;
 
-       if (!key_referenced) {
+       if (key_referenced)
+               key_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_key + AES_KEYSIZE_128,
+                                         AES_KEYSIZE_128, DMA_TO_DEVICE);
+       else
                key_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_key,
                                          2 * AES_KEYSIZE_128, DMA_TO_DEVICE);
-               ret = dma_mapping_error(sdcp->dev, key_phys);
-               if (ret)
-                       return ret;
-       }
+       ret = dma_mapping_error(sdcp->dev, key_phys);
+       if (ret)
+               return ret;
 
        src_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_in_buf,
                                  DCP_BUF_SZ, DMA_TO_DEVICE);
@@ -300,7 +301,10 @@ aes_done_run:
 err_dst:
        dma_unmap_single(sdcp->dev, src_phys, DCP_BUF_SZ, DMA_TO_DEVICE);
 err_src:
-       if (!key_referenced)
+       if (key_referenced)
+               dma_unmap_single(sdcp->dev, key_phys, AES_KEYSIZE_128,
+                                DMA_TO_DEVICE);
+       else
                dma_unmap_single(sdcp->dev, key_phys, 2 * AES_KEYSIZE_128,
                                 DMA_TO_DEVICE);
        return ret;