[dif, kmac] Add unittests for kmac_sha3
Signed-off-by: Douglas Reis <doreis@lowrisc.org>
diff --git a/sw/device/lib/dif/dif_kmac.c b/sw/device/lib/dif/dif_kmac.c
index 11215a6..058f4d7 100644
--- a/sw/device/lib/dif/dif_kmac.c
+++ b/sw/device/lib/dif/dif_kmac.c
@@ -226,11 +226,6 @@
return kDifBadArg;
}
- // Hardware must be idle to start an operation.
- if (!is_state_idle(kmac)) {
- return kDifError;
- }
-
// Set key strength and calculate rate (r) and digest length (d) in 32-bit
// words.
uint32_t kstrength;
@@ -262,6 +257,12 @@
default:
return kDifBadArg;
}
+
+ // Hardware must be idle to start an operation.
+ if (!is_state_idle(kmac)) {
+ return kDifError;
+ }
+
operation_state->squeezing = false;
operation_state->append_d = false;
diff --git a/sw/device/lib/dif/dif_kmac_unittest.cc b/sw/device/lib/dif/dif_kmac_unittest.cc
index 11f8050..20562b2 100644
--- a/sw/device/lib/dif/dif_kmac_unittest.cc
+++ b/sw/device/lib/dif/dif_kmac_unittest.cc
@@ -300,6 +300,44 @@
kDifError);
}
+class Sha3_224Test : public KmacTest {
+ protected:
+ dif_kmac_mode_sha3_t mode_ = kDifKmacModeSha3Len224;
+
+ Sha3_224Test() {
+ config_reg_.mode = KMAC_CFG_SHADOWED_MODE_VALUE_SHA3;
+ config_reg_.key_strength = KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L224;
+ }
+};
+
+TEST_F(Sha3_224Test, StartSuccess) {
+ EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT, true}});
+ EXPECT_READ32(KMAC_CFG_SHADOWED_REG_OFFSET,
+ {{KMAC_CFG_SHADOWED_KMAC_EN_BIT, false}});
+ ExpectConfig();
+ EXPECT_WRITE32(KMAC_CMD_REG_OFFSET,
+ {{KMAC_CMD_CMD_OFFSET, KMAC_CMD_CMD_VALUE_START}});
+ EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_ABSORB_BIT, true}});
+
+ EXPECT_DIF_OK(dif_kmac_mode_sha3_start(&kmac_, &op_state_, mode_));
+}
+
+TEST_F(Sha3_224Test, StartBadArg) {
+ EXPECT_DIF_BADARG(dif_kmac_mode_sha3_start(NULL, &op_state_, mode_));
+
+ EXPECT_DIF_BADARG(dif_kmac_mode_sha3_start(&kmac_, NULL, mode_));
+
+ EXPECT_DIF_BADARG(
+ dif_kmac_mode_sha3_start(&kmac_, &op_state_, (dif_kmac_mode_sha3_t)0xff));
+}
+
+TEST_F(Sha3_224Test, StartError) {
+ {
+ EXPECT_READ32(KMAC_STATUS_REG_OFFSET, {{KMAC_STATUS_SHA3_IDLE_BIT, false}});
+ EXPECT_EQ(dif_kmac_mode_sha3_start(&kmac_, &op_state_, mode_), kDifError);
+ }
+}
+
constexpr std::array<uint8_t, 17> KmacTest::kMsg_;
class AbsorbalignmentMessage : public KmacTest {};