summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2015-02-02 14:36:47 -0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-02-03 04:19:12 +0000
commitbca307cc7d4224eadcc821b26e71e535fc0ba536 (patch)
treecb674eaa5029ca2f45e526b178f26f3e23acd0b0
parent00cc1b34e97f5b5b7cfa254ed3c92a6c63a32369 (diff)
downloadvboot-bca307cc7d4224eadcc821b26e71e535fc0ba536.tar.gz
vboot2: Add sd->fw_version_secdata field to communicate to crossystem
Partial backport of Change-Id: I2a0c3e51b158a35ac129d2abce19b40c6c6381a6. This patchs adds a new vb2_shared_data field to store the current rollback prevention version number stored in secdata (TPM). This information needs to be retrieved from there by coreboot (current hack) or vboot2 kernel verification (bright shiny future) so it can be passed along to the operating system and user space. BRANCH=none BUG=chrome-os-partner:35941 TEST=Manual on Kitty. Boot in recovery mode, verify that fwver shows correct non-zero value. Change-Id: Ibc9ea75727689549c65e908504d62e90ae1da3c9 Reviewed-on: https://chromium-review.googlesource.com/245534 Tested-by: Shawn N <shawnn@chromium.org> Reviewed-by: Julius Werner <jwerner@chromium.org> Commit-Queue: Shawn N <shawnn@chromium.org>
-rw-r--r--firmware/2lib/2misc.c19
-rw-r--r--firmware/2lib/2secdata.c6
-rw-r--r--firmware/2lib/include/2struct.h3
-rw-r--r--tests/vb2_misc2_tests.c3
4 files changed, 15 insertions, 16 deletions
diff --git a/firmware/2lib/2misc.c b/firmware/2lib/2misc.c
index 504eb426..931c4f04 100644
--- a/firmware/2lib/2misc.c
+++ b/firmware/2lib/2misc.c
@@ -370,7 +370,6 @@ int vb2_verify_fw_keyblock(struct vb2_context *ctx)
struct vb2_keyblock *kb;
uint32_t block_size;
- uint32_t sec_version;
int rv;
vb2_workbuf_from_ctx(ctx, &wb);
@@ -421,15 +420,10 @@ int vb2_verify_fw_keyblock(struct vb2_context *ctx)
if (rv)
return rv;
- /* Read the secure key version */
- rv = vb2_secdata_get(ctx, VB2_SECDATA_VERSIONS, &sec_version);
- if (rv)
- return rv;
-
/* Key version is the upper 16 bits of the composite firmware version */
if (kb->data_key.key_version > 0xffff)
return VB2_ERROR_FW_KEYBLOCK_VERSION_RANGE;
- if (kb->data_key.key_version < (sec_version >> 16))
+ if (kb->data_key.key_version < (sd->fw_version_secdata >> 16))
return VB2_ERROR_FW_KEYBLOCK_VERSION_ROLLBACK;
sd->fw_version = kb->data_key.key_version << 16;
@@ -485,7 +479,6 @@ int vb2_verify_fw_preamble2(struct vb2_context *ctx)
struct vb2_fw_preamble *pre;
uint32_t pre_size;
- uint32_t sec_version;
int rv;
vb2_workbuf_from_ctx(ctx, &wb);
@@ -529,11 +522,6 @@ int vb2_verify_fw_preamble2(struct vb2_context *ctx)
if (rv)
return rv;
- /* Read the secure key version */
- rv = vb2_secdata_get(ctx, VB2_SECDATA_VERSIONS, &sec_version);
- if (rv)
- return rv;
-
/*
* Firmware version is the lower 16 bits of the composite firmware
* version.
@@ -543,7 +531,7 @@ int vb2_verify_fw_preamble2(struct vb2_context *ctx)
/* Combine with the key version from vb2_verify_fw_keyblock() */
sd->fw_version |= pre->firmware_version;
- if (sd->fw_version < sec_version)
+ if (sd->fw_version < sd->fw_version_secdata)
return VB2_ERROR_FW_PREAMBLE2_VERSION_ROLLBACK;
/*
@@ -551,10 +539,11 @@ int vb2_verify_fw_preamble2(struct vb2_context *ctx)
* successfully booted the same slot last boot, roll forward the
* version in secure storage.
*/
- if (sd->fw_version > sec_version &&
+ if (sd->fw_version > sd->fw_version_secdata &&
sd->last_fw_slot == sd->fw_slot &&
sd->last_fw_result == VB2_FW_RESULT_SUCCESS) {
+ sd->fw_version_secdata = sd->fw_version;
rv = vb2_secdata_set(ctx, VB2_SECDATA_VERSIONS, sd->fw_version);
if (rv)
return rv;
diff --git a/firmware/2lib/2secdata.c b/firmware/2lib/2secdata.c
index 2987e037..0c5a34e4 100644
--- a/firmware/2lib/2secdata.c
+++ b/firmware/2lib/2secdata.c
@@ -53,6 +53,12 @@ int vb2_secdata_init(struct vb2_context *ctx)
if (rv)
return rv;
+ /* Read this now to make sure crossystem has it even in rec mode. */
+ rv = vb2_secdata_get(ctx, VB2_SECDATA_VERSIONS,
+ &sd->fw_version_secdata);
+ if (rv)
+ return rv;
+
/* Set status flag */
sd->status |= VB2_SD_STATUS_SECDATA_INIT;
// TODO: unit test for that
diff --git a/firmware/2lib/include/2struct.h b/firmware/2lib/include/2struct.h
index 560d5672..38979253 100644
--- a/firmware/2lib/include/2struct.h
+++ b/firmware/2lib/include/2struct.h
@@ -251,6 +251,9 @@ struct vb2_shared_data {
*/
uint32_t fw_version;
+ /* Version stored in secdata (must be <= fw_version to boot). */
+ uint32_t fw_version_secdata;
+
/*
* Status flags for this boot; see enum vb2_shared_data_status. Status
* is "what we've done"; flags above are "decisions we've made".
diff --git a/tests/vb2_misc2_tests.c b/tests/vb2_misc2_tests.c
index 14526f70..8215dd48 100644
--- a/tests/vb2_misc2_tests.c
+++ b/tests/vb2_misc2_tests.c
@@ -81,7 +81,8 @@ static void reset_common_data(enum reset_type t)
mock_verify_preamble_retval = VB2_SUCCESS;
/* Set up mock data for verifying keyblock */
- vb2_secdata_set(&cc, VB2_SECDATA_VERSIONS, 0x20002);
+ sd->fw_version_secdata = 0x20002;
+ vb2_secdata_set(&cc, VB2_SECDATA_VERSIONS, sd->fw_version_secdata);
sd->gbb_rootkey_offset = vb2_offset_of(&mock_gbb, &mock_gbb.rootkey);
sd->gbb_rootkey_size = sizeof(mock_gbb.rootkey_data);