1 /* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
2  * Use of this source code is governed by a BSD-style license that can be
3  * found in the LICENSE file.
4  *
5  * Tests for firmware 2common.c
6  */
7 
8 #include "2sysincludes.h"
9 #include "2common.h"
10 #include "2rsa.h"
11 #include "vb2_common.h"
12 #include "host_fw_preamble2.h"
13 #include "host_key2.h"
14 #include "host_keyblock2.h"
15 #include "host_signature2.h"
16 
17 #include "test_common.h"
18 
19 static const uint8_t test_data[] = "This is some test data to sign.";
20 static const uint8_t test_data2[] = "Some more test data";
21 static const uint8_t test_data3[] = "Even more test data";
22 
23 /*
24  * Test struct packing for vboot_struct.h structs which are passed between
25  * firmware and OS, or passed between different phases of firmware.
26  */
test_struct_packing(void)27 static void test_struct_packing(void)
28 {
29 	/* Test new struct sizes */
30 	TEST_EQ(EXPECTED_GUID_SIZE,
31 		sizeof(struct vb2_guid),
32 		"sizeof(vb2_guid)");
33 	TEST_EQ(EXPECTED_VB2_STRUCT_COMMON_SIZE,
34 		sizeof(struct vb2_struct_common),
35 		"sizeof(vb2_struct_common)");
36 	TEST_EQ(EXPECTED_VB2_PACKED_KEY_SIZE,
37 		sizeof(struct vb2_packed_key),
38 		"sizeof(vb2_packed_key)");
39 	TEST_EQ(EXPECTED_VB2_SIGNATURE_SIZE,
40 		sizeof(struct vb2_signature),
41 		"sizeof(vb2_signature)");
42 	TEST_EQ(EXPECTED_VB2_KEYBLOCK_SIZE,
43 		sizeof(struct vb2_keyblock),
44 		"sizeof(vb2_keyblock)");
45 	TEST_EQ(EXPECTED_VB2_FW_PREAMBLE_SIZE,
46 		sizeof(struct vb2_fw_preamble),
47 		"sizeof(vb2_fw_preamble)");
48 }
49 
50 /**
51  * Common header functions
52  */
test_common_header_functions(void)53 static void test_common_header_functions(void)
54 {
55 	uint8_t cbuf[sizeof(struct vb2_struct_common) + 128];
56 	uint8_t cbufgood[sizeof(cbuf)];
57 	struct vb2_struct_common *c = (struct vb2_struct_common *)cbuf;
58 	struct vb2_struct_common *c2;
59 	const char test_desc[32] = "test desc";
60 	uint32_t desc_end, m;
61 
62 	c->total_size = sizeof(cbuf);
63 	c->fixed_size = sizeof(*c);
64 	c->desc_size = sizeof(test_desc);
65 	memcpy(cbuf + c->fixed_size, test_desc, sizeof(test_desc));
66 	desc_end = c->fixed_size + c->desc_size;
67 
68 	c2 = (struct vb2_struct_common *)(cbuf + desc_end);
69 	c2->total_size = c->total_size - desc_end;
70 	c2->fixed_size = sizeof(*c2);
71 	c2->desc_size = 0;
72 
73 	/* Description helper */
74 	TEST_EQ(0, strcmp(vb2_common_desc(c), test_desc), "vb2_common_desc()");
75 	TEST_EQ(0, strcmp(vb2_common_desc(c2), ""), "vb2_common_desc() empty");
76 
77 	TEST_SUCC(vb2_verify_common_header(cbuf, sizeof(cbuf)),
78 		  "vb2_verify_common_header() good");
79 	memcpy(cbufgood, cbuf, sizeof(cbufgood));
80 
81 	memcpy(cbuf, cbufgood, sizeof(cbuf));
82 	c->total_size += 4;
83 	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
84 		VB2_ERROR_COMMON_TOTAL_SIZE,
85 		"vb2_verify_common_header() total size");
86 
87 	memcpy(cbuf, cbufgood, sizeof(cbuf));
88 	c->fixed_size = c->total_size + 4;
89 	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
90 		VB2_ERROR_COMMON_FIXED_SIZE,
91 		"vb2_verify_common_header() fixed size");
92 
93 	memcpy(cbuf, cbufgood, sizeof(cbuf));
94 	c->desc_size = c->total_size - c->fixed_size + 4;
95 	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
96 		VB2_ERROR_COMMON_DESC_SIZE,
97 		"vb2_verify_common_header() desc size");
98 
99 	memcpy(cbuf, cbufgood, sizeof(cbuf));
100 	c->total_size--;
101 	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
102 		VB2_ERROR_COMMON_TOTAL_UNALIGNED,
103 		"vb2_verify_common_header() total unaligned");
104 
105 	memcpy(cbuf, cbufgood, sizeof(cbuf));
106 	c->fixed_size++;
107 	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
108 		VB2_ERROR_COMMON_FIXED_UNALIGNED,
109 		"vb2_verify_common_header() fixed unaligned");
110 
111 	memcpy(cbuf, cbufgood, sizeof(cbuf));
112 	c->desc_size--;
113 	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
114 		VB2_ERROR_COMMON_DESC_UNALIGNED,
115 		"vb2_verify_common_header() desc unaligned");
116 
117 	memcpy(cbuf, cbufgood, sizeof(cbuf));
118 	c->desc_size = -4;
119 	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
120 		VB2_ERROR_COMMON_DESC_WRAPS,
121 		"vb2_verify_common_header() desc wraps");
122 
123 	memcpy(cbuf, cbufgood, sizeof(cbuf));
124 	cbuf[desc_end - 1] = 1;
125 	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
126 		VB2_ERROR_COMMON_DESC_TERMINATOR,
127 		"vb2_verify_common_header() desc not terminated");
128 
129 	/* Member checking function */
130 	memcpy(cbuf, cbufgood, sizeof(cbuf));
131 	m = 0;
132 	TEST_SUCC(vb2_verify_common_member(cbuf, &m, c->total_size - 8, 4),
133 		  "vb2_verify_common_member()");
134 	TEST_EQ(m, c->total_size - 4, "  new minimum");
135 
136 	m = desc_end;
137 	TEST_SUCC(vb2_verify_common_member(cbuf, &m, desc_end, 4),
138 		  "vb2_verify_common_member() good offset");
139 	TEST_EQ(m, desc_end + 4, "  new minimum");
140 
141 	m = 0;
142 	TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 8, -4),
143 		VB2_ERROR_COMMON_MEMBER_WRAPS,
144 		"vb2_verify_common_member() wraps");
145 
146 	m = 0;
147 	TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 7, 4),
148 		VB2_ERROR_COMMON_MEMBER_UNALIGNED,
149 		"vb2_verify_common_member() offset unaligned");
150 
151 	m = 0;
152 	TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 8, 5),
153 		VB2_ERROR_COMMON_MEMBER_UNALIGNED,
154 		"vb2_verify_common_member() size unaligned");
155 
156 	m = 0;
157 	TEST_EQ(vb2_verify_common_member(cbuf, &m, desc_end - 4, 4),
158 		VB2_ERROR_COMMON_MEMBER_OVERLAP,
159 		"vb2_verify_common_member() overlap");
160 
161 	m = desc_end + 4;
162 	TEST_EQ(vb2_verify_common_member(cbuf, &m, desc_end, 4),
163 		VB2_ERROR_COMMON_MEMBER_OVERLAP,
164 		"vb2_verify_common_member() overlap 2");
165 
166 	m = 0;
167 	TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 4, 8),
168 		VB2_ERROR_COMMON_MEMBER_SIZE,
169 		"vb2_verify_common_member() size");
170 
171 	/* Subobject checking */
172 	m = 0;
173 	TEST_SUCC(vb2_verify_common_subobject(cbuf, &m, desc_end),
174 		  "vb2_verify_common_subobject() good offset");
175 	TEST_EQ(m, sizeof(cbuf), "  new minimum");
176 
177 	m = desc_end + 4;
178 	TEST_EQ(vb2_verify_common_subobject(cbuf, &m, desc_end),
179 		VB2_ERROR_COMMON_MEMBER_OVERLAP,
180 		"vb2_verify_common_subobject() overlap");
181 
182 	m = 0;
183 	c2->total_size += 4;
184 	TEST_EQ(vb2_verify_common_subobject(cbuf, &m, desc_end),
185 		VB2_ERROR_COMMON_TOTAL_SIZE,
186 		"vb2_verify_common_subobject() size");
187 }
188 
189 /**
190  * Signature size
191  */
test_sig_size(void)192 static void test_sig_size(void)
193 {
194 	TEST_EQ(vb2_sig_size(VB2_SIG_INVALID, VB2_HASH_SHA256), 0,
195 		"vb2_sig_size() sig invalid");
196 
197 	TEST_EQ(vb2_sig_size(VB2_SIG_RSA2048, VB2_HASH_INVALID), 0,
198 		"vb2_sig_size() hash invalid");
199 
200 	TEST_EQ(vb2_sig_size(VB2_SIG_RSA2048, VB2_HASH_SHA256), 2048 / 8,
201 		"vb2_sig_size() RSA2048");
202 	TEST_EQ(vb2_sig_size(VB2_SIG_RSA4096, VB2_HASH_SHA256), 4096 / 8,
203 		"vb2_sig_size() RSA4096");
204 	TEST_EQ(vb2_sig_size(VB2_SIG_RSA8192, VB2_HASH_SHA512), 8192 / 8,
205 		"vb2_sig_size() RSA8192");
206 
207 	TEST_EQ(vb2_sig_size(VB2_SIG_NONE, VB2_HASH_SHA1),
208 		VB2_SHA1_DIGEST_SIZE, "vb2_sig_size() SHA1");
209 	TEST_EQ(vb2_sig_size(VB2_SIG_NONE, VB2_HASH_SHA256),
210 		VB2_SHA256_DIGEST_SIZE, "vb2_sig_size() SHA256");
211 	TEST_EQ(vb2_sig_size(VB2_SIG_NONE, VB2_HASH_SHA512),
212 		VB2_SHA512_DIGEST_SIZE, "vb2_sig_size() SHA512");
213 }
214 
215 /**
216  * Verify data on bare hash
217  */
test_verify_hash(void)218 static void test_verify_hash(void)
219 {
220 	struct vb2_signature *sig;
221 	const struct vb2_private_key *prik;
222 	struct vb2_public_key pubk;
223 	uint8_t workbuf[VB2_VERIFY_DATA_WORKBUF_BYTES]
224 		 __attribute__ ((aligned (VB2_WORKBUF_ALIGN)));
225 	struct vb2_workbuf wb;
226 
227 	vb2_workbuf_init(&wb, workbuf, sizeof(workbuf));
228 
229 	TEST_SUCC(vb2_private_key_hash(&prik, VB2_HASH_SHA256),
230 		  "create private hash key");
231 	TEST_SUCC(vb2_public_key_hash(&pubk, VB2_HASH_SHA256),
232 		  "create hash key");
233 
234 	/* Create the signature */
235 	TEST_SUCC(vb2_sign_data(&sig, test_data, sizeof(test_data), prik, NULL),
236 		  "create hash sig");
237 
238 	TEST_SUCC(vb2_verify_data(test_data, sizeof(test_data),
239 				  sig, &pubk, &wb),
240 		  "vb2_verify_data() hash ok");
241 
242 	*((uint8_t *)sig + sig->sig_offset) ^= 0xab;
243 	TEST_EQ(vb2_verify_data(test_data, sizeof(test_data), sig, &pubk, &wb),
244 		VB2_ERROR_VDATA_VERIFY_DIGEST, "vb2_verify_data() hash bad");
245 
246 	free(sig);
247 }
248 
249 /**
250  * Verify keyblock
251  */
test_verify_keyblock(void)252 static void test_verify_keyblock(void)
253 {
254 	const char desc[16] = "test keyblock";
255 	const struct vb2_private_key *prik[2];
256 	struct vb2_public_key pubk, pubk2, pubk3;
257 	struct vb2_signature *sig;
258 	struct vb2_keyblock *kbuf;
259 	uint32_t buf_size;
260 	uint8_t *buf, *buf2;
261 
262 	uint8_t workbuf[VB2_KEY_BLOCK_VERIFY_WORKBUF_BYTES]
263 		 __attribute__ ((aligned (VB2_WORKBUF_ALIGN)));
264 	struct vb2_workbuf wb;
265 
266 	TEST_SUCC(vb2_public_key_hash(&pubk, VB2_HASH_SHA256),
267 		  "create hash key 1");
268 	TEST_SUCC(vb2_public_key_hash(&pubk2, VB2_HASH_SHA512),
269 		  "create hash key 2");
270 	TEST_SUCC(vb2_public_key_hash(&pubk3, VB2_HASH_SHA1),
271 		  "create hash key 3");
272 
273 	TEST_SUCC(vb2_private_key_hash(prik + 0, VB2_HASH_SHA256),
274 		  "create private key 1");
275 	TEST_SUCC(vb2_private_key_hash(prik + 1, VB2_HASH_SHA512),
276 		  "create private key 2");
277 
278 	/* Create the test keyblock */
279 	TEST_SUCC(vb2_keyblock_create(&kbuf, &pubk3, prik, 2, 0x4321, desc),
280 		  "create keyblock");
281 
282 	buf = (uint8_t *)kbuf;
283 	buf_size = kbuf->c.total_size;
284 
285 	/* Make a copy of the buffer, so we can mangle it for tests */
286 	buf2 = malloc(buf_size);
287 	memcpy(buf2, buf, buf_size);
288 
289 	vb2_workbuf_init(&wb, workbuf, sizeof(workbuf));
290 	kbuf = (struct vb2_keyblock *)buf;
291 
292 	TEST_SUCC(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
293 		  "vb2_verify_keyblock()");
294 
295 	memcpy(buf, buf2, buf_size);
296 	TEST_SUCC(vb2_verify_keyblock(kbuf, buf_size, &pubk2, &wb),
297 		  "vb2_verify_keyblock() key 2");
298 
299 	memcpy(buf, buf2, buf_size);
300 	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk3, &wb),
301 		VB2_ERROR_KEYBLOCK_SIG_GUID,
302 		"vb2_verify_keyblock() key not present");
303 
304 	memcpy(buf, buf2, buf_size);
305 	kbuf->c.magic = VB2_MAGIC_PACKED_KEY;
306 	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
307 		VB2_ERROR_KEYBLOCK_MAGIC,
308 		"vb2_verify_keyblock() magic");
309 
310 	memcpy(buf, buf2, buf_size);
311 	kbuf->c.fixed_size++;
312 	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
313 		VB2_ERROR_COMMON_FIXED_UNALIGNED,
314 		"vb2_verify_keyblock() header");
315 
316 	memcpy(buf, buf2, buf_size);
317 	kbuf->c.struct_version_major++;
318 	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
319 		VB2_ERROR_KEYBLOCK_HEADER_VERSION,
320 		"vb2_verify_keyblock() major version");
321 
322 	memcpy(buf, buf2, buf_size);
323 	kbuf->c.struct_version_minor++;
324 	/* That changes the signature, so resign the keyblock */
325 	vb2_sign_data(&sig, buf, kbuf->sig_offset, prik[0], NULL);
326 	memcpy(buf + kbuf->sig_offset, sig, sig->c.total_size);
327 	free(sig);
328 	TEST_SUCC(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
329 		  "vb2_verify_keyblock() minor version");
330 
331 	memcpy(buf, buf2, buf_size);
332 	kbuf->c.fixed_size -= 4;
333 	kbuf->c.desc_size += 4;
334 	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
335 		VB2_ERROR_KEYBLOCK_SIZE,
336 		"vb2_verify_keyblock() header size");
337 
338 	memcpy(buf, buf2, buf_size);
339 	kbuf->key_offset = kbuf->c.total_size - 4;
340 	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
341 		VB2_ERROR_COMMON_MEMBER_SIZE,
342 		"vb2_verify_keyblock() data key outside");
343 
344 	memcpy(buf, buf2, buf_size);
345 	sig = (struct vb2_signature *)(buf + kbuf->sig_offset);
346 	sig->data_size--;
347 	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
348 		VB2_ERROR_KEYBLOCK_SIGNED_SIZE,
349 		"vb2_verify_keyblock() signed wrong size");
350 
351 	memcpy(buf, buf2, buf_size);
352 	sig = (struct vb2_signature *)(buf + kbuf->sig_offset);
353 	sig->c.total_size = kbuf->c.total_size - 4;
354 	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
355 		VB2_ERROR_COMMON_TOTAL_SIZE,
356 		"vb2_verify_keyblock() key outside keyblock");
357 
358 	memcpy(buf, buf2, buf_size);
359 	sig = (struct vb2_signature *)(buf + kbuf->sig_offset);
360 	sig->c.struct_version_major++;
361 	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
362 		VB2_ERROR_SIG_VERSION,
363 		"vb2_verify_keyblock() corrupt key");
364 
365 	memcpy(buf, buf2, buf_size);
366 	kbuf->c.struct_version_minor++;
367 	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
368 		VB2_ERROR_VDATA_VERIFY_DIGEST,
369 		"vb2_verify_keyblock() corrupt");
370 
371 	free(buf);
372 	free(buf2);
373 }
374 
375 /**
376  * Verify firmware preamble
377  */
test_verify_fw_preamble(void)378 static void test_verify_fw_preamble(void)
379 {
380 	const char desc[16] = "test preamble";
381 	const struct vb2_private_key *prikhash;
382 	struct vb2_signature *hashes[3];
383 	struct vb2_public_key pubk;
384 	struct vb2_signature *sig;
385 	struct vb2_fw_preamble *pre;
386 	uint32_t buf_size;
387 	uint8_t *buf, *buf2;
388 
389 	uint8_t workbuf[VB2_VERIFY_FIRMWARE_PREAMBLE_WORKBUF_BYTES]
390 		 __attribute__ ((aligned (VB2_WORKBUF_ALIGN)));
391 	struct vb2_workbuf wb;
392 
393 	/*
394 	 * Preambles will usually be signed with a real key not a bare hash,
395 	 * but the call to vb2_verify_data() inside the preamble check is the
396 	 * same (and its functionality is verified separately), and using a
397 	 * bare hash here saves us from needing to have a private key to do
398 	 * this test.
399 	 */
400 	TEST_SUCC(vb2_public_key_hash(&pubk, VB2_HASH_SHA256),
401 		  "create hash key");
402 	TEST_SUCC(vb2_private_key_hash(&prikhash, VB2_HASH_SHA256),
403 			  "Create private hash key");
404 
405 	/* Create some signatures */
406 	TEST_SUCC(vb2_sign_data(hashes + 0, test_data, sizeof(test_data),
407 				prikhash, "Hash 1"),
408 		  "Hash 1");
409 	TEST_SUCC(vb2_sign_data(hashes + 1, test_data2, sizeof(test_data2),
410 				prikhash, "Hash 2"),
411 		  "Hash 2");
412 	TEST_SUCC(vb2_sign_data(hashes + 2, test_data3, sizeof(test_data3),
413 				prikhash, "Hash 3"),
414 			  "Hash 3");
415 
416 	/* Test good preamble */
417 	TEST_SUCC(vb2_fw_preamble_create(&pre, prikhash,
418 					 (const struct vb2_signature **)hashes,
419 					 3, 0x1234, 0x5678, desc),
420 		  "Create preamble good");
421 
422 	buf = (uint8_t *)pre;
423 	buf_size = pre->c.total_size;
424 
425 	/* Make a copy of the buffer, so we can mangle it for tests */
426 	buf2 = malloc(buf_size);
427 	memcpy(buf2, buf, buf_size);
428 
429 	vb2_workbuf_init(&wb, workbuf, sizeof(workbuf));
430 	pre = (struct vb2_fw_preamble *)buf;
431 
432 	TEST_SUCC(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
433 		  "vb2_verify_fw_preamble()");
434 
435 	memcpy(buf, buf2, buf_size);
436 	pre->c.magic = VB2_MAGIC_PACKED_KEY;
437 	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
438 		VB2_ERROR_PREAMBLE_MAGIC,
439 		"vb2_verify_fw_preamble() magic");
440 
441 	memcpy(buf, buf2, buf_size);
442 	pre->c.fixed_size++;
443 	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
444 		VB2_ERROR_COMMON_FIXED_UNALIGNED,
445 		"vb2_verify_fw_preamble() header");
446 
447 	memcpy(buf, buf2, buf_size);
448 	pre->c.struct_version_major++;
449 	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
450 		VB2_ERROR_PREAMBLE_HEADER_VERSION,
451 		"vb2_verify_fw_preamble() major version");
452 
453 	memcpy(buf, buf2, buf_size);
454 	pre->c.struct_version_minor++;
455 	/* That changes the signature, so resign the fw_preamble */
456 	vb2_sign_data(&sig, buf, pre->sig_offset, prikhash, NULL);
457 	memcpy(buf + pre->sig_offset, sig, sig->c.total_size);
458 	free(sig);
459 	TEST_SUCC(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
460 		  "vb2_verify_fw_preamble() minor version");
461 
462 	memcpy(buf, buf2, buf_size);
463 	pre->c.fixed_size -= 4;
464 	pre->c.desc_size += 4;
465 	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
466 		VB2_ERROR_PREAMBLE_SIZE,
467 		"vb2_verify_fw_preamble() header size");
468 
469 	memcpy(buf, buf2, buf_size);
470 	sig = (struct vb2_signature *)(buf + pre->hash_offset);
471 	sig->c.total_size += pre->c.total_size;
472 	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
473 		VB2_ERROR_COMMON_TOTAL_SIZE,
474 		"vb2_verify_fw_preamble() hash size");
475 
476 	memcpy(buf, buf2, buf_size);
477 	sig = (struct vb2_signature *)(buf + pre->hash_offset);
478 	sig->sig_size /= 2;
479 	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
480 		VB2_ERROR_SIG_SIZE,
481 		"vb2_verify_fw_preamble() hash integrity");
482 
483 	memcpy(buf, buf2, buf_size);
484 	pre->hash_count++;
485 	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
486 		VB2_ERROR_COMMON_MEMBER_OVERLAP,
487 		"vb2_verify_fw_preamble() hash count");
488 
489 	memcpy(buf, buf2, buf_size);
490 	sig = (struct vb2_signature *)(buf + pre->sig_offset);
491 	sig->c.total_size += 4;
492 	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
493 		VB2_ERROR_COMMON_TOTAL_SIZE,
494 		"vb2_verify_fw_preamble() sig inside");
495 
496 	memcpy(buf, buf2, buf_size);
497 	sig = (struct vb2_signature *)(buf + pre->sig_offset);
498 	buf[pre->sig_offset + sig->sig_offset]++;
499 	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
500 		VB2_ERROR_VDATA_VERIFY_DIGEST,
501 		"vb2_verify_fw_preamble() sig corrupt");
502 
503 	memcpy(buf, buf2, buf_size);
504 	pre->flags++;
505 	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
506 		VB2_ERROR_VDATA_VERIFY_DIGEST,
507 		"vb2_verify_fw_preamble() preamble corrupt");
508 
509 	free(buf);
510 	free(buf2);
511 }
512 
main(int argc,char * argv[])513 int main(int argc, char* argv[])
514 {
515 	test_struct_packing();
516 	test_common_header_functions();
517 	test_sig_size();
518 	test_verify_hash();
519 	test_verify_keyblock();
520 	test_verify_fw_preamble();
521 
522 	return gTestSuccess ? 0 : 255;
523 }
524