From: Lokesh Vutla <lokeshvutla@ti.com> To: <herbert@gondor.apana.org.au>, <linux-crypto@vger.kernel.org> Cc: <linux-omap@vger.kernel.org>, <linux-kernel@vger.kernel.org>, <nsekhar@ti.com>, <t-kristo@ti.com>, <lokeshvutla@ti.com> Subject: [PATCH] crypto: omap-aes: Fix support for unequal lengths Date: Tue, 31 Mar 2015 09:52:25 +0530 [thread overview] Message-ID: <1427775745-4674-3-git-send-email-lokeshvutla@ti.com> (raw) In-Reply-To: <1427775745-4674-1-git-send-email-lokeshvutla@ti.com> For cases where total length of an input SGs is not same as length of the input data for encryption, omap-aes driver crashes. This happens in the case when IPsec is trying to use omap-aes driver. To avoid this, we copy all the pages from the input SG list into a contiguous buffer and prepare a single element SG list for this buffer with length as the total bytes to crypt, which is similar thing that is done in case of unaligned lengths. Fixes: 6242332ff2f3 ("crypto: omap-aes - Add support for cases of unaligned lengths") Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com> --- drivers/crypto/omap-aes.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/crypto/omap-aes.c b/drivers/crypto/omap-aes.c index 42f95a4..9a28b7e 100644 --- a/drivers/crypto/omap-aes.c +++ b/drivers/crypto/omap-aes.c @@ -554,15 +554,23 @@ static int omap_aes_crypt_dma_stop(struct omap_aes_dev *dd) return err; } -static int omap_aes_check_aligned(struct scatterlist *sg) +static int omap_aes_check_aligned(struct scatterlist *sg, int total) { + int len = 0; + while (sg) { if (!IS_ALIGNED(sg->offset, 4)) return -1; if (!IS_ALIGNED(sg->length, AES_BLOCK_SIZE)) return -1; + + len += sg->length; sg = sg_next(sg); } + + if (len != total) + return -1; + return 0; } @@ -633,8 +641,8 @@ static int omap_aes_handle_queue(struct omap_aes_dev *dd, dd->in_sg = req->src; dd->out_sg = req->dst; - if (omap_aes_check_aligned(dd->in_sg) || - omap_aes_check_aligned(dd->out_sg)) { + if (omap_aes_check_aligned(dd->in_sg, dd->total) || + omap_aes_check_aligned(dd->out_sg, dd->total)) { if (omap_aes_copy_sgs(dd)) pr_err("Failed to copy SGs for unaligned cases\n"); dd->sgs_copied = 1; -- 1.9.1
WARNING: multiple messages have this Message-ID (diff)
From: Lokesh Vutla <lokeshvutla@ti.com> To: herbert@gondor.apana.org.au, linux-crypto@vger.kernel.org Cc: linux-omap@vger.kernel.org, linux-kernel@vger.kernel.org, nsekhar@ti.com, t-kristo@ti.com, lokeshvutla@ti.com Subject: [PATCH] crypto: omap-aes: Fix support for unequal lengths Date: Tue, 31 Mar 2015 09:52:25 +0530 [thread overview] Message-ID: <1427775745-4674-3-git-send-email-lokeshvutla@ti.com> (raw) In-Reply-To: <1427775745-4674-1-git-send-email-lokeshvutla@ti.com> For cases where total length of an input SGs is not same as length of the input data for encryption, omap-aes driver crashes. This happens in the case when IPsec is trying to use omap-aes driver. To avoid this, we copy all the pages from the input SG list into a contiguous buffer and prepare a single element SG list for this buffer with length as the total bytes to crypt, which is similar thing that is done in case of unaligned lengths. Fixes: 6242332ff2f3 ("crypto: omap-aes - Add support for cases of unaligned lengths") Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com> --- drivers/crypto/omap-aes.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/crypto/omap-aes.c b/drivers/crypto/omap-aes.c index 42f95a4..9a28b7e 100644 --- a/drivers/crypto/omap-aes.c +++ b/drivers/crypto/omap-aes.c @@ -554,15 +554,23 @@ static int omap_aes_crypt_dma_stop(struct omap_aes_dev *dd) return err; } -static int omap_aes_check_aligned(struct scatterlist *sg) +static int omap_aes_check_aligned(struct scatterlist *sg, int total) { + int len = 0; + while (sg) { if (!IS_ALIGNED(sg->offset, 4)) return -1; if (!IS_ALIGNED(sg->length, AES_BLOCK_SIZE)) return -1; + + len += sg->length; sg = sg_next(sg); } + + if (len != total) + return -1; + return 0; } @@ -633,8 +641,8 @@ static int omap_aes_handle_queue(struct omap_aes_dev *dd, dd->in_sg = req->src; dd->out_sg = req->dst; - if (omap_aes_check_aligned(dd->in_sg) || - omap_aes_check_aligned(dd->out_sg)) { + if (omap_aes_check_aligned(dd->in_sg, dd->total) || + omap_aes_check_aligned(dd->out_sg, dd->total)) { if (omap_aes_copy_sgs(dd)) pr_err("Failed to copy SGs for unaligned cases\n"); dd->sgs_copied = 1; -- 1.9.1
next prev parent reply other threads:[~2015-03-31 4:22 UTC|newest] Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-03-31 4:22 [PATCH] crypto: omap-sham: Check for HIGHMEM before mapping SG pages Lokesh Vutla 2015-03-31 4:22 ` Lokesh Vutla 2015-03-31 4:22 ` [PATCH] crypto: omap-sham: Use pm_runtime_irq_safe() Lokesh Vutla 2015-03-31 4:22 ` Lokesh Vutla 2015-04-01 14:24 ` Herbert Xu 2015-03-31 4:22 ` Lokesh Vutla [this message] 2015-03-31 4:22 ` [PATCH] crypto: omap-aes: Fix support for unequal lengths Lokesh Vutla 2015-04-01 14:24 ` Herbert Xu 2015-04-01 14:18 ` [PATCH] crypto: omap-sham: Check for HIGHMEM before mapping SG pages Herbert Xu 2015-04-02 10:00 ` Lokesh Vutla 2015-04-02 10:00 ` Lokesh Vutla
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1427775745-4674-3-git-send-email-lokeshvutla@ti.com \ --to=lokeshvutla@ti.com \ --cc=herbert@gondor.apana.org.au \ --cc=linux-crypto@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-omap@vger.kernel.org \ --cc=nsekhar@ti.com \ --cc=t-kristo@ti.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.