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>
This commit is contained in:
parent
c4beb22fcd
commit
31d2b4fd90
@ -6,4 +6,5 @@
|
||||
#
|
||||
|
||||
obj-$(CONFIG_EXYNOS_ACE_SHA) += ace_sha.o
|
||||
obj-y += rsa_mod_exp/
|
||||
obj-y += fsl/
|
||||
|
5
drivers/crypto/rsa_mod_exp/Kconfig
Normal file
5
drivers/crypto/rsa_mod_exp/Kconfig
Normal file
@ -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.
|
7
drivers/crypto/rsa_mod_exp/Makefile
Normal file
7
drivers/crypto/rsa_mod_exp/Makefile
Normal file
@ -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
|
39
drivers/crypto/rsa_mod_exp/mod_exp_sw.c
Normal file
39
drivers/crypto/rsa_mod_exp/mod_exp_sw.c
Normal file
@ -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",
|
||||
};
|
31
drivers/crypto/rsa_mod_exp/mod_exp_uclass.c
Normal file
31
drivers/crypto/rsa_mod_exp/mod_exp_uclass.c
Normal file
@ -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…
Reference in New Issue
Block a user