5 #include "sw/device/silicon_creator/manuf/lib/util.h"
9 #include "sw/device/lib/base/status.h"
13 #include "sw/device/lib/testing/otp_ctrl_testutils.h"
16 #include "otp_ctrl_regs.h"
19 OTP_CTRL_PARAM_VENDOR_TEST_SIZE %
sizeof(uint32_t) == 0,
20 "OTP Vendor Test partition should be an integer multiple of 32-bit words.");
22 status_t manuf_util_hash_lc_transition_token(
const uint32_t *raw_token,
23 size_t token_size_bytes,
24 uint64_t *hashed_token) {
26 .data = (
unsigned char *)raw_token,
27 .len = token_size_bytes,
30 .data = (
unsigned char *)
"",
34 .data = (
unsigned char *)
"LC_CTRL",
43 size_t token_num_words = token_size_bytes /
sizeof(uint32_t);
44 if (token_size_bytes %
sizeof(uint32_t) != 0) {
47 uint32_t token_data[token_num_words];
48 memset(token_data, 0,
sizeof(token_data));
51 .len = token_num_words,
52 .mode = kOtcryptoHashXofModeCshake128,
57 memcpy(hashed_token, token_data,
sizeof(token_data));
62 status_t manuf_util_hash_otp_partition(
const dif_otp_ctrl_t *otp_ctrl,
65 if (otp_ctrl == NULL || output.len != kSha256DigestWords) {
66 return INVALID_ARGUMENT();
71 .mode = kOtcryptoHashModeSha256,
77 vendor_test_32bit_array[(OTP_CTRL_PARAM_VENDOR_TEST_SIZE -
78 OTP_CTRL_PARAM_VENDOR_TEST_DIGEST_SIZE) /
80 TRY(otp_ctrl_testutils_dai_read32_array(
82 (OTP_CTRL_PARAM_VENDOR_TEST_SIZE -
83 OTP_CTRL_PARAM_VENDOR_TEST_DIGEST_SIZE) /
86 .data = (
unsigned char *)vendor_test_32bit_array,
87 .len = OTP_CTRL_PARAM_VENDOR_TEST_SIZE -
88 OTP_CTRL_PARAM_VENDOR_TEST_DIGEST_SIZE,
95 OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET +
96 OTP_CTRL_PARAM_CREATOR_SW_CFG_OFFSET),
97 .len = OTP_CTRL_PARAM_CREATOR_SW_CFG_SIZE -
98 OTP_CTRL_PARAM_CREATOR_SW_CFG_DIGEST_SIZE,
105 OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET +
106 OTP_CTRL_PARAM_OWNER_SW_CFG_OFFSET),
107 .len = OTP_CTRL_PARAM_OWNER_SW_CFG_SIZE -
108 OTP_CTRL_PARAM_OWNER_SW_CFG_DIGEST_SIZE,
112 case kDifOtpCtrlPartitionRotCreatorAuthCodesign: {
113 uint32_t rot_creator_auth_codesign_32bit_array
114 [(OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_SIZE -
115 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_DIGEST_SIZE) /
117 TRY(otp_ctrl_testutils_dai_read32_array(
118 otp_ctrl, kDifOtpCtrlPartitionRotCreatorAuthCodesign, 0,
119 rot_creator_auth_codesign_32bit_array,
120 (OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_SIZE -
121 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_DIGEST_SIZE) /
124 .data = (
unsigned char *)rot_creator_auth_codesign_32bit_array,
125 .len = OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_SIZE -
126 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_DIGEST_SIZE,
130 case kDifOtpCtrlPartitionRotCreatorAuthState: {
131 uint32_t rot_creator_auth_state_32bit_array
132 [(OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_SIZE -
133 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_DIGEST_SIZE) /
135 TRY(otp_ctrl_testutils_dai_read32_array(
136 otp_ctrl, kDifOtpCtrlPartitionRotCreatorAuthState, 0,
137 rot_creator_auth_state_32bit_array,
138 (OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_SIZE -
139 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_DIGEST_SIZE) /
142 .data = (
unsigned char *)rot_creator_auth_state_32bit_array,
143 .len = OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_SIZE -
144 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_DIGEST_SIZE,
149 return INVALID_ARGUMENT();