5 #include "sw/device/silicon_creator/rom/sigverify_otp_keys.h"
7 #include "sw/device/silicon_creator/lib/drivers/hmac.h"
8 #include "sw/device/silicon_creator/lib/drivers/otp.h"
9 #include "sw/device/silicon_creator/lib/drivers/rnd.h"
10 #include "sw/device/silicon_creator/lib/error.h"
12 #include "otp_ctrl_regs.h"
17 kAuthCodesignParitionSize =
18 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_SIZE -
19 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_DIGEST_SIZE,
21 kAuthCodesignParitionSizeInWords =
22 kAuthCodesignParitionSize /
sizeof(uint32_t),
27 kAuthcodesignPartitionMsgSize =
30 kAuthcodesignPartitionMsgSizeInWords =
31 kAuthcodesignPartitionMsgSize /
sizeof(uint32_t),
35 kAuthStatePartitionSize = OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_SIZE -
36 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_DIGEST_SIZE,
38 kAuthStatePartitionSizeInWords = kAuthStatePartitionSize /
sizeof(uint32_t),
42 "Size of sigverify_otp_keys_t must match the size of the OTP "
46 "Size of sigverify_otp_key_states_t must match the size of the OTP "
58 static rom_error_t key_is_valid_in_lc_state_rma(sigverify_key_type_t key_type) {
59 switch (launder32(key_type)) {
60 case kSigverifyKeyTypeTest:
63 case kSigverifyKeyTypeProd:
66 case kSigverifyKeyTypeDev:
68 return kErrorSigverifyBadKey;
84 static rom_error_t key_is_valid_in_lc_state_dev(sigverify_key_type_t key_type) {
85 switch (launder32(key_type)) {
86 case kSigverifyKeyTypeTest:
88 return kErrorSigverifyBadKey;
89 case kSigverifyKeyTypeProd:
92 case kSigverifyKeyTypeDev:
110 static rom_error_t key_is_valid_in_lc_state_prod(
111 sigverify_key_type_t key_type) {
112 switch (launder32(key_type)) {
113 case kSigverifyKeyTypeTest:
115 return kErrorSigverifyBadKey;
116 case kSigverifyKeyTypeProd:
119 case kSigverifyKeyTypeDev:
121 return kErrorSigverifyBadKey;
137 static rom_error_t key_is_valid_in_lc_state_test(
138 sigverify_key_type_t key_type) {
139 switch (launder32(key_type)) {
140 case kSigverifyKeyTypeTest:
143 case kSigverifyKeyTypeProd:
146 case kSigverifyKeyTypeDev:
148 return kErrorSigverifyBadKey;
163 static rom_error_t key_is_valid(sigverify_key_type_t key_type,
164 lifecycle_state_t lc_state) {
165 switch (launder32(lc_state)) {
168 return key_is_valid_in_lc_state_test(key_type);
171 return key_is_valid_in_lc_state_prod(key_type);
172 case kLcStateProdEnd:
174 return key_is_valid_in_lc_state_prod(key_type);
177 return key_is_valid_in_lc_state_dev(key_type);
180 return key_is_valid_in_lc_state_rma(key_type);
188 uint32_t *raw_buffer = (uint32_t *)&ctx->
keys;
190 for (i = 0; launder32(i) < kAuthCodesignParitionSizeInWords; ++i) {
191 raw_buffer[i] = otp_read32(OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_OFFSET +
192 i *
sizeof(uint32_t));
196 uint32_t *raw_state = (uint32_t *)&ctx->
states;
197 for (i = 0; launder32(i) < kAuthStatePartitionSizeInWords; ++i) {
198 raw_state[i] = otp_read32(OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_OFFSET +
199 i *
sizeof(uint32_t));
202 return sigverify_otp_keys_check(ctx);
207 hmac_sha256(&ctx->
keys, kAuthcodesignPartitionMsgSize, &got);
209 for (; launder32(i) < kHmacDigestNumWords; ++i) {
211 return kErrorSigverifyBadAuthPartition;
229 size_t entry_index) {
231 entry_size * entry_index);
236 size_t cand_key_index = UINT32_MAX;
241 size_t i = ((uint64_t)rnd_uint32() * (uint64_t)params.
key_cnt) >> 32;
246 size_t iter_cnt = 0, r_iter_cnt = params.
key_cnt - 1;
247 for (; launder32(iter_cnt) < params.
key_cnt &&
248 launder32(r_iter_cnt) < params.
key_cnt;
249 ++iter_cnt, --r_iter_cnt) {
254 if (params.key_states[i] == kSigVerifyKeyAuthStateProvisioned) {
256 if (launder32(error) == kErrorOk) {
267 if (launder32(i) >= params.
key_cnt) {
270 HARDENED_CHECK_LT(i, params.
key_cnt);
281 if (launder32(cand_key_index) < params.
key_cnt) {
282 HARDENED_CHECK_LT(cand_key_index, params.
key_cnt);
285 if (params.key_states[cand_key_index] ==
286 kSigVerifyKeyAuthStateProvisioned) {
293 return kErrorSigverifyBadKey;