5#include "sw/device/lib/testing/aes_testutils.h"
7#include "hw/ip/aes/model/aes_modes.h"
8#include "hw/top/dt/alert_handler.h"
11#include "sw/device/lib/testing/test_framework/check.h"
13#ifdef AES_TESTUTILS_HAS_EDN_AND_CSRNG
14#include "hw/top/dt/csrng.h"
16#include "sw/device/lib/testing/csrng_testutils.h"
18#include "hw/top/csrng_regs.h"
29static const uint8_t kKeyShare1[] = {
30 0x0f, 0x1f, 0x2f, 0x3F, 0x4f, 0x5f, 0x6f, 0x7f, 0x8f, 0x9f, 0xaf,
31 0xbf, 0xcf, 0xdf, 0xef, 0xff, 0x0a, 0x1a, 0x2a, 0x3a, 0x4a, 0x5a,
32 0x6a, 0x7a, 0x8a, 0x9a, 0xaa, 0xba, 0xca, 0xda, 0xea, 0xfa,
38 kAesTestutilsTimeout = (10 * 1000 * 1000),
41#ifdef AES_TESTUTILS_HAS_EDN_AND_CSRNG
48 kEdnSeedMaterialLen = 12,
54const uint32_t kAesMaskingPrngZeroOutputSeed[kCsrngBlockLen] = {
55 0x00000000, 0x000000000, 0x00000000, 0x00000000};
68const uint32_t kEdnSeedMaterialInstantiate[kEdnSeedMaterialLen] = {
69 0x84adaf86, 0x652b7141, 0x1d880d0e, 0x1fff0b21, 0xa6ee8307, 0x1f57dfc8,
70 0x59757d79, 0xdeb6522e, 0xc8c67d84, 0xa16abefa, 0xc34030be, 0x530e88f8};
73const uint32_t kCsrngVInstantiate[kCsrngBlockLen] = {0xf1ab9a08, 0xb48984cf,
74 0x2a2e277a, 0x6d9f08eb};
75const uint32_t kCsrngKeyInstantiate[kCsrngKeyLen] = {
76 0x1c1d1e1f, 0x18191a1b, 0x14151617, 0x10111213,
77 0x0c0d0e0f, 0x08090a0b, 0x04050607, 0x00010203};
80const uint32_t kCsrngVGenerate[kCsrngBlockLen] = {0x654600bd, 0xf0c32787,
81 0x3eb52114, 0x8a1e0dce};
82const uint32_t kCsrngKeyGenerate[kCsrngKeyLen] = {
83 0xff6589b5, 0x4bb8e5f9, 0x62847098, 0x1e9f9cd1,
84 0x3c005fbd, 0x9a1b6e70, 0xe30eb080, 0x71dea927};
90const uint32_t kEdnSeedMaterialReseed[kEdnSeedMaterialLen] = {
91 0x96994362, 0x7ef8f0b9, 0x5b5332dc, 0xd0df9b12, 0x96dfbaa9, 0xac0b5af7,
92 0xec2504be, 0xb00fb68c, 0xf37e0a7f, 0x88172eec, 0x4e4b5f58, 0xfec120c0};
94status_t aes_testutils_masking_prng_zero_output_seed(
96 bool gen_zero_output_seed) {
98 TRY(dif_edn_stop(edn0));
99 TRY(dif_csrng_stop(csrng));
102 TRY(dif_csrng_configure(csrng));
109 .cmd = csrng_cmd_header_build(kCsrngAppCmdInstantiate,
115 .len = kEdnSeedMaterialLen,
120 .cmd = csrng_cmd_header_build(kCsrngAppCmdReseed,
126 .len = kEdnSeedMaterialLen,
131 .cmd = csrng_cmd_header_build(kCsrngAppCmdGenerate,
144 .reseed_interval = gen_zero_output_seed ? 1 : 16,
147 kEdnSeedMaterialInstantiate,
sizeof(kEdnSeedMaterialInstantiate));
149 sizeof(kEdnSeedMaterialReseed));
150 TRY(dif_edn_set_auto_mode(edn0, edn0_params));
154status_t aes_testutils_csrng_kat(
const dif_csrng_t *csrng) {
158 .seed_material_len = 12,
160 memcpy(seed_material_instantiate.
seed_material, kEdnSeedMaterialInstantiate,
161 sizeof(kEdnSeedMaterialInstantiate));
164 .instantiated =
true,
165 .fips_compliance =
false,
167 memcpy(expected_state_instantiate.
v, kCsrngVInstantiate,
168 sizeof(kCsrngVInstantiate));
169 memcpy(expected_state_instantiate.
key, kCsrngKeyInstantiate,
170 sizeof(kCsrngKeyInstantiate));
171 TRY(csrng_testutils_kat_instantiate(csrng,
false, &seed_material_instantiate,
172 &expected_state_instantiate));
178 .instantiated =
true,
179 .fips_compliance =
false,
181 memcpy(expected_state_generate.
v, kCsrngVGenerate,
sizeof(kCsrngVGenerate));
182 memcpy(expected_state_generate.
key, kCsrngKeyGenerate,
183 sizeof(kCsrngKeyGenerate));
184 TRY(csrng_testutils_kat_generate(csrng, 1, kCsrngBlockLen, NULL,
185 kAesMaskingPrngZeroOutputSeed,
186 &expected_state_generate));
191 .seed_material_len = 12,
193 memcpy(seed_material_reseed.
seed_material, kEdnSeedMaterialReseed,
194 sizeof(kEdnSeedMaterialReseed));
197 .instantiated =
true,
198 .fips_compliance =
false,
200 memcpy(expected_state_reseed.
v, kCsrngVInstantiate,
201 sizeof(kCsrngVInstantiate));
202 memcpy(expected_state_reseed.
key, kCsrngKeyInstantiate,
203 sizeof(kCsrngKeyInstantiate));
204 TRY(csrng_testutils_kat_reseed(csrng, &seed_material_reseed,
205 &expected_state_reseed));
217 TRY(dif_alert_handler_alert_is_enabled(&alert_handler, csrng_recov_alert,
221 TRY(dif_alert_handler_alert_set_enabled(&alert_handler, csrng_recov_alert,
227 TRY(csrng_testutils_kat_generate(csrng, 1, kCsrngBlockLen, NULL,
228 kAesMaskingPrngZeroOutputSeed,
229 &expected_state_generate));
233 uint32_t recov_alerts = 0;
234 TRY(dif_csrng_get_recoverable_alerts(csrng, &recov_alerts));
236 TRY(dif_csrng_clear_recoverable_alerts(csrng));
240 TRY(dif_alert_handler_alert_set_enabled(&alert_handler, csrng_recov_alert,
252 uint8_t key_share0[
sizeof(kAesModesKey256)];
253 for (
int i = 0; i <
sizeof(kAesModesKey256); ++i) {
254 key_share0[i] = kAesModesKey256[i] ^ kKeyShare1[i];
258 memcpy(key.share0, key_share0,
sizeof(key.share0));
259 memcpy(key.share1, kKeyShare1,
sizeof(key.share1));
262 kAesTestutilsTimeout);
263 CHECK_DIF_OK(dif_aes_start(aes, &transaction, &key, NULL));
267 memcpy(in_data_plain.data, kAesModesPlainText,
sizeof(in_data_plain.data));
271 kAesTestutilsTimeout);
273 kAesTestutilsTimeout);
274 CHECK_DIF_OK(dif_aes_load_data(aes, in_data_plain));
283 CHECK_DIF_OK(dif_aes_read_output(aes, &out_data));
286 CHECK_DIF_OK(dif_aes_end(aes));
287 CHECK_ARRAYS_EQ((uint8_t *)out_data.data, kAesModesCipherTextEcb256,
288 sizeof(out_data.data));
292 CHECK_DIF_OK(dif_aes_start(aes, &transaction, &key, NULL));
296 kAesTestutilsTimeout);
297 CHECK_DIF_OK(dif_aes_load_data(aes, out_data));
301 kAesTestutilsTimeout);
302 CHECK_DIF_OK(dif_aes_read_output(aes, &out_data));
305 CHECK_DIF_OK(dif_aes_end(aes));
307 CHECK_ARRAYS_EQ((uint8_t *)out_data.data, kAesModesPlainText,
308 sizeof(out_data.data));