Hello Libo,

On 17 February 2017 at 03:47,  <libo.w...@arm.com> wrote:
> From: Libo Wang <Libo w...@arm.com>
>
> CTS template assumes underlying CBC algorithm will carry out next IV for
> further process.But some implementations of CBC algorithm in kernel break
> this assumption, for example, some hardware crypto drivers ignore next IV
> for performance consider, inthis case, tcry cts(cbc(aes)) test case will
> fail. This patch is trying to fix it by getting next IV information ready
> before last two blocks processed.
>
> Signed-off-by: Libo Wang <libo.w...@arm.com>
> Signed-off-by: Dennis Chen <dennis.c...@arm.com>

Which algorithms in particular break this assumption? I recently fixed
some ARM accelerated software drivers for this reason. If there are
others, we should fix those rather than try to fix it in the CTS
driver.

> ---
>  crypto/cts.c | 29 +++++++++++++++++++++++++----
>  1 file changed, 25 insertions(+), 4 deletions(-)
>
> diff --git a/crypto/cts.c b/crypto/cts.c
> index a1335d6..712164b 100644
> --- a/crypto/cts.c
> +++ b/crypto/cts.c
> @@ -154,6 +154,7 @@ static int crypto_cts_encrypt(struct skcipher_request 
> *req)
>         unsigned int nbytes = req->cryptlen;
>         int cbc_blocks = (nbytes + bsize - 1) / bsize - 1;
>         unsigned int offset;
> +       int ret = 0;
>
>         skcipher_request_set_tfm(subreq, ctx->child);
>
> @@ -174,8 +175,17 @@ static int crypto_cts_encrypt(struct skcipher_request 
> *req)
>         skcipher_request_set_crypt(subreq, req->src, req->dst,
>                                    offset, req->iv);
>
> -       return crypto_skcipher_encrypt(subreq) ?:
> -              cts_cbc_encrypt(req);
> +       /* process CBC blocks */
> +       ret = crypto_skcipher_encrypt(subreq);
> +       /* process last two blocks */
> +       if (!ret) {

What happens if an async driver returns -EINPROGRESS here?

> +               /* Get IVn-1 back */
> +               scatterwalk_map_and_copy(req->iv, req->dst, (offset - bsize), 
> bsize, 0);
> +               /* Continue last two blocks */
> +               return cts_cbc_encrypt(req);
> +       }
> +
> +       return ret;
>  }
>
>  static int cts_cbc_decrypt(struct skcipher_request *req)
> @@ -248,6 +258,8 @@ static int crypto_cts_decrypt(struct skcipher_request 
> *req)
>         int cbc_blocks = (nbytes + bsize - 1) / bsize - 1;
>         unsigned int offset;
>         u8 *space;
> +       int ret = 0;
> +       u8 iv_next[bsize];
>
>         skcipher_request_set_tfm(subreq, ctx->child);
>
> @@ -277,8 +289,17 @@ static int crypto_cts_decrypt(struct skcipher_request 
> *req)
>         skcipher_request_set_crypt(subreq, req->src, req->dst,
>                                    offset, req->iv);
>
> -       return crypto_skcipher_decrypt(subreq) ?:
> -              cts_cbc_decrypt(req);
> +       /* process last two blocks */
> +       scatterwalk_map_and_copy(iv_next, req->src, (offset - bsize), bsize, 
> 0);
> +       ret = crypto_skcipher_decrypt(subreq);
> +       if (!ret) {
> +               /* Set Next IV */
> +               subreq->iv = iv_next;
> +               /* process last two blocks */
> +               return cts_cbc_decrypt(req);
> +       }
> +
> +       return ret;
>  }
>
>  static int crypto_cts_init_tfm(struct crypto_skcipher *tfm)
> --
> 1.8.3.1
>
> IMPORTANT NOTICE: The contents of this email and any attachments are 
> confidential and may also be privileged. If you are not the intended 
> recipient, please notify the sender immediately and do not disclose the 
> contents to any other person, use it for any purpose, or store or copy the 
> information in any medium. Thank you.

Please configure your email client so it doesn't spit out these.

Reply via email to