[sw/silicon_creator] Add redundant checks to sigverify_encoded_message_check

Signed-off-by: Alphan Ulusoy <alphan@google.com>
diff --git a/sw/device/silicon_creator/lib/BUILD b/sw/device/silicon_creator/lib/BUILD
index 2aff49c..1b12794 100644
--- a/sw/device/silicon_creator/lib/BUILD
+++ b/sw/device/silicon_creator/lib/BUILD
@@ -362,12 +362,22 @@
     ],
 )
 
+filegroup(
+    name = "sigverify_src_for_keys_unittest",
+    srcs = ["sigverify.c"],
+)
+
 cc_test(
     name = "sigverify_unittest",
-    srcs = ["sigverify_unittest.cc"],
+    srcs = [
+        "sigverify.c",
+        "sigverify_unittest.cc",
+    ],
+    defines = [
+        "OT_OFF_TARGET_TEST",
+    ],
     deps = [
         ":mock_sigverify",
-        ":sigverify",
         ":sigverify_intf",
         "//hw/ip/flash_ctrl/data:flash_ctrl_regs",
         "//hw/ip/otp_ctrl/data:otp_ctrl_regs",
diff --git a/sw/device/silicon_creator/lib/meson.build b/sw/device/silicon_creator/lib/meson.build
index cb80d01..27f2d73 100644
--- a/sw/device/silicon_creator/lib/meson.build
+++ b/sw/device/silicon_creator/lib/meson.build
@@ -239,8 +239,11 @@
     dependencies: [
       sw_vendor_gtest,
       sw_lib_testing_bitfield,
+      sw_lib_testing_hardened,
     ],
     native: true,
+    c_args: ['-DOT_OFF_TARGET_TEST'],
+    cpp_args: ['-DOT_OFF_TARGET_TEST'],
   ),
   suite: 'mask_rom',
 )
diff --git a/sw/device/silicon_creator/lib/sigverify.c b/sw/device/silicon_creator/lib/sigverify.c
index 1c1097a..5c4733d 100644
--- a/sw/device/silicon_creator/lib/sigverify.c
+++ b/sw/device/silicon_creator/lib/sigverify.c
@@ -140,14 +140,14 @@
   // correct, garbage otherwise.
   uint32_t *enc_msg_ptr = enc_msg->data;
   size_t i = 0;
-  for (size_t j = 0; j < kHmacDigestNumWords; ++j, ++i) {
+  for (size_t j = 0; launder32(j) < kHmacDigestNumWords; ++j, ++i) {
     enc_msg_ptr[i] ^= act_digest->digest[j] ^ kSigverifyShares[i];
   }
   // Note: This also includes the zero byte right before PS.
   static const uint32_t kEncodedSha256[] = {
       0x05000420, 0x03040201, 0x86480165, 0x0d060960, 0x00303130,
   };
-  for (size_t j = 0; j < ARRAYSIZE(kEncodedSha256); ++j, ++i) {
+  for (size_t j = 0; launder32(j) < ARRAYSIZE(kEncodedSha256); ++j, ++i) {
     enc_msg_ptr[i] ^= kEncodedSha256[j] ^ kSigverifyShares[i];
   }
   // Note: `kPsLen` excludes the last word of `enc_msg`, which is 0x0001ffff.
@@ -155,18 +155,18 @@
                                ARRAYSIZE(kEncodedSha256) -
                                ARRAYSIZE(act_digest->digest) - /*last word*/ 1;
   // PS up to the last word.
-  for (size_t j = 0; j < kPsLen; ++j, ++i) {
+  for (size_t j = 0; launder32(j) < kPsLen; ++j, ++i) {
     enc_msg_ptr[i] ^= 0xffffffff ^ kSigverifyShares[i];
   }
   // Last word.
   enc_msg_ptr[i] ^= 0x0001ffff ^ kSigverifyShares[i];
-  // TODO(#10007): Use SHUTDOWN_CHECK to check loop completion.
+  HARDENED_CHECK_EQ(i, kSigVerifyRsaNumWords - 1);
 
   // Step 2: Reduce `enc_msg` to produce the value to write to flash_ctrl EXEC
   // register (`flash_exec`) and the return value (`result`).
   *flash_exec = 0;
   uint32_t diff = 0;
-  for (i = 0; i < kSigVerifyRsaNumWords; ++i) {
+  for (i = 0; launder32(i) < kSigVerifyRsaNumWords; ++i) {
     // Following three statements set `diff` to `UINT32_MAX` if `enc_msg[i]` is
     // incorrect, no change otherwise.
     diff |= enc_msg_ptr[i] ^ kSigverifyShares[i];
@@ -177,14 +177,14 @@
     // Set `flash_exec` to `UINT32_MAX` if `enc_msg` is incorrect.
     *flash_exec |= diff;
   }
-  // TODO(#10007): Use SHUTDOWN_CHECK to check loop completion.
+  HARDENED_CHECK_EQ(i, kSigVerifyRsaNumWords);
 
   // Note: `kSigverifyFlashExec` is defined such that the following operation
   // produces `kErrorOk`.
   rom_error_t result =
       (*flash_exec << 21 ^ *flash_exec << 10 ^ *flash_exec >> 1) >> 21;
-  if (result == kErrorOk) {
-    // TODO(#10007): Use SHUTDOWN_CHECK once it's merged.
+  if (launder32(result) == kErrorOk) {
+    HARDENED_CHECK_EQ(result, kErrorOk);
     return result;
   }
 
diff --git a/sw/device/silicon_creator/mask_rom/BUILD b/sw/device/silicon_creator/mask_rom/BUILD
index b28f35e..61878ef 100644
--- a/sw/device/silicon_creator/mask_rom/BUILD
+++ b/sw/device/silicon_creator/mask_rom/BUILD
@@ -228,6 +228,7 @@
 cc_test(
     name = "sigverify_keys_unittest",
     srcs = [
+        "//sw/device/silicon_creator/lib:sigverify_src_for_keys_unittest",
         "sigverify_keys.c",
         "sigverify_keys.h",
         "sigverify_keys_unittest.cc",
@@ -241,7 +242,6 @@
         "//sw/device/lib/base",
         "//sw/device/silicon_creator/lib:error",
         "//sw/device/silicon_creator/lib:mock_sigverify",
-        "//sw/device/silicon_creator/lib:sigverify",
         "//sw/device/silicon_creator/lib:sigverify_internal",
         "//sw/device/silicon_creator/lib:sigverify_intf",
         "//sw/device/silicon_creator/lib:sigverify_mod_exp_ibex",
diff --git a/sw/device/silicon_creator/mask_rom/meson.build b/sw/device/silicon_creator/mask_rom/meson.build
index b67d3ce..5304141 100644
--- a/sw/device/silicon_creator/mask_rom/meson.build
+++ b/sw/device/silicon_creator/mask_rom/meson.build
@@ -326,6 +326,7 @@
     dependencies: [
       sw_vendor_gtest,
       sw_lib_testing_bitfield,
+      sw_lib_testing_hardened,
     ],
     native: true,
     c_args: ['-DOT_OFF_TARGET_TEST'],