[sw/silicon_creator] Move sigverify_rsa_key_get() call to mask_rom_boot()
Signed-off-by: Alphan Ulusoy <alphan@google.com>
diff --git a/sw/device/silicon_creator/mask_rom/mask_rom.c b/sw/device/silicon_creator/mask_rom/mask_rom.c
index 2a63124..6439128 100644
--- a/sw/device/silicon_creator/mask_rom/mask_rom.c
+++ b/sw/device/silicon_creator/mask_rom/mask_rom.c
@@ -18,6 +18,7 @@
#include "sw/device/silicon_creator/lib/drivers/uart.h"
#include "sw/device/silicon_creator/mask_rom/romextimage.h"
#include "sw/device/silicon_creator/mask_rom/sigverify.h"
+#include "sw/device/silicon_creator/mask_rom/sigverify_keys.h"
#include "hw/top_earlgrey/sw/autogen/top_earlgrey.h"
@@ -91,15 +92,20 @@
const manifest_t *manifest;
manifest_signed_region_t signed_region;
+ const sigverify_rsa_key_t *key;
if (romextimage_manifest_get(kFlashSlotA, &manifest) != kErrorOk) {
break;
}
if (manifest_signed_region_get(manifest, &signed_region) != kErrorOk) {
break;
}
+ if (sigverify_rsa_key_get(sigverify_rsa_key_id_get(&manifest->modulus),
+ &key) != kErrorOk) {
+ break;
+ }
if (sigverify_rom_ext_signature_verify(
signed_region.start, signed_region.length, &manifest->signature,
- manifest->modulus.data[0]) != kErrorOk) {
+ key) != kErrorOk) {
break;
}
diff --git a/sw/device/silicon_creator/mask_rom/sigverify.c b/sw/device/silicon_creator/mask_rom/sigverify.c
index d09a23c..1a46555 100644
--- a/sw/device/silicon_creator/mask_rom/sigverify.c
+++ b/sw/device/silicon_creator/mask_rom/sigverify.c
@@ -7,7 +7,6 @@
#include "sw/device/lib/base/memory.h"
#include "sw/device/lib/base/mmio.h"
#include "sw/device/silicon_creator/lib/drivers/hmac.h"
-#include "sw/device/silicon_creator/mask_rom/sigverify_keys.h"
#include "sw/device/silicon_creator/mask_rom/sigverify_mod_exp.h"
#include "hw/top_earlgrey/sw/autogen/top_earlgrey.h"
@@ -72,18 +71,14 @@
rom_error_t sigverify_rom_ext_signature_verify(
const void *signed_region, size_t signed_region_len,
- const sigverify_rsa_buffer_t *signature, uint32_t key_id) {
+ const sigverify_rsa_buffer_t *signature, const sigverify_rsa_key_t *key) {
hmac_digest_t act_digest;
hmac_sha256_init();
RETURN_IF_ERROR(hmac_sha256_update(signed_region, signed_region_len));
RETURN_IF_ERROR(hmac_sha256_final(&act_digest));
- // TODO(#21): Key validity check using OTP.
- const sigverify_rsa_key_t *key;
- RETURN_IF_ERROR(sigverify_rsa_key_get(key_id, &key));
-
- // TODO(#21): Choose between Ibex and OTBN using OTP.
- // TODO(#18): OTBN modular exponentiation.
+ // FIXME: Choose between Ibex and OTBN using OTP.
+ // FIXME: OTBN modular exponentiation.
sigverify_rsa_buffer_t enc_msg;
if (!sigverify_mod_exp_ibex(key, signature, &enc_msg)) {
return kErrorSigverifyInvalidArgument;
diff --git a/sw/device/silicon_creator/mask_rom/sigverify.h b/sw/device/silicon_creator/mask_rom/sigverify.h
index 5ae76b5..b91e9a7 100644
--- a/sw/device/silicon_creator/mask_rom/sigverify.h
+++ b/sw/device/silicon_creator/mask_rom/sigverify.h
@@ -35,12 +35,12 @@
* @param signed_region Pointer to the start of the signed region.
* @param signed_region_len Length of the signed region in bytes.
* @param signature An RSA signature.
- * @param key_id ID of the key to use for verifying the signature.
+ * @param key RSA public key to use for verifying the signature.
* @return Result of the operation.
*/
rom_error_t sigverify_rom_ext_signature_verify(
const void *signed_region, size_t signed_region_len,
- const sigverify_rsa_buffer_t *signature, uint32_t key_id);
+ const sigverify_rsa_buffer_t *signature, const sigverify_rsa_key_t *key);
#ifdef __cplusplus
} // extern "C"
diff --git a/sw/device/silicon_creator/mask_rom/sigverify_keys.c b/sw/device/silicon_creator/mask_rom/sigverify_keys.c
index 5b06609..cbac7a0 100644
--- a/sw/device/silicon_creator/mask_rom/sigverify_keys.c
+++ b/sw/device/silicon_creator/mask_rom/sigverify_keys.c
@@ -81,6 +81,7 @@
rom_error_t sigverify_rsa_key_get(uint32_t key_id,
const sigverify_rsa_key_t **key) {
+ // FIXME: Key validity check using OTP.
for (size_t i = 0; i < kSigVerifyNumRsaKeys; ++i) {
const sigverify_rsa_key_t *cand_key = &kSigVerifyRsaKeys[i];
if (sigverify_rsa_key_id_get(&cand_key->n) == key_id) {
diff --git a/sw/device/silicon_creator/mask_rom/sigverify_unittest.cc b/sw/device/silicon_creator/mask_rom/sigverify_unittest.cc
index d87c5db..0b0f37b 100644
--- a/sw/device/silicon_creator/mask_rom/sigverify_unittest.cc
+++ b/sw/device/silicon_creator/mask_rom/sigverify_unittest.cc
@@ -81,8 +81,6 @@
// The contents of `kSignedRegion` and `kSignature` are not significant since we
// use mocks. `kSignedRegion` is initialized this way only for consistency with
// `kTestDigest`.
-// TODO(opentitan/#5955): Remove when the manifest struct is ready and
-// `sigverify_rom_ext_signature_check` is updated.
constexpr std::array<uint8_t, 4> kSignedRegion{'t', 'e', 's', 't'};
constexpr sigverify_rsa_buffer_t kSignature{};
@@ -93,9 +91,6 @@
};
TEST_F(SigVerifyTest, GoodSignature) {
- // FIXME: Parameterize with key ids.
- const auto key_id = sigverify_rsa_key_id_get(&kSigVerifyRsaKeys[0].n);
-
EXPECT_CALL(hmac_, sha256_init());
EXPECT_CALL(hmac_, sha256_update(kSignedRegion.data(), sizeof(kSignedRegion)))
.WillOnce(Return(kErrorOk));
@@ -105,16 +100,14 @@
ibex(&kSigVerifyRsaKeys[0], &kSignature, NotNull()))
.WillOnce(DoAll(SetArgPointee<2>(kEncMsg), Return(kErrorOk)));
- EXPECT_EQ(
- sigverify_rom_ext_signature_verify(
- kSignedRegion.data(), sizeof(kSignedRegion), &kSignature, key_id),
- kErrorOk);
+ // FIXME: Parameterize with key ids.
+ EXPECT_EQ(sigverify_rom_ext_signature_verify(
+ kSignedRegion.data(), sizeof(kSignedRegion), &kSignature,
+ &kSigVerifyRsaKeys[0]),
+ kErrorOk);
}
TEST_F(SigVerifyTest, BadSignature) {
- // FIXME: Parameterize with key ids.
- const auto key_id = sigverify_rsa_key_id_get(&kSigVerifyRsaKeys[0].n);
-
// Corrupt the words of the encoded message by flipping their bits and check
// that signature verification fails.
// FIXME: Make this a parameterized test.
@@ -132,10 +125,11 @@
ibex(&kSigVerifyRsaKeys[0], &kSignature, NotNull()))
.WillOnce(DoAll(SetArgPointee<2>(bad_enc_msg), Return(true)));
- EXPECT_EQ(
- sigverify_rom_ext_signature_verify(
- kSignedRegion.data(), sizeof(kSignedRegion), &kSignature, key_id),
- kErrorSigverifyInvalidArgument);
+ // FIXME: Parameterize with key ids.
+ EXPECT_EQ(sigverify_rom_ext_signature_verify(
+ kSignedRegion.data(), sizeof(kSignedRegion), &kSignature,
+ &kSigVerifyRsaKeys[0]),
+ kErrorSigverifyInvalidArgument);
}
}