xref: /aosp_15_r20/external/vboot_reference/tests/vb2_kernel_tests.c (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2020 The ChromiumOS Authors
2*8617a60dSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
3*8617a60dSAndroid Build Coastguard Worker  * found in the LICENSE file.
4*8617a60dSAndroid Build Coastguard Worker  *
5*8617a60dSAndroid Build Coastguard Worker  * Tests for kernel selection, loading, verification, and booting.
6*8617a60dSAndroid Build Coastguard Worker  */
7*8617a60dSAndroid Build Coastguard Worker 
8*8617a60dSAndroid Build Coastguard Worker #include "2api.h"
9*8617a60dSAndroid Build Coastguard Worker #include "2common.h"
10*8617a60dSAndroid Build Coastguard Worker #include "2misc.h"
11*8617a60dSAndroid Build Coastguard Worker #include "2nvstorage.h"
12*8617a60dSAndroid Build Coastguard Worker #include "2rsa.h"
13*8617a60dSAndroid Build Coastguard Worker #include "2secdata.h"
14*8617a60dSAndroid Build Coastguard Worker #include "2sysincludes.h"
15*8617a60dSAndroid Build Coastguard Worker #include "common/boot_mode.h"
16*8617a60dSAndroid Build Coastguard Worker #include "common/tests.h"
17*8617a60dSAndroid Build Coastguard Worker 
18*8617a60dSAndroid Build Coastguard Worker /* Common context for tests */
19*8617a60dSAndroid Build Coastguard Worker static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE]
20*8617a60dSAndroid Build Coastguard Worker 	__attribute__((aligned(VB2_WORKBUF_ALIGN)));
21*8617a60dSAndroid Build Coastguard Worker static struct vb2_context *ctx;
22*8617a60dSAndroid Build Coastguard Worker static struct vb2_shared_data *sd;
23*8617a60dSAndroid Build Coastguard Worker static struct vb2_fw_preamble *fwpre;
24*8617a60dSAndroid Build Coastguard Worker static const char fw_kernel_key_data[36] = "Test kernel key data";
25*8617a60dSAndroid Build Coastguard Worker static struct vb2_kernel_params kparams;
26*8617a60dSAndroid Build Coastguard Worker 
27*8617a60dSAndroid Build Coastguard Worker /* Mocked function data */
28*8617a60dSAndroid Build Coastguard Worker 
29*8617a60dSAndroid Build Coastguard Worker static struct {
30*8617a60dSAndroid Build Coastguard Worker 	struct vb2_gbb_header h;
31*8617a60dSAndroid Build Coastguard Worker 	struct vb2_packed_key recovery_key;
32*8617a60dSAndroid Build Coastguard Worker 	char recovery_key_data[32];
33*8617a60dSAndroid Build Coastguard Worker } mock_gbb;
34*8617a60dSAndroid Build Coastguard Worker 
35*8617a60dSAndroid Build Coastguard Worker static int mock_read_res_fail_on_call;
36*8617a60dSAndroid Build Coastguard Worker static int mock_secdata_fwmp_check_retval;
37*8617a60dSAndroid Build Coastguard Worker static int mock_commit_data_called;
38*8617a60dSAndroid Build Coastguard Worker static int mock_ec_sync_called;
39*8617a60dSAndroid Build Coastguard Worker static int mock_ec_sync_retval;
40*8617a60dSAndroid Build Coastguard Worker static int mock_battery_cutoff_called;
41*8617a60dSAndroid Build Coastguard Worker static int mock_kernel_flag;
42*8617a60dSAndroid Build Coastguard Worker static int mock_kernel_flag_set;
43*8617a60dSAndroid Build Coastguard Worker static int mock_kernel_version_secdata;
44*8617a60dSAndroid Build Coastguard Worker 
45*8617a60dSAndroid Build Coastguard Worker /* Type of test to reset for */
46*8617a60dSAndroid Build Coastguard Worker enum reset_type {
47*8617a60dSAndroid Build Coastguard Worker 	FOR_PHASE1,
48*8617a60dSAndroid Build Coastguard Worker 	FOR_PHASE2,
49*8617a60dSAndroid Build Coastguard Worker 	FOR_FINALIZE,
50*8617a60dSAndroid Build Coastguard Worker };
51*8617a60dSAndroid Build Coastguard Worker 
reset_common_data(enum reset_type t)52*8617a60dSAndroid Build Coastguard Worker static void reset_common_data(enum reset_type t)
53*8617a60dSAndroid Build Coastguard Worker {
54*8617a60dSAndroid Build Coastguard Worker 	struct vb2_packed_key *k;
55*8617a60dSAndroid Build Coastguard Worker 
56*8617a60dSAndroid Build Coastguard Worker 	memset(workbuf, 0xaa, sizeof(workbuf));
57*8617a60dSAndroid Build Coastguard Worker 
58*8617a60dSAndroid Build Coastguard Worker 	memset(&kparams, 0, sizeof(kparams));
59*8617a60dSAndroid Build Coastguard Worker 
60*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
61*8617a60dSAndroid Build Coastguard Worker 		  "vb2api_init failed");
62*8617a60dSAndroid Build Coastguard Worker 
63*8617a60dSAndroid Build Coastguard Worker 	sd = vb2_get_sd(ctx);
64*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_init(ctx);
65*8617a60dSAndroid Build Coastguard Worker 
66*8617a60dSAndroid Build Coastguard Worker 	mock_read_res_fail_on_call = 0;
67*8617a60dSAndroid Build Coastguard Worker 	mock_secdata_fwmp_check_retval = VB2_SUCCESS;
68*8617a60dSAndroid Build Coastguard Worker 	mock_commit_data_called = 0;
69*8617a60dSAndroid Build Coastguard Worker 	mock_ec_sync_called = 0;
70*8617a60dSAndroid Build Coastguard Worker 	mock_ec_sync_retval = VB2_SUCCESS;
71*8617a60dSAndroid Build Coastguard Worker 	mock_battery_cutoff_called = 0;
72*8617a60dSAndroid Build Coastguard Worker 	mock_kernel_flag = 0;
73*8617a60dSAndroid Build Coastguard Worker 	mock_kernel_flag_set = 0;
74*8617a60dSAndroid Build Coastguard Worker 	mock_kernel_version_secdata = 0x10002;
75*8617a60dSAndroid Build Coastguard Worker 
76*8617a60dSAndroid Build Coastguard Worker 	/* Recovery key in mock GBB */
77*8617a60dSAndroid Build Coastguard Worker 	memset(&mock_gbb, 0, sizeof(mock_gbb));
78*8617a60dSAndroid Build Coastguard Worker 	mock_gbb.recovery_key.algorithm = 11;
79*8617a60dSAndroid Build Coastguard Worker 	mock_gbb.recovery_key.key_offset =
80*8617a60dSAndroid Build Coastguard Worker 		vb2_offset_of(&mock_gbb.recovery_key,
81*8617a60dSAndroid Build Coastguard Worker 			      &mock_gbb.recovery_key_data);
82*8617a60dSAndroid Build Coastguard Worker 	mock_gbb.recovery_key.key_size = sizeof(mock_gbb.recovery_key_data);
83*8617a60dSAndroid Build Coastguard Worker 	strcpy(mock_gbb.recovery_key_data, "The recovery key");
84*8617a60dSAndroid Build Coastguard Worker 	mock_gbb.h.recovery_key_offset =
85*8617a60dSAndroid Build Coastguard Worker 		vb2_offset_of(&mock_gbb, &mock_gbb.recovery_key);
86*8617a60dSAndroid Build Coastguard Worker 	mock_gbb.h.recovery_key_size =
87*8617a60dSAndroid Build Coastguard Worker 		mock_gbb.recovery_key.key_offset +
88*8617a60dSAndroid Build Coastguard Worker 		mock_gbb.recovery_key.key_size;
89*8617a60dSAndroid Build Coastguard Worker 	mock_gbb.h.major_version = VB2_GBB_MAJOR_VER;
90*8617a60dSAndroid Build Coastguard Worker 	mock_gbb.h.minor_version = VB2_GBB_MINOR_VER;
91*8617a60dSAndroid Build Coastguard Worker 
92*8617a60dSAndroid Build Coastguard Worker 	if (t == FOR_PHASE1) {
93*8617a60dSAndroid Build Coastguard Worker 		uint8_t *kdata;
94*8617a60dSAndroid Build Coastguard Worker 
95*8617a60dSAndroid Build Coastguard Worker 		/* Create mock firmware preamble in the context */
96*8617a60dSAndroid Build Coastguard Worker 		sd->preamble_offset = sd->workbuf_used;
97*8617a60dSAndroid Build Coastguard Worker 		fwpre = (struct vb2_fw_preamble *)
98*8617a60dSAndroid Build Coastguard Worker 			vb2_member_of(sd, sd->preamble_offset);
99*8617a60dSAndroid Build Coastguard Worker 		k = &fwpre->kernel_subkey;
100*8617a60dSAndroid Build Coastguard Worker 		kdata = (uint8_t *)fwpre + sizeof(*fwpre);
101*8617a60dSAndroid Build Coastguard Worker 		memcpy(kdata, fw_kernel_key_data, sizeof(fw_kernel_key_data));
102*8617a60dSAndroid Build Coastguard Worker 		k->algorithm = 7;
103*8617a60dSAndroid Build Coastguard Worker 		k->key_offset = vb2_offset_of(k, kdata);
104*8617a60dSAndroid Build Coastguard Worker 		k->key_size = sizeof(fw_kernel_key_data);
105*8617a60dSAndroid Build Coastguard Worker 		sd->preamble_size = sizeof(*fwpre) + k->key_size;
106*8617a60dSAndroid Build Coastguard Worker 		vb2_set_workbuf_used(ctx,
107*8617a60dSAndroid Build Coastguard Worker 				     sd->preamble_offset + sd->preamble_size);
108*8617a60dSAndroid Build Coastguard Worker 	} else if (t == FOR_FINALIZE) {
109*8617a60dSAndroid Build Coastguard Worker 		SET_BOOT_MODE(ctx, VB2_BOOT_MODE_NORMAL);
110*8617a60dSAndroid Build Coastguard Worker 		vb2_nv_set(ctx, VB2_NV_KERNEL_MAX_ROLLFORWARD, 0xffffffff);
111*8617a60dSAndroid Build Coastguard Worker 		sd->kernel_version_secdata = mock_kernel_version_secdata;
112*8617a60dSAndroid Build Coastguard Worker 	}
113*8617a60dSAndroid Build Coastguard Worker };
114*8617a60dSAndroid Build Coastguard Worker 
115*8617a60dSAndroid Build Coastguard Worker /* Mocked functions */
116*8617a60dSAndroid Build Coastguard Worker 
vb2api_secdata_fwmp_check(struct vb2_context * c,uint8_t * size)117*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_secdata_fwmp_check(struct vb2_context *c, uint8_t *size)
118*8617a60dSAndroid Build Coastguard Worker {
119*8617a60dSAndroid Build Coastguard Worker 	return mock_secdata_fwmp_check_retval;
120*8617a60dSAndroid Build Coastguard Worker }
121*8617a60dSAndroid Build Coastguard Worker 
vb2api_ec_sync(struct vb2_context * c)122*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_ec_sync(struct vb2_context *c)
123*8617a60dSAndroid Build Coastguard Worker {
124*8617a60dSAndroid Build Coastguard Worker 	mock_ec_sync_called = 1;
125*8617a60dSAndroid Build Coastguard Worker 	return mock_ec_sync_retval;
126*8617a60dSAndroid Build Coastguard Worker }
127*8617a60dSAndroid Build Coastguard Worker 
vb2api_auxfw_sync(struct vb2_context * c)128*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_auxfw_sync(struct vb2_context *c)
129*8617a60dSAndroid Build Coastguard Worker {
130*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_ec_sync_called, 1,
131*8617a60dSAndroid Build Coastguard Worker 		"  auxfw sync must happen after EC sync");
132*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
133*8617a60dSAndroid Build Coastguard Worker }
134*8617a60dSAndroid Build Coastguard Worker 
vb2ex_ec_battery_cutoff(void)135*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_ec_battery_cutoff(void)
136*8617a60dSAndroid Build Coastguard Worker {
137*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_ec_sync_called, 1,
138*8617a60dSAndroid Build Coastguard Worker 		"  battery cutoff must happen after EC sync");
139*8617a60dSAndroid Build Coastguard Worker 	mock_battery_cutoff_called = 1;
140*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
141*8617a60dSAndroid Build Coastguard Worker }
142*8617a60dSAndroid Build Coastguard Worker 
vb2_secdata_kernel_get_ec_hash(struct vb2_context * c)143*8617a60dSAndroid Build Coastguard Worker const uint8_t *vb2_secdata_kernel_get_ec_hash(struct vb2_context *c)
144*8617a60dSAndroid Build Coastguard Worker {
145*8617a60dSAndroid Build Coastguard Worker 	/*
146*8617a60dSAndroid Build Coastguard Worker 	 * Return NULL to prevent EC reboot due to
147*8617a60dSAndroid Build Coastguard Worker 	 * VB2_SD_FLAG_ECSYNC_HMIR_UPDATED.
148*8617a60dSAndroid Build Coastguard Worker 	 */
149*8617a60dSAndroid Build Coastguard Worker 	return NULL;
150*8617a60dSAndroid Build Coastguard Worker }
151*8617a60dSAndroid Build Coastguard Worker 
vb2_get_gbb(struct vb2_context * c)152*8617a60dSAndroid Build Coastguard Worker struct vb2_gbb_header *vb2_get_gbb(struct vb2_context *c)
153*8617a60dSAndroid Build Coastguard Worker {
154*8617a60dSAndroid Build Coastguard Worker 	return &mock_gbb.h;
155*8617a60dSAndroid Build Coastguard Worker }
156*8617a60dSAndroid Build Coastguard Worker 
vb2ex_read_resource(struct vb2_context * c,enum vb2_resource_index index,uint32_t offset,void * buf,uint32_t size)157*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_read_resource(struct vb2_context *c,
158*8617a60dSAndroid Build Coastguard Worker 				enum vb2_resource_index index, uint32_t offset,
159*8617a60dSAndroid Build Coastguard Worker 				void *buf, uint32_t size)
160*8617a60dSAndroid Build Coastguard Worker {
161*8617a60dSAndroid Build Coastguard Worker 	uint8_t *rptr;
162*8617a60dSAndroid Build Coastguard Worker 	uint32_t rsize;
163*8617a60dSAndroid Build Coastguard Worker 
164*8617a60dSAndroid Build Coastguard Worker 	if (--mock_read_res_fail_on_call == 0)
165*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_MOCK;
166*8617a60dSAndroid Build Coastguard Worker 
167*8617a60dSAndroid Build Coastguard Worker 	switch(index) {
168*8617a60dSAndroid Build Coastguard Worker 	case VB2_RES_GBB:
169*8617a60dSAndroid Build Coastguard Worker 		rptr = (uint8_t *)&mock_gbb;
170*8617a60dSAndroid Build Coastguard Worker 		rsize = sizeof(mock_gbb);
171*8617a60dSAndroid Build Coastguard Worker 		break;
172*8617a60dSAndroid Build Coastguard Worker 	default:
173*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_EX_READ_RESOURCE_INDEX;
174*8617a60dSAndroid Build Coastguard Worker 	}
175*8617a60dSAndroid Build Coastguard Worker 
176*8617a60dSAndroid Build Coastguard Worker 	if (offset > rsize || offset + size > rsize)
177*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_EX_READ_RESOURCE_SIZE;
178*8617a60dSAndroid Build Coastguard Worker 
179*8617a60dSAndroid Build Coastguard Worker 	memcpy(buf, rptr + offset, size);
180*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
181*8617a60dSAndroid Build Coastguard Worker }
182*8617a60dSAndroid Build Coastguard Worker 
vb2ex_commit_data(struct vb2_context * c)183*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_commit_data(struct vb2_context *c)
184*8617a60dSAndroid Build Coastguard Worker {
185*8617a60dSAndroid Build Coastguard Worker 	mock_commit_data_called = 1;
186*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
187*8617a60dSAndroid Build Coastguard Worker }
188*8617a60dSAndroid Build Coastguard Worker 
vb2_secdata_kernel_set(struct vb2_context * c,enum vb2_secdata_kernel_param param,uint32_t value)189*8617a60dSAndroid Build Coastguard Worker void vb2_secdata_kernel_set(struct vb2_context *c,
190*8617a60dSAndroid Build Coastguard Worker 			    enum vb2_secdata_kernel_param param,
191*8617a60dSAndroid Build Coastguard Worker 			    uint32_t value)
192*8617a60dSAndroid Build Coastguard Worker {
193*8617a60dSAndroid Build Coastguard Worker 	switch (param) {
194*8617a60dSAndroid Build Coastguard Worker 	case VB2_SECDATA_KERNEL_FLAGS:
195*8617a60dSAndroid Build Coastguard Worker 		mock_kernel_flag = value;
196*8617a60dSAndroid Build Coastguard Worker 		mock_kernel_flag_set = 1;
197*8617a60dSAndroid Build Coastguard Worker 		break;
198*8617a60dSAndroid Build Coastguard Worker 	case VB2_SECDATA_KERNEL_VERSIONS:
199*8617a60dSAndroid Build Coastguard Worker 		mock_kernel_version_secdata = value;
200*8617a60dSAndroid Build Coastguard Worker 		break;
201*8617a60dSAndroid Build Coastguard Worker 	default:
202*8617a60dSAndroid Build Coastguard Worker 		vb2ex_abort();
203*8617a60dSAndroid Build Coastguard Worker 	}
204*8617a60dSAndroid Build Coastguard Worker }
205*8617a60dSAndroid Build Coastguard Worker 
vb2_secdata_kernel_get(struct vb2_context * c,enum vb2_secdata_kernel_param param)206*8617a60dSAndroid Build Coastguard Worker uint32_t vb2_secdata_kernel_get(struct vb2_context *c,
207*8617a60dSAndroid Build Coastguard Worker 				enum vb2_secdata_kernel_param param)
208*8617a60dSAndroid Build Coastguard Worker {
209*8617a60dSAndroid Build Coastguard Worker 	switch (param) {
210*8617a60dSAndroid Build Coastguard Worker 	case VB2_SECDATA_KERNEL_FLAGS:
211*8617a60dSAndroid Build Coastguard Worker 		return mock_kernel_flag;
212*8617a60dSAndroid Build Coastguard Worker 	case VB2_SECDATA_KERNEL_VERSIONS:
213*8617a60dSAndroid Build Coastguard Worker 		return mock_kernel_version_secdata;
214*8617a60dSAndroid Build Coastguard Worker 	default:
215*8617a60dSAndroid Build Coastguard Worker 		vb2ex_abort();
216*8617a60dSAndroid Build Coastguard Worker 	}
217*8617a60dSAndroid Build Coastguard Worker 	return 0;
218*8617a60dSAndroid Build Coastguard Worker }
219*8617a60dSAndroid Build Coastguard Worker 
220*8617a60dSAndroid Build Coastguard Worker /* Tests */
221*8617a60dSAndroid Build Coastguard Worker 
phase1_tests(void)222*8617a60dSAndroid Build Coastguard Worker static void phase1_tests(void)
223*8617a60dSAndroid Build Coastguard Worker {
224*8617a60dSAndroid Build Coastguard Worker 	struct vb2_packed_key *k;
225*8617a60dSAndroid Build Coastguard Worker 	uint32_t wb_used_before;
226*8617a60dSAndroid Build Coastguard Worker 
227*8617a60dSAndroid Build Coastguard Worker 	/* Test successful call */
228*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE1);
229*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_NORMAL);
230*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_kernel_phase1(ctx), "phase1 good");
231*8617a60dSAndroid Build Coastguard Worker 	/* Make sure normal key was loaded */
232*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->kernel_key_offset, sd->preamble_offset +
233*8617a60dSAndroid Build Coastguard Worker 		offsetof(struct vb2_fw_preamble, kernel_subkey),
234*8617a60dSAndroid Build Coastguard Worker 		"  workbuf key offset");
235*8617a60dSAndroid Build Coastguard Worker 	k = vb2_member_of(sd, sd->kernel_key_offset);
236*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->kernel_key_size, k->key_offset + k->key_size,
237*8617a60dSAndroid Build Coastguard Worker 		"  workbuf key size");
238*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->workbuf_used,
239*8617a60dSAndroid Build Coastguard Worker 		vb2_wb_round_up(sd->kernel_key_offset +
240*8617a60dSAndroid Build Coastguard Worker 				sd->kernel_key_size),
241*8617a60dSAndroid Build Coastguard Worker 		"  workbuf used");
242*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(k->algorithm, 7, "  key algorithm");
243*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(k->key_size, sizeof(fw_kernel_key_data), "  key_size");
244*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(memcmp((uint8_t *)k + k->key_offset, fw_kernel_key_data,
245*8617a60dSAndroid Build Coastguard Worker 		       k->key_size), 0, "  key data");
246*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->kernel_version_secdata, 0x10002,
247*8617a60dSAndroid Build Coastguard Worker 		"  secdata_kernel version");
248*8617a60dSAndroid Build Coastguard Worker 
249*8617a60dSAndroid Build Coastguard Worker 	/* Test successful call in recovery mode */
250*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE1);
251*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_BROKEN_SCREEN, 123);
252*8617a60dSAndroid Build Coastguard Worker 	/* No preamble needed in recovery mode */
253*8617a60dSAndroid Build Coastguard Worker 	sd->workbuf_used = sd->preamble_offset;
254*8617a60dSAndroid Build Coastguard Worker 	sd->preamble_offset = sd->preamble_size = 0;
255*8617a60dSAndroid Build Coastguard Worker 	wb_used_before = sd->workbuf_used;
256*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_kernel_phase1(ctx), "phase1 rec good");
257*8617a60dSAndroid Build Coastguard Worker 	/* Make sure recovery key was loaded */
258*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->kernel_key_offset, wb_used_before,
259*8617a60dSAndroid Build Coastguard Worker 		"  workbuf key offset");
260*8617a60dSAndroid Build Coastguard Worker 	k = vb2_member_of(sd, sd->kernel_key_offset);
261*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->kernel_key_size, k->key_offset + k->key_size,
262*8617a60dSAndroid Build Coastguard Worker 		"  workbuf key size");
263*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->workbuf_used,
264*8617a60dSAndroid Build Coastguard Worker 		vb2_wb_round_up(sd->kernel_key_offset +
265*8617a60dSAndroid Build Coastguard Worker 				sd->kernel_key_size),
266*8617a60dSAndroid Build Coastguard Worker 		"  workbuf used");
267*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(k->algorithm, 11, "  key algorithm");
268*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(k->key_size, sizeof(mock_gbb.recovery_key_data), "  key_size");
269*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(memcmp((uint8_t *)k + k->key_offset,
270*8617a60dSAndroid Build Coastguard Worker 		       mock_gbb.recovery_key_data, k->key_size), 0,
271*8617a60dSAndroid Build Coastguard Worker 		"  key data");
272*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->kernel_version_secdata, 0x10002,
273*8617a60dSAndroid Build Coastguard Worker 		"  secdata_kernel version");
274*8617a60dSAndroid Build Coastguard Worker 
275*8617a60dSAndroid Build Coastguard Worker 	/* Test flags for experimental features in non-recovery path */
276*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE1);
277*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_NORMAL);
278*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_kernel_phase1(ctx), "phase1 non-rec good");
279*8617a60dSAndroid Build Coastguard Worker 	/* Make sure diagnostic UI is enabled */
280*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_diagnostic_ui_enabled(ctx), 1,
281*8617a60dSAndroid Build Coastguard Worker 		"  diagnostic ui enabled");
282*8617a60dSAndroid Build Coastguard Worker 
283*8617a60dSAndroid Build Coastguard Worker 	/*
284*8617a60dSAndroid Build Coastguard Worker 	 * Test flags are unchanged for experimental features in recovery path
285*8617a60dSAndroid Build Coastguard Worker 	 */
286*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE1);
287*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_BROKEN_SCREEN, 123);
288*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_kernel_phase1(ctx), "phase1 rec good");
289*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_kernel_flag_set, 0,
290*8617a60dSAndroid Build Coastguard Worker 		"VB2_SECDATA_KERNEL_FLAGS remains unchanged in recovery path");
291*8617a60dSAndroid Build Coastguard Worker 
292*8617a60dSAndroid Build Coastguard Worker 	/* Bad secdata_fwmp causes failure in normal mode only */
293*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE1);
294*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_NORMAL);
295*8617a60dSAndroid Build Coastguard Worker 	mock_secdata_fwmp_check_retval = VB2_ERROR_SECDATA_FWMP_CRC;
296*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_kernel_phase1(ctx), mock_secdata_fwmp_check_retval,
297*8617a60dSAndroid Build Coastguard Worker 		"phase1 bad secdata_fwmp");
298*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
299*8617a60dSAndroid Build Coastguard Worker 		VB2_RECOVERY_SECDATA_FWMP_INIT, "  recovery reason");
300*8617a60dSAndroid Build Coastguard Worker 
301*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE1);
302*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_BROKEN_SCREEN, 123);
303*8617a60dSAndroid Build Coastguard Worker 	mock_secdata_fwmp_check_retval = VB2_ERROR_SECDATA_FWMP_CRC;
304*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_kernel_phase1(ctx), "phase1 bad secdata_fwmp rec");
305*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
306*8617a60dSAndroid Build Coastguard Worker 		VB2_RECOVERY_NOT_REQUESTED, "  no recovery");
307*8617a60dSAndroid Build Coastguard Worker 
308*8617a60dSAndroid Build Coastguard Worker 	/* Failures while reading recovery key */
309*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE1);
310*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_BROKEN_SCREEN, 123);
311*8617a60dSAndroid Build Coastguard Worker 	mock_gbb.h.recovery_key_size = sd->workbuf_size - 1;
312*8617a60dSAndroid Build Coastguard Worker 	mock_gbb.recovery_key.key_size =
313*8617a60dSAndroid Build Coastguard Worker 		mock_gbb.h.recovery_key_size - sizeof(mock_gbb.recovery_key);
314*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_kernel_phase1(ctx), VB2_SUCCESS,
315*8617a60dSAndroid Build Coastguard Worker 		"phase1 rec workbuf key");
316*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->kernel_key_offset, 0, "  workbuf key offset");
317*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->kernel_key_size, 0, "  workbuf key size");
318*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_MANUAL_RECOVERY,
319*8617a60dSAndroid Build Coastguard Worker 		      VB2_RECOVERY_RO_MANUAL);
320*8617a60dSAndroid Build Coastguard Worker 	TEST_ABORT(vb2api_kernel_phase1(ctx), "  fatal for manual recovery");
321*8617a60dSAndroid Build Coastguard Worker 
322*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE1);
323*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_BROKEN_SCREEN, 123);
324*8617a60dSAndroid Build Coastguard Worker 	mock_read_res_fail_on_call = 1;
325*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_kernel_phase1(ctx), VB2_SUCCESS,
326*8617a60dSAndroid Build Coastguard Worker 		"phase1 rec gbb read key");
327*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->kernel_key_offset, 0, "  workbuf key offset");
328*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->kernel_key_size, 0, "  workbuf key size");
329*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_MANUAL_RECOVERY,
330*8617a60dSAndroid Build Coastguard Worker 		      VB2_RECOVERY_RO_MANUAL);
331*8617a60dSAndroid Build Coastguard Worker 	mock_read_res_fail_on_call = 1;
332*8617a60dSAndroid Build Coastguard Worker 	TEST_ABORT(vb2api_kernel_phase1(ctx), "  fatal for manual recovery");
333*8617a60dSAndroid Build Coastguard Worker 
334*8617a60dSAndroid Build Coastguard Worker 	/* Failures while parsing subkey from firmware preamble */
335*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE1);
336*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_NORMAL);
337*8617a60dSAndroid Build Coastguard Worker 	sd->preamble_size = 0;
338*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_kernel_phase1(ctx), VB2_ERROR_API_KPHASE1_PREAMBLE,
339*8617a60dSAndroid Build Coastguard Worker 		"phase1 fw preamble");
340*8617a60dSAndroid Build Coastguard Worker }
341*8617a60dSAndroid Build Coastguard Worker 
phase2_tests(void)342*8617a60dSAndroid Build Coastguard Worker static void phase2_tests(void)
343*8617a60dSAndroid Build Coastguard Worker {
344*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE2);
345*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_NORMAL);
346*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_kernel_phase2(ctx), "Normal mode");
347*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_ec_sync_called, 1, "  EC sync");
348*8617a60dSAndroid Build Coastguard Worker 
349*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE2);
350*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_NORMAL);
351*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DISPLAY_REQUEST, 1);
352*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_kernel_phase2(ctx), VB2_REQUEST_REBOOT,
353*8617a60dSAndroid Build Coastguard Worker 		"Normal mode with display request: rebooting");
354*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISPLAY_REQUEST), 0,
355*8617a60dSAndroid Build Coastguard Worker 		"  display request reset");
356*8617a60dSAndroid Build Coastguard Worker 
357*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE2);
358*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_DEVELOPER);
359*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_kernel_phase2(ctx), "Developer mode");
360*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_ec_sync_called, 1, "  EC sync");
361*8617a60dSAndroid Build Coastguard Worker 
362*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE2);
363*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_DIAGNOSTICS);
364*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_kernel_phase2(ctx), "Diagnostics mode");
365*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_ec_sync_called, 1, "  EC sync");
366*8617a60dSAndroid Build Coastguard Worker 
367*8617a60dSAndroid Build Coastguard Worker 	/* Commit data for recovery mode */
368*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE2);
369*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_MANUAL_RECOVERY,
370*8617a60dSAndroid Build Coastguard Worker 		      VB2_RECOVERY_RO_MANUAL);
371*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_kernel_phase2(ctx), "Manual recovery mode");
372*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_commit_data_called, 1, "  commit data");
373*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_ec_sync_called, 0, "  EC sync");
374*8617a60dSAndroid Build Coastguard Worker 
375*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE2);
376*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_BROKEN_SCREEN, 123);
377*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_kernel_phase2(ctx), "Broken screen mode");
378*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_commit_data_called, 1, "  commit data");
379*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_ec_sync_called, 0, "  EC sync");
380*8617a60dSAndroid Build Coastguard Worker 
381*8617a60dSAndroid Build Coastguard Worker 	/* Boot recovery - memory retraining */
382*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE2);
383*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_MANUAL_RECOVERY,
384*8617a60dSAndroid Build Coastguard Worker 		      VB2_RECOVERY_TRAIN_AND_REBOOT);
385*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_kernel_phase2(ctx), VB2_REQUEST_REBOOT,
386*8617a60dSAndroid Build Coastguard Worker 		"Recovery train and reboot");
387*8617a60dSAndroid Build Coastguard Worker 
388*8617a60dSAndroid Build Coastguard Worker 	/* Clear VB2_NV_DIAG_REQUEST */
389*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE2);
390*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_NORMAL);
391*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DIAG_REQUEST, 1);
392*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_kernel_phase2(ctx), "Normal mode with DIAG_REQUEST");
393*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST), 0,
394*8617a60dSAndroid Build Coastguard Worker 		"  clear VB2_NV_DIAG_REQUEST");
395*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_commit_data_called, 1, "  commit data");
396*8617a60dSAndroid Build Coastguard Worker 
397*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE2);
398*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_DIAGNOSTICS);
399*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DIAG_REQUEST, 1);
400*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_kernel_phase2(ctx), "Diagnostics mode");
401*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST), 0,
402*8617a60dSAndroid Build Coastguard Worker 		"  clear VB2_NV_DIAG_REQUEST");
403*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_commit_data_called, 1, "  commit data");
404*8617a60dSAndroid Build Coastguard Worker 
405*8617a60dSAndroid Build Coastguard Worker 	/* Battery cutoff called after EC sync */
406*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE2);
407*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_NORMAL);
408*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_BATTERY_CUTOFF_REQUEST, 1);
409*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_kernel_phase2(ctx), VB2_REQUEST_SHUTDOWN,
410*8617a60dSAndroid Build Coastguard Worker 		"Set VB2_NV_BATTERY_CUTOFF_REQUEST");
411*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_battery_cutoff_called, 1,
412*8617a60dSAndroid Build Coastguard Worker 		"  battery_cutoff called after EC sync");
413*8617a60dSAndroid Build Coastguard Worker 
414*8617a60dSAndroid Build Coastguard Worker 	/* Return EC sync error */
415*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE2);
416*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_NORMAL);
417*8617a60dSAndroid Build Coastguard Worker 	mock_ec_sync_retval = VB2_ERROR_MOCK;
418*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_kernel_phase2(ctx), VB2_ERROR_MOCK,
419*8617a60dSAndroid Build Coastguard Worker 		"Return EC sync error");
420*8617a60dSAndroid Build Coastguard Worker 
421*8617a60dSAndroid Build Coastguard Worker 	/* Undefined boot mode */
422*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_PHASE2);
423*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_kernel_phase2(ctx), VB2_ERROR_ESCAPE_NO_BOOT,
424*8617a60dSAndroid Build Coastguard Worker 		"Undefined boot mode");
425*8617a60dSAndroid Build Coastguard Worker }
426*8617a60dSAndroid Build Coastguard Worker 
finalize_tests(void)427*8617a60dSAndroid Build Coastguard Worker static void finalize_tests(void)
428*8617a60dSAndroid Build Coastguard Worker {
429*8617a60dSAndroid Build Coastguard Worker 	/* Kernel version roll forward */
430*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_FINALIZE);
431*8617a60dSAndroid Build Coastguard Worker 	sd->kernel_version_secdata = 0x20003;
432*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_kernel_finalize(ctx), VB2_SUCCESS,
433*8617a60dSAndroid Build Coastguard Worker 		"Kernel version roll forward");
434*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_kernel_version_secdata, 0x20003, "  kernel version");
435*8617a60dSAndroid Build Coastguard Worker 
436*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_FINALIZE);
437*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_RESULT, VB2_FW_RESULT_TRYING);
438*8617a60dSAndroid Build Coastguard Worker 	sd->kernel_version_secdata = 0x20003;
439*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_kernel_finalize(ctx), VB2_SUCCESS,
440*8617a60dSAndroid Build Coastguard Worker 		"Don't roll forward kernel when trying new FW");
441*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_kernel_version_secdata, 0x10002, "  kernel version");
442*8617a60dSAndroid Build Coastguard Worker 
443*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_FINALIZE);
444*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_KERNEL_MAX_ROLLFORWARD, 0x30005);
445*8617a60dSAndroid Build Coastguard Worker 	sd->kernel_version_secdata = 0x40006;
446*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_kernel_finalize(ctx), VB2_SUCCESS,
447*8617a60dSAndroid Build Coastguard Worker 		"Limit max roll forward");
448*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_kernel_version_secdata, 0x30005, "  kernel version");
449*8617a60dSAndroid Build Coastguard Worker 
450*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_FINALIZE);
451*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_KERNEL_MAX_ROLLFORWARD, 0x10001);
452*8617a60dSAndroid Build Coastguard Worker 	sd->kernel_version_secdata = 0x40006;
453*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_kernel_finalize(ctx), VB2_SUCCESS,
454*8617a60dSAndroid Build Coastguard Worker 		"Max roll forward can't rollback");
455*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_kernel_version_secdata, 0x10002, "  kernel version");
456*8617a60dSAndroid Build Coastguard Worker 
457*8617a60dSAndroid Build Coastguard Worker 	/* NO_BOOT with EC sync support */
458*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_FINALIZE);
459*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_NO_BOOT;
460*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_EC_SYNC_SUPPORTED;
461*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_kernel_finalize(ctx), VB2_ERROR_ESCAPE_NO_BOOT,
462*8617a60dSAndroid Build Coastguard Worker 		"Recovery for NO_BOOT escape");
463*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
464*8617a60dSAndroid Build Coastguard Worker 		VB2_RECOVERY_ESCAPE_NO_BOOT, "  recovery_reason");
465*8617a60dSAndroid Build Coastguard Worker 
466*8617a60dSAndroid Build Coastguard Worker 	/* NO_BOOT with EC sync disabled */
467*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_FINALIZE);
468*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_NO_BOOT;
469*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_EC_SYNC_SUPPORTED;
470*8617a60dSAndroid Build Coastguard Worker 	mock_gbb.h.flags |= VB2_GBB_FLAG_DISABLE_EC_SOFTWARE_SYNC;
471*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_kernel_finalize(ctx),
472*8617a60dSAndroid Build Coastguard Worker 		  "NO_BOOT ignored with gbb DISABLE_EC_SOFTWARE_SYNC");
473*8617a60dSAndroid Build Coastguard Worker 
474*8617a60dSAndroid Build Coastguard Worker 	/* Normal case with EC sync support */
475*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_FINALIZE);
476*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_EC_SYNC_SUPPORTED;
477*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_kernel_finalize(ctx), "Disable VB2_CONTEXT_NO_BOOT");
478*8617a60dSAndroid Build Coastguard Worker 
479*8617a60dSAndroid Build Coastguard Worker 	/* NO_BOOT without EC sync support */
480*8617a60dSAndroid Build Coastguard Worker 	reset_common_data(FOR_FINALIZE);
481*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_NO_BOOT;
482*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_kernel_finalize(ctx),
483*8617a60dSAndroid Build Coastguard Worker 		  "Disable VB2_CONTEXT_EC_SYNC_SUPPORTED");
484*8617a60dSAndroid Build Coastguard Worker }
485*8617a60dSAndroid Build Coastguard Worker 
main(int argc,char * argv[])486*8617a60dSAndroid Build Coastguard Worker int main(int argc, char* argv[])
487*8617a60dSAndroid Build Coastguard Worker {
488*8617a60dSAndroid Build Coastguard Worker 	phase1_tests();
489*8617a60dSAndroid Build Coastguard Worker 	phase2_tests();
490*8617a60dSAndroid Build Coastguard Worker 	finalize_tests();
491*8617a60dSAndroid Build Coastguard Worker 
492*8617a60dSAndroid Build Coastguard Worker 	return gTestSuccess ? 0 : 255;
493*8617a60dSAndroid Build Coastguard Worker }
494