blob: c69735dc50f121429e53ec489865e21ba05f8716 [file] [log] [blame] [edit]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
{
name: "keymgr"
import_testplans: ["hw/dv/tools/dvsim/testplans/csr_testplan.hjson",
"hw/dv/tools/dvsim/testplans/intr_test_testplan.hjson",
"hw/dv/tools/dvsim/testplans/alert_test_testplan.hjson",
"hw/dv/tools/dvsim/testplans/tl_device_access_types_testplan.hjson",
"hw/dv/tools/dvsim/testplans/shadow_reg_errors_testplan.hjson",
"hw/dv/tools/dvsim/testplans/sec_cm_count_testplan.hjson",
"hw/dv/tools/dvsim/testplans/sec_cm_fsm_testplan.hjson",
"hw/dv/tools/dvsim/testplans/stress_all_with_reset_testplan.hjson",
"keymgr_sec_cm_testplan.hjson"]
testpoints: [
{
name: smoke
desc: '''
Smoke test accessing a major datapath within the keymgr.
Test operations (advance, gen-id and gen-sw-out) in every state
Stimulus:
- Go through state from `StReset` to `StDisabled`.
- Issue gen-id, gen-sw-output operation in each state, including invalid operations in
states other than normal operating states (`StCreatorRootKey`, `StOwnerIntKey` and
`StOwnerRootKey`).
- Randomize `CDI_SEL` and `DEST_SEL`.
- Use default/fixed values for HW/SW inputs.
Checks:
- Check STATUS reg for each operation.
- Check interrupts `op_done` is triggered when operation is done.
- Check `err` and alert `recov_operation_err` are triggered after invalid operation.
- Check KMAC key, KMAC data and output SW data for correctness.
- For invalid operations, check KMAC key, KMAC data and output SW data don't match to
any of saved meaningful data, which are collected from valid operations. This
checking method is also applied to other error cases.
'''
stage: V1
tests: ["keymgr_smoke"]
}
{
name: random
desc: '''
Extend from smoke to randomize all SW input data
- Fully randomize SW inputs: rom_ext_desc_*, software_binding_*, salt_*, max_*_key_ver,
*_key_ver_regwen.
- Randomize key_version any value less than max_*_key_ver, to avoid triggerring
`invalid_kmac_input` error.
- Fully randomize HW inputs from flash, otp and life cycle.
- Randomize *sw_binding_regwen. Ensure this gates the *_sw_binding and it will
be cleared after a successful advance operation.
Most of other sequences are derived from this to have similar init and sequence.
Stimulus and checks are the same as smoke.
'''
stage: V1
tests: ["keymgr_random"]
}
{
name: cfgen_during_op
desc: '''
`cfg_regwen` is RO reg and it gates bunch of write access of other registers, which is
not tested in common CSR tests.
Stimulus and checks:
Test command and reg access gated by `cfg_regwen` is ignored during operation.
'''
stage: V2
tests: ["keymgr_cfg_regwen"]
}
{
name: sideload
desc: '''
Keymgr contains HW sideload interfaces to output keys for KMAC, AES, OTBN.
Stimulus:
- Generate a keymgr output to HW sideload interface, exercising all the sideload
interfaces.
- Randomly program any value to Sideload_clear after any operation.
Checks:
Verify the sideload data and status for correctness.
'''
stage: V2
tests: ["keymgr_sideload", "keymgr_sideload_kmac",
"keymgr_sideload_aes", "keymgr_sideload_otbn"]
}
{
name: direct_to_disabled_state
desc: '''
Stimulus and checks:
Directly go to `StDisabled` from any state and check `StDisabled` is entered correctly.
'''
stage: V2
tests: ["keymgr_direct_to_disabled"]
}
{
name: lc_disable
desc: '''
Life cycle can disable keymgr and let keymgr wipe secret immediately.
Stimulus:
Test life cycle disables keymgr in any state.
Checks:
- If keymgr is not initialized, check it can't be initialized until life cycle enables
keymgr.
- If keymgr is in a valid state after `StReset`, key output to KMAC is wiped immediately
and SW output will be invalid after OP is done.
- If keymgr in disabled state, check the behavior is consistent with normal behavior.
'''
stage: V2
tests: ["keymgr_lc_disable"]
}
{
name: kmac_error_response
desc: '''
Verify `keymgr` behavior on error response received from `KMAC` after sending data to
it.
Stimulus:
- Drive error from KMAC interface when VALID is high.
- Or drive all 0s or 1s as KMAC input digest data
Checks:
Same as above entry - "invalid_cmd".
'''
stage: V2
tests: ["keymgr_kmac_rsp_err"]
}
{
name: invalid_sw_input
desc: '''
Verify `keymgr` behavior with invalid key version.
Stimulus:
Randomize KEY_VERSION and MAX_*_VER registers.
Checks:
when KEY_VERSION > MAX_*_VER
- Check interrupts `err` is triggered.
- Check alert `recov_operation_err` is triggered and err_code is `INVALID_KMAC_INPUT`.
- Check KMAC output key is corrupted and working state remains the same.
'''
stage: V2
tests: ["keymgr_sw_invalid_input"]
}
{
name: invalid_hw_input
desc: '''
Verify `keymgr` behavior with invalid data patterns.
Stimulus:
- Drive all 0s or 1s on any of these inputs - flash seeds, otp_key, diversification ID,
Rom digest etc.
- Make sure all cases are covered in `csr_debug_cg`.
Checks:
- Check interrupts `err` is triggered.
- Check alert `recov_operation_err` is triggered and err_code is `INVALID_KMAC_DATA`.
- Check SW output isn't updated and working state remains the same.
'''
stage: V2
tests: ["keymgr_hwsw_invalid_input"]
}
{
name: sync_async_fault_cross
desc: '''
Verify `keymgr` behavior with invalid data patterns.
Stimulus:
Create these 2 direct tests:
- Sync (transactional) fault occurs followed by async (non-transactional) fault.
- Async (non-transactional) fault occurs followed by sync (transactional) fault.
Checks:
- Check interrupts `err` is triggered.
- Check alert `fatal_fault_err` is triggered.
- Check `fault_status` is updated correctly.
'''
stage: V2
tests: ["keymgr_sync_async_fault_cross"]
}
{
name: stress_all
desc: '''
- Combine above sequences in one test to run sequentially, except csr sequence and
keymgr_cfg_regwen (requires zero_delays).
- Randomly add reset between each sequence.
'''
stage: V2
tests: ["keymgr_stress_all"]
}
{
name: sec_cm_additional_check
desc: '''
Verify the outcome of injecting faults to security countermeasures.
Stimulus:
As mentioned in `prim_count_check`, `prim_one_hot_check` and `prim_fsm_check`.
Checks:
- Besides checking alert and `fault_status`, issue an operation after injecting faults,
then ensure that `op_status` is failed and design enters `StInvalid`.
'''
stage: V2S
tests: ["keymgr_sec_cm"]
}
]
covergroups: [
{
name: state_and_op_cg
desc: '''
- Cover all operations with `cdi_sel`, `dest_sel` and `op_status` (only fail or success)
at any of all working_states.
- This is sampled once an operation is done.'''
}
{
name: lc_disable_cg
desc: '''
- Cover LC disable occurs at any of all the states or during any of all the
operations.
- This is sampled once LC disables keymgr.'''
}
{
name: sideload_clear_cg
desc: '''
- Cover all the `sideload_clear` values are used after any of all the operations and in
any of all the states.
- Cover `sideload_clear` with any combination of availability of 3 sideload interfaces.
- This is sampled once sideload_clear is programmed after an operation.'''
}
{
name: reseed_interval_cg
desc: '''
- Cover small values of reseed_interval are used, so that TB can actually check EDN
request is sent in the right interval.
- Also Cover some large values to ensure all bits are toggled.'''
}
{
name: keymgr_sw_input_cg
desc: '''
- Cover all bits of SW inputs are toggled.
- SW input includes these CSRS: `*_sw_binding`, `salt`, `key_version`, `max_*_key_ver*`.
- Cross with the corresponding regwen.'''
}
{
name: err_code_cg
desc: '''
- Cover `err_codes` values except `invalid_shadow_update` as that is tested in a common
direct test.
- This is sampled when `err_codes` is read.'''
}
{
name: hw_invalid_input_cg
desc: '''
Cover all HW invalid inputs, including
- all ones/zeros on OTP root key.
- OTP root key valid is low.
- all ones/zeros on LC keymgr health state.
- all ones/zeros on ROM degist.
- ROM degist valid is low.
- all ones/zeros on flash creator seeds.
- all ones/zeros on flash owner seeds.'''
}
{
name: key_version_compare_cg
desc: '''
- Cover comparison results (equal, less, greater) of key_version and current max value.
- Cross with state and operation (gen-sw-out or gen-hw-out).'''
}
{
name: fault_status_cg
desc: '''
- Cover `fault_status` values except `REGFILE_INTG` and `SHADOW` as they are tested in
a common direct test.
- This is sampled when `fault_status` is read.'''
}
{
name: sync_async_fault_cross_cg
desc: '''
- Cover sync and async fault cross with each other, including 2 cases - sync fault
occurs first and async fault occurs first.
- This is sampled after `fault_status` is read in the sequence.'''
}
]
}