[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'],