1108d991c678f80c99967bd07035de7418c81a072Randall Spangler/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
2108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Use of this source code is governed by a BSD-style license that can be
3108d991c678f80c99967bd07035de7418c81a072Randall Spangler * found in the LICENSE file.
4108d991c678f80c99967bd07035de7418c81a072Randall Spangler *
5108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Tests for firmware 2common.c
6108d991c678f80c99967bd07035de7418c81a072Randall Spangler */
7108d991c678f80c99967bd07035de7418c81a072Randall Spangler
8108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "2sysincludes.h"
9108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "2common.h"
10108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "2rsa.h"
11108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "vb2_common.h"
12108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "host_fw_preamble2.h"
13108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "host_key2.h"
14108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "host_keyblock2.h"
15108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "host_signature2.h"
16108d991c678f80c99967bd07035de7418c81a072Randall Spangler
17108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "test_common.h"
18108d991c678f80c99967bd07035de7418c81a072Randall Spangler
19108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic const uint8_t test_data[] = "This is some test data to sign.";
20108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic const uint8_t test_data2[] = "Some more test data";
21108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic const uint8_t test_data3[] = "Even more test data";
22108d991c678f80c99967bd07035de7418c81a072Randall Spangler
23108d991c678f80c99967bd07035de7418c81a072Randall Spangler/*
24108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Test struct packing for vboot_struct.h structs which are passed between
25108d991c678f80c99967bd07035de7418c81a072Randall Spangler * firmware and OS, or passed between different phases of firmware.
26108d991c678f80c99967bd07035de7418c81a072Randall Spangler */
27108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic void test_struct_packing(void)
28108d991c678f80c99967bd07035de7418c81a072Randall Spangler{
29108d991c678f80c99967bd07035de7418c81a072Randall Spangler	/* Test new struct sizes */
30108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(EXPECTED_GUID_SIZE,
31108d991c678f80c99967bd07035de7418c81a072Randall Spangler		sizeof(struct vb2_guid),
32108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"sizeof(vb2_guid)");
33108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(EXPECTED_VB2_STRUCT_COMMON_SIZE,
34108d991c678f80c99967bd07035de7418c81a072Randall Spangler		sizeof(struct vb2_struct_common),
35108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"sizeof(vb2_struct_common)");
36308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(EXPECTED_VB2_PACKED_KEY_SIZE,
37308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		sizeof(struct vb2_packed_key),
38308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"sizeof(vb2_packed_key)");
39308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(EXPECTED_VB2_SIGNATURE_SIZE,
40308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		sizeof(struct vb2_signature),
41308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"sizeof(vb2_signature)");
42308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(EXPECTED_VB2_KEYBLOCK_SIZE,
43308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		sizeof(struct vb2_keyblock),
44308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"sizeof(vb2_keyblock)");
45308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(EXPECTED_VB2_FW_PREAMBLE_SIZE,
46308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		sizeof(struct vb2_fw_preamble),
47308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"sizeof(vb2_fw_preamble)");
48108d991c678f80c99967bd07035de7418c81a072Randall Spangler}
49108d991c678f80c99967bd07035de7418c81a072Randall Spangler
50108d991c678f80c99967bd07035de7418c81a072Randall Spangler/**
51108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Common header functions
52108d991c678f80c99967bd07035de7418c81a072Randall Spangler */
53108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic void test_common_header_functions(void)
54108d991c678f80c99967bd07035de7418c81a072Randall Spangler{
55108d991c678f80c99967bd07035de7418c81a072Randall Spangler	uint8_t cbuf[sizeof(struct vb2_struct_common) + 128];
56108d991c678f80c99967bd07035de7418c81a072Randall Spangler	uint8_t cbufgood[sizeof(cbuf)];
57108d991c678f80c99967bd07035de7418c81a072Randall Spangler	struct vb2_struct_common *c = (struct vb2_struct_common *)cbuf;
58108d991c678f80c99967bd07035de7418c81a072Randall Spangler	struct vb2_struct_common *c2;
59108d991c678f80c99967bd07035de7418c81a072Randall Spangler	const char test_desc[32] = "test desc";
60108d991c678f80c99967bd07035de7418c81a072Randall Spangler	uint32_t desc_end, m;
61108d991c678f80c99967bd07035de7418c81a072Randall Spangler
62108d991c678f80c99967bd07035de7418c81a072Randall Spangler	c->total_size = sizeof(cbuf);
63108d991c678f80c99967bd07035de7418c81a072Randall Spangler	c->fixed_size = sizeof(*c);
64108d991c678f80c99967bd07035de7418c81a072Randall Spangler	c->desc_size = sizeof(test_desc);
65108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(cbuf + c->fixed_size, test_desc, sizeof(test_desc));
66108d991c678f80c99967bd07035de7418c81a072Randall Spangler	desc_end = c->fixed_size + c->desc_size;
67108d991c678f80c99967bd07035de7418c81a072Randall Spangler
68108d991c678f80c99967bd07035de7418c81a072Randall Spangler	c2 = (struct vb2_struct_common *)(cbuf + desc_end);
69108d991c678f80c99967bd07035de7418c81a072Randall Spangler	c2->total_size = c->total_size - desc_end;
70108d991c678f80c99967bd07035de7418c81a072Randall Spangler	c2->fixed_size = sizeof(*c2);
71108d991c678f80c99967bd07035de7418c81a072Randall Spangler	c2->desc_size = 0;
72108d991c678f80c99967bd07035de7418c81a072Randall Spangler
73108d991c678f80c99967bd07035de7418c81a072Randall Spangler	/* Description helper */
74108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(0, strcmp(vb2_common_desc(c), test_desc), "vb2_common_desc()");
75108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(0, strcmp(vb2_common_desc(c2), ""), "vb2_common_desc() empty");
76108d991c678f80c99967bd07035de7418c81a072Randall Spangler
77108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_verify_common_header(cbuf, sizeof(cbuf)),
78108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "vb2_verify_common_header() good");
79108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(cbufgood, cbuf, sizeof(cbufgood));
80108d991c678f80c99967bd07035de7418c81a072Randall Spangler
81108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(cbuf, cbufgood, sizeof(cbuf));
82108d991c678f80c99967bd07035de7418c81a072Randall Spangler	c->total_size += 4;
83108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
84108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_TOTAL_SIZE,
85108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_header() total size");
86108d991c678f80c99967bd07035de7418c81a072Randall Spangler
87108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(cbuf, cbufgood, sizeof(cbuf));
88108d991c678f80c99967bd07035de7418c81a072Randall Spangler	c->fixed_size = c->total_size + 4;
89108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
90108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_FIXED_SIZE,
91108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_header() fixed size");
92108d991c678f80c99967bd07035de7418c81a072Randall Spangler
93108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(cbuf, cbufgood, sizeof(cbuf));
94108d991c678f80c99967bd07035de7418c81a072Randall Spangler	c->desc_size = c->total_size - c->fixed_size + 4;
95108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
96108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_DESC_SIZE,
97108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_header() desc size");
98108d991c678f80c99967bd07035de7418c81a072Randall Spangler
99108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(cbuf, cbufgood, sizeof(cbuf));
100108d991c678f80c99967bd07035de7418c81a072Randall Spangler	c->total_size--;
101108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
102108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_TOTAL_UNALIGNED,
103108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_header() total unaligned");
104108d991c678f80c99967bd07035de7418c81a072Randall Spangler
105108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(cbuf, cbufgood, sizeof(cbuf));
106108d991c678f80c99967bd07035de7418c81a072Randall Spangler	c->fixed_size++;
107108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
108108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_FIXED_UNALIGNED,
109108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_header() fixed unaligned");
110108d991c678f80c99967bd07035de7418c81a072Randall Spangler
111108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(cbuf, cbufgood, sizeof(cbuf));
112108d991c678f80c99967bd07035de7418c81a072Randall Spangler	c->desc_size--;
113108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
114108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_DESC_UNALIGNED,
115108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_header() desc unaligned");
116108d991c678f80c99967bd07035de7418c81a072Randall Spangler
117108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(cbuf, cbufgood, sizeof(cbuf));
118108d991c678f80c99967bd07035de7418c81a072Randall Spangler	c->desc_size = -4;
119108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
120108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_DESC_WRAPS,
121108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_header() desc wraps");
122108d991c678f80c99967bd07035de7418c81a072Randall Spangler
123108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(cbuf, cbufgood, sizeof(cbuf));
124108d991c678f80c99967bd07035de7418c81a072Randall Spangler	cbuf[desc_end - 1] = 1;
125108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
126108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_DESC_TERMINATOR,
127108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_header() desc not terminated");
128108d991c678f80c99967bd07035de7418c81a072Randall Spangler
129108d991c678f80c99967bd07035de7418c81a072Randall Spangler	/* Member checking function */
130108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(cbuf, cbufgood, sizeof(cbuf));
131108d991c678f80c99967bd07035de7418c81a072Randall Spangler	m = 0;
132108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_verify_common_member(cbuf, &m, c->total_size - 8, 4),
133108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "vb2_verify_common_member()");
134108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(m, c->total_size - 4, "  new minimum");
135108d991c678f80c99967bd07035de7418c81a072Randall Spangler
136108d991c678f80c99967bd07035de7418c81a072Randall Spangler	m = desc_end;
137108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_verify_common_member(cbuf, &m, desc_end, 4),
138108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "vb2_verify_common_member() good offset");
139108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(m, desc_end + 4, "  new minimum");
140108d991c678f80c99967bd07035de7418c81a072Randall Spangler
141108d991c678f80c99967bd07035de7418c81a072Randall Spangler	m = 0;
142108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 8, -4),
143108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_MEMBER_WRAPS,
144108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_member() wraps");
145108d991c678f80c99967bd07035de7418c81a072Randall Spangler
146108d991c678f80c99967bd07035de7418c81a072Randall Spangler	m = 0;
147108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 7, 4),
148108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_MEMBER_UNALIGNED,
149108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_member() offset unaligned");
150108d991c678f80c99967bd07035de7418c81a072Randall Spangler
151108d991c678f80c99967bd07035de7418c81a072Randall Spangler	m = 0;
152108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 8, 5),
153108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_MEMBER_UNALIGNED,
154108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_member() size unaligned");
155108d991c678f80c99967bd07035de7418c81a072Randall Spangler
156108d991c678f80c99967bd07035de7418c81a072Randall Spangler	m = 0;
157108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_member(cbuf, &m, desc_end - 4, 4),
158108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_MEMBER_OVERLAP,
159108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_member() overlap");
160108d991c678f80c99967bd07035de7418c81a072Randall Spangler
161108d991c678f80c99967bd07035de7418c81a072Randall Spangler	m = desc_end + 4;
162108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_member(cbuf, &m, desc_end, 4),
163108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_MEMBER_OVERLAP,
164108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_member() overlap 2");
165108d991c678f80c99967bd07035de7418c81a072Randall Spangler
166108d991c678f80c99967bd07035de7418c81a072Randall Spangler	m = 0;
167108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 4, 8),
168108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_MEMBER_SIZE,
169108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_member() size");
170108d991c678f80c99967bd07035de7418c81a072Randall Spangler
171108d991c678f80c99967bd07035de7418c81a072Randall Spangler	/* Subobject checking */
172108d991c678f80c99967bd07035de7418c81a072Randall Spangler	m = 0;
173108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_verify_common_subobject(cbuf, &m, desc_end),
174108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "vb2_verify_common_subobject() good offset");
175108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(m, sizeof(cbuf), "  new minimum");
176108d991c678f80c99967bd07035de7418c81a072Randall Spangler
177108d991c678f80c99967bd07035de7418c81a072Randall Spangler	m = desc_end + 4;
178108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_subobject(cbuf, &m, desc_end),
179108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_MEMBER_OVERLAP,
180108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_subobject() overlap");
181108d991c678f80c99967bd07035de7418c81a072Randall Spangler
182108d991c678f80c99967bd07035de7418c81a072Randall Spangler	m = 0;
183108d991c678f80c99967bd07035de7418c81a072Randall Spangler	c2->total_size += 4;
184108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_verify_common_subobject(cbuf, &m, desc_end),
185108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_TOTAL_SIZE,
186108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_verify_common_subobject() size");
187108d991c678f80c99967bd07035de7418c81a072Randall Spangler}
188108d991c678f80c99967bd07035de7418c81a072Randall Spangler
189108d991c678f80c99967bd07035de7418c81a072Randall Spangler/**
190108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Signature size
191108d991c678f80c99967bd07035de7418c81a072Randall Spangler */
192108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic void test_sig_size(void)
193108d991c678f80c99967bd07035de7418c81a072Randall Spangler{
194108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_sig_size(VB2_SIG_INVALID, VB2_HASH_SHA256), 0,
195108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_sig_size() sig invalid");
196108d991c678f80c99967bd07035de7418c81a072Randall Spangler
197108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_sig_size(VB2_SIG_RSA2048, VB2_HASH_INVALID), 0,
198108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_sig_size() hash invalid");
199108d991c678f80c99967bd07035de7418c81a072Randall Spangler
200108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_sig_size(VB2_SIG_RSA2048, VB2_HASH_SHA256), 2048 / 8,
201108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_sig_size() RSA2048");
202108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_sig_size(VB2_SIG_RSA4096, VB2_HASH_SHA256), 4096 / 8,
203108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_sig_size() RSA4096");
204108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_sig_size(VB2_SIG_RSA8192, VB2_HASH_SHA512), 8192 / 8,
205108d991c678f80c99967bd07035de7418c81a072Randall Spangler		"vb2_sig_size() RSA8192");
206108d991c678f80c99967bd07035de7418c81a072Randall Spangler
207108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_sig_size(VB2_SIG_NONE, VB2_HASH_SHA1),
208108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_SHA1_DIGEST_SIZE, "vb2_sig_size() SHA1");
209108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_sig_size(VB2_SIG_NONE, VB2_HASH_SHA256),
210108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_SHA256_DIGEST_SIZE, "vb2_sig_size() SHA256");
211108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_EQ(vb2_sig_size(VB2_SIG_NONE, VB2_HASH_SHA512),
212108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_SHA512_DIGEST_SIZE, "vb2_sig_size() SHA512");
213108d991c678f80c99967bd07035de7418c81a072Randall Spangler}
214108d991c678f80c99967bd07035de7418c81a072Randall Spangler
215108d991c678f80c99967bd07035de7418c81a072Randall Spangler/**
216108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Verify data on bare hash
217108d991c678f80c99967bd07035de7418c81a072Randall Spangler */
218108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic void test_verify_hash(void)
219108d991c678f80c99967bd07035de7418c81a072Randall Spangler{
220308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	struct vb2_signature *sig;
221108d991c678f80c99967bd07035de7418c81a072Randall Spangler	const struct vb2_private_key *prik;
222108d991c678f80c99967bd07035de7418c81a072Randall Spangler	struct vb2_public_key pubk;
22373e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson	uint8_t workbuf[VB2_VERIFY_DATA_WORKBUF_BYTES]
22473e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson		 __attribute__ ((aligned (VB2_WORKBUF_ALIGN)));
225108d991c678f80c99967bd07035de7418c81a072Randall Spangler	struct vb2_workbuf wb;
226108d991c678f80c99967bd07035de7418c81a072Randall Spangler
227108d991c678f80c99967bd07035de7418c81a072Randall Spangler	vb2_workbuf_init(&wb, workbuf, sizeof(workbuf));
228108d991c678f80c99967bd07035de7418c81a072Randall Spangler
229108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_private_key_hash(&prik, VB2_HASH_SHA256),
230108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "create private hash key");
231108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_public_key_hash(&pubk, VB2_HASH_SHA256),
232108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "create hash key");
233108d991c678f80c99967bd07035de7418c81a072Randall Spangler
234108d991c678f80c99967bd07035de7418c81a072Randall Spangler	/* Create the signature */
235308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_SUCC(vb2_sign_data(&sig, test_data, sizeof(test_data), prik, NULL),
236108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "create hash sig");
237108d991c678f80c99967bd07035de7418c81a072Randall Spangler
238308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_SUCC(vb2_verify_data(test_data, sizeof(test_data),
239308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler				  sig, &pubk, &wb),
240308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		  "vb2_verify_data() hash ok");
241108d991c678f80c99967bd07035de7418c81a072Randall Spangler
242108d991c678f80c99967bd07035de7418c81a072Randall Spangler	*((uint8_t *)sig + sig->sig_offset) ^= 0xab;
243308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_data(test_data, sizeof(test_data), sig, &pubk, &wb),
244308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		VB2_ERROR_VDATA_VERIFY_DIGEST, "vb2_verify_data() hash bad");
245108d991c678f80c99967bd07035de7418c81a072Randall Spangler
246108d991c678f80c99967bd07035de7418c81a072Randall Spangler	free(sig);
247108d991c678f80c99967bd07035de7418c81a072Randall Spangler}
248108d991c678f80c99967bd07035de7418c81a072Randall Spangler
249108d991c678f80c99967bd07035de7418c81a072Randall Spangler/**
250108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Verify keyblock
251108d991c678f80c99967bd07035de7418c81a072Randall Spangler */
252108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic void test_verify_keyblock(void)
253108d991c678f80c99967bd07035de7418c81a072Randall Spangler{
254108d991c678f80c99967bd07035de7418c81a072Randall Spangler	const char desc[16] = "test keyblock";
255108d991c678f80c99967bd07035de7418c81a072Randall Spangler	const struct vb2_private_key *prik[2];
256108d991c678f80c99967bd07035de7418c81a072Randall Spangler	struct vb2_public_key pubk, pubk2, pubk3;
257308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	struct vb2_signature *sig;
258308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	struct vb2_keyblock *kbuf;
259108d991c678f80c99967bd07035de7418c81a072Randall Spangler	uint32_t buf_size;
260108d991c678f80c99967bd07035de7418c81a072Randall Spangler	uint8_t *buf, *buf2;
261108d991c678f80c99967bd07035de7418c81a072Randall Spangler
26273e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson	uint8_t workbuf[VB2_KEY_BLOCK_VERIFY_WORKBUF_BYTES]
26373e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson		 __attribute__ ((aligned (VB2_WORKBUF_ALIGN)));
264108d991c678f80c99967bd07035de7418c81a072Randall Spangler	struct vb2_workbuf wb;
265108d991c678f80c99967bd07035de7418c81a072Randall Spangler
266108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_public_key_hash(&pubk, VB2_HASH_SHA256),
267108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "create hash key 1");
268108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_public_key_hash(&pubk2, VB2_HASH_SHA512),
269108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "create hash key 2");
270108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_public_key_hash(&pubk3, VB2_HASH_SHA1),
271108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "create hash key 3");
272108d991c678f80c99967bd07035de7418c81a072Randall Spangler
273108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_private_key_hash(prik + 0, VB2_HASH_SHA256),
274108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "create private key 1");
275108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_private_key_hash(prik + 1, VB2_HASH_SHA512),
276108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "create private key 2");
277108d991c678f80c99967bd07035de7418c81a072Randall Spangler
278108d991c678f80c99967bd07035de7418c81a072Randall Spangler	/* Create the test keyblock */
279108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_keyblock_create(&kbuf, &pubk3, prik, 2, 0x4321, desc),
280108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "create keyblock");
281108d991c678f80c99967bd07035de7418c81a072Randall Spangler
282108d991c678f80c99967bd07035de7418c81a072Randall Spangler	buf = (uint8_t *)kbuf;
283108d991c678f80c99967bd07035de7418c81a072Randall Spangler	buf_size = kbuf->c.total_size;
284108d991c678f80c99967bd07035de7418c81a072Randall Spangler
285108d991c678f80c99967bd07035de7418c81a072Randall Spangler	/* Make a copy of the buffer, so we can mangle it for tests */
286108d991c678f80c99967bd07035de7418c81a072Randall Spangler	buf2 = malloc(buf_size);
287108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf2, buf, buf_size);
288108d991c678f80c99967bd07035de7418c81a072Randall Spangler
289108d991c678f80c99967bd07035de7418c81a072Randall Spangler	vb2_workbuf_init(&wb, workbuf, sizeof(workbuf));
290308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	kbuf = (struct vb2_keyblock *)buf;
291108d991c678f80c99967bd07035de7418c81a072Randall Spangler
292308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_SUCC(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
293308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		  "vb2_verify_keyblock()");
294108d991c678f80c99967bd07035de7418c81a072Randall Spangler
295108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
296308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_SUCC(vb2_verify_keyblock(kbuf, buf_size, &pubk2, &wb),
297308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		  "vb2_verify_keyblock() key 2");
298108d991c678f80c99967bd07035de7418c81a072Randall Spangler
299108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
300308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk3, &wb),
301108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_KEYBLOCK_SIG_GUID,
302308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_keyblock() key not present");
303108d991c678f80c99967bd07035de7418c81a072Randall Spangler
304108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
305308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	kbuf->c.magic = VB2_MAGIC_PACKED_KEY;
306308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
307108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_KEYBLOCK_MAGIC,
308308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_keyblock() magic");
309108d991c678f80c99967bd07035de7418c81a072Randall Spangler
310108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
311108d991c678f80c99967bd07035de7418c81a072Randall Spangler	kbuf->c.fixed_size++;
312308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
313108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_FIXED_UNALIGNED,
314308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_keyblock() header");
315108d991c678f80c99967bd07035de7418c81a072Randall Spangler
316108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
317108d991c678f80c99967bd07035de7418c81a072Randall Spangler	kbuf->c.struct_version_major++;
318308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
319108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_KEYBLOCK_HEADER_VERSION,
320308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_keyblock() major version");
321108d991c678f80c99967bd07035de7418c81a072Randall Spangler
322108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
323108d991c678f80c99967bd07035de7418c81a072Randall Spangler	kbuf->c.struct_version_minor++;
324108d991c678f80c99967bd07035de7418c81a072Randall Spangler	/* That changes the signature, so resign the keyblock */
325108d991c678f80c99967bd07035de7418c81a072Randall Spangler	vb2_sign_data(&sig, buf, kbuf->sig_offset, prik[0], NULL);
326108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf + kbuf->sig_offset, sig, sig->c.total_size);
327108d991c678f80c99967bd07035de7418c81a072Randall Spangler	free(sig);
328308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_SUCC(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
329308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		  "vb2_verify_keyblock() minor version");
330108d991c678f80c99967bd07035de7418c81a072Randall Spangler
331108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
332108d991c678f80c99967bd07035de7418c81a072Randall Spangler	kbuf->c.fixed_size -= 4;
333108d991c678f80c99967bd07035de7418c81a072Randall Spangler	kbuf->c.desc_size += 4;
334308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
335108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_KEYBLOCK_SIZE,
336308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_keyblock() header size");
337108d991c678f80c99967bd07035de7418c81a072Randall Spangler
338108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
339108d991c678f80c99967bd07035de7418c81a072Randall Spangler	kbuf->key_offset = kbuf->c.total_size - 4;
340308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
341108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_MEMBER_SIZE,
342308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_keyblock() data key outside");
343108d991c678f80c99967bd07035de7418c81a072Randall Spangler
344108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
345308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	sig = (struct vb2_signature *)(buf + kbuf->sig_offset);
346108d991c678f80c99967bd07035de7418c81a072Randall Spangler	sig->data_size--;
347308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
348108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_KEYBLOCK_SIGNED_SIZE,
349308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_keyblock() signed wrong size");
350108d991c678f80c99967bd07035de7418c81a072Randall Spangler
351108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
352308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	sig = (struct vb2_signature *)(buf + kbuf->sig_offset);
353108d991c678f80c99967bd07035de7418c81a072Randall Spangler	sig->c.total_size = kbuf->c.total_size - 4;
354308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
355108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_TOTAL_SIZE,
356308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_keyblock() key outside keyblock");
357108d991c678f80c99967bd07035de7418c81a072Randall Spangler
358108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
359308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	sig = (struct vb2_signature *)(buf + kbuf->sig_offset);
360108d991c678f80c99967bd07035de7418c81a072Randall Spangler	sig->c.struct_version_major++;
361308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
362108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_SIG_VERSION,
363308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_keyblock() corrupt key");
364108d991c678f80c99967bd07035de7418c81a072Randall Spangler
365108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
366108d991c678f80c99967bd07035de7418c81a072Randall Spangler	kbuf->c.struct_version_minor++;
367308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb),
368108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_VDATA_VERIFY_DIGEST,
369308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_keyblock() corrupt");
370108d991c678f80c99967bd07035de7418c81a072Randall Spangler
371108d991c678f80c99967bd07035de7418c81a072Randall Spangler	free(buf);
372108d991c678f80c99967bd07035de7418c81a072Randall Spangler	free(buf2);
373108d991c678f80c99967bd07035de7418c81a072Randall Spangler}
374108d991c678f80c99967bd07035de7418c81a072Randall Spangler
375108d991c678f80c99967bd07035de7418c81a072Randall Spangler/**
376108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Verify firmware preamble
377108d991c678f80c99967bd07035de7418c81a072Randall Spangler */
378108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic void test_verify_fw_preamble(void)
379108d991c678f80c99967bd07035de7418c81a072Randall Spangler{
380108d991c678f80c99967bd07035de7418c81a072Randall Spangler	const char desc[16] = "test preamble";
381108d991c678f80c99967bd07035de7418c81a072Randall Spangler	const struct vb2_private_key *prikhash;
382308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	struct vb2_signature *hashes[3];
383108d991c678f80c99967bd07035de7418c81a072Randall Spangler	struct vb2_public_key pubk;
384308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	struct vb2_signature *sig;
385308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	struct vb2_fw_preamble *pre;
386108d991c678f80c99967bd07035de7418c81a072Randall Spangler	uint32_t buf_size;
387108d991c678f80c99967bd07035de7418c81a072Randall Spangler	uint8_t *buf, *buf2;
388108d991c678f80c99967bd07035de7418c81a072Randall Spangler
38973e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson	uint8_t workbuf[VB2_VERIFY_FIRMWARE_PREAMBLE_WORKBUF_BYTES]
39073e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson		 __attribute__ ((aligned (VB2_WORKBUF_ALIGN)));
391108d991c678f80c99967bd07035de7418c81a072Randall Spangler	struct vb2_workbuf wb;
392108d991c678f80c99967bd07035de7418c81a072Randall Spangler
393108d991c678f80c99967bd07035de7418c81a072Randall Spangler	/*
394108d991c678f80c99967bd07035de7418c81a072Randall Spangler	 * Preambles will usually be signed with a real key not a bare hash,
395308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	 * but the call to vb2_verify_data() inside the preamble check is the
396108d991c678f80c99967bd07035de7418c81a072Randall Spangler	 * same (and its functionality is verified separately), and using a
397108d991c678f80c99967bd07035de7418c81a072Randall Spangler	 * bare hash here saves us from needing to have a private key to do
398108d991c678f80c99967bd07035de7418c81a072Randall Spangler	 * this test.
399108d991c678f80c99967bd07035de7418c81a072Randall Spangler	 */
400108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_public_key_hash(&pubk, VB2_HASH_SHA256),
401108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "create hash key");
402108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_private_key_hash(&prikhash, VB2_HASH_SHA256),
403108d991c678f80c99967bd07035de7418c81a072Randall Spangler			  "Create private hash key");
404108d991c678f80c99967bd07035de7418c81a072Randall Spangler
405108d991c678f80c99967bd07035de7418c81a072Randall Spangler	/* Create some signatures */
406108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_sign_data(hashes + 0, test_data, sizeof(test_data),
407108d991c678f80c99967bd07035de7418c81a072Randall Spangler				prikhash, "Hash 1"),
408108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "Hash 1");
409108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_sign_data(hashes + 1, test_data2, sizeof(test_data2),
410108d991c678f80c99967bd07035de7418c81a072Randall Spangler				prikhash, "Hash 2"),
411108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "Hash 2");
412108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_sign_data(hashes + 2, test_data3, sizeof(test_data3),
413108d991c678f80c99967bd07035de7418c81a072Randall Spangler				prikhash, "Hash 3"),
414108d991c678f80c99967bd07035de7418c81a072Randall Spangler			  "Hash 3");
415108d991c678f80c99967bd07035de7418c81a072Randall Spangler
416108d991c678f80c99967bd07035de7418c81a072Randall Spangler	/* Test good preamble */
417108d991c678f80c99967bd07035de7418c81a072Randall Spangler	TEST_SUCC(vb2_fw_preamble_create(&pre, prikhash,
418308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler					 (const struct vb2_signature **)hashes,
419108d991c678f80c99967bd07035de7418c81a072Randall Spangler					 3, 0x1234, 0x5678, desc),
420108d991c678f80c99967bd07035de7418c81a072Randall Spangler		  "Create preamble good");
421108d991c678f80c99967bd07035de7418c81a072Randall Spangler
422108d991c678f80c99967bd07035de7418c81a072Randall Spangler	buf = (uint8_t *)pre;
423108d991c678f80c99967bd07035de7418c81a072Randall Spangler	buf_size = pre->c.total_size;
424108d991c678f80c99967bd07035de7418c81a072Randall Spangler
425108d991c678f80c99967bd07035de7418c81a072Randall Spangler	/* Make a copy of the buffer, so we can mangle it for tests */
426108d991c678f80c99967bd07035de7418c81a072Randall Spangler	buf2 = malloc(buf_size);
427108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf2, buf, buf_size);
428108d991c678f80c99967bd07035de7418c81a072Randall Spangler
429108d991c678f80c99967bd07035de7418c81a072Randall Spangler	vb2_workbuf_init(&wb, workbuf, sizeof(workbuf));
430308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	pre = (struct vb2_fw_preamble *)buf;
431108d991c678f80c99967bd07035de7418c81a072Randall Spangler
432308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_SUCC(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
433308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		  "vb2_verify_fw_preamble()");
434108d991c678f80c99967bd07035de7418c81a072Randall Spangler
435108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
436308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	pre->c.magic = VB2_MAGIC_PACKED_KEY;
437308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
438108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_PREAMBLE_MAGIC,
439308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_fw_preamble() magic");
440108d991c678f80c99967bd07035de7418c81a072Randall Spangler
441108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
442108d991c678f80c99967bd07035de7418c81a072Randall Spangler	pre->c.fixed_size++;
443308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
444108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_FIXED_UNALIGNED,
445308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_fw_preamble() header");
446108d991c678f80c99967bd07035de7418c81a072Randall Spangler
447108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
448108d991c678f80c99967bd07035de7418c81a072Randall Spangler	pre->c.struct_version_major++;
449308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
450108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_PREAMBLE_HEADER_VERSION,
451308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_fw_preamble() major version");
452108d991c678f80c99967bd07035de7418c81a072Randall Spangler
453108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
454108d991c678f80c99967bd07035de7418c81a072Randall Spangler	pre->c.struct_version_minor++;
455108d991c678f80c99967bd07035de7418c81a072Randall Spangler	/* That changes the signature, so resign the fw_preamble */
456108d991c678f80c99967bd07035de7418c81a072Randall Spangler	vb2_sign_data(&sig, buf, pre->sig_offset, prikhash, NULL);
457108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf + pre->sig_offset, sig, sig->c.total_size);
458108d991c678f80c99967bd07035de7418c81a072Randall Spangler	free(sig);
459308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_SUCC(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
460308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		  "vb2_verify_fw_preamble() minor version");
461108d991c678f80c99967bd07035de7418c81a072Randall Spangler
462108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
463108d991c678f80c99967bd07035de7418c81a072Randall Spangler	pre->c.fixed_size -= 4;
464108d991c678f80c99967bd07035de7418c81a072Randall Spangler	pre->c.desc_size += 4;
465308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
466108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_PREAMBLE_SIZE,
467308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_fw_preamble() header size");
468108d991c678f80c99967bd07035de7418c81a072Randall Spangler
469108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
470308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	sig = (struct vb2_signature *)(buf + pre->hash_offset);
471108d991c678f80c99967bd07035de7418c81a072Randall Spangler	sig->c.total_size += pre->c.total_size;
472308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
473108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_TOTAL_SIZE,
474308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_fw_preamble() hash size");
475108d991c678f80c99967bd07035de7418c81a072Randall Spangler
476108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
477308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	sig = (struct vb2_signature *)(buf + pre->hash_offset);
478108d991c678f80c99967bd07035de7418c81a072Randall Spangler	sig->sig_size /= 2;
479308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
480108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_SIG_SIZE,
481308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_fw_preamble() hash integrity");
482108d991c678f80c99967bd07035de7418c81a072Randall Spangler
483108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
484108d991c678f80c99967bd07035de7418c81a072Randall Spangler	pre->hash_count++;
485308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
486108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_MEMBER_OVERLAP,
487308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_fw_preamble() hash count");
488108d991c678f80c99967bd07035de7418c81a072Randall Spangler
489108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
490308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	sig = (struct vb2_signature *)(buf + pre->sig_offset);
491108d991c678f80c99967bd07035de7418c81a072Randall Spangler	sig->c.total_size += 4;
492308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
493108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_COMMON_TOTAL_SIZE,
494308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_fw_preamble() sig inside");
495108d991c678f80c99967bd07035de7418c81a072Randall Spangler
496108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
497308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	sig = (struct vb2_signature *)(buf + pre->sig_offset);
498108d991c678f80c99967bd07035de7418c81a072Randall Spangler	buf[pre->sig_offset + sig->sig_offset]++;
499308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
500108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_VDATA_VERIFY_DIGEST,
501308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_fw_preamble() sig corrupt");
502108d991c678f80c99967bd07035de7418c81a072Randall Spangler
503108d991c678f80c99967bd07035de7418c81a072Randall Spangler	memcpy(buf, buf2, buf_size);
504108d991c678f80c99967bd07035de7418c81a072Randall Spangler	pre->flags++;
505308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb),
506108d991c678f80c99967bd07035de7418c81a072Randall Spangler		VB2_ERROR_VDATA_VERIFY_DIGEST,
507308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler		"vb2_verify_fw_preamble() preamble corrupt");
508108d991c678f80c99967bd07035de7418c81a072Randall Spangler
509108d991c678f80c99967bd07035de7418c81a072Randall Spangler	free(buf);
510108d991c678f80c99967bd07035de7418c81a072Randall Spangler	free(buf2);
511108d991c678f80c99967bd07035de7418c81a072Randall Spangler}
512108d991c678f80c99967bd07035de7418c81a072Randall Spangler
513108d991c678f80c99967bd07035de7418c81a072Randall Spanglerint main(int argc, char* argv[])
514108d991c678f80c99967bd07035de7418c81a072Randall Spangler{
515108d991c678f80c99967bd07035de7418c81a072Randall Spangler	test_struct_packing();
516108d991c678f80c99967bd07035de7418c81a072Randall Spangler	test_common_header_functions();
517108d991c678f80c99967bd07035de7418c81a072Randall Spangler	test_sig_size();
518108d991c678f80c99967bd07035de7418c81a072Randall Spangler	test_verify_hash();
519108d991c678f80c99967bd07035de7418c81a072Randall Spangler	test_verify_keyblock();
520108d991c678f80c99967bd07035de7418c81a072Randall Spangler	test_verify_fw_preamble();
521108d991c678f80c99967bd07035de7418c81a072Randall Spangler
522108d991c678f80c99967bd07035de7418c81a072Randall Spangler	return gTestSuccess ? 0 : 255;
523108d991c678f80c99967bd07035de7418c81a072Randall Spangler}
524