| // 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.''' |
| } |
| ] |
| } |