13 #include "gmock/gmock.h"
14 #include "gtest/gtest.h"
16 #include "sw/device/lib/base/mock_mmio.h"
19 #include "kmac_regs.h"
28 std::ostream &operator<<(std::ostream &os,
31 <<
" .squeezing = " << params.
squeezing <<
",\n"
32 <<
" .append_d = " << params.
append_d <<
",\n"
33 <<
" .offset = " << params.
offset <<
",\n"
34 <<
" .r = " << params.
r <<
",\n"
35 <<
" .d = " << params.
d <<
",\n"
39 namespace dif_kmac_unittest {
41 using ::testing::ElementsAre;
42 using testing::ElementsAreArray;
44 TEST(CustomizationStringTest, Encode) {
48 EXPECT_THAT(std::string(&cs.
buffer[0], 2), ElementsAre(1, 0));
51 EXPECT_THAT(std::string(&cs.
buffer[0], 2), ElementsAre(1, 0));
54 EXPECT_THAT(std::string(&cs.
buffer[0], 2), ElementsAre(1, 16));
55 EXPECT_THAT(std::string(&cs.
buffer[2], 2), ElementsAre(0, 0));
58 EXPECT_THAT(std::string(&cs.
buffer[0], 2), ElementsAre(1, 40));
59 EXPECT_EQ(std::string(&cs.
buffer[2], 5),
"SHA-3");
65 "encoding needs to be updated");
66 EXPECT_THAT(std::string(&cs.
buffer[0], 3), ElementsAre(2, 1, 0));
67 EXPECT_EQ(std::string(&cs.
buffer[3], max.size()), max);
70 TEST(CustomizationStringTest, BadArg) {
80 TEST(FunctionNameTest, Encode) {
84 EXPECT_THAT(std::string(&fn.
buffer[0], 2), ElementsAre(1, 0));
87 EXPECT_THAT(std::string(&fn.
buffer[0], 2), ElementsAre(1, 0));
90 EXPECT_THAT(std::string(&fn.
buffer[0], 2), ElementsAre(1, 16));
91 EXPECT_THAT(std::string(&fn.
buffer[2], 2), ElementsAre(0, 0));
94 EXPECT_THAT(std::string(&fn.
buffer[0], 2), ElementsAre(1, 32));
95 EXPECT_EQ(std::string(&fn.
buffer[2], 4),
"KMAC");
100 "encoding needs to be updated");
101 EXPECT_THAT(std::string(&fn.
buffer[0], 2), ElementsAre(1, 32));
102 EXPECT_EQ(std::string(&fn.
buffer[2], max.size()), max);
105 TEST(FunctionNameTest, BadArg) {
131 static constexpr std::array<uint8_t, 17> kMsg = {
132 0xa7, 0x48, 0x47, 0x93, 0x0a, 0x03, 0xab, 0xee, 0xa4,
133 0x73, 0xe1, 0xf3, 0xdc, 0x30, 0xb8, 0x88, 0x15};
137 uint8_t key_strength = KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L256;
138 uint8_t mode = KMAC_CFG_SHADOWED_MODE_VALUE_CSHAKE;
139 bool msg_big_endian =
false;
140 bool state_big_endian =
false;
141 bool sideload =
false;
142 uint8_t entropy_mode = KMAC_CFG_SHADOWED_ENTROPY_MODE_VALUE_IDLE_MODE;
143 bool entropy_fast_process =
false;
144 bool msg_mask =
false;
145 bool entropy_ready =
false;
146 bool enable_unsupported_mode_strength =
false;
147 uint16_t entropy_hash_threshold = 0;
148 uint16_t entropy_wait_timer = 0;
149 uint16_t entropy_prescaler = 0;
161 for (
size_t i = 0; i < size; ++i) {
162 EXPECT_WRITE8(KMAC_MSG_FIFO_REG_OFFSET, message[i]);
175 size_t remaining = size;
176 size_t unalignment = ((uintptr_t)message) %
sizeof(uint32_t);
179 unalignment =
sizeof(uint32_t) - unalignment;
181 message += unalignment;
182 remaining -= unalignment;
186 while (remaining >=
sizeof(uint32_t)) {
188 memcpy(&word, message,
sizeof(uint32_t));
189 EXPECT_WRITE32(KMAC_MSG_FIFO_REG_OFFSET, word);
190 remaining -=
sizeof(uint32_t);
191 message +=
sizeof(uint32_t);
200 void ExpectConfig(
void) {
201 EXPECT_WRITE32_SHADOWED(
202 KMAC_CFG_SHADOWED_REG_OFFSET,
203 {{KMAC_CFG_SHADOWED_KMAC_EN_BIT, config_reg_.enable},
204 {KMAC_CFG_SHADOWED_KSTRENGTH_OFFSET, config_reg_.key_strength},
205 {KMAC_CFG_SHADOWED_MODE_OFFSET, config_reg_.mode},
206 {KMAC_CFG_SHADOWED_MSG_ENDIANNESS_BIT, config_reg_.msg_big_endian},
207 {KMAC_CFG_SHADOWED_STATE_ENDIANNESS_BIT, config_reg_.state_big_endian},
208 {KMAC_CFG_SHADOWED_SIDELOAD_BIT, config_reg_.sideload},
209 {KMAC_CFG_SHADOWED_ENTROPY_MODE_OFFSET, config_reg_.entropy_mode},
210 {KMAC_CFG_SHADOWED_ENTROPY_FAST_PROCESS_BIT,
211 config_reg_.entropy_fast_process},
212 {KMAC_CFG_SHADOWED_MSG_MASK_BIT, config_reg_.msg_mask},
213 {KMAC_CFG_SHADOWED_ENTROPY_READY_BIT, config_reg_.entropy_ready},
214 {KMAC_CFG_SHADOWED_EN_UNSUPPORTED_MODESTRENGTH_BIT,
215 config_reg_.enable_unsupported_mode_strength}});
219 std::map<dif_kmac_key_length_t, uint32_t> key_size_map = {
227 EXPECT_WRITE32(KMAC_KEY_LEN_REG_OFFSET, key_size_map[key.length]);
228 for (uint32_t i = 0; i <
ARRAYSIZE(key.share0); ++i) {
229 ptrdiff_t offset = KMAC_KEY_SHARE0_0_REG_OFFSET + (i *
sizeof(uint32_t));
230 EXPECT_WRITE32(offset, key.share0[i]);
231 offset = KMAC_KEY_SHARE1_0_REG_OFFSET + (i *
sizeof(uint32_t));
232 EXPECT_WRITE32(offset, key.share1[i]);
236 void ExpectPrefix(
const uint32_t *prefix_regs, uint32_t size) {
237 for (uint32_t i = 0; i < size; ++i) {
238 ptrdiff_t offset = KMAC_PREFIX_0_REG_OFFSET + i *
sizeof(uint32_t);
239 EXPECT_WRITE32(offset, prefix_regs[i]);
243 void ExpectEntropySeed(
const uint32_t *seed) {
245 EXPECT_WRITE32(KMAC_ENTROPY_SEED_REG_OFFSET, seed[i]);
249 uint32_t GetRateBits(uint32_t security_level) {
255 return 1600 - 2 * security_level;
258 uint32_t GetRateWords(uint32_t security_level) {
259 return GetRateBits(security_level) / 32;
266 .share0 = {0x43424140, 0x47464544, 0x4B4A4948, 0x4F4E4D4C, 0x53525150,
267 0x57565554, 0x5B5A5958, 0x5F5E5D5C},
275 const std::string
string =
"My Tagged Application";
277 string.c_str(),
string.size(), &custom_string_));
278 config_reg_.enable =
true;
279 config_reg_.mode = KMAC_CFG_SHADOWED_MODE_VALUE_CSHAKE;
286 std::string prefix_str(
"\001 KMAC\001");
292 prefix_str[prefix_str.size() - 1] |= s.
buffer[0] & 0xFF;
293 prefix_str.push_back(s.
buffer[1] & 0xFF);
297 std::vector<uint32_t> prefix_regs(11, 0);
298 memcpy(prefix_regs.data(), prefix_str.data(), prefix_str.size());
299 KmacTest::ExpectPrefix(prefix_regs.data(), prefix_regs.size());
304 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT,
true}});
306 EXPECT_READ32(KMAC_CFG_SHADOWED_REG_OFFSET, 0);
308 ExpectPrefix(custom_string_);
309 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
310 {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_START}});
311 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_ABSORB_BIT,
true}});
316 EXPECT_EQ(op_state_.
append_d,
true);
317 EXPECT_EQ(op_state_.
offset, 0);
318 EXPECT_EQ(op_state_.
r, GetRateWords(256));
319 EXPECT_EQ(op_state_.
d, 0);
322 TEST_F(Kmac256Test, StartBadArg) {
324 &key_, &custom_string_));
331 &key_, &custom_string_));
335 &key_, &custom_string_));
338 nullptr, &custom_string_));
342 &key_, &custom_string_));
345 TEST_F(Kmac256Test, StartError) {
346 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT,
false}});
357 config_reg_.mode = KMAC_CFG_SHADOWED_MODE_VALUE_SHA3;
358 config_reg_.key_strength = KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L224;
363 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT,
true}});
364 EXPECT_READ32(KMAC_CFG_SHADOWED_REG_OFFSET,
365 {{KMAC_CFG_SHADOWED_KMAC_EN_BIT,
false}});
367 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
368 {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_START}});
369 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_ABSORB_BIT,
true}});
374 TEST_F(Sha3_224Test, StartBadArg) {
383 TEST_F(Sha3_224Test, StartError) {
385 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT,
false}});
395 config_reg_.mode = KMAC_CFG_SHADOWED_MODE_VALUE_SHAKE;
396 config_reg_.key_strength = KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L128;
401 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT,
true}});
402 EXPECT_READ32(KMAC_CFG_SHADOWED_REG_OFFSET,
403 {{KMAC_CFG_SHADOWED_KMAC_EN_BIT,
false}});
405 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
406 {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_START}});
407 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_ABSORB_BIT,
true}});
412 TEST_F(Shake128Test, StartBadArg) {
421 TEST_F(Shake128Test, StartError) {
422 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT,
false}});
433 const std::string
string =
"My Application";
435 string.c_str(),
string.size(), &custom_str_));
437 const std::string kFunctionName =
"Foo";
439 kFunctionName.c_str(), kFunctionName.size(), &func_name_));
441 config_reg_.mode = KMAC_CFG_SHADOWED_MODE_VALUE_CSHAKE;
442 config_reg_.key_strength = KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L256;
447 std::vector<uint8_t> prefixData;
448 if (func_name_.
length == 0) {
450 prefixData.push_back(1);
451 prefixData.push_back(0);
453 prefixData.insert(prefixData.end(), func_name_.
buffer,
459 prefixData.push_back(1);
460 prefixData.push_back(0);
465 std::vector<uint32_t> prefixRegs(11, 0);
466 memcpy(prefixRegs.data(), prefixData.data(), prefixData.size());
467 KmacTest::ExpectPrefix(prefixRegs.data(), prefixRegs.size());
472 EXPECT_EQ(op_state_.
append_d,
false);
473 EXPECT_EQ(op_state_.
offset, 0);
474 EXPECT_EQ(op_state_.
d, 0);
475 EXPECT_EQ(op_state_.
r, GetRateWords(256));
480 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT,
true}});
481 EXPECT_READ32(KMAC_CFG_SHADOWED_REG_OFFSET,
482 {{KMAC_CFG_SHADOWED_KMAC_EN_BIT,
false}});
484 ExpectPrefix(custom_str_);
485 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
486 {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_START}});
487 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_ABSORB_BIT,
true}});
490 &func_name_, &custom_str_));
491 CheckOperationState(op_state_);
494 TEST_F(Cshake256Test, StartNoFuncNameSuccess) {
495 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT,
true}});
496 EXPECT_READ32(KMAC_CFG_SHADOWED_REG_OFFSET,
497 {{KMAC_CFG_SHADOWED_KMAC_EN_BIT,
false}});
499 func_name_.length = 0;
500 ExpectPrefix(custom_str_);
501 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
502 {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_START}});
503 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_ABSORB_BIT,
true}});
507 CheckOperationState(op_state_);
510 TEST_F(Cshake256Test, StartNoCustomStrSuccess) {
511 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT,
true}});
512 EXPECT_READ32(KMAC_CFG_SHADOWED_REG_OFFSET,
513 {{KMAC_CFG_SHADOWED_KMAC_EN_BIT,
false}});
515 custom_str_.length = 0;
516 ExpectPrefix(custom_str_);
517 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
518 {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_START}});
519 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_ABSORB_BIT,
true}});
522 &func_name_,
nullptr));
523 CheckOperationState(op_state_);
530 TEST_F(Cshake256Test, StartFallbackToShakeSuccess) {
531 config_reg_.mode = KMAC_CFG_SHADOWED_MODE_VALUE_SHAKE;
533 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT,
true}});
534 EXPECT_READ32(KMAC_CFG_SHADOWED_REG_OFFSET,
535 {{KMAC_CFG_SHADOWED_KMAC_EN_BIT,
false}});
537 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
538 {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_START}});
539 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_ABSORB_BIT,
true}});
544 TEST_F(Cshake256Test, StartBadArg) {
546 &func_name_, &custom_str_));
549 &func_name_, &custom_str_));
553 &func_name_, &custom_str_));
559 TEST_F(Cshake256Test, StartError) {
560 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT,
false}});
566 constexpr std::array<uint8_t, 17> KmacTest::kMsg;
575 static_assert(kMsg.size() <= KMAC_PARAM_NUM_ENTRIES_MSG_FIFO *
576 KMAC_PARAM_NUM_BYTES_MSG_FIFO_ENTRY,
577 "Message must fit in the KMAC message FIFO.");
579 uint8_t buffer[kMsg.size() +
sizeof(uint32_t)];
581 for (
size_t i = 0; i <
sizeof(uint32_t); i++) {
582 uint8_t *pMsg = &buffer[i];
583 std::copy(kMsg.begin(), kMsg.end(), pMsg);
586 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, 1 << KMAC_STATUS_SHA3_ABSORB_BIT);
590 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, 1 << KMAC_STATUS_SHA3_ABSORB_BIT);
591 ExpectMessageInt32(pMsg, kMsg.size());
601 EXPECT_READ32(KMAC_CFG_REGWEN_REG_OFFSET, 0);
608 TEST_F(ConfigLock, Unlocked) {
609 EXPECT_READ32(KMAC_CFG_REGWEN_REG_OFFSET, 1);
616 TEST_F(ConfigLock, BadArg) {
628 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_SQUEEZE_BIT,
true}});
629 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
630 {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_DONE}});
635 EXPECT_EQ(op_state_.
append_d,
false);
636 EXPECT_EQ(op_state_.
offset, 0);
637 EXPECT_EQ(op_state_.
r, 0);
638 EXPECT_EQ(op_state_.
d, 0);
641 TEST_F(KmacEndTest, BadArg) {
647 TEST_F(KmacEndTest, Error) {
656 .entropy_fast_process =
false,
657 .entropy_seed = {0xb153e3fe, 0x09596819, 0x3e85a6e8, 0xb6dcdaba,
658 0x50dc409c, 0x11e1ebd1},
659 .entropy_hash_threshold = 0x03ff,
660 .entropy_wait_timer = 0xffff,
661 .entropy_prescaler = 0x03ff,
662 .message_big_endian =
false,
663 .output_big_endian =
false,
675 config_reg_.sideload = kmac_config_.
sideload;
676 config_reg_.key_strength = 0;
677 config_reg_.mode = 0;
678 config_reg_.msg_mask = kmac_config_.
msg_mask;
683 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT,
true}});
685 KMAC_ENTROPY_PERIOD_REG_OFFSET,
686 {{KMAC_ENTROPY_PERIOD_PRESCALER_OFFSET, kmac_config_.entropy_prescaler},
687 {KMAC_ENTROPY_PERIOD_WAIT_TIMER_OFFSET,
688 kmac_config_.entropy_wait_timer}});
689 EXPECT_WRITE32_SHADOWED(
690 KMAC_ENTROPY_REFRESH_THRESHOLD_SHADOWED_REG_OFFSET,
691 {{KMAC_ENTROPY_REFRESH_THRESHOLD_SHADOWED_THRESHOLD_OFFSET,
692 kmac_config_.entropy_hash_threshold}});
694 ExpectEntropySeed(kmac_config_.entropy_seed);
698 TEST_F(KmacConfigureTest, BadArg) {
704 TEST_F(KmacConfigureTest, Locked) {
705 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT,
false}});
715 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT,
true},
716 {KMAC_STATUS_FIFO_EMPTY_BIT,
true}});
720 EXPECT_EQ(status_.fifo_depth, 0);
725 TEST_F(KmacStatusTest, AbsorbingFifoPartialSuccess) {
726 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_ABSORB_BIT,
true},
727 {KMAC_STATUS_FIFO_DEPTH_OFFSET,
728 KMAC_PARAM_NUM_ENTRIES_MSG_FIFO}});
732 EXPECT_EQ(status_.fifo_depth, KMAC_PARAM_NUM_ENTRIES_MSG_FIFO);
737 TEST_F(KmacStatusTest, SqueezingFifoFullSuccess) {
738 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_SQUEEZE_BIT,
true},
739 {KMAC_STATUS_FIFO_DEPTH_OFFSET, 15},
740 {KMAC_STATUS_FIFO_FULL_BIT,
true}});
744 EXPECT_EQ(status_.fifo_depth, 15);
749 TEST_F(KmacStatusTest, AbsorbingFifoFullFatalFault) {
750 EXPECT_READ32(KMAC_STATUS_REG_OFFSET,
751 {{KMAC_STATUS_SHA3_ABSORB_BIT,
true},
752 {KMAC_STATUS_FIFO_DEPTH_OFFSET, 5},
753 {KMAC_STATUS_FIFO_FULL_BIT,
true},
754 {KMAC_STATUS_ALERT_FATAL_FAULT_BIT,
true}});
758 EXPECT_EQ(status_.fifo_depth, 5);
763 TEST_F(KmacStatusTest, AbsorbingFifoFullUpdateError) {
764 EXPECT_READ32(KMAC_STATUS_REG_OFFSET,
765 {{KMAC_STATUS_SHA3_ABSORB_BIT,
true},
766 {KMAC_STATUS_FIFO_DEPTH_OFFSET, 2},
767 {KMAC_STATUS_FIFO_FULL_BIT,
true},
768 {KMAC_STATUS_ALERT_RECOV_CTRL_UPDATE_ERR_BIT,
true}});
772 EXPECT_EQ(status_.fifo_depth, 2);
777 TEST_F(KmacStatusTest, BadArg) {
784 static constexpr std::array<dif_kmac_error_t, 14> kErrors = {
791 kDifErrorUnexpectedModeStrength,
792 kDifErrorIncorrectFunctionName,
793 kDifErrorSoftwareCommandSequence,
794 kDifErrorSoftwareHashingWithoutEntropyReady,
796 kDifErrorPackerIntegrity,
797 kDifErrorMsgFifoIntegrity,
803 constexpr std::array<dif_kmac_error_t, 14> KmacGetErrorTest::kErrors;
806 for (
auto err : kErrors) {
807 uint32_t reg = err << 24 | 0x500bad;
808 EXPECT_READ32(KMAC_ERR_CODE_REG_OFFSET, reg);
810 EXPECT_EQ(error_, err);
811 EXPECT_EQ(info_, 0x500bad);
815 TEST_F(KmacGetErrorTest, BadArg) {
829 EXPECT_READ32(KMAC_ENTROPY_REFRESH_HASH_CNT_REG_OFFSET,
830 {{KMAC_PARAM_HASH_CNT_W, 0}});
834 TEST_F(KmacGetHashCounterTest, BadArg) {
850 uint32_t out_buffer_[8];
852 static constexpr std::array<std::array<uint32_t, 64>, 2> kOutShares = {
853 {{0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0x5AA5A55A, 0x5AA5A55A,
854 0x5AA5A55A, 0x5AA5A55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A,
855 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A, 0xA55AA55A, 0xA55AA55A,
856 0xA55AA55A, 0xA55AA55A, 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A,
857 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0x5AA5A55A, 0x5AA5A55A,
858 0x5AA5A55A, 0x5AA5A55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A,
859 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A, 0xA55AA55A, 0xA55AA55A,
860 0xA55AA55A, 0xA55AA55A, 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A,
861 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0x5AA5A55A, 0x5AA5A55A,
862 0x5AA5A55A, 0x5AA5A55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A,
863 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A},
864 {0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0x5AA5A55A, 0x5AA5A55A,
865 0x5AA5A55A, 0x5AA5A55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A,
866 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A, 0xA55AA55A, 0xA55AA55A,
867 0xA55AA55A, 0xA55AA55A, 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A,
868 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0x5AA5A55A, 0x5AA5A55A,
869 0x5AA5A55A, 0x5AA5A55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A,
870 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A, 0xA55AA55A, 0xA55AA55A,
871 0xA55AA55A, 0xA55AA55A, 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A,
872 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0x5AA5A55A, 0x5AA5A55A,
873 0x5AA5A55A, 0x5AA5A55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A, 0xA55AA55A,
874 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A, 0x5AA5A55A}}};
877 op_state_.
r = GetRateWords(256);
882 void ExpectAppendSize() {
883 uint32_t d = op_state_.
d *
sizeof(uint32_t) * 8;
884 uint8_t len = 1 + (d > 0xFF) + (d > 0xFFFF) + (d > 0xFFFFFF);
885 uint8_t shift = len * 8;
888 EXPECT_WRITE8(KMAC_MSG_FIFO_REG_OFFSET, (d >> shift) & 0xFF);
890 EXPECT_WRITE8(KMAC_MSG_FIFO_REG_OFFSET, len & 0xFF);
893 void ExpectReadOutput(
const uint32_t *share1,
const uint32_t *share2,
895 uint32_t offset = KMAC_STATE_REG_OFFSET;
896 for (
size_t i = 0; i < len; ++i) {
898 EXPECT_READ32(offset, share1[i]);
899 EXPECT_READ32(offset + 0x100, share2[i]);
900 offset +=
sizeof(uint32_t);
904 constexpr std::array<std::array<uint32_t, 64>, 2> KmacSqueezeTest::kOutShares;
907 uint32_t out_buffer[64];
910 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
911 {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_PROCESS}});
912 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_SQUEEZE_BIT,
true}});
913 ExpectReadOutput(kOutShares[0].data(), kOutShares[1].data(), 34);
914 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
915 {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_RUN}});
916 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_SQUEEZE_BIT,
true}});
917 ExpectReadOutput(&kOutShares[0].data()[34], &kOutShares[1].data()[34],
918 kOutShares[0].size() - 34);
921 ARRAYSIZE(out_buffer),
nullptr,
nullptr));
923 EXPECT_EQ(op_state_, expected_op_state_);
925 std::array<uint32_t,
ARRAYSIZE(out_buffer)> out;
926 for (
size_t i = 0; i < out.size(); i++) {
927 out[i] = kOutShares[0][i] ^ kOutShares[1][i];
929 EXPECT_THAT(out_buffer, ElementsAreArray(out));
932 TEST_F(KmacSqueezeTest, FillOutBufferSuccess) {
934 expected_op_state_.d =
ARRAYSIZE(out_buffer_);
935 expected_op_state_.offset = 8;
937 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
938 {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_PROCESS}});
939 EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_SQUEEZE_BIT,
true}});
940 ExpectReadOutput(kOutShares[0].data(), kOutShares[1].data(),
944 ARRAYSIZE(out_buffer_),
nullptr,
nullptr));
946 EXPECT_EQ(op_state_, expected_op_state_);
948 std::array<uint32_t,
ARRAYSIZE(out_buffer_)> out;
949 for (
size_t i = 0; i < out.size(); i++) {
950 out[i] = kOutShares[0][i] ^ kOutShares[1][i];
952 EXPECT_THAT(out_buffer_, ElementsAreArray(out));
955 TEST_F(KmacSqueezeTest, AppendSizeSuccess) {
958 expected_op_state_.append_d =
true;
959 expected_op_state_.d =
ARRAYSIZE(out_buffer_);
960 expected_op_state_.r = GetRateWords(256);
961 expected_op_state_.offset = 0;
964 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
965 {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_PROCESS}});
969 EXPECT_EQ(op_state_, expected_op_state_);
972 TEST_F(KmacSqueezeTest, JustProcessSuccess) {
973 expected_op_state_.d = 0;
974 expected_op_state_.r = GetRateWords(256);
975 expected_op_state_.offset = 0;
976 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
977 {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_PROCESS}});
981 EXPECT_EQ(op_state_, expected_op_state_);
982 EXPECT_EQ(op_state_.
d, 0);
985 TEST_F(KmacSqueezeTest, BadArg) {
987 ARRAYSIZE(out_buffer_),
nullptr,
nullptr));
989 ARRAYSIZE(out_buffer_),
nullptr,
nullptr));
991 ARRAYSIZE(out_buffer_),
nullptr,
nullptr));
994 TEST_F(KmacSqueezeTest, StarteMachineError) {
996 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
997 {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_PROCESS}});
1000 ARRAYSIZE(out_buffer_),
nullptr,
nullptr),
1004 TEST_F(KmacSqueezeTest, RequestLessDataThanFixedLenError) {
1007 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
1008 {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_PROCESS}});
1009 EXPECT_READ32(KMAC_STATUS_REG_OFFSET,
1010 {{KMAC_STATUS_SHA3_SQUEEZE_BIT,
false}});
1011 EXPECT_READ32(KMAC_INTR_STATE_REG_OFFSET,
1012 {{KMAC_INTR_STATE_KMAC_ERR_BIT,
true}});
1015 ARRAYSIZE(out_buffer_),
nullptr,
nullptr),
1022 EXPECT_WRITE32(KMAC_CMD_REG_OFFSET, {{KMAC_CMD_ERR_PROCESSED_BIT,
true}});
1025 EXPECT_EQ(op_state_.
append_d,
false);
1026 EXPECT_EQ(op_state_.
offset, 0);
1027 EXPECT_EQ(op_state_.
r, 0);
1028 EXPECT_EQ(op_state_.
d, 0);
1031 TEST_F(KmacResetTest, BadArg) {