Skip to contentSkip to conversation

DM: crypto/rsa: Add rsa Modular Exponentiation DM driver

PATCH New Ruchika Gupta 2 participants 2 messages Dec 29, 2014

lore
Share & tools
lore
#0 lore raw

PATCH v3 3/9 DM: crypto/rsa: Add rsa Modular Exponentiation DM driver

Re-sending as delivery to uboot mailing list failed last time...

Hi Simon,

Thanks for the review comments.

Quoted 67 lines

-----Original Message-----
From: sjg at google.com [mailto:sjg at google.com] On Behalf Of Simon Glass
Sent: Wednesday, December 24, 2014 6:19 AM
To: Gupta Ruchika-R66431
Cc: U-Boot Mailing List; Sun York-R58495
Subject: Re: [PATCH 3/9] [v3] DM: crypto/rsa: Add rsa Modular Exponentiation DM driver

Hi Ruchika,

Quoted 9 lines · Ruchika Gupta

Add a new rsa uclass for performing modular exponentiation and implement the software driver basing on this uclass.

---
Changes in v3:
New patch with driver model for RSA UCLASS

Quoted 5 lines
 drivers/crypto/Kconfig          |  1 +
 drivers/crypto/Makefile         |  1 +
 drivers/crypto/rsa/Kconfig      |  5 +++++
 drivers/crypto/rsa/Makefile     |  8 ++++++++
 drivers/crypto/rsa/rsa_sw.c     | 39

+++++++++++++++++++++++++++++++++++++++

Quoted 3 lines
 drivers/crypto/rsa/rsa_uclass.c | 31 +++++++++++++++++++++++++++++++
 include/dm/uclass-id.h          |  1 +
 include/u-boot/rsa-mod-exp.h    | 40

++++++++++++++++++++++++++++++++++++++++

Quoted 27 lines
 8 files changed, 126 insertions(+)
 create mode 100644 drivers/crypto/rsa/Kconfig  create mode 100644 

drivers/crypto/rsa/Makefile create mode 100644
drivers/crypto/rsa/rsa_sw.c create mode 100644
drivers/crypto/rsa/rsa_uclass.c

drivers/crypto/Kconfig index renamed from drivers/crypto/Kconfig +0 -0

e69de29..75f3479 100644

drivers/crypto/Kconfig +1 -0
@@ -0,0 +1 @@
+source drivers/crypto/rsa/Kconfig
drivers/crypto/Makefile index renamed from drivers/crypto/Makefile +0 -0

7b79237..a2f30fc 100644

drivers/crypto/Makefile +1 -0
@@ -6,4 +6,5 @@
 #
 
 obj-$(CONFIG_EXYNOS_ACE_SHA)   += ace_sha.o
+obj-y += rsa/
 obj-y += fsl/
drivers/crypto/rsa/Kconfig new file +0 -0
new file mode 100644 index 0000000..7eb90a1

drivers/crypto/rsa/Kconfig

Quoted 6 lines
drivers/crypto/rsa/Kconfig new file +6 -0
@@ -0,0 +1,5 @@
+config DM_RSA
+       bool "Enable Driver Model for RSA "
+       depends on DM
+       help
+         If you want to use driver model for RSA Modular 
+Exponentiation,

say Y.

Quoted 3 lines

Can you send a new patch (later if you prefer) which removes this option altogether? It should be the default. In other words, RSA should always use driver model.

If we make it mandatory for RSA to use driver model, all platforms would need to use DM by default in their defconfig. Would that be acceptable ? Secondly if I force select DM and DM_RSA when CONFIG_RSA is selected, this may result in duplication of CONFIG_DM with platforms having it defined already. Please suggest.

Quoted 97 lines
Quoted 97 lines
(quoted diff) +0 -0

b/drivers/crypto/rsa/Makefile new file mode 100644 index 0000000..fae4f8c

drivers/crypto/rsa/Makefile new file +8 -0
@@ -0,0 +1,8 @@
+#
+# (C) Copyright 2014 Freescale Semiconductor, Inc.
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-$(CONFIG_DM_RSA) += rsa_uclass.o
+obj-$(CONFIG_RSA_SW) += rsa_sw.o
(quoted diff) +0 -0

b/drivers/crypto/rsa/rsa_sw.c new file mode 100644 index 0000000..5d94754

drivers/crypto/rsa/rsa_sw.c new file +38 -0
@@ -0,0 +1,39 @@
+/*
+ * (C) Copyright 2014 Freescale Semiconductor, Inc.
+ * Author: Ruchika Gupta <[email protected]>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <config.h>
+#include <common.h>
+#include <dm.h>
+#include <u-boot/rsa-mod-exp.h>
+
+int mod_exp_sw(struct udevice *dev, const uint8_t *sig, uint32_t sig_len,
+               struct key_prop *prop, uint8_t *out) {
+       int ret = 0;
+
+       ret = rsa_mod_exp_sw(sig, sig_len, prop, out);
+
+       if (ret) {
+               debug("%s: RSA failed to verify: %d\n", __func__, ret);
+               return ret;
+       }
+       return 0;
+}
+
+static const struct rsa_ops rsa_ops_sw = {
+       .get_mod_exp    = mod_exp_sw,
+};
+
+U_BOOT_DRIVER(fsl_rsa) = {
+       .name   = "rsa_sw",
+       .id     = UCLASS_RSA,
+       .ops    = &rsa_ops_sw,
+};
+
+U_BOOT_DEVICE(rsa_sw) = {
+       .name = "rsa_sw",
+};
(quoted diff) +0 -0

b/drivers/crypto/rsa/rsa_uclass.c new file mode 100644 index 0000000..f4f4f39

drivers/crypto/rsa/rsa_uclass.c new file +29 -0
@@ -0,0 +1,31 @@
+/*
+ * (C) Copyright 2014 Freescale Semiconductor, Inc
+ * Author: Ruchika Gupta <[email protected]>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <u-boot/rsa-mod-exp.h>
+#include <errno.h>
+#include <fdtdec.h>
+#include <malloc.h>
+#include <asm/io.h>
+#include <linux/list.h>
+
+int rsa_mod_exp(struct udevice *dev, const uint8_t *sig, uint32_t sig_len,
+               struct key_prop *node, uint8_t *out) {
+       const struct rsa_ops *ops = device_get_ops(dev);
+
+       if (!ops->get_mod_exp)
+               return -ENOSYS;
+
+       return ops->get_mod_exp(dev, sig, sig_len, node, out); }
+
+UCLASS_DRIVER(rsa) = {
+       .id             = UCLASS_RSA,
+       .name           = "rsa",
+};
include/dm/uclass-id.h index renamed from include/dm/uclass-id.h +0 -0

f17c3c2..659369e 100644
--- a/include/dm/uclass-id.h

Quoted 8 lines

include/dm/uclass-id.h index enum uclass_id { · line 36

Quoted 6 lines

+++ b/include/dm/uclass-id.h

include/dm/uclass-id.h index renamed from include/dm/uclass-id.h +1 -0
@@ -33,6 +33,7 @@ enum uclass_id {
        UCLASS_I2C,             /* I2C bus */
        UCLASS_I2C_GENERIC,     /* Generic I2C device */
        UCLASS_I2C_EEPROM,      /* I2C EEPROM device */
+       UCLASS_RSA      ,       /* RSA Mod Exp device */

Funny spacing here.

Sorry, I will correct that.

Quoted 22 lines
Quoted 11 lines
include/dm/uclass-id.h index renamed from include/dm/uclass-id.h +0 -0
        UCLASS_COUNT,
        UCLASS_INVALID = -1,
(quoted diff) +0 -0

b/include/u-boot/rsa-mod-exp.h index 59cd9ea..7f7e196 100644

