vboot_common_tests.c revision 3ecaf776d82d29573be083b2e5c6ddc5b9f49c70
1/* Copyright (c) 2010 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 image library. 6 */ 7 8#include <stdio.h> 9#include <stdlib.h> 10 11#include "test_common.h" 12#include "vboot_common.h" 13 14/* Test struct packing */ 15static void StructPackingTest(void) { 16 TEST_EQ(EXPECTED_VBPUBLICKEY_SIZE, sizeof(VbPublicKey), 17 "sizeof(VbPublicKey)"); 18 TEST_EQ(EXPECTED_VBSIGNATURE_SIZE, sizeof(VbSignature), 19 "sizeof(VbSignature)"); 20 TEST_EQ(EXPECTED_VBKEYBLOCKHEADER_SIZE, sizeof(VbKeyBlockHeader), 21 "sizeof(VbKeyBlockHeader)"); 22 TEST_EQ(EXPECTED_VBFIRMWAREPREAMBLEHEADER_SIZE, 23 sizeof(VbFirmwarePreambleHeader), "sizeof(VbFirmwarePreambleHeader)"); 24 TEST_EQ(EXPECTED_VBKERNELPREAMBLEHEADER_SIZE, 25 sizeof(VbKernelPreambleHeader), "sizeof(VbKernelPreambleHeader)"); 26} 27 28 29/* Helper functions not dependent on specific key sizes */ 30static void VerifyHelperFunctions(void) { 31 32 { 33 uint8_t p[1]; 34 TEST_EQ((int)OffsetOf(p, p), 0, "OffsetOf() equal"); 35 TEST_EQ((int)OffsetOf(p, p+10), 10, "OffsetOf() positive"); 36 TEST_EQ((int)OffsetOf(p, p+0x12345678), 0x12345678, "OffsetOf() large"); 37 } 38 39 { 40 VbPublicKey k = {sizeof(k), 2, 3, 4}; 41 TEST_EQ((int)OffsetOf(&k, GetPublicKeyData(&k)), sizeof(k), 42 "GetPublicKeyData() adjacent"); 43 TEST_EQ((int)OffsetOf(&k, GetPublicKeyDataC(&k)), sizeof(k), 44 "GetPublicKeyDataC() adjacent"); 45 } 46 47 { 48 VbPublicKey k = {123, 2, 3, 4}; 49 TEST_EQ((int)OffsetOf(&k, GetPublicKeyData(&k)), 123, 50 "GetPublicKeyData() spaced"); 51 TEST_EQ((int)OffsetOf(&k, GetPublicKeyDataC(&k)), 123, 52 "GetPublicKeyDataC() spaced"); 53 } 54 55 { 56 uint8_t p[1]; 57 TEST_EQ(VerifyMemberInside(p, 20, p, 6, 11, 3), 0, "MemberInside ok 1"); 58 TEST_EQ(VerifyMemberInside(p, 20, p+4, 4, 8, 4), 0, "MemberInside ok 2"); 59 TEST_EQ(VerifyMemberInside(p, 20, p-4, 4, 8, 4), 1, 60 "MemberInside member before parent"); 61 TEST_EQ(VerifyMemberInside(p, 20, p+20, 4, 8, 4), 1, 62 "MemberInside member after parent"); 63 TEST_EQ(VerifyMemberInside(p, 20, p, 21, 0, 0), 1, 64 "MemberInside member too big"); 65 TEST_EQ(VerifyMemberInside(p, 20, p, 4, 21, 0), 1, 66 "MemberInside data after parent"); 67 TEST_EQ(VerifyMemberInside(p, 20, p, 4, (uint64_t)-1, 0), 1, 68 "MemberInside data before parent"); 69 TEST_EQ(VerifyMemberInside(p, 20, p, 4, 4, 17), 1, 70 "MemberInside data too big"); 71 } 72 73 { 74 VbPublicKey k = {sizeof(k), 128, 0, 0}; 75 TEST_EQ(VerifyPublicKeyInside(&k, sizeof(k)+128, &k), 0, 76 "PublicKeyInside ok 1"); 77 TEST_EQ(VerifyPublicKeyInside(&k - 1, 2*sizeof(k)+128, &k), 0, 78 "PublicKeyInside ok 2"); 79 TEST_EQ(VerifyPublicKeyInside(&k, 128, &k), 1, 80 "PublicKeyInside key too big"); 81 } 82 { 83 VbPublicKey k = {100, 4, 0, 0}; 84 TEST_EQ(VerifyPublicKeyInside(&k, 99, &k), 1, 85 "PublicKeyInside offset too big"); 86 } 87 { 88 VbSignature s = {sizeof(s), 128, 2000}; 89 TEST_EQ(VerifySignatureInside(&s, sizeof(s)+128, &s), 0, 90 "SignatureInside ok 1"); 91 TEST_EQ(VerifySignatureInside(&s - 1, 2*sizeof(s)+128, &s), 0, 92 "SignatureInside ok 2"); 93 TEST_EQ(VerifySignatureInside(&s, 128, &s), 1, 94 "SignatureInside sig too big"); 95 } 96 { 97 VbSignature s = {100, 4, 0}; 98 TEST_EQ(VerifySignatureInside(&s, 99, &s), 1, 99 "SignatureInside offset too big"); 100 } 101 102} 103 104/* disable MSVC warnings on unused arguments */ 105__pragma(warning (disable: 4100)) 106 107int main(int argc, char* argv[]) { 108 int error_code = 0; 109 110 StructPackingTest(); 111 VerifyHelperFunctions(); 112 113 if (!gTestSuccess) 114 error_code = 255; 115 116 return error_code; 117} 118