[sw/silicon_creator] Add key type definitions for Mask ROM keys
This change introduces a new struct for stroring Mask ROM keys and their types.
Signed-off-by: Alphan Ulusoy <alphan@google.com>
diff --git a/sw/device/silicon_creator/mask_rom/sigverify_keys.c b/sw/device/silicon_creator/mask_rom/sigverify_keys.c
index 82ae25e..f35f847 100644
--- a/sw/device/silicon_creator/mask_rom/sigverify_keys.c
+++ b/sw/device/silicon_creator/mask_rom/sigverify_keys.c
@@ -26,82 +26,98 @@
*
* Please see sw/device/silicon_creator/keys/README.md for more details.
*/
-const sigverify_rsa_key_t kSigVerifyRsaKeys[kSigVerifyNumRsaKeys] = {
+const sigverify_mask_rom_key_t kSigVerifyRsaKeys[kSigVerifyNumRsaKeys] = {
// sw/device/silicon_creator/keys/fpga_key_0.public.der
[0] =
{
- .n = {{
- 0x5801a2bd, 0xeff64a46, 0xc8cf2251, 0xa7cd62cb, 0x634a39c2,
- 0x55c936d3, 0x463d61fc, 0x762ebbaa, 0x01aadfb2, 0x23da15d1,
- 0x8475fdc6, 0x4ec67b7b, 0xe9364570, 0xd23ec7c7, 0x98038d63,
- 0x5688a56b, 0x68037add, 0xb20ff289, 0x9d96c1ce, 0xbac0b8cd,
- 0xead33d0b, 0x195f89c8, 0xd7dc110e, 0xf5bccc12, 0x8dfa33dc,
- 0xedc404d2, 0x74ef8524, 0x9197c0c8, 0x79cc448e, 0x4c9c505d,
- 0x4a586ad7, 0xe2d0f071, 0x589f28c2, 0x2ca7fc22, 0x0354b0e2,
- 0xefb63b44, 0x33a75b04, 0x9e194454, 0x1b4b2cde, 0x8e3f78e0,
- 0x5260877c, 0x05685b72, 0x4868ad4e, 0x10303ac9, 0x05ac2411,
- 0x5e797381, 0xd5407668, 0xe3522348, 0xa33134f8, 0x38f7a953,
- 0xd926f672, 0x136f6753, 0xb186b0ab, 0x5ccab586, 0x61e5bf2e,
- 0x9fc0eebb, 0x788ed0bd, 0x47b5fc70, 0xf971262a, 0x3b40d99b,
- 0x5b9fd926, 0xce3c93bf, 0xd406005e, 0x72b9e555, 0xc9b9273e,
- 0xfcef747f, 0xf0a35598, 0x2761e8f6, 0xec1799df, 0x462bc52d,
- 0x8e47218b, 0x429ccdae, 0xe7e7d66c, 0x70c70b03, 0x0356c3d2,
- 0x3cb3e7d1, 0xd42d035d, 0x83c529a3, 0x8df9930e, 0xb082e1f0,
- 0x07509c30, 0x5c33a350, 0x4f6884b9, 0x7b9d2de0, 0x0f1d16b3,
- 0x38dbcf55, 0x168580ea, 0xc2f2aca4, 0x43f0ae60, 0x227dd2ed,
- 0xd8dc61f4, 0x9404e8bc, 0x0db76fe3, 0x3491d3b0, 0x6ca44e27,
- 0xcda63719,
- }},
- .n0_inv =
+ .key =
{
- 0x9c9a176b,
- 0x44d6fa52,
- 0x71a63ec4,
- 0xadc94595,
- 0x3fd9bc73,
- 0xa83cdc95,
- 0xbe1bc819,
- 0x2b421fae,
+ .n = {{
+ 0x5801a2bd, 0xeff64a46, 0xc8cf2251, 0xa7cd62cb,
+ 0x634a39c2, 0x55c936d3, 0x463d61fc, 0x762ebbaa,
+ 0x01aadfb2, 0x23da15d1, 0x8475fdc6, 0x4ec67b7b,
+ 0xe9364570, 0xd23ec7c7, 0x98038d63, 0x5688a56b,
+ 0x68037add, 0xb20ff289, 0x9d96c1ce, 0xbac0b8cd,
+ 0xead33d0b, 0x195f89c8, 0xd7dc110e, 0xf5bccc12,
+ 0x8dfa33dc, 0xedc404d2, 0x74ef8524, 0x9197c0c8,
+ 0x79cc448e, 0x4c9c505d, 0x4a586ad7, 0xe2d0f071,
+ 0x589f28c2, 0x2ca7fc22, 0x0354b0e2, 0xefb63b44,
+ 0x33a75b04, 0x9e194454, 0x1b4b2cde, 0x8e3f78e0,
+ 0x5260877c, 0x05685b72, 0x4868ad4e, 0x10303ac9,
+ 0x05ac2411, 0x5e797381, 0xd5407668, 0xe3522348,
+ 0xa33134f8, 0x38f7a953, 0xd926f672, 0x136f6753,
+ 0xb186b0ab, 0x5ccab586, 0x61e5bf2e, 0x9fc0eebb,
+ 0x788ed0bd, 0x47b5fc70, 0xf971262a, 0x3b40d99b,
+ 0x5b9fd926, 0xce3c93bf, 0xd406005e, 0x72b9e555,
+ 0xc9b9273e, 0xfcef747f, 0xf0a35598, 0x2761e8f6,
+ 0xec1799df, 0x462bc52d, 0x8e47218b, 0x429ccdae,
+ 0xe7e7d66c, 0x70c70b03, 0x0356c3d2, 0x3cb3e7d1,
+ 0xd42d035d, 0x83c529a3, 0x8df9930e, 0xb082e1f0,
+ 0x07509c30, 0x5c33a350, 0x4f6884b9, 0x7b9d2de0,
+ 0x0f1d16b3, 0x38dbcf55, 0x168580ea, 0xc2f2aca4,
+ 0x43f0ae60, 0x227dd2ed, 0xd8dc61f4, 0x9404e8bc,
+ 0x0db76fe3, 0x3491d3b0, 0x6ca44e27, 0xcda63719,
+ }},
+ .n0_inv =
+ {
+ 0x9c9a176b,
+ 0x44d6fa52,
+ 0x71a63ec4,
+ 0xadc94595,
+ 0x3fd9bc73,
+ 0xa83cdc95,
+ 0xbe1bc819,
+ 0x2b421fae,
+ },
+ .exponent = 65537,
},
- .exponent = 65537,
+ .key_type = kSigverifyKeyTypeProd,
},
// sw/device/silicon_creator/keys/fpga_key_1.public.der
[1] =
{
- .n = {{
- 0xbd158913, 0xab75ea1a, 0xc04e5292, 0x68f5778a, 0xa71418c7,
- 0xddc4fc1c, 0xcb09302d, 0xedf3142b, 0x656d7d85, 0xf761d32a,
- 0x2d334d1b, 0x26c91770, 0x5b9ba5a0, 0x00ac6c05, 0xbabaf1bb,
- 0xa8299ecc, 0xb4223f99, 0x5b676ad3, 0xcaa786c2, 0x3e2f1785,
- 0x204b6991, 0x21fa118f, 0x435573ab, 0xa3353ba1, 0x1074c161,
- 0x2ad5e901, 0x7310247c, 0x1e21b8e9, 0x0cfc7762, 0x0a9139b1,
- 0xfc655b33, 0x6990faaf, 0xbb88faec, 0x7c7bd6ef, 0x261e4555,
- 0x6bc3d813, 0x5ce6e18b, 0xdd308629, 0x37d3d54d, 0x65acd84d,
- 0x97b7e0c3, 0xc0d35caa, 0xb0be177a, 0x09473af3, 0x67f43155,
- 0x3b2f7661, 0xf9255df2, 0x1b42c84c, 0x355cd607, 0x835e74ca,
- 0x1d011c4e, 0x46652555, 0x1566f96f, 0x6cffd2f9, 0x204e783e,
- 0xa178a2eb, 0xe7297a95, 0xd7380039, 0x1a685545, 0x76ed97c9,
- 0x6bc0b1b7, 0xd9b1338e, 0xa3b23005, 0x6fe7109f, 0x01c232e1,
- 0x851639c5, 0xe81d338c, 0x25ebe0c4, 0x5b0202cd, 0x3690cb70,
- 0xad13b664, 0x8bf7833e, 0x6017349c, 0xf6e90b08, 0x953ef3d8,
- 0x4bc11817, 0xd0f6e840, 0xfe01a954, 0x9b866209, 0xb9653ff8,
- 0x0d654f5c, 0xff78177c, 0x3688833c, 0x57cc0c30, 0x71965be7,
- 0xf61fb728, 0xaeac8ca2, 0xbdc9848b, 0x954c529f, 0x9917ac7f,
- 0x4ba4c007, 0xce2dbf0b, 0xfc7d8504, 0x2712580b, 0xd0293151,
- 0xa4dbbff3,
- }},
- .n0_inv =
+ .key =
{
- 0x079056e5,
- 0xe151dae1,
- 0xd4f9deee,
- 0xe18c4cab,
- 0x868f9abe,
- 0x8643ed1c,
- 0x58022be6,
- 0x8f8972c9,
+ .n = {{
+ 0xbd158913, 0xab75ea1a, 0xc04e5292, 0x68f5778a,
+ 0xa71418c7, 0xddc4fc1c, 0xcb09302d, 0xedf3142b,
+ 0x656d7d85, 0xf761d32a, 0x2d334d1b, 0x26c91770,
+ 0x5b9ba5a0, 0x00ac6c05, 0xbabaf1bb, 0xa8299ecc,
+ 0xb4223f99, 0x5b676ad3, 0xcaa786c2, 0x3e2f1785,
+ 0x204b6991, 0x21fa118f, 0x435573ab, 0xa3353ba1,
+ 0x1074c161, 0x2ad5e901, 0x7310247c, 0x1e21b8e9,
+ 0x0cfc7762, 0x0a9139b1, 0xfc655b33, 0x6990faaf,
+ 0xbb88faec, 0x7c7bd6ef, 0x261e4555, 0x6bc3d813,
+ 0x5ce6e18b, 0xdd308629, 0x37d3d54d, 0x65acd84d,
+ 0x97b7e0c3, 0xc0d35caa, 0xb0be177a, 0x09473af3,
+ 0x67f43155, 0x3b2f7661, 0xf9255df2, 0x1b42c84c,
+ 0x355cd607, 0x835e74ca, 0x1d011c4e, 0x46652555,
+ 0x1566f96f, 0x6cffd2f9, 0x204e783e, 0xa178a2eb,
+ 0xe7297a95, 0xd7380039, 0x1a685545, 0x76ed97c9,
+ 0x6bc0b1b7, 0xd9b1338e, 0xa3b23005, 0x6fe7109f,
+ 0x01c232e1, 0x851639c5, 0xe81d338c, 0x25ebe0c4,
+ 0x5b0202cd, 0x3690cb70, 0xad13b664, 0x8bf7833e,
+ 0x6017349c, 0xf6e90b08, 0x953ef3d8, 0x4bc11817,
+ 0xd0f6e840, 0xfe01a954, 0x9b866209, 0xb9653ff8,
+ 0x0d654f5c, 0xff78177c, 0x3688833c, 0x57cc0c30,
+ 0x71965be7, 0xf61fb728, 0xaeac8ca2, 0xbdc9848b,
+ 0x954c529f, 0x9917ac7f, 0x4ba4c007, 0xce2dbf0b,
+ 0xfc7d8504, 0x2712580b, 0xd0293151, 0xa4dbbff3,
+ }},
+ .n0_inv =
+ {
+ 0x079056e5,
+ 0xe151dae1,
+ 0xd4f9deee,
+ 0xe18c4cab,
+ 0x868f9abe,
+ 0x8643ed1c,
+ 0x58022be6,
+ 0x8f8972c9,
+ },
+ .exponent = 3,
},
- .exponent = 3,
+ .key_type = kSigverifyKeyTypeProd,
},
};
@@ -136,10 +152,10 @@
rom_error_t sigverify_rsa_key_get(uint32_t key_id,
const sigverify_rsa_key_t **key) {
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) {
+ const sigverify_mask_rom_key_t *cand_key = &kSigVerifyRsaKeys[i];
+ if (sigverify_rsa_key_id_get(&cand_key->key.n) == key_id) {
RETURN_IF_ERROR(key_is_valid_in_otp(i));
- *key = cand_key;
+ *key = &cand_key->key;
return kErrorOk;
}
}
diff --git a/sw/device/silicon_creator/mask_rom/sigverify_keys.h b/sw/device/silicon_creator/mask_rom/sigverify_keys.h
index adad477..98ec51d 100644
--- a/sw/device/silicon_creator/mask_rom/sigverify_keys.h
+++ b/sw/device/silicon_creator/mask_rom/sigverify_keys.h
@@ -31,11 +31,53 @@
};
/**
+ * Key types.
+ *
+ * The life cycle states in which a key can be used depend on its type.
+ */
+typedef enum sigverify_key_type {
+ /**
+ * A key used for manufacturing, testing, and RMA.
+ *
+ * Keys of this type can be used only in TEST_UNLOCKED* and RMA life cycle
+ * states.
+ */
+ kSigverifyKeyTypeTest,
+ /**
+ * A production key.
+ *
+ * Keys of this type can be used in all operational life cycle states, i.e.
+ * states in which CPU execution is enabled.
+ */
+ kSigverifyKeyTypeProd,
+ /**
+ * A development key.
+ *
+ * Keys of this type can be used only in the DEV life cycle state.
+ */
+ kSigVerifyKeyTypeDev,
+} sigverify_key_type_t;
+
+/**
+ * An RSA public key stored in mask ROM.
+ */
+typedef struct sigverify_mask_rom_key {
+ /**
+ * An RSA public key.
+ */
+ sigverify_rsa_key_t key;
+ /**
+ * Type of the key.
+ */
+ sigverify_key_type_t key_type;
+} sigverify_mask_rom_key_t;
+
+/**
* Public keys for signature verification.
*
* Note: Declared here to be able to use in tests.
*/
-extern const sigverify_rsa_key_t kSigVerifyRsaKeys[kSigVerifyNumRsaKeys];
+extern const sigverify_mask_rom_key_t kSigVerifyRsaKeys[kSigVerifyNumRsaKeys];
/**
* Returns the key with the given ID.
diff --git a/sw/device/silicon_creator/mask_rom/sigverify_keys_unittest.cc b/sw/device/silicon_creator/mask_rom/sigverify_keys_unittest.cc
index c74e075..730fbc1 100644
--- a/sw/device/silicon_creator/mask_rom/sigverify_keys_unittest.cc
+++ b/sw/device/silicon_creator/mask_rom/sigverify_keys_unittest.cc
@@ -66,9 +66,9 @@
const sigverify_rsa_key_t *key;
EXPECT_EQ(
sigverify_rsa_key_get(
- sigverify_rsa_key_id_get(&kSigVerifyRsaKeys[key_index].n), &key),
+ sigverify_rsa_key_id_get(&kSigVerifyRsaKeys[key_index].key.n), &key),
kErrorOk);
- EXPECT_EQ(key, &kSigVerifyRsaKeys[key_index]);
+ EXPECT_EQ(key, &kSigVerifyRsaKeys[key_index].key);
}
TEST_P(SigverifyRsaKeyGet, InvalidInOtp) {
@@ -78,7 +78,7 @@
const sigverify_rsa_key_t *key;
EXPECT_EQ(
sigverify_rsa_key_get(
- sigverify_rsa_key_id_get(&kSigVerifyRsaKeys[key_index].n), &key),
+ sigverify_rsa_key_id_get(&kSigVerifyRsaKeys[key_index].key.n), &key),
kErrorSigverifyBadKey);
}
@@ -92,8 +92,8 @@
TEST(Keys, UniqueIds) {
std::unordered_set<uint32_t> ids;
- for (auto const &key : kSigVerifyRsaKeys) {
- ids.insert(sigverify_rsa_key_id_get(&key.n));
+ for (auto const &entry : kSigVerifyRsaKeys) {
+ ids.insert(sigverify_rsa_key_id_get(&entry.key.n));
}
EXPECT_EQ(ids.size(), kSigVerifyNumRsaKeys);
@@ -147,7 +147,7 @@
constexpr RsaVerifyTestCase kRsaVerifyTestCases[2]{
// message: "test"
{
- .key = &kSigVerifyRsaKeys[0],
+ .key = &kSigVerifyRsaKeys[0].key,
.sig =
{
0xeb28a6d3, 0x936b42bb, 0x76d3973d, 0x6322d536, 0x253c7547,
@@ -174,7 +174,7 @@
},
// message: "test"
{
- .key = &kSigVerifyRsaKeys[1],
+ .key = &kSigVerifyRsaKeys[1].key,
.sig =
{
0xb13844fa, 0x9c7622d8, 0xda09bdc4, 0x79fde5c6, 0x7037a98b,