| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| { |
| name: "aes" |
| import_testplans: ["hw/dv/tools/dvsim/testplans/csr_testplan.hjson", |
| "hw/dv/tools/dvsim/testplans/shadow_reg_errors_testplan.hjson", |
| "hw/dv/tools/dvsim/testplans/alert_test_testplan.hjson", |
| "hw/dv/tools/dvsim/testplans/tl_device_access_types_testplan.hjson", |
| "aes_sec_cm_testplan.hjson"] |
| testpoints: [ |
| // { |
| // name: default_setting |
| // desc: ''' |
| // ''' |
| // stage: V1 |
| // tests: [] |
| // } |
| { |
| name: wake_up |
| desc: ''' |
| Basic hello world, encrypt a plain text read it back - decrypt and compare to input.''' |
| stage: V1 |
| tests: ["aes_wake_up"] |
| } |
| { |
| name: smoke |
| desc: ''' |
| Encrypt a plain text read it back - decrypt and compare to input but use reference model to compare after both encryption and decryption.''' |
| stage: V1 |
| tests: ["aes_smoke"] |
| } |
| { |
| name: algorithm |
| desc: ''' |
| Compare cypher text from DUT with the output of a C model using same key and data.''' |
| stage: V2 |
| tests: ["aes_smoke", "aes_stress", "aes_config_error"] |
| } |
| { |
| name: key_length |
| desc: ''' |
| Randomly select key length to verify all supported key lengths are working.''' |
| stage: V2 |
| tests: ["aes_stress", "aes_smoke", "aes_config_error"] |
| } |
| { |
| name: back2back |
| desc: ''' |
| Back to back Messages are not possible as the DUT need to be idle before writing a new configuration. |
| But Back2back verifies that DUT can handle back to back data blocks and other spacings.''' |
| stage: V2 |
| tests: ["aes_b2b", "aes_stress"] |
| } |
| { |
| name: backpressure |
| desc: ''' |
| Try to write data to registers without offloading the DUT output to verify Stall functionality.''' |
| stage: V2 |
| tests: ["aes_stress"] |
| } |
| { |
| name: multi_message |
| desc: ''' |
| Run multiple messages in a random mix of encryption / decryption. |
| Each message should select its mode randomly.''' |
| stage: V2 |
| tests: ["aes_stress", "aes_smoke", "aes_config_error", "aes_alert_reset"] |
| } |
| { |
| name: failure_test |
| desc: ''' |
| - Tests what happens if a register is written a the wrong time? |
| If a key does not match the key setting etc. |
| Will the DUT ignore or fail gracefully. |
| - Enter a 256bit key but set DUT to use 128bit for encryption. |
| Then enter the 128bit of the key and use for decryption. |
| Will result match plain text and vice. |
| - Write unsupported configurations (Key length and mode are 1 hot, what happens if more than one bit is set.)''' |
| stage: V2 |
| tests: ["aes_config_error", "aes_alert_reset", "aes_man_cfg_err"] |
| } |
| { |
| name: trigger_clear_test |
| desc: ''' |
| Exercise trigger and clear registers at random times to make sure we handle the different cornercases correctly. |
| Example of a cornercases clearing data input or data output before the data is consumed or the DUT finishes an operation.''' |
| stage: V2 |
| tests: ["aes_clear"] |
| } |
| { |
| name: nist_test_vectors |
| desc: ''' |
| Verify that the DUT handles the NIST test vectors correctly.''' |
| stage: V2 |
| tests: ["aes_nist_vectors"] |
| } |
| { |
| name: reset_recovery |
| desc: ''' |
| Pull reset at random times, make sure DUT recover/resets correctly and there is no residual data left in the registers.''' |
| stage: V2 |
| tests: ["aes_alert_reset"] |
| } |
| { |
| name: stress |
| desc: ''' |
| This will combine the other individual testpoints to ensure we stress test everything across the board.''' |
| stage: V2 |
| tests: ["aes_stress"] |
| } |
| { |
| name: sideload |
| desc: ''' |
| Verify that DUT uses sideload correctly when sideload is enabled. |
| and that it ignores any valid on the bus when disabled.''' |
| stage: V2 |
| tests: ["aes_stress", "aes_sideload"] |
| } |
| { |
| name: deinitialization |
| desc: ''' |
| Make sure that there is no residual data from latest operation. ''' |
| stage: V2 |
| tests: ["aes_deinit"] |
| } |
| { |
| name: reseeding |
| desc: ''' |
| excercise the different PRNG reseeding configurations |
| for reseeding every 8k blocks the DUT internal block counter will be manually changed to something close to 8k. |
| to provoke the reseeding within reasonable simulation time ''' |
| stage: V2S |
| tests: ["aes_reseed"] |
| } |
| { |
| name:fault_inject |
| desc: ''' |
| Verify that injecting bit errors in one of the state machines or the round counter triggers an error ''' |
| stage: V2S |
| tests: ["aes_fi", "aes_control_fi", "aes_cipher_fi"] |
| } |
| ] |
| |
| |
| covergroups: [ |
| { |
| name: key_iv_data_cg |
| desc: ''' |
| Covers that these registers have been written in random order and interleaved and that it has triggered an operation. |
| - the individual registers (KEY/IV/DATA) can be written in random order |
| - The writes to these registers can also be interleaved |
| - Data out can be read in random order |
| ''' |
| } |
| { |
| name: ctrl_reg_cg |
| desc: ''' |
| Covers that all valid settings have been tested. |
| Further more it covers that also illegal values have been tested. |
| Individual control settings that are covered includes: |
| - operation (encode/decode/illegal) |
| - mode (all modes + illegal/aes_none) |
| - key_len (128/192/256 + illegal) |
| - sideload |
| - prng_reseed_rate(all + illegal) |
| - manual operation |
| |
| All valid combinations of these will be crossed. |
| ''' |
| } |
| { |
| name: ctrl_aux_cg |
| desc: ''' |
| Covers when enabled a complete write forces a reseed. |
| this is done by checking the DUT goes out of idle state after a full key has been provided. |
| also covers that this is not the case then key_touch_forces_reseed = 0. |
| ''' |
| } |
| { |
| name: trigger_cg |
| desc: ''' |
| This covergroup has two very different cover points. |
| - start covers that a start initiates an operation in manual mode. |
| and that it does not when not in manual mode |
| - that a write to key_iv_data_in/data_out_clear clear clears the data from the register |
| Additionally it covers that going from automatic mode to manual mode it is not possible to trigger a start without configuring the DUT (writing to CTRL should trigger a need for new configuration) |
| The prng reseed is covered by the reseed_cg |
| ''' |
| } |
| { |
| name: status_cg |
| desc: ''' |
| Covers the different status bits was seen |
| ''' |
| } |
| { |
| name: reseed_cg |
| desc: ''' |
| Cover that the different reseed configurations has been used. |
| - reseed_rate (per_1, per_64, per_8k) |
| ''' |
| } |
| { |
| name: fault_inject_cg |
| desc: ''' |
| Cover that a recoverable error has been seen: |
| - When the DUT is idle but just about to start |
| - When the DUT is busy |
| ''' |
| } |
| { |
| name: self_clearing_cg |
| desc: ''' |
| Cover that the DUT self clearing is working correctly. |
| An attack could be made by triggering an operation after a reset without configuring the DUT. |
| The self clearing mechanism should prevent the DUT from starting. |
| This mechanism should also clear any data in the output register with random data |
| After a reset is pulled two things will be covered |
| - manually write trigger.start and poll status.idle and make sure the DUT stays in idle. |
| - read output registers make sure output is no longer present |
| ''' |
| } |
| { |
| name: dut_busy_cg |
| desc: ''' |
| Cover that a busy DUT cannot be manipulated. |
| This includes: |
| - Trying to change the configuration (CTRL) |
| - Trying to change the key |
| - Trying to change the IV |
| ''' |
| } |
| { |
| name: sideload_cg |
| desc: ''' |
| Cover sideload functionality |
| This includes: |
| - That an operation does not start before a valid key is present at the sideload interface with sideload enabled. |
| - That a key on the sideload interface is not consumed when sideload is disabled. |
| ''' |
| } |
| |
| ] |
| } |