blob: aecf90cf50e5f073a98f6705bf8ba3cda8191adf [file] [log] [blame]
Randall Spanglerd1836442010-06-10 09:59:04 -07001/* 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
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)");
22 TEST_EQ(EXPECTED_VBFIRMWAREPREAMBLEHEADER_SIZE,
23 sizeof(VbFirmwarePreambleHeader), "sizeof(VbFirmwarePreambleHeader)");
24 TEST_EQ(EXPECTED_VBKERNELPREAMBLEHEADER_SIZE,
25 sizeof(VbKernelPreambleHeader), "sizeof(VbKernelPreambleHeader)");
26}
27
Randall Spanglerd1836442010-06-10 09:59:04 -070028
29/* Helper functions not dependent on specific key sizes */
Randall Spangler81d09962010-06-23 10:15:38 -070030static void VerifyHelperFunctions(void) {
Randall Spanglerd1836442010-06-10 09:59:04 -070031
32 {
Bill Richardson4395b692011-05-09 15:30:33 -070033 uint8_t *p = (uint8_t *)VerifyHelperFunctions;
vbendeb3ecaf772010-06-24 16:19:53 -070034 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");
Randall Spanglerd1836442010-06-10 09:59:04 -070037 }
38
39 {
40 VbPublicKey k = {sizeof(k), 2, 3, 4};
vbendeb3ecaf772010-06-24 16:19:53 -070041 TEST_EQ((int)OffsetOf(&k, GetPublicKeyData(&k)), sizeof(k),
Randall Spanglerd1836442010-06-10 09:59:04 -070042 "GetPublicKeyData() adjacent");
vbendeb3ecaf772010-06-24 16:19:53 -070043 TEST_EQ((int)OffsetOf(&k, GetPublicKeyDataC(&k)), sizeof(k),
Randall Spanglerd1836442010-06-10 09:59:04 -070044 "GetPublicKeyDataC() adjacent");
45 }
46
47 {
48 VbPublicKey k = {123, 2, 3, 4};
vbendeb3ecaf772010-06-24 16:19:53 -070049 TEST_EQ((int)OffsetOf(&k, GetPublicKeyData(&k)), 123,
Randall Spanglerd1836442010-06-10 09:59:04 -070050 "GetPublicKeyData() spaced");
vbendeb3ecaf772010-06-24 16:19:53 -070051 TEST_EQ((int)OffsetOf(&k, GetPublicKeyDataC(&k)), 123,
Randall Spanglerd1836442010-06-10 09:59:04 -070052 "GetPublicKeyDataC() spaced");
53 }
54
55 {
Bill Richardson4395b692011-05-09 15:30:33 -070056 uint8_t *p = (uint8_t *)VerifyHelperFunctions;
Randall Spanglerd1836442010-06-10 09:59:04 -070057 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");
vbendeb3ecaf772010-06-24 16:19:53 -070067 TEST_EQ(VerifyMemberInside(p, 20, p, 4, (uint64_t)-1, 0), 1,
Randall Spanglerd1836442010-06-10 09:59:04 -070068 "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
vbendeb3ecaf772010-06-24 16:19:53 -0700104/* disable MSVC warnings on unused arguments */
105__pragma(warning (disable: 4100))
Randall Spanglerd1836442010-06-10 09:59:04 -0700106
107int main(int argc, char* argv[]) {
108 int error_code = 0;
109
Randall Spangler81d09962010-06-23 10:15:38 -0700110 StructPackingTest();
Randall Spanglerd1836442010-06-10 09:59:04 -0700111 VerifyHelperFunctions();
112
113 if (!gTestSuccess)
114 error_code = 255;
115
116 return error_code;
117}