16f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
26f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler * Use of this source code is governed by a BSD-style license that can be
36f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler * found in the LICENSE file.
46f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler *
56f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler * Tests for misc library
66f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler */
76f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
86f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler#include <stdio.h>
96f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
106f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler#include "2sysincludes.h"
116f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler#include "2api.h"
126f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler#include "2misc.h"
136f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler#include "2nvstorage.h"
146f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler#include "2rsa.h"
156f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler#include "2secdata.h"
166f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler#include "vb2_common.h"
176f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler#include "test_common.h"
186f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
196f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler/* Common context for tests */
206f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerstatic uint8_t workbuf[VB2_WORKBUF_RECOMMENDED_SIZE]
2173e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson	__attribute__ ((aligned (VB2_WORKBUF_ALIGN)));
226f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerstatic struct vb2_context cc;
236f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerstatic struct vb2_shared_data *sd;
246f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
256f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerconst char mock_body[320] = "Mock body";
266f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerconst int mock_body_size = sizeof(mock_body);
276f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerconst int mock_algorithm = VB2_ALG_RSA2048_SHA256;
286f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerconst int mock_hash_alg = VB2_HASH_SHA256;
296f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerconst int mock_sig_size = 64;
306f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
316f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler/* Mocked function data */
326f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
33f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Wernerstatic enum {
34f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	HWCRYPTO_DISABLED,
35f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	HWCRYPTO_ENABLED,
36f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	HWCRYPTO_FORBIDDEN,
37f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner} hwcrypto_state;
38f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
396f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerstatic int retval_vb2_load_fw_keyblock;
406f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerstatic int retval_vb2_load_fw_preamble;
416f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerstatic int retval_vb2_digest_finalize;
426f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerstatic int retval_vb2_verify_digest;
436f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
446f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler/* Type of test to reset for */
456f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerenum reset_type {
466f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	FOR_MISC,
476f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	FOR_EXTEND_HASH,
486f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	FOR_CHECK_HASH,
496f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler};
506f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
516f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerstatic void reset_common_data(enum reset_type t)
526f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler{
536f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	struct vb2_fw_preamble *pre;
546f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	struct vb2_packed_key *k;
556f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
566f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	memset(workbuf, 0xaa, sizeof(workbuf));
576f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
586f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	memset(&cc, 0, sizeof(cc));
596f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	cc.workbuf = workbuf;
606f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	cc.workbuf_size = sizeof(workbuf);
616f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
626f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	vb2_init_context(&cc);
636f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd = vb2_get_sd(&cc);
646f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
656f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	vb2_nv_init(&cc);
666f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
676f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	vb2_secdata_create(&cc);
686f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	vb2_secdata_init(&cc);
696f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
706f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	retval_vb2_load_fw_keyblock = VB2_SUCCESS;
716f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	retval_vb2_load_fw_preamble = VB2_SUCCESS;
726f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	retval_vb2_digest_finalize = VB2_SUCCESS;
736f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	retval_vb2_verify_digest = VB2_SUCCESS;
746f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
756f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd->workbuf_preamble_offset = cc.workbuf_used;
766f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd->workbuf_preamble_size = sizeof(*pre);
776f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	cc.workbuf_used = sd->workbuf_preamble_offset
786f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		+ sd->workbuf_preamble_size;
796f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	pre = (struct vb2_fw_preamble *)
806f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		(cc.workbuf + sd->workbuf_preamble_offset);
816f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	pre->body_signature.data_size = mock_body_size;
826f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	pre->body_signature.sig_size = mock_sig_size;
83f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	if (hwcrypto_state == HWCRYPTO_FORBIDDEN)
84f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		pre->flags = VB2_FIRMWARE_PREAMBLE_DISALLOW_HWCRYPTO;
85f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	else
86f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		pre->flags = 0;
876f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
886f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd->workbuf_data_key_offset = cc.workbuf_used;
896f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd->workbuf_data_key_size = sizeof(*k) + 8;
906f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	cc.workbuf_used = sd->workbuf_data_key_offset +
916f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		sd->workbuf_data_key_size;
926f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	k = (struct vb2_packed_key *)
936f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		(cc.workbuf + sd->workbuf_data_key_offset);
946f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	k->algorithm = mock_algorithm;
956f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
966f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	if (t == FOR_EXTEND_HASH || t == FOR_CHECK_HASH)
976f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		vb2api_init_hash(&cc, VB2_HASH_TAG_FW_BODY, NULL);
986f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
996f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	if (t == FOR_CHECK_HASH)
1006f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		vb2api_extend_hash(&cc, mock_body, mock_body_size);
1016f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler};
1026f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
1036f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler/* Mocked functions */
1046f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
1056f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerint vb2_load_fw_keyblock(struct vb2_context *ctx)
1066f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler{
1076f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	return retval_vb2_load_fw_keyblock;
1086f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler}
1096f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
1106f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerint vb2_load_fw_preamble(struct vb2_context *ctx)
1116f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler{
1126f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	return retval_vb2_load_fw_preamble;
1136f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler}
1146f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
1156f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerint vb2_unpack_key(struct vb2_public_key *key,
1166f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		   const uint8_t *buf,
1176f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		   uint32_t size)
1186f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler{
1196f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	struct vb2_packed_key *k = (struct vb2_packed_key *)buf;
1206f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
1216f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	if (size != sizeof(*k) + 8)
1226f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		return VB2_ERROR_UNPACK_KEY_SIZE;
1236f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
1246f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	key->sig_alg = vb2_crypto_to_signature(k->algorithm);
1256f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	key->hash_alg = vb2_crypto_to_hash(k->algorithm);
1266f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
1276f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	return VB2_SUCCESS;
1286f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler}
1296f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
130f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Wernerint vb2ex_hwcrypto_digest_init(enum vb2_hash_algorithm hash_alg,
131f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner			       uint32_t data_size)
132f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner{
133f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	switch (hwcrypto_state) {
134f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	case HWCRYPTO_DISABLED:
135f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		return VB2_ERROR_EX_HWCRYPTO_UNSUPPORTED;
136f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	case HWCRYPTO_ENABLED:
137f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		if (hash_alg != mock_hash_alg)
138f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner			return VB2_ERROR_SHA_INIT_ALGORITHM;
139f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		else
140f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner			return VB2_SUCCESS;
141f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	case HWCRYPTO_FORBIDDEN:
142f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	default:
143f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		return VB2_ERROR_UNKNOWN;
144f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	}
145f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner}
146f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
147f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Wernerint vb2ex_hwcrypto_digest_extend(const uint8_t *buf,
148f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner				 uint32_t size)
149f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner{
150f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	if (hwcrypto_state != HWCRYPTO_ENABLED)
151f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		return VB2_ERROR_UNKNOWN;
152f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
153f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	return VB2_SUCCESS;
154f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner}
155f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
156f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Wernerint vb2ex_hwcrypto_digest_finalize(uint8_t *digest,
157f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner				   uint32_t digest_size)
158f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner{
159f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	if (hwcrypto_state != HWCRYPTO_ENABLED)
160f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		return VB2_ERROR_UNKNOWN;
161f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
162f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	return retval_vb2_digest_finalize;
163f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner}
164f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
1656f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerint vb2_digest_init(struct vb2_digest_context *dc,
1666f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		    enum vb2_hash_algorithm hash_alg)
1676f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler{
168f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	if (hwcrypto_state == HWCRYPTO_ENABLED)
169f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		return VB2_ERROR_UNKNOWN;
1706f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	if (hash_alg != mock_hash_alg)
1716f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		return VB2_ERROR_SHA_INIT_ALGORITHM;
1726f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
1736f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	dc->hash_alg = hash_alg;
174f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	dc->using_hwcrypto = 0;
1756f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
1766f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	return VB2_SUCCESS;
1776f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler}
1786f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
1796f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerint vb2_digest_extend(struct vb2_digest_context *dc,
1806f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		      const uint8_t *buf,
1816f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		      uint32_t size)
1826f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler{
183f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	if (hwcrypto_state == HWCRYPTO_ENABLED)
184f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		return VB2_ERROR_UNKNOWN;
1856f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	if (dc->hash_alg != mock_hash_alg)
1866f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		return VB2_ERROR_SHA_EXTEND_ALGORITHM;
1876f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
1886f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	return VB2_SUCCESS;
1896f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler}
1906f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
1916f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerint vb2_digest_finalize(struct vb2_digest_context *dc,
1926f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler			uint8_t *digest,
1936f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler			uint32_t digest_size)
1946f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler{
195f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	if (hwcrypto_state == HWCRYPTO_ENABLED)
196f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		return VB2_ERROR_UNKNOWN;
1976f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	return retval_vb2_digest_finalize;
1986f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler}
1996f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2006f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangleruint32_t vb2_rsa_sig_size(enum vb2_signature_algorithm sig_alg)
2016f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler{
2026f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	return mock_sig_size;
2036f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler}
2046f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2056f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerint vb2_rsa_verify_digest(const struct vb2_public_key *key,
2066f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler			  uint8_t *sig,
2076f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler			  const uint8_t *digest,
2086f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler			  const struct vb2_workbuf *wb)
2096f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler{
2106f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	return retval_vb2_verify_digest;
2116f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler}
2126f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2136f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler/* Tests */
2146f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2156f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerstatic void phase3_tests(void)
2166f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler{
2176f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_MISC);
2186f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_SUCC(vb2api_fw_phase3(&cc), "phase3 good");
2196f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2206f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_MISC);
2216f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	retval_vb2_load_fw_keyblock = VB2_ERROR_MOCK;
2226f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_fw_phase3(&cc), VB2_ERROR_MOCK, "phase3 keyblock");
2236f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2_nv_get(&cc, VB2_NV_RECOVERY_REQUEST),
2246f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_RECOVERY_RO_INVALID_RW, "  recovery reason");
2256f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2266f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_MISC);
2276f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	retval_vb2_load_fw_preamble = VB2_ERROR_MOCK;
2286f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_fw_phase3(&cc), VB2_ERROR_MOCK, "phase3 keyblock");
2296f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2_nv_get(&cc, VB2_NV_RECOVERY_REQUEST),
2306f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_RECOVERY_RO_INVALID_RW, "  recovery reason");
2316f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler}
2326f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2336f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerstatic void init_hash_tests(void)
2346f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler{
2356f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	struct vb2_packed_key *k;
2366f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	int wb_used_before;
2376f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	uint32_t size;
2386f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2396f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	/* For now, all we support is body signature hash */
2406f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_MISC);
2416f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	wb_used_before = cc.workbuf_used;
2426f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_SUCC(vb2api_init_hash(&cc, VB2_HASH_TAG_FW_BODY, &size),
2436f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		  "init hash good");
2446f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(sd->workbuf_hash_offset,
2456f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		(wb_used_before + (VB2_WORKBUF_ALIGN - 1)) &
2466f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		~(VB2_WORKBUF_ALIGN - 1),
2476f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		"hash context offset");
2486f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(sd->workbuf_hash_size, sizeof(struct vb2_digest_context),
2496f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		"hash context size");
2506f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(cc.workbuf_used,
2516f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		sd->workbuf_hash_offset + sd->workbuf_hash_size,
2526f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		"hash uses workbuf");
2536f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(sd->hash_tag, VB2_HASH_TAG_FW_BODY, "hash tag");
2546f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(sd->hash_remaining_size, mock_body_size, "hash remaining");
2556f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2566f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	wb_used_before = cc.workbuf_used;
2576f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_SUCC(vb2api_init_hash(&cc, VB2_HASH_TAG_FW_BODY, NULL),
2586f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		  "init hash again");
2596f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(cc.workbuf_used, wb_used_before, "init hash reuses context");
2606f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2616f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_MISC);
2626f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_init_hash(&cc, VB2_HASH_TAG_INVALID, &size),
2636f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_INIT_HASH_TAG, "init hash invalid tag");
2646f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2656f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_MISC);
2666f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd->workbuf_preamble_size = 0;
2676f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_init_hash(&cc, VB2_HASH_TAG_FW_BODY, &size),
2686f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_INIT_HASH_PREAMBLE, "init hash preamble");
2696f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2706f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_MISC);
2716f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_init_hash(&cc, VB2_HASH_TAG_FW_BODY + 1, &size),
2726f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_INIT_HASH_TAG, "init hash unknown tag");
2736f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2746f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_MISC);
2756f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	cc.workbuf_used =
2766f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		cc.workbuf_size - sizeof(struct vb2_digest_context) + 8;
2776f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_init_hash(&cc, VB2_HASH_TAG_FW_BODY, &size),
2786f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_INIT_HASH_WORKBUF, "init hash workbuf");
2796f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2806f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_MISC);
2816f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd->workbuf_data_key_size = 0;
2826f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_init_hash(&cc, VB2_HASH_TAG_FW_BODY, &size),
2836f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_INIT_HASH_DATA_KEY, "init hash data key");
2846f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2856f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_MISC);
2866f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd->workbuf_data_key_size--;
2876f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_init_hash(&cc, VB2_HASH_TAG_FW_BODY, &size),
2886f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_UNPACK_KEY_SIZE, "init hash data key size");
2896f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2906f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_MISC);
2916f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	k = (struct vb2_packed_key *)(cc.workbuf + sd->workbuf_data_key_offset);
2926f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	k->algorithm--;
2936f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_init_hash(&cc, VB2_HASH_TAG_FW_BODY, &size),
2946f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_SHA_INIT_ALGORITHM, "init hash algorithm");
2956f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler}
2966f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
2976f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerstatic void extend_hash_tests(void)
2986f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler{
2996f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	struct vb2_digest_context *dc;
3006f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3016f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_EXTEND_HASH);
3026f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_SUCC(vb2api_extend_hash(&cc, mock_body, 32),
3036f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		"hash extend good");
3046f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(sd->hash_remaining_size, mock_body_size - 32,
3056f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		"hash extend remaining");
3066f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_SUCC(vb2api_extend_hash(&cc, mock_body, mock_body_size - 32),
3076f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		"hash extend again");
3086f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(sd->hash_remaining_size, 0, "hash extend remaining 2");
3096f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3106f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_EXTEND_HASH);
3116f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd->workbuf_hash_size = 0;
3126f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_extend_hash(&cc, mock_body, mock_body_size),
3136f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_EXTEND_HASH_WORKBUF, "hash extend no workbuf");
3146f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3156f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_EXTEND_HASH);
3166f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_extend_hash(&cc, mock_body, mock_body_size + 1),
3176f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_EXTEND_HASH_SIZE, "hash extend too much");
3186f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3196f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_EXTEND_HASH);
3206f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_extend_hash(&cc, mock_body, 0),
3216f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_EXTEND_HASH_SIZE, "hash extend empty");
3226f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
323f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	if (hwcrypto_state != HWCRYPTO_ENABLED) {
324f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		reset_common_data(FOR_EXTEND_HASH);
325f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		dc = (struct vb2_digest_context *)
326f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner			(cc.workbuf + sd->workbuf_hash_offset);
327f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		dc->hash_alg = mock_hash_alg + 1;
328f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner		TEST_EQ(vb2api_extend_hash(&cc, mock_body, mock_body_size),
329f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner			VB2_ERROR_SHA_EXTEND_ALGORITHM, "hash extend fail");
330f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	}
3316f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler}
3326f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3336f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerstatic void check_hash_tests(void)
3346f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler{
3356f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	struct vb2_fw_preamble *pre;
3366f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3376f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_CHECK_HASH);
3386f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_SUCC(vb2api_check_hash(&cc), "check hash good");
3396f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3406f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_CHECK_HASH);
3416f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd->workbuf_preamble_size = 0;
3426f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_check_hash(&cc),
3436f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_CHECK_HASH_PREAMBLE, "check hash preamble");
3446f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3456f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_CHECK_HASH);
3466f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd->workbuf_hash_size = 0;
3476f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_check_hash(&cc),
3486f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_CHECK_HASH_WORKBUF, "check hash no workbuf");
3496f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3506f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_CHECK_HASH);
3516f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd->hash_remaining_size = 1;
3526f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_check_hash(&cc),
3536f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_CHECK_HASH_SIZE, "check hash size");
3546f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3556f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_CHECK_HASH);
3566f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	cc.workbuf_used = cc.workbuf_size;
3576f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_check_hash(&cc),
3586f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_CHECK_HASH_WORKBUF_DIGEST, "check hash workbuf");
3596f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3606f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_CHECK_HASH);
3616f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	retval_vb2_digest_finalize = VB2_ERROR_MOCK;
3626f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_check_hash(&cc),	VB2_ERROR_MOCK, "check hash finalize");
3636f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3646f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_CHECK_HASH);
3656f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd->hash_tag = VB2_HASH_TAG_INVALID;
3666f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_check_hash(&cc),
3676f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_CHECK_HASH_TAG, "check hash tag");
3686f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3696f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_CHECK_HASH);
3706f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd->workbuf_data_key_size = 0;
3716f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_check_hash(&cc),
3726f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_API_CHECK_HASH_DATA_KEY, "check hash data key");
3736f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3746f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_CHECK_HASH);
3756f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	sd->workbuf_data_key_size--;
3766f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_check_hash(&cc),
3776f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_UNPACK_KEY_SIZE, "check hash data key size");
3786f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3796f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_CHECK_HASH);
3806f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	pre = (struct vb2_fw_preamble *)
3816f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		(cc.workbuf + sd->workbuf_preamble_offset);
3826f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	pre->body_signature.sig_size++;
3836f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_check_hash(&cc),
3846f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_VDATA_SIG_SIZE, "check hash sig size");
3856f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3866f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	reset_common_data(FOR_CHECK_HASH);
3876f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	retval_vb2_digest_finalize = VB2_ERROR_RSA_VERIFY_DIGEST;
3886f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	TEST_EQ(vb2api_check_hash(&cc),
3896f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler		VB2_ERROR_RSA_VERIFY_DIGEST, "check hash finalize");
3906f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler}
3916f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
3926f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spanglerint main(int argc, char* argv[])
3936f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler{
3946f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	phase3_tests();
395f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
396f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	fprintf(stderr, "Running hash API tests without hwcrypto support...\n");
397f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	hwcrypto_state = HWCRYPTO_DISABLED;
398f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	init_hash_tests();
399f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	extend_hash_tests();
400f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	check_hash_tests();
401f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
402f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	fprintf(stderr, "Running hash API tests with hwcrypto support...\n");
403f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	hwcrypto_state = HWCRYPTO_ENABLED;
404f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	init_hash_tests();
405f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	extend_hash_tests();
406f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	check_hash_tests();
407f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner
408f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	fprintf(stderr, "Running hash API tests with forbidden hwcrypto...\n");
409f10e9099286202f83ce4c1dc5ef1e85fcb5ccde7Julius Werner	hwcrypto_state = HWCRYPTO_FORBIDDEN;
4106f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	init_hash_tests();
4116f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	extend_hash_tests();
4126f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	check_hash_tests();
4136f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler
4146f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler	return gTestSuccess ? 0 : 255;
4156f1b82ac14f341d9733d6e95d518b3ee352002efRandall Spangler}
416