diff options
Diffstat (limited to 'tests/vboot_api_init_tests.c')
-rw-r--r-- | tests/vboot_api_init_tests.c | 76 |
1 files changed, 73 insertions, 3 deletions
diff --git a/tests/vboot_api_init_tests.c b/tests/vboot_api_init_tests.c index 09c210bf..15907d49 100644 --- a/tests/vboot_api_init_tests.c +++ b/tests/vboot_api_init_tests.c @@ -26,7 +26,9 @@ static uint64_t mock_timer; static int rollback_s3_retval; static int nv_write_called; static GoogleBinaryBlockHeader gbb; - +static int mock_dev_mode; +static uint32_t mock_tpm_version; +static uint32_t mock_rfs_retval; /* Reset mock data (for use before each test) */ static void ResetMocks(void) { @@ -44,7 +46,7 @@ static void ResetMocks(void) { Memset(&vnc, 0, sizeof(vnc)); VbNvSetup(&vnc); - VbNvTeardown(&vnc); /* So CRC gets generated */ + VbNvTeardown(&vnc); /* So CRC gets generated */ Memset(&shared_data, 0, sizeof(shared_data)); VbSharedDataInit(shared, sizeof(shared_data)); @@ -52,6 +54,10 @@ static void ResetMocks(void) { mock_timer = 10; rollback_s3_retval = TPM_SUCCESS; nv_write_called = 0; + + mock_dev_mode = 0; + mock_tpm_version = 0x10001; + mock_rfs_retval = 0; } /****************************************************************************/ @@ -81,6 +87,14 @@ uint32_t RollbackS3Resume(void) { return rollback_s3_retval; } +uint32_t RollbackFirmwareSetup(int recovery_mode, int hw_dev_sw, + int* dev_mode_ptr, uint32_t* version) { + if (!hw_dev_sw) + *dev_mode_ptr = mock_dev_mode; + *version = mock_tpm_version; + return mock_rfs_retval; +} + /****************************************************************************/ /* Test VbInit() and check expected return value and recovery reason */ static void TestVbInit(VbError_t expected_retval, @@ -89,7 +103,7 @@ static void TestVbInit(VbError_t expected_retval, TEST_EQ(VbInit(&cparams, &iparams), expected_retval, desc); VbNvGet(&vnc, VBNV_RECOVERY_REQUEST, &rr); - TEST_EQ(rr, expected_recovery, " recovery request"); + TEST_EQ(rr, expected_recovery, " (recovery request)"); } /****************************************************************************/ @@ -267,6 +281,61 @@ static void VbInitTest(void) { VBSD_BOOT_REC_SWITCH_ON | VBSD_BOOT_DEV_SWITCH_ON, " shared flags"); } +static void VbInitTestTPM(void) { + + /* Rollback setup needs to reboot */ + ResetMocks(); + mock_rfs_retval = TPM_E_MUST_REBOOT; + TestVbInit(VBERROR_TPM_REBOOT_REQUIRED, 0, "Rollback TPM reboot (rec=0)"); + ResetMocks(); + mock_rfs_retval = TPM_E_MUST_REBOOT; + iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED; + TestVbInit(VBERROR_TPM_REBOOT_REQUIRED, VBNV_RECOVERY_RO_TPM_REBOOT, + "Rollback TPM reboot, in recovery, first time"); + /* Ignore if we already tried rebooting */ + ResetMocks(); + mock_rfs_retval = TPM_E_MUST_REBOOT; + VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, VBNV_RECOVERY_RO_TPM_REBOOT); + VbNvTeardown(&vnc); + TestVbInit(0, 0, "Rollback TPM reboot, in recovery, already retried"); + TEST_EQ(shared->fw_version_tpm, 0x10001, " shared fw_version_tpm"); + + /* Other rollback setup errors */ + ResetMocks(); + mock_rfs_retval = TPM_E_IOERROR; + mock_tpm_version = 0x20002; + TestVbInit(VBERROR_TPM_FIRMWARE_SETUP, VBNV_RECOVERY_RO_TPM_ERROR, + "Rollback TPM setup error - not in recovery"); + TEST_EQ(shared->fw_version_tpm, 0, " shared fw_version_tpm not set"); + ResetMocks(); + mock_rfs_retval = TPM_E_IOERROR; + VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, VBNV_RECOVERY_US_TEST); + VbNvTeardown(&vnc); + TestVbInit(0, 0, "Rollback TPM setup error ignored in recovery"); + TEST_EQ(shared->fw_version_tpm, 0x10001, " shared fw_version_tpm"); + + /* Virtual developer switch, but not enabled. */ + ResetMocks(); + iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON | VB_INIT_FLAG_VIRTUAL_DEV_SWITCH; + TestVbInit(0, 0, "TPM Dev mode off"); + TEST_EQ(shared->recovery_reason, 0, " recovery reason"); + TEST_EQ(iparams.out_flags, 0, " out flags"); + TEST_EQ(shared->flags, 0, " shared flags"); + + /* Virtual developer switch, enabled. */ + ResetMocks(); + iparams.flags = VB_INIT_FLAG_VIRTUAL_DEV_SWITCH; + mock_dev_mode = 1; + TestVbInit(0, 0, "TPM Dev mode on"); + TEST_EQ(shared->recovery_reason, 0, " recovery reason"); + TEST_EQ(iparams.out_flags, + VB_INIT_OUT_CLEAR_RAM | + VB_INIT_OUT_ENABLE_DISPLAY | + VB_INIT_OUT_ENABLE_USB_STORAGE | + VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags"); + TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, " shared flags"); +} + /* disable MSVC warnings on unused arguments */ __pragma(warning (disable: 4100)) @@ -275,6 +344,7 @@ int main(int argc, char* argv[]) { int error_code = 0; VbInitTest(); + VbInitTestTPM(); if (!gTestSuccess) error_code = 255; |