]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
crypto: zynqmp-rsa: Fix for crash seen when the data less than 512 bytes
authorKalyani Akula <kalyani.akula@xilinx.com>
Thu, 4 Oct 2018 06:07:45 +0000 (11:37 +0530)
committerMichal Simek <michal.simek@xilinx.com>
Wed, 7 Nov 2018 10:05:20 +0000 (11:05 +0100)
This patch fixed the crash seen when data sent is less
than 512 bytes by adjusting the cra_blocksize for RSA driver.

ZYNQMP_BLOCK_SIZE is chosen as 64 because the minimum key size
supported by RSA crypto engine is 512 bit (64 bytes).

Signed-off-by: Kalyani Akula <kalyani.akula@xilinx.com>
Reviewed-by: Appana Durga Kedareswara rao <appana.durga.rao@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/crypto/zynqmp-rsa.c

index 98f9e4ad726f78286847288ccadc63e23638d1a8..a40efc58b81bb85471654fdaed1e6dc1f575219b 100644 (file)
@@ -28,6 +28,7 @@
 
 #define ZYNQMP_RSA_QUEUE_LENGTH        1
 #define ZYNQMP_RSA_MAX_KEY_SIZE        1024
+#define ZYNQMP_BLOCKSIZE       64
 
 struct zynqmp_rsa_dev;
 
@@ -102,13 +103,17 @@ zynqmp_rsa_decrypt(struct blkcipher_desc *desc,
        char *kbuf;
        size_t dma_size;
        dma_addr_t dma_addr;
-       int err;
+       int err, datasize;
 
        if (!eemi_ops || !eemi_ops->rsa)
                return -ENOTSUPP;
 
        blkcipher_walk_init(&walk, dst, src, nbytes);
        err = blkcipher_walk_virt(desc, &walk);
+       while ((datasize = walk.nbytes)) {
+               datasize &= (ZYNQMP_BLOCKSIZE - 1);
+               err = blkcipher_walk_done(desc, &walk, datasize);
+       }
        op->iv = walk.iv;
        op->src = walk.src.virt.addr;
        op->dst = walk.dst.virt.addr;
@@ -116,13 +121,12 @@ zynqmp_rsa_decrypt(struct blkcipher_desc *desc,
        dma_size = nbytes + op->keylen;
        kbuf = dma_alloc_coherent(dd->dev, dma_size, &dma_addr, GFP_KERNEL);
        if (!kbuf)
-       return -ENOMEM;
+               return -ENOMEM;
 
        memcpy(kbuf, op->src, nbytes);
        memcpy(kbuf + nbytes, op->key, op->keylen);
        eemi_ops->rsa(dma_addr, nbytes, 0);
        memcpy(walk.dst.virt.addr, kbuf, nbytes);
-       err = blkcipher_walk_done(desc, &walk, nbytes  - 1);
        dma_free_coherent(dd->dev, dma_size, kbuf, dma_addr);
 
        return err;
@@ -140,13 +144,18 @@ zynqmp_rsa_encrypt(struct blkcipher_desc *desc,
        char *kbuf;
        size_t dma_size;
        dma_addr_t dma_addr;
-       int err;
+       int err, datasize;
 
        if (!eemi_ops || !eemi_ops->rsa)
                return -ENOTSUPP;
 
        blkcipher_walk_init(&walk, dst, src, nbytes);
        err = blkcipher_walk_virt(desc, &walk);
+       while ((datasize = walk.nbytes)) {
+               datasize &= (ZYNQMP_BLOCKSIZE - 1);
+               err = blkcipher_walk_done(desc, &walk, datasize);
+       }
+
        op->iv = walk.iv;
        op->src = walk.src.virt.addr;
        op->dst = walk.dst.virt.addr;
@@ -160,7 +169,6 @@ zynqmp_rsa_encrypt(struct blkcipher_desc *desc,
        memcpy(kbuf + nbytes, op->key, op->keylen);
        eemi_ops->rsa(dma_addr, nbytes, 1);
        memcpy(walk.dst.virt.addr, kbuf, nbytes);
-       err = blkcipher_walk_done(desc, &walk, nbytes  - 1);
        dma_free_coherent(dd->dev, dma_size, kbuf, dma_addr);
 
        return err;
@@ -172,7 +180,7 @@ static struct crypto_alg zynqmp_alg = {
        .cra_priority           =       400,
        .cra_flags              =       CRYPTO_ALG_TYPE_BLKCIPHER |
                                        CRYPTO_ALG_KERN_DRIVER_ONLY,
-       .cra_blocksize          =       1,
+       .cra_blocksize          =       ZYNQMP_BLOCKSIZE,
        .cra_ctxsize            =       sizeof(struct zynqmp_rsa_op),
        .cra_alignmask          =       15,
        .cra_type               =       &crypto_blkcipher_type,