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