5 #include "sw/device/silicon_creator/lib/ownership/ownership_activate.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_flash_ctrl.h"
16 #include "sw/device/silicon_creator/lib/drivers/mock_hmac.h"
17 #include "sw/device/silicon_creator/lib/drivers/mock_lifecycle.h"
18 #include "sw/device/silicon_creator/lib/drivers/mock_rnd.h"
19 #include "sw/device/silicon_creator/lib/error.h"
20 #include "sw/device/silicon_creator/lib/nonce.h"
21 #include "sw/device/silicon_creator/lib/ownership/datatypes.h"
22 #include "sw/device/silicon_creator/lib/ownership/mock_ownership_key.h"
23 #include "sw/device/silicon_creator/lib/ownership/owner_block.h"
24 #include "sw/device/silicon_creator/testing/rom_test.h"
28 using ::testing::Return;
29 using ::testing::SetArgPointee;
31 constexpr
nonce_t kDefaultNonce = {1, 2};
35 void MakePage1StructValid() {
36 owner_page[1].
header.tag = kTlvTagOwner;
37 owner_page[1].
header.length =
sizeof(owner_page[1]);
42 memset(owner_page[1].device_id, 0x7e,
sizeof(owner_page[1].device_id));
43 memset(owner_page[1].data, 0x5a,
sizeof(owner_page[1].data));
46 void MakePage1Valid(
bool valid) {
47 MakePage1StructValid();
48 ownership_state_t state =
49 static_cast<ownership_state_t
>(bootdata_.ownership_state);
50 owner_page_valid[1] = kOwnerPageStatusSigned;
51 uint32_t modifier = valid ? 0 : 1;
54 case kOwnershipStateUnlockedEndorsed:
57 EXPECT_CALL(hmac_, sha256(_, _, _))
59 bootdata_.next_owner[0] + modifier,
60 bootdata_.next_owner[1],
61 bootdata_.next_owner[2],
62 bootdata_.next_owner[3],
63 bootdata_.next_owner[4],
64 bootdata_.next_owner[5],
65 bootdata_.next_owner[6],
66 bootdata_.next_owner[7],
68 case kOwnershipStateUnlockedSelf:
72 case kOwnershipStateUnlockedAny:
75 case kOwnershipStateLockedOwner:
76 owner_page_valid[1] = kOwnerPageStatusSealed;
78 case kOwnershipStateRecovery:
79 owner_page_valid[1] = kOwnerPageStatusInvalid;
85 .
nonce = kDefaultNonce,
86 .ownership_state = kOwnershipStateLockedOwner,
89 .ownership_activate_req =
93 .
type = kBootSvcOwnershipActivateReqType,
95 .nonce = kDefaultNonce,
99 rom_test::MockHmac hmac_;
100 rom_test::MockRnd rnd_;
101 rom_test::MockFlashCtrl flash_ctrl_;
102 rom_test::MockBootSvcHeader hdr_;
103 rom_test::MockLifecycle lifecycle_;
104 rom_test::MockOwnershipKey ownership_key_;
109 public testing::WithParamInterface<ownership_state_t> {};
113 public testing::WithParamInterface<ownership_state_t> {};
117 bootdata_.ownership_state =
static_cast<uint32_t
>(GetParam());
118 EXPECT_CALL(hdr_, Finalize(_, _, _));
120 rom_error_t error = ownership_activate_handler(&message_, &bootdata_);
121 EXPECT_EQ(error, kErrorOwnershipInvalidState);
124 INSTANTIATE_TEST_SUITE_P(AllCases, OwnershipActivateInvalidStateTest,
125 testing::Values(kOwnershipStateLockedOwner,
126 kOwnershipStateRecovery));
129 TEST_P(OwnershipActivateValidStateTest, InvalidVersion) {
130 bootdata_.ownership_state =
static_cast<uint32_t
>(GetParam());
131 MakePage1Valid(
true);
132 owner_page[1].
header.version.major = 5;
134 EXPECT_CALL(ownership_key_, validate(1, kOwnershipKeyActivate, _, _, _))
136 EXPECT_CALL(lifecycle_, DeviceId(_))
138 EXPECT_CALL(hdr_, Finalize(_, _, _));
140 rom_error_t error = ownership_activate_handler(&message_, &bootdata_);
141 EXPECT_EQ(error, kErrorOwnershipOWNRVersion);
145 TEST_P(OwnershipActivateValidStateTest, InvalidSignature) {
146 bootdata_.ownership_state =
static_cast<uint32_t
>(GetParam());
149 MakePage1Valid(
true);
150 EXPECT_CALL(ownership_key_, validate(1, kOwnershipKeyActivate, _, _, _))
152 EXPECT_CALL(hdr_, Finalize(_, _, _));
154 rom_error_t error = ownership_activate_handler(&message_, &bootdata_);
155 EXPECT_EQ(error, kErrorOwnershipInvalidSignature);
159 TEST_P(OwnershipActivateValidStateTest, InvalidNonce) {
160 bootdata_.ownership_state =
static_cast<uint32_t
>(GetParam());
161 bootdata_.nonce = {3, 4};
164 MakePage1Valid(
true);
165 EXPECT_CALL(ownership_key_, validate(1, kOwnershipKeyActivate, _, _, _))
167 EXPECT_CALL(hdr_, Finalize(_, _, _));
169 rom_error_t error = ownership_activate_handler(&message_, &bootdata_);
170 EXPECT_EQ(error, kErrorOwnershipInvalidNonce);
174 TEST_P(OwnershipActivateValidStateTest, InvalidActivateDin) {
175 bootdata_.ownership_state =
static_cast<uint32_t
>(GetParam());
178 MakePage1Valid(
true);
179 EXPECT_CALL(ownership_key_, validate(1, kOwnershipKeyActivate, _, _, _))
181 EXPECT_CALL(lifecycle_, DeviceId(_))
183 EXPECT_CALL(hdr_, Finalize(_, _, _));
185 rom_error_t error = ownership_activate_handler(&message_, &bootdata_);
186 EXPECT_EQ(error, kErrorOwnershipInvalidDin);
191 TEST_P(OwnershipActivateValidStateTest, OwnerPageInvalid) {
192 ownership_state_t state = GetParam();
193 if (state == kOwnershipStateUnlockedAny) {
194 SUCCEED() <<
"There are no invalid conditions for UnlockedAny";
197 bootdata_.ownership_state =
static_cast<uint32_t
>(state);
199 rom_error_t expected_result = kErrorOk;
200 owner_page[0].
owner_key = {{1, 2, 3, 4, 5}};
201 bootdata_.next_owner[0] = 12345;
202 MakePage1Valid(
false);
205 case kOwnershipStateUnlockedSelf:
206 case kOwnershipStateUnlockedEndorsed:
208 expected_result = kErrorOwnershipInvalidInfoPage;
211 FAIL() <<
"Invalid state for this test: " << state;
214 EXPECT_CALL(hdr_, Finalize(_, _, _));
216 rom_error_t error = ownership_activate_handler(&message_, &bootdata_);
217 EXPECT_EQ(error, expected_result);
222 TEST_P(OwnershipActivateValidStateTest, OwnerPageValid) {
223 ownership_state_t state = GetParam();
224 bootdata_.ownership_state =
static_cast<uint32_t
>(state);
227 memset(bootdata_.next_owner, 0,
sizeof(bootdata_.next_owner));
228 bootdata_.next_owner[0] = 12345;
229 MakePage1Valid(
true);
231 EXPECT_CALL(ownership_key_, validate(1, kOwnershipKeyActivate, _, _, _))
233 EXPECT_CALL(lifecycle_, DeviceId(_))
237 case kOwnershipStateUnlockedSelf:
238 case kOwnershipStateUnlockedAny:
239 case kOwnershipStateUnlockedEndorsed:
243 FAIL() <<
"Invalid state for this test: " << state;
246 EXPECT_CALL(ownership_key_, seal_page(1));
249 EXPECT_CALL(flash_ctrl_,
250 InfoErase(&kFlashCtrlInfoPageOwnerSlot1, kFlashCtrlEraseTypePage))
251 .WillOnce(Return(kErrorOk));
252 EXPECT_CALL(flash_ctrl_, InfoWrite(&kFlashCtrlInfoPageOwnerSlot1, 0,
253 sizeof(owner_page[1]) /
sizeof(uint32_t),
255 .WillOnce(Return(kErrorOk));
257 EXPECT_CALL(flash_ctrl_,
258 InfoErase(&kFlashCtrlInfoPageOwnerSlot0, kFlashCtrlEraseTypePage))
259 .WillOnce(Return(kErrorOk));
260 EXPECT_CALL(flash_ctrl_, InfoWrite(&kFlashCtrlInfoPageOwnerSlot0, 0,
261 sizeof(owner_page[1]) /
sizeof(uint32_t),
263 .WillOnce(Return(kErrorOk));
265 if (state != kOwnershipStateUnlockedSelf) {
266 EXPECT_CALL(ownership_key_, secret_new()).WillOnce(Return(kErrorOk));
270 EXPECT_CALL(rnd_, Uint32()).WillRepeatedly(Return(99));
272 EXPECT_CALL(hdr_, Finalize(_, _, _));
274 rom_error_t error = ownership_activate_handler(&message_, &bootdata_);
275 EXPECT_EQ(error, kErrorWriteBootdataThenReboot);
278 EXPECT_FALSE(nonce_equal(&bootdata_.nonce, &kDefaultNonce));
279 EXPECT_EQ(bootdata_.ownership_state, kOwnershipStateLockedOwner);
282 EXPECT_EQ(bootdata_.min_security_version_bl0, 0);
290 TEST_P(OwnershipActivateValidStateTest, UpdateBootdataBl0) {
291 ownership_state_t state = GetParam();
292 bootdata_.ownership_state =
static_cast<uint32_t
>(state);
295 memset(bootdata_.next_owner, 0,
sizeof(bootdata_.next_owner));
296 bootdata_.next_owner[0] = 12345;
297 MakePage1Valid(
true);
300 EXPECT_CALL(ownership_key_, validate(1, kOwnershipKeyActivate, _, _, _))
302 EXPECT_CALL(lifecycle_, DeviceId(_))
306 case kOwnershipStateUnlockedSelf:
307 case kOwnershipStateUnlockedAny:
308 case kOwnershipStateUnlockedEndorsed:
312 FAIL() <<
"Invalid state for this test: " << state;
315 EXPECT_CALL(ownership_key_, seal_page(1));
318 EXPECT_CALL(flash_ctrl_,
319 InfoErase(&kFlashCtrlInfoPageOwnerSlot1, kFlashCtrlEraseTypePage))
320 .WillOnce(Return(kErrorOk));
321 EXPECT_CALL(flash_ctrl_, InfoWrite(&kFlashCtrlInfoPageOwnerSlot1, 0,
322 sizeof(owner_page[1]) /
sizeof(uint32_t),
324 .WillOnce(Return(kErrorOk));
326 EXPECT_CALL(flash_ctrl_,
327 InfoErase(&kFlashCtrlInfoPageOwnerSlot0, kFlashCtrlEraseTypePage))
328 .WillOnce(Return(kErrorOk));
329 EXPECT_CALL(flash_ctrl_, InfoWrite(&kFlashCtrlInfoPageOwnerSlot0, 0,
330 sizeof(owner_page[1]) /
sizeof(uint32_t),
332 .WillOnce(Return(kErrorOk));
334 if (state != kOwnershipStateUnlockedSelf) {
335 EXPECT_CALL(ownership_key_, secret_new()).WillOnce(Return(kErrorOk));
339 EXPECT_CALL(rnd_, Uint32()).WillRepeatedly(Return(99));
341 EXPECT_CALL(hdr_, Finalize(_, _, _));
343 rom_error_t error = ownership_activate_handler(&message_, &bootdata_);
344 EXPECT_EQ(error, kErrorWriteBootdataThenReboot);
347 EXPECT_FALSE(nonce_equal(&bootdata_.nonce, &kDefaultNonce));
348 EXPECT_EQ(bootdata_.ownership_state, kOwnershipStateLockedOwner);
350 EXPECT_EQ(bootdata_.min_security_version_bl0, 5);
353 INSTANTIATE_TEST_SUITE_P(AllCases, OwnershipActivateValidStateTest,
354 testing::Values(kOwnershipStateUnlockedSelf,
355 kOwnershipStateUnlockedAny,
356 kOwnershipStateUnlockedEndorsed));