xref: /aosp_15_r20/external/vboot_reference/tests/vb2_common_tests.c (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2014 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 firmware 2common.c
6*8617a60dSAndroid Build Coastguard Worker  */
7*8617a60dSAndroid Build Coastguard Worker 
8*8617a60dSAndroid Build Coastguard Worker #include "2common.h"
9*8617a60dSAndroid Build Coastguard Worker #include "2sysincludes.h"
10*8617a60dSAndroid Build Coastguard Worker #include "common/tests.h"
11*8617a60dSAndroid Build Coastguard Worker #include "vboot_struct.h"  /* For old struct sizes */
12*8617a60dSAndroid Build Coastguard Worker 
13*8617a60dSAndroid Build Coastguard Worker /* Mock data */
14*8617a60dSAndroid Build Coastguard Worker static int counter_calls_left = 0;
15*8617a60dSAndroid Build Coastguard Worker 
16*8617a60dSAndroid Build Coastguard Worker /* Mock functions */
counter(void)17*8617a60dSAndroid Build Coastguard Worker static int counter(void)
18*8617a60dSAndroid Build Coastguard Worker {
19*8617a60dSAndroid Build Coastguard Worker 	counter_calls_left--;
20*8617a60dSAndroid Build Coastguard Worker 	return 0;
21*8617a60dSAndroid Build Coastguard Worker }
22*8617a60dSAndroid Build Coastguard Worker 
23*8617a60dSAndroid Build Coastguard Worker /*
24*8617a60dSAndroid Build Coastguard Worker  * Test arithmetic-related macros and operators.
25*8617a60dSAndroid Build Coastguard Worker  */
test_arithmetic(void)26*8617a60dSAndroid Build Coastguard Worker static void test_arithmetic(void)
27*8617a60dSAndroid Build Coastguard Worker {
28*8617a60dSAndroid Build Coastguard Worker 	int64_t a = -10, b = -20;
29*8617a60dSAndroid Build Coastguard Worker 	uint64_t u = (0xabcd00000000ULL);
30*8617a60dSAndroid Build Coastguard Worker 	uint64_t v = (0xabcd000000ULL);
31*8617a60dSAndroid Build Coastguard Worker 
32*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(VB2_MIN(1, 2), 1, "MIN 1");
33*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(VB2_MIN(4, 3), 3, "MIN 3");
34*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(VB2_MIN(5, 5), 5, "MIN 5");
35*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(VB2_MIN(a, b), b, "MIN uint64 1");
36*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(VB2_MIN(b, a), b, "MIN uint64 2");
37*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(VB2_MIN(b, b), b, "MIN uint64 same");
38*8617a60dSAndroid Build Coastguard Worker 
39*8617a60dSAndroid Build Coastguard Worker 	counter_calls_left = 2;
40*8617a60dSAndroid Build Coastguard Worker 	VB2_MIN(counter(), counter());
41*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(counter_calls_left, 0, "MIN double-evaluation");
42*8617a60dSAndroid Build Coastguard Worker 
43*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(VB2_MAX(1, 2), 2, "MAX 2");
44*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(VB2_MAX(4, 3), 4, "MAX 4");
45*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(VB2_MAX(5, 5), 5, "MAX 5");
46*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(VB2_MAX(a, b), a, "MAX uint64 1");
47*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(VB2_MAX(b, a), a, "MAX uint64 2");
48*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(VB2_MAX(b, b), b, "MAX uint64 same");
49*8617a60dSAndroid Build Coastguard Worker 
50*8617a60dSAndroid Build Coastguard Worker 	counter_calls_left = 2;
51*8617a60dSAndroid Build Coastguard Worker 	VB2_MAX(counter(), counter());
52*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(counter_calls_left, 0, "MAX double-evaluation");
53*8617a60dSAndroid Build Coastguard Worker 
54*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(u >> 8, v, "uint64_t >> 8");
55*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(u >> 0, u, "uint64_t >> 0");
56*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(u >> 36, (uint64_t)0xabc, "uint64_t >> 36");
57*8617a60dSAndroid Build Coastguard Worker 
58*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(v * (uint32_t)0, 0, "uint64_t * uint32_t 0");
59*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(v * (uint32_t)1, v, "uint64_t * uint32_t 1");
60*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(v * (uint32_t)256, u, "uint64_t * uint32_t 256");
61*8617a60dSAndroid Build Coastguard Worker }
62*8617a60dSAndroid Build Coastguard Worker 
63*8617a60dSAndroid Build Coastguard Worker /*
64*8617a60dSAndroid Build Coastguard Worker  * Test array size macro.
65*8617a60dSAndroid Build Coastguard Worker  */
test_array_size(void)66*8617a60dSAndroid Build Coastguard Worker static void test_array_size(void)
67*8617a60dSAndroid Build Coastguard Worker {
68*8617a60dSAndroid Build Coastguard Worker 	uint8_t arr1[12];
69*8617a60dSAndroid Build Coastguard Worker 	uint32_t arr2[7];
70*8617a60dSAndroid Build Coastguard Worker 	uint64_t arr3[9];
71*8617a60dSAndroid Build Coastguard Worker 
72*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(ARRAY_SIZE(arr1), 12, "ARRAYSIZE(uint8_t)");
73*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(ARRAY_SIZE(arr2), 7, "ARRAYSIZE(uint32_t)");
74*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(ARRAY_SIZE(arr3), 9, "ARRAYSIZE(uint64_t)");
75*8617a60dSAndroid Build Coastguard Worker }
76*8617a60dSAndroid Build Coastguard Worker 
77*8617a60dSAndroid Build Coastguard Worker /*
78*8617a60dSAndroid Build Coastguard Worker  * Test struct packing for vboot_struct.h structs which are passed between
79*8617a60dSAndroid Build Coastguard Worker  * firmware and OS, or passed between different phases of firmware.
80*8617a60dSAndroid Build Coastguard Worker  */
test_struct_packing(void)81*8617a60dSAndroid Build Coastguard Worker static void test_struct_packing(void)
82*8617a60dSAndroid Build Coastguard Worker {
83*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(EXPECTED_VB2_PACKED_KEY_SIZE,
84*8617a60dSAndroid Build Coastguard Worker 		sizeof(struct vb2_packed_key),
85*8617a60dSAndroid Build Coastguard Worker 		"sizeof(vb2_packed_key)");
86*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(EXPECTED_VB2_GBB_HEADER_SIZE,
87*8617a60dSAndroid Build Coastguard Worker 		sizeof(struct vb2_gbb_header),
88*8617a60dSAndroid Build Coastguard Worker 		"sizeof(vb2_gbb_header)");
89*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(EXPECTED_VB2_SIGNATURE_SIZE,
90*8617a60dSAndroid Build Coastguard Worker 		sizeof(struct vb2_signature),
91*8617a60dSAndroid Build Coastguard Worker 		"sizeof(vb2_signature)");
92*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(EXPECTED_VB2_KEYBLOCK_SIZE,
93*8617a60dSAndroid Build Coastguard Worker 		sizeof(struct vb2_keyblock),
94*8617a60dSAndroid Build Coastguard Worker 		"sizeof(vb2_keyblock)");
95*8617a60dSAndroid Build Coastguard Worker }
96*8617a60dSAndroid Build Coastguard Worker 
97*8617a60dSAndroid Build Coastguard Worker /**
98*8617a60dSAndroid Build Coastguard Worker  * Test memory compare functions
99*8617a60dSAndroid Build Coastguard Worker  */
test_memcmp(void)100*8617a60dSAndroid Build Coastguard Worker static void test_memcmp(void)
101*8617a60dSAndroid Build Coastguard Worker {
102*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_safe_memcmp("foo", "foo", 3), 0, "memcmp equal");
103*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(vb2_safe_memcmp("foo1", "foo2", 4), 0, "memcmp different");
104*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_safe_memcmp("foo1", "foo2", 0), 0, "memcmp 0-size");
105*8617a60dSAndroid Build Coastguard Worker }
106*8617a60dSAndroid Build Coastguard Worker 
107*8617a60dSAndroid Build Coastguard Worker /**
108*8617a60dSAndroid Build Coastguard Worker  * Test alignment functions
109*8617a60dSAndroid Build Coastguard Worker  */
test_align(void)110*8617a60dSAndroid Build Coastguard Worker static void test_align(void)
111*8617a60dSAndroid Build Coastguard Worker {
112*8617a60dSAndroid Build Coastguard Worker 	uint64_t buf[4];
113*8617a60dSAndroid Build Coastguard Worker 	uint8_t *p0, *ptr;
114*8617a60dSAndroid Build Coastguard Worker 	uint32_t size;
115*8617a60dSAndroid Build Coastguard Worker 
116*8617a60dSAndroid Build Coastguard Worker 	/* Already aligned */
117*8617a60dSAndroid Build Coastguard Worker 	p0 = (uint8_t *)buf;
118*8617a60dSAndroid Build Coastguard Worker 	ptr = p0;
119*8617a60dSAndroid Build Coastguard Worker 	size = 16;
120*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_align(&ptr, &size, 4, 16), "vb2_align() aligned");
121*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_offset_of(p0, ptr), 0, "ptr");
122*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(size, 16, "  size");
123*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_align(&ptr, &size, 4, 17),
124*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_ALIGN_SIZE, "vb2_align() small");
125*8617a60dSAndroid Build Coastguard Worker 
126*8617a60dSAndroid Build Coastguard Worker 	/* Offset */
127*8617a60dSAndroid Build Coastguard Worker 	ptr = p0 + 1;
128*8617a60dSAndroid Build Coastguard Worker 	size = 15;
129*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_align(&ptr, &size, 4, 12), "vb2_align() offset");
130*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_offset_of(p0, ptr), 4, "ptr");
131*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(size, 12, "  size");
132*8617a60dSAndroid Build Coastguard Worker 
133*8617a60dSAndroid Build Coastguard Worker 	/* Offset, now too small */
134*8617a60dSAndroid Build Coastguard Worker 	ptr = p0 + 1;
135*8617a60dSAndroid Build Coastguard Worker 	size = 15;
136*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_align(&ptr, &size, 4, 15),
137*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_ALIGN_SIZE, "vb2_align() offset small");
138*8617a60dSAndroid Build Coastguard Worker 
139*8617a60dSAndroid Build Coastguard Worker 	/* Offset, too small even to align */
140*8617a60dSAndroid Build Coastguard Worker 	ptr = p0 + 1;
141*8617a60dSAndroid Build Coastguard Worker 	size = 1;
142*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_align(&ptr, &size, 4, 1),
143*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_ALIGN_BIGGER_THAN_SIZE, "vb2_align() offset tiny");
144*8617a60dSAndroid Build Coastguard Worker }
145*8617a60dSAndroid Build Coastguard Worker 
146*8617a60dSAndroid Build Coastguard Worker /**
147*8617a60dSAndroid Build Coastguard Worker  * Test work buffer functions
148*8617a60dSAndroid Build Coastguard Worker  */
test_workbuf(void)149*8617a60dSAndroid Build Coastguard Worker static void test_workbuf(void)
150*8617a60dSAndroid Build Coastguard Worker {
151*8617a60dSAndroid Build Coastguard Worker 	uint64_t buf[8] __attribute__((aligned(VB2_WORKBUF_ALIGN)));
152*8617a60dSAndroid Build Coastguard Worker 	uint8_t *p0 = (uint8_t *)buf, *ptr;
153*8617a60dSAndroid Build Coastguard Worker 	struct vb2_workbuf wb;
154*8617a60dSAndroid Build Coastguard Worker 
155*8617a60dSAndroid Build Coastguard Worker 	/* Init */
156*8617a60dSAndroid Build Coastguard Worker 	vb2_workbuf_init(&wb, p0, VB2_WORKBUF_ALIGN * 2);
157*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_offset_of(p0, wb.buf), 0, "Workbuf init aligned");
158*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(wb.size, VB2_WORKBUF_ALIGN * 2, "  size");
159*8617a60dSAndroid Build Coastguard Worker 
160*8617a60dSAndroid Build Coastguard Worker 	/* Unaligned init */
161*8617a60dSAndroid Build Coastguard Worker 	vb2_workbuf_init(&wb, p0 + 1, VB2_WORKBUF_ALIGN * 2);
162*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_offset_of(p0, wb.buf), VB2_WORKBUF_ALIGN,
163*8617a60dSAndroid Build Coastguard Worker 		"Workbuf init unaligned");
164*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(wb.size, VB2_WORKBUF_ALIGN + 1, "  size");
165*8617a60dSAndroid Build Coastguard Worker 
166*8617a60dSAndroid Build Coastguard Worker 	/* No size left after align */
167*8617a60dSAndroid Build Coastguard Worker 	vb2_workbuf_init(&wb, p0 + 1, VB2_WORKBUF_ALIGN - 1);
168*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(wb.size, 0, "Workbuf init size=0 after align");
169*8617a60dSAndroid Build Coastguard Worker 	vb2_workbuf_init(&wb, p0 + 1, VB2_WORKBUF_ALIGN - 2);
170*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(wb.size, 0, "Workbuf init size=-1 after align");
171*8617a60dSAndroid Build Coastguard Worker 
172*8617a60dSAndroid Build Coastguard Worker 	/* Alloc rounds up */
173*8617a60dSAndroid Build Coastguard Worker 	vb2_workbuf_init(&wb, p0, VB2_WORKBUF_ALIGN * 2);
174*8617a60dSAndroid Build Coastguard Worker 	ptr = vb2_workbuf_alloc(&wb, VB2_WORKBUF_ALIGN - 1);
175*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_offset_of(p0, ptr), 0, "Workbuf alloc");
176*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_offset_of(p0, wb.buf), VB2_WORKBUF_ALIGN, "  buf");
177*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(wb.size, VB2_WORKBUF_ALIGN, "  size");
178*8617a60dSAndroid Build Coastguard Worker 
179*8617a60dSAndroid Build Coastguard Worker 	/* Alloc doesn't fit */
180*8617a60dSAndroid Build Coastguard Worker 	vb2_workbuf_init(&wb, p0, VB2_WORKBUF_ALIGN);
181*8617a60dSAndroid Build Coastguard Worker 	TEST_PTR_EQ(vb2_workbuf_alloc(&wb, VB2_WORKBUF_ALIGN + 1), NULL,
182*8617a60dSAndroid Build Coastguard Worker 		    "Workbuf alloc too big");
183*8617a60dSAndroid Build Coastguard Worker 
184*8617a60dSAndroid Build Coastguard Worker 	/* Free reverses alloc */
185*8617a60dSAndroid Build Coastguard Worker 	vb2_workbuf_init(&wb, p0, VB2_WORKBUF_ALIGN * 2);
186*8617a60dSAndroid Build Coastguard Worker 	vb2_workbuf_alloc(&wb, VB2_WORKBUF_ALIGN + 1);
187*8617a60dSAndroid Build Coastguard Worker 	vb2_workbuf_free(&wb, VB2_WORKBUF_ALIGN + 1);
188*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_offset_of(p0, wb.buf), 0, "Workbuf free buf");
189*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(wb.size, VB2_WORKBUF_ALIGN * 2, "  size");
190*8617a60dSAndroid Build Coastguard Worker 
191*8617a60dSAndroid Build Coastguard Worker 	/* Realloc keeps same pointer as alloc */
192*8617a60dSAndroid Build Coastguard Worker 	vb2_workbuf_init(&wb, p0, VB2_WORKBUF_ALIGN * 3);
193*8617a60dSAndroid Build Coastguard Worker 	vb2_workbuf_alloc(&wb, VB2_WORKBUF_ALIGN - 1);
194*8617a60dSAndroid Build Coastguard Worker 	ptr = vb2_workbuf_realloc(&wb, VB2_WORKBUF_ALIGN - 1,
195*8617a60dSAndroid Build Coastguard Worker 				  VB2_WORKBUF_ALIGN + 1);
196*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_offset_of(p0, ptr), 0, "Workbuf realloc");
197*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_offset_of(p0, wb.buf), VB2_WORKBUF_ALIGN * 2, "  buf");
198*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(wb.size, VB2_WORKBUF_ALIGN, "  size");
199*8617a60dSAndroid Build Coastguard Worker }
200*8617a60dSAndroid Build Coastguard Worker 
201*8617a60dSAndroid Build Coastguard Worker /**
202*8617a60dSAndroid Build Coastguard Worker  * Helper functions not dependent on specific key sizes
203*8617a60dSAndroid Build Coastguard Worker  */
test_helper_functions(void)204*8617a60dSAndroid Build Coastguard Worker static void test_helper_functions(void)
205*8617a60dSAndroid Build Coastguard Worker {
206*8617a60dSAndroid Build Coastguard Worker 	{
207*8617a60dSAndroid Build Coastguard Worker 		struct vb2_packed_key k = {.key_offset = sizeof(k)};
208*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ((int)vb2_offset_of(&k, vb2_packed_key_data(&k)),
209*8617a60dSAndroid Build Coastguard Worker 			sizeof(k), "vb2_packed_key_data() adjacent");
210*8617a60dSAndroid Build Coastguard Worker 	}
211*8617a60dSAndroid Build Coastguard Worker 
212*8617a60dSAndroid Build Coastguard Worker 	{
213*8617a60dSAndroid Build Coastguard Worker 		struct vb2_packed_key k = {.key_offset = 123};
214*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ((int)vb2_offset_of(&k, vb2_packed_key_data(&k)), 123,
215*8617a60dSAndroid Build Coastguard Worker 			"vb2_packed_key_data() spaced");
216*8617a60dSAndroid Build Coastguard Worker 	}
217*8617a60dSAndroid Build Coastguard Worker 	{
218*8617a60dSAndroid Build Coastguard Worker 		struct vb2_signature s = {.sig_offset = sizeof(s)};
219*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ((int)vb2_offset_of(&s, vb2_signature_data(&s)),
220*8617a60dSAndroid Build Coastguard Worker 			sizeof(s), "vb2_signature_data() adjacent");
221*8617a60dSAndroid Build Coastguard Worker 	}
222*8617a60dSAndroid Build Coastguard Worker 
223*8617a60dSAndroid Build Coastguard Worker 	{
224*8617a60dSAndroid Build Coastguard Worker 		struct vb2_signature s = {.sig_offset = 123};
225*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ((int)vb2_offset_of(&s, vb2_signature_data(&s)), 123,
226*8617a60dSAndroid Build Coastguard Worker 			"vb2_signature_data() spaced");
227*8617a60dSAndroid Build Coastguard Worker 	}
228*8617a60dSAndroid Build Coastguard Worker 
229*8617a60dSAndroid Build Coastguard Worker 	{
230*8617a60dSAndroid Build Coastguard Worker 		uint8_t *p = (uint8_t *)test_helper_functions;
231*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ((int)vb2_offset_of(p, p), 0, "vb2_offset_of() equal");
232*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ((int)vb2_offset_of(p, p+10), 10,
233*8617a60dSAndroid Build Coastguard Worker 			"vb2_offset_of() positive");
234*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ((int)vb2_offset_of(p, p+0x12345678), 0x12345678,
235*8617a60dSAndroid Build Coastguard Worker 			"vb2_offset_of() large");
236*8617a60dSAndroid Build Coastguard Worker 	}
237*8617a60dSAndroid Build Coastguard Worker 
238*8617a60dSAndroid Build Coastguard Worker 	{
239*8617a60dSAndroid Build Coastguard Worker 		uint8_t *p = (uint8_t *)test_helper_functions;
240*8617a60dSAndroid Build Coastguard Worker 		TEST_SUCC(vb2_verify_member_inside(p, 20, p, 6, 11, 3),
241*8617a60dSAndroid Build Coastguard Worker 			  "vb2_verify_member_inside() ok 1");
242*8617a60dSAndroid Build Coastguard Worker 		TEST_SUCC(vb2_verify_member_inside(p, 20, p+4, 4, 8, 4),
243*8617a60dSAndroid Build Coastguard Worker 			  "vb2_verify_member_inside() ok 2");
244*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2_verify_member_inside(p, 20, p-4, 4, 8, 4),
245*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INSIDE_MEMBER_OUTSIDE,
246*8617a60dSAndroid Build Coastguard Worker 			"vb2_verify_member_inside() member before parent");
247*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2_verify_member_inside(p, 20, p+20, 4, 8, 4),
248*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INSIDE_MEMBER_OUTSIDE,
249*8617a60dSAndroid Build Coastguard Worker 			"vb2_verify_member_inside() member after parent");
250*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2_verify_member_inside(p, 20, p, 21, 0, 0),
251*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INSIDE_MEMBER_OUTSIDE,
252*8617a60dSAndroid Build Coastguard Worker 			"vb2_verify_member_inside() member too big");
253*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2_verify_member_inside(p, 20, p, 4, 21, 0),
254*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INSIDE_DATA_OUTSIDE,
255*8617a60dSAndroid Build Coastguard Worker 			"vb2_verify_member_inside() data after parent");
256*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2_verify_member_inside(p, 20, p, 4, SIZE_MAX, 0),
257*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INSIDE_DATA_OUTSIDE,
258*8617a60dSAndroid Build Coastguard Worker 			"vb2_verify_member_inside() data before parent");
259*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2_verify_member_inside(p, 20, p, 4, 4, 17),
260*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INSIDE_DATA_OUTSIDE,
261*8617a60dSAndroid Build Coastguard Worker 			"vb2_verify_member_inside() data too big");
262*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2_verify_member_inside(p, 20, p, 8, 4, 8),
263*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INSIDE_DATA_OVERLAP,
264*8617a60dSAndroid Build Coastguard Worker 			"vb2_verify_member_inside() data overlaps member");
265*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2_verify_member_inside(p, -8, p, 12, 0, 0),
266*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INSIDE_PARENT_WRAPS,
267*8617a60dSAndroid Build Coastguard Worker 			"vb2_verify_member_inside() wraparound 1");
268*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2_verify_member_inside(p, 20, p, -8, 0, 0),
269*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INSIDE_MEMBER_WRAPS,
270*8617a60dSAndroid Build Coastguard Worker 			"vb2_verify_member_inside() wraparound 2");
271*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2_verify_member_inside(p, 20, p, 4, 4, -12),
272*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INSIDE_DATA_WRAPS,
273*8617a60dSAndroid Build Coastguard Worker 			"vb2_verify_member_inside() wraparound 3");
274*8617a60dSAndroid Build Coastguard Worker 	}
275*8617a60dSAndroid Build Coastguard Worker 
276*8617a60dSAndroid Build Coastguard Worker 	{
277*8617a60dSAndroid Build Coastguard Worker 		struct vb2_packed_key k = {.key_offset = sizeof(k),
278*8617a60dSAndroid Build Coastguard Worker 					   .key_size = 128};
279*8617a60dSAndroid Build Coastguard Worker 		const void *lower_base;
280*8617a60dSAndroid Build Coastguard Worker 		TEST_SUCC(vb2_verify_packed_key_inside(&k, sizeof(k)+128, &k),
281*8617a60dSAndroid Build Coastguard Worker 			  "vb2_packed_key_inside() ok 1");
282*8617a60dSAndroid Build Coastguard Worker 		lower_base = (const void *)((uintptr_t)&k - sizeof(k));
283*8617a60dSAndroid Build Coastguard Worker 		TEST_SUCC(vb2_verify_packed_key_inside(lower_base,
284*8617a60dSAndroid Build Coastguard Worker 						       2*sizeof(k)+128, &k),
285*8617a60dSAndroid Build Coastguard Worker 			  "vb2_packed_key_inside() ok 2");
286*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2_verify_packed_key_inside(&k, 128, &k),
287*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INSIDE_DATA_OUTSIDE,
288*8617a60dSAndroid Build Coastguard Worker 			"vb2_packed_key_inside() key too big");
289*8617a60dSAndroid Build Coastguard Worker 	}
290*8617a60dSAndroid Build Coastguard Worker 
291*8617a60dSAndroid Build Coastguard Worker 	{
292*8617a60dSAndroid Build Coastguard Worker 		struct vb2_packed_key k = {.key_offset = 100,
293*8617a60dSAndroid Build Coastguard Worker 					   .key_size = 4};
294*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2_verify_packed_key_inside(&k, 99, &k),
295*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INSIDE_DATA_OUTSIDE,
296*8617a60dSAndroid Build Coastguard Worker 			"vb2_packed_key_inside() offset too big");
297*8617a60dSAndroid Build Coastguard Worker 	}
298*8617a60dSAndroid Build Coastguard Worker 
299*8617a60dSAndroid Build Coastguard Worker 	{
300*8617a60dSAndroid Build Coastguard Worker 		struct vb2_signature s = {.sig_offset = sizeof(s),
301*8617a60dSAndroid Build Coastguard Worker 					  .sig_size = 128};
302*8617a60dSAndroid Build Coastguard Worker 		const void *lower_base;
303*8617a60dSAndroid Build Coastguard Worker 		TEST_SUCC(vb2_verify_signature_inside(&s, sizeof(s)+128, &s),
304*8617a60dSAndroid Build Coastguard Worker 			"vb2_verify_signature_inside() ok 1");
305*8617a60dSAndroid Build Coastguard Worker 		lower_base = (const void *)((uintptr_t)&s - sizeof(s));
306*8617a60dSAndroid Build Coastguard Worker 		TEST_SUCC(vb2_verify_signature_inside(lower_base,
307*8617a60dSAndroid Build Coastguard Worker 						      2*sizeof(s)+128, &s),
308*8617a60dSAndroid Build Coastguard Worker 			  "vb2_verify_signature_inside() ok 2");
309*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2_verify_signature_inside(&s, 128, &s),
310*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INSIDE_DATA_OUTSIDE,
311*8617a60dSAndroid Build Coastguard Worker 			"vb2_verify_signature_inside() sig too big");
312*8617a60dSAndroid Build Coastguard Worker 	}
313*8617a60dSAndroid Build Coastguard Worker 
314*8617a60dSAndroid Build Coastguard Worker 	{
315*8617a60dSAndroid Build Coastguard Worker 		struct vb2_signature s = {.sig_offset = 100,
316*8617a60dSAndroid Build Coastguard Worker 					  .sig_size = 4};
317*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2_verify_signature_inside(&s, 99, &s),
318*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_INSIDE_DATA_OUTSIDE,
319*8617a60dSAndroid Build Coastguard Worker 			"vb2_verify_signature_inside() offset too big");
320*8617a60dSAndroid Build Coastguard Worker 	}
321*8617a60dSAndroid Build Coastguard Worker }
322*8617a60dSAndroid Build Coastguard Worker 
323*8617a60dSAndroid Build Coastguard Worker /* Helper for test_assert_die() below */
_true_assertion_helper(void)324*8617a60dSAndroid Build Coastguard Worker static int _true_assertion_helper(void)
325*8617a60dSAndroid Build Coastguard Worker {
326*8617a60dSAndroid Build Coastguard Worker 	VB2_ASSERT(2 + 2 == 4);
327*8617a60dSAndroid Build Coastguard Worker 	return 1;
328*8617a60dSAndroid Build Coastguard Worker }
329*8617a60dSAndroid Build Coastguard Worker 
330*8617a60dSAndroid Build Coastguard Worker /**
331*8617a60dSAndroid Build Coastguard Worker  * Test VB2_ASSERT and VB2_DIE macros
332*8617a60dSAndroid Build Coastguard Worker  */
test_assert_die(void)333*8617a60dSAndroid Build Coastguard Worker static void test_assert_die(void)
334*8617a60dSAndroid Build Coastguard Worker {
335*8617a60dSAndroid Build Coastguard Worker 	TEST_ABORT(VB2_DIE("die"), "DIE should abort");
336*8617a60dSAndroid Build Coastguard Worker 	TEST_ABORT(VB2_ASSERT(2 + 2 == 5), "ASSERT false should abort");
337*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(_true_assertion_helper(), "ASSERT true should continue");
338*8617a60dSAndroid Build Coastguard Worker }
339*8617a60dSAndroid Build Coastguard Worker 
main(int argc,char * argv[])340*8617a60dSAndroid Build Coastguard Worker int main(int argc, char* argv[])
341*8617a60dSAndroid Build Coastguard Worker {
342*8617a60dSAndroid Build Coastguard Worker 	test_arithmetic();
343*8617a60dSAndroid Build Coastguard Worker 	test_array_size();
344*8617a60dSAndroid Build Coastguard Worker 	test_struct_packing();
345*8617a60dSAndroid Build Coastguard Worker 	test_memcmp();
346*8617a60dSAndroid Build Coastguard Worker 	test_align();
347*8617a60dSAndroid Build Coastguard Worker 	test_workbuf();
348*8617a60dSAndroid Build Coastguard Worker 	test_helper_functions();
349*8617a60dSAndroid Build Coastguard Worker 	test_assert_die();
350*8617a60dSAndroid Build Coastguard Worker 
351*8617a60dSAndroid Build Coastguard Worker 	return gTestSuccess ? 0 : 255;
352*8617a60dSAndroid Build Coastguard Worker }
353