5 #include "sw/device/silicon_creator/lib/ownership/ownership_unlock.h"
9 #include "gmock/gmock.h"
10 #include "gtest/gtest.h"
11 #include "sw/device/lib/base/global_mock.h"
13 #include "sw/device/silicon_creator/lib/boot_data.h"
14 #include "sw/device/silicon_creator/lib/boot_svc/mock_boot_svc_header.h"
15 #include "sw/device/silicon_creator/lib/drivers/mock_hmac.h"
16 #include "sw/device/silicon_creator/lib/drivers/mock_lifecycle.h"
17 #include "sw/device/silicon_creator/lib/drivers/mock_rnd.h"
18 #include "sw/device/silicon_creator/lib/error.h"
19 #include "sw/device/silicon_creator/lib/ownership/datatypes.h"
20 #include "sw/device/silicon_creator/lib/ownership/mock_ownership_key.h"
21 #include "sw/device/silicon_creator/lib/ownership/owner_block.h"
22 #include "sw/device/silicon_creator/testing/rom_test.h"
26 using ::testing::Return;
27 using ::testing::SetArgPointee;
39 .ownership_state = kOwnershipStateLockedOwner,
42 .ownership_unlock_req =
46 .
type = kBootSvcOwnershipUnlockReqType,
53 void SetUp()
override {
56 owner_page[0].
update_mode = kOwnershipUpdateModeOpen;
59 rom_test::MockHmac hmac_;
60 rom_test::MockRnd rnd_;
61 rom_test::MockBootSvcHeader hdr_;
62 rom_test::MockLifecycle lifecycle_;
63 rom_test::MockOwnershipKey ownership_key_;
68 public testing::WithParamInterface<ownership_state_t> {};
72 public testing::WithParamInterface<ownership_state_t> {};
76 public testing::WithParamInterface<ownership_state_t> {};
80 public testing::WithParamInterface<ownership_state_t> {};
84 public testing::WithParamInterface<ownership_state_t> {};
88 public testing::WithParamInterface<ownership_update_mode_t> {};
92 message_.ownership_unlock_req.unlock_mode = 12345;
93 EXPECT_CALL(hdr_, Finalize(_, _, _));
94 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
95 EXPECT_EQ(error, kErrorOwnershipInvalidRequest);
99 TEST_F(OwnershipUnlockTest, UnlockAny) {
100 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockAny;
101 EXPECT_CALL(ownership_key_,
103 static_cast<ownership_key_t
>(kOwnershipKeyUnlock |
104 kOwnershipKeyRecovery),
107 EXPECT_CALL(lifecycle_, DeviceId(_))
109 EXPECT_CALL(rnd_, Uint32()).WillRepeatedly(Return(5));
110 EXPECT_CALL(hdr_, Finalize(_, _, _));
112 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
113 EXPECT_EQ(error, kErrorWriteBootdataThenReboot);
114 EXPECT_EQ(bootdata_.nonce.value[0], 5);
115 EXPECT_EQ(bootdata_.nonce.value[1], 5);
116 EXPECT_EQ(bootdata_.ownership_state, kOwnershipStateUnlockedAny);
121 TEST_F(OwnershipUnlockTest, UnlockAnyBadSignature) {
122 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockAny;
123 EXPECT_CALL(ownership_key_,
125 static_cast<ownership_key_t
>(kOwnershipKeyUnlock |
126 kOwnershipKeyRecovery),
129 EXPECT_CALL(hdr_, Finalize(_, _, _));
131 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
132 EXPECT_EQ(error, kErrorOwnershipInvalidSignature);
133 EXPECT_EQ(bootdata_.ownership_state, kOwnershipStateLockedOwner);
138 TEST_F(OwnershipUnlockTest, UnlockAnyBadDin) {
139 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockAny;
140 EXPECT_CALL(ownership_key_,
142 static_cast<ownership_key_t
>(kOwnershipKeyUnlock |
143 kOwnershipKeyRecovery),
146 EXPECT_CALL(lifecycle_, DeviceId(_))
148 EXPECT_CALL(hdr_, Finalize(_, _, _));
150 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
151 EXPECT_EQ(error, kErrorOwnershipInvalidDin);
152 EXPECT_EQ(bootdata_.ownership_state, kOwnershipStateLockedOwner);
157 TEST_F(OwnershipUnlockTest, UnlockAnyBadNonce) {
158 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockAny;
159 message_.ownership_unlock_req.nonce = {3, 4};
160 EXPECT_CALL(ownership_key_,
162 static_cast<ownership_key_t
>(kOwnershipKeyUnlock |
163 kOwnershipKeyRecovery),
166 EXPECT_CALL(hdr_, Finalize(_, _, _));
168 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
169 EXPECT_EQ(error, kErrorOwnershipInvalidNonce);
170 EXPECT_EQ(bootdata_.ownership_state, kOwnershipStateLockedOwner);
174 TEST_P(OwnershipUnlockAnyStateTest, InvalidState) {
175 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockAny;
176 bootdata_.ownership_state =
static_cast<uint32_t
>(GetParam());
177 EXPECT_CALL(hdr_, Finalize(_, _, _));
179 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
180 EXPECT_EQ(error, kErrorOwnershipInvalidState);
183 INSTANTIATE_TEST_SUITE_P(AllCases, OwnershipUnlockAnyStateTest,
184 testing::Values(kOwnershipStateUnlockedSelf,
185 kOwnershipStateUnlockedAny,
186 kOwnershipStateUnlockedEndorsed));
189 TEST_F(OwnershipUnlockTest, UnlockEndorsed) {
190 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockEndorsed;
191 EXPECT_CALL(ownership_key_,
193 static_cast<ownership_key_t
>(kOwnershipKeyUnlock |
194 kOwnershipKeyRecovery),
197 EXPECT_CALL(lifecycle_, DeviceId(_))
199 EXPECT_CALL(hmac_, sha256(_, _, _))
201 for (
size_t i = 0; i <
ARRAYSIZE(digest->digest); ++i) {
202 digest->digest[i] = i;
205 EXPECT_CALL(rnd_, Uint32()).WillRepeatedly(Return(5));
206 EXPECT_CALL(hdr_, Finalize(_, _, _));
208 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
209 EXPECT_EQ(error, kErrorWriteBootdataThenReboot);
210 EXPECT_EQ(bootdata_.nonce.value[0], 5);
211 EXPECT_EQ(bootdata_.nonce.value[1], 5);
212 EXPECT_EQ(bootdata_.ownership_state, kOwnershipStateUnlockedEndorsed);
213 for (
size_t i = 0; i <
ARRAYSIZE(bootdata_.next_owner); ++i) {
214 EXPECT_EQ(bootdata_.next_owner[i], i);
220 TEST_F(OwnershipUnlockTest, UnlockEndorsedBadSignature) {
221 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockEndorsed;
222 EXPECT_CALL(ownership_key_,
224 static_cast<ownership_key_t
>(kOwnershipKeyUnlock |
225 kOwnershipKeyRecovery),
228 EXPECT_CALL(hdr_, Finalize(_, _, _));
230 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
231 EXPECT_EQ(error, kErrorOwnershipInvalidSignature);
232 EXPECT_EQ(bootdata_.ownership_state, kOwnershipStateLockedOwner);
237 TEST_F(OwnershipUnlockTest, UnlockEndorsedBadNonce) {
238 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockEndorsed;
239 message_.ownership_unlock_req.nonce = {3, 4};
240 EXPECT_CALL(ownership_key_,
242 static_cast<ownership_key_t
>(kOwnershipKeyUnlock |
243 kOwnershipKeyRecovery),
246 EXPECT_CALL(hdr_, Finalize(_, _, _));
248 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
249 EXPECT_EQ(error, kErrorOwnershipInvalidNonce);
250 EXPECT_EQ(bootdata_.ownership_state, kOwnershipStateLockedOwner);
254 TEST_P(OwnershipUnlockEndorsedStateTest, InvalidState) {
255 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockEndorsed;
256 bootdata_.ownership_state =
static_cast<uint32_t
>(GetParam());
257 EXPECT_CALL(hdr_, Finalize(_, _, _));
259 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
260 EXPECT_EQ(error, kErrorOwnershipInvalidState);
263 INSTANTIATE_TEST_SUITE_P(AllCases, OwnershipUnlockEndorsedStateTest,
264 testing::Values(kOwnershipStateUnlockedSelf,
265 kOwnershipStateUnlockedAny,
266 kOwnershipStateUnlockedEndorsed));
269 TEST_F(OwnershipUnlockTest, UnlockUpdate) {
270 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockUpdate;
273 validate(0,
static_cast<ownership_key_t
>(kOwnershipKeyUnlock), _, _, _))
275 EXPECT_CALL(lifecycle_, DeviceId(_))
277 EXPECT_CALL(rnd_, Uint32()).WillRepeatedly(Return(5));
278 EXPECT_CALL(hdr_, Finalize(_, _, _));
280 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
281 EXPECT_EQ(error, kErrorWriteBootdataThenReboot);
282 EXPECT_EQ(bootdata_.nonce.value[0], 5);
283 EXPECT_EQ(bootdata_.nonce.value[1], 5);
284 EXPECT_EQ(bootdata_.ownership_state, kOwnershipStateUnlockedSelf);
289 TEST_F(OwnershipUnlockTest, UnlockedUpdateBadSignature) {
290 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockUpdate;
293 validate(0,
static_cast<ownership_key_t
>(kOwnershipKeyUnlock), _, _, _))
295 EXPECT_CALL(hdr_, Finalize(_, _, _));
297 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
298 EXPECT_EQ(error, kErrorOwnershipInvalidSignature);
299 EXPECT_EQ(bootdata_.ownership_state, kOwnershipStateLockedOwner);
304 TEST_F(OwnershipUnlockTest, UnlockedUpdateBadNonce) {
305 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockUpdate;
306 message_.ownership_unlock_req.nonce = {3, 4};
310 validate(0,
static_cast<ownership_key_t
>(kOwnershipKeyUnlock), _, _, _))
312 EXPECT_CALL(hdr_, Finalize(_, _, _));
314 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
315 EXPECT_EQ(error, kErrorOwnershipInvalidNonce);
316 EXPECT_EQ(bootdata_.ownership_state, kOwnershipStateLockedOwner);
320 TEST_P(OwnershipUnlockedUpdateStateTest, InvalidState) {
321 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockUpdate;
322 bootdata_.ownership_state =
static_cast<uint32_t
>(GetParam());
323 EXPECT_CALL(hdr_, Finalize(_, _, _));
325 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
326 EXPECT_EQ(error, kErrorOwnershipInvalidState);
329 INSTANTIATE_TEST_SUITE_P(AllCases, OwnershipUnlockedUpdateStateTest,
330 testing::Values(kOwnershipStateUnlockedSelf,
331 kOwnershipStateUnlockedEndorsed,
332 kOwnershipStateRecovery));
335 TEST_P(OwnershipUnlockAbortValidStateTest, UnlockAbort) {
336 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockAbort;
337 bootdata_.ownership_state =
static_cast<uint32_t
>(GetParam());
340 validate(0,
static_cast<ownership_key_t
>(kOwnershipKeyUnlock), _, _, _))
342 EXPECT_CALL(lifecycle_, DeviceId(_))
344 EXPECT_CALL(rnd_, Uint32()).WillRepeatedly(Return(5));
345 EXPECT_CALL(hdr_, Finalize(_, _, _));
347 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
348 EXPECT_EQ(error, kErrorWriteBootdataThenReboot);
349 EXPECT_EQ(bootdata_.nonce.value[0], 5);
350 EXPECT_EQ(bootdata_.nonce.value[1], 5);
351 EXPECT_EQ(bootdata_.ownership_state, kOwnershipStateLockedOwner);
354 INSTANTIATE_TEST_SUITE_P(AllCases, OwnershipUnlockAbortValidStateTest,
355 testing::Values(kOwnershipStateUnlockedSelf,
356 kOwnershipStateUnlockedEndorsed,
357 kOwnershipStateUnlockedAny));
360 TEST_P(OwnershipUnlockAbortInvalidStateTest, UnlockAbort) {
361 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockAbort;
362 bootdata_.ownership_state =
static_cast<uint32_t
>(GetParam());
363 EXPECT_CALL(hdr_, Finalize(_, _, _));
365 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
366 EXPECT_EQ(error, kErrorOwnershipInvalidState);
369 INSTANTIATE_TEST_SUITE_P(AllCases, OwnershipUnlockAbortInvalidStateTest,
370 testing::Values(kOwnershipStateLockedOwner,
371 kOwnershipStateRecovery));
375 TEST_P(OwnershipUnlockUpdateModesTest, UnlockAny) {
376 ownership_update_mode_t mode = GetParam();
377 owner_page[0].
update_mode =
static_cast<uint32_t
>(mode);
378 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockAny;
381 case kOwnershipUpdateModeOpen:
382 EXPECT_CALL(ownership_key_,
384 static_cast<ownership_key_t
>(kOwnershipKeyUnlock |
385 kOwnershipKeyRecovery),
388 EXPECT_CALL(lifecycle_, DeviceId(_))
390 EXPECT_CALL(rnd_, Uint32()).WillRepeatedly(Return(5));
391 expect = kErrorWriteBootdataThenReboot;
393 case kOwnershipUpdateModeNewVersion:
394 expect = kErrorOwnershipUnlockDenied;
396 case kOwnershipUpdateModeSelf:
397 case kOwnershipUpdateModeSelfVersion:
398 expect = kErrorOwnershipInvalidMode;
402 EXPECT_CALL(hdr_, Finalize(_, _, _));
403 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
404 EXPECT_EQ(error, expect);
409 TEST_P(OwnershipUnlockUpdateModesTest, UnlockUpdate) {
410 ownership_update_mode_t mode = GetParam();
411 owner_page[0].
update_mode =
static_cast<uint32_t
>(mode);
412 message_.ownership_unlock_req.unlock_mode = kBootSvcUnlockUpdate;
415 case kOwnershipUpdateModeOpen:
416 case kOwnershipUpdateModeSelf:
417 case kOwnershipUpdateModeSelfVersion:
418 EXPECT_CALL(ownership_key_,
419 validate(0,
static_cast<ownership_key_t
>(kOwnershipKeyUnlock),
422 EXPECT_CALL(lifecycle_, DeviceId(_))
424 EXPECT_CALL(rnd_, Uint32()).WillRepeatedly(Return(5));
425 expect = kErrorWriteBootdataThenReboot;
427 case kOwnershipUpdateModeNewVersion:
428 expect = kErrorOwnershipUnlockDenied;
432 EXPECT_CALL(hdr_, Finalize(_, _, _));
433 rom_error_t error = ownership_unlock_handler(&message_, &bootdata_);
434 EXPECT_EQ(error, expect);
437 INSTANTIATE_TEST_SUITE_P(AllCases, OwnershipUnlockUpdateModesTest,
438 testing::Values(kOwnershipUpdateModeOpen,
439 kOwnershipUpdateModeSelf,
440 kOwnershipUpdateModeSelfVersion,
441 kOwnershipUpdateModeNewVersion));