summaryrefslogtreecommitdiff
path: root/firmware/lib
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/lib')
-rw-r--r--firmware/lib/include/vboot_common.h11
-rw-r--r--firmware/lib/vboot_common.c19
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)
{