vb21_api_tests.c revision c644a8c0f2df024798ac0e60c6028261ed389a16
1efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
2efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler * Use of this source code is governed by a BSD-style license that can be
3efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler * found in the LICENSE file.
4efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler *
5efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler * Tests for api library, new style structs
6efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler */
7efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
8efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler#include <stdio.h>
9efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
10efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler#include "2sysincludes.h"
11efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler#include "2api.h"
12efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler#include "2common.h"
13efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler#include "2misc.h"
14efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler#include "2nvstorage.h"
15efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler#include "2rsa.h"
16efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler#include "2secdata.h"
17efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
18c644a8c0f2df024798ac0e60c6028261ed389a16Randall Spangler#include "host_signature2.h"
19c644a8c0f2df024798ac0e60c6028261ed389a16Randall Spangler
20efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler#include "test_common.h"
21efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler#include "vb2_convert_structs.h"
22efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
23efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler/* Common context for tests */
24efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic uint8_t workbuf[VB2_WORKBUF_RECOMMENDED_SIZE]
25efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	__attribute__ ((aligned (16)));
26efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic struct vb2_context ctx;
27efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic struct vb2_shared_data *sd;
28efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
29efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic const uint8_t mock_body[320] = "Mock body";
30efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic const int mock_body_size = sizeof(mock_body);
31efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic const int mock_algorithm = VB2_ALG_RSA2048_SHA256;
32efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic const int mock_hash_alg = VB2_HASH_SHA256;
33efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic int mock_sig_size;
34efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
35efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic const struct vb2_guid test_guid[4] = {
36efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	{.raw = {0x11}},
37efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	{.raw = {0x22}},
38efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	{.raw = {0x33}},
39efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	{.raw = {0x44}},
40efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler};
41efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
42efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler/* Mocked function data */
43efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic int retval_vb2_load_fw_keyblock;
44efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic int retval_vb2_load_fw_preamble;
45efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
46efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler/* Type of test to reset for */
47efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerenum reset_type {
48efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	FOR_MISC,
49efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	FOR_EXTEND_HASH,
50efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	FOR_CHECK_HASH,
51efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler};
52efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
53efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic void reset_common_data(enum reset_type t)
54efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler{
55efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	struct vb2_fw_preamble2 *pre;
56efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	struct vb2_signature2 *sig;
57efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	uint32_t sig_offset;
58efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
59efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	int i;
60efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
61efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	memset(workbuf, 0xaa, sizeof(workbuf));
62efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
63efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	memset(&ctx, 0, sizeof(ctx));
64efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	ctx.workbuf = workbuf;
65efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	ctx.workbuf_size = sizeof(workbuf);
66efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
67efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	vb2_init_context(&ctx);
68efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sd = vb2_get_sd(&ctx);
69efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
70efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	vb2_nv_init(&ctx);
71efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
72efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	vb2_secdata_create(&ctx);
73efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	vb2_secdata_init(&ctx);
74efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
75efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	retval_vb2_load_fw_keyblock = VB2_SUCCESS;
76efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	retval_vb2_load_fw_preamble = VB2_SUCCESS;
77efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
78efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sd->workbuf_preamble_offset = ctx.workbuf_used;
79efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	pre = (struct vb2_fw_preamble2 *)
80efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		(ctx.workbuf + sd->workbuf_preamble_offset);
81efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	pre->hash_count = 3;
82efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	pre->hash_offset = sig_offset = sizeof(*pre);
83efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
84efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	for (i = 0; i < 3; i++) {
85efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		sig = vb2_create_hash_sig(mock_body,
86efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler					  mock_body_size - 16 * i,
87efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler					  mock_hash_alg);
88efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		memcpy(&sig->guid, test_guid + i, sizeof(sig->guid));
89efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		memcpy((uint8_t *)pre + sig_offset, sig, sig->c.total_size);
90efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		sig_offset += sig->c.total_size;
91efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		mock_sig_size = sig->c.total_size;
92efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		free(sig);
93efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	}
94efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
95efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sd->workbuf_preamble_size = sig_offset;
96efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	ctx.workbuf_used = sd->workbuf_preamble_offset
97efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		+ sd->workbuf_preamble_size;
98efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
99efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	if (t == FOR_EXTEND_HASH || t == FOR_CHECK_HASH)
100efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		vb2api_init_hash2(&ctx, test_guid, NULL);
101efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
102efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	if (t == FOR_CHECK_HASH)
103efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		vb2api_extend_hash(&ctx, mock_body, mock_body_size);
104efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler};
105efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
106efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler/* Mocked functions */
107efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
108efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerint vb2_load_fw_keyblock2(struct vb2_context *ctx)
109efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler{
110efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	return retval_vb2_load_fw_keyblock;
111efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler}
112efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
113efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerint vb2_load_fw_preamble2(struct vb2_context *ctx)
114efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler{
115efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	return retval_vb2_load_fw_preamble;
116efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler}
117efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
118efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler/* Tests */
119efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
120efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic void phase3_tests(void)
121efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler{
122efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
123efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_SUCC(vb2api_fw_phase3_2(&ctx), "phase3 good");
124efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
125efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
126efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	retval_vb2_load_fw_keyblock = VB2_ERROR_MOCK;
127efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_fw_phase3_2(&ctx), VB2_ERROR_MOCK, "phase3 keyblock");
128efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2_nv_get(&ctx, VB2_NV_RECOVERY_REQUEST),
129efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_RECOVERY_RO_INVALID_RW, "  recovery reason");
130efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
131efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
132efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	retval_vb2_load_fw_preamble = VB2_ERROR_MOCK;
133efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_fw_phase3_2(&ctx), VB2_ERROR_MOCK, "phase3 keyblock");
134efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2_nv_get(&ctx, VB2_NV_RECOVERY_REQUEST),
135efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_RECOVERY_RO_INVALID_RW, "  recovery reason");
136efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler}
137efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
138efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic void init_hash_tests(void)
139efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler{
140efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	struct vb2_fw_preamble2 *pre;
141efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	struct vb2_signature2 *sig;
142efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	int wb_used_before;
143efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	uint32_t size;
144efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
145efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
146efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	pre = (struct vb2_fw_preamble2 *)
147efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		(ctx.workbuf + sd->workbuf_preamble_offset);
148efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sig = (struct vb2_signature2 *)((uint8_t *)pre + pre->hash_offset);
149efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
150efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	wb_used_before = ctx.workbuf_used;
151efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_SUCC(vb2api_init_hash2(&ctx, test_guid, &size),
152efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		  "init hash good");
153efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(sd->workbuf_hash_offset,
154efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		(wb_used_before + (VB2_WORKBUF_ALIGN - 1)) &
155efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		~(VB2_WORKBUF_ALIGN - 1),
156efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		"hash context offset");
157efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(sd->workbuf_hash_size, sizeof(struct vb2_digest_context),
158efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		"hash context size");
159efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(ctx.workbuf_used,
160efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		sd->workbuf_hash_offset + sd->workbuf_hash_size,
161efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		"hash uses workbuf");
162efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(sd->hash_tag,
163efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		sd->workbuf_preamble_offset + pre->hash_offset,
164efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		"hash signature offset");
165efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(sd->hash_remaining_size, mock_body_size, "hash remaining");
166efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
167efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	wb_used_before = ctx.workbuf_used;
168efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_SUCC(vb2api_init_hash2(&ctx, test_guid + 2, NULL),
169efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		  "init hash again");
170efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(ctx.workbuf_used, wb_used_before, "init hash reuses context");
171efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(sd->hash_tag,
172efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		sd->workbuf_preamble_offset + pre->hash_offset +
173efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		2 * mock_sig_size,
174efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		"hash signature offset 2");
175efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
176efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
177efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_init_hash2(&ctx, test_guid + 3, &size),
178efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_INIT_HASH_GUID, "init hash invalid guid");
179efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
180efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
181efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sd->workbuf_preamble_size = 0;
182efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_init_hash2(&ctx, test_guid, &size),
183efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_INIT_HASH_PREAMBLE, "init hash preamble");
184efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
185efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
186efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	ctx.workbuf_used =
187efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		ctx.workbuf_size - sizeof(struct vb2_digest_context) + 8;
188efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_init_hash2(&ctx, test_guid, &size),
189efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_INIT_HASH_WORKBUF, "init hash workbuf");
190efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
191efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
192efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sig->hash_alg = VB2_HASH_INVALID;
193efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_init_hash2(&ctx, test_guid, &size),
194efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_SHA_INIT_ALGORITHM, "init hash algorithm");
195efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler}
196efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
197efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic void check_hash_tests(void)
198efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler{
199efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	struct vb2_fw_preamble2 *pre;
200efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	struct vb2_signature2 *sig;
201efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	struct vb2_digest_context *dc;
202efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
203efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_CHECK_HASH);
204efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	pre = (struct vb2_fw_preamble2 *)
205efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		(ctx.workbuf + sd->workbuf_preamble_offset);
206efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sig = (struct vb2_signature2 *)((uint8_t *)pre + pre->hash_offset);
207efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	dc = (struct vb2_digest_context *)
208efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		(ctx.workbuf + sd->workbuf_hash_offset);
209efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
210efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_SUCC(vb2api_check_hash2(&ctx), "check hash good");
211efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
212efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_CHECK_HASH);
213efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sd->hash_tag = 0;
214efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_check_hash2(&ctx),
215efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_CHECK_HASH_TAG, "check hash tag");
216efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
217efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_CHECK_HASH);
218efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sd->workbuf_hash_size = 0;
219efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_check_hash2(&ctx),
220efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_CHECK_HASH_WORKBUF, "check hash no workbuf");
221efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
222efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_CHECK_HASH);
223efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sd->hash_remaining_size = 1;
224efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_check_hash2(&ctx),
225efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_CHECK_HASH_SIZE, "check hash size");
226efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
227efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_CHECK_HASH);
228efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	ctx.workbuf_used = ctx.workbuf_size;
229efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_check_hash2(&ctx),
230efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_CHECK_HASH_WORKBUF_DIGEST, "check hash workbuf");
231efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
232efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_CHECK_HASH);
233efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	dc->hash_alg = VB2_HASH_INVALID;
234efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	*((uint8_t *)sig + sig->sig_offset) ^= 0x55;
235efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_check_hash2(&ctx),
236efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_SHA_FINALIZE_ALGORITHM, "check hash finalize");
237efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
238efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_CHECK_HASH);
239efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	*((uint8_t *)sig + sig->sig_offset) ^= 0x55;
240efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_check_hash2(&ctx),
241efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_CHECK_HASH_SIG, "check hash sig");
242efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler}
243efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
244efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerint main(int argc, char* argv[])
245efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler{
246efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	phase3_tests();
247efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	init_hash_tests();
248efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	check_hash_tests();
249efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
250efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	return gTestSuccess ? 0 : 255;
251efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler}
252