blob: 9180958d571f95ad76137f73bfdfa582332e7421 [file] [log] [blame]
Randall Spanglera712e012011-07-13 09:48:41 -07001/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
Randall Spanglerd1836442010-06-10 09:59:04 -07002 * 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
Randall Spangler81d09962010-06-23 10:15:38 -070014/* 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)");
Randall Spanglera712e012011-07-13 09:48:41 -070022 TEST_EQ(EXPECTED_VBFIRMWAREPREAMBLEHEADER2_0_SIZE,
23 sizeof(VbFirmwarePreambleHeader2_0),
Randall Spanglerf02bbb42011-08-24 14:16:01 -070024 "sizeof(VbFirmwarePreambleHeader2_0)");
Randall Spanglera712e012011-07-13 09:48:41 -070025 TEST_EQ(EXPECTED_VBFIRMWAREPREAMBLEHEADER2_1_SIZE,
26 sizeof(VbFirmwarePreambleHeader),
27 "sizeof(VbFirmwarePreambleHeader)");
Randall Spangler81d09962010-06-23 10:15:38 -070028 TEST_EQ(EXPECTED_VBKERNELPREAMBLEHEADER_SIZE,
29 sizeof(VbKernelPreambleHeader), "sizeof(VbKernelPreambleHeader)");
Randall Spanglerf02bbb42011-08-24 14:16:01 -070030
31 TEST_EQ(VB_SHARED_DATA_HEADER_SIZE_V1,
32 (long)&((VbSharedDataHeader*)NULL)->recovery_reason,
33 "sizeof(VbSharedDataHeader) V1");
34
35 TEST_EQ(VB_SHARED_DATA_HEADER_SIZE_V2,
36 sizeof(VbSharedDataHeader),
37 "sizeof(VbSharedDataHeader) V2");
38}
39
40
41/* Test array sized macro */
42static void ArraySizeTest(void) {
43 uint8_t arr1[12];
44 uint32_t arr2[7];
45 uint64_t arr3[9];
46
47 TEST_EQ(ARRAY_SIZE(arr1), 12, "ARRAYSIZE(uint8_t)");
48 TEST_EQ(ARRAY_SIZE(arr2), 7, "ARRAYSIZE(uint32_t)");
49 TEST_EQ(ARRAY_SIZE(arr3), 9, "ARRAYSIZE(uint64_t)");
Randall Spangler81d09962010-06-23 10:15:38 -070050}
51
Randall Spanglerd1836442010-06-10 09:59:04 -070052
53/* Helper functions not dependent on specific key sizes */
Randall Spangler81d09962010-06-23 10:15:38 -070054static void VerifyHelperFunctions(void) {
Randall Spanglerd1836442010-06-10 09:59:04 -070055
56 {
Bill Richardson4395b692011-05-09 15:30:33 -070057 uint8_t *p = (uint8_t *)VerifyHelperFunctions;
vbendeb3ecaf772010-06-24 16:19:53 -070058 TEST_EQ((int)OffsetOf(p, p), 0, "OffsetOf() equal");
59 TEST_EQ((int)OffsetOf(p, p+10), 10, "OffsetOf() positive");
60 TEST_EQ((int)OffsetOf(p, p+0x12345678), 0x12345678, "OffsetOf() large");
Randall Spanglerd1836442010-06-10 09:59:04 -070061 }
62
63 {
64 VbPublicKey k = {sizeof(k), 2, 3, 4};
vbendeb3ecaf772010-06-24 16:19:53 -070065 TEST_EQ((int)OffsetOf(&k, GetPublicKeyData(&k)), sizeof(k),
Randall Spanglerd1836442010-06-10 09:59:04 -070066 "GetPublicKeyData() adjacent");
vbendeb3ecaf772010-06-24 16:19:53 -070067 TEST_EQ((int)OffsetOf(&k, GetPublicKeyDataC(&k)), sizeof(k),
Randall Spanglerd1836442010-06-10 09:59:04 -070068 "GetPublicKeyDataC() adjacent");
69 }
70
71 {
72 VbPublicKey k = {123, 2, 3, 4};
vbendeb3ecaf772010-06-24 16:19:53 -070073 TEST_EQ((int)OffsetOf(&k, GetPublicKeyData(&k)), 123,
Randall Spanglerd1836442010-06-10 09:59:04 -070074 "GetPublicKeyData() spaced");
vbendeb3ecaf772010-06-24 16:19:53 -070075 TEST_EQ((int)OffsetOf(&k, GetPublicKeyDataC(&k)), 123,
Randall Spanglerd1836442010-06-10 09:59:04 -070076 "GetPublicKeyDataC() spaced");
77 }
78
79 {
Bill Richardson4395b692011-05-09 15:30:33 -070080 uint8_t *p = (uint8_t *)VerifyHelperFunctions;
Randall Spanglerd1836442010-06-10 09:59:04 -070081 TEST_EQ(VerifyMemberInside(p, 20, p, 6, 11, 3), 0, "MemberInside ok 1");
82 TEST_EQ(VerifyMemberInside(p, 20, p+4, 4, 8, 4), 0, "MemberInside ok 2");
83 TEST_EQ(VerifyMemberInside(p, 20, p-4, 4, 8, 4), 1,
84 "MemberInside member before parent");
85 TEST_EQ(VerifyMemberInside(p, 20, p+20, 4, 8, 4), 1,
86 "MemberInside member after parent");
87 TEST_EQ(VerifyMemberInside(p, 20, p, 21, 0, 0), 1,
88 "MemberInside member too big");
89 TEST_EQ(VerifyMemberInside(p, 20, p, 4, 21, 0), 1,
90 "MemberInside data after parent");
vbendeb3ecaf772010-06-24 16:19:53 -070091 TEST_EQ(VerifyMemberInside(p, 20, p, 4, (uint64_t)-1, 0), 1,
Randall Spanglerd1836442010-06-10 09:59:04 -070092 "MemberInside data before parent");
93 TEST_EQ(VerifyMemberInside(p, 20, p, 4, 4, 17), 1,
94 "MemberInside data too big");
95 }
96
97 {
98 VbPublicKey k = {sizeof(k), 128, 0, 0};
99 TEST_EQ(VerifyPublicKeyInside(&k, sizeof(k)+128, &k), 0,
100 "PublicKeyInside ok 1");
101 TEST_EQ(VerifyPublicKeyInside(&k - 1, 2*sizeof(k)+128, &k), 0,
102 "PublicKeyInside ok 2");
103 TEST_EQ(VerifyPublicKeyInside(&k, 128, &k), 1,
104 "PublicKeyInside key too big");
105 }
106 {
107 VbPublicKey k = {100, 4, 0, 0};
108 TEST_EQ(VerifyPublicKeyInside(&k, 99, &k), 1,
109 "PublicKeyInside offset too big");
110 }
111 {
112 VbSignature s = {sizeof(s), 128, 2000};
113 TEST_EQ(VerifySignatureInside(&s, sizeof(s)+128, &s), 0,
114 "SignatureInside ok 1");
115 TEST_EQ(VerifySignatureInside(&s - 1, 2*sizeof(s)+128, &s), 0,
116 "SignatureInside ok 2");
117 TEST_EQ(VerifySignatureInside(&s, 128, &s), 1,
118 "SignatureInside sig too big");
119 }
120 {
121 VbSignature s = {100, 4, 0};
122 TEST_EQ(VerifySignatureInside(&s, 99, &s), 1,
123 "SignatureInside offset too big");
124 }
125
126}
127
vbendeb3ecaf772010-06-24 16:19:53 -0700128/* disable MSVC warnings on unused arguments */
129__pragma(warning (disable: 4100))
Randall Spanglerd1836442010-06-10 09:59:04 -0700130
131int main(int argc, char* argv[]) {
132 int error_code = 0;
133
Randall Spangler81d09962010-06-23 10:15:38 -0700134 StructPackingTest();
Randall Spanglerf02bbb42011-08-24 14:16:01 -0700135 ArraySizeTest();
Randall Spanglerd1836442010-06-10 09:59:04 -0700136 VerifyHelperFunctions();
137
138 if (!gTestSuccess)
139 error_code = 255;
140
141 return error_code;
142}