[test] Add boot_policy e2e tests to rom test plan
Signed-off-by: Alphan Ulusoy <alphan@google.com>
diff --git a/sw/device/silicon_creator/rom/data/rom_testplan.hjson b/sw/device/silicon_creator/rom/data/rom_testplan.hjson
index 1b3b956..82379e0 100644
--- a/sw/device/silicon_creator/rom/data/rom_testplan.hjson
+++ b/sw/device/silicon_creator/rom/data/rom_testplan.hjson
@@ -484,54 +484,139 @@
tests: []
}
- // Functests
{
- name: rom_functests
- desc: '''Run functests developed for ROM.
+ name: rom_e2e_boot_policy_no_rom_ext
+ desc: '''Verify that ROM triggers shutdown when there is no valid ROM_EXT.
- Functests test ROM components (e.g., drivers, libraries, etc.)
- work as intended on-chip. However, unlike when these components are
- embedded in the ROM, functests are linked with the OTTF, and
- run out of flash. Additionally, unlike the ROM E2E tests,
- functests are booted by the test ROM.
- '''
- tags: ["verilator", "dv", "fpga", "silicon"]
- milestone: V2
- tests: ["rom_keymgr_functest"]
- }
-
- // Bootup without ROM_EXT
- {
- name: rom_e2e_bootup_no_rom_ext
- desc: '''Verify device fails to boot with no ROM_EXT.
-
- - Test runner loads the ROM and no ROM_EXT.
- - Attempt to boot.
- - Verify that the chip indicates the correct boot fault.
+ - Reset the chip.
+ - Verify that the chip outputs the expected `BFV`: `0142500d ` over UART.
+ - ROM will continously reset the chip and output the same `BFV` and `LCV`.
+ - Repeat for all life cycle states: TEST, DEV, PROD, PROD_END, and RMA.
'''
tags: ["rom", "verilator", "dv", "fpga", "silicon"]
milestone: V2
tests: []
}
- // Bootup with ROM_EXT
- {
- name: rom_e2e_bootup_success
- desc: '''Verify device boots with a good ROM_EXT.
- - Generate a ROM_EXT with a sufficiently high version number.
- - Sign the ROM_EXT with a valid key.
- - Test runner loads the ROM and prepared ROM_EXT.
- - Attempt to boot.
- - Verify that the chip successfully boots into the ROM_EXT.
+ {
+ name: rom_e2e_boot_policy_newer
+ desc: '''Verify that ROM chooses the slot with the greater security version.
+
+ - Apply bootstrap pin strapping and reset the chip.
+ - Write the ROM_EXT images to the chip.
+ - Verify that ROM chooses the slot with the greater security version.
+ - Repeat for all life cycle states: TEST, DEV, PROD, PROD_END, and RMA.
+
+ | Slot a security version | Slot b security version | Chosen |
+ |:-----------------------:|:-----------------------:|:------:|
+ | 0 | 0 | a |
+ | 0 | 1 | b |
+ | 1 | 0 | a |
+ | 1 | 1 | a |
'''
tags: ["rom", "verilator", "dv", "fpga", "silicon"]
milestone: V2
- tests: ["rom_e2e_bootup_success"]
+ tests: []
}
+
+ {
+ name: rom_e2e_boot_policy_bad_manifest
+ desc: '''Verify that ROM performs some basic checks on manifest fields.
+
+ `CREATOR_SW_CFG_MIN_SEC_VER_ROM_EXT` OTP item should be 1, and
+ `CREATOR_SW_CFG_DEFAULT_BOOT_DATA_IN_PROD` should be `kHardenedBoolTrue` for PROD and
+ PROD_END for the sake of simplicity.
+
+
+ - Write the image to the chip. See the table below.
+ - The other slot remains empty.
+ - Verify that the chip outputs the expected `BFV` over UART.
+ - Repeat for all life cycle states: TEST, DEV, PROD, PROD_END, and RMA.
+
+ | Slot | Case | `BFV` |
+ |:----:|:---------------------------------:|:-------------------------------:|
+ | b | `identitfier = 0` | `kErrorBootPolicyBadIdentifier` |
+ | b | `length < CHIP_ROM_EXT_SIZE_MIN` | `kErrorBootPolicyBadLength` |
+ | b | `length > CHIP_ROM_EXT_SIZE_MIN` | `kErrorBootPolicyBadLength` |
+ | b | `code_start = code_end` | `kErrorManifestBadCodeRegion` |
+ | b | `code_start < CHIP_MANIFEST_SIZE` | `kErrorManifestBadCodeRegion` |
+ | b | `code_end > length` | `kErrorManifestBadCodeRegion` |
+ | b | `code_start` in range, unaligned | `kErrorManifestBadCodeRegion` |
+ | b | `code_end` in range, unaligned | `kErrorManifestBadCodeRegion` |
+ | b | `entry_point < code_start` | `kErrorManifestBadCodeRegion` |
+ | b | `entry_point >= code_end` | `kErrorManifestBadCodeRegion` |
+ | b | `entry_point` in range, unaligned | `kErrorManifestBadCodeRegion` |
+ | b | `security_version = 0` | `kErrorBootPolicyRollback` |
+ | a | `identitfier = 0` | `0142500d` |
+ | a | `length < CHIP_ROM_EXT_SIZE_MIN` | `0142500d` |
+ | a | `length > CHIP_ROM_EXT_SIZE_MIN` | `0142500d` |
+ | a | `code_start = code_end` | `0142500d` |
+ | a | `code_start < CHIP_MANIFEST_SIZE` | `0142500d` |
+ | a | `code_end > length` | `0142500d` |
+ | a | `code_start` in range, unaligned | `0142500d` |
+ | a | `code_end` in range, unaligned | `0142500d` |
+ | a | `entry_point < code_start` | `0142500d` |
+ | a | `entry_point >= code_end` | `0142500d` |
+ | a | `entry_point` in range, unaligned | `0142500d` |
+ | a | `security_version = 0` | `0142500d` |
+ '''
+ tags: ["rom", "verilator", "dv", "fpga", "silicon"]
+ milestone: V2
+ tests: []
+ }
+
+ {
+ name: rom_e2e_boot_policy_valid
+ desc: '''Verify that ROM chooses the slot with the valid signature.
+
+ - Apply bootstrap pin strapping and reset the chip.
+ - Write the ROM_EXT images to the chip -- same security_version.
+ - Verify that ROM chooses the slot with the valid signature, otherwise triggers a
+ shutdown.
+ - Repeat for all life cycle states: TEST, DEV, PROD, PROD_END, and RMA.
+
+ | Slot a | Slot b | Chosen |
+ |:------:|:------:|:------:|
+ | Bad | Bad | None |
+ | Bad | Good | b |
+ | Good | Bad | a |
+ | Good | Good | a |
+ '''
+ tags: ["rom", "verilator", "dv", "fpga", "silicon"]
+ milestone: V2
+ tests: []
+ }
+
+ {
+ name: rom_e2e_boot_policy_rollback
+ desc: '''Verify that ROM rejects rollbacks.
+
+ `CREATOR_SW_CFG_MIN_SEC_VER_ROM_EXT` OTP item should be 1, and
+ `CREATOR_SW_CFG_DEFAULT_BOOT_DATA_IN_PROD` should be `kHardenedBoolTrue` for PROD and
+ PROD_END for the sake of simplicity.
+
+ - Apply bootstrap pin strapping and reset the chip.
+ - Write the ROM_EXT images to the chip -- valid signatures.
+ - Verify that ROM chooses the slot with acceptable & newer seurity version, otherwise
+ triggers a shutdown.
+ - Repeat for all life cycle states: TEST, DEV, PROD, PROD_END, and RMA.
+
+ | Slot a | Slot b | Chosen |
+ |:------:|:------:|:------:|
+ | 0 | 0 | None |
+ | 0 | 1 | b |
+ | 2 | 0 | a |
+ | 1 | 1 | a |
+ '''
+ tags: ["rom", "verilator", "dv", "fpga", "silicon"]
+ milestone: V2
+ tests: []
+ }
+
// TODO(lowrisc/opentitan#10929): test both A/B partitions
// TODO(lowrisc/opentitan#10930): consider testing with both SW and OTBN sigverify
{
- name: rom_e2e_bootup_bad_rom_ext_signature
+ name: rom_e2e_boot_policy_bad_rom_ext_signature
desc: '''Verify device fails to boot with an improperly-signed ROM_EXT.
- Generate a ROM_EXT with a sufficiently high version number.
@@ -545,8 +630,9 @@
milestone: V2
tests: []
}
+
{
- name: rom_e2e_bootup_bad_manifest_usage_constraint
+ name: rom_e2e_boot_policy_bad_manifest_usage_constraint
desc: '''Verify device fails to boot with an invalid manifest usage constraints.
- Generate an otherwise valid ROM_EXT with invalid manifest usage constraints.
@@ -559,8 +645,9 @@
milestone: V2
tests: []
}
+
{
- name: rom_e2e_bootup_rom_ext_invalidated_key
+ name: rom_e2e_boot_policy_rom_ext_invalidated_key
desc: '''Verify device fails to boot with a ROM_EXT signed with an invalidated key.
- Generate a ROM_EXT with a sufficiently high version number.
@@ -573,18 +660,6 @@
milestone: V2
tests: []
}
- {
- name: rom_e2e_bootup_bad_rom_ext_version
- desc: '''Verify device fails to boot with a bad minimum version.
-
- - Test runner loads the ROM and a properly-signed ROM_EXT with a version number that is below the minimum version.
- - Attempt to boot.
- - Verify that the chip indicates the correct boot fault.
- '''
- tags: ["rom", "verilator", "dv", "fpga", "silicon"]
- milestone: V2
- tests: []
- }
// Chip-specific startup