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(
const dif_csrng_t *csrng,
97 TRY(dif_edn_stop(edn0));
98 TRY(dif_csrng_stop(csrng));
101 TRY(dif_csrng_configure(csrng));
108 .cmd = csrng_cmd_header_build(kCsrngAppCmdInstantiate,
114 .len = kEdnSeedMaterialLen,
119 .cmd = csrng_cmd_header_build(kCsrngAppCmdReseed,
125 .len = kEdnSeedMaterialLen,
130 .cmd = csrng_cmd_header_build(kCsrngAppCmdGenerate,
139 .reseed_interval = 1,
142 kEdnSeedMaterialInstantiate,
sizeof(kEdnSeedMaterialInstantiate));
144 sizeof(kEdnSeedMaterialReseed));
145 TRY(dif_edn_set_auto_mode(edn0, edn0_params));
149status_t aes_testutils_csrng_kat(
const dif_csrng_t *csrng) {
153 .seed_material_len = 12,
155 memcpy(seed_material_instantiate.
seed_material, kEdnSeedMaterialInstantiate,
156 sizeof(kEdnSeedMaterialInstantiate));
159 .instantiated =
true,
160 .fips_compliance =
false,
162 memcpy(expected_state_instantiate.
v, kCsrngVInstantiate,
163 sizeof(kCsrngVInstantiate));
164 memcpy(expected_state_instantiate.
key, kCsrngKeyInstantiate,
165 sizeof(kCsrngKeyInstantiate));
166 TRY(csrng_testutils_kat_instantiate(csrng,
false, &seed_material_instantiate,
167 &expected_state_instantiate));
173 .instantiated =
true,
174 .fips_compliance =
false,
176 memcpy(expected_state_generate.
v, kCsrngVGenerate,
sizeof(kCsrngVGenerate));
177 memcpy(expected_state_generate.
key, kCsrngKeyGenerate,
178 sizeof(kCsrngKeyGenerate));
179 TRY(csrng_testutils_kat_generate(csrng, 1, kCsrngBlockLen, NULL,
180 kAesMaskingPrngZeroOutputSeed,
181 &expected_state_generate));
186 .seed_material_len = 12,
188 memcpy(seed_material_reseed.
seed_material, kEdnSeedMaterialReseed,
189 sizeof(kEdnSeedMaterialReseed));
192 .instantiated =
true,
193 .fips_compliance =
false,
195 memcpy(expected_state_reseed.
v, kCsrngVInstantiate,
196 sizeof(kCsrngVInstantiate));
197 memcpy(expected_state_reseed.
key, kCsrngKeyInstantiate,
198 sizeof(kCsrngKeyInstantiate));
199 TRY(csrng_testutils_kat_reseed(csrng, &seed_material_reseed,
200 &expected_state_reseed));
212 TRY(dif_alert_handler_alert_is_enabled(&alert_handler, csrng_recov_alert,
216 TRY(dif_alert_handler_alert_set_enabled(&alert_handler, csrng_recov_alert,
222 TRY(csrng_testutils_kat_generate(csrng, 1, kCsrngBlockLen, NULL,
223 kAesMaskingPrngZeroOutputSeed,
224 &expected_state_generate));
228 uint32_t recov_alerts = 0;
229 TRY(dif_csrng_get_recoverable_alerts(csrng, &recov_alerts));
231 TRY(dif_csrng_clear_recoverable_alerts(csrng));
235 TRY(dif_alert_handler_alert_set_enabled(&alert_handler, csrng_recov_alert,
247 uint8_t key_share0[
sizeof(kAesModesKey256)];
248 for (
int i = 0; i <
sizeof(kAesModesKey256); ++i) {
249 key_share0[i] = kAesModesKey256[i] ^ kKeyShare1[i];
253 memcpy(key.share0, key_share0,
sizeof(key.share0));
254 memcpy(key.share1, kKeyShare1,
sizeof(key.share1));
257 kAesTestutilsTimeout);
258 CHECK_DIF_OK(dif_aes_start(aes, &transaction, &key, NULL));
262 memcpy(in_data_plain.data, kAesModesPlainText,
sizeof(in_data_plain.data));
266 kAesTestutilsTimeout);
268 kAesTestutilsTimeout);
269 CHECK_DIF_OK(dif_aes_load_data(aes, in_data_plain));
278 CHECK_DIF_OK(dif_aes_read_output(aes, &out_data));
281 CHECK_DIF_OK(dif_aes_end(aes));
282 CHECK_ARRAYS_EQ((uint8_t *)out_data.data, kAesModesCipherTextEcb256,
283 sizeof(out_data.data));
287 CHECK_DIF_OK(dif_aes_start(aes, &transaction, &key, NULL));
291 kAesTestutilsTimeout);
292 CHECK_DIF_OK(dif_aes_load_data(aes, out_data));
296 kAesTestutilsTimeout);
297 CHECK_DIF_OK(dif_aes_read_output(aes, &out_data));
300 CHECK_DIF_OK(dif_aes_end(aes));
302 CHECK_ARRAYS_EQ((uint8_t *)out_data.data, kAesModesPlainText,
303 sizeof(out_data.data));