]> git.baikalelectronics.ru Git - kernel.git/commitdiff
crypto: virtio - implement missing support for output IVs
authorArd Biesheuvel <ardb@kernel.org>
Sat, 9 Nov 2019 17:09:26 +0000 (18:09 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sun, 17 Nov 2019 01:02:45 +0000 (09:02 +0800)
In order to allow for CBC to be chained, which is something that the
CTS template relies upon, implementations of CBC need to pass the
IV to be used for subsequent invocations via the IV buffer. This was
not implemented yet for virtio-crypto so implement it now.

Fixes: 659c9ea6816d ("crypto: add virtio-crypto driver")
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Jason Wang <jasowang@redhat.com>
Cc: Gonglei <arei.gonglei@huawei.com>
Cc: virtualization@lists.linux-foundation.org
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/virtio/virtio_crypto_algs.c

index 42d19205166b085e25bee8fd7a1cde5f0a52d941..65ec108001371d129bb51894a7df96721276c4f6 100644 (file)
@@ -437,6 +437,11 @@ __virtio_crypto_ablkcipher_do_req(struct virtio_crypto_sym_request *vc_sym_req,
                goto free;
        }
        memcpy(iv, req->info, ivsize);
+       if (!vc_sym_req->encrypt)
+               scatterwalk_map_and_copy(req->info, req->src,
+                                        req->nbytes - AES_BLOCK_SIZE,
+                                        AES_BLOCK_SIZE, 0);
+
        sg_init_one(&iv_sg, iv, ivsize);
        sgs[num_out++] = &iv_sg;
        vc_sym_req->iv = iv;
@@ -563,6 +568,10 @@ static void virtio_crypto_ablkcipher_finalize_req(
        struct ablkcipher_request *req,
        int err)
 {
+       if (vc_sym_req->encrypt)
+               scatterwalk_map_and_copy(req->info, req->dst,
+                                        req->nbytes - AES_BLOCK_SIZE,
+                                        AES_BLOCK_SIZE, 0);
        crypto_finalize_ablkcipher_request(vc_sym_req->base.dataq->engine,
                                           req, err);
        kzfree(vc_sym_req->iv);