5 #include "sw/device/silicon_creator/manuf/lib/individualize.h"
8 #include "sw/device/lib/base/multibits.h"
9 #include "sw/device/lib/base/status.h"
10 #include "sw/device/lib/crypto/drivers/entropy.h"
15 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
16 #include "sw/device/lib/testing/json/provisioning_data.h"
17 #include "sw/device/lib/testing/lc_ctrl_testutils.h"
18 #include "sw/device/lib/testing/otp_ctrl_testutils.h"
19 #include "sw/device/lib/testing/test_framework/check.h"
20 #include "sw/device/silicon_creator/manuf/lib/flash_info_fields.h"
21 #include "sw/device/silicon_creator/manuf/lib/otp_fields.h"
22 #include "sw/device/silicon_creator/manuf/lib/util.h"
24 #include "otp_ctrl_regs.h"
50 .en_csrng_sw_app_read = kMultiBitBool8True,
51 .dis_rv_dm_late_debug = kMultiBitBool8True,
61 static status_t hw_cfg1_enable_knobs_set(
const dif_otp_ctrl_t *otp_ctrl) {
70 kHwCfgEnSramIfetchOffset, &val,
75 status_t manuf_individualize_device_hw_cfg(
78 uint32_t *device_id) {
87 TRY(flash_ctrl_testutils_info_region_setup_properties(
88 flash_state, kFlashInfoFieldDeviceId.page, kFlashInfoFieldDeviceId.bank,
89 kFlashInfoFieldDeviceId.partition, flash_info_page_0_permissions,
93 uint32_t device_id_from_flash[kHwCfgDeviceIdSizeIn32BitWords];
94 uint32_t empty_device_id[kHwCfgDeviceIdSizeIn32BitWords] = {0};
95 TRY(manuf_flash_info_field_read(flash_state, kFlashInfoFieldDeviceId,
97 kHwCfgDeviceIdSizeIn32BitWords));
98 bool flash_device_id_empty =
true;
100 flash_device_id_empty && i < kHwCfgDeviceIdSizeIn32BitWords; ++i) {
101 flash_device_id_empty &= device_id_from_flash[i] == 0;
108 if (!flash_device_id_empty) {
109 TRY_CHECK_ARRAYS_EQ(device_id_from_flash, device_id,
110 kHwCfgDeviceIdSizeIn32BitWords);
112 TRY_CHECK_ARRAYS_NE(device_id, empty_device_id,
113 kHwCfgDeviceIdSizeIn32BitWords);
116 kHwCfgDeviceIdOffset, device_id,
117 kHwCfgDeviceIdSizeIn32BitWords));
120 uint32_t manuf_state[kHwCfgManufStateSizeIn32BitWords];
121 TRY(manuf_flash_info_field_read(flash_state, kFlashInfoFieldManufState,
123 kHwCfgManufStateSizeIn32BitWords));
125 kHwCfgManufStateOffset, manuf_state,
126 kHwCfgManufStateSizeIn32BitWords));
136 TRY(hw_cfg1_enable_knobs_set(otp_ctrl));
144 status_t manuf_individualize_device_hw_cfg_check(
145 const dif_otp_ctrl_t *otp_ctrl) {
148 bool is_locked0, is_locked1;
153 uint64_t digest0, digest1;
157 return is_locked0 && is_locked1 ? OK_STATUS() : INTERNAL();
160 status_t manuf_individualize_device_secret0(
161 const dif_lc_ctrl_t *lc_ctrl,
const dif_otp_ctrl_t *otp_ctrl,
162 const manuf_cp_provisioning_data_t *provisioning_data) {
171 kSecret0TestUnlockTokenOffset,
172 provisioning_data->test_unlock_token_hash,
173 kSecret0TestUnlockTokenSizeIn64BitWords));
175 kSecret0TestExitTokenOffset,
176 provisioning_data->test_exit_token_hash,
177 kSecret0TestExitTokenSizeIn64BitWords));
185 status_t manuf_individualize_device_secret0_check(
186 const dif_otp_ctrl_t *otp_ctrl) {
190 return is_locked ? OK_STATUS() : INTERNAL();