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
18108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "vb2_common.h"
19108d991c678f80c99967bd07035de7418c81a072Randall Spangler
20c86f0415a0dd1ddea4497e18813a2dd00dd0e3f4Randall Spangler#include "host_key2.h"
21c644a8c0f2df024798ac0e60c6028261ed389a16Randall Spangler#include "host_signature2.h"
22c644a8c0f2df024798ac0e60c6028261ed389a16Randall Spangler
23efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler#include "test_common.h"
24efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
25efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler/* Common context for tests */
26efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic uint8_t workbuf[VB2_WORKBUF_RECOMMENDED_SIZE]
2773e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson	__attribute__ ((aligned (VB2_WORKBUF_ALIGN)));
28efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic struct vb2_context ctx;
29efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic struct vb2_shared_data *sd;
30efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
31efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic const uint8_t mock_body[320] = "Mock body";
32efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic const int mock_body_size = sizeof(mock_body);
33efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic const int mock_hash_alg = VB2_HASH_SHA256;
34efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic int mock_sig_size;
35efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
36efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic const struct vb2_guid test_guid[4] = {
37efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	{.raw = {0x11}},
38efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	{.raw = {0x22}},
39efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	{.raw = {0x33}},
40efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	{.raw = {0x44}},
41efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler};
42efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
43efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler/* Mocked function data */
44f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
45f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Wernerstatic enum {
46f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	HWCRYPTO_DISABLED,
47f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	HWCRYPTO_ENABLED,
48f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	HWCRYPTO_FORBIDDEN,
49f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner} hwcrypto_state;
50f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
51f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Wernerstatic struct vb2_digest_context hwcrypto_emulation_dc;
52f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
53f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Wernerstatic int retval_hwcrypto;
54efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic int retval_vb2_load_fw_keyblock;
55efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic int retval_vb2_load_fw_preamble;
56efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
57efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler/* Type of test to reset for */
58efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerenum reset_type {
59efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	FOR_MISC,
60efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	FOR_EXTEND_HASH,
61efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	FOR_CHECK_HASH,
62efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler};
63efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
64efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic void reset_common_data(enum reset_type t)
65efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler{
66c86f0415a0dd1ddea4497e18813a2dd00dd0e3f4Randall Spangler	const struct vb2_private_key *hash_key;
67308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	struct vb2_fw_preamble *pre;
68308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	struct vb2_signature *sig;
69efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	uint32_t sig_offset;
70efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
71efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	int i;
72efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
73efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	memset(workbuf, 0xaa, sizeof(workbuf));
74efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
75efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	memset(&ctx, 0, sizeof(ctx));
76efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	ctx.workbuf = workbuf;
77efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	ctx.workbuf_size = sizeof(workbuf);
78efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
79efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	vb2_init_context(&ctx);
80efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sd = vb2_get_sd(&ctx);
81efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
82efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	vb2_nv_init(&ctx);
83efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
84efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	vb2_secdata_create(&ctx);
85efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	vb2_secdata_init(&ctx);
86efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
87f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	memset(&hwcrypto_emulation_dc, 0, sizeof(hwcrypto_emulation_dc));
88f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	retval_hwcrypto = VB2_SUCCESS;
89efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	retval_vb2_load_fw_keyblock = VB2_SUCCESS;
90efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	retval_vb2_load_fw_preamble = VB2_SUCCESS;
91efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
92c86f0415a0dd1ddea4497e18813a2dd00dd0e3f4Randall Spangler	vb2_private_key_hash(&hash_key, mock_hash_alg);
93c86f0415a0dd1ddea4497e18813a2dd00dd0e3f4Randall Spangler
94efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sd->workbuf_preamble_offset = ctx.workbuf_used;
95308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	pre = (struct vb2_fw_preamble *)
96efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		(ctx.workbuf + sd->workbuf_preamble_offset);
97efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	pre->hash_count = 3;
98efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	pre->hash_offset = sig_offset = sizeof(*pre);
99f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	if (hwcrypto_state == HWCRYPTO_FORBIDDEN)
100f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		pre->flags = VB2_FIRMWARE_PREAMBLE_DISALLOW_HWCRYPTO;
101f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	else
102f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		pre->flags = 0;
103efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
104efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	for (i = 0; i < 3; i++) {
105c86f0415a0dd1ddea4497e18813a2dd00dd0e3f4Randall Spangler		vb2_sign_data(&sig, mock_body, mock_body_size - 16 * i,
106c86f0415a0dd1ddea4497e18813a2dd00dd0e3f4Randall Spangler			      hash_key, NULL);
107efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		memcpy(&sig->guid, test_guid + i, sizeof(sig->guid));
108efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		memcpy((uint8_t *)pre + sig_offset, sig, sig->c.total_size);
109efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		sig_offset += sig->c.total_size;
110efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		mock_sig_size = sig->c.total_size;
111efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		free(sig);
112efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	}
113efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
114efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sd->workbuf_preamble_size = sig_offset;
115efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	ctx.workbuf_used = sd->workbuf_preamble_offset
116efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		+ sd->workbuf_preamble_size;
117efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
118efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	if (t == FOR_EXTEND_HASH || t == FOR_CHECK_HASH)
119efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		vb2api_init_hash2(&ctx, test_guid, NULL);
120efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
121efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	if (t == FOR_CHECK_HASH)
122efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		vb2api_extend_hash(&ctx, mock_body, mock_body_size);
123efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler};
124efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
125efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler/* Mocked functions */
126efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
127308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spanglerint vb2_load_fw_keyblock(struct vb2_context *ctx)
128efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler{
129efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	return retval_vb2_load_fw_keyblock;
130efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler}
131efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
132308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spanglerint vb2_load_fw_preamble(struct vb2_context *ctx)
133efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler{
134efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	return retval_vb2_load_fw_preamble;
135efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler}
136efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
137f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Wernerint vb2ex_hwcrypto_digest_init(enum vb2_hash_algorithm hash_alg,
138f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner			       uint32_t data_size)
139f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner{
140f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	vb2_digest_init(&hwcrypto_emulation_dc, hash_alg);
141f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
142f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	switch (hwcrypto_state) {
143f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	case HWCRYPTO_DISABLED:
144f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		return VB2_ERROR_EX_HWCRYPTO_UNSUPPORTED;
145f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	case HWCRYPTO_ENABLED:
146f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		if (hash_alg != mock_hash_alg)
147f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner			return VB2_ERROR_SHA_INIT_ALGORITHM;
148f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		else
149f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner			return retval_hwcrypto;
150f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	case HWCRYPTO_FORBIDDEN:
151f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	default:
152f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		return VB2_ERROR_UNKNOWN;
153f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	}
154f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner}
155f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
156f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Wernerint vb2ex_hwcrypto_digest_extend(const uint8_t *buf,
157f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner				 uint32_t size)
158f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner{
159f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	vb2_digest_extend(&hwcrypto_emulation_dc, buf, size);
160f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
161f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	if (hwcrypto_state != HWCRYPTO_ENABLED)
162f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		return VB2_ERROR_UNKNOWN;
163f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
164f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	return retval_hwcrypto;
165f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner}
166f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
167f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Wernerint vb2ex_hwcrypto_digest_finalize(uint8_t *digest,
168f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner				   uint32_t digest_size)
169f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner{
170f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	vb2_digest_finalize(&hwcrypto_emulation_dc, digest, digest_size);
171f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
172f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	if (hwcrypto_state != HWCRYPTO_ENABLED)
173f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		return VB2_ERROR_UNKNOWN;
174f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
175f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	return retval_hwcrypto;
176f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner}
177f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
178efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler/* Tests */
179efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
180efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic void phase3_tests(void)
181efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler{
182efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
183308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_SUCC(vb2api_fw_phase3(&ctx), "phase3 good");
184efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
185efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
186efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	retval_vb2_load_fw_keyblock = VB2_ERROR_MOCK;
187308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2api_fw_phase3(&ctx), VB2_ERROR_MOCK, "phase3 keyblock");
188efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2_nv_get(&ctx, VB2_NV_RECOVERY_REQUEST),
189efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_RECOVERY_RO_INVALID_RW, "  recovery reason");
190efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
191efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
192efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	retval_vb2_load_fw_preamble = VB2_ERROR_MOCK;
193308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2api_fw_phase3(&ctx), VB2_ERROR_MOCK, "phase3 keyblock");
194efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2_nv_get(&ctx, VB2_NV_RECOVERY_REQUEST),
195efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_RECOVERY_RO_INVALID_RW, "  recovery reason");
196efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler}
197efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
198efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic void init_hash_tests(void)
199efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler{
200308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	struct vb2_fw_preamble *pre;
201308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	struct vb2_signature *sig;
202efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	int wb_used_before;
203efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	uint32_t size;
204efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
205efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
206308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	pre = (struct vb2_fw_preamble *)
207efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		(ctx.workbuf + sd->workbuf_preamble_offset);
208308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	sig = (struct vb2_signature *)((uint8_t *)pre + pre->hash_offset);
209efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
210efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	wb_used_before = ctx.workbuf_used;
211efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_SUCC(vb2api_init_hash2(&ctx, test_guid, &size),
212efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		  "init hash good");
213efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(sd->workbuf_hash_offset,
214efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		(wb_used_before + (VB2_WORKBUF_ALIGN - 1)) &
215efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		~(VB2_WORKBUF_ALIGN - 1),
216efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		"hash context offset");
217efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(sd->workbuf_hash_size, sizeof(struct vb2_digest_context),
218efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		"hash context size");
219efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(ctx.workbuf_used,
220efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		sd->workbuf_hash_offset + sd->workbuf_hash_size,
221efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		"hash uses workbuf");
222efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(sd->hash_tag,
223efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		sd->workbuf_preamble_offset + pre->hash_offset,
224efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		"hash signature offset");
225efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(sd->hash_remaining_size, mock_body_size, "hash remaining");
226efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
227efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	wb_used_before = ctx.workbuf_used;
228efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_SUCC(vb2api_init_hash2(&ctx, test_guid + 2, NULL),
229efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		  "init hash again");
230efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(ctx.workbuf_used, wb_used_before, "init hash reuses context");
231efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(sd->hash_tag,
232efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		sd->workbuf_preamble_offset + pre->hash_offset +
233efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		2 * mock_sig_size,
234efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		"hash signature offset 2");
235efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
236efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
237efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_init_hash2(&ctx, test_guid + 3, &size),
238efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_INIT_HASH_GUID, "init hash invalid guid");
239efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
240efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
241efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sd->workbuf_preamble_size = 0;
242efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_init_hash2(&ctx, test_guid, &size),
243efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_INIT_HASH_PREAMBLE, "init hash preamble");
244efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
245efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
246efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	ctx.workbuf_used =
247efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		ctx.workbuf_size - sizeof(struct vb2_digest_context) + 8;
248efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_init_hash2(&ctx, test_guid, &size),
249efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_INIT_HASH_WORKBUF, "init hash workbuf");
250efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
251efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_MISC);
252efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sig->hash_alg = VB2_HASH_INVALID;
253efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	TEST_EQ(vb2api_init_hash2(&ctx, test_guid, &size),
254efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_SHA_INIT_ALGORITHM, "init hash algorithm");
255f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
256f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	if (hwcrypto_state == HWCRYPTO_ENABLED) {
257f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		reset_common_data(FOR_MISC);
258f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		retval_hwcrypto = VB2_ERROR_MOCK;
259f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		TEST_EQ(vb2api_init_hash2(&ctx, test_guid, &size),
260f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner			VB2_ERROR_MOCK, "init hash use hwcrypto");
261f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	}
262efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler}
263efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
2646f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerstatic void extend_hash_tests(void)
2656f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler{
2666f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	struct vb2_digest_context *dc;
2676f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2686f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_EXTEND_HASH);
2696f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_SUCC(vb2api_extend_hash(&ctx, mock_body, 32),
2706f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		"hash extend good");
2716f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(sd->hash_remaining_size, mock_body_size - 32,
2726f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		"hash extend remaining");
2736f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_SUCC(vb2api_extend_hash(&ctx, mock_body, mock_body_size - 32),
2746f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		"hash extend again");
2756f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(sd->hash_remaining_size, 0, "hash extend remaining 2");
2766f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2776f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_EXTEND_HASH);
2786f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd->workbuf_hash_size = 0;
2796f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_extend_hash(&ctx, mock_body, mock_body_size),
2806f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_EXTEND_HASH_WORKBUF, "hash extend no workbuf");
2816f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2826f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_EXTEND_HASH);
2836f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_extend_hash(&ctx, mock_body, mock_body_size + 1),
2846f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_EXTEND_HASH_SIZE, "hash extend too much");
2856f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2866f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_EXTEND_HASH);
2876f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_extend_hash(&ctx, mock_body, 0),
2886f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_EXTEND_HASH_SIZE, "hash extend empty");
2896f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
290f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	if (hwcrypto_state == HWCRYPTO_ENABLED) {
291f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		reset_common_data(FOR_EXTEND_HASH);
292f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		retval_hwcrypto = VB2_ERROR_MOCK;
293f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		TEST_EQ(vb2api_extend_hash(&ctx, mock_body, mock_body_size),
294f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner			VB2_ERROR_MOCK, "hash extend use hwcrypto");
295f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	} else {
296f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		reset_common_data(FOR_EXTEND_HASH);
297f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		dc = (struct vb2_digest_context *)
298f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner			(ctx.workbuf + sd->workbuf_hash_offset);
299f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		dc->hash_alg = VB2_HASH_INVALID;
300f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		TEST_EQ(vb2api_extend_hash(&ctx, mock_body, mock_body_size),
301f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner			VB2_ERROR_SHA_EXTEND_ALGORITHM, "hash extend fail");
302f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	}
3036f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler}
3046f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
305efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerstatic void check_hash_tests(void)
306efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler{
307308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	struct vb2_fw_preamble *pre;
308308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	struct vb2_signature *sig;
309efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	struct vb2_digest_context *dc;
310efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
311efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_CHECK_HASH);
312308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	pre = (struct vb2_fw_preamble *)
313efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		(ctx.workbuf + sd->workbuf_preamble_offset);
314308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	sig = (struct vb2_signature *)((uint8_t *)pre + pre->hash_offset);
315efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	dc = (struct vb2_digest_context *)
316efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		(ctx.workbuf + sd->workbuf_hash_offset);
317efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
318308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_SUCC(vb2api_check_hash(&ctx), "check hash good");
319efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
320efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_CHECK_HASH);
321efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sd->hash_tag = 0;
322308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2api_check_hash(&ctx),
323efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_CHECK_HASH_TAG, "check hash tag");
324efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
325efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_CHECK_HASH);
326efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sd->workbuf_hash_size = 0;
327308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2api_check_hash(&ctx),
328efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_CHECK_HASH_WORKBUF, "check hash no workbuf");
329efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
330efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_CHECK_HASH);
331efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	sd->hash_remaining_size = 1;
332308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2api_check_hash(&ctx),
333efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_CHECK_HASH_SIZE, "check hash size");
334efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
335efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_CHECK_HASH);
336efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	ctx.workbuf_used = ctx.workbuf_size;
337308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2api_check_hash(&ctx),
338efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_CHECK_HASH_WORKBUF_DIGEST, "check hash workbuf");
339efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
340efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	reset_common_data(FOR_CHECK_HASH);
341efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	*((uint8_t *)sig + sig->sig_offset) ^= 0x55;
342308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler	TEST_EQ(vb2api_check_hash(&ctx),
343efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler		VB2_ERROR_API_CHECK_HASH_SIG, "check hash sig");
344f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
345f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	if (hwcrypto_state == HWCRYPTO_ENABLED) {
346f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		reset_common_data(FOR_CHECK_HASH);
347f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		retval_hwcrypto = VB2_ERROR_MOCK;
348f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		TEST_EQ(vb2api_check_hash(&ctx),
349f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner			VB2_ERROR_MOCK, "check hash use hwcrypto");
350f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	} else {
351f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		reset_common_data(FOR_CHECK_HASH);
352f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		dc->hash_alg = VB2_HASH_INVALID;
353f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		*((uint8_t *)sig + sig->sig_offset) ^= 0x55;
354f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		TEST_EQ(vb2api_check_hash(&ctx),
355f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner			VB2_ERROR_SHA_FINALIZE_ALGORITHM, "check hash finaliz");
356f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	}
357efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler}
358efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
359efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spanglerint main(int argc, char* argv[])
360efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler{
361efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	phase3_tests();
362f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
363f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	fprintf(stderr, "Running hash API tests without hwcrypto support...\n");
364f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	hwcrypto_state = HWCRYPTO_DISABLED;
365f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	init_hash_tests();
366f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	extend_hash_tests();
367f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	check_hash_tests();
368f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
369f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	fprintf(stderr, "Running hash API tests with hwcrypto support...\n");
370f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	hwcrypto_state = HWCRYPTO_ENABLED;
371f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	init_hash_tests();
372f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	extend_hash_tests();
373f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	check_hash_tests();
374f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
375f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	fprintf(stderr, "Running hash API tests with forbidden hwcrypto...\n");
376f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	hwcrypto_state = HWCRYPTO_FORBIDDEN;
377efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	init_hash_tests();
3786f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	extend_hash_tests();
379efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	check_hash_tests();
380efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler
381efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler	return gTestSuccess ? 0 : 255;
382efa37b87f2b4cd4b4f515e96201502ae0408cec7Randall Spangler}
383