5 #include "sw/device/silicon_creator/lib/drivers/keymgr.h"
15 #include "keymgr_regs.h"
17 #define KEYMGR_ASSERT(a, b) static_assert(a == b, "Bad value for " #a)
18 KEYMGR_ASSERT(kScKeymgrStateReset, KEYMGR_WORKING_STATE_STATE_VALUE_RESET);
19 KEYMGR_ASSERT(kScKeymgrStateInit, KEYMGR_WORKING_STATE_STATE_VALUE_INIT);
20 KEYMGR_ASSERT(kScKeymgrStateCreatorRootKey,
21 KEYMGR_WORKING_STATE_STATE_VALUE_CREATOR_ROOT_KEY);
22 KEYMGR_ASSERT(kScKeymgrStateOwnerIntermediateKey,
23 KEYMGR_WORKING_STATE_STATE_VALUE_OWNER_INTERMEDIATE_KEY);
24 KEYMGR_ASSERT(kScKeymgrStateOwnerKey,
25 KEYMGR_WORKING_STATE_STATE_VALUE_OWNER_KEY);
26 KEYMGR_ASSERT(kScKeymgrStateDisabled,
27 KEYMGR_WORKING_STATE_STATE_VALUE_DISABLED);
28 KEYMGR_ASSERT(kScKeymgrStateInvalid, KEYMGR_WORKING_STATE_STATE_VALUE_INVALID);
43 static rom_error_t expected_state_check(uint32_t expected_state) {
47 uint32_t op_status_field;
49 op_status = abs_mmio_read32(kBase + KEYMGR_OP_STATUS_REG_OFFSET);
50 abs_mmio_write32(kBase + KEYMGR_OP_STATUS_REG_OFFSET, op_status);
53 }
while (op_status_field == KEYMGR_OP_STATUS_STATUS_VALUE_WIP ||
54 op_status_field == KEYMGR_OP_STATUS_STATUS_VALUE_DONE_SUCCESS);
57 uint32_t error_code = abs_mmio_read32(kBase + KEYMGR_ERR_CODE_REG_OFFSET);
58 abs_mmio_write32(kBase + KEYMGR_ERR_CODE_REG_OFFSET, error_code);
62 uint32_t got_state =
sec_mmio_read32(kBase + KEYMGR_WORKING_STATE_REG_OFFSET);
63 if (op_status_field == KEYMGR_OP_STATUS_STATUS_VALUE_IDLE &&
64 error_code == 0u && got_state == expected_state) {
67 return kErrorKeymgrInternal;
70 void sc_keymgr_entropy_reseed_interval_set(uint16_t entropy_reseed_interval) {
73 0, KEYMGR_RESEED_INTERVAL_SHADOWED_VAL_FIELD, entropy_reseed_interval);
78 void sc_keymgr_sw_binding_set(
85 for (
size_t i = 0; i <
ARRAYSIZE(binding_value_sealing->data); ++i) {
87 kBase + KEYMGR_SEALING_SW_BINDING_0_REG_OFFSET + i *
sizeof(uint32_t),
88 binding_value_sealing->data[i]);
90 for (
size_t i = 0; i <
ARRAYSIZE(binding_value_attestation->data); ++i) {
92 kBase + KEYMGR_ATTEST_SW_BINDING_0_REG_OFFSET + i *
sizeof(uint32_t),
93 binding_value_attestation->data[i]);
98 void sc_keymgr_sw_binding_unlock_wait(
void) {
99 while (!abs_mmio_read32(kBase + KEYMGR_SW_BINDING_REGWEN_REG_OFFSET)) {
106 void sc_keymgr_creator_max_ver_set(uint32_t max_key_ver) {
110 kBase + KEYMGR_MAX_CREATOR_KEY_VER_SHADOWED_REG_OFFSET, max_key_ver);
114 void sc_keymgr_owner_int_max_ver_set(uint32_t max_key_ver) {
118 kBase + KEYMGR_MAX_OWNER_INT_KEY_VER_SHADOWED_REG_OFFSET, max_key_ver);
119 sec_mmio_write32(kBase + KEYMGR_MAX_OWNER_INT_KEY_VER_REGWEN_REG_OFFSET, 0);
122 void sc_keymgr_owner_max_ver_set(uint32_t max_key_ver) {
126 kBase + KEYMGR_MAX_OWNER_KEY_VER_SHADOWED_REG_OFFSET, max_key_ver);
130 void sc_keymgr_advance_state(
void) {
133 KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_NONE);
135 KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_ADVANCE);
136 abs_mmio_write32_shadowed(kBase + KEYMGR_CONTROL_SHADOWED_REG_OFFSET, reg);
138 abs_mmio_write32(kBase + KEYMGR_START_REG_OFFSET, 1);
141 rom_error_t sc_keymgr_state_check(sc_keymgr_state_t expected_state) {
142 return expected_state_check(expected_state);
151 static rom_error_t keymgr_is_idle(
void) {
152 uint32_t reg = abs_mmio_read32(kBase + KEYMGR_OP_STATUS_REG_OFFSET);
154 if (launder32(
status) == KEYMGR_OP_STATUS_STATUS_VALUE_IDLE) {
158 return kErrorKeymgrInternal;
172 static rom_error_t keymgr_wait_until_done(
void) {
178 reg = abs_mmio_read32(kBase + KEYMGR_OP_STATUS_REG_OFFSET);
179 abs_mmio_write32(kBase + KEYMGR_OP_STATUS_REG_OFFSET, reg);
181 }
while (
status == KEYMGR_OP_STATUS_STATUS_VALUE_WIP);
186 switch (launder32(
status)) {
187 case KEYMGR_OP_STATUS_STATUS_VALUE_IDLE:
190 case KEYMGR_OP_STATUS_STATUS_VALUE_DONE_SUCCESS:
193 case KEYMGR_OP_STATUS_STATUS_VALUE_DONE_ERROR: {
195 uint32_t err_code = abs_mmio_read32(kBase + KEYMGR_ERR_CODE_REG_OFFSET);
196 abs_mmio_write32(kBase + KEYMGR_ERR_CODE_REG_OFFSET, err_code);
197 return kErrorKeymgrInternal;
203 return kErrorKeymgrInternal;
206 rom_error_t sc_keymgr_generate_key(
207 sc_keymgr_dest_t destination, sc_keymgr_key_type_t key_type,
209 HARDENED_RETURN_IF_ERROR(keymgr_is_idle());
218 if (key_type == kScKeymgrKeyTypeAttestation) {
225 ctrl, KEYMGR_CONTROL_SHADOWED_OPERATION_FIELD,
226 KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_GENERATE_HW_OUTPUT);
229 abs_mmio_write32_shadowed(kBase + KEYMGR_CONTROL_SHADOWED_REG_OFFSET, ctrl);
232 abs_mmio_write32(kBase + KEYMGR_KEY_VERSION_REG_OFFSET,
235 for (
size_t i = 0; i < kScKeymgrSaltNumWords; i++) {
236 abs_mmio_write32(kBase + KEYMGR_SALT_0_REG_OFFSET + (i *
sizeof(uint32_t)),
237 diversification.
salt[i]);
241 abs_mmio_write32(kBase + KEYMGR_START_REG_OFFSET, 1 << KEYMGR_START_EN_BIT);
244 return keymgr_wait_until_done();
247 rom_error_t sc_keymgr_sideload_clear(sc_keymgr_dest_t destination) {
248 HARDENED_RETURN_IF_ERROR(keymgr_is_idle());
252 kBase + KEYMGR_SIDELOAD_CLEAR_REG_OFFSET,
256 uint32_t sideload_clear =
257 abs_mmio_read32(kBase + KEYMGR_SIDELOAD_CLEAR_REG_OFFSET);
260 return kErrorKeymgrInternal;
270 kBase + KEYMGR_SIDELOAD_CLEAR_REG_OFFSET,
272 KEYMGR_SIDELOAD_CLEAR_VAL_VALUE_NONE));
279 uint32_t max_key_version) {
280 HARDENED_RETURN_IF_ERROR(sc_keymgr_state_check(kScKeymgrStateCreatorRootKey));
281 sc_keymgr_sw_binding_set(sealing_binding, attest_binding);
282 sc_keymgr_owner_int_max_ver_set(max_key_version);
283 sc_keymgr_advance_state();
284 HARDENED_RETURN_IF_ERROR(
285 sc_keymgr_state_check(kScKeymgrStateOwnerIntermediateKey));
291 uint32_t max_key_version) {
292 HARDENED_RETURN_IF_ERROR(
293 sc_keymgr_state_check(kScKeymgrStateOwnerIntermediateKey));
294 sc_keymgr_sw_binding_set(sealing_binding, attest_binding);
295 sc_keymgr_owner_max_ver_set(max_key_version);
296 sc_keymgr_advance_state();
297 HARDENED_RETURN_IF_ERROR(sc_keymgr_state_check(kScKeymgrStateOwnerKey));
301 extern rom_error_t sc_keymgr_generate_key_otbn(
303 extern rom_error_t sc_keymgr_sideload_clear_otbn(
void);