diff options
author | Randall Spangler <rspangler@chromium.org> | 2011-07-13 09:48:41 -0700 |
---|---|---|
committer | Randall Spangler <rspangler@chromium.org> | 2011-07-13 10:13:12 -0700 |
commit | a712e01ae783351e921031aab59ff1b7583d683d (patch) | |
tree | 81b255e45fd41e2ca5ef7405d19e044234500f07 /firmware/lib/vboot_common.c | |
parent | d70241f37d87bd7758fc6c5bbb7d5870098ecdfc (diff) | |
download | vboot-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.c | 25 |
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) { |