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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 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