xref: /aosp_15_r20/external/vboot_reference/tests/vb2_gbb_tests.c (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2019 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 GBB library.
6*8617a60dSAndroid Build Coastguard Worker  */
7*8617a60dSAndroid Build Coastguard Worker 
8*8617a60dSAndroid Build Coastguard Worker #include "2common.h"
9*8617a60dSAndroid Build Coastguard Worker #include "2misc.h"
10*8617a60dSAndroid Build Coastguard Worker #include "common/tests.h"
11*8617a60dSAndroid Build Coastguard Worker 
12*8617a60dSAndroid Build Coastguard Worker /* Mock data */
13*8617a60dSAndroid Build Coastguard Worker static char gbb_data[4096 + sizeof(struct vb2_gbb_header)];
14*8617a60dSAndroid Build Coastguard Worker static struct vb2_gbb_header *gbb = (struct vb2_gbb_header *)gbb_data;
15*8617a60dSAndroid Build Coastguard Worker static struct vb2_packed_key *rootkey;
16*8617a60dSAndroid Build Coastguard Worker static struct vb2_context *ctx;
17*8617a60dSAndroid Build Coastguard Worker static struct vb2_workbuf wb;
18*8617a60dSAndroid Build Coastguard Worker static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE]
19*8617a60dSAndroid Build Coastguard Worker 	__attribute__((aligned(VB2_WORKBUF_ALIGN)));
20*8617a60dSAndroid Build Coastguard Worker 
set_gbb_hwid(const char * hwid,size_t size)21*8617a60dSAndroid Build Coastguard Worker static void set_gbb_hwid(const char *hwid, size_t size)
22*8617a60dSAndroid Build Coastguard Worker {
23*8617a60dSAndroid Build Coastguard Worker 	memcpy(gbb_data + gbb->hwid_offset, hwid, size);
24*8617a60dSAndroid Build Coastguard Worker 	gbb->hwid_size = size;
25*8617a60dSAndroid Build Coastguard Worker }
26*8617a60dSAndroid Build Coastguard Worker 
reset_common_data(void)27*8617a60dSAndroid Build Coastguard Worker static void reset_common_data(void)
28*8617a60dSAndroid Build Coastguard Worker {
29*8617a60dSAndroid Build Coastguard Worker 	int gbb_used;
30*8617a60dSAndroid Build Coastguard Worker 
31*8617a60dSAndroid Build Coastguard Worker 	memset(gbb_data, 0, sizeof(gbb_data));
32*8617a60dSAndroid Build Coastguard Worker 	gbb->header_size = sizeof(*gbb);
33*8617a60dSAndroid Build Coastguard Worker 	gbb->major_version = VB2_GBB_MAJOR_VER;
34*8617a60dSAndroid Build Coastguard Worker 	gbb->minor_version = VB2_GBB_MINOR_VER;
35*8617a60dSAndroid Build Coastguard Worker 	gbb->flags = 0;
36*8617a60dSAndroid Build Coastguard Worker 	gbb_used = sizeof(struct vb2_gbb_header);
37*8617a60dSAndroid Build Coastguard Worker 
38*8617a60dSAndroid Build Coastguard Worker 	gbb->recovery_key_offset = gbb_used;
39*8617a60dSAndroid Build Coastguard Worker 	gbb->recovery_key_size = 64;
40*8617a60dSAndroid Build Coastguard Worker 	gbb_used += gbb->recovery_key_size;
41*8617a60dSAndroid Build Coastguard Worker 	gbb->rootkey_offset = gbb_used;
42*8617a60dSAndroid Build Coastguard Worker 	gbb->rootkey_size = sizeof(struct vb2_packed_key);
43*8617a60dSAndroid Build Coastguard Worker 	gbb_used += gbb->rootkey_size;
44*8617a60dSAndroid Build Coastguard Worker 
45*8617a60dSAndroid Build Coastguard Worker 	rootkey = ((void *)gbb + gbb->rootkey_offset);
46*8617a60dSAndroid Build Coastguard Worker 	rootkey->key_offset = sizeof(*rootkey);
47*8617a60dSAndroid Build Coastguard Worker 
48*8617a60dSAndroid Build Coastguard Worker 	gbb->hwid_offset = gbb_used;
49*8617a60dSAndroid Build Coastguard Worker 	const char hwid_src[] = "Test HWID";
50*8617a60dSAndroid Build Coastguard Worker 	set_gbb_hwid(hwid_src, sizeof(hwid_src));
51*8617a60dSAndroid Build Coastguard Worker 
52*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
53*8617a60dSAndroid Build Coastguard Worker 		  "vb2api_init failed");
54*8617a60dSAndroid Build Coastguard Worker 	vb2_workbuf_from_ctx(ctx, &wb);
55*8617a60dSAndroid Build Coastguard Worker }
56*8617a60dSAndroid Build Coastguard Worker 
57*8617a60dSAndroid Build Coastguard Worker /* Mocks */
vb2_get_gbb(struct vb2_context * c)58*8617a60dSAndroid Build Coastguard Worker struct vb2_gbb_header *vb2_get_gbb(struct vb2_context *c)
59*8617a60dSAndroid Build Coastguard Worker {
60*8617a60dSAndroid Build Coastguard Worker 	return gbb;
61*8617a60dSAndroid Build Coastguard Worker }
62*8617a60dSAndroid Build Coastguard Worker 
vb2ex_read_resource(struct vb2_context * c,enum vb2_resource_index index,uint32_t offset,void * buf,uint32_t size)63*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_read_resource(struct vb2_context *c,
64*8617a60dSAndroid Build Coastguard Worker 				enum vb2_resource_index index, uint32_t offset,
65*8617a60dSAndroid Build Coastguard Worker 				void *buf, uint32_t size)
66*8617a60dSAndroid Build Coastguard Worker {
67*8617a60dSAndroid Build Coastguard Worker 	uint8_t *rptr;
68*8617a60dSAndroid Build Coastguard Worker 	uint32_t rsize;
69*8617a60dSAndroid Build Coastguard Worker 
70*8617a60dSAndroid Build Coastguard Worker 	switch(index) {
71*8617a60dSAndroid Build Coastguard Worker 	case VB2_RES_GBB:
72*8617a60dSAndroid Build Coastguard Worker 		rptr = (uint8_t *)&gbb_data;
73*8617a60dSAndroid Build Coastguard Worker 		rsize = sizeof(gbb_data);
74*8617a60dSAndroid Build Coastguard Worker 		break;
75*8617a60dSAndroid Build Coastguard Worker 	default:
76*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_EX_READ_RESOURCE_INDEX;
77*8617a60dSAndroid Build Coastguard Worker 	}
78*8617a60dSAndroid Build Coastguard Worker 
79*8617a60dSAndroid Build Coastguard Worker 	if (offset + size >= rsize)
80*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_EX_READ_RESOURCE_SIZE;
81*8617a60dSAndroid Build Coastguard Worker 
82*8617a60dSAndroid Build Coastguard Worker 	memcpy(buf, rptr + offset, size);
83*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
84*8617a60dSAndroid Build Coastguard Worker }
85*8617a60dSAndroid Build Coastguard Worker 
86*8617a60dSAndroid Build Coastguard Worker /* Tests */
flag_tests(void)87*8617a60dSAndroid Build Coastguard Worker static void flag_tests(void)
88*8617a60dSAndroid Build Coastguard Worker {
89*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
90*8617a60dSAndroid Build Coastguard Worker 	gbb->flags = 0xdeadbeef;
91*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_gbb_get_flags(ctx), gbb->flags,
92*8617a60dSAndroid Build Coastguard Worker 		"retrieve GBB flags");
93*8617a60dSAndroid Build Coastguard Worker }
94*8617a60dSAndroid Build Coastguard Worker 
key_tests(void)95*8617a60dSAndroid Build Coastguard Worker static void key_tests(void)
96*8617a60dSAndroid Build Coastguard Worker {
97*8617a60dSAndroid Build Coastguard Worker 	/* Assume that root key and recovery key are dealt with using the same
98*8617a60dSAndroid Build Coastguard Worker 	   code in our GBB library functions. */
99*8617a60dSAndroid Build Coastguard Worker 	struct vb2_packed_key *keyp;
100*8617a60dSAndroid Build Coastguard Worker 	struct vb2_workbuf wborig;
101*8617a60dSAndroid Build Coastguard Worker 	const char key_data[] = "HELLOWORLD";
102*8617a60dSAndroid Build Coastguard Worker 	uint32_t size;
103*8617a60dSAndroid Build Coastguard Worker 
104*8617a60dSAndroid Build Coastguard Worker 	/* gbb.offset < sizeof(vb2_gbb_header) */
105*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
106*8617a60dSAndroid Build Coastguard Worker 	wborig = wb;
107*8617a60dSAndroid Build Coastguard Worker 	gbb->rootkey_offset = sizeof(*gbb) - 1;
108*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_gbb_read_root_key(ctx, &keyp, &size, &wb),
109*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_GBB_INVALID,
110*8617a60dSAndroid Build Coastguard Worker 		"gbb.rootkey offset too small");
111*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(wb.buf == wborig.buf,
112*8617a60dSAndroid Build Coastguard Worker 		  "  workbuf restored on error");
113*8617a60dSAndroid Build Coastguard Worker 
114*8617a60dSAndroid Build Coastguard Worker 	/* gbb.offset > gbb_data */
115*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
116*8617a60dSAndroid Build Coastguard Worker 	wborig = wb;
117*8617a60dSAndroid Build Coastguard Worker 	gbb->rootkey_offset = sizeof(gbb_data) + 1;
118*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_gbb_read_root_key(ctx, &keyp, &size, &wb),
119*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_EX_READ_RESOURCE_SIZE,
120*8617a60dSAndroid Build Coastguard Worker 		"gbb.rootkey offset too large");
121*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(wb.buf == wborig.buf,
122*8617a60dSAndroid Build Coastguard Worker 		  "  workbuf restored on error");
123*8617a60dSAndroid Build Coastguard Worker 
124*8617a60dSAndroid Build Coastguard Worker 	/* gbb.size < sizeof(vb2_packed_key) */
125*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
126*8617a60dSAndroid Build Coastguard Worker 	wborig = wb;
127*8617a60dSAndroid Build Coastguard Worker 	gbb->rootkey_size = sizeof(*rootkey) - 1;
128*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_gbb_read_root_key(ctx, &keyp, &size, &wb),
129*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_GBB_INVALID,
130*8617a60dSAndroid Build Coastguard Worker 		"gbb.rootkey size too small");
131*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(wb.buf == wborig.buf,
132*8617a60dSAndroid Build Coastguard Worker 		  "  workbuf restored on error");
133*8617a60dSAndroid Build Coastguard Worker 
134*8617a60dSAndroid Build Coastguard Worker 	/* sizeof(vb2_packed_key) > workbuf.size */
135*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
136*8617a60dSAndroid Build Coastguard Worker 	wborig = wb;
137*8617a60dSAndroid Build Coastguard Worker 	wb.size = sizeof(*rootkey) - 1;
138*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_gbb_read_root_key(ctx, &keyp, &size, &wb),
139*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_GBB_WORKBUF,
140*8617a60dSAndroid Build Coastguard Worker 		"workbuf size too small for vb2_packed_key header");
141*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(wb.buf == wborig.buf,
142*8617a60dSAndroid Build Coastguard Worker 		  "  workbuf restored on error");
143*8617a60dSAndroid Build Coastguard Worker 
144*8617a60dSAndroid Build Coastguard Worker 	/* packed_key.offset < sizeof(vb2_packed_key) */
145*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
146*8617a60dSAndroid Build Coastguard Worker 	wborig = wb;
147*8617a60dSAndroid Build Coastguard Worker 	rootkey->key_size = 1;
148*8617a60dSAndroid Build Coastguard Worker 	rootkey->key_offset = sizeof(*rootkey) - 1;
149*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_gbb_read_root_key(ctx, &keyp, &size, &wb),
150*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_INSIDE_DATA_OVERLAP,
151*8617a60dSAndroid Build Coastguard Worker 		"rootkey offset too small");
152*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(wb.buf == wborig.buf,
153*8617a60dSAndroid Build Coastguard Worker 		  "  workbuf restored on error");
154*8617a60dSAndroid Build Coastguard Worker 
155*8617a60dSAndroid Build Coastguard Worker 	/* packed_key.offset > gbb_data */
156*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
157*8617a60dSAndroid Build Coastguard Worker 	wborig = wb;
158*8617a60dSAndroid Build Coastguard Worker 	rootkey->key_size = 1;
159*8617a60dSAndroid Build Coastguard Worker 	rootkey->key_offset = sizeof(gbb_data) + 1;
160*8617a60dSAndroid Build Coastguard Worker 	gbb->rootkey_size = rootkey->key_offset + rootkey->key_size;
161*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_gbb_read_root_key(ctx, &keyp, &size, &wb),
162*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_EX_READ_RESOURCE_SIZE,
163*8617a60dSAndroid Build Coastguard Worker 		"rootkey size too large");
164*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(wb.buf == wborig.buf,
165*8617a60dSAndroid Build Coastguard Worker 		  "  workbuf restored on error");
166*8617a60dSAndroid Build Coastguard Worker 
167*8617a60dSAndroid Build Coastguard Worker 	/* packed_key.size > workbuf.size */
168*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
169*8617a60dSAndroid Build Coastguard Worker 	wborig = wb;
170*8617a60dSAndroid Build Coastguard Worker 	rootkey->key_size = wb.size + 1;
171*8617a60dSAndroid Build Coastguard Worker 	gbb->rootkey_size = rootkey->key_offset + rootkey->key_size + 1;
172*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_gbb_read_root_key(ctx, &keyp, &size, &wb),
173*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_GBB_WORKBUF,
174*8617a60dSAndroid Build Coastguard Worker 		"workbuf size too small for vb2_packed_key contents");
175*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(wb.buf == wborig.buf,
176*8617a60dSAndroid Build Coastguard Worker 		  "  workbuf restored on error");
177*8617a60dSAndroid Build Coastguard Worker 
178*8617a60dSAndroid Build Coastguard Worker 	/* gbb.size < sizeof(vb2_packed_key) + packed_key.size */
179*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
180*8617a60dSAndroid Build Coastguard Worker 	wborig = wb;
181*8617a60dSAndroid Build Coastguard Worker 	rootkey->key_size = 2;
182*8617a60dSAndroid Build Coastguard Worker 	gbb->rootkey_size = rootkey->key_offset + rootkey->key_size - 1;
183*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_gbb_read_root_key(ctx, &keyp, &size, &wb),
184*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_INSIDE_DATA_OUTSIDE,
185*8617a60dSAndroid Build Coastguard Worker 		"rootkey size exceeds gbb.rootkey size");
186*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(wb.buf == wborig.buf,
187*8617a60dSAndroid Build Coastguard Worker 		  "  workbuf restored on error");
188*8617a60dSAndroid Build Coastguard Worker 
189*8617a60dSAndroid Build Coastguard Worker 	/* gbb.size == sizeof(vb2_packed_key) + packed_key.size */
190*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
191*8617a60dSAndroid Build Coastguard Worker 	wborig = wb;
192*8617a60dSAndroid Build Coastguard Worker 	rootkey->key_size = sizeof(key_data);
193*8617a60dSAndroid Build Coastguard Worker 	memcpy((void *)rootkey + rootkey->key_offset,
194*8617a60dSAndroid Build Coastguard Worker 	       key_data, sizeof(key_data));
195*8617a60dSAndroid Build Coastguard Worker 	gbb->rootkey_size = rootkey->key_offset + rootkey->key_size;
196*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_gbb_read_root_key(ctx, &keyp, &size, &wb),
197*8617a60dSAndroid Build Coastguard Worker 		  "succeeds when gbb.rootkey and rootkey sizes agree");
198*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(wb.size < wborig.size,
199*8617a60dSAndroid Build Coastguard Worker 		  "  workbuf shrank on success");
200*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(memcmp(rootkey, keyp, rootkey->key_offset + rootkey->key_size),
201*8617a60dSAndroid Build Coastguard Worker 		0, "  copied key data successfully");
202*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(size, rootkey->key_offset + rootkey->key_size,
203*8617a60dSAndroid Build Coastguard Worker 		"  correct size returned");
204*8617a60dSAndroid Build Coastguard Worker 
205*8617a60dSAndroid Build Coastguard Worker 	/* gbb.size > sizeof(vb2_packed_key) + packed_key.size
206*8617a60dSAndroid Build Coastguard Worker 	   packed_key.offset = +0 */
207*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
208*8617a60dSAndroid Build Coastguard Worker 	wborig = wb;
209*8617a60dSAndroid Build Coastguard Worker 	rootkey->key_size = 1;
210*8617a60dSAndroid Build Coastguard Worker 	gbb->rootkey_size = rootkey->key_offset + rootkey->key_size + 1;
211*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_gbb_read_root_key(ctx, &keyp, &size, &wb),
212*8617a60dSAndroid Build Coastguard Worker 		  "succeeds when gbb.rootkey is padded after key");
213*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(wb.size < wborig.size,
214*8617a60dSAndroid Build Coastguard Worker 		  "  workbuf shrank on success");
215*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(size, rootkey->key_offset + rootkey->key_size,
216*8617a60dSAndroid Build Coastguard Worker 		"  correct size returned");
217*8617a60dSAndroid Build Coastguard Worker 
218*8617a60dSAndroid Build Coastguard Worker 	/* gbb.size > sizeof(vb2_packed_key) + packed_key.size
219*8617a60dSAndroid Build Coastguard Worker 	   packed_key.offset = +1 */
220*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
221*8617a60dSAndroid Build Coastguard Worker 	wborig = wb;
222*8617a60dSAndroid Build Coastguard Worker 	rootkey->key_offset = sizeof(*rootkey) + 1;
223*8617a60dSAndroid Build Coastguard Worker 	rootkey->key_size = 1;
224*8617a60dSAndroid Build Coastguard Worker 	gbb->rootkey_size = rootkey->key_offset + rootkey->key_size;
225*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_gbb_read_root_key(ctx, &keyp, &size, &wb),
226*8617a60dSAndroid Build Coastguard Worker 		  "succeeds when gbb.rootkey is padded before key");
227*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(wb.size < wborig.size,
228*8617a60dSAndroid Build Coastguard Worker 		  "  workbuf shrank on success");
229*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(size, rootkey->key_offset + rootkey->key_size,
230*8617a60dSAndroid Build Coastguard Worker 		"  correct size returned");
231*8617a60dSAndroid Build Coastguard Worker 
232*8617a60dSAndroid Build Coastguard Worker 	/* packed_key.size = 0, packed_key.offset = +1 */
233*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
234*8617a60dSAndroid Build Coastguard Worker 	wborig = wb;
235*8617a60dSAndroid Build Coastguard Worker 	rootkey->key_offset = sizeof(*rootkey) + 1;
236*8617a60dSAndroid Build Coastguard Worker 	rootkey->key_size = 0;
237*8617a60dSAndroid Build Coastguard Worker 	gbb->rootkey_size = rootkey->key_offset + rootkey->key_size + 1;
238*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_gbb_read_root_key(ctx, &keyp, &size, &wb),
239*8617a60dSAndroid Build Coastguard Worker 		  "succeeds when gbb.rootkey is padded; empty test key");
240*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(wb.size < wborig.size,
241*8617a60dSAndroid Build Coastguard Worker 		  "  workbuf shrank on success");
242*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(size, rootkey->key_offset + rootkey->key_size,
243*8617a60dSAndroid Build Coastguard Worker 		"  correct size returned");
244*8617a60dSAndroid Build Coastguard Worker 
245*8617a60dSAndroid Build Coastguard Worker 	/* packed_key.size = 0, packed_key.offset = -1 */
246*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
247*8617a60dSAndroid Build Coastguard Worker 	wborig = wb;
248*8617a60dSAndroid Build Coastguard Worker 	rootkey->key_offset = sizeof(*rootkey) - 1;
249*8617a60dSAndroid Build Coastguard Worker 	rootkey->key_size = 0;
250*8617a60dSAndroid Build Coastguard Worker 	gbb->rootkey_size = sizeof(*rootkey) + rootkey->key_size + 1;
251*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_gbb_read_root_key(ctx, &keyp, &size, &wb),
252*8617a60dSAndroid Build Coastguard Worker 		  "succeeds when gbb.rootkey is padded; empty test key");
253*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(wb.size < wborig.size,
254*8617a60dSAndroid Build Coastguard Worker 		  "  workbuf shrank on success");
255*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(size, sizeof(*rootkey), "  correct size returned");
256*8617a60dSAndroid Build Coastguard Worker }
257*8617a60dSAndroid Build Coastguard Worker 
hwid_tests(void)258*8617a60dSAndroid Build Coastguard Worker static void hwid_tests(void)
259*8617a60dSAndroid Build Coastguard Worker {
260*8617a60dSAndroid Build Coastguard Worker 	char hwid[VB2_GBB_HWID_MAX_SIZE];
261*8617a60dSAndroid Build Coastguard Worker 	uint32_t size;
262*8617a60dSAndroid Build Coastguard Worker 
263*8617a60dSAndroid Build Coastguard Worker 	/* GBB HWID size = 0 */
264*8617a60dSAndroid Build Coastguard Worker 	{
265*8617a60dSAndroid Build Coastguard Worker 		reset_common_data();
266*8617a60dSAndroid Build Coastguard Worker 		gbb->hwid_size = 0;
267*8617a60dSAndroid Build Coastguard Worker 		size = VB2_GBB_HWID_MAX_SIZE;
268*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2api_gbb_read_hwid(ctx, hwid, &size),
269*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_GBB_INVALID,
270*8617a60dSAndroid Build Coastguard Worker 			"GBB HWID size invalid (HWID missing)");
271*8617a60dSAndroid Build Coastguard Worker 	}
272*8617a60dSAndroid Build Coastguard Worker 
273*8617a60dSAndroid Build Coastguard Worker 	/* GBB HWID offset > GBB size */
274*8617a60dSAndroid Build Coastguard Worker 	{
275*8617a60dSAndroid Build Coastguard Worker 		reset_common_data();
276*8617a60dSAndroid Build Coastguard Worker 		gbb->hwid_offset = sizeof(gbb_data) + 1;
277*8617a60dSAndroid Build Coastguard Worker 		size = VB2_GBB_HWID_MAX_SIZE;
278*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2api_gbb_read_hwid(ctx, hwid, &size),
279*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_EX_READ_RESOURCE_SIZE,
280*8617a60dSAndroid Build Coastguard Worker 			"GBB HWID offset invalid");
281*8617a60dSAndroid Build Coastguard Worker 	}
282*8617a60dSAndroid Build Coastguard Worker 
283*8617a60dSAndroid Build Coastguard Worker 	/* buffer size < HWID size */
284*8617a60dSAndroid Build Coastguard Worker 	{
285*8617a60dSAndroid Build Coastguard Worker 		const char hwid_src[] = "Test HWID";
286*8617a60dSAndroid Build Coastguard Worker 		reset_common_data();
287*8617a60dSAndroid Build Coastguard Worker 		set_gbb_hwid(hwid_src, sizeof(hwid_src));
288*8617a60dSAndroid Build Coastguard Worker 		size = sizeof(hwid_src) - 1;
289*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2api_gbb_read_hwid(ctx, hwid, &size),
290*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INVALID_PARAMETER,
291*8617a60dSAndroid Build Coastguard Worker 			"HWID too large for buffer");
292*8617a60dSAndroid Build Coastguard Worker 	}
293*8617a60dSAndroid Build Coastguard Worker 
294*8617a60dSAndroid Build Coastguard Worker 	/* GBB HWID size < HWID size */
295*8617a60dSAndroid Build Coastguard Worker 	{
296*8617a60dSAndroid Build Coastguard Worker 		const char hwid_src[] = "Test HWID";
297*8617a60dSAndroid Build Coastguard Worker 		reset_common_data();
298*8617a60dSAndroid Build Coastguard Worker 		set_gbb_hwid(hwid_src, sizeof(hwid_src) - 1);
299*8617a60dSAndroid Build Coastguard Worker 		size = sizeof(hwid_src);
300*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2api_gbb_read_hwid(ctx, hwid, &size),
301*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INVALID_PARAMETER,
302*8617a60dSAndroid Build Coastguard Worker 			"HWID larger than GBB HWID size");
303*8617a60dSAndroid Build Coastguard Worker 	}
304*8617a60dSAndroid Build Coastguard Worker 
305*8617a60dSAndroid Build Coastguard Worker 	/* buffer size == HWID size */
306*8617a60dSAndroid Build Coastguard Worker 	{
307*8617a60dSAndroid Build Coastguard Worker 		const char hwid_src[] = "Test HWID";
308*8617a60dSAndroid Build Coastguard Worker 		reset_common_data();
309*8617a60dSAndroid Build Coastguard Worker 		set_gbb_hwid(hwid_src, sizeof(hwid_src));
310*8617a60dSAndroid Build Coastguard Worker 		size = sizeof(hwid_src);
311*8617a60dSAndroid Build Coastguard Worker 		TEST_SUCC(vb2api_gbb_read_hwid(ctx, hwid, &size),
312*8617a60dSAndroid Build Coastguard Worker 			  "read normal HWID");
313*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(strcmp(hwid, "Test HWID"), 0, "  HWID correct");
314*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(strlen(hwid) + 1, size, "  HWID size consistent");
315*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(strlen(hwid), strlen("Test HWID"),
316*8617a60dSAndroid Build Coastguard Worker 			"  HWID size correct");
317*8617a60dSAndroid Build Coastguard Worker 	}
318*8617a60dSAndroid Build Coastguard Worker 
319*8617a60dSAndroid Build Coastguard Worker 	/* buffer size > HWID size */
320*8617a60dSAndroid Build Coastguard Worker 	{
321*8617a60dSAndroid Build Coastguard Worker 		const char hwid_src[] = "Test HWID";
322*8617a60dSAndroid Build Coastguard Worker 		reset_common_data();
323*8617a60dSAndroid Build Coastguard Worker 		set_gbb_hwid(hwid_src, sizeof(hwid_src));
324*8617a60dSAndroid Build Coastguard Worker 		size = sizeof(hwid_src) + 1;
325*8617a60dSAndroid Build Coastguard Worker 		TEST_SUCC(vb2api_gbb_read_hwid(ctx, hwid, &size),
326*8617a60dSAndroid Build Coastguard Worker 			  "read normal HWID");
327*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(strcmp(hwid, "Test HWID"), 0, "  HWID correct");
328*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(strlen(hwid) + 1, size, "  HWID size consistent");
329*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(strlen(hwid), strlen("Test HWID"),
330*8617a60dSAndroid Build Coastguard Worker 			"  HWID size correct");
331*8617a60dSAndroid Build Coastguard Worker 	}
332*8617a60dSAndroid Build Coastguard Worker 
333*8617a60dSAndroid Build Coastguard Worker 	/* HWID with garbage */
334*8617a60dSAndroid Build Coastguard Worker 	{
335*8617a60dSAndroid Build Coastguard Worker 		const char hwid_src[] = "Test HWID\0garbagegarbage";
336*8617a60dSAndroid Build Coastguard Worker 		reset_common_data();
337*8617a60dSAndroid Build Coastguard Worker 		set_gbb_hwid(hwid_src, sizeof(hwid_src));
338*8617a60dSAndroid Build Coastguard Worker 		size = VB2_GBB_HWID_MAX_SIZE;
339*8617a60dSAndroid Build Coastguard Worker 		TEST_SUCC(vb2api_gbb_read_hwid(ctx, hwid, &size),
340*8617a60dSAndroid Build Coastguard Worker 			  "read HWID with garbage");
341*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(strcmp(hwid, "Test HWID"), 0, "  HWID correct");
342*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(strlen(hwid) + 1, size, "  HWID size consistent");
343*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(strlen(hwid), strlen("Test HWID"),
344*8617a60dSAndroid Build Coastguard Worker 			"  HWID size correct");
345*8617a60dSAndroid Build Coastguard Worker 	}
346*8617a60dSAndroid Build Coastguard Worker }
347*8617a60dSAndroid Build Coastguard Worker 
main(int argc,char * argv[])348*8617a60dSAndroid Build Coastguard Worker int main(int argc, char* argv[])
349*8617a60dSAndroid Build Coastguard Worker {
350*8617a60dSAndroid Build Coastguard Worker 	flag_tests();
351*8617a60dSAndroid Build Coastguard Worker 	key_tests();
352*8617a60dSAndroid Build Coastguard Worker 	hwid_tests();
353*8617a60dSAndroid Build Coastguard Worker 
354*8617a60dSAndroid Build Coastguard Worker 	return gTestSuccess ? 0 : 255;
355*8617a60dSAndroid Build Coastguard Worker }
356