mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-29 08:00:26 +09:00
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-$(CONFIG_EXYNOS_ACE_SHA) += ace_sha.o
|
||||||
|
obj-y += rsa_mod_exp/
|
||||||
obj-y += fsl/
|
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, /* I2C bus */
|
||||||
UCLASS_I2C_GENERIC, /* Generic I2C device */
|
UCLASS_I2C_GENERIC, /* Generic I2C device */
|
||||||
UCLASS_I2C_EEPROM, /* I2C EEPROM device */
|
UCLASS_I2C_EEPROM, /* I2C EEPROM device */
|
||||||
|
UCLASS_MOD_EXP, /* RSA Mod Exp device */
|
||||||
|
|
||||||
UCLASS_COUNT,
|
UCLASS_COUNT,
|
||||||
UCLASS_INVALID = -1,
|
UCLASS_INVALID = -1,
|
||||||
|
@ -35,9 +35,41 @@ struct key_prop {
|
|||||||
* @sig: RSA PKCS1.5 signature
|
* @sig: RSA PKCS1.5 signature
|
||||||
* @sig_len: Length of signature in number of bytes
|
* @sig_len: Length of signature in number of bytes
|
||||||
* @node: Node with RSA key elements like modulus, exponent, R^2, n0inv
|
* @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,
|
int rsa_mod_exp_sw(const uint8_t *sig, uint32_t sig_len,
|
||||||
struct key_prop *node, uint8_t *out);
|
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
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user