diff options
Diffstat (limited to 'firmware/lib')
-rw-r--r-- | firmware/lib/include/vboot_common.h | 11 | ||||
-rw-r--r-- | firmware/lib/vboot_common.c | 19 |
2 files changed, 28 insertions, 2 deletions
diff --git a/firmware/lib/include/vboot_common.h b/firmware/lib/include/vboot_common.h index f792d1a2..4d50ff62 100644 --- a/firmware/lib/include/vboot_common.h +++ b/firmware/lib/include/vboot_common.h @@ -41,6 +41,8 @@ enum { VBOOT_PREAMBLE_SIGNATURE, /* Shared data is invalid. */ VBOOT_SHARED_DATA_INVALID, + /* Kernel Preamble does not contain flags */ + VBOOT_KERNEL_PREAMBLE_NO_FLAGS, VBOOT_ERROR_MAX, }; extern const char *kVbootErrors[VBOOT_ERROR_MAX]; @@ -161,6 +163,15 @@ int VbGetKernelVmlinuzHeader(const VbKernelPreambleHeader *preamble, uint64_t *vmlinuz_header_size); /** + * Checks if the kernel preamble has flags field. This is available only if the + * Kernel Preamble Header version >=2.2. If give a header of 2.1 or lower, it + * will return VBOOT_KERNEL_PREAMBLE_NO_FLAGS. + * + * Returns VBOOT_SUCCESS if version is >=2.2. + */ +int VbKernelHasFlags(const VbKernelPreambleHeader *preamble); + +/** * Verify that the Vmlinuz Header is contained inside of the kernel blob. * * Returns VBOOT_SUCCESS or VBOOT_PREAMBLE_INVALID on error diff --git a/firmware/lib/vboot_common.c b/firmware/lib/vboot_common.c index 2cb01f37..226cdb7b 100644 --- a/firmware/lib/vboot_common.c +++ b/firmware/lib/vboot_common.c @@ -437,13 +437,20 @@ int VerifyKernelPreamble(const VbKernelPreambleHeader *preamble, /* * If the preamble header version is at least 2.1, verify we have space - * for the added fields from 2.1. + * for the added fields from >2.1. */ if (preamble->header_version_minor >= 1) { - if(size < EXPECTED_VBKERNELPREAMBLEHEADER2_1_SIZE) { + if((preamble->header_version_minor == 1) && + (size < EXPECTED_VBKERNELPREAMBLEHEADER2_1_SIZE)) { VBDEBUG(("Not enough data for preamble header 2.1.\n")); return VBOOT_PREAMBLE_INVALID; } + + if((preamble->header_version_minor == 2) && + (size < EXPECTED_VBKERNELPREAMBLEHEADER2_2_SIZE)) { + VBDEBUG(("Not enough data for preamble header 2.2.\n")); + return VBOOT_PREAMBLE_INVALID; + } } /* Success */ @@ -469,6 +476,14 @@ int VbGetKernelVmlinuzHeader(const VbKernelPreambleHeader *preamble, return VBOOT_SUCCESS; } +int VbKernelHasFlags(const VbKernelPreambleHeader *preamble) +{ + if (preamble->header_version_minor > 1) + return VBOOT_SUCCESS; + + return VBOOT_KERNEL_PREAMBLE_NO_FLAGS; +} + int VerifyVmlinuzInsideKBlob(uint64_t kblob, uint64_t kblob_size, uint64_t header, uint64_t header_size) { |