[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 4/5] livepatch: Load built-in key during boot
Parse the raw data of the embedded RSA key into a form that can be later used for verifying live patch signatures. Signed-off-by: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx> --- In v2: * Split out from "livepatch: Embed public key in Xen" xen/common/livepatch.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/xen/common/livepatch.c b/xen/common/livepatch.c index be9b7e367553..bc158971b4bf 100644 --- a/xen/common/livepatch.c +++ b/xen/common/livepatch.c @@ -11,6 +11,8 @@ #include <xen/lib.h> #include <xen/list.h> #include <xen/mm.h> +#include <xen/mpi.h> +#include <xen/rsa.h> #include <xen/sched.h> #include <xen/smp.h> #include <xen/softirq.h> @@ -73,6 +75,10 @@ static struct livepatch_work livepatch_work; static DEFINE_PER_CPU(bool, work_to_do); static DEFINE_PER_CPU(struct tasklet, livepatch_tasklet); +#ifdef CONFIG_PAYLOAD_VERIFY +static struct rsa_public_key builtin_payload_key; +#endif + static int get_name(const struct xen_livepatch_name *name, char *n) { if ( !name->size || name->size > XEN_LIVEPATCH_NAME_SIZE ) @@ -2287,6 +2293,31 @@ static void cf_check livepatch_printall(unsigned char key) spin_unlock(&payload_lock); } +static int __init load_builtin_payload_key(void) +{ +#ifdef CONFIG_PAYLOAD_VERIFY + const uint8_t *ptr; + uint32_t len; + + rsa_public_key_init(&builtin_payload_key); + + ptr = xen_livepatch_key_data; + + memcpy(&len, ptr, sizeof(len)); + ptr += sizeof(len); + builtin_payload_key.n = mpi_read_raw_data(ptr, len); + ptr += len; + + memcpy(&len, ptr, sizeof(len)); + ptr += sizeof(len); + builtin_payload_key.e = mpi_read_raw_data(ptr, len); + + return rsa_public_key_prepare(&builtin_payload_key); +#else + return 0; +#endif +} + static int cf_check cpu_callback( struct notifier_block *nfb, unsigned long action, void *hcpu) { @@ -2305,6 +2336,11 @@ static struct notifier_block cpu_nfb = { static int __init cf_check livepatch_init(void) { unsigned int cpu; + int err; + + err = load_builtin_payload_key(); + if (err) + return err; for_each_online_cpu ( cpu ) { -- 2.49.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |