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