[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 {};