diff options
| author | Horia Geantă <horia.geanta@nxp.com> | 2018-09-14 11:34:28 -0400 |
|---|---|---|
| committer | Herbert Xu <herbert@gondor.apana.org.au> | 2018-09-21 01:04:46 -0400 |
| commit | 13cc6f48c7434ce46ba6dbc90003a136a263d75a (patch) | |
| tree | b3dabc5927363a5aa8fb153106a679415e848fee /drivers/crypto/caam | |
| parent | 24568b47d48ec8c906fd0f589489a08b17e1edca (diff) | |
crypto: caam/jr - fix ablkcipher_edesc pointer arithmetic
In some cases the zero-length hw_desc array at the end of
ablkcipher_edesc struct requires for 4B of tail padding.
Due to tail padding and the way pointers to S/G table and IV
are computed:
edesc->sec4_sg = (void *)edesc + sizeof(struct ablkcipher_edesc) +
desc_bytes;
iv = (u8 *)edesc->hw_desc + desc_bytes + sec4_sg_bytes;
first 4 bytes of IV are overwritten by S/G table.
Update computation of pointer to S/G table to rely on offset of hw_desc
member and not on sizeof() operator.
Cc: <stable@vger.kernel.org> # 4.13+
Fixes: 115957bb3e59 ("crypto: caam - fix IV DMA mapping and updating")
Signed-off-by: Horia Geantă <horia.geanta@nxp.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto/caam')
| -rw-r--r-- | drivers/crypto/caam/caamalg.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c index d67667970f7e..ec40f991e6c6 100644 --- a/drivers/crypto/caam/caamalg.c +++ b/drivers/crypto/caam/caamalg.c | |||
| @@ -1553,8 +1553,8 @@ static struct ablkcipher_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request | |||
| 1553 | edesc->src_nents = src_nents; | 1553 | edesc->src_nents = src_nents; |
| 1554 | edesc->dst_nents = dst_nents; | 1554 | edesc->dst_nents = dst_nents; |
| 1555 | edesc->sec4_sg_bytes = sec4_sg_bytes; | 1555 | edesc->sec4_sg_bytes = sec4_sg_bytes; |
| 1556 | edesc->sec4_sg = (void *)edesc + sizeof(struct ablkcipher_edesc) + | 1556 | edesc->sec4_sg = (struct sec4_sg_entry *)((u8 *)edesc->hw_desc + |
| 1557 | desc_bytes; | 1557 | desc_bytes); |
| 1558 | edesc->iv_dir = DMA_TO_DEVICE; | 1558 | edesc->iv_dir = DMA_TO_DEVICE; |
| 1559 | 1559 | ||
| 1560 | /* Make sure IV is located in a DMAable area */ | 1560 | /* Make sure IV is located in a DMAable area */ |
| @@ -1757,8 +1757,8 @@ static struct ablkcipher_edesc *ablkcipher_giv_edesc_alloc( | |||
| 1757 | edesc->src_nents = src_nents; | 1757 | edesc->src_nents = src_nents; |
| 1758 | edesc->dst_nents = dst_nents; | 1758 | edesc->dst_nents = dst_nents; |
| 1759 | edesc->sec4_sg_bytes = sec4_sg_bytes; | 1759 | edesc->sec4_sg_bytes = sec4_sg_bytes; |
| 1760 | edesc->sec4_sg = (void *)edesc + sizeof(struct ablkcipher_edesc) + | 1760 | edesc->sec4_sg = (struct sec4_sg_entry *)((u8 *)edesc->hw_desc + |
| 1761 | desc_bytes; | 1761 | desc_bytes); |
| 1762 | edesc->iv_dir = DMA_FROM_DEVICE; | 1762 | edesc->iv_dir = DMA_FROM_DEVICE; |
| 1763 | 1763 | ||
| 1764 | /* Make sure IV is located in a DMAable area */ | 1764 | /* Make sure IV is located in a DMAable area */ |
