5#include "sw/device/lib/testing/csrng_testutils.h"
10#include "sw/device/lib/testing/rand_testutils.h"
11#include "sw/device/lib/testing/test_framework/check.h"
13#include "hw/top/csrng_regs.h"
15#define MODULE_ID MAKE_MODULE_ID('r', 'n', 't')
18 kNumOutputWordsMax = 16,
24status_t csrng_testutils_seed_material_build(
26 if (seed_material == NULL) {
27 return INVALID_ARGUMENT();
47 csrng_testutils_seed_material_build(disable_rand, seed_material));
52 disable_rand ? entropy_src_en
60 unsigned int glen = glen_val ? glen_val
61 : (disable_rand || rand_testutils_gen32_range(0, 1))
63 : rand_testutils_gen32_range(2, 10);
67 .entropy_src_enable = entropy_src_enable,
68 .seed_material = seed_material,
73status_t csrng_testutils_cmd_ready_wait(
const dif_csrng_t *csrng) {
76 TRY(dif_csrng_get_cmd_interface_status(csrng, &cmd_status));
82status_t csrng_testutils_cmd_generate_run(
84 uint32_t *output,
size_t output_len) {
85 TRY(csrng_testutils_cmd_ready_wait(csrng));
86 TRY(dif_csrng_generate_start(csrng, additional_data, output_len));
90 TRY(dif_csrng_get_output_status(csrng, &output_status));
93 TRY(dif_csrng_generate_read(csrng, output, output_len));
97status_t csrng_testutils_check_internal_state(
99 TRY(csrng_testutils_cmd_ready_wait(csrng));
102 uint32_t reseed_counter;
111 TRY_CHECK(memcmp(got.
v, expected->
v,
sizeof(expected->
v)) == 0);
113 TRY_CHECK(memcmp(got.
key, expected->
key,
sizeof(expected->
key)) == 0);
117status_t csrng_testutils_kat_instantiate(
122 TRY(csrng_testutils_cmd_ready_wait(csrng));
123 TRY(dif_csrng_uninstantiate(csrng));
126 TRY(csrng_testutils_cmd_ready_wait(csrng));
132 memset(&zero_state, 0,
sizeof(zero_state));
133 return csrng_testutils_check_internal_state(
134 csrng, fail_expected ? &zero_state : expected_state);
137status_t csrng_testutils_kat_generate(
138 const dif_csrng_t *csrng,
size_t num_generates,
size_t output_len,
140 const uint32_t *expected_output,
145 uint32_t got[kNumOutputWordsMax];
146 for (
int i = 0; i < num_generates; ++i) {
147 TRY(csrng_testutils_cmd_generate_run(csrng, additional_data, got,
151 if (expected_output != NULL) {
152 TRY_CHECK(memcmp(got, expected_output, output_len) == 0);
156 return csrng_testutils_check_internal_state(csrng, expected_state);
159status_t csrng_testutils_kat_reseed(
165 TRY(csrng_testutils_cmd_ready_wait(csrng));
166 TRY(csrng_send_app_cmd(
169 .id = kCsrngAppCmdReseed,
170 .entropy_src_enable = kDifCsrngEntropySrcToggleDisable,
171 .seed_material = seed_material,
175 return csrng_testutils_check_internal_state(csrng, expected_state);
178status_t csrng_testutils_fips_instantiate_kat(
const dif_csrng_t *csrng,
179 bool fail_expected) {
218 .seed_material = {0x73bec010, 0x9262474c, 0x16a30f76, 0x531b51de,
219 0x2ee494e5, 0xdfec9db3, 0xcb7a879d, 0x5600419c,
220 0xca79b0b0, 0xdda33b5c, 0xa468649e, 0xdf5d73fa},
221 .seed_material_len = 12,
225 .v = {0x06b8f59e, 0x43c0b2c2, 0x21052502, 0x217b5214},
226 .key = {0x941709fd, 0xd8a25860, 0x861aecf3, 0x98a701a1, 0x0eb2c33b,
227 0x74c08fad, 0x632d5227, 0x8c52f901},
228 .instantiated =
true,
229 .fips_compliance =
false,
231 return csrng_testutils_kat_instantiate(csrng, fail_expected, &kEntropyInput,
235status_t csrng_testutils_fips_generate_kat(
const dif_csrng_t *csrng) {
237 kExpectedOutputLen = 16,
242 const uint32_t kExpectedOutput[kExpectedOutputLen] = {
243 0xe48bb8cb, 0x1012c84c, 0x5af8a7f1, 0xd1c07cd9, 0xdf82ab22, 0x771c619b,
244 0xd40fccb1, 0x87189e99, 0x510494b3, 0x64f7ac0c, 0x2581f391, 0x80b1dc2f,
245 0x793e01c5, 0x87b107ae, 0xdb17514c, 0xa43c41b7,
249 .v = {0xe73e3392, 0x7d2e92b1, 0x1a0bac9d, 0x53c78ac6},
250 .key = {0x66d1b85a, 0xc19d4dfd, 0x053b73e3, 0xe9dc0f90, 0x3f015bc8,
251 0x4436e5fd, 0x1cccc697, 0x1a1c6e5f},
252 .instantiated =
true,
253 .fips_compliance =
false,
255 return csrng_testutils_kat_generate(csrng, 2, kExpectedOutputLen, NULL,
256 kExpectedOutput, &kExpectedState);
259status_t csrng_testutils_fips_instantiate_kat_adata(
const dif_csrng_t *csrng,
260 bool fail_expected) {
303 .seed_material = {0xd6253874, 0xc4cf4ca8, 0xc208b22a, 0x221b22ee,
304 0x46e7ec52, 0xad576230, 0xfe037239, 0xe3973007,
305 0x146469fb, 0xc7f26e7f, 0x0c1456f1, 0xf45e9d04},
306 .seed_material_len = 12,
310 .v = {0xa3230dfa, 0x156db926, 0xf5ae985e, 0x507b2124},
311 .key = {0xfc14714a, 0xaa19a7e3, 0xb3631957, 0x2d30703a, 0xd0af1a70,
312 0x6e91da8e, 0xcb516048, 0xa75117ff},
313 .instantiated =
true,
314 .fips_compliance =
false,
316 return csrng_testutils_kat_instantiate(csrng, fail_expected, &kEntropyInput,
320status_t csrng_testutils_fips_generate_kat_adata1(
const dif_csrng_t *csrng) {
322 kExpectedOutputLen = 16,
325 .seed_material = {0xbf5a0864, 0xcbe42b06, 0x1fbccb6c, 0x800028e6,
326 0x46e80eb6, 0xc1851b9f, 0xab32801e, 0x5c96e6fe,
327 0x812cdcea, 0x90ebdc99, 0x9b92fc87, 0x28819bc7},
328 .seed_material_len = 12,
332 .v = {0x5779849f, 0x2d2e73e0, 0x4e010398, 0x939fbb58},
333 .key = {0x7c32957a, 0xd011b109, 0x2a3725aa, 0x7e13b365, 0x42b86ce0,
334 0x43b4d756, 0x0982abd2, 0xd75e4101},
335 .instantiated =
true,
336 .fips_compliance =
false,
338 return csrng_testutils_kat_generate(csrng, 1, kExpectedOutputLen,
339 &kAdditionalData, NULL, &kExpectedState);
342status_t csrng_testutils_fips_generate_kat_adata2(
const dif_csrng_t *csrng) {
344 kExpectedOutputLen = 16,
347 .seed_material = {0xba4af1ad, 0x65fcc37d, 0xf9ab8c76, 0xcc7b01a6,
348 0xac70ab66, 0x9233f716, 0x94cd2d57, 0x9684d5db,
349 0xe6f31bf8, 0x84d66717, 0x027e1b3c, 0x418ca848},
350 .seed_material_len = 12,
355 const uint32_t kExpectedOutput[kExpectedOutputLen] = {
356 0xf828bf02, 0x243441a8, 0xd303c104, 0x4f11406b, 0xc1f42623, 0x429c3f56,
357 0x39392061, 0x93cb20ac, 0x4fb520b6, 0x2c7c8c2b, 0x7b69897a, 0x9f8f0c68,
358 0xa890a3ed, 0xc82a9d00, 0x29f038b7, 0x2741ffdd};
361 .v = {0x6d5d833e, 0x66cbcb21, 0x07feddce, 0x433abd39},
362 .key = {0x104dfa13, 0xf2c980d3, 0x36a3fdab, 0xa64a3a49, 0x7ba9da1a,
363 0x3d72c866, 0xb33e5d2e, 0xb0f80df4},
364 .instantiated =
true,
365 .fips_compliance =
false,
367 return csrng_testutils_kat_generate(csrng, 1, kExpectedOutputLen,
368 &kAdditionalData, kExpectedOutput,
372status_t csrng_testutils_cmd_status_check(
const dif_csrng_t *csrng) {
374 TRY(dif_csrng_get_cmd_interface_status(csrng, &
status));
379status_t csrng_testutils_recoverable_alerts_check(
const dif_csrng_t *csrng) {
380 uint32_t alerts = UINT32_MAX;
381 TRY(dif_csrng_get_recoverable_alerts(csrng, &alerts));
382 TRY_CHECK(alerts == 0);