[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 5/5] livepatch: Verify livepatch signatures
On 15.05.2025 11:38, Ross Lagerwall wrote: > @@ -79,6 +80,9 @@ static DEFINE_PER_CPU(struct tasklet, livepatch_tasklet); > static struct rsa_public_key builtin_payload_key; > #endif > > +static int check_signature(const struct livepatch_elf *elf, void *raw, > + size_t size); I think it would be nice if this forward decl was avoided. Which looks to be feasible if you moved the definition further up. > @@ -1202,6 +1208,109 @@ static int load_payload_data(struct payload *payload, > void *raw, size_t len) > return rc; > } > > +#ifdef CONFIG_PAYLOAD_VERIFY > +#define MAX_SIG_NOTE_SIZE 1024 > + > +static int check_rsa_sha256_signature(void *data, size_t datalen, > + void *sig, uint32_t siglen) > +{ > + struct sha2_256_state hash; > + MPI s; > + int rc; > + > + s = mpi_read_raw_data(sig, siglen); > + if ( !s ) > + { > + printk(XENLOG_ERR LIVEPATCH "Failed to mpi_read_raw_data\n"); > + return -ENOMEM; > + } > + > + sha2_256_init(&hash); > + sha2_256_update(&hash, data, datalen); > + > + rc = rsa_sha256_verify(&builtin_payload_key, &hash, s); > + if ( rc ) > + printk(XENLOG_ERR LIVEPATCH "rsa_sha256_verify failed: %d\n", rc); > + > + mpi_free(s); > + > + return rc; > +} > + > +static int check_signature(const struct livepatch_elf *elf, void *raw, > + size_t size) > +{ > + static const char notename[] = "Xen"; > + void *sig; > + livepatch_elf_note note; > + int rc; > + > + rc = livepatch_elf_note_by_names(elf, ELF_XEN_SIGNATURE, notename, -1, > + ¬e); > + if ( rc ) > + { > + dprintk(XENLOG_DEBUG, LIVEPATCH "%s: Signature not present\n", > + elf->name); > + return rc; > + } > + > + /* We expect only one signature, find a second is an error! */ > + rc = livepatch_elf_next_note_by_name(notename, -1, ¬e); > + if ( rc != -ENOENT ) > + { > + if ( rc ) > + { > + printk(XENLOG_ERR LIVEPATCH > + "Error while checking for notes! err = %d\n", rc); > + return rc; > + } > + else > + { > + printk(XENLOG_ERR LIVEPATCH > + "Error, found second signature note! There can be only > one!\n"); > + return -EINVAL; > + } > + } > + > + if ( SIGNATURE_VERSION(note.type) != LIVEPATCH_SIGNATURE_VERSION || > + SIGNATURE_ALGORITHM(note.type) != SIGNATURE_ALGORITHM_RSA || > + SIGNATURE_HASH(note.type) != SIGNATURE_HASH_SHA256 ) > + { > + printk(XENLOG_ERR LIVEPATCH > + "Unsupported signature type: v:%u, a:%u, h:%u\n", > + SIGNATURE_VERSION(note.type), SIGNATURE_ALGORITHM(note.type), > + SIGNATURE_HASH(note.type)); > + return -EINVAL; > + } > + > + if ( note.size == 0 || note.size >= MAX_SIG_NOTE_SIZE ) > + { > + printk(XENLOG_ERR LIVEPATCH "Invalid signature note size: %u\n", > + note.size); > + return -EINVAL; > + } > + > + sig = xmalloc_bytes(note.size); > + if ( !sig ) > + return -ENOMEM; > + > + memcpy(sig, note.data, note.size); > + > + /* Remove signature from data, as can't be verified with it. */ > + memset((void *)note.data, 0, note.size); > + rc = check_rsa_sha256_signature(raw, size, sig, note.size); > + > + xfree(sig); > + return rc; > +} > +#else > +static int check_signature(const struct livepatch_elf *elf, void *raw, > + size_t size) As indicated before, I also think it would be nice if this redundant function header was eliminated, but changing the #if / #else / #endif placement. Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |