summaryrefslogtreecommitdiff
path: root/firmware/lib/vboot_common.c
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2011-07-13 09:48:41 -0700
committerRandall Spangler <rspangler@chromium.org>2011-07-13 10:13:12 -0700
commita712e01ae783351e921031aab59ff1b7583d683d (patch)
tree81b255e45fd41e2ca5ef7405d19e044234500f07 /firmware/lib/vboot_common.c
parentd70241f37d87bd7758fc6c5bbb7d5870098ecdfc (diff)
downloadvboot-a712e01ae783351e921031aab59ff1b7583d683d.tar.gz
Add support for flags in the firmware preamble.
The old (v2.0) parser is compatible with new (v2.1) structs. That is, this won't break existing firmware or vbutil_firmware. A new (v2.1) parser parsing an old (v2.0) struct will return 0 for the flags. This will be used to support the RO-normal code path in a subsequent CL. BUG=chromium-os:17304 TEST=added unit tests; make && make runtests Change-Id: I73bcd8acd3330b0d7d143061b5ef838e6d79cf1a Reviewed-on: http://gerrit.chromium.org/gerrit/4030 Reviewed-by: Bill Richardson <wfrichar@chromium.org> Tested-by: Randall Spangler <rspangler@chromium.org>
Diffstat (limited to 'firmware/lib/vboot_common.c')
-rw-r--r--firmware/lib/vboot_common.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/firmware/lib/vboot_common.c b/firmware/lib/vboot_common.c
index 81e2597b..5622d13b 100644
--- a/firmware/lib/vboot_common.c
+++ b/firmware/lib/vboot_common.c
@@ -297,8 +297,8 @@ int VerifyFirmwarePreamble(const VbFirmwarePreambleHeader* preamble,
const VbSignature* sig = &preamble->preamble_signature;
/* Sanity checks before attempting signature of data */
- if(size < sizeof(VbFirmwarePreambleHeader)) {
- VBDEBUG(("Not enough data for preamble header.\n"));
+ if(size < EXPECTED_VBFIRMWAREPREAMBLEHEADER2_0_SIZE) {
+ VBDEBUG(("Not enough data for preamble header 2.0.\n"));
return VBOOT_PREAMBLE_INVALID;
}
if (preamble->header_version_major !=
@@ -348,11 +348,32 @@ int VerifyFirmwarePreamble(const VbFirmwarePreambleHeader* preamble,
return VBOOT_PREAMBLE_INVALID;
}
+ /* If the preamble header version is at least 2.1, verify we have
+ * space for the added fields from 2.1. */
+ if (preamble->header_version_minor >= 1) {
+ if(size < EXPECTED_VBFIRMWAREPREAMBLEHEADER2_1_SIZE) {
+ VBDEBUG(("Not enough data for preamble header 2.1.\n"));
+ return VBOOT_PREAMBLE_INVALID;
+ }
+ }
+
/* Success */
return VBOOT_SUCCESS;
}
+uint32_t VbGetFirmwarePreambleFlags(const VbFirmwarePreambleHeader* preamble) {
+ if (preamble->header_version_minor < 1) {
+ /* Old structure; return default flags. (Note that we don't need
+ * to check header_version_major; if that's not 2 then
+ * VerifyFirmwarePreamble() would have already failed. */
+ return 0;
+ }
+
+ return preamble->flags;
+}
+
+
int VerifyKernelPreamble(const VbKernelPreambleHeader* preamble,
uint64_t size, const RSAPublicKey* key) {