6 #include "hw/ip/aes/model/aes_modes.h"
8 #include "sw/device/lib/base/multibits.h"
12 #include "sw/device/lib/dif/dif_csrng_shared.h"
29 #include "sw/device/lib/testing/aes_testutils.h"
30 #include "sw/device/lib/testing/entropy_testutils.h"
31 #include "sw/device/lib/testing/hmac_testutils.h"
32 #include "sw/device/lib/testing/i2c_testutils.h"
33 #include "sw/device/lib/testing/otbn_testutils_rsa.h"
34 #include "sw/device/lib/testing/pinmux_testutils.h"
35 #include "sw/device/lib/testing/spi_device_testutils.h"
36 #include "sw/device/lib/testing/spi_host_testutils.h"
37 #include "sw/device/lib/testing/test_framework/check.h"
38 #include "sw/device/lib/testing/test_framework/ottf_macros.h"
41 #include "adc_ctrl_regs.h"
43 #include "csrng_regs.h"
44 #include "entropy_src_regs.h"
45 #include "gpio_regs.h"
46 #include "hmac_regs.h"
49 #include "kmac_regs.h"
50 #include "pattgen_regs.h"
52 #include "spi_host_regs.h"
53 #include "uart_regs.h"
55 OTTF_DEFINE_TEST_CONFIG(.enable_concurrency =
true,
56 .enable_uart_flow_control =
true);
61 static dif_pinmux_t pinmux;
62 static dif_gpio_t gpio;
63 static dif_adc_ctrl_t adc_ctrl;
64 static dif_entropy_src_t entropy_src;
65 static dif_csrng_t csrng;
66 static dif_edn_t edn_0;
67 static dif_edn_t edn_1;
69 static dif_hmac_t hmac;
70 static dif_kmac_t kmac;
71 static dif_otbn_t otbn;
72 static dif_i2c_t i2c_0;
73 static dif_i2c_t i2c_1;
74 static dif_i2c_t i2c_2;
76 static dif_spi_host_t spi_host_0;
77 static dif_spi_host_t spi_host_1;
78 static dif_uart_t uart_1;
79 static dif_uart_t uart_2;
80 static dif_uart_t uart_3;
81 static dif_pattgen_t pattgen;
84 static dif_rv_plic_t rv_plic;
86 static const dif_i2c_t *i2c_handles[] = {&i2c_0, &i2c_1, &i2c_2};
87 static const dif_uart_t *uart_handles[] = {&uart_1, &uart_2, &uart_3};
92 kDifPwmChannel0, kDifPwmChannel1, kDifPwmChannel2,
93 kDifPwmChannel3, kDifPwmChannel4, kDifPwmChannel5,
103 kMaxIterationsSilicon = 1000,
107 kTestTimeoutMicros = 1000,
111 kAdcCtrlPowerUpTimeAonCycles = 15,
115 kEntropySrcHealthTestWindowSize = 0x60,
116 kEntropySrcAdaptiveProportionHealthTestHighThreshold = 0x50,
117 kEntropySrcAdaptiveProportionHealthTestLowThreshold = 0x10,
121 kEdn0SeedMaterialNumWords = 0,
122 kEdn1SeedMaterialNumWords = 12,
123 kEdn0ReseedInterval = 64,
124 kEdn1ReseedInterval = 16,
128 kKmacEntropyReseedInterval = 1,
129 kKmacEntropyHashThreshold = 1,
130 kKmacEntropyWaitTimer = 0xffff,
131 kKmacEntropyPrescaler = 0x3ff,
132 kKmacMessageLength = 200,
133 kKmacDigestLength = 16,
138 kI2cSclPeriodNs = 1000,
139 kI2cSdaRiseFallTimeNs = 10,
140 kI2cDeviceMask = 0x7f,
141 kI2c0DeviceAddress0 = 0x11,
142 kI2c0DeviceAddress1 = 0x22,
143 kI2c1DeviceAddress0 = 0x33,
144 kI2c1DeviceAddress1 = 0x44,
145 kI2c2DeviceAddress0 = 0x55,
146 kI2c2DeviceAddress1 = 0x66,
147 kI2c0TargetAddress = 0x01,
148 kI2c1TargetAddress = 0x02,
149 kI2c2TargetAddress = 0x03,
157 kPattgenClockDivisor = 0,
158 kPattgenSeedPatternLowerWord = 0xaaaaaaaa,
159 kPattgenSeedPatternUpperWord = 0xaaaaaaaa,
160 kPattgenSeedPatternLength = 64,
161 kPattgenNumPatternRepetitions = 1024,
165 kPwmClockDivisor = 1,
166 kPwmBeatsPerCycle = 2,
168 kPwmPhaseDelayBeats = 0,
175 kSpiHost1TxDataWord = 0xaaaaaaaa,
178 typedef enum power_virus_test_stage {
179 kPowerVirusTestStageCryptoDataLoad,
180 kPowerVirusTestStageCommsDataLoad,
181 kPowerVirusTestStageMaxPower,
182 kPowerVirusTestStageComplete,
183 } power_virus_test_stage_t;
185 power_virus_test_stage_t test_stage;
187 static uint32_t csrng_instantiate_cmd_header;
194 static volatile uint32_t peripheral_clock_period_ns;
199 static const uint8_t kAesKeyShare1[] = {
200 0x0f, 0x1f, 0x2f, 0x3f, 0x4f, 0x5f, 0x6f, 0x7f, 0x8f, 0x9f, 0xaf,
201 0xbf, 0xcf, 0xdf, 0xef, 0xff, 0x0a, 0x1a, 0x2a, 0x3a, 0x4a, 0x5a,
202 0x6a, 0x7a, 0x8a, 0x9a, 0xaa, 0xba, 0xca, 0xda, 0xea, 0xfa,
206 .share0 = {0x43424140, 0x47464544, 0x4B4A4948, 0x4F4E4D4C, 0x53525150,
207 0x57565554, 0x5B5A5958, 0x5F5E5D5C},
212 static const char *kKmacMessage =
213 "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
214 "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
215 "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
216 "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
217 "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
218 "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
219 "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
220 "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
221 "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
222 "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
223 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
224 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
225 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7";
227 static const uint32_t kKmacDigest[] = {
228 0xF71886B5, 0xD5E1921F, 0x558C1B6C, 0x18CDD7DD, 0xCAB4978B, 0x1E83994D,
229 0x839A69B2, 0xD9E4A27D, 0xFDACFB70, 0xAE3300E5, 0xA2F185A5, 0xC3108570,
230 0x0888072D, 0x2818BD01, 0x6847FE98, 0x6589FC76};
233 static uint32_t kRsa2KModulus[] = {
234 0x40d984b1, 0x3611356d, 0x9eb2f35c, 0x031a892c, 0x16354662, 0x6a260bad,
235 0xb2b807d6, 0xb7de7ccb, 0x278492e0, 0x41adab06, 0x9e60110f, 0x1414eeff,
236 0x8b80e14e, 0x5eb5ae79, 0x0d98fa5b, 0x58bece1f, 0xcf6bdca8, 0x82f5611f,
237 0x351e3869, 0x075005d6, 0xe813fe23, 0xdd967a37, 0x682d1c41, 0x9fdd2d8c,
238 0x21bdd5fc, 0x4fc459c7, 0x508c9293, 0x1f9ac759, 0x55aacb04, 0x58389f05,
239 0x0d0b00fb, 0x59bb4141, 0x68f9e0bf, 0xc2f1a546, 0x0a71ad19, 0x9c400301,
240 0xa4f8ecb9, 0xcdf39538, 0xaabe9cb0, 0xd9f7b2dc, 0x0e8b292d, 0x8ef6c717,
241 0x720e9520, 0xb0c6a23e, 0xda1e92b1, 0x8b6b4800, 0x2f25082b, 0x7f2d6711,
242 0x426fc94f, 0x9926ba5a, 0x89bd4d2b, 0x977718d5, 0x5a8406be, 0x87d090f3,
243 0x639f9975, 0x5948488b, 0x1d3d9cd7, 0x28c7956b, 0xebb97a3e, 0x1edbf4e2,
244 0x105cc797, 0x924ec514, 0x146810df, 0xb1ab4a49,
249 static const uint32_t kRsa2KSignature[] = {
250 0xab66c6c7, 0x97effc0a, 0x9869cdba, 0x7b6c09fe, 0x2124d28f, 0x793084b3,
251 0x4da24b72, 0x4f6c8659, 0x63e3a27b, 0xbbe8d120, 0x8789190f, 0x1722fe46,
252 0x25573178, 0x3accbdb3, 0x1eb7ca00, 0xe8eb40aa, 0x1d3b21a8, 0x9997925e,
253 0x1793f81d, 0x12728f54, 0x66e40608, 0x4b1057a0, 0xba433eb3, 0x702c73b2,
254 0xa9391740, 0xf838710f, 0xf33cf109, 0x595cee1d, 0x07341be9, 0xcfce52b1,
255 0x5b48ba7a, 0xf70e5a0e, 0xdbb98c42, 0x85fd6979, 0xcdb760fc, 0xd2e09553,
256 0x70bba417, 0x04e52609, 0xc215420e, 0x2407242e, 0x4f19674b, 0x5d996a9d,
257 0xf2fb1d05, 0x88e0fc14, 0xe1a38f0c, 0xd111935d, 0xd23bf5b3, 0xdcd7a882,
258 0x0f242315, 0xd7247d51, 0xc247d6ec, 0xe2492739, 0x3dfb115c, 0x031aea7a,
259 0xcdcb09c0, 0x29318ddb, 0xd0a10dd8, 0x3307018e, 0xe13c5616, 0x98d4db80,
260 0x50692a42, 0x41e94a74, 0x0a6f79eb, 0x1c405c66,
264 static const uint32_t kRsa2KEncodedMessage[] = {
265 0x20b50917, 0xdc72a118, 0xd13b02ca, 0x4bc0a4ca, 0x807ce588, 0x43e1f083,
266 0x966ee07c, 0xb2da997a, 0x05000420, 0x03040201, 0x86480165, 0x0d060960,
267 0x00303130, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
268 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
269 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
270 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
271 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
272 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
273 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
274 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
275 0xffffffff, 0xffffffff, 0xffffffff, 0x0001ffff,
278 static const uint8_t kUartMessage[] = {
279 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
280 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
281 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
284 static const uint8_t kI2cMessage[] = {
285 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
286 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
287 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
288 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
289 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
290 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
293 static void log_entropy_src_alert_failures(
void) {
296 LOG_INFO(
"Entropy source health test failure encountered.");
298 for (
size_t i = 0; i < kDifEntropySrcTestNumVariants; ++i) {
328 void ottf_external_isr(uint32_t *exc_info) {
338 log_entropy_src_alert_failures();
342 CHECK(
false,
"Unexpected IRQ fired with ID: %d", irq_id);
350 static void init_peripheral_handles(
void) {
351 CHECK_DIF_OK(dif_adc_ctrl_init(
355 CHECK_DIF_OK(dif_csrng_init(
361 CHECK_DIF_OK(dif_entropy_src_init(
369 CHECK_DIF_OK(dif_pinmux_init(
372 CHECK_DIF_OK(dif_uart_init(
374 CHECK_DIF_OK(dif_uart_init(
376 CHECK_DIF_OK(dif_uart_init(
386 CHECK_DIF_OK(dif_spi_host_init(
388 CHECK_DIF_OK(dif_spi_host_init(
392 CHECK_DIF_OK(dif_pattgen_init(
394 CHECK_DIF_OK(dif_pwm_init(
399 CHECK_DIF_OK(dif_rv_plic_init(
403 static void configure_pinmux(
void) {
405 pinmux_testutils_init(&pinmux);
575 static void configure_pinmux_sim(
void) {
582 .pad = kDtPadSpiHost0Sd0,
583 .flags = kDifPinmuxPadAttrPullResistorEnable |
584 kDifPinmuxPadAttrPullResistorUp,
587 .pad = kDtPadSpiHost0Sd1,
588 .flags = kDifPinmuxPadAttrPullResistorEnable |
589 kDifPinmuxPadAttrPullResistorUp,
592 .pad = kDtPadSpiHost0Sd2,
593 .flags = kDifPinmuxPadAttrPullResistorEnable |
594 kDifPinmuxPadAttrPullResistorUp,
597 .pad = kDtPadSpiHost0Sd3,
598 .flags = kDifPinmuxPadAttrPullResistorEnable |
599 kDifPinmuxPadAttrPullResistorUp,
604 .flags = kDifPinmuxPadAttrPullResistorEnable |
605 kDifPinmuxPadAttrPullResistorUp,
609 .flags = kDifPinmuxPadAttrPullResistorEnable |
610 kDifPinmuxPadAttrPullResistorUp,
614 .flags = kDifPinmuxPadAttrPullResistorEnable |
615 kDifPinmuxPadAttrPullResistorUp,
619 .flags = kDifPinmuxPadAttrPullResistorEnable |
620 kDifPinmuxPadAttrPullResistorUp,
684 CHECK_STATUS_OK(spi_host_testutils_configure_host0_pad_attrs(&pinmux));
687 CHECK_STATUS_OK(spi_device_testutils_configure_pad_attrs(&pinmux));
695 static void configure_adc_ctrl_to_continuously_sample(
void) {
700 .power_up_time_aon_cycles = kAdcCtrlPowerUpTimeAonCycles,
703 .wake_up_time_aon_cycles = ADC_CTRL_ADC_PD_CTL_WAKEUP_TIME_MASK,
704 .num_low_power_samples = ADC_CTRL_ADC_LP_SAMPLE_CTL_REG_RESVAL,
705 .num_normal_power_samples = ADC_CTRL_ADC_SAMPLE_CTL_REG_RESVAL,
707 for (
size_t filter = 0; filter < ADC_CTRL_PARAM_NUM_ADC_FILTER; ++filter) {
708 for (
size_t channel = 0; channel < ADC_CTRL_PARAM_NUM_ADC_CHANNEL;
716 .max_voltage = ADC_CTRL_ADC_CHN0_FILTER_CTL_0_MAX_V_0_MASK,
718 .generate_wakeup_on_match =
false,
719 .generate_irq_on_match =
false,
726 static void configure_entropy_complex(
void) {
729 CHECK_STATUS_OK(entropy_testutils_stop_all());
737 CHECK_DIF_OK(dif_entropy_src_irq_set_enabled(
744 .high_threshold = 0xf,
745 .low_threshold = 0}));
749 .high_threshold = 0xf,
750 .low_threshold = 0}));
756 kEntropySrcAdaptiveProportionHealthTestHighThreshold,
758 kEntropySrcAdaptiveProportionHealthTestLowThreshold}));
762 .high_threshold = 0xff,
763 .low_threshold = 0}));
767 .high_threshold = 0xff,
768 .low_threshold = 0}));
772 .entropy_insert_enable =
false,
773 .buffer_threshold = ENTROPY_SRC_OBSERVE_FIFO_THRESH_REG_RESVAL,
782 .route_to_firmware =
false,
783 .bypass_conditioner =
false,
785 .health_test_threshold_scope =
false,
786 .health_test_window_size = kEntropySrcHealthTestWindowSize,
787 .alert_threshold = UINT16_MAX},
793 csrng_instantiate_cmd_header = csrng_cmd_header_build(
799 .
len = kEdn0SeedMaterialNumWords,
802 .
len = kEdn1SeedMaterialNumWords,
803 .data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12},
808 .
cmd = csrng_cmd_header_build(kCsrngAppCmdInstantiate,
810 edn_384_bit_seed.
len,
812 .seed_material = edn_384_bit_seed,
816 .cmd = csrng_cmd_header_build(
818 edn_384_bit_seed.
len, 0),
819 .seed_material = edn_384_bit_seed,
827 .cmd = csrng_cmd_header_build(kCsrngAppCmdGenerate,
831 .seed_material = edn_empty_seed,
833 .reseed_interval = 0,
847 static status_t configure_aes(
void) {
849 uint8_t aes_key_share0[
sizeof(kAesModesKey256)];
850 for (
size_t i = 0; i <
sizeof(kAesModesKey256); ++i) {
851 aes_key_share0[i] = kAesModesKey256[i] ^ kAesKeyShare1[i];
859 memcpy(aes_iv.iv, kAesModesIvCbc,
sizeof(aes_iv.iv));
871 .reseed_on_key_change =
false,
872 .ctrl_aux_lock =
false,
884 static void configure_hmac(
void) {
891 CHECK_STATUS_OK(hmac_testutils_push_message(&hmac, (
char *)kHmacRefLongKey,
892 sizeof(kHmacRefLongKey)));
894 hmac_testutils_check_message_length(&hmac,
sizeof(kHmacRefLongKey) * 8));
897 CHECK_STATUS_OK(hmac_testutils_finish_polled(&hmac, &hmac_key_digest));
901 &hmac, (uint8_t *)&hmac_key_digest.digest[0], hmac_transaction_cfg));
904 static void configure_kmac(
void) {
908 .entropy_hash_threshold = kKmacEntropyHashThreshold,
909 .entropy_wait_timer = kKmacEntropyWaitTimer,
910 .entropy_prescaler = kKmacEntropyPrescaler,
911 .message_big_endian =
false,
912 .output_big_endian =
false,
919 static void configure_uart(dif_uart_t *uart) {
920 CHECK(
kUartBaudrate <= UINT32_MAX,
"kUartBaudrate must fit in uint32_t");
922 "kClockFreqPeripheralHz must fit in uint32_t");
936 static void configure_i2c(dif_i2c_t *i2c, uint8_t device_addr_0,
937 uint8_t device_addr_1) {
942 .lowest_target_device_speed = kI2CSpeedMode,
943 .clock_period_nanos = peripheral_clock_period_ns,
944 .sda_rise_nanos = kI2cSdaRiseFallTimeNs,
945 .sda_fall_nanos = kI2cSdaRiseFallTimeNs,
946 .scl_period_nanos = kI2cSclPeriodNs},
955 static void configure_spi_host(
const dif_spi_host_t *spi_host,
bool enable) {
957 "kClockFreqHiSpeedPeripheralHz must fit in uint32_t");
976 spi_host->base_addr, SPI_HOST_CONTROL_REG_OFFSET,
980 void configure_pattgen(
void) {
981 for (
size_t i = 0; i <
ARRAYSIZE(pattgen_channels); ++i) {
985 &pattgen, pattgen_channels[i],
988 .clock_divisor = kPattgenClockDivisor,
989 .seed_pattern_lower_word = kPattgenSeedPatternLowerWord,
990 .seed_pattern_upper_word = kPattgenSeedPatternUpperWord,
991 .seed_pattern_length = kPattgenSeedPatternLength,
992 .num_pattern_repetitions = kPattgenNumPatternRepetitions,
993 .inactive_level_pda =
false,
994 .inactive_level_pcl =
false,
999 void configure_pwm(
void) {
1002 .clock_divisor = kPwmClockDivisor,
1003 .beats_per_pulse_cycle = kPwmBeatsPerCycle,
1007 for (
size_t i = 0; i < PWM_PARAM_N_OUTPUTS; ++i) {
1011 .duty_cycle_a = kPwmOnBeats,
1013 .phase_delay = kPwmPhaseDelayBeats,
1016 .blink_parameter_x = 0,
1017 .blink_parameter_y = 0,
1028 static void configure_otbn(
void) {
1029 CHECK_STATUS_OK(otbn_testutils_rsa_load(&otbn));
1032 static void check_crypto_blocks_idle(
void) {
1035 CSRNG_SW_CMD_STS_CMD_RDY_BIT));
1046 CHECK(otbn_status == kDifOtbnStatusIdle);
1049 static void complete_kmac_operations(uint32_t *digest) {
1054 ptrdiff_t digest_offset = KMAC_STATE_REG_OFFSET;
1055 for (
size_t i = 0; i < kKmacDigestLength; ++i) {
1056 uint32_t share0 = mmio_region_read32(kmac.base_addr, digest_offset);
1057 uint32_t share1 = mmio_region_read32(
1059 digest[i] = share0 ^ share1;
1060 digest_offset +=
sizeof(uint32_t);
1062 kmac_operation_state.
offset += kKmacDigestLength;
1065 CHECK_DIF_OK(
dif_kmac_end(&kmac, &kmac_operation_state));
1072 static status_t aes_wait_for_status_ready(dif_aes_t *aes) {
1074 kTestTimeoutMicros);
1078 static void crypto_data_load(
void) {
1079 LOG_INFO(
"Loading crypto block FIFOs with data ...");
1083 CHECK_STATUS_OK(configure_aes());
1087 memcpy(aes_plain_text.data, kAesModesPlainText,
sizeof(aes_plain_text.data));
1088 CHECK_STATUS_OK(aes_wait_for_status_ready(&aes));
1093 hmac_testutils_push_message(&hmac, kHmacRefData,
sizeof(kHmacRefData)));
1095 hmac_testutils_check_message_length(&hmac,
sizeof(kHmacRefData) * 8));
1100 &kmac_customization_string));
1103 &kKmacKey, &kmac_customization_string));
1104 CHECK_DIF_OK(
dif_kmac_absorb(&kmac, &kmac_operation_state, kKmacMessage,
1105 kKmacMessageLength, NULL));
1110 if (kmac_operation_state.
append_d) {
1113 uint32_t kmac_output_length_bits = kmac_operation_state.
d * 32;
1114 int len = 1 + (kmac_output_length_bits > 0xFF) +
1115 (kmac_output_length_bits > 0xFFFF) +
1116 (kmac_output_length_bits > 0xFFFFFF);
1117 int shift = (len - 1) * 8;
1118 while (shift >= 8) {
1119 mmio_region_write8(kmac.base_addr, KMAC_MSG_FIFO_REG_OFFSET,
1120 (uint8_t)(kmac_output_length_bits >> shift));
1123 mmio_region_write8(kmac.base_addr, KMAC_MSG_FIFO_REG_OFFSET,
1124 (uint8_t)kmac_output_length_bits);
1125 mmio_region_write8(kmac.base_addr, KMAC_MSG_FIFO_REG_OFFSET, (uint8_t)len);
1129 static void crypto_data_load_task(
void *task_parameters) {
1130 while (test_stage != kPowerVirusTestStageComplete) {
1131 if (test_stage == kPowerVirusTestStageCryptoDataLoad) {
1133 test_stage = kPowerVirusTestStageCommsDataLoad;
1137 OTTF_TASK_DELETE_SELF_OR_DIE;
1140 static void comms_data_load(
void) {
1141 LOG_INFO(
"Loading communication block FIFOs with data ...");
1142 size_t bytes_written;
1143 CHECK(
ARRAYSIZE(kUartMessage) == kUartFifoDepth);
1144 CHECK(
ARRAYSIZE(kI2cMessage) == (I2C_PARAM_FIFO_DEPTH - 1));
1147 for (
size_t i = 0; i <
ARRAYSIZE(uart_handles); ++i) {
1150 ARRAYSIZE(kUartMessage), &bytes_written));
1151 CHECK(bytes_written ==
ARRAYSIZE(kUartMessage));
1155 static_assert(
ARRAYSIZE(i2c_handles) < UINT8_MAX,
1156 "Length of i2c_handles must fit in uint8_t");
1157 for (uint8_t i = 0; i <
ARRAYSIZE(i2c_handles); ++i) {
1158 CHECK_STATUS_OK(i2c_testutils_write(i2c_handles[i], i + 1,
1159 I2C_PARAM_FIFO_DEPTH - 1, kI2cMessage,
1164 uint32_t spi_host_tx_data[SPI_HOST_PARAM_TX_DEPTH];
1165 for (
size_t i = 0; i < SPI_HOST_PARAM_TX_DEPTH; ++i) {
1166 spi_host_tx_data[i] = kSpiHost1TxDataWord;
1172 .buf = (
void *)&spi_host_tx_data,
1173 .length =
ARRAYSIZE(spi_host_tx_data) *
sizeof(uint32_t),
1176 &spi_host_tx_segment, 1));
1179 static void comms_data_load_task(
void *task_parameters) {
1180 while (test_stage != kPowerVirusTestStageComplete) {
1181 if (test_stage == kPowerVirusTestStageCommsDataLoad) {
1183 test_stage = kPowerVirusTestStageMaxPower;
1187 OTTF_TASK_DELETE_SELF_OR_DIE;
1191 static void csrng_wait_ready(
void) {
1193 CSRNG_SW_CMD_STS_CMD_RDY_BIT)) {
1197 static void max_power(
void) {
1198 LOG_INFO(
"Starting the max power task ...");
1209 uint32_t hmac_cmd_reg =
1210 mmio_region_read32(hmac.base_addr, HMAC_CMD_REG_OFFSET);
1213 uint32_t kmac_cmd_reg =
1218 uint32_t uart_ctrl_reg =
1219 mmio_region_read32(uart_1.base_addr, UART_CTRL_REG_OFFSET);
1222 uint32_t i2c_ctrl_reg =
1223 mmio_region_read32(i2c_0.base_addr, I2C_CTRL_REG_OFFSET);
1226 uint32_t spi_host_1_ctrl_reg =
1227 mmio_region_read32(spi_host_1.base_addr, SPI_HOST_CONTROL_REG_OFFSET);
1229 spi_host_1_ctrl_reg, SPI_HOST_CONTROL_OUTPUT_EN_BIT,
true);
1231 SPI_HOST_CONTROL_SPIEN_BIT,
true);
1234 uint32_t pattgen_ctrl_reg =
1235 mmio_region_read32(pattgen.base_addr, PATTGEN_CTRL_REG_OFFSET);
1242 uint32_t adc_ctrl_reg =
1243 mmio_region_read32(adc_ctrl.base_addr, ADC_CTRL_ADC_EN_CTL_REG_OFFSET);
1245 ADC_CTRL_ADC_EN_CTL_ADC_ENABLE_BIT,
true);
1249 uint32_t pwm_cfg_reg = mmio_region_read32(pwm.base_addr, PWM_CFG_REG_OFFSET);
1253 const uint32_t gpio_on_reg_val = (1u << 16) | 1u;
1254 const uint32_t gpio_off_reg_val = 1u << 16;
1256 check_crypto_blocks_idle();
1258 LOG_INFO(
"Entering max power epoch ...");
1261 mmio_region_write32(adc_ctrl.base_addr, ADC_CTRL_ADC_EN_CTL_REG_OFFSET,
1265 mmio_region_write32(pwm.base_addr, PWM_CFG_REG_OFFSET, pwm_cfg_reg);
1268 mmio_region_write32(uart_1.base_addr, UART_CTRL_REG_OFFSET, uart_ctrl_reg);
1269 mmio_region_write32(uart_2.base_addr, UART_CTRL_REG_OFFSET, uart_ctrl_reg);
1270 mmio_region_write32(uart_3.base_addr, UART_CTRL_REG_OFFSET, uart_ctrl_reg);
1271 mmio_region_write32(i2c_0.base_addr, I2C_CTRL_REG_OFFSET, i2c_ctrl_reg);
1272 mmio_region_write32(i2c_1.base_addr, I2C_CTRL_REG_OFFSET, i2c_ctrl_reg);
1273 mmio_region_write32(i2c_2.base_addr, I2C_CTRL_REG_OFFSET, i2c_ctrl_reg);
1276 CHECK_STATUS_OK(otbn_testutils_rsa_modexp_f4_start(
1277 &otbn, (
unsigned char *)kRsa2KModulus, (
unsigned char *)kRsa2KSignature,
1278 sizeof(kRsa2KModulus)));
1281 mmio_region_write32(pattgen.base_addr, PATTGEN_CTRL_REG_OFFSET,
1285 mmio_region_write32(spi_host_1.base_addr, SPI_HOST_CONTROL_REG_OFFSET,
1286 spi_host_1_ctrl_reg);
1291 mmio_region_write32(csrng.base_addr, CSRNG_CMD_REQ_REG_OFFSET,
1292 csrng_instantiate_cmd_header);
1294 uint32_t csrng_reseed_cmd = csrng_cmd_header_build(
1299 mmio_region_write32(csrng.base_addr, CSRNG_CMD_REQ_REG_OFFSET,
1304 mmio_region_write32(kmac.base_addr, KMAC_CMD_REG_OFFSET, kmac_cmd_reg);
1307 mmio_region_write32(aes.base_addr, AES_TRIGGER_REG_OFFSET, aes_trigger_reg);
1310 mmio_region_write32(gpio.base_addr, GPIO_MASKED_OUT_LOWER_REG_OFFSET,
1313 mmio_region_write32(hmac.base_addr, HMAC_CMD_REG_OFFSET,
1319 while (!(mmio_region_read32(aes.base_addr, AES_STATUS_REG_OFFSET) &
1320 (1u << AES_STATUS_OUTPUT_VALID_BIT)))
1324 mmio_region_write32(gpio.base_addr, GPIO_MASKED_OUT_LOWER_REG_OFFSET,
1327 LOG_INFO(
"Exited max power epoch.");
1335 CHECK_ARRAYS_EQ((uint8_t *)aes_cipher_text.data, kAesModesCipherTextCbc256,
1340 hmac_testutils_finish_and_check_polled(&hmac, &kHmacRefExpectedDigest));
1343 uint32_t kmac_digest[kKmacDigestLength];
1344 complete_kmac_operations(kmac_digest);
1345 CHECK(kKmacDigestLength ==
ARRAYSIZE(kKmacDigest));
1346 CHECK_ARRAYS_EQ(kmac_digest, kKmacDigest,
ARRAYSIZE(kKmacDigest));
1349 uint32_t rsa_recovered_message[
ARRAYSIZE(kRsa2KEncodedMessage)];
1350 CHECK_STATUS_OK(otbn_testutils_rsa_modexp_f4_finalize(
1351 &otbn, (
unsigned char *)rsa_recovered_message,
1352 sizeof(rsa_recovered_message)));
1353 CHECK_ARRAYS_EQ(rsa_recovered_message, kRsa2KEncodedMessage,
1357 uint8_t received_uart_data[kUartFifoDepth];
1358 size_t num_uart_rx_bytes;
1359 for (
size_t i = 0; i <
ARRAYSIZE(uart_handles); ++i) {
1366 memset((
void *)received_uart_data, 0, kUartFifoDepth);
1368 received_uart_data, NULL));
1369 CHECK_ARRAYS_EQ(received_uart_data, kUartMessage, num_uart_rx_bytes);
1377 for (
size_t ii = 0; ii <
ARRAYSIZE(i2c_handles); ++ii) {
1380 i2c_handles[ii], &fmt_fifo_lvl,
1382 }
while (fmt_fifo_lvl > 0);
1386 static_assert(
ARRAYSIZE(i2c_handles) < UINT8_MAX,
1387 "Length of i2c_handles must fit in uint8_t");
1388 for (uint8_t ii = 0; ii <
ARRAYSIZE(i2c_handles); ++ii) {
1390 i2c_testutils_issue_read(i2c_handles[ii], ii + 1,
1391 I2C_PARAM_FIFO_DEPTH - 1));
1395 for (
size_t ii = 0; ii <
ARRAYSIZE(i2c_handles); ++ii) {
1398 i2c_handles[ii], NULL, &rx_fifo_lvl,
1400 }
while (rx_fifo_lvl < I2C_PARAM_FIFO_DEPTH - 1);
1404 for (
size_t ii = 0; ii <
ARRAYSIZE(i2c_handles); ++ii) {
1405 for (
size_t jj = 0; jj < I2C_PARAM_FIFO_DEPTH - 1; ++jj) {
1408 CHECK(kI2cMessage[jj] ==
byte);
1414 static void max_power_task(
void *task_parameters) {
1415 uint32_t max_iterations = 1;
1417 max_iterations = kMaxIterationsSilicon;
1420 for (
size_t i = 0; i < max_iterations; ++i) {
1421 if (test_stage == kPowerVirusTestStageMaxPower) {
1423 test_stage = (i + 1 == max_iterations)
1424 ? kPowerVirusTestStageComplete
1425 : kPowerVirusTestStageCryptoDataLoad;
1430 OTTF_TASK_DELETE_SELF_OR_DIE;
1433 static void check_otp_csr_configs(
void) {
1436 &flash_ctrl, &default_properties));
1437 CHECK(default_properties.
scramble_en == kMultiBitBool4True);
1438 CHECK(default_properties.
ecc_en == kMultiBitBool4True);
1443 peripheral_clock_period_ns =
1446 LOG_INFO(
"Computed peripheral clock period.");
1451 init_peripheral_handles();
1456 configure_pinmux_sim();
1461 configure_adc_ctrl_to_continuously_sample();
1462 configure_entropy_complex();
1464 configure_uart(&uart_1);
1465 configure_uart(&uart_2);
1466 configure_uart(&uart_3);
1467 configure_i2c(&i2c_0, kI2c0DeviceAddress0, kI2c0DeviceAddress1);
1468 configure_i2c(&i2c_1, kI2c1DeviceAddress0, kI2c1DeviceAddress1);
1469 configure_i2c(&i2c_2, kI2c2DeviceAddress0, kI2c2DeviceAddress1);
1470 configure_spi_host(&spi_host_0,
true);
1473 configure_spi_host(&spi_host_1,
false);
1474 CHECK_STATUS_OK(spi_device_testutils_configure_passthrough(
1477 configure_pattgen();
1484 check_otp_csr_configs();
1489 test_stage = kPowerVirusTestStageCryptoDataLoad;
1492 kOttfFreeRtosMinStackSize, 1));
1494 kOttfFreeRtosMinStackSize, 1));
1496 kOttfFreeRtosMinStackSize, 1));
1504 LOG_INFO(
"Yielding execution to another task.");