5 #include "sw/device/silicon_creator/lib/drivers/keymgr.h"
10 #include "gtest/gtest.h"
11 #include "sw/device/lib/base/mock_abs_mmio.h"
12 #include "sw/device/silicon_creator/lib/base/mock_sec_mmio.h"
13 #include "sw/device/silicon_creator/lib/error.h"
16 #include "keymgr_regs.h"
18 namespace keymgr_unittest {
29 void ExpectStatusCheck(uint32_t op_status, uint32_t km_state,
31 EXPECT_ABS_READ32(base_ + KEYMGR_OP_STATUS_REG_OFFSET, op_status);
32 EXPECT_ABS_WRITE32(base_ + KEYMGR_OP_STATUS_REG_OFFSET, op_status);
34 EXPECT_ABS_READ32(base_ + KEYMGR_ERR_CODE_REG_OFFSET, err_code);
35 EXPECT_ABS_WRITE32(base_ + KEYMGR_ERR_CODE_REG_OFFSET, err_code);
37 EXPECT_SEC_READ32(base_ + KEYMGR_WORKING_STATE_REG_OFFSET, km_state);
39 void ExpectIdleCheck(uint32_t op_status) {
40 EXPECT_ABS_READ32(base_ + KEYMGR_OP_STATUS_REG_OFFSET, op_status);
43 EXPECT_ABS_WRITE32(base_ + KEYMGR_KEY_VERSION_REG_OFFSET,
45 EXPECT_ABS_WRITE32(base_ + KEYMGR_SALT_0_REG_OFFSET,
46 diversification.
salt[0]);
47 EXPECT_ABS_WRITE32(base_ + KEYMGR_SALT_1_REG_OFFSET,
48 diversification.
salt[1]);
49 EXPECT_ABS_WRITE32(base_ + KEYMGR_SALT_2_REG_OFFSET,
50 diversification.
salt[2]);
51 EXPECT_ABS_WRITE32(base_ + KEYMGR_SALT_3_REG_OFFSET,
52 diversification.
salt[3]);
53 EXPECT_ABS_WRITE32(base_ + KEYMGR_SALT_4_REG_OFFSET,
54 diversification.
salt[4]);
55 EXPECT_ABS_WRITE32(base_ + KEYMGR_SALT_5_REG_OFFSET,
56 diversification.
salt[5]);
57 EXPECT_ABS_WRITE32(base_ + KEYMGR_SALT_6_REG_OFFSET,
58 diversification.
salt[6]);
59 EXPECT_ABS_WRITE32(base_ + KEYMGR_SALT_7_REG_OFFSET,
60 diversification.
salt[7]);
62 void ExpectSwBindingUnlockWait(
void) {
63 EXPECT_ABS_READ32(base_ + KEYMGR_SW_BINDING_REGWEN_REG_OFFSET, 1);
64 EXPECT_SEC_READ32(base_ + KEYMGR_SW_BINDING_REGWEN_REG_OFFSET, 1);
66 void ExpectSwBindingValueSet(
69 EXPECT_SEC_WRITE32(base_ + KEYMGR_SEALING_SW_BINDING_0_REG_OFFSET,
70 binding_value_sealing->data[0]);
71 EXPECT_SEC_WRITE32(base_ + KEYMGR_SEALING_SW_BINDING_1_REG_OFFSET,
72 binding_value_sealing->data[1]);
73 EXPECT_SEC_WRITE32(base_ + KEYMGR_SEALING_SW_BINDING_2_REG_OFFSET,
74 binding_value_sealing->data[2]);
75 EXPECT_SEC_WRITE32(base_ + KEYMGR_SEALING_SW_BINDING_3_REG_OFFSET,
76 binding_value_sealing->data[3]);
77 EXPECT_SEC_WRITE32(base_ + KEYMGR_SEALING_SW_BINDING_4_REG_OFFSET,
78 binding_value_sealing->data[4]);
79 EXPECT_SEC_WRITE32(base_ + KEYMGR_SEALING_SW_BINDING_5_REG_OFFSET,
80 binding_value_sealing->data[5]);
81 EXPECT_SEC_WRITE32(base_ + KEYMGR_SEALING_SW_BINDING_6_REG_OFFSET,
82 binding_value_sealing->data[6]);
83 EXPECT_SEC_WRITE32(base_ + KEYMGR_SEALING_SW_BINDING_7_REG_OFFSET,
84 binding_value_sealing->data[7]);
86 EXPECT_SEC_WRITE32(base_ + KEYMGR_ATTEST_SW_BINDING_0_REG_OFFSET,
87 binding_value_attestation->data[0]);
88 EXPECT_SEC_WRITE32(base_ + KEYMGR_ATTEST_SW_BINDING_1_REG_OFFSET,
89 binding_value_attestation->data[1]);
90 EXPECT_SEC_WRITE32(base_ + KEYMGR_ATTEST_SW_BINDING_2_REG_OFFSET,
91 binding_value_attestation->data[2]);
92 EXPECT_SEC_WRITE32(base_ + KEYMGR_ATTEST_SW_BINDING_3_REG_OFFSET,
93 binding_value_attestation->data[3]);
94 EXPECT_SEC_WRITE32(base_ + KEYMGR_ATTEST_SW_BINDING_4_REG_OFFSET,
95 binding_value_attestation->data[4]);
96 EXPECT_SEC_WRITE32(base_ + KEYMGR_ATTEST_SW_BINDING_5_REG_OFFSET,
97 binding_value_attestation->data[5]);
98 EXPECT_SEC_WRITE32(base_ + KEYMGR_ATTEST_SW_BINDING_6_REG_OFFSET,
99 binding_value_attestation->data[6]);
100 EXPECT_SEC_WRITE32(base_ + KEYMGR_ATTEST_SW_BINDING_7_REG_OFFSET,
101 binding_value_attestation->data[7]);
103 EXPECT_SEC_WRITE32(base_ + KEYMGR_SW_BINDING_REGWEN_REG_OFFSET, 0);
105 void ExpectAdvanceState(
void) {
106 EXPECT_ABS_WRITE32_SHADOWED(
107 base_ + KEYMGR_CONTROL_SHADOWED_REG_OFFSET,
109 {KEYMGR_CONTROL_SHADOWED_DEST_SEL_OFFSET,
110 KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_NONE},
111 {KEYMGR_CONTROL_SHADOWED_OPERATION_OFFSET,
112 KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_ADVANCE},
114 EXPECT_ABS_WRITE32(base_ + KEYMGR_START_REG_OFFSET,
116 {KEYMGR_START_EN_BIT,
true},
119 void ExpectWaitUntilDone(
size_t busy_cycles, uint32_t end_status) {
120 for (
size_t i = 0; i < busy_cycles; i++) {
121 EXPECT_ABS_READ32(base_ + KEYMGR_OP_STATUS_REG_OFFSET,
122 KEYMGR_OP_STATUS_STATUS_VALUE_WIP);
123 EXPECT_ABS_WRITE32(base_ + KEYMGR_OP_STATUS_REG_OFFSET,
124 KEYMGR_OP_STATUS_STATUS_VALUE_WIP);
126 EXPECT_ABS_READ32(base_ + KEYMGR_OP_STATUS_REG_OFFSET, end_status);
127 EXPECT_ABS_WRITE32(base_ + KEYMGR_OP_STATUS_REG_OFFSET, end_status);
131 .max_key_ver = 0xA5A5A5A5,
132 .binding_value_sealing = {0, 1, 2, 3, 4, 6, 7, 8},
133 .binding_value_attestation = {9, 10, 11, 12, 13, 14, 15},
135 rom_test::MockAbsMmio mmio_;
136 rom_test::MockSecMmio sec_mmio_;
139 TEST_F(
KeymgrTest, EntropyReseedIntervalSet) {
140 EXPECT_SEC_WRITE32_SHADOWED(
141 base_ + KEYMGR_RESEED_INTERVAL_SHADOWED_REG_OFFSET, 0u);
143 sc_keymgr_entropy_reseed_interval_set(0u);
146 TEST_F(KeymgrTest, SwBindingValuesSet) {
147 ExpectSwBindingValueSet(&cfg_.binding_value_sealing,
148 &cfg_.binding_value_attestation);
149 sc_keymgr_sw_binding_set(&cfg_.binding_value_sealing,
150 &cfg_.binding_value_attestation);
153 TEST_F(KeymgrTest, SwBindingUnlockWait) {
154 ExpectSwBindingUnlockWait();
155 sc_keymgr_sw_binding_unlock_wait();
158 TEST_F(KeymgrTest, SetCreatorMaxVerKey) {
159 EXPECT_SEC_WRITE32_SHADOWED(
160 base_ + KEYMGR_MAX_CREATOR_KEY_VER_SHADOWED_REG_OFFSET, cfg_.max_key_ver);
161 EXPECT_SEC_WRITE32(base_ + KEYMGR_MAX_CREATOR_KEY_VER_REGWEN_REG_OFFSET, 0);
162 sc_keymgr_creator_max_ver_set(cfg_.max_key_ver);
165 TEST_F(KeymgrTest, SetOwnerIntMaxVerKey) {
166 EXPECT_SEC_WRITE32_SHADOWED(
167 base_ + KEYMGR_MAX_OWNER_INT_KEY_VER_SHADOWED_REG_OFFSET,
169 EXPECT_SEC_WRITE32(base_ + KEYMGR_MAX_OWNER_INT_KEY_VER_REGWEN_REG_OFFSET, 0);
170 sc_keymgr_owner_int_max_ver_set(cfg_.max_key_ver);
173 TEST_F(KeymgrTest, SetOwnerMaxVerKey) {
174 EXPECT_SEC_WRITE32_SHADOWED(
175 base_ + KEYMGR_MAX_OWNER_KEY_VER_SHADOWED_REG_OFFSET, cfg_.max_key_ver);
176 EXPECT_SEC_WRITE32(base_ + KEYMGR_MAX_OWNER_KEY_VER_REGWEN_REG_OFFSET, 0);
177 sc_keymgr_owner_max_ver_set(cfg_.max_key_ver);
180 TEST_F(KeymgrTest, AdvanceState) {
181 ExpectAdvanceState();
182 sc_keymgr_advance_state();
185 TEST_F(KeymgrTest, CheckState) {
186 ExpectStatusCheck(KEYMGR_OP_STATUS_STATUS_VALUE_IDLE,
187 KEYMGR_WORKING_STATE_STATE_VALUE_CREATOR_ROOT_KEY,
189 EXPECT_EQ(sc_keymgr_state_check(kScKeymgrStateCreatorRootKey), kErrorOk);
192 TEST_F(KeymgrTest, CheckStateInvalidResponse) {
193 ExpectStatusCheck(KEYMGR_OP_STATUS_STATUS_VALUE_IDLE,
194 KEYMGR_WORKING_STATE_STATE_VALUE_INVALID,
196 EXPECT_EQ(sc_keymgr_state_check(kScKeymgrStateCreatorRootKey),
197 kErrorKeymgrInternal);
200 ExpectStatusCheck(KEYMGR_OP_STATUS_STATUS_VALUE_DONE_ERROR,
201 KEYMGR_WORKING_STATE_STATE_VALUE_CREATOR_ROOT_KEY,
203 EXPECT_EQ(sc_keymgr_state_check(kScKeymgrStateCreatorRootKey),
204 kErrorKeymgrInternal);
207 ExpectStatusCheck(KEYMGR_OP_STATUS_STATUS_VALUE_IDLE,
208 KEYMGR_WORKING_STATE_STATE_VALUE_CREATOR_ROOT_KEY,
210 EXPECT_EQ(sc_keymgr_state_check(kScKeymgrStateCreatorRootKey),
211 kErrorKeymgrInternal);
214 TEST_F(KeymgrTest, GenOtbnAttestationKey) {
216 .
salt = {0xf0f1f2f3, 0xf4f5f6f7, 0xf8f9fafb, 0xfcfdfeff, 0xd0d1d2d3,
217 0xd4d5d6d7, 0xd8d9dadb, 0xdcdddedf},
218 .version = cfg_.max_key_ver - 1,
221 ExpectIdleCheck(KEYMGR_OP_STATUS_STATUS_VALUE_IDLE);
222 EXPECT_ABS_WRITE32_SHADOWED(
223 base_ + KEYMGR_CONTROL_SHADOWED_REG_OFFSET,
225 {KEYMGR_CONTROL_SHADOWED_DEST_SEL_OFFSET,
226 KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_OTBN},
227 {KEYMGR_CONTROL_SHADOWED_CDI_SEL_BIT,
true},
228 {KEYMGR_CONTROL_SHADOWED_OPERATION_OFFSET,
229 KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_GENERATE_HW_OUTPUT},
231 ExpectDiversificationWrite(test_diversification);
232 EXPECT_ABS_WRITE32(base_ + KEYMGR_START_REG_OFFSET,
234 {KEYMGR_START_EN_BIT,
true},
236 ExpectWaitUntilDone(2,
237 KEYMGR_OP_STATUS_STATUS_VALUE_DONE_SUCCESS);
239 EXPECT_EQ(sc_keymgr_generate_key_otbn(kScKeymgrKeyTypeAttestation,
240 test_diversification),
244 TEST_F(KeymgrTest, GenOtbnSealingKey) {
246 .
salt = {0xf0f1f2f3, 0xf4f5f6f7, 0xf8f9fafb, 0xfcfdfeff, 0xd0d1d2d3,
247 0xd4d5d6d7, 0xd8d9dadb, 0xdcdddedf},
248 .version = cfg_.max_key_ver - 1,
251 ExpectIdleCheck(KEYMGR_OP_STATUS_STATUS_VALUE_IDLE);
252 EXPECT_ABS_WRITE32_SHADOWED(
253 base_ + KEYMGR_CONTROL_SHADOWED_REG_OFFSET,
255 {KEYMGR_CONTROL_SHADOWED_DEST_SEL_OFFSET,
256 KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_OTBN},
257 {KEYMGR_CONTROL_SHADOWED_CDI_SEL_BIT,
false},
258 {KEYMGR_CONTROL_SHADOWED_OPERATION_OFFSET,
259 KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_GENERATE_HW_OUTPUT},
261 ExpectDiversificationWrite(test_diversification);
262 EXPECT_ABS_WRITE32(base_ + KEYMGR_START_REG_OFFSET,
264 {KEYMGR_START_EN_BIT,
true},
266 ExpectWaitUntilDone(2,
267 KEYMGR_OP_STATUS_STATUS_VALUE_DONE_SUCCESS);
269 EXPECT_EQ(sc_keymgr_generate_key_otbn(kScKeymgrKeyTypeSealing,
270 test_diversification),
274 TEST_F(KeymgrTest, GenOtbnKeyNotIdle) {
276 .
salt = {0xf0f1f2f3, 0xf4f5f6f7, 0xf8f9fafb, 0xfcfdfeff, 0xd0d1d2d3,
277 0xd4d5d6d7, 0xd8d9dadb, 0xdcdddedf},
278 .version = cfg_.max_key_ver - 1,
281 ExpectIdleCheck(KEYMGR_OP_STATUS_STATUS_VALUE_WIP);
282 EXPECT_EQ(sc_keymgr_generate_key_otbn(kScKeymgrKeyTypeAttestation,
283 test_diversification),
284 kErrorKeymgrInternal);
285 ExpectIdleCheck(KEYMGR_OP_STATUS_STATUS_VALUE_DONE_ERROR);
286 EXPECT_EQ(sc_keymgr_generate_key_otbn(kScKeymgrKeyTypeAttestation,
287 test_diversification),
288 kErrorKeymgrInternal);
289 ExpectIdleCheck(KEYMGR_OP_STATUS_STATUS_VALUE_DONE_SUCCESS);
290 EXPECT_EQ(sc_keymgr_generate_key_otbn(kScKeymgrKeyTypeAttestation,
291 test_diversification),
292 kErrorKeymgrInternal);
295 TEST_F(KeymgrTest, GenOtbnKeyError) {
297 .
salt = {0xf0f1f2f3, 0xf4f5f6f7, 0xf8f9fafb, 0xfcfdfeff, 0xd0d1d2d3,
298 0xd4d5d6d7, 0xd8d9dadb, 0xdcdddedf},
299 .version = cfg_.max_key_ver - 1,
301 uint32_t err_code = 0x1;
303 ExpectIdleCheck(KEYMGR_OP_STATUS_STATUS_VALUE_IDLE);
304 EXPECT_ABS_WRITE32_SHADOWED(
305 base_ + KEYMGR_CONTROL_SHADOWED_REG_OFFSET,
307 {KEYMGR_CONTROL_SHADOWED_DEST_SEL_OFFSET,
308 KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_OTBN},
309 {KEYMGR_CONTROL_SHADOWED_CDI_SEL_BIT,
true},
310 {KEYMGR_CONTROL_SHADOWED_OPERATION_OFFSET,
311 KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_GENERATE_HW_OUTPUT},
313 ExpectDiversificationWrite(test_diversification);
314 EXPECT_ABS_WRITE32(base_ + KEYMGR_START_REG_OFFSET,
316 {KEYMGR_START_EN_BIT,
true},
318 ExpectWaitUntilDone(2,
319 KEYMGR_OP_STATUS_STATUS_VALUE_DONE_ERROR);
320 EXPECT_ABS_READ32(base_ + KEYMGR_ERR_CODE_REG_OFFSET, err_code);
321 EXPECT_ABS_WRITE32(base_ + KEYMGR_ERR_CODE_REG_OFFSET, err_code);
323 EXPECT_EQ(sc_keymgr_generate_key_otbn(kScKeymgrKeyTypeAttestation,
324 test_diversification),
325 kErrorKeymgrInternal);
328 TEST_F(KeymgrTest, SideloadClearOtbn) {
329 ExpectIdleCheck(KEYMGR_OP_STATUS_STATUS_VALUE_IDLE);
330 EXPECT_ABS_WRITE32(base_ + KEYMGR_SIDELOAD_CLEAR_REG_OFFSET,
332 {KEYMGR_SIDELOAD_CLEAR_VAL_OFFSET,
333 KEYMGR_SIDELOAD_CLEAR_VAL_VALUE_OTBN},
335 EXPECT_ABS_READ32(base_ + KEYMGR_SIDELOAD_CLEAR_REG_OFFSET,
337 {KEYMGR_SIDELOAD_CLEAR_VAL_OFFSET,
338 KEYMGR_SIDELOAD_CLEAR_VAL_VALUE_OTBN},
340 EXPECT_ABS_WRITE32(base_ + KEYMGR_SIDELOAD_CLEAR_REG_OFFSET,
342 {KEYMGR_SIDELOAD_CLEAR_VAL_OFFSET,
343 KEYMGR_SIDELOAD_CLEAR_VAL_VALUE_NONE},
346 EXPECT_EQ(sc_keymgr_sideload_clear_otbn(), kErrorOk);
349 TEST_F(KeymgrTest, SideloadClearOtbnNotIdle) {
350 ExpectIdleCheck(KEYMGR_OP_STATUS_STATUS_VALUE_WIP);
351 EXPECT_EQ(sc_keymgr_sideload_clear_otbn(), kErrorKeymgrInternal);
352 ExpectIdleCheck(KEYMGR_OP_STATUS_STATUS_VALUE_DONE_SUCCESS);
353 EXPECT_EQ(sc_keymgr_sideload_clear_otbn(), kErrorKeymgrInternal);
354 ExpectIdleCheck(KEYMGR_OP_STATUS_STATUS_VALUE_DONE_ERROR);
355 EXPECT_EQ(sc_keymgr_sideload_clear_otbn(), kErrorKeymgrInternal);
358 TEST_F(KeymgrTest, SideloadClearOtbnReadbackMismatch) {
359 ExpectIdleCheck(KEYMGR_OP_STATUS_STATUS_VALUE_IDLE);
360 EXPECT_ABS_WRITE32(base_ + KEYMGR_SIDELOAD_CLEAR_REG_OFFSET,
362 {KEYMGR_SIDELOAD_CLEAR_VAL_OFFSET,
363 KEYMGR_SIDELOAD_CLEAR_VAL_VALUE_OTBN},
367 EXPECT_ABS_READ32(base_ + KEYMGR_SIDELOAD_CLEAR_REG_OFFSET,
369 {KEYMGR_SIDELOAD_CLEAR_VAL_OFFSET,
370 KEYMGR_SIDELOAD_CLEAR_VAL_VALUE_AES},
373 EXPECT_EQ(sc_keymgr_sideload_clear_otbn(), kErrorKeymgrInternal);
376 TEST_F(KeymgrTest, OwnerIntAdvance) {
377 ExpectStatusCheck(KEYMGR_OP_STATUS_STATUS_VALUE_IDLE,
378 KEYMGR_WORKING_STATE_STATE_VALUE_CREATOR_ROOT_KEY,
380 ExpectSwBindingValueSet(&cfg_.binding_value_sealing,
381 &cfg_.binding_value_attestation);
382 EXPECT_SEC_WRITE32_SHADOWED(
383 base_ + KEYMGR_MAX_OWNER_INT_KEY_VER_SHADOWED_REG_OFFSET,
385 EXPECT_SEC_WRITE32(base_ + KEYMGR_MAX_OWNER_INT_KEY_VER_REGWEN_REG_OFFSET, 0);
386 ExpectAdvanceState();
387 ExpectStatusCheck(KEYMGR_OP_STATUS_STATUS_VALUE_IDLE,
388 KEYMGR_WORKING_STATE_STATE_VALUE_OWNER_INTERMEDIATE_KEY,
390 EXPECT_EQ(sc_keymgr_owner_int_advance(&cfg_.binding_value_sealing,
391 &cfg_.binding_value_attestation,
396 TEST_F(KeymgrTest, OwnerAdvance) {
397 ExpectStatusCheck(KEYMGR_OP_STATUS_STATUS_VALUE_IDLE,
398 KEYMGR_WORKING_STATE_STATE_VALUE_OWNER_INTERMEDIATE_KEY,
400 ExpectSwBindingValueSet(&cfg_.binding_value_sealing,
401 &cfg_.binding_value_attestation);
402 EXPECT_SEC_WRITE32_SHADOWED(
403 base_ + KEYMGR_MAX_OWNER_KEY_VER_SHADOWED_REG_OFFSET, cfg_.max_key_ver);
404 EXPECT_SEC_WRITE32(base_ + KEYMGR_MAX_OWNER_KEY_VER_REGWEN_REG_OFFSET, 0);
405 ExpectAdvanceState();
406 ExpectStatusCheck(KEYMGR_OP_STATUS_STATUS_VALUE_IDLE,
407 KEYMGR_WORKING_STATE_STATE_VALUE_OWNER_KEY,
409 EXPECT_EQ(sc_keymgr_owner_advance(&cfg_.binding_value_sealing,
410 &cfg_.binding_value_attestation,