5 #include "sw/device/silicon_creator/lib/drivers/kmac.h"
9 #include "gtest/gtest.h"
10 #include "sw/device/lib/base/mock_abs_mmio.h"
11 #include "sw/device/silicon_creator/testing/rom_test.h"
14 #include "kmac_regs.h"
16 namespace kmac_unittest {
18 using ::testing::ElementsAreArray;
30 static_assert(KMAC_STATUS_SHA3_IDLE_BIT < 3,
"");
31 static_assert(KMAC_STATUS_SHA3_ABSORB_BIT < 3,
"");
32 static_assert(KMAC_STATUS_SHA3_SQUEEZE_BIT < 3,
"");
35 uint32_t other_status_flag1 = (flag + 1) % 3;
36 uint32_t other_status_flag2 = (flag + 2) % 3;
40 EXPECT_ABS_READ32(base_ + KMAC_INTR_STATE_REG_OFFSET, 0);
41 EXPECT_ABS_READ32(base_ + KMAC_STATUS_REG_OFFSET, 0);
42 EXPECT_ABS_READ32(base_ + KMAC_INTR_STATE_REG_OFFSET,
43 1 << KMAC_INTR_STATE_KMAC_DONE_BIT);
44 EXPECT_ABS_READ32(base_ + KMAC_STATUS_REG_OFFSET, 1 << other_status_flag1);
45 EXPECT_ABS_READ32(base_ + KMAC_INTR_STATE_REG_OFFSET,
46 1 << KMAC_INTR_STATE_FIFO_EMPTY_BIT);
47 EXPECT_ABS_READ32(base_ + KMAC_STATUS_REG_OFFSET, 1 << other_status_flag2);
51 EXPECT_ABS_READ32(base_ + KMAC_INTR_STATE_REG_OFFSET,
52 1 << KMAC_INTR_STATE_KMAC_ERR_BIT);
53 EXPECT_ABS_READ32(base_ + KMAC_STATUS_REG_OFFSET, 1 << flag);
56 EXPECT_ABS_READ32(base_ + KMAC_INTR_STATE_REG_OFFSET, 0);
57 EXPECT_ABS_READ32(base_ + KMAC_STATUS_REG_OFFSET, 1 << flag);
66 EXPECT_ABS_WRITE32(base_ + KMAC_CMD_REG_OFFSET, cmd << KMAC_CMD_CMD_OFFSET);
69 const size_t shake256_rate_words_ = (1600 - 512) / 32;
70 const uint32_t share0_addr_ = base_ + KMAC_STATE_REG_OFFSET;
71 const uint32_t share1_addr_ =
72 base_ + KMAC_STATE_REG_OFFSET + (KMAC_STATE_SIZE_BYTES / 2);
73 rom_test::MockAbsMmio abs_mmio_;
79 ExpectPollState(KMAC_STATUS_SHA3_IDLE_BIT,
false);
81 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_PERIOD_REG_OFFSET,
82 (KMAC_ENTROPY_PERIOD_WAIT_TIMER_MASK
83 << KMAC_ENTROPY_PERIOD_WAIT_TIMER_OFFSET) |
84 (KMAC_ENTROPY_PERIOD_PRESCALER_MASK
85 << KMAC_ENTROPY_PERIOD_PRESCALER_OFFSET));
89 (KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L256
90 << KMAC_CFG_SHADOWED_KSTRENGTH_OFFSET) |
91 (KMAC_CFG_SHADOWED_MODE_VALUE_SHAKE << KMAC_CFG_SHADOWED_MODE_OFFSET) |
92 (KMAC_CFG_SHADOWED_ENTROPY_MODE_VALUE_SW_MODE
93 << KMAC_CFG_SHADOWED_ENTROPY_MODE_OFFSET) |
94 (1 << KMAC_CFG_SHADOWED_ENTROPY_READY_BIT) |
95 (1 << KMAC_CFG_SHADOWED_MSG_MASK_BIT) |
96 (1 << KMAC_CFG_SHADOWED_SIDELOAD_BIT);
98 EXPECT_ABS_WRITE32_SHADOWED(base_ + KMAC_CFG_SHADOWED_REG_OFFSET, cfg);
99 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0x5d2a3764);
100 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0x37d3ecba);
101 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0xe1859094);
102 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0xb153e3fe);
103 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0x09596819);
104 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0x3e85a6e8);
105 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0xb6dcdaba);
106 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0x50dc409c);
107 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0x11e1ebd1);
109 EXPECT_EQ(kmac_keymgr_configure(), kErrorOk);
112 TEST_F(ConfigureTest, Success) {
113 ExpectPollState(KMAC_STATUS_SHA3_IDLE_BIT,
false);
115 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_PERIOD_REG_OFFSET,
116 (KMAC_ENTROPY_PERIOD_WAIT_TIMER_MASK
117 << KMAC_ENTROPY_PERIOD_WAIT_TIMER_OFFSET) |
118 (KMAC_ENTROPY_PERIOD_PRESCALER_MASK
119 << KMAC_ENTROPY_PERIOD_PRESCALER_OFFSET));
123 (KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L256
124 << KMAC_CFG_SHADOWED_KSTRENGTH_OFFSET) |
125 (KMAC_CFG_SHADOWED_MODE_VALUE_SHAKE << KMAC_CFG_SHADOWED_MODE_OFFSET) |
126 (KMAC_CFG_SHADOWED_ENTROPY_MODE_VALUE_SW_MODE
127 << KMAC_CFG_SHADOWED_ENTROPY_MODE_OFFSET) |
128 (1 << KMAC_CFG_SHADOWED_ENTROPY_READY_BIT);
130 EXPECT_ABS_WRITE32_SHADOWED(base_ + KMAC_CFG_SHADOWED_REG_OFFSET, cfg);
131 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0x5d2a3764);
132 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0x37d3ecba);
133 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0xe1859094);
134 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0xb153e3fe);
135 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0x09596819);
136 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0x3e85a6e8);
137 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0xb6dcdaba);
138 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0x50dc409c);
139 EXPECT_ABS_WRITE32(base_ + KMAC_ENTROPY_SEED_REG_OFFSET, 0x11e1ebd1);
141 EXPECT_EQ(kmac_shake256_configure(), kErrorOk);
144 TEST_F(ConfigureTest, Failure) {
145 ExpectPollState(KMAC_STATUS_SHA3_IDLE_BIT,
true);
146 EXPECT_EQ(kmac_shake256_configure(), kErrorKmacInvalidStatus);
152 ExpectPollState(KMAC_STATUS_SHA3_IDLE_BIT,
false);
153 ExpectCmdWrite(KMAC_CMD_CMD_VALUE_START);
155 ExpectPollState(KMAC_STATUS_SHA3_ABSORB_BIT,
false);
156 EXPECT_EQ(kmac_shake256_start(), kErrorOk);
159 TEST_F(StartTest, ErrorBeforeStart) {
160 ExpectPollState(KMAC_STATUS_SHA3_IDLE_BIT,
true);
161 EXPECT_EQ(kmac_shake256_start(), kErrorKmacInvalidStatus);
164 TEST_F(StartTest, ErrorAfterStart) {
165 ExpectPollState(KMAC_STATUS_SHA3_IDLE_BIT,
false);
166 ExpectCmdWrite(KMAC_CMD_CMD_VALUE_START);
168 ExpectPollState(KMAC_STATUS_SHA3_ABSORB_BIT,
true);
169 EXPECT_EQ(kmac_shake256_start(), kErrorKmacInvalidStatus);
176 static_assert(2 *
sizeof(uint32_t) <= KMAC_STATUS_FIFO_DEPTH_MASK,
177 "Message FIFO is too small.");
179 std::array<uint32_t, 2> test_data = {0x12345678, 0xabcdef01};
182 EXPECT_ABS_WRITE32(base_ + KMAC_MSG_FIFO_REG_OFFSET, test_data[0]);
183 EXPECT_ABS_WRITE32(base_ + KMAC_MSG_FIFO_REG_OFFSET, test_data[1]);
185 kmac_shake256_absorb((
unsigned char *)test_data.data(),
186 test_data.size() *
sizeof(uint32_t));
189 TEST_F(AbsorbTest, Empty) { kmac_shake256_absorb(NULL, 0); }
191 TEST_F(AbsorbTest, ExtraSpace) {
192 std::array<uint32_t, 3> test_data = {0x12345678, 0xabcdef01, 0x02030405};
195 EXPECT_ABS_WRITE32(base_ + KMAC_MSG_FIFO_REG_OFFSET, test_data[0]);
196 EXPECT_ABS_WRITE32(base_ + KMAC_MSG_FIFO_REG_OFFSET, test_data[1]);
197 EXPECT_ABS_WRITE32(base_ + KMAC_MSG_FIFO_REG_OFFSET, test_data[2]);
199 kmac_shake256_absorb((
unsigned char *)test_data.data(),
200 test_data.size() *
sizeof(uint32_t));
203 TEST_F(AbsorbTest, SmallInput) {
205 static_assert(1 *
sizeof(uint32_t) <= KMAC_STATUS_FIFO_DEPTH_MASK,
206 "Message FIFO is too small.");
208 std::array<uint8_t, 2> test_data = {0x78, 0x56};
212 EXPECT_ABS_WRITE8(base_ + KMAC_MSG_FIFO_REG_OFFSET, test_data[0]);
213 EXPECT_ABS_WRITE8(base_ + KMAC_MSG_FIFO_REG_OFFSET, test_data[1]);
215 kmac_shake256_absorb(test_data.data(), test_data.size());
218 TEST_F(AbsorbTest, UnalignedStart) {
220 static_assert(2 *
sizeof(uint32_t) <= KMAC_STATUS_FIFO_DEPTH_MASK,
221 "Message FIFO is too small.");
225 std::array<uint32_t, 2> data_aligned = {0x12345678, 0xabcdef01};
226 unsigned char *test_data = (
unsigned char *)data_aligned.data() + 1;
227 size_t test_data_len = data_aligned.size() *
sizeof(uint32_t) - 1;
230 EXPECT_ABS_WRITE8(base_ + KMAC_MSG_FIFO_REG_OFFSET, test_data[0]);
231 EXPECT_ABS_WRITE8(base_ + KMAC_MSG_FIFO_REG_OFFSET, test_data[1]);
232 EXPECT_ABS_WRITE8(base_ + KMAC_MSG_FIFO_REG_OFFSET, test_data[2]);
234 EXPECT_ABS_WRITE32(base_ + KMAC_MSG_FIFO_REG_OFFSET, data_aligned[1]);
236 kmac_shake256_absorb(test_data, test_data_len);
239 TEST_F(AbsorbTest, UnalignedStartAndEnd) {
241 static_assert(3 *
sizeof(uint32_t) <= KMAC_STATUS_FIFO_DEPTH_MASK,
242 "Message FIFO is too small.");
246 std::array<uint32_t, 3> data_aligned = {0x12345678, 0xabcdef01, 0x02030405};
247 unsigned char *test_data = (
unsigned char *)data_aligned.data() + 2;
248 size_t test_data_len = data_aligned.size() *
sizeof(uint32_t) - 4;
251 EXPECT_ABS_WRITE8(base_ + KMAC_MSG_FIFO_REG_OFFSET, test_data[0]);
252 EXPECT_ABS_WRITE8(base_ + KMAC_MSG_FIFO_REG_OFFSET, test_data[1]);
254 EXPECT_ABS_WRITE32(base_ + KMAC_MSG_FIFO_REG_OFFSET, data_aligned[1]);
256 EXPECT_ABS_WRITE8(base_ + KMAC_MSG_FIFO_REG_OFFSET,
257 test_data[test_data_len - 2]);
258 EXPECT_ABS_WRITE8(base_ + KMAC_MSG_FIFO_REG_OFFSET,
259 test_data[test_data_len - 1]);
261 kmac_shake256_absorb(test_data, test_data_len);
267 std::array<uint32_t, 3> test_data = {0x12345678, 0xabcdef01, 0x02030405};
270 EXPECT_ABS_WRITE32(base_ + KMAC_MSG_FIFO_REG_OFFSET, test_data[0]);
271 EXPECT_ABS_WRITE32(base_ + KMAC_MSG_FIFO_REG_OFFSET, test_data[1]);
272 EXPECT_ABS_WRITE32(base_ + KMAC_MSG_FIFO_REG_OFFSET, test_data[2]);
274 kmac_shake256_absorb_words(test_data.data(), test_data.size());
277 TEST_F(AbsorbWordsTest, EmptyInput) {
279 kmac_shake256_absorb_words(NULL, 0);
285 std::array<uint32_t, 3> test_data = {0x12345678, 0xabcdef01, 0x02030405};
286 std::array<uint32_t, 3> test_mask = {0xabcdef01, 0x02030405, 0x00000000};
289 ASSERT_LE(test_data.size(), shake256_rate_words_);
291 ExpectPollState(KMAC_STATUS_SHA3_SQUEEZE_BIT,
false);
294 for (
size_t i = 0; i < test_data.size(); i++) {
295 EXPECT_ABS_READ32(share0_addr_ + (i *
sizeof(uint32_t)), test_mask[i]);
296 EXPECT_ABS_READ32(share1_addr_ + (i *
sizeof(uint32_t)),
297 test_data[i] ^ test_mask[i]);
301 ExpectPollState(KMAC_STATUS_SHA3_SQUEEZE_BIT,
false);
302 ExpectCmdWrite(KMAC_CMD_CMD_VALUE_DONE);
304 uint32_t out[test_data.size()];
305 EXPECT_EQ(kmac_shake256_squeeze_end(out, test_data.size()), kErrorOk);
306 EXPECT_THAT(out, ElementsAreArray(test_data));
309 TEST_F(SqueezeTest, SuccessStart) {
310 ExpectCmdWrite(KMAC_CMD_CMD_VALUE_PROCESS);
312 kmac_shake256_squeeze_start();
315 TEST_F(SqueezeTest, StartAndEndEmpty) {
317 ExpectCmdWrite(KMAC_CMD_CMD_VALUE_PROCESS);
318 kmac_shake256_squeeze_start();
321 ExpectPollState(KMAC_STATUS_SHA3_SQUEEZE_BIT,
false);
322 ExpectCmdWrite(KMAC_CMD_CMD_VALUE_DONE);
324 EXPECT_EQ(kmac_shake256_squeeze_end(NULL, 0), kErrorOk);
327 TEST_F(SqueezeTest, StartAndEndNonEmpty) {
328 std::array<uint32_t, 3> test_data = {0x12345678, 0xabcdef01, 0x02030405};
329 std::array<uint32_t, 3> test_mask = {0xabcdef01, 0x02030405, 0x00000000};
332 ASSERT_LE(test_data.size(), shake256_rate_words_);
335 ExpectCmdWrite(KMAC_CMD_CMD_VALUE_PROCESS);
336 kmac_shake256_squeeze_start();
339 ExpectPollState(KMAC_STATUS_SHA3_SQUEEZE_BIT,
false);
340 for (
size_t i = 0; i < test_data.size(); i++) {
341 EXPECT_ABS_READ32(share0_addr_ + (i *
sizeof(uint32_t)), test_mask[i]);
342 EXPECT_ABS_READ32(share1_addr_ + (i *
sizeof(uint32_t)),
343 test_data[i] ^ test_mask[i]);
347 ExpectPollState(KMAC_STATUS_SHA3_SQUEEZE_BIT,
false);
348 ExpectCmdWrite(KMAC_CMD_CMD_VALUE_DONE);
350 uint32_t out[test_data.size()];
351 EXPECT_EQ(kmac_shake256_squeeze_end(out, test_data.size()), kErrorOk);
352 EXPECT_THAT(out, ElementsAreArray(test_data));
355 TEST_F(SqueezeTest, LongOutput) {
358 std::array<uint32_t, 100> test_data;
359 std::array<uint32_t, 100> test_mask;
360 for (
size_t i = 0; i < test_data.size(); i++) {
362 test_mask[i] = test_data.size() - i;
365 ExpectPollState(KMAC_STATUS_SHA3_SQUEEZE_BIT,
false);
369 for (
size_t i = 0; i < shake256_rate_words_; i++) {
370 EXPECT_ABS_READ32(share0_addr_ + i *
sizeof(uint32_t), test_mask[i]);
371 EXPECT_ABS_READ32(share1_addr_ + i *
sizeof(uint32_t),
372 test_data[i] ^ test_mask[i]);
376 ExpectCmdWrite(KMAC_CMD_CMD_VALUE_RUN);
377 ExpectPollState(KMAC_STATUS_SHA3_SQUEEZE_BIT,
false);
381 size_t offset = shake256_rate_words_;
382 for (
size_t i = 0; i < shake256_rate_words_; i++) {
383 EXPECT_ABS_READ32(share0_addr_ + i *
sizeof(uint32_t),
384 test_mask[offset + i]);
385 EXPECT_ABS_READ32(share1_addr_ + i *
sizeof(uint32_t),
386 test_data[offset + i] ^ test_mask[offset + i]);
390 ExpectCmdWrite(KMAC_CMD_CMD_VALUE_RUN);
391 ExpectPollState(KMAC_STATUS_SHA3_SQUEEZE_BIT,
false);
394 offset += shake256_rate_words_;
395 for (
size_t i = 0; i < test_data.size() - (2 * shake256_rate_words_); i++) {
396 EXPECT_ABS_READ32(share0_addr_ + i *
sizeof(uint32_t),
397 test_mask[offset + i]);
398 EXPECT_ABS_READ32(share1_addr_ + i *
sizeof(uint32_t),
399 test_data[offset + i] ^ test_mask[offset + i]);
403 ExpectPollState(KMAC_STATUS_SHA3_SQUEEZE_BIT,
false);
404 ExpectCmdWrite(KMAC_CMD_CMD_VALUE_DONE);
406 uint32_t out[test_data.size()];
407 EXPECT_EQ(kmac_shake256_squeeze_end(out, test_data.size()), kErrorOk);
408 EXPECT_THAT(out, ElementsAreArray(test_data));