diff options
Diffstat (limited to 'firmware/lib20/kernel.c')
-rw-r--r-- | firmware/lib20/kernel.c | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/firmware/lib20/kernel.c b/firmware/lib20/kernel.c index 609f2461..4ded5d55 100644 --- a/firmware/lib20/kernel.c +++ b/firmware/lib20/kernel.c @@ -249,11 +249,12 @@ int vb2_verify_kernel_preamble(struct vb2_kernel_preamble *preamble, const struct vb2_workbuf *wb) { struct vb2_signature *sig = &preamble->preamble_signature; + uint32_t min_size = EXPECTED_VB2_KERNEL_PREAMBLE_2_0_SIZE; VB2_DEBUG("Verifying kernel preamble.\n"); - /* Sanity checks before attempting signature of data */ - if(size < sizeof(*preamble)) { + /* Make sure it's even safe to look at the struct */ + if(size < min_size) { VB2_DEBUG("Not enough data for preamble header.\n"); return VB2_ERROR_PREAMBLE_TOO_SMALL_FOR_HEADER; } @@ -262,9 +263,14 @@ int vb2_verify_kernel_preamble(struct vb2_kernel_preamble *preamble, VB2_DEBUG("Incompatible kernel preamble header version.\n"); return VB2_ERROR_PREAMBLE_HEADER_VERSION; } - if (preamble->header_version_minor < 2) { - VB2_DEBUG("Old preamble header format not supported\n"); - return VB2_ERROR_PREAMBLE_HEADER_OLD; + + if (preamble->header_version_minor >= 2) + min_size = EXPECTED_VB2_KERNEL_PREAMBLE_2_2_SIZE; + else if (preamble->header_version_minor == 1) + min_size = EXPECTED_VB2_KERNEL_PREAMBLE_2_1_SIZE; + if(preamble->preamble_size < min_size) { + VB2_DEBUG("Preamble size too small for header.\n"); + return VB2_ERROR_PREAMBLE_TOO_SMALL_FOR_HEADER; } if (size < preamble->preamble_size) { VB2_DEBUG("Not enough data for preamble.\n"); @@ -325,7 +331,8 @@ int vb2_verify_kernel_preamble(struct vb2_kernel_preamble *preamble, * If vmlinuz header is present, verify it's covered by the body * signature. */ - if (preamble->vmlinuz_header_size) { + if (preamble->header_version_minor >= 1 && + preamble->vmlinuz_header_size) { const void *body_ptr = (const void *)(uintptr_t)preamble->body_load_address; const void *vmlinuz_header_ptr = (const void *) @@ -442,3 +449,30 @@ int vb2_load_kernel_preamble(struct vb2_context *ctx) return VB2_SUCCESS; } + +void vb2_kernel_get_vmlinuz_header(const struct vb2_kernel_preamble *preamble, + uint64_t *vmlinuz_header_address, + uint32_t *vmlinuz_header_size) +{ + if (preamble->header_version_minor < 1) { + *vmlinuz_header_address = 0; + *vmlinuz_header_size = 0; + } else { + /* + * Set header and size only if the preamble header version is > + * 2.1 as they don't exist in version 2.0 (Note that we don't + * need to check header_version_major; if that's not 2 then + * VerifyKernelPreamble() would have already failed. + */ + *vmlinuz_header_address = preamble->vmlinuz_header_address; + *vmlinuz_header_size = preamble->vmlinuz_header_size; + } +} + +uint32_t vb2_kernel_get_flags(const struct vb2_kernel_preamble *preamble) +{ + if (preamble->header_version_minor < 2) + return 0; + + return preamble->flags; +} |