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

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

Signed-off-by: Ruchika Gupta <ruchika.gupta@freescale.com>
CC: Simon Glass <sjg@chromium.org>
Acked-by: Simon Glass <sjg@chromium.org>
master
Ruchika Gupta 10 years ago committed by Simon Glass
parent c4beb22fcd
commit 31d2b4fd90
  1. 1
      drivers/crypto/Makefile
  2. 5
      drivers/crypto/rsa_mod_exp/Kconfig
  3. 7
      drivers/crypto/rsa_mod_exp/Makefile
  4. 39
      drivers/crypto/rsa_mod_exp/mod_exp_sw.c
  5. 31
      drivers/crypto/rsa_mod_exp/mod_exp_uclass.c
  6. 1
      include/dm/uclass-id.h
  7. 34
      include/u-boot/rsa-mod-exp.h

@ -6,4 +6,5 @@
#
obj-$(CONFIG_EXYNOS_ACE_SHA) += ace_sha.o
obj-y += rsa_mod_exp/
obj-y += fsl/

@ -0,0 +1,5 @@
config DM_MOD_EXP
bool "Enable Driver Model for RSA Modular Exponentiation"
depends on DM
help
If you want to use driver model for RSA Modular Exponentiation, say Y.

@ -0,0 +1,7 @@
#
# (C) Copyright 2014 Freescale Semiconductor, Inc.
#
# SPDX-License-Identifier: GPL-2.0+
#
obj-$(CONFIG_RSA) += mod_exp_uclass.o mod_exp_sw.o

@ -0,0 +1,39 @@
/*
* (C) Copyright 2014 Freescale Semiconductor, Inc.
* Author: Ruchika Gupta <ruchika.gupta@freescale.com>
*
* 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 mod_exp_ops mod_exp_ops_sw = {
.mod_exp = mod_exp_sw,
};
U_BOOT_DRIVER(mod_exp_sw) = {
.name = "mod_exp_sw",
.id = UCLASS_MOD_EXP,
.ops = &mod_exp_ops_sw,
};
U_BOOT_DEVICE(mod_exp_sw) = {
.name = "mod_exp_sw",
};

@ -0,0 +1,31 @@
/*
* (C) Copyright 2014 Freescale Semiconductor, Inc
* Author: Ruchika Gupta <ruchika.gupta@freescale.com>
*
* 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 mod_exp_ops *ops = device_get_ops(dev);
if (!ops->mod_exp)
return -ENOSYS;
return ops->mod_exp(dev, sig, sig_len, node, out);
}
UCLASS_DRIVER(mod_exp) = {
.id = UCLASS_MOD_EXP,
.name = "rsa_mod_exp",
};

@ -33,6 +33,7 @@ enum uclass_id {
UCLASS_I2C, /* I2C bus */
UCLASS_I2C_GENERIC, /* Generic I2C device */
UCLASS_I2C_EEPROM, /* I2C EEPROM device */
UCLASS_MOD_EXP, /* RSA Mod Exp device */
UCLASS_COUNT,
UCLASS_INVALID = -1,

@ -35,9 +35,41 @@ struct key_prop {
* @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
* @out: Result in form of byte array of len equal to sig_len
*/
int rsa_mod_exp_sw(const uint8_t *sig, uint32_t sig_len,
struct key_prop *node, uint8_t *out);
int rsa_mod_exp(struct udevice *dev, const uint8_t *sig, uint32_t sig_len,
struct key_prop *node, uint8_t *out);
/**
* struct struct mod_exp_ops - Driver model for RSA Modular Exponentiation
* operations
*
* The uclass interface is implemented by all crypto devices which use
* driver model.
*/
struct mod_exp_ops {
/**
* Perform Modular Exponentiation
*
* Operation: out[] = sig ^ exponent % modulus
*
* @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 of len equal to sig_len
*
* This function computes exponentiation over the signature.
* Returns: 0 if exponentiation is successful, or a negative value
* if it wasn't.
*/
int (*mod_exp)(struct udevice *dev, const uint8_t *sig,
uint32_t sig_len, struct key_prop *node,
uint8_t *outp);
};
#endif

Loading…
Cancel
Save