blob: adb57084b70d42fc0d17ee955c69803bc6647338 [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),
24 "sizeof(VbFirmwarePreambleHeader)");
25 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)");
30}
31
Randall Spanglerd1836442010-06-10 09:59:04 -070032
33/* Helper functions not dependent on specific key sizes */
Randall Spangler81d09962010-06-23 10:15:38 -070034static void VerifyHelperFunctions(void) {
Randall Spanglerd1836442010-06-10 09:59:04 -070035
36 {
Bill Richardson4395b692011-05-09 15:30:33 -070037 uint8_t *p = (uint8_t *)VerifyHelperFunctions;
vbendeb3ecaf772010-06-24 16:19:53 -070038 TEST_EQ((int)OffsetOf(p, p), 0, "OffsetOf() equal");
39 TEST_EQ((int)OffsetOf(p, p+10), 10, "OffsetOf() positive");
40 TEST_EQ((int)OffsetOf(p, p+0x12345678), 0x12345678, "OffsetOf() large");
Randall Spanglerd1836442010-06-10 09:59:04 -070041 }
42
43 {
44 VbPublicKey k = {sizeof(k), 2, 3, 4};
vbendeb3ecaf772010-06-24 16:19:53 -070045 TEST_EQ((int)OffsetOf(&k, GetPublicKeyData(&k)), sizeof(k),
Randall Spanglerd1836442010-06-10 09:59:04 -070046 "GetPublicKeyData() adjacent");
vbendeb3ecaf772010-06-24 16:19:53 -070047 TEST_EQ((int)OffsetOf(&k, GetPublicKeyDataC(&k)), sizeof(k),
Randall Spanglerd1836442010-06-10 09:59:04 -070048 "GetPublicKeyDataC() adjacent");
49 }
50
51 {
52 VbPublicKey k = {123, 2, 3, 4};
vbendeb3ecaf772010-06-24 16:19:53 -070053 TEST_EQ((int)OffsetOf(&k, GetPublicKeyData(&k)), 123,
Randall Spanglerd1836442010-06-10 09:59:04 -070054 "GetPublicKeyData() spaced");
vbendeb3ecaf772010-06-24 16:19:53 -070055 TEST_EQ((int)OffsetOf(&k, GetPublicKeyDataC(&k)), 123,
Randall Spanglerd1836442010-06-10 09:59:04 -070056 "GetPublicKeyDataC() spaced");
57 }
58
59 {
Bill Richardson4395b692011-05-09 15:30:33 -070060 uint8_t *p = (uint8_t *)VerifyHelperFunctions;
Randall Spanglerd1836442010-06-10 09:59:04 -070061 TEST_EQ(VerifyMemberInside(p, 20, p, 6, 11, 3), 0, "MemberInside ok 1");
62 TEST_EQ(VerifyMemberInside(p, 20, p+4, 4, 8, 4), 0, "MemberInside ok 2");
63 TEST_EQ(VerifyMemberInside(p, 20, p-4, 4, 8, 4), 1,
64 "MemberInside member before parent");
65 TEST_EQ(VerifyMemberInside(p, 20, p+20, 4, 8, 4), 1,
66 "MemberInside member after parent");
67 TEST_EQ(VerifyMemberInside(p, 20, p, 21, 0, 0), 1,
68 "MemberInside member too big");
69 TEST_EQ(VerifyMemberInside(p, 20, p, 4, 21, 0), 1,
70 "MemberInside data after parent");
vbendeb3ecaf772010-06-24 16:19:53 -070071 TEST_EQ(VerifyMemberInside(p, 20, p, 4, (uint64_t)-1, 0), 1,
Randall Spanglerd1836442010-06-10 09:59:04 -070072 "MemberInside data before parent");
73 TEST_EQ(VerifyMemberInside(p, 20, p, 4, 4, 17), 1,
74 "MemberInside data too big");
75 }
76
77 {
78 VbPublicKey k = {sizeof(k), 128, 0, 0};
79 TEST_EQ(VerifyPublicKeyInside(&k, sizeof(k)+128, &k), 0,
80 "PublicKeyInside ok 1");
81 TEST_EQ(VerifyPublicKeyInside(&k - 1, 2*sizeof(k)+128, &k), 0,
82 "PublicKeyInside ok 2");
83 TEST_EQ(VerifyPublicKeyInside(&k, 128, &k), 1,
84 "PublicKeyInside key too big");
85 }
86 {
87 VbPublicKey k = {100, 4, 0, 0};
88 TEST_EQ(VerifyPublicKeyInside(&k, 99, &k), 1,
89 "PublicKeyInside offset too big");
90 }
91 {
92 VbSignature s = {sizeof(s), 128, 2000};
93 TEST_EQ(VerifySignatureInside(&s, sizeof(s)+128, &s), 0,
94 "SignatureInside ok 1");
95 TEST_EQ(VerifySignatureInside(&s - 1, 2*sizeof(s)+128, &s), 0,
96 "SignatureInside ok 2");
97 TEST_EQ(VerifySignatureInside(&s, 128, &s), 1,
98 "SignatureInside sig too big");
99 }
100 {
101 VbSignature s = {100, 4, 0};
102 TEST_EQ(VerifySignatureInside(&s, 99, &s), 1,
103 "SignatureInside offset too big");
104 }
105
106}
107
vbendeb3ecaf772010-06-24 16:19:53 -0700108/* disable MSVC warnings on unused arguments */
109__pragma(warning (disable: 4100))
Randall Spanglerd1836442010-06-10 09:59:04 -0700110
111int main(int argc, char* argv[]) {
112 int error_code = 0;
113
Randall Spangler81d09962010-06-23 10:15:38 -0700114 StructPackingTest();
Randall Spanglerd1836442010-06-10 09:59:04 -0700115 VerifyHelperFunctions();
116
117 if (!gTestSuccess)
118 error_code = 255;
119
120 return error_code;
121}