summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordnojiri <dnojiri@chromium.org>2020-04-16 17:11:52 -0700
committerCommit Bot <commit-bot@chromium.org>2020-04-18 02:51:10 +0000
commit7ea99225b562b49b30fc374065f9dd48ed52f70d (patch)
treee995046a1e1085aada7155d3d7cb9f5c59a512c1
parentfdd5d7a00496eff6c413fab5cd538f71e1470af1 (diff)
downloadvboot-7ea99225b562b49b30fc374065f9dd48ed52f70d.tar.gz
secdata: Initialize secdata kernel in vb2api_fw_phase1
Currently, secdata kernel is initialized in vb2api_kernel_phase1. Since we'll be using secdata kernel in romstage for EFS2, it needs to be initialized earlier. This patch makes vb2api_fw_phase1 call vb2_secdata_kernel_init. Signed-off-by: dnojiri <dnojiri@chromium.org> BUG=b:147298634, chromium:1045217, b:148259137 BRANCH=none TEST=Verify Hmir is updated in romstage on Puff. Cq-Depend: chromium:2155377 Change-Id: I8a537126a952ecccc9cc496ce60fc6dc81541a8f Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/2153852 Reviewed-by: Julius Werner <jwerner@chromium.org> Reviewed-by: Joel Kitching <kitching@chromium.org> Commit-Queue: Daisuke Nojiri <dnojiri@chromium.org> Tested-by: Daisuke Nojiri <dnojiri@chromium.org> Auto-Submit: Daisuke Nojiri <dnojiri@chromium.org>
-rw-r--r--firmware/2lib/2api.c6
-rw-r--r--firmware/2lib/2kernel.c10
-rw-r--r--tests/vb20_verify_fw.c1
-rw-r--r--tests/vb2_api_tests.c17
-rw-r--r--tests/vb2_kernel_tests.c21
-rw-r--r--tests/vboot_api_kernel4_tests.c5
6 files changed, 24 insertions, 36 deletions
diff --git a/firmware/2lib/2api.c b/firmware/2lib/2api.c
index 4492cf93..d49b8d31 100644
--- a/firmware/2lib/2api.c
+++ b/firmware/2lib/2api.c
@@ -46,11 +46,15 @@ vb2_error_t vb2api_fw_phase1(struct vb2_context *ctx)
return VB2_ERROR_API_PHASE1_SECDATA_REBOOT;
}
- /* Initialize firmware secure data */
+ /* Initialize firmware & kernel secure data */
rv = vb2_secdata_firmware_init(ctx);
if (rv)
vb2api_fail(ctx, VB2_RECOVERY_SECDATA_FIRMWARE_INIT, rv);
+ rv = vb2_secdata_kernel_init(ctx);
+ if (rv)
+ vb2api_fail(ctx, VB2_RECOVERY_SECDATA_KERNEL_INIT, rv);
+
/* Load and parse the GBB header */
rv = vb2_fw_init_gbb(ctx);
if (rv)
diff --git a/firmware/2lib/2kernel.c b/firmware/2lib/2kernel.c
index f49b6dea..84c90d70 100644
--- a/firmware/2lib/2kernel.c
+++ b/firmware/2lib/2kernel.c
@@ -131,16 +131,10 @@ vb2_error_t vb2api_kernel_phase1(struct vb2_context *ctx)
vb2_workbuf_from_ctx(ctx, &wb);
/*
- * Init secdata_kernel and secdata_fwmp spaces. No need to init
- * secdata_firmware, since it was already read during firmware
+ * Init secdata_fwmp spaces. No need to init secdata_firmware or
+ * secdata_kernel, since they were already read during firmware
* verification. Ignore errors in recovery mode.
*/
- rv = vb2_secdata_kernel_init(ctx);
- if (rv && !(ctx->flags & VB2_CONTEXT_RECOVERY_MODE)) {
- VB2_DEBUG("TPM: init secdata_kernel returned %#x\n", rv);
- vb2api_fail(ctx, VB2_RECOVERY_SECDATA_KERNEL_INIT, rv);
- return rv;
- }
rv = vb2_secdata_fwmp_init(ctx);
if (rv && !(ctx->flags & VB2_CONTEXT_RECOVERY_MODE)) {
VB2_DEBUG("TPM: init secdata_fwmp returned %#x\n", rv);
diff --git a/tests/vb20_verify_fw.c b/tests/vb20_verify_fw.c
index e2a54718..f732b8b2 100644
--- a/tests/vb20_verify_fw.c
+++ b/tests/vb20_verify_fw.c
@@ -176,6 +176,7 @@ int main(int argc, char *argv[])
/* Initialize secure context */
vb2api_secdata_firmware_create(ctx);
+ vb2api_secdata_kernel_create(ctx);
// TODO: optional args to set contents for nvdata, secdata?
diff --git a/tests/vb2_api_tests.c b/tests/vb2_api_tests.c
index 50bdf742..a03a0041 100644
--- a/tests/vb2_api_tests.c
+++ b/tests/vb2_api_tests.c
@@ -79,7 +79,8 @@ static void reset_common_data(enum reset_type t)
vb2_nv_init(ctx);
vb2api_secdata_firmware_create(ctx);
- vb2_secdata_firmware_init(ctx);
+
+ vb2api_secdata_kernel_create(ctx);
force_dev_mode = 0;
retval_vb2_fw_init_gbb = VB2_SUCCESS;
@@ -352,6 +353,10 @@ static void phase1_tests(void)
0, " display init context flag");
TEST_EQ(sd->flags & VB2_SD_FLAG_DISPLAY_AVAILABLE,
0, " display available SD flag");
+ TEST_NEQ(sd->status & VB2_SD_STATUS_SECDATA_FIRMWARE_INIT,
+ 0, " secdata firmware initialized");
+ TEST_NEQ(sd->status & VB2_SD_STATUS_SECDATA_KERNEL_INIT,
+ 0, " secdata kernel initialized");
reset_common_data(FOR_MISC);
retval_vb2_fw_init_gbb = VB2_ERROR_GBB_MAGIC;
@@ -392,6 +397,16 @@ static void phase1_tests(void)
TEST_NEQ(ctx->flags & VB2_CONTEXT_RECOVERY_MODE, 0, " recovery flag");
TEST_NEQ(ctx->flags & VB2_CONTEXT_CLEAR_RAM, 0, " clear ram flag");
+ /* Bad secdata_kernel causes recovery mode */
+ reset_common_data(FOR_MISC);
+ ctx->secdata_kernel[2] ^= 0x42; /* 3rd byte is CRC */
+ TEST_EQ(vb2api_fw_phase1(ctx), VB2_ERROR_API_PHASE1_RECOVERY,
+ "phase1 bad secdata_kernel");
+ TEST_EQ(sd->recovery_reason, VB2_RECOVERY_SECDATA_KERNEL_INIT,
+ " recovery reason");
+ TEST_NEQ(ctx->flags & VB2_CONTEXT_RECOVERY_MODE, 0, " recovery flag");
+ TEST_NEQ(ctx->flags & VB2_CONTEXT_CLEAR_RAM, 0, " clear ram flag");
+
/* Test secdata_firmware-requested reboot */
reset_common_data(FOR_MISC);
ctx->flags |= VB2_CONTEXT_SECDATA_WANTS_REBOOT;
diff --git a/tests/vb2_kernel_tests.c b/tests/vb2_kernel_tests.c
index 0117f97c..d92f1591 100644
--- a/tests/vb2_kernel_tests.c
+++ b/tests/vb2_kernel_tests.c
@@ -99,11 +99,6 @@ static void reset_common_data(enum reset_type t)
sd->preamble_size = sizeof(*fwpre) + k->key_size;
vb2_set_workbuf_used(ctx,
sd->preamble_offset + sd->preamble_size);
-
- /* Needed to check that secdata_kernel initialization is
- performed by phase1 function. */
- sd->status &= ~VB2_SD_STATUS_SECDATA_KERNEL_INIT;
-
}
};
@@ -219,22 +214,6 @@ static void phase1_tests(void)
TEST_EQ(sd->kernel_version_secdata, 0x20002,
" secdata_kernel version");
- /* Bad secdata_kernel causes failure in normal mode only */
- reset_common_data(FOR_PHASE1);
- ctx->secdata_kernel[2] ^= 0x33; /* 3rd byte is CRC */
- TEST_EQ(vb2api_kernel_phase1(ctx), VB2_ERROR_SECDATA_KERNEL_CRC,
- "phase1 bad secdata_kernel");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
- VB2_RECOVERY_SECDATA_KERNEL_INIT, " recovery reason");
-
- reset_common_data(FOR_PHASE1);
- ctx->secdata_kernel[0] ^= 0x33;
- ctx->flags |= VB2_CONTEXT_RECOVERY_MODE;
- TEST_SUCC(vb2api_kernel_phase1(ctx), "phase1 bad secdata_kernel rec");
- TEST_EQ(sd->kernel_version_secdata, 0, " secdata_kernel version");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
- VB2_RECOVERY_NOT_REQUESTED, " no recovery");
-
/* Bad secdata_fwmp causes failure in normal mode only */
reset_common_data(FOR_PHASE1);
mock_secdata_fwmp_check_retval = VB2_ERROR_SECDATA_FWMP_CRC;
diff --git a/tests/vboot_api_kernel4_tests.c b/tests/vboot_api_kernel4_tests.c
index de4688b0..12a89af4 100644
--- a/tests/vboot_api_kernel4_tests.c
+++ b/tests/vboot_api_kernel4_tests.c
@@ -109,11 +109,6 @@ vb2_error_t vb2ex_commit_data(struct vb2_context *c)
return VB2_SUCCESS;
}
-vb2_error_t vb2_secdata_kernel_init(struct vb2_context *c)
-{
- return secdata_kernel_init_retval;
-}
-
vb2_error_t vb2_secdata_fwmp_init(struct vb2_context *c)
{
return secdata_fwmp_init_retval;