diff options
Diffstat (limited to 'tests/vboot_api_init_tests.c')
-rw-r--r-- | tests/vboot_api_init_tests.c | 803 |
1 files changed, 0 insertions, 803 deletions
diff --git a/tests/vboot_api_init_tests.c b/tests/vboot_api_init_tests.c deleted file mode 100644 index 366873b6..00000000 --- a/tests/vboot_api_init_tests.c +++ /dev/null @@ -1,803 +0,0 @@ -/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - * - * Tests for vboot_api_init - */ - -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> - -#include "gbb_header.h" -#include "host_common.h" -#include "rollback_index.h" -#include "test_common.h" -#include "vboot_common.h" -#include "vboot_nvstorage.h" -#include "vboot_struct.h" - -/* Mock data */ -static VbCommonParams cparams; -static VbInitParams iparams; -static VbNvContext vnc; -static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE]; -static VbSharedDataHeader *shared = (VbSharedDataHeader *)shared_data; -static uint64_t mock_timer; -static int rollback_s3_retval; -static int nv_write_called; -static GoogleBinaryBlockHeader gbb; -static int mock_virt_dev_sw; -static uint32_t mock_tpm_version; -static uint32_t mock_rfs_retval; -static int rfs_clear_tpm_request; -static int rfs_disable_dev_request; -static uint8_t backup_space[BACKUP_NV_SIZE]; -static int backup_write_called; -static int backup_read_called; - -/* Reset mock data (for use before each test) */ -static void ResetMocks(void) -{ - Memset(&cparams, 0, sizeof(cparams)); - cparams.shared_data_size = sizeof(shared_data); - cparams.shared_data_blob = shared_data; - cparams.gbb_data = &gbb; - cparams.gbb_size = sizeof(gbb); - - Memset(&gbb, 0, sizeof(gbb)); - gbb.major_version = GBB_MAJOR_VER; - gbb.minor_version = GBB_MINOR_VER; - gbb.flags = 0; - - Memset(&iparams, 0, sizeof(iparams)); - - Memset(&vnc, 0, sizeof(vnc)); - VbNvSetup(&vnc); - VbNvTeardown(&vnc); /* So CRC gets generated */ - - Memset(backup_space, 0, sizeof(backup_space)); - backup_write_called = 0; - backup_read_called = 0; - - Memset(&shared_data, 0, sizeof(shared_data)); - VbSharedDataInit(shared, sizeof(shared_data)); - - mock_timer = 10; - rollback_s3_retval = TPM_SUCCESS; - nv_write_called = 0; - - mock_virt_dev_sw = 0; - mock_tpm_version = 0x10001; - mock_rfs_retval = 0; - - rfs_clear_tpm_request = 0; - rfs_disable_dev_request = 0; -} - -/****************************************************************************/ -/* Mocked verification functions */ - -VbError_t VbExNvStorageRead(uint8_t *buf) -{ - Memcpy(buf, vnc.raw, sizeof(vnc.raw)); - return VBERROR_SUCCESS; -} - -VbError_t VbExNvStorageWrite(const uint8_t *buf) -{ - nv_write_called++; - Memcpy(vnc.raw, buf, sizeof(vnc.raw)); - return VBERROR_SUCCESS; -} - -uint32_t RollbackBackupRead(uint8_t *raw) -{ - backup_read_called++; - Memcpy(raw, backup_space, sizeof(backup_space)); - return TPM_SUCCESS; -} - -uint32_t RollbackBackupWrite(uint8_t *raw) -{ - backup_write_called++; - Memcpy(backup_space, raw, sizeof(backup_space)); - return TPM_SUCCESS; -} - -uint64_t VbExGetTimer(void) -{ - /* - * Exponential-ish rather than linear time, so that subtracting any - * two mock values will yield a unique result. - */ - uint64_t new_timer = mock_timer * 2 + 1; - VbAssert(new_timer > mock_timer); /* Make sure we don't overflow */ - mock_timer = new_timer; - return mock_timer; -} - -uint32_t RollbackS3Resume(void) -{ - return rollback_s3_retval; -} - -uint32_t RollbackFirmwareSetup(int is_hw_dev, - int disable_dev_request, - int clear_tpm_owner_request, - /* two outputs on success */ - int *is_virt_dev, uint32_t *version) -{ - rfs_clear_tpm_request = clear_tpm_owner_request; - rfs_disable_dev_request = disable_dev_request; - - *is_virt_dev = mock_virt_dev_sw; - *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, - uint8_t expected_recovery, const char *desc) -{ - uint32_t rr = 256; - - TEST_EQ(VbInit(&cparams, &iparams), expected_retval, desc); - VbNvGet(&vnc, VBNV_RECOVERY_REQUEST, &rr); - TEST_EQ(rr, expected_recovery, " (recovery request)"); -} - -/****************************************************************************/ - -static void VbInitTest(void) -{ - uint32_t u; - - /* Test passing in too small a shared data area */ - ResetMocks(); - cparams.shared_data_size = VB_SHARED_DATA_MIN_SIZE - 1; - TestVbInit(VBERROR_INIT_SHARED_DATA, 0, "Shared data too small"); - - /* Normal call; dev=0 rec=0 */ - ResetMocks(); - TestVbInit(0, 0, "Normal call"); - TEST_EQ(shared->timer_vb_init_enter, 21, " time enter"); - TEST_EQ(shared->timer_vb_init_exit, 43, " time exit"); - TEST_EQ(shared->flags, 0, " shared flags"); - TEST_EQ(iparams.out_flags, 0, " out flags"); - TEST_EQ(nv_write_called, 0, - " NV write not called since nothing changed"); - - /* If NV data is trashed, we initialize it */ - ResetMocks(); - VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123); - /* - * Note that we're not doing a VbNvTeardown(), so the CRC hasn't been - * regenerated yet. So VbInit() should ignore the corrupted recovery - * value and boot normally. - */ - TestVbInit(0, 0, "NV data trashed"); - TEST_EQ(nv_write_called, 1, " NV write called"); - - /* - * Test boot switch flags which are just passed through to shared - * flags, and don't have an effect on VbInit(). - */ - ResetMocks(); - iparams.flags = VB_INIT_FLAG_WP_ENABLED; - TestVbInit(0, 0, "Flags test WP"); - TEST_EQ(shared->flags, VBSD_BOOT_FIRMWARE_WP_ENABLED, - " shared flags"); - - ResetMocks(); - iparams.flags = VB_INIT_FLAG_SW_WP_ENABLED; - TestVbInit(0, 0, "Flags test SW WP"); - TEST_EQ(shared->flags, VBSD_BOOT_FIRMWARE_SW_WP_ENABLED, - " shared flags"); - - ResetMocks(); - iparams.flags = VB_INIT_FLAG_RO_NORMAL_SUPPORT; - TestVbInit(0, 0, " flags test RO normal"); - TEST_EQ(shared->flags, VBSD_BOOT_RO_NORMAL_SUPPORT, - " shared flags"); - - ResetMocks(); - iparams.flags = VB_INIT_FLAG_EC_SOFTWARE_SYNC; - TestVbInit(0, 0, " flags test EC software sync"); - TEST_EQ(shared->flags, VBSD_EC_SOFTWARE_SYNC, " shared flags"); - - ResetMocks(); - iparams.flags = VB_INIT_FLAG_EC_SLOW_UPDATE; - TestVbInit(0, 0, " flags test EC slow update"); - TEST_EQ(shared->flags, VBSD_EC_SLOW_UPDATE, " shared flags"); - - /* S3 resume */ - ResetMocks(); - iparams.flags = VB_INIT_FLAG_S3_RESUME; - VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123); - VbNvTeardown(&vnc); - /* S3 resume doesn't clear the recovery request (or act on it) */ - TestVbInit(0, 123, "S3 resume"); - TEST_EQ(shared->flags, VBSD_BOOT_S3_RESUME, " shared flags S3"); - TEST_EQ(iparams.out_flags, 0, " out flags"); - TEST_EQ(shared->recovery_reason, 0, - " S3 doesn't look at recovery request"); - - /* S3 resume with TPM resume error */ - ResetMocks(); - iparams.flags = VB_INIT_FLAG_S3_RESUME; - rollback_s3_retval = 1; - /* S3 resume doesn't clear the recovery request (or act on it) */ - TestVbInit(VBERROR_TPM_S3_RESUME, 0, "S3 resume rollback error"); - - /* - * Normal boot doesn't care about TPM resume error because it doesn't - * call RollbackS3Resume(). - */ - ResetMocks(); - rollback_s3_retval = 1; - TestVbInit(0, 0, "Normal doesn't S3 resume"); - - /* S3 resume with debug reset */ - ResetMocks(); - iparams.flags = VB_INIT_FLAG_S3_RESUME; - VbNvSet(&vnc, VBNV_DEBUG_RESET_MODE, 1); - VbNvTeardown(&vnc); - TestVbInit(0, 0, "S3 debug reset"); - TEST_EQ(iparams.out_flags, VB_INIT_OUT_S3_DEBUG_BOOT, " out flags"); - VbNvGet(&vnc, VBNV_DEBUG_RESET_MODE, &u); - TEST_EQ(u, 0, " S3 clears nv debug reset mode"); - - /* Normal boot clears S3 debug reset mode; doesn't set output flag */ - ResetMocks(); - VbNvSet(&vnc, VBNV_DEBUG_RESET_MODE, 1); - VbNvTeardown(&vnc); - TestVbInit(0, 0, "Normal with debug reset mode"); - TEST_EQ(iparams.out_flags, 0, " out flags"); - VbNvGet(&vnc, VBNV_DEBUG_RESET_MODE, &u); - TEST_EQ(u, 0, " normal clears nv debug reset mode"); - - /* - * S3 resume with debug reset is a normal boot, so doesn't resume the - * TPM. - */ - ResetMocks(); - iparams.flags = VB_INIT_FLAG_S3_RESUME; - rollback_s3_retval = 1; - VbNvSet(&vnc, VBNV_DEBUG_RESET_MODE, 1); - VbNvTeardown(&vnc); - TestVbInit(0, 0, "S3 debug reset rollback error"); - - /* Developer mode */ - ResetMocks(); - iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON; - TestVbInit(0, 0, "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_DEVELOPER | - VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags"); - TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, " shared flags"); - - /* Developer mode forced by GBB flag */ - ResetMocks(); - iparams.flags = 0; - gbb.flags = GBB_FLAG_FORCE_DEV_SWITCH_ON; - TestVbInit(0, 0, "Dev mode via GBB"); - 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_DEVELOPER | - VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags"); - TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, " shared flags"); - - /* Developer mode when option ROM matters and isn't loaded */ - ResetMocks(); - iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON | - VB_INIT_FLAG_OPROM_MATTERS; - TestVbInit(VBERROR_VGA_OPROM_MISMATCH, 0, "Dev mode need oprom"); - VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u); - TEST_EQ(u, 1, " oprom requested"); - - /* Developer mode when option ROM matters and is already loaded */ - ResetMocks(); - iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON | - VB_INIT_FLAG_OPROM_MATTERS | VB_INIT_FLAG_OPROM_LOADED; - TestVbInit(0, 0, "Dev mode has oprom"); - - /* Normal mode when option ROM matters and is loaded */ - ResetMocks(); - VbNvSet(&vnc, VBNV_OPROM_NEEDED, 1); - VbNvTeardown(&vnc); - iparams.flags = VB_INIT_FLAG_OPROM_MATTERS | VB_INIT_FLAG_OPROM_LOADED; - TestVbInit(VBERROR_VGA_OPROM_MISMATCH, 0, "Normal mode with oprom"); - VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u); - TEST_EQ(u, 0, " oprom not requested"); - - /* Option ROMs can be forced by GBB flag */ - ResetMocks(); - gbb.flags = GBB_FLAG_LOAD_OPTION_ROMS; - TestVbInit(0, 0, "GBB load option ROMs"); - TEST_EQ(iparams.out_flags, VB_INIT_OUT_ENABLE_OPROM, " out flags"); - - /* If requiring signed only, don't enable alternate OS by default */ - ResetMocks(); - VbNvSet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, 1); - VbNvTeardown(&vnc); - iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON; - TestVbInit(0, 0, "Dev signed only"); - 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_DEVELOPER, " out flags"); - - /* But that can be overridden by the GBB */ - ResetMocks(); - VbNvSet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, 1); - VbNvTeardown(&vnc); - iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON; - gbb.flags = GBB_FLAG_ENABLE_ALTERNATE_OS; - TestVbInit(0, 0, "Force option ROMs via GBB"); - 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_DEVELOPER | - VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags"); - - /* The GBB override is ignored in normal mode */ - ResetMocks(); - gbb.flags = GBB_FLAG_ENABLE_ALTERNATE_OS; - TestVbInit(0, 0, "Normal mode ignores forcing option ROMs via GBB"); - TEST_EQ(iparams.out_flags, 0, " out flags"); - - /* Recovery mode from NV storage */ - ResetMocks(); - VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123); - VbNvTeardown(&vnc); - TestVbInit(0, 0, "Recovery mode - from nv"); - TEST_EQ(shared->recovery_reason, 123, " recovery reason"); - TEST_EQ(iparams.out_flags, - VB_INIT_OUT_ENABLE_RECOVERY | - VB_INIT_OUT_CLEAR_RAM | - VB_INIT_OUT_ENABLE_DISPLAY | - VB_INIT_OUT_ENABLE_USB_STORAGE, " out flags"); - TEST_EQ(shared->flags, 0, " shared flags"); - - /* Recovery mode from recovery button */ - ResetMocks(); - iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED; - TestVbInit(0, 0, "Recovery mode - button"); - TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_MANUAL, - " recovery reason"); - TEST_EQ(iparams.out_flags, - VB_INIT_OUT_ENABLE_RECOVERY | - VB_INIT_OUT_CLEAR_RAM | - VB_INIT_OUT_ENABLE_DISPLAY | - VB_INIT_OUT_ENABLE_USB_STORAGE, " out flags"); - TEST_EQ(shared->flags, VBSD_BOOT_REC_SWITCH_ON, " shared flags"); - - /* Recovery button reason supersedes NV reason */ - ResetMocks(); - iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED; - VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123); - VbNvTeardown(&vnc); - TestVbInit(0, 0, "Recovery mode - button AND nv"); - TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_MANUAL, - " recovery reason"); - - /* Recovery mode from previous boot fail */ - ResetMocks(); - iparams.flags = VB_INIT_FLAG_PREVIOUS_BOOT_FAIL; - TestVbInit(0, 0, "Recovery mode - previous boot fail"); - TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_FIRMWARE, - " recovery reason"); - TEST_EQ(iparams.out_flags, - VB_INIT_OUT_ENABLE_RECOVERY | - VB_INIT_OUT_CLEAR_RAM | - VB_INIT_OUT_ENABLE_DISPLAY | - VB_INIT_OUT_ENABLE_USB_STORAGE, " out flags"); - TEST_EQ(shared->flags, 0, " shared flags"); - - /* Recovery mode from NV supersedes previous boot fail */ - ResetMocks(); - iparams.flags = VB_INIT_FLAG_PREVIOUS_BOOT_FAIL; - VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123); - VbNvTeardown(&vnc); - TestVbInit(0, 0, "Recovery mode - previous boot fail AND nv"); - TEST_EQ(shared->recovery_reason, 123, " recovery reason"); - - /* Dev + recovery = recovery */ - ResetMocks(); - iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED | - VB_INIT_FLAG_DEV_SWITCH_ON; - TestVbInit(0, 0, "Recovery mode - button"); - TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_MANUAL, - " recovery reason"); - TEST_EQ(iparams.out_flags, - VB_INIT_OUT_ENABLE_RECOVERY | - VB_INIT_OUT_CLEAR_RAM | - VB_INIT_OUT_ENABLE_DISPLAY | - VB_INIT_OUT_ENABLE_USB_STORAGE, " out flags"); - TEST_EQ(shared->flags, - VBSD_BOOT_REC_SWITCH_ON | VBSD_BOOT_DEV_SWITCH_ON, - " shared flags"); -} - -static void VbInitTestTPM(void) -{ - uint32_t u; - - /* 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_S_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(); - VbNvSet(&vnc, VBNV_DISABLE_DEV_REQUEST, 1); - VbNvTeardown(&vnc); - iparams.flags = 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, VBSD_HONOR_VIRT_DEV_SWITCH, " shared flags"); - VbNvGet(&vnc, VBNV_DISABLE_DEV_REQUEST, &u); - TEST_EQ(u, 0, " disable dev request"); - - /* Virtual developer switch, enabled. */ - ResetMocks(); - VbNvSet(&vnc, VBNV_DISABLE_DEV_REQUEST, 1); - VbNvTeardown(&vnc); - iparams.flags = VB_INIT_FLAG_VIRTUAL_DEV_SWITCH; - mock_virt_dev_sw = 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_DEVELOPER | - VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags"); - TEST_EQ(shared->flags, - VBSD_BOOT_DEV_SWITCH_ON | VBSD_HONOR_VIRT_DEV_SWITCH, - " shared flags"); - /* Disable-request doesn't get cleared because dev mode is still on */ - VbNvGet(&vnc, VBNV_DISABLE_DEV_REQUEST, &u); - TEST_EQ(u, 1, " disable dev request"); - /* Disable request was passed on to RollbackFirmwareSetup() */ - TEST_EQ(rfs_disable_dev_request, 1, " rfs disable dev"); - - /* Ignore virtual developer switch, even though enabled. */ - ResetMocks(); - mock_virt_dev_sw = 1; - TestVbInit(0, 0, "TPM Dev mode on but ignored"); - TEST_EQ(shared->recovery_reason, 0, " recovery reason"); - TEST_EQ(iparams.out_flags, 0, " out flags"); - TEST_EQ(shared->flags, 0, " shared flags"); - - /* HW dev switch on, no virtual developer switch */ - ResetMocks(); - iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON; - TestVbInit(0, 0, "HW 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_DEVELOPER | - VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags"); - TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, " shared flags"); - - /* Check TPM owner clear request */ - ResetMocks(); - VbNvSet(&vnc, VBNV_CLEAR_TPM_OWNER_REQUEST, 1); - VbNvTeardown(&vnc); - TestVbInit(0, 0, "TPM clear owner"); - VbNvGet(&vnc, VBNV_CLEAR_TPM_OWNER_REQUEST, &u); - TEST_EQ(u, 0, " tpm clear request"); - VbNvGet(&vnc, VBNV_CLEAR_TPM_OWNER_DONE, &u); - TEST_EQ(u, 1, " tpm clear request"); - TEST_EQ(rfs_clear_tpm_request, 1, "rfs tpm clear request"); -} - -static void VbInitTestBackup(void) -{ - VbNvContext tmp_vnc; - uint32_t u, nv_w, bu_r; - - ResetMocks(); - /* Normal mode call */ - TestVbInit(0, 0, "normal mode, no backup"); - TEST_EQ(shared->flags, 0, " shared flags"); - TEST_EQ(iparams.out_flags, 0, " out flags"); - TEST_EQ(nv_write_called, 0, - " NV write not called since nothing changed"); - - ResetMocks(); - /* Now set some params that should be backed up. */ - VbNvSet(&vnc, VBNV_KERNEL_FIELD, 0xaabbccdd); - VbNvSet(&vnc, VBNV_LOCALIZATION_INDEX, 0xa5); - VbNvSet(&vnc, VBNV_DEV_BOOT_USB, 1); - VbNvSet(&vnc, VBNV_DEV_BOOT_LEGACY, 1); - VbNvSet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, 1); - VbNvSet(&vnc, VBNV_DEV_BOOT_FASTBOOT_FULL_CAP, 1); - VbNvSet(&vnc, VBNV_DEV_DEFAULT_BOOT, 1); - VbNvSet(&vnc, VBNV_FASTBOOT_UNLOCK_IN_FW, 1); - /* and some that don't */ - VbNvSet(&vnc, VBNV_OPROM_NEEDED, 1); - VbNvSet(&vnc, VBNV_TRY_B_COUNT, 3); - /* Make sure they're clean */ - VbNvTeardown(&vnc); - /* Normal mode call */ - TestVbInit(0, 0, "normal mode, some backup"); - TEST_EQ(shared->flags, 0, " shared flags"); - TEST_EQ(iparams.out_flags, 0, " out flags"); - TEST_EQ(nv_write_called, 1, - " Write NV because things have changed"); - /* Some fields should be unchanged */ - VbNvGet(&vnc, VBNV_KERNEL_FIELD, &u); - TEST_EQ(u, 0xaabbccdd, " NV kernel field"); - VbNvGet(&vnc, VBNV_LOCALIZATION_INDEX, &u); - TEST_EQ(u, 0xa5, " NV localization index"); - VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u); - TEST_EQ(u, 1, " NV oprom_needed"); - VbNvGet(&vnc, VBNV_TRY_B_COUNT, &u); - TEST_EQ(u, 3, " NV try_b_count"); - /* But normal mode should have cleared the DEV_BOOT flags */ - VbNvGet(&vnc, VBNV_DEV_BOOT_USB, &u); - TEST_EQ(u, 0, " NV dev_boot_usb"); - VbNvGet(&vnc, VBNV_DEV_BOOT_LEGACY, &u); - TEST_EQ(u, 0, " NV dev_boot_legacy"); - VbNvGet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, &u); - TEST_EQ(u, 0, " NV dev_boot_signed_only"); - VbNvGet(&vnc, VBNV_DEV_BOOT_FASTBOOT_FULL_CAP, &u); - TEST_EQ(u, 0, " NV dev_boot_fastboot_full_cap"); - VbNvGet(&vnc, VBNV_DEV_DEFAULT_BOOT, &u); - TEST_EQ(u, 0, " NV dev_default_boot"); - VbNvGet(&vnc, VBNV_FASTBOOT_UNLOCK_IN_FW, &u); - TEST_EQ(u, 0, " NV_fastboot_unlock_in_fw "); - /* So we should have written the backup */ - TEST_EQ(backup_write_called, 1, " Backup written once"); - /* And the backup should reflect the persisent flags. */ - Memset(&tmp_vnc, 0, sizeof(tmp_vnc)); - TEST_EQ(0, RestoreNvFromBackup(&tmp_vnc), "read from backup"); - VbNvGet(&tmp_vnc, VBNV_KERNEL_FIELD, &u); - TEST_EQ(u, 0xaabbccdd, " BU kernel field"); - VbNvGet(&tmp_vnc, VBNV_LOCALIZATION_INDEX, &u); - TEST_EQ(u, 0xa5, " BU localization index"); - VbNvGet(&tmp_vnc, VBNV_DEV_BOOT_USB, &u); - TEST_EQ(u, 0, " BU dev_boot_usb"); - VbNvGet(&tmp_vnc, VBNV_DEV_BOOT_LEGACY, &u); - TEST_EQ(u, 0, " BU dev_boot_legacy"); - VbNvGet(&tmp_vnc, VBNV_DEV_BOOT_SIGNED_ONLY, &u); - TEST_EQ(u, 0, " BU dev_boot_signed_only"); - VbNvGet(&tmp_vnc, VBNV_DEV_BOOT_FASTBOOT_FULL_CAP, &u); - TEST_EQ(u, 0, " BU dev_boot_fastboot_full_cap"); - VbNvGet(&tmp_vnc, VBNV_DEV_DEFAULT_BOOT, &u); - TEST_EQ(u, 0, " BU dev_default_boot"); - VbNvGet(&tmp_vnc, VBNV_FASTBOOT_UNLOCK_IN_FW, &u); - TEST_EQ(u, 0, " BU fastboot_unlock_in_fw"); - /* but not the others */ - VbNvGet(&tmp_vnc, VBNV_OPROM_NEEDED, &u); - TEST_EQ(u, 0, " BU oprom_needed"); - VbNvGet(&tmp_vnc, VBNV_TRY_B_COUNT, &u); - TEST_EQ(u, 0, " BU try_b_count"); - - /* - * If we change one of the non-backed-up NVRAM params and try - * again, we shouldn't need to backup again. - */ - VbNvSet(&vnc, VBNV_OPROM_NEEDED, 0); - VbNvSet(&vnc, VBNV_TRY_B_COUNT, 2); - /* Make sure they're clean */ - VbNvTeardown(&vnc); - /* Normal mode call */ - TestVbInit(0, 0, "normal mode, expect no backup"); - TEST_EQ(shared->flags, 0, " shared flags"); - TEST_EQ(iparams.out_flags, 0, " out flags"); - TEST_EQ(backup_write_called, 1, " Backup still only written once"); - - /* Now switch to dev-mode. */ - iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON; - TestVbInit(0, 0, "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_DEVELOPER | - VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags"); - TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, " shared flags"); - TEST_EQ(backup_write_called, 1, " Still only one backup"); - - /* Now change some params that should be backed up. */ - VbNvSet(&vnc, VBNV_KERNEL_FIELD, 0xdeadbeef); - VbNvSet(&vnc, VBNV_LOCALIZATION_INDEX, 0x5a); - VbNvSet(&vnc, VBNV_DEV_BOOT_USB, 1); - VbNvSet(&vnc, VBNV_DEV_BOOT_LEGACY, 1); - VbNvSet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, 1); - VbNvSet(&vnc, VBNV_DEV_BOOT_FASTBOOT_FULL_CAP, 1); - VbNvSet(&vnc, VBNV_DEV_DEFAULT_BOOT, 1); - VbNvSet(&vnc, VBNV_FASTBOOT_UNLOCK_IN_FW, 1); - /* and some that don't */ - VbNvSet(&vnc, VBNV_OPROM_NEEDED, 1); - VbNvSet(&vnc, VBNV_TRY_B_COUNT, 4); - /* Make sure they're clean */ - VbNvTeardown(&vnc); - TestVbInit(0, 0, "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_DEVELOPER, " out flags"); - TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, " shared flags"); - TEST_EQ(backup_write_called, 1, " Once more, one backup"); - - /* But if we explicitly request a backup, they'll get saved. */ - VbNvSet(&vnc, VBNV_BACKUP_NVRAM_REQUEST, 1); - VbNvTeardown(&vnc); - TestVbInit(0, 0, "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_DEVELOPER, " out flags"); - TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, " shared flags"); - TEST_EQ(backup_write_called, 2, " Two backups now"); - VbNvGet(&vnc, VBNV_BACKUP_NVRAM_REQUEST, &u); - TEST_EQ(u, 0, " backup_request cleared"); - /* Quick check that the non-backed-up stuff is still valid */ - VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u); - TEST_EQ(u, 1, " NV oprom_needed"); - VbNvGet(&vnc, VBNV_TRY_B_COUNT, &u); - TEST_EQ(u, 4, " NV try_b_count"); - /* But only the stuff we care about was backed up */ - Memset(&tmp_vnc, 0, sizeof(tmp_vnc)); - TEST_EQ(0, RestoreNvFromBackup(&tmp_vnc), "read from backup"); - VbNvGet(&tmp_vnc, VBNV_KERNEL_FIELD, &u); - TEST_EQ(u, 0xdeadbeef, " BU kernel field"); - VbNvGet(&tmp_vnc, VBNV_LOCALIZATION_INDEX, &u); - TEST_EQ(u, 0x5a, " BU localization index"); - VbNvGet(&tmp_vnc, VBNV_DEV_BOOT_USB, &u); - TEST_EQ(u, 1, " BU dev_boot_usb"); - VbNvGet(&tmp_vnc, VBNV_DEV_BOOT_LEGACY, &u); - TEST_EQ(u, 1, " BU dev_boot_legacy"); - VbNvGet(&tmp_vnc, VBNV_DEV_BOOT_SIGNED_ONLY, &u); - TEST_EQ(u, 1, " BU dev_boot_signed_only"); - VbNvGet(&tmp_vnc, VBNV_DEV_BOOT_FASTBOOT_FULL_CAP, &u); - TEST_EQ(u, 1, " BU dev_boot_fastboot_full_cap"); - VbNvGet(&tmp_vnc, VBNV_DEV_DEFAULT_BOOT, &u); - TEST_EQ(u, 1, " BU dev_default_boot"); - VbNvGet(&tmp_vnc, VBNV_FASTBOOT_UNLOCK_IN_FW, &u); - TEST_EQ(u, 1, " BU fastboot_unlock_in_fw"); - /* but not the others */ - VbNvGet(&tmp_vnc, VBNV_OPROM_NEEDED, &u); - TEST_EQ(u, 0, " BU oprom_needed"); - VbNvGet(&tmp_vnc, VBNV_TRY_B_COUNT, &u); - TEST_EQ(u, 0, " BU try_b_count"); - - /* If we lose the NV storage, the backup bits will be restored */ - vnc.raw[0] = 0; - bu_r = backup_read_called; - nv_w = nv_write_called; - TestVbInit(0, 0, "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_DEVELOPER, " out flags"); - TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, " shared flags"); - TEST_EQ(backup_write_called, 2, " Still just two backups now"); - TEST_EQ(backup_read_called, bu_r + 1, " One more backup read"); - TEST_EQ(nv_write_called, nv_w + 1, " One more NV write"); - /* The non-backed-up stuff is reset to defaults */ - VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u); - TEST_EQ(u, 0, " NV oprom_needed"); - VbNvGet(&vnc, VBNV_TRY_B_COUNT, &u); - TEST_EQ(u, 0, " NV try_b_count"); - /* And the backed up stuff is restored */ - VbNvGet(&vnc, VBNV_KERNEL_FIELD, &u); - TEST_EQ(u, 0xdeadbeef, " BU kernel field"); - VbNvGet(&vnc, VBNV_LOCALIZATION_INDEX, &u); - TEST_EQ(u, 0x5a, " BU localization index"); - VbNvGet(&vnc, VBNV_DEV_BOOT_USB, &u); - TEST_EQ(u, 1, " BU dev_boot_usb"); - VbNvGet(&vnc, VBNV_DEV_BOOT_LEGACY, &u); - TEST_EQ(u, 1, " BU dev_boot_legacy"); - VbNvGet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, &u); - TEST_EQ(u, 1, " BU dev_boot_signed_only"); - VbNvGet(&vnc, VBNV_DEV_BOOT_FASTBOOT_FULL_CAP, &u); - TEST_EQ(u, 1, " BU dev_boot_fastboot_full_cap"); - VbNvGet(&tmp_vnc, VBNV_DEV_DEFAULT_BOOT, &u); - TEST_EQ(u, 1, " BU dev_default_boot"); - VbNvGet(&vnc, VBNV_FASTBOOT_UNLOCK_IN_FW, &u); - TEST_EQ(u, 1, " BU fastboot_unlock_in_fw"); - - /* - * But if we lose the NV storage and go back to normal mode at the same - * time, then the DEV_BOOT_* flags will be cleared. - */ - vnc.raw[0] = 0; - bu_r = backup_read_called; - nv_w = nv_write_called; - iparams.flags = 0; - TestVbInit(0, 0, "Back to normal mode"); - TEST_EQ(shared->recovery_reason, 0, " recovery reason"); - TEST_EQ(iparams.out_flags, 0, " out flags"); - TEST_EQ(shared->flags, 0, " shared flags"); - /* We read twice: once to restore, once for read-prior-to-write */ - TEST_EQ(backup_read_called, bu_r + 2, " Two more backup reads"); - TEST_EQ(backup_write_called, 3, " Backup write due clearing DEV_*"); - TEST_EQ(nv_write_called, nv_w + 1, " One more NV write"); - /* The non-backed-up stuff is reset to defaults */ - VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u); - TEST_EQ(u, 0, " NV oprom_needed"); - VbNvGet(&vnc, VBNV_TRY_B_COUNT, &u); - TEST_EQ(u, 0, " NV try_b_count"); - /* And the backed up stuff is restored */ - VbNvGet(&vnc, VBNV_KERNEL_FIELD, &u); - TEST_EQ(u, 0xdeadbeef, " BU kernel field"); - VbNvGet(&vnc, VBNV_LOCALIZATION_INDEX, &u); - TEST_EQ(u, 0x5a, " BU localization index"); - /* But not the DEV_BOOT_* flags */ - VbNvGet(&vnc, VBNV_DEV_BOOT_USB, &u); - TEST_EQ(u, 0, " BU dev_boot_usb"); - VbNvGet(&vnc, VBNV_DEV_BOOT_LEGACY, &u); - TEST_EQ(u, 0, " BU dev_boot_legacy"); - VbNvGet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, &u); - TEST_EQ(u, 0, " BU dev_boot_signed_only"); - VbNvGet(&vnc, VBNV_DEV_BOOT_FASTBOOT_FULL_CAP, &u); - TEST_EQ(u, 0, " BU dev_boot_fastboot_full_cap"); - VbNvGet(&vnc, VBNV_DEV_DEFAULT_BOOT, &u); - TEST_EQ(u, 0, " BU dev_default_boot"); - VbNvGet(&vnc, VBNV_FASTBOOT_UNLOCK_IN_FW, &u); - TEST_EQ(u, 0, " BU fastboot_unlock_in_fw"); -} - - -int main(int argc, char *argv[]) -{ - VbInitTest(); - VbInitTestTPM(); - VbInitTestBackup(); - - return gTestSuccess ? 0 : 255; -} |