include/u-boot/rsa-mod-exp.h +0 -0
@@ -40,4 +40,44 @@ struct key_prop {  int rsa_mod_exp_sw(const 
 uint8_t *sig, uint32_t sig_len,
                struct key_prop *node, uint8_t *out);

include/u-boot/rsa-mod-exp.h struct key_prop { int rsa_mod_exp_sw(const · line 51

Quoted 10 lines
include/u-boot/rsa-mod-exp.h +9 -0
 
+/**
+ * rsa_mod_exp - Perform RSA Modular Exponentiation
+ *
+ * Operation: out[] = sig ^ exponent % modulus
+ *
+ * @udev:      RSA Device
+ * @sig:       RSA PKCS1.5 signature
+ * @sig_len:   Length of signature in number of bytes
+ * @node:      Node with RSA key elements like modulus, exponent, R^2,

n0inv

Quoted 3 lines

include/u-boot/rsa-mod-exp.h struct key_prop { int rsa_mod_exp_sw(const · line 52

Quoted 1 line
include/u-boot/rsa-mod-exp.h +1 -0
+ * @out:       Result in form of byte array

How big is this array?

Thanks for pointing out. In next set of patch, I will change it to uint8_t **out and introduce a uin32_t *out_len also. Ideally the implemntor of this function should allocate out as per length required and return back the pointer and the allocated length. This will also require change in patch 1 of this series. I will change and float next version.

Quoted 18 lines
Quoted 18 lines
include/u-boot/rsa-mod-exp.h +17 -0
+ */
+int rsa_mod_exp(struct udevice *dev, const uint8_t *sig, uint32_t sig_len,
+               struct key_prop *node, uint8_t *out);
+
+/**
+ * struct struct rsa_ops - Driver model for RSA operations
+ *
+ * The uclass interface is implemented by all crypto devices which 
+use
+ * driver model.
+ */
+struct rsa_ops {
+       /**
+        * Perform Modular Exponentiation
+        *
+        * Operation: out[] = sig ^ exponent % modulus
+        *
Quoted 8 lines

include/u-boot/rsa-mod-exp.h struct key_prop { int rsa_mod_exp_sw(const · line 75

Quoted 6 lines
include/u-boot/rsa-mod-exp.h +6 -0
+        * @dev:        RSA Device
+        * @sig:        RSA PKCS1.5 signature
+        * @sig_len:    Length of signature in number of bytes
+        * @node:       Node with RSA key elements like modulus, exponent,
+        *              R^2, n0inv
+        * @out:        Result in form of byte array

How big is this array?

Same as above, I will change it to **outp and add a pointer for length

Quoted 5 lines

include/u-boot/rsa-mod-exp.h struct key_prop { int rsa_mod_exp_sw(const · line 77

Quoted 3 lines
include/u-boot/rsa-mod-exp.h +2 -0
+        * Returns: 0 if exponentiation is succesful, or a negative 
+ value

successful

Ok

Quoted 6 lines

include/u-boot/rsa-mod-exp.h struct key_prop { int rsa_mod_exp_sw(const · line 80

Quoted 4 lines
include/u-boot/rsa-mod-exp.h +3 -0
+        * if it wasn't.
+        */
+       int (*get_mod_exp)(struct udevice *dev, const uint8_t *sig,

mod_exp() is better I think, since it matches your function above.

Ok. I will change it.

Quoted 11 lines
Quoted 8 lines
include/u-boot/rsa-mod-exp.h +3 -1
+                          uint32_t sig_len, struct key_prop *node,
+                          uint8_t *out); };
+
 #endif
--

1.8.1.4

Regards,
Simon

Regards,
Ruchika

#1 lore raw

PATCH v3 3/9 DM: crypto/rsa: Add rsa Modular Exponentiation DM driver

Hi Ruchika,

Quoted 73 lines · Ruchika Gupta

Re-sending as delivery to uboot mailing list failed last time...

Hi Simon,

Thanks for the review comments.

Quoted 67 lines

-----Original Message-----
From: sjg at google.com [mailto:sjg at google.com] On Behalf Of Simon Glass
Sent: Wednesday, December 24, 2014 6:19 AM
To: Gupta Ruchika-R66431
Cc: U-Boot Mailing List; Sun York-R58495
Subject: Re: [PATCH 3/9] [v3] DM: crypto/rsa: Add rsa Modular Exponentiation DM driver

Hi Ruchika,

Quoted 9 lines · Ruchika Gupta

Add a new rsa uclass for performing modular exponentiation and implement the software driver basing on this uclass.

---
Changes in v3:
New patch with driver model for RSA UCLASS

Quoted 5 lines
 drivers/crypto/Kconfig          |  1 +
 drivers/crypto/Makefile         |  1 +
 drivers/crypto/rsa/Kconfig      |  5 +++++
 drivers/crypto/rsa/Makefile     |  8 ++++++++
 drivers/crypto/rsa/rsa_sw.c     | 39

+++++++++++++++++++++++++++++++++++++++

Quoted 3 lines
 drivers/crypto/rsa/rsa_uclass.c | 31 +++++++++++++++++++++++++++++++
 include/dm/uclass-id.h          |  1 +
 include/u-boot/rsa-mod-exp.h    | 40

++++++++++++++++++++++++++++++++++++++++

Quoted 27 lines
 8 files changed, 126 insertions(+)
 create mode 100644 drivers/crypto/rsa/Kconfig  create mode 100644

drivers/crypto/rsa/Makefile create mode 100644
drivers/crypto/rsa/rsa_sw.c create mode 100644
drivers/crypto/rsa/rsa_uclass.c

drivers/crypto/Kconfig index renamed from drivers/crypto/Kconfig +0 -0

e69de29..75f3479 100644

drivers/crypto/Kconfig +1 -0
@@ -0,0 +1 @@
+source drivers/crypto/rsa/Kconfig
drivers/crypto/Makefile index renamed from drivers/crypto/Makefile +0 -0

7b79237..a2f30fc 100644

drivers/crypto/Makefile +1 -0
@@ -6,4 +6,5 @@
 #
 
 obj-$(CONFIG_EXYNOS_ACE_SHA)   += ace_sha.o
+obj-y += rsa/
 obj-y += fsl/
drivers/crypto/rsa/Kconfig new file +0 -0
new file mode 100644 index 0000000..7eb90a1

drivers/crypto/rsa/Kconfig

Quoted 6 lines
drivers/crypto/rsa/Kconfig new file +6 -0
@@ -0,0 +1,5 @@
+config DM_RSA
+       bool "Enable Driver Model for RSA "
+       depends on DM
+       help
+         If you want to use driver model for RSA Modular
+Exponentiation,

say Y.

Quoted 7 lines
Quoted 3 lines

Can you send a new patch (later if you prefer) which removes this option altogether? It should be the default. In other words, RSA should always use driver model.

If we make it mandatory for RSA to use driver model, all platforms would need to use DM by default in their defconfig. Would that be acceptable ? Secondly if I force select DM and DM_RSA when CONFIG_RSA is selected, this may result in duplication of CONFIG_DM with platforms having it defined already. Please suggest.

Yes that is correct, all platforms with RSA can use DM. As far as I know they do, but if not we can add a patch to fix that.

Quoted 129 lines
Quoted 98 lines
Quoted 98 lines
(quoted diff) +0 -0

b/drivers/crypto/rsa/Makefile new file mode 100644 index 0000000..fae4f8c

drivers/crypto/rsa/Makefile new file +8 -0
@@ -0,0 +1,8 @@
+#
+# (C) Copyright 2014 Freescale Semiconductor, Inc.
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-$(CONFIG_DM_RSA) += rsa_uclass.o
+obj-$(CONFIG_RSA_SW) += rsa_sw.o
(quoted diff) +0 -0

b/drivers/crypto/rsa/rsa_sw.c new file mode 100644 index 0000000..5d94754

drivers/crypto/rsa/rsa_sw.c new file +38 -0
@@ -0,0 +1,39 @@
+/*
+ * (C) Copyright 2014 Freescale Semiconductor, Inc.
+ * Author: Ruchika Gupta <[email protected]>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <config.h>
+#include <common.h>
+#include <dm.h>
+#include <u-boot/rsa-mod-exp.h>
+
+int mod_exp_sw(struct udevice *dev, const uint8_t *sig, uint32_t sig_len,
+               struct key_prop *prop, uint8_t *out) {
+       int ret = 0;
+
+       ret = rsa_mod_exp_sw(sig, sig_len, prop, out);
+
+       if (ret) {
+               debug("%s: RSA failed to verify: %d\n", __func__, ret);
+               return ret;
+       }
+       return 0;
+}
+
+static const struct rsa_ops rsa_ops_sw = {
+       .get_mod_exp    = mod_exp_sw,
+};
+
+U_BOOT_DRIVER(fsl_rsa) = {
+       .name   = "rsa_sw",
+       .id     = UCLASS_RSA,
+       .ops    = &rsa_ops_sw,
+};
+
+U_BOOT_DEVICE(rsa_sw) = {
+       .name = "rsa_sw",
+};
(quoted diff) +0 -0

b/drivers/crypto/rsa/rsa_uclass.c new file mode 100644 index 0000000..f4f4f39

drivers/crypto/rsa/rsa_uclass.c new file +29 -0
@@ -0,0 +1,31 @@
+/*
+ * (C) Copyright 2014 Freescale Semiconductor, Inc
+ * Author: Ruchika Gupta <[email protected]>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <u-boot/rsa-mod-exp.h>
+#include <errno.h>
+#include <fdtdec.h>
+#include <malloc.h>
+#include <asm/io.h>
+#include <linux/list.h>
+
+int rsa_mod_exp(struct udevice *dev, const uint8_t *sig, uint32_t sig_len,
+               struct key_prop *node, uint8_t *out) {
+       const struct rsa_ops *ops = device_get_ops(dev);
+
+       if (!ops->get_mod_exp)
+               return -ENOSYS;
+
+       return ops->get_mod_exp(dev, sig, sig_len, node, out); }
+
+UCLASS_DRIVER(rsa) = {
+       .id             = UCLASS_RSA,
+       .name           = "rsa",
+};
include/dm/uclass-id.h index renamed from include/dm/uclass-id.h +0 -0

f17c3c2..659369e 100644
--- a/include/dm/uclass-id.h

Quoted 8 lines

include/dm/uclass-id.h index enum uclass_id { · line 36

Quoted 6 lines

+++ b/include/dm/uclass-id.h

include/dm/uclass-id.h index renamed from include/dm/uclass-id.h +1 -0
@@ -33,6 +33,7 @@ enum uclass_id {
        UCLASS_I2C,             /* I2C bus */
        UCLASS_I2C_GENERIC,     /* Generic I2C device */
        UCLASS_I2C_EEPROM,      /* I2C EEPROM device */
+       UCLASS_RSA      ,       /* RSA Mod Exp device */

Funny spacing here.

Sorry, I will correct that.

Quoted 22 lines
Quoted 11 lines
include/dm/uclass-id.h index renamed from include/dm/uclass-id.h +0 -0
        UCLASS_COUNT,
        UCLASS_INVALID = -1,
(quoted diff) +0 -0

b/include/u-boot/rsa-mod-exp.h index 59cd9ea..7f7e196 100644

include/u-boot/rsa-mod-exp.h +0 -0
@@ -40,4 +40,44 @@ struct key_prop {  int rsa_mod_exp_sw(const
 uint8_t *sig, uint32_t sig_len,
                struct key_prop *node, uint8_t *out);

include/u-boot/rsa-mod-exp.h struct key_prop { int rsa_mod_exp_sw(const · line 51

Quoted 10 lines
include/u-boot/rsa-mod-exp.h +9 -0
 
+/**
+ * rsa_mod_exp - Perform RSA Modular Exponentiation
+ *
+ * Operation: out[] = sig ^ exponent % modulus
+ *
+ * @udev:      RSA Device
+ * @sig:       RSA PKCS1.5 signature
+ * @sig_len:   Length of signature in number of bytes
+ * @node:      Node with RSA key elements like modulus, exponent, R^2,

n0inv

Quoted 4 lines
Quoted 3 lines

include/u-boot/rsa-mod-exp.h struct key_prop { int rsa_mod_exp_sw(const · line 52

Quoted 1 line
include/u-boot/rsa-mod-exp.h +1 -0
+ * @out:       Result in form of byte array

How big is this array?

Thanks for pointing out. In next set of patch, I will change it to uint8_t **out and introduce a uin32_t *out_len also. Ideally the implemntor of this function should allocate out as per length required and return back the pointer and the allocated length. This will also require change in patch 1 of this series. I will change and float next version.

OK.

Quoted 33 lines
Quoted 19 lines
Quoted 19 lines
include/u-boot/rsa-mod-exp.h +17 -0
+ */
+int rsa_mod_exp(struct udevice *dev, const uint8_t *sig, uint32_t sig_len,
+               struct key_prop *node, uint8_t *out);
+
+/**
+ * struct struct rsa_ops - Driver model for RSA operations
+ *
+ * The uclass interface is implemented by all crypto devices which
+use
+ * driver model.
+ */
+struct rsa_ops {
+       /**
+        * Perform Modular Exponentiation
+        *
+        * Operation: out[] = sig ^ exponent % modulus
+        *
Quoted 8 lines

include/u-boot/rsa-mod-exp.h struct key_prop { int rsa_mod_exp_sw(const · line 75

Quoted 6 lines
include/u-boot/rsa-mod-exp.h +6 -0
+        * @dev:        RSA Device
+        * @sig:        RSA PKCS1.5 signature
+        * @sig_len:    Length of signature in number of bytes
+        * @node:       Node with RSA key elements like modulus, exponent,
+        *              R^2, n0inv
+        * @out:        Result in form of byte array

How big is this array?

Same as above, I will change it to **outp and add a pointer for length

Quoted 5 lines

include/u-boot/rsa-mod-exp.h struct key_prop { int rsa_mod_exp_sw(const · line 77

Quoted 3 lines
include/u-boot/rsa-mod-exp.h +2 -0
+        * Returns: 0 if exponentiation is succesful, or a negative
+ value

successful

Quoted 17 lines

Ok

Quoted 6 lines

include/u-boot/rsa-mod-exp.h struct key_prop { int rsa_mod_exp_sw(const · line 80

Quoted 4 lines
include/u-boot/rsa-mod-exp.h +3 -0
+        * if it wasn't.
+        */
+       int (*get_mod_exp)(struct udevice *dev, const uint8_t *sig,

mod_exp() is better I think, since it matches your function above.

Ok. I will change it.

Quoted 9 lines
Quoted 8 lines
include/u-boot/rsa-mod-exp.h +3 -1
+                          uint32_t sig_len, struct key_prop *node,
+                          uint8_t *out); };
+
 #endif
--

1.8.1.4

Regards,
Simon