1 /* Copyright (c) 2011 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 tpm_bootmode functions
6 */
7
8 #include <stdint.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12
13 #define _STUB_IMPLEMENTATION_ /* So we can use memset() ourselves */
14
15 #include "test_common.h"
16 #include "utility.h"
17 #include "tpm_bootmode.h"
18
19 extern const char* kBootStateSHA1Digests[];
20
21 /* Last in_digest passed to TlclExtend() for each PCR */
22 static const uint8_t *last_in[20];
23
24 /* Return value to pass for TlclExtend() */
25 static uint32_t extend_returns;
26
27 /* How many calls to TlclExtend() should one SetTPMBootModeState() make? */
28 static int expected_extend_count;
29 /* How many did we get? */
30 static int actual_extend_count;
31
32 static GoogleBinaryBlockHeader gbb_v1 = {
33 .major_version = GBB_MAJOR_VER,
34 .minor_version = 1,
35 };
36
37 static GoogleBinaryBlockHeader gbb_v2 = {
38 .major_version = GBB_MAJOR_VER,
39 .minor_version = 2,
40 .hwid_digest = {1, 2, 3, 4,},
41 };
42
43 /* Mocked TlclExtend() function for testing */
TlclExtend(int pcr_num,const uint8_t * in_digest,uint8_t * out_digest)44 uint32_t TlclExtend(int pcr_num, const uint8_t *in_digest,
45 uint8_t *out_digest)
46 {
47 /* Should be using correct pcr */
48 TEST_EQ(pcr_num, actual_extend_count, "TlclExtend pcr_num");
49
50 last_in[actual_extend_count] = in_digest;
51
52 actual_extend_count++;
53 return extend_returns;
54 }
55
56
57 /* Test setting TPM boot mode state */
BootStateTest(void)58 static void BootStateTest(void)
59 {
60 int recdev;
61 int flags;
62 int index;
63 char what[128];
64
65 /* Test all permutations of developer and recovery mode */
66 for (recdev = 0; recdev < 4; recdev++) {
67 /* Exhaustively test all permutations of key block flags
68 * currently defined in vboot_struct.h (KEY_BLOCK_FLAG_*) */
69 for (flags = 0; flags < 16; flags++) {
70 index = recdev * 3;
71 if (6 == flags)
72 index += 2;
73 else if (7 == flags)
74 index += 1;
75
76 /* Passing a null pointer for GBB */
77 memset(last_in, 0, sizeof(last_in));
78 actual_extend_count = 0;
79 expected_extend_count = 1;
80 TEST_EQ(SetTPMBootModeState(recdev & 2, recdev & 1,
81 flags, 0), 0,
82 "SetTPMBootModeState return (gbb0)");
83 snprintf(what, sizeof(what),
84 "SetTPMBootModeState %d, 0x%x (gbb0)",
85 recdev, flags);
86 TEST_PTR_EQ(last_in[0],
87 kBootStateSHA1Digests[index], what);
88 TEST_EQ(expected_extend_count, actual_extend_count,
89 "Expected TlclExtend call count (gbb0)");
90 snprintf(what, sizeof(what),
91 "SetTPMBootModeState %d, 0x%x (gbb0) PCR1",
92 recdev, flags);
93 TEST_PTR_EQ(last_in[1], NULL, what);
94
95 /* GBB v1.1 - should be exactly the same */
96 memset(last_in, 0, sizeof(last_in));
97 actual_extend_count = 0;
98 expected_extend_count = 1;
99 TEST_EQ(SetTPMBootModeState(recdev & 2, recdev & 1,
100 flags, &gbb_v1), 0,
101 "SetTPMBootModeState return (gbb1)");
102 snprintf(what, sizeof(what),
103 "SetTPMBootModeState %d, 0x%x (gbb1)",
104 recdev, flags);
105 TEST_PTR_EQ(last_in[0],
106 kBootStateSHA1Digests[index], what);
107 TEST_EQ(expected_extend_count, actual_extend_count,
108 "Expected TlclExtend call count (gbb1)");
109 snprintf(what, sizeof(what),
110 "SetTPMBootModeState %d, 0x%x (gbb1) PCR1",
111 recdev, flags);
112 TEST_PTR_EQ(last_in[1], NULL, what);
113
114 /* GBB v1.2 - should extend PCR1 with HWID digest */
115 memset(last_in, 0, sizeof(last_in));
116 actual_extend_count = 0;
117 expected_extend_count = 2;
118 TEST_EQ(SetTPMBootModeState(recdev & 2, recdev & 1,
119 flags, &gbb_v2), 0,
120 "SetTPMBootModeState return (gbb2)");
121 snprintf(what, sizeof(what),
122 "SetTPMBootModeState %d, 0x%x (gbb2)",
123 recdev, flags);
124 TEST_PTR_EQ(last_in[0],
125 kBootStateSHA1Digests[index], what);
126 TEST_EQ(expected_extend_count, actual_extend_count,
127 "Expected TlclExtend call count (gbb2)");
128 snprintf(what, sizeof(what),
129 "SetTPMBootModeState %d, 0x%x (gbb2) PCR1",
130 recdev, flags);
131 TEST_PTR_EQ(last_in[1], gbb_v2.hwid_digest, what);
132 }
133 }
134
135 extend_returns = 1;
136 actual_extend_count = 0;
137 expected_extend_count = 1;
138 TEST_EQ(SetTPMBootModeState(0, 0, 0, 0), 1,
139 "SetTPMBootModeState error");
140 }
141
main(int argc,char * argv[])142 int main(int argc, char *argv[])
143 {
144 int error_code = 0;
145
146 BootStateTest();
147
148 if (!gTestSuccess)
149 error_code = 255;
150
151 return error_code;
152 }
153