summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2019-10-01 23:36:26 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2019-10-15 14:55:11 +0200
commitd091a81f3ece732826dd4dec0b241624159ae1d6 (patch)
treed5b1cbb075851dc21c5009f9f7aeb1bf98790001 /crypto
parent128ad3cbe043d5153007a50f09208c25703257dd (diff)
downloadbarebox-d091a81f3ece732826dd4dec0b241624159ae1d6.tar.gz
barebox-d091a81f3ece732826dd4dec0b241624159ae1d6.tar.xz
rsa: let rsa_of_read_key() return a fully allocated key
Until now rsa_of_read_key() took a pointer to a key and filled the struct rsa_public_key members with allocated values. So far we have never freed these values. Change rsa_of_read_key() to always return a fully allocated key and provide rsa_key_free() to free it. Let the FIT image code free the key after usage. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/rsa.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/crypto/rsa.c b/crypto/rsa.c
index 591d15c415..2e70c8127d 100644
--- a/crypto/rsa.c
+++ b/crypto/rsa.c
@@ -380,11 +380,15 @@ static void rsa_convert_big_endian(uint32_t *dst, const uint32_t *src, int len)
dst[i] = fdt32_to_cpu(src[len - 1 - i]);
}
-int rsa_of_read_key(struct device_node *node, struct rsa_public_key *key)
+struct rsa_public_key *rsa_of_read_key(struct device_node *node)
{
const void *modulus, *rr;
const uint64_t *public_exponent;
int length;
+ struct rsa_public_key *key;
+ int err;
+
+ key = xzalloc(sizeof(*key));
of_property_read_u32(node, "rsa,num-bits", &key->len);
of_property_read_u32(node, "rsa,n0-inverse", &key->n0inv);
@@ -400,14 +404,16 @@ int rsa_of_read_key(struct device_node *node, struct rsa_public_key *key)
if (!key->len || !modulus || !rr) {
debug("%s: Missing RSA key info", __func__);
- return -EFAULT;
+ err = -EFAULT;
+ goto out;
}
/* Sanity check for stack size */
if (key->len > RSA_MAX_KEY_BITS || key->len < RSA_MIN_KEY_BITS) {
debug("RSA key bits %u outside allowed range %d..%d\n",
key->len, RSA_MIN_KEY_BITS, RSA_MAX_KEY_BITS);
- return -EFAULT;
+ err = -EFAULT;
+ goto out;
}
key->len /= sizeof(uint32_t) * 8;
@@ -418,5 +424,17 @@ int rsa_of_read_key(struct device_node *node, struct rsa_public_key *key)
rsa_convert_big_endian(key->modulus, modulus, key->len);
rsa_convert_big_endian(key->rr, rr, key->len);
- return 0;
+ err = 0;
+out:
+ if (err)
+ free(key);
+
+ return err ? ERR_PTR(err) : key;
+}
+
+void rsa_key_free(struct rsa_public_key *key)
+{
+ free(key->modulus);
+ free(key->rr);
+ free(key);
}