10 #include "gtest/gtest.h"
12 #include "sw/device/lib/base/mock_mmio.h"
15 #include "csrng_regs.h"
17 namespace dif_csrng_unittest {
20 using ::testing::ElementsAreArray;
24 const dif_csrng_t csrng_ = {.base_addr = dev().region()};
33 TEST_F(ConfigTest, ConfigOk) {
34 constexpr uint32_t exp = kMultiBitBool4True | kMultiBitBool4True << 4 |
35 kMultiBitBool4True << 8 | kMultiBitBool4False << 12;
36 EXPECT_READ32(CSRNG_REGWEN_REG_OFFSET, 1);
37 EXPECT_WRITE32(CSRNG_CTRL_REG_OFFSET, exp);
41 TEST_F(ConfigTest, Locked) {
42 EXPECT_READ32(CSRNG_REGWEN_REG_OFFSET, 0);
64 public testing::WithParamInterface<StatusTestCase> {};
67 const auto &test_param = GetParam();
69 uint32_t ctrl_reg = 0;
71 test_param.cmd_ready);
75 test_param.cmd_status);
76 EXPECT_READ32(CSRNG_SW_CMD_STS_REG_OFFSET, ctrl_reg);
78 EXPECT_EQ(
status.kind, test_param.expected_status.kind);
79 EXPECT_EQ(
status.cmd_sts, test_param.expected_status.cmd_sts);
82 INSTANTIATE_TEST_SUITE_P(
83 GetCmdInterfaceStatusTestAllParams, GetCmdInterfaceStatusTestAllParams,
110 TEST_F(ForceErrorTest, ForceFifo) {
111 EXPECT_READ32(CSRNG_REGWEN_REG_OFFSET, 1);
112 EXPECT_WRITE32(CSRNG_ERR_CODE_TEST_REG_OFFSET,
113 CSRNG_ERR_CODE_SFIFO_GENBITS_ERR_BIT);
118 TEST_F(ForceErrorTest, ForceError) {
119 EXPECT_READ32(CSRNG_REGWEN_REG_OFFSET, 1);
120 EXPECT_WRITE32(CSRNG_ERR_CODE_TEST_REG_OFFSET,
121 CSRNG_ERR_CODE_AES_CIPHER_SM_ERR_BIT);
125 TEST_F(ForceErrorTest, Locked) {
126 EXPECT_READ32(CSRNG_REGWEN_REG_OFFSET, 0);
127 EXPECT_READ32(CSRNG_REGWEN_REG_OFFSET, 0);
146 TEST_F(MiscStatusTest, GetMainSm) {
147 EXPECT_READ32(CSRNG_MAIN_SM_STATE_REG_OFFSET, 42);
154 TEST_F(MiscStatusTest, GetExceptions) {
155 EXPECT_READ32(CSRNG_HW_EXC_STS_REG_OFFSET, 42);
162 TEST_F(MiscStatusTest, ClearExceptions) {
163 EXPECT_WRITE32(CSRNG_HW_EXC_STS_REG_OFFSET, 0);
176 TEST_F(GetOutputStatusTest, ValidStatus) {
180 EXPECT_READ32(CSRNG_GENBITS_VLD_REG_OFFSET,
182 {CSRNG_GENBITS_VLD_GENBITS_VLD_BIT,
true},
183 {CSRNG_GENBITS_VLD_GENBITS_FIPS_BIT,
false},
187 EXPECT_EQ(
status.valid_data,
true);
188 EXPECT_EQ(
status.fips_mode,
false);
199 .seed_material = {0},
204 EXPECT_READ32(CSRNG_SW_CMD_STS_REG_OFFSET,
205 {{CSRNG_SW_CMD_STS_CMD_RDY_BIT,
true}});
206 EXPECT_WRITE32(CSRNG_CMD_REQ_REG_OFFSET,
207 0x00000001 | kMultiBitBool4True << 8);
211 EXPECT_READ32(CSRNG_SW_CMD_STS_REG_OFFSET,
212 {{CSRNG_SW_CMD_STS_CMD_RDY_BIT,
true}});
213 EXPECT_WRITE32(CSRNG_CMD_REQ_REG_OFFSET,
214 0x00000001 | kMultiBitBool4False << 8);
218 seed_material_.seed_material[0] = 0x5a5a5a5a;
219 seed_material_.seed_material_len = 1;
220 EXPECT_READ32(CSRNG_SW_CMD_STS_REG_OFFSET,
221 {{CSRNG_SW_CMD_STS_CMD_RDY_BIT,
true}});
222 EXPECT_WRITE32(CSRNG_CMD_REQ_REG_OFFSET,
223 0x00000011 | kMultiBitBool4False << 8);
224 EXPECT_READ32(CSRNG_SW_CMD_STS_REG_OFFSET,
225 {{CSRNG_SW_CMD_STS_CMD_RDY_BIT,
true}});
226 EXPECT_WRITE32(CSRNG_CMD_REQ_REG_OFFSET, 0x5a5a5a5a);
231 TEST_F(CommandTest, InstantiateBadArgs) {
236 seed_material_.seed_material_len = 16;
241 TEST_F(CommandTest, ReseedOk) {
242 EXPECT_READ32(CSRNG_SW_CMD_STS_REG_OFFSET,
243 {{CSRNG_SW_CMD_STS_CMD_RDY_BIT,
true}});
244 EXPECT_WRITE32(CSRNG_CMD_REQ_REG_OFFSET,
245 0x00000002 | kMultiBitBool4False << 8);
248 seed_material_.seed_material[0] = 0x5a5a5a5a;
249 seed_material_.seed_material_len = 1;
250 EXPECT_READ32(CSRNG_SW_CMD_STS_REG_OFFSET,
251 {{CSRNG_SW_CMD_STS_CMD_RDY_BIT,
true}});
252 EXPECT_WRITE32(CSRNG_CMD_REQ_REG_OFFSET,
253 0x00000012 | kMultiBitBool4False << 8);
254 EXPECT_READ32(CSRNG_SW_CMD_STS_REG_OFFSET,
255 {{CSRNG_SW_CMD_STS_CMD_RDY_BIT,
true}});
256 EXPECT_WRITE32(CSRNG_CMD_REQ_REG_OFFSET, 0x5a5a5a5a);
260 TEST_F(CommandTest, ReseedBadArgs) {
264 seed_material_.seed_material_len = 16;
268 TEST_F(CommandTest, UpdateOk) {
269 EXPECT_READ32(CSRNG_SW_CMD_STS_REG_OFFSET,
270 {{CSRNG_SW_CMD_STS_CMD_RDY_BIT,
true}});
271 EXPECT_WRITE32(CSRNG_CMD_REQ_REG_OFFSET,
272 0x00000004 | kMultiBitBool4False << 8);
275 seed_material_.seed_material[0] = 0x5a5a5a5a;
276 seed_material_.seed_material_len = 1;
277 EXPECT_READ32(CSRNG_SW_CMD_STS_REG_OFFSET,
278 {{CSRNG_SW_CMD_STS_CMD_RDY_BIT,
true}});
279 EXPECT_WRITE32(CSRNG_CMD_REQ_REG_OFFSET,
280 0x00000014 | kMultiBitBool4False << 8);
281 EXPECT_READ32(CSRNG_SW_CMD_STS_REG_OFFSET,
282 {{CSRNG_SW_CMD_STS_CMD_RDY_BIT,
true}});
283 EXPECT_WRITE32(CSRNG_CMD_REQ_REG_OFFSET, 0x5a5a5a5a);
287 TEST_F(CommandTest, UpdateBadArgs) {
291 TEST_F(CommandTest, GenerateOk) {
293 EXPECT_READ32(CSRNG_SW_CMD_STS_REG_OFFSET,
294 {{CSRNG_SW_CMD_STS_CMD_RDY_BIT,
true}});
295 EXPECT_WRITE32(CSRNG_CMD_REQ_REG_OFFSET,
296 0x00004003 | kMultiBitBool4False << 8);
300 EXPECT_READ32(CSRNG_SW_CMD_STS_REG_OFFSET,
301 {{CSRNG_SW_CMD_STS_CMD_RDY_BIT,
true}});
302 EXPECT_WRITE32(CSRNG_CMD_REQ_REG_OFFSET,
303 0x00005003 | kMultiBitBool4False << 8);
307 TEST_F(CommandTest, GenerateBadArgs) {
312 TEST_F(CommandTest, GenerateOutOfRange) {
316 kGenerateLenOutOfRange = 0x800 * 4 + 1,
322 TEST_F(CommandTest, UninstantiateOk) {
323 EXPECT_READ32(CSRNG_SW_CMD_STS_REG_OFFSET,
324 {{CSRNG_SW_CMD_STS_CMD_RDY_BIT,
true}});
325 EXPECT_WRITE32(CSRNG_CMD_REQ_REG_OFFSET,
326 0x00000005 | kMultiBitBool4False << 8);
333 constexpr std::array<uint32_t, 4> kExpected = {
340 EXPECT_READ32(CSRNG_GENBITS_VLD_REG_OFFSET,
342 {CSRNG_GENBITS_VLD_GENBITS_VLD_BIT,
true},
344 for (
const uint32_t val : kExpected) {
345 EXPECT_READ32(CSRNG_GENBITS_REG_OFFSET, val);
348 std::vector<uint32_t> got(
kExpected.size());
350 EXPECT_THAT(got, testing::ElementsAreArray(kExpected));
353 TEST_F(GenerateEndTest, ReadBadArgs) {
365 EXPECT_WRITE32(CSRNG_INT_STATE_NUM_REG_OFFSET,
367 {CSRNG_INT_STATE_NUM_INT_STATE_NUM_OFFSET,
368 static_cast<uint32_t
>(instance_id)},
370 EXPECT_READ32(CSRNG_INT_STATE_NUM_REG_OFFSET,
372 {CSRNG_INT_STATE_NUM_INT_STATE_NUM_OFFSET,
373 static_cast<uint32_t
>(instance_id)},
379 .key = {1, 2, 3, 4, 5, 6, 7, 8},
380 .instantiated =
true,
381 .fips_compliance =
true,
383 EXPECT_READ32(CSRNG_INT_STATE_VAL_REG_OFFSET, expected.reseed_counter);
384 for (
size_t i = 0; i < 4; ++i) {
385 EXPECT_READ32(CSRNG_INT_STATE_VAL_REG_OFFSET, expected.v[i]);
387 for (
size_t i = 0; i < 8; ++i) {
388 EXPECT_READ32(CSRNG_INT_STATE_VAL_REG_OFFSET, expected.key[i]);
390 EXPECT_READ32(CSRNG_INT_STATE_VAL_REG_OFFSET, 3);
396 EXPECT_THAT(got.
key, ElementsAreArray(expected.key));
397 EXPECT_THAT(got.
v, ElementsAreArray(expected.v));
402 TEST_F(GetInternalStateTest, BadIntStateNumWrite) {
403 EXPECT_WRITE32(CSRNG_INT_STATE_NUM_REG_OFFSET,
405 {CSRNG_INT_STATE_NUM_INT_STATE_NUM_OFFSET,
408 EXPECT_READ32(CSRNG_INT_STATE_NUM_REG_OFFSET,
410 {CSRNG_INT_STATE_NUM_INT_STATE_NUM_OFFSET, 0},
419 TEST_F(GetInternalStateTest, GetInternalStateBadArgs) {
432 uint32_t reseed_counter;
435 (CSRNG_RESEED_COUNTER_0_REG_OFFSET + ((uint32_t)(instance_id) << 2)), 0);
440 TEST_F(GetReseedCounterTest, GetReseedCounterBadArgs) {
461 TEST_F(LockTest, Lock) {
462 EXPECT_WRITE32(CSRNG_REGWEN_REG_OFFSET, 0);
466 TEST_F(LockTest, IsLocked) {
469 EXPECT_READ32(CSRNG_REGWEN_REG_OFFSET, 1);
473 EXPECT_READ32(CSRNG_REGWEN_REG_OFFSET, 0);
482 TEST_F(StopTest, Stop) {
483 EXPECT_READ32(CSRNG_REGWEN_REG_OFFSET, 1);
484 EXPECT_WRITE32(CSRNG_CTRL_REG_OFFSET, CSRNG_CTRL_REG_RESVAL);
488 TEST_F(StopTest, Locked) {
489 EXPECT_READ32(CSRNG_REGWEN_REG_OFFSET, 0);
502 TEST_F(AlertTest, Get) {
504 EXPECT_READ32(CSRNG_RECOV_ALERT_STS_REG_OFFSET,
506 {CSRNG_RECOV_ALERT_STS_ENABLE_FIELD_ALERT_BIT,
true},
507 {CSRNG_RECOV_ALERT_STS_CS_BUS_CMP_ALERT_BIT,
true},
514 TEST_F(AlertTest, Clear) {
515 EXPECT_WRITE32(CSRNG_RECOV_ALERT_STS_REG_OFFSET, 0);