1108d991c678f80c99967bd07035de7418c81a072Randall Spangler/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved. 2108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Use of this source code is governed by a BSD-style license that can be 3108d991c678f80c99967bd07035de7418c81a072Randall Spangler * found in the LICENSE file. 4108d991c678f80c99967bd07035de7418c81a072Randall Spangler * 5108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Tests for firmware 2common.c 6108d991c678f80c99967bd07035de7418c81a072Randall Spangler */ 7108d991c678f80c99967bd07035de7418c81a072Randall Spangler 8108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "2sysincludes.h" 9108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "2common.h" 10108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "2rsa.h" 11108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "vb2_common.h" 12108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "host_fw_preamble2.h" 13108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "host_key2.h" 14108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "host_keyblock2.h" 15108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "host_signature2.h" 16108d991c678f80c99967bd07035de7418c81a072Randall Spangler 17108d991c678f80c99967bd07035de7418c81a072Randall Spangler#include "test_common.h" 18108d991c678f80c99967bd07035de7418c81a072Randall Spangler 19108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic const uint8_t test_data[] = "This is some test data to sign."; 20108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic const uint8_t test_data2[] = "Some more test data"; 21108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic const uint8_t test_data3[] = "Even more test data"; 22108d991c678f80c99967bd07035de7418c81a072Randall Spangler 23108d991c678f80c99967bd07035de7418c81a072Randall Spangler/* 24108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Test struct packing for vboot_struct.h structs which are passed between 25108d991c678f80c99967bd07035de7418c81a072Randall Spangler * firmware and OS, or passed between different phases of firmware. 26108d991c678f80c99967bd07035de7418c81a072Randall Spangler */ 27108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic void test_struct_packing(void) 28108d991c678f80c99967bd07035de7418c81a072Randall Spangler{ 29108d991c678f80c99967bd07035de7418c81a072Randall Spangler /* Test new struct sizes */ 30108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(EXPECTED_GUID_SIZE, 31108d991c678f80c99967bd07035de7418c81a072Randall Spangler sizeof(struct vb2_guid), 32108d991c678f80c99967bd07035de7418c81a072Randall Spangler "sizeof(vb2_guid)"); 33108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(EXPECTED_VB2_STRUCT_COMMON_SIZE, 34108d991c678f80c99967bd07035de7418c81a072Randall Spangler sizeof(struct vb2_struct_common), 35108d991c678f80c99967bd07035de7418c81a072Randall Spangler "sizeof(vb2_struct_common)"); 36308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(EXPECTED_VB2_PACKED_KEY_SIZE, 37308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler sizeof(struct vb2_packed_key), 38308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "sizeof(vb2_packed_key)"); 39308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(EXPECTED_VB2_SIGNATURE_SIZE, 40308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler sizeof(struct vb2_signature), 41308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "sizeof(vb2_signature)"); 42308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(EXPECTED_VB2_KEYBLOCK_SIZE, 43308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler sizeof(struct vb2_keyblock), 44308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "sizeof(vb2_keyblock)"); 45308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(EXPECTED_VB2_FW_PREAMBLE_SIZE, 46308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler sizeof(struct vb2_fw_preamble), 47308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "sizeof(vb2_fw_preamble)"); 48108d991c678f80c99967bd07035de7418c81a072Randall Spangler} 49108d991c678f80c99967bd07035de7418c81a072Randall Spangler 50108d991c678f80c99967bd07035de7418c81a072Randall Spangler/** 51108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Common header functions 52108d991c678f80c99967bd07035de7418c81a072Randall Spangler */ 53108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic void test_common_header_functions(void) 54108d991c678f80c99967bd07035de7418c81a072Randall Spangler{ 55108d991c678f80c99967bd07035de7418c81a072Randall Spangler uint8_t cbuf[sizeof(struct vb2_struct_common) + 128]; 56108d991c678f80c99967bd07035de7418c81a072Randall Spangler uint8_t cbufgood[sizeof(cbuf)]; 57108d991c678f80c99967bd07035de7418c81a072Randall Spangler struct vb2_struct_common *c = (struct vb2_struct_common *)cbuf; 58108d991c678f80c99967bd07035de7418c81a072Randall Spangler struct vb2_struct_common *c2; 59108d991c678f80c99967bd07035de7418c81a072Randall Spangler const char test_desc[32] = "test desc"; 60108d991c678f80c99967bd07035de7418c81a072Randall Spangler uint32_t desc_end, m; 61108d991c678f80c99967bd07035de7418c81a072Randall Spangler 62108d991c678f80c99967bd07035de7418c81a072Randall Spangler c->total_size = sizeof(cbuf); 63108d991c678f80c99967bd07035de7418c81a072Randall Spangler c->fixed_size = sizeof(*c); 64108d991c678f80c99967bd07035de7418c81a072Randall Spangler c->desc_size = sizeof(test_desc); 65108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(cbuf + c->fixed_size, test_desc, sizeof(test_desc)); 66108d991c678f80c99967bd07035de7418c81a072Randall Spangler desc_end = c->fixed_size + c->desc_size; 67108d991c678f80c99967bd07035de7418c81a072Randall Spangler 68108d991c678f80c99967bd07035de7418c81a072Randall Spangler c2 = (struct vb2_struct_common *)(cbuf + desc_end); 69108d991c678f80c99967bd07035de7418c81a072Randall Spangler c2->total_size = c->total_size - desc_end; 70108d991c678f80c99967bd07035de7418c81a072Randall Spangler c2->fixed_size = sizeof(*c2); 71108d991c678f80c99967bd07035de7418c81a072Randall Spangler c2->desc_size = 0; 72108d991c678f80c99967bd07035de7418c81a072Randall Spangler 73108d991c678f80c99967bd07035de7418c81a072Randall Spangler /* Description helper */ 74108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(0, strcmp(vb2_common_desc(c), test_desc), "vb2_common_desc()"); 75108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(0, strcmp(vb2_common_desc(c2), ""), "vb2_common_desc() empty"); 76108d991c678f80c99967bd07035de7418c81a072Randall Spangler 77108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_verify_common_header(cbuf, sizeof(cbuf)), 78108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_header() good"); 79108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(cbufgood, cbuf, sizeof(cbufgood)); 80108d991c678f80c99967bd07035de7418c81a072Randall Spangler 81108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(cbuf, cbufgood, sizeof(cbuf)); 82108d991c678f80c99967bd07035de7418c81a072Randall Spangler c->total_size += 4; 83108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)), 84108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_TOTAL_SIZE, 85108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_header() total size"); 86108d991c678f80c99967bd07035de7418c81a072Randall Spangler 87108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(cbuf, cbufgood, sizeof(cbuf)); 88108d991c678f80c99967bd07035de7418c81a072Randall Spangler c->fixed_size = c->total_size + 4; 89108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)), 90108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_FIXED_SIZE, 91108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_header() fixed size"); 92108d991c678f80c99967bd07035de7418c81a072Randall Spangler 93108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(cbuf, cbufgood, sizeof(cbuf)); 94108d991c678f80c99967bd07035de7418c81a072Randall Spangler c->desc_size = c->total_size - c->fixed_size + 4; 95108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)), 96108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_DESC_SIZE, 97108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_header() desc size"); 98108d991c678f80c99967bd07035de7418c81a072Randall Spangler 99108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(cbuf, cbufgood, sizeof(cbuf)); 100108d991c678f80c99967bd07035de7418c81a072Randall Spangler c->total_size--; 101108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)), 102108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_TOTAL_UNALIGNED, 103108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_header() total unaligned"); 104108d991c678f80c99967bd07035de7418c81a072Randall Spangler 105108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(cbuf, cbufgood, sizeof(cbuf)); 106108d991c678f80c99967bd07035de7418c81a072Randall Spangler c->fixed_size++; 107108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)), 108108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_FIXED_UNALIGNED, 109108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_header() fixed unaligned"); 110108d991c678f80c99967bd07035de7418c81a072Randall Spangler 111108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(cbuf, cbufgood, sizeof(cbuf)); 112108d991c678f80c99967bd07035de7418c81a072Randall Spangler c->desc_size--; 113108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)), 114108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_DESC_UNALIGNED, 115108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_header() desc unaligned"); 116108d991c678f80c99967bd07035de7418c81a072Randall Spangler 117108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(cbuf, cbufgood, sizeof(cbuf)); 118108d991c678f80c99967bd07035de7418c81a072Randall Spangler c->desc_size = -4; 119108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)), 120108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_DESC_WRAPS, 121108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_header() desc wraps"); 122108d991c678f80c99967bd07035de7418c81a072Randall Spangler 123108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(cbuf, cbufgood, sizeof(cbuf)); 124108d991c678f80c99967bd07035de7418c81a072Randall Spangler cbuf[desc_end - 1] = 1; 125108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)), 126108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_DESC_TERMINATOR, 127108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_header() desc not terminated"); 128108d991c678f80c99967bd07035de7418c81a072Randall Spangler 129108d991c678f80c99967bd07035de7418c81a072Randall Spangler /* Member checking function */ 130108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(cbuf, cbufgood, sizeof(cbuf)); 131108d991c678f80c99967bd07035de7418c81a072Randall Spangler m = 0; 132108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_verify_common_member(cbuf, &m, c->total_size - 8, 4), 133108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_member()"); 134108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(m, c->total_size - 4, " new minimum"); 135108d991c678f80c99967bd07035de7418c81a072Randall Spangler 136108d991c678f80c99967bd07035de7418c81a072Randall Spangler m = desc_end; 137108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_verify_common_member(cbuf, &m, desc_end, 4), 138108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_member() good offset"); 139108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(m, desc_end + 4, " new minimum"); 140108d991c678f80c99967bd07035de7418c81a072Randall Spangler 141108d991c678f80c99967bd07035de7418c81a072Randall Spangler m = 0; 142108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 8, -4), 143108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_MEMBER_WRAPS, 144108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_member() wraps"); 145108d991c678f80c99967bd07035de7418c81a072Randall Spangler 146108d991c678f80c99967bd07035de7418c81a072Randall Spangler m = 0; 147108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 7, 4), 148108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_MEMBER_UNALIGNED, 149108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_member() offset unaligned"); 150108d991c678f80c99967bd07035de7418c81a072Randall Spangler 151108d991c678f80c99967bd07035de7418c81a072Randall Spangler m = 0; 152108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 8, 5), 153108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_MEMBER_UNALIGNED, 154108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_member() size unaligned"); 155108d991c678f80c99967bd07035de7418c81a072Randall Spangler 156108d991c678f80c99967bd07035de7418c81a072Randall Spangler m = 0; 157108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_member(cbuf, &m, desc_end - 4, 4), 158108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_MEMBER_OVERLAP, 159108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_member() overlap"); 160108d991c678f80c99967bd07035de7418c81a072Randall Spangler 161108d991c678f80c99967bd07035de7418c81a072Randall Spangler m = desc_end + 4; 162108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_member(cbuf, &m, desc_end, 4), 163108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_MEMBER_OVERLAP, 164108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_member() overlap 2"); 165108d991c678f80c99967bd07035de7418c81a072Randall Spangler 166108d991c678f80c99967bd07035de7418c81a072Randall Spangler m = 0; 167108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 4, 8), 168108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_MEMBER_SIZE, 169108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_member() size"); 170108d991c678f80c99967bd07035de7418c81a072Randall Spangler 171108d991c678f80c99967bd07035de7418c81a072Randall Spangler /* Subobject checking */ 172108d991c678f80c99967bd07035de7418c81a072Randall Spangler m = 0; 173108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_verify_common_subobject(cbuf, &m, desc_end), 174108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_subobject() good offset"); 175108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(m, sizeof(cbuf), " new minimum"); 176108d991c678f80c99967bd07035de7418c81a072Randall Spangler 177108d991c678f80c99967bd07035de7418c81a072Randall Spangler m = desc_end + 4; 178108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_subobject(cbuf, &m, desc_end), 179108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_MEMBER_OVERLAP, 180108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_subobject() overlap"); 181108d991c678f80c99967bd07035de7418c81a072Randall Spangler 182108d991c678f80c99967bd07035de7418c81a072Randall Spangler m = 0; 183108d991c678f80c99967bd07035de7418c81a072Randall Spangler c2->total_size += 4; 184108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_verify_common_subobject(cbuf, &m, desc_end), 185108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_TOTAL_SIZE, 186108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_verify_common_subobject() size"); 187108d991c678f80c99967bd07035de7418c81a072Randall Spangler} 188108d991c678f80c99967bd07035de7418c81a072Randall Spangler 189108d991c678f80c99967bd07035de7418c81a072Randall Spangler/** 190108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Signature size 191108d991c678f80c99967bd07035de7418c81a072Randall Spangler */ 192108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic void test_sig_size(void) 193108d991c678f80c99967bd07035de7418c81a072Randall Spangler{ 194108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_sig_size(VB2_SIG_INVALID, VB2_HASH_SHA256), 0, 195108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_sig_size() sig invalid"); 196108d991c678f80c99967bd07035de7418c81a072Randall Spangler 197108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_sig_size(VB2_SIG_RSA2048, VB2_HASH_INVALID), 0, 198108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_sig_size() hash invalid"); 199108d991c678f80c99967bd07035de7418c81a072Randall Spangler 200108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_sig_size(VB2_SIG_RSA2048, VB2_HASH_SHA256), 2048 / 8, 201108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_sig_size() RSA2048"); 202108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_sig_size(VB2_SIG_RSA4096, VB2_HASH_SHA256), 4096 / 8, 203108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_sig_size() RSA4096"); 204108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_sig_size(VB2_SIG_RSA8192, VB2_HASH_SHA512), 8192 / 8, 205108d991c678f80c99967bd07035de7418c81a072Randall Spangler "vb2_sig_size() RSA8192"); 206108d991c678f80c99967bd07035de7418c81a072Randall Spangler 207108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_sig_size(VB2_SIG_NONE, VB2_HASH_SHA1), 208108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_SHA1_DIGEST_SIZE, "vb2_sig_size() SHA1"); 209108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_sig_size(VB2_SIG_NONE, VB2_HASH_SHA256), 210108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_SHA256_DIGEST_SIZE, "vb2_sig_size() SHA256"); 211108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_EQ(vb2_sig_size(VB2_SIG_NONE, VB2_HASH_SHA512), 212108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_SHA512_DIGEST_SIZE, "vb2_sig_size() SHA512"); 213108d991c678f80c99967bd07035de7418c81a072Randall Spangler} 214108d991c678f80c99967bd07035de7418c81a072Randall Spangler 215108d991c678f80c99967bd07035de7418c81a072Randall Spangler/** 216108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Verify data on bare hash 217108d991c678f80c99967bd07035de7418c81a072Randall Spangler */ 218108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic void test_verify_hash(void) 219108d991c678f80c99967bd07035de7418c81a072Randall Spangler{ 220308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler struct vb2_signature *sig; 221108d991c678f80c99967bd07035de7418c81a072Randall Spangler const struct vb2_private_key *prik; 222108d991c678f80c99967bd07035de7418c81a072Randall Spangler struct vb2_public_key pubk; 22373e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson uint8_t workbuf[VB2_VERIFY_DATA_WORKBUF_BYTES] 22473e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson __attribute__ ((aligned (VB2_WORKBUF_ALIGN))); 225108d991c678f80c99967bd07035de7418c81a072Randall Spangler struct vb2_workbuf wb; 226108d991c678f80c99967bd07035de7418c81a072Randall Spangler 227108d991c678f80c99967bd07035de7418c81a072Randall Spangler vb2_workbuf_init(&wb, workbuf, sizeof(workbuf)); 228108d991c678f80c99967bd07035de7418c81a072Randall Spangler 229108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_private_key_hash(&prik, VB2_HASH_SHA256), 230108d991c678f80c99967bd07035de7418c81a072Randall Spangler "create private hash key"); 231108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_public_key_hash(&pubk, VB2_HASH_SHA256), 232108d991c678f80c99967bd07035de7418c81a072Randall Spangler "create hash key"); 233108d991c678f80c99967bd07035de7418c81a072Randall Spangler 234108d991c678f80c99967bd07035de7418c81a072Randall Spangler /* Create the signature */ 235308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_SUCC(vb2_sign_data(&sig, test_data, sizeof(test_data), prik, NULL), 236108d991c678f80c99967bd07035de7418c81a072Randall Spangler "create hash sig"); 237108d991c678f80c99967bd07035de7418c81a072Randall Spangler 238308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_SUCC(vb2_verify_data(test_data, sizeof(test_data), 239308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler sig, &pubk, &wb), 240308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_data() hash ok"); 241108d991c678f80c99967bd07035de7418c81a072Randall Spangler 242108d991c678f80c99967bd07035de7418c81a072Randall Spangler *((uint8_t *)sig + sig->sig_offset) ^= 0xab; 243308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_data(test_data, sizeof(test_data), sig, &pubk, &wb), 244308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler VB2_ERROR_VDATA_VERIFY_DIGEST, "vb2_verify_data() hash bad"); 245108d991c678f80c99967bd07035de7418c81a072Randall Spangler 246108d991c678f80c99967bd07035de7418c81a072Randall Spangler free(sig); 247108d991c678f80c99967bd07035de7418c81a072Randall Spangler} 248108d991c678f80c99967bd07035de7418c81a072Randall Spangler 249108d991c678f80c99967bd07035de7418c81a072Randall Spangler/** 250108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Verify keyblock 251108d991c678f80c99967bd07035de7418c81a072Randall Spangler */ 252108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic void test_verify_keyblock(void) 253108d991c678f80c99967bd07035de7418c81a072Randall Spangler{ 254108d991c678f80c99967bd07035de7418c81a072Randall Spangler const char desc[16] = "test keyblock"; 255108d991c678f80c99967bd07035de7418c81a072Randall Spangler const struct vb2_private_key *prik[2]; 256108d991c678f80c99967bd07035de7418c81a072Randall Spangler struct vb2_public_key pubk, pubk2, pubk3; 257308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler struct vb2_signature *sig; 258308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler struct vb2_keyblock *kbuf; 259108d991c678f80c99967bd07035de7418c81a072Randall Spangler uint32_t buf_size; 260108d991c678f80c99967bd07035de7418c81a072Randall Spangler uint8_t *buf, *buf2; 261108d991c678f80c99967bd07035de7418c81a072Randall Spangler 26273e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson uint8_t workbuf[VB2_KEY_BLOCK_VERIFY_WORKBUF_BYTES] 26373e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson __attribute__ ((aligned (VB2_WORKBUF_ALIGN))); 264108d991c678f80c99967bd07035de7418c81a072Randall Spangler struct vb2_workbuf wb; 265108d991c678f80c99967bd07035de7418c81a072Randall Spangler 266108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_public_key_hash(&pubk, VB2_HASH_SHA256), 267108d991c678f80c99967bd07035de7418c81a072Randall Spangler "create hash key 1"); 268108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_public_key_hash(&pubk2, VB2_HASH_SHA512), 269108d991c678f80c99967bd07035de7418c81a072Randall Spangler "create hash key 2"); 270108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_public_key_hash(&pubk3, VB2_HASH_SHA1), 271108d991c678f80c99967bd07035de7418c81a072Randall Spangler "create hash key 3"); 272108d991c678f80c99967bd07035de7418c81a072Randall Spangler 273108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_private_key_hash(prik + 0, VB2_HASH_SHA256), 274108d991c678f80c99967bd07035de7418c81a072Randall Spangler "create private key 1"); 275108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_private_key_hash(prik + 1, VB2_HASH_SHA512), 276108d991c678f80c99967bd07035de7418c81a072Randall Spangler "create private key 2"); 277108d991c678f80c99967bd07035de7418c81a072Randall Spangler 278108d991c678f80c99967bd07035de7418c81a072Randall Spangler /* Create the test keyblock */ 279108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_keyblock_create(&kbuf, &pubk3, prik, 2, 0x4321, desc), 280108d991c678f80c99967bd07035de7418c81a072Randall Spangler "create keyblock"); 281108d991c678f80c99967bd07035de7418c81a072Randall Spangler 282108d991c678f80c99967bd07035de7418c81a072Randall Spangler buf = (uint8_t *)kbuf; 283108d991c678f80c99967bd07035de7418c81a072Randall Spangler buf_size = kbuf->c.total_size; 284108d991c678f80c99967bd07035de7418c81a072Randall Spangler 285108d991c678f80c99967bd07035de7418c81a072Randall Spangler /* Make a copy of the buffer, so we can mangle it for tests */ 286108d991c678f80c99967bd07035de7418c81a072Randall Spangler buf2 = malloc(buf_size); 287108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf2, buf, buf_size); 288108d991c678f80c99967bd07035de7418c81a072Randall Spangler 289108d991c678f80c99967bd07035de7418c81a072Randall Spangler vb2_workbuf_init(&wb, workbuf, sizeof(workbuf)); 290308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler kbuf = (struct vb2_keyblock *)buf; 291108d991c678f80c99967bd07035de7418c81a072Randall Spangler 292308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_SUCC(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb), 293308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_keyblock()"); 294108d991c678f80c99967bd07035de7418c81a072Randall Spangler 295108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 296308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_SUCC(vb2_verify_keyblock(kbuf, buf_size, &pubk2, &wb), 297308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_keyblock() key 2"); 298108d991c678f80c99967bd07035de7418c81a072Randall Spangler 299108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 300308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk3, &wb), 301108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_KEYBLOCK_SIG_GUID, 302308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_keyblock() key not present"); 303108d991c678f80c99967bd07035de7418c81a072Randall Spangler 304108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 305308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler kbuf->c.magic = VB2_MAGIC_PACKED_KEY; 306308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb), 307108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_KEYBLOCK_MAGIC, 308308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_keyblock() magic"); 309108d991c678f80c99967bd07035de7418c81a072Randall Spangler 310108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 311108d991c678f80c99967bd07035de7418c81a072Randall Spangler kbuf->c.fixed_size++; 312308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb), 313108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_FIXED_UNALIGNED, 314308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_keyblock() header"); 315108d991c678f80c99967bd07035de7418c81a072Randall Spangler 316108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 317108d991c678f80c99967bd07035de7418c81a072Randall Spangler kbuf->c.struct_version_major++; 318308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb), 319108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_KEYBLOCK_HEADER_VERSION, 320308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_keyblock() major version"); 321108d991c678f80c99967bd07035de7418c81a072Randall Spangler 322108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 323108d991c678f80c99967bd07035de7418c81a072Randall Spangler kbuf->c.struct_version_minor++; 324108d991c678f80c99967bd07035de7418c81a072Randall Spangler /* That changes the signature, so resign the keyblock */ 325108d991c678f80c99967bd07035de7418c81a072Randall Spangler vb2_sign_data(&sig, buf, kbuf->sig_offset, prik[0], NULL); 326108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf + kbuf->sig_offset, sig, sig->c.total_size); 327108d991c678f80c99967bd07035de7418c81a072Randall Spangler free(sig); 328308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_SUCC(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb), 329308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_keyblock() minor version"); 330108d991c678f80c99967bd07035de7418c81a072Randall Spangler 331108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 332108d991c678f80c99967bd07035de7418c81a072Randall Spangler kbuf->c.fixed_size -= 4; 333108d991c678f80c99967bd07035de7418c81a072Randall Spangler kbuf->c.desc_size += 4; 334308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb), 335108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_KEYBLOCK_SIZE, 336308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_keyblock() header size"); 337108d991c678f80c99967bd07035de7418c81a072Randall Spangler 338108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 339108d991c678f80c99967bd07035de7418c81a072Randall Spangler kbuf->key_offset = kbuf->c.total_size - 4; 340308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb), 341108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_MEMBER_SIZE, 342308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_keyblock() data key outside"); 343108d991c678f80c99967bd07035de7418c81a072Randall Spangler 344108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 345308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler sig = (struct vb2_signature *)(buf + kbuf->sig_offset); 346108d991c678f80c99967bd07035de7418c81a072Randall Spangler sig->data_size--; 347308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb), 348108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_KEYBLOCK_SIGNED_SIZE, 349308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_keyblock() signed wrong size"); 350108d991c678f80c99967bd07035de7418c81a072Randall Spangler 351108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 352308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler sig = (struct vb2_signature *)(buf + kbuf->sig_offset); 353108d991c678f80c99967bd07035de7418c81a072Randall Spangler sig->c.total_size = kbuf->c.total_size - 4; 354308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb), 355108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_TOTAL_SIZE, 356308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_keyblock() key outside keyblock"); 357108d991c678f80c99967bd07035de7418c81a072Randall Spangler 358108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 359308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler sig = (struct vb2_signature *)(buf + kbuf->sig_offset); 360108d991c678f80c99967bd07035de7418c81a072Randall Spangler sig->c.struct_version_major++; 361308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb), 362108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_SIG_VERSION, 363308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_keyblock() corrupt key"); 364108d991c678f80c99967bd07035de7418c81a072Randall Spangler 365108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 366108d991c678f80c99967bd07035de7418c81a072Randall Spangler kbuf->c.struct_version_minor++; 367308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_keyblock(kbuf, buf_size, &pubk, &wb), 368108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_VDATA_VERIFY_DIGEST, 369308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_keyblock() corrupt"); 370108d991c678f80c99967bd07035de7418c81a072Randall Spangler 371108d991c678f80c99967bd07035de7418c81a072Randall Spangler free(buf); 372108d991c678f80c99967bd07035de7418c81a072Randall Spangler free(buf2); 373108d991c678f80c99967bd07035de7418c81a072Randall Spangler} 374108d991c678f80c99967bd07035de7418c81a072Randall Spangler 375108d991c678f80c99967bd07035de7418c81a072Randall Spangler/** 376108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Verify firmware preamble 377108d991c678f80c99967bd07035de7418c81a072Randall Spangler */ 378108d991c678f80c99967bd07035de7418c81a072Randall Spanglerstatic void test_verify_fw_preamble(void) 379108d991c678f80c99967bd07035de7418c81a072Randall Spangler{ 380108d991c678f80c99967bd07035de7418c81a072Randall Spangler const char desc[16] = "test preamble"; 381108d991c678f80c99967bd07035de7418c81a072Randall Spangler const struct vb2_private_key *prikhash; 382308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler struct vb2_signature *hashes[3]; 383108d991c678f80c99967bd07035de7418c81a072Randall Spangler struct vb2_public_key pubk; 384308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler struct vb2_signature *sig; 385308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler struct vb2_fw_preamble *pre; 386108d991c678f80c99967bd07035de7418c81a072Randall Spangler uint32_t buf_size; 387108d991c678f80c99967bd07035de7418c81a072Randall Spangler uint8_t *buf, *buf2; 388108d991c678f80c99967bd07035de7418c81a072Randall Spangler 38973e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson uint8_t workbuf[VB2_VERIFY_FIRMWARE_PREAMBLE_WORKBUF_BYTES] 39073e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson __attribute__ ((aligned (VB2_WORKBUF_ALIGN))); 391108d991c678f80c99967bd07035de7418c81a072Randall Spangler struct vb2_workbuf wb; 392108d991c678f80c99967bd07035de7418c81a072Randall Spangler 393108d991c678f80c99967bd07035de7418c81a072Randall Spangler /* 394108d991c678f80c99967bd07035de7418c81a072Randall Spangler * Preambles will usually be signed with a real key not a bare hash, 395308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler * but the call to vb2_verify_data() inside the preamble check is the 396108d991c678f80c99967bd07035de7418c81a072Randall Spangler * same (and its functionality is verified separately), and using a 397108d991c678f80c99967bd07035de7418c81a072Randall Spangler * bare hash here saves us from needing to have a private key to do 398108d991c678f80c99967bd07035de7418c81a072Randall Spangler * this test. 399108d991c678f80c99967bd07035de7418c81a072Randall Spangler */ 400108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_public_key_hash(&pubk, VB2_HASH_SHA256), 401108d991c678f80c99967bd07035de7418c81a072Randall Spangler "create hash key"); 402108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_private_key_hash(&prikhash, VB2_HASH_SHA256), 403108d991c678f80c99967bd07035de7418c81a072Randall Spangler "Create private hash key"); 404108d991c678f80c99967bd07035de7418c81a072Randall Spangler 405108d991c678f80c99967bd07035de7418c81a072Randall Spangler /* Create some signatures */ 406108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_sign_data(hashes + 0, test_data, sizeof(test_data), 407108d991c678f80c99967bd07035de7418c81a072Randall Spangler prikhash, "Hash 1"), 408108d991c678f80c99967bd07035de7418c81a072Randall Spangler "Hash 1"); 409108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_sign_data(hashes + 1, test_data2, sizeof(test_data2), 410108d991c678f80c99967bd07035de7418c81a072Randall Spangler prikhash, "Hash 2"), 411108d991c678f80c99967bd07035de7418c81a072Randall Spangler "Hash 2"); 412108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_sign_data(hashes + 2, test_data3, sizeof(test_data3), 413108d991c678f80c99967bd07035de7418c81a072Randall Spangler prikhash, "Hash 3"), 414108d991c678f80c99967bd07035de7418c81a072Randall Spangler "Hash 3"); 415108d991c678f80c99967bd07035de7418c81a072Randall Spangler 416108d991c678f80c99967bd07035de7418c81a072Randall Spangler /* Test good preamble */ 417108d991c678f80c99967bd07035de7418c81a072Randall Spangler TEST_SUCC(vb2_fw_preamble_create(&pre, prikhash, 418308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler (const struct vb2_signature **)hashes, 419108d991c678f80c99967bd07035de7418c81a072Randall Spangler 3, 0x1234, 0x5678, desc), 420108d991c678f80c99967bd07035de7418c81a072Randall Spangler "Create preamble good"); 421108d991c678f80c99967bd07035de7418c81a072Randall Spangler 422108d991c678f80c99967bd07035de7418c81a072Randall Spangler buf = (uint8_t *)pre; 423108d991c678f80c99967bd07035de7418c81a072Randall Spangler buf_size = pre->c.total_size; 424108d991c678f80c99967bd07035de7418c81a072Randall Spangler 425108d991c678f80c99967bd07035de7418c81a072Randall Spangler /* Make a copy of the buffer, so we can mangle it for tests */ 426108d991c678f80c99967bd07035de7418c81a072Randall Spangler buf2 = malloc(buf_size); 427108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf2, buf, buf_size); 428108d991c678f80c99967bd07035de7418c81a072Randall Spangler 429108d991c678f80c99967bd07035de7418c81a072Randall Spangler vb2_workbuf_init(&wb, workbuf, sizeof(workbuf)); 430308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler pre = (struct vb2_fw_preamble *)buf; 431108d991c678f80c99967bd07035de7418c81a072Randall Spangler 432308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_SUCC(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb), 433308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_fw_preamble()"); 434108d991c678f80c99967bd07035de7418c81a072Randall Spangler 435108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 436308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler pre->c.magic = VB2_MAGIC_PACKED_KEY; 437308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb), 438108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_PREAMBLE_MAGIC, 439308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_fw_preamble() magic"); 440108d991c678f80c99967bd07035de7418c81a072Randall Spangler 441108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 442108d991c678f80c99967bd07035de7418c81a072Randall Spangler pre->c.fixed_size++; 443308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb), 444108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_FIXED_UNALIGNED, 445308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_fw_preamble() header"); 446108d991c678f80c99967bd07035de7418c81a072Randall Spangler 447108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 448108d991c678f80c99967bd07035de7418c81a072Randall Spangler pre->c.struct_version_major++; 449308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb), 450108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_PREAMBLE_HEADER_VERSION, 451308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_fw_preamble() major version"); 452108d991c678f80c99967bd07035de7418c81a072Randall Spangler 453108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 454108d991c678f80c99967bd07035de7418c81a072Randall Spangler pre->c.struct_version_minor++; 455108d991c678f80c99967bd07035de7418c81a072Randall Spangler /* That changes the signature, so resign the fw_preamble */ 456108d991c678f80c99967bd07035de7418c81a072Randall Spangler vb2_sign_data(&sig, buf, pre->sig_offset, prikhash, NULL); 457108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf + pre->sig_offset, sig, sig->c.total_size); 458108d991c678f80c99967bd07035de7418c81a072Randall Spangler free(sig); 459308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_SUCC(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb), 460308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_fw_preamble() minor version"); 461108d991c678f80c99967bd07035de7418c81a072Randall Spangler 462108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 463108d991c678f80c99967bd07035de7418c81a072Randall Spangler pre->c.fixed_size -= 4; 464108d991c678f80c99967bd07035de7418c81a072Randall Spangler pre->c.desc_size += 4; 465308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb), 466108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_PREAMBLE_SIZE, 467308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_fw_preamble() header size"); 468108d991c678f80c99967bd07035de7418c81a072Randall Spangler 469108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 470308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler sig = (struct vb2_signature *)(buf + pre->hash_offset); 471108d991c678f80c99967bd07035de7418c81a072Randall Spangler sig->c.total_size += pre->c.total_size; 472308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb), 473108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_TOTAL_SIZE, 474308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_fw_preamble() hash size"); 475108d991c678f80c99967bd07035de7418c81a072Randall Spangler 476108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 477308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler sig = (struct vb2_signature *)(buf + pre->hash_offset); 478108d991c678f80c99967bd07035de7418c81a072Randall Spangler sig->sig_size /= 2; 479308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb), 480108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_SIG_SIZE, 481308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_fw_preamble() hash integrity"); 482108d991c678f80c99967bd07035de7418c81a072Randall Spangler 483108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 484108d991c678f80c99967bd07035de7418c81a072Randall Spangler pre->hash_count++; 485308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb), 486108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_MEMBER_OVERLAP, 487308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_fw_preamble() hash count"); 488108d991c678f80c99967bd07035de7418c81a072Randall Spangler 489108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 490308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler sig = (struct vb2_signature *)(buf + pre->sig_offset); 491108d991c678f80c99967bd07035de7418c81a072Randall Spangler sig->c.total_size += 4; 492308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb), 493108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_COMMON_TOTAL_SIZE, 494308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_fw_preamble() sig inside"); 495108d991c678f80c99967bd07035de7418c81a072Randall Spangler 496108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 497308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler sig = (struct vb2_signature *)(buf + pre->sig_offset); 498108d991c678f80c99967bd07035de7418c81a072Randall Spangler buf[pre->sig_offset + sig->sig_offset]++; 499308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb), 500108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_VDATA_VERIFY_DIGEST, 501308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_fw_preamble() sig corrupt"); 502108d991c678f80c99967bd07035de7418c81a072Randall Spangler 503108d991c678f80c99967bd07035de7418c81a072Randall Spangler memcpy(buf, buf2, buf_size); 504108d991c678f80c99967bd07035de7418c81a072Randall Spangler pre->flags++; 505308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler TEST_EQ(vb2_verify_fw_preamble(pre, buf_size, &pubk, &wb), 506108d991c678f80c99967bd07035de7418c81a072Randall Spangler VB2_ERROR_VDATA_VERIFY_DIGEST, 507308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler "vb2_verify_fw_preamble() preamble corrupt"); 508108d991c678f80c99967bd07035de7418c81a072Randall Spangler 509108d991c678f80c99967bd07035de7418c81a072Randall Spangler free(buf); 510108d991c678f80c99967bd07035de7418c81a072Randall Spangler free(buf2); 511108d991c678f80c99967bd07035de7418c81a072Randall Spangler} 512108d991c678f80c99967bd07035de7418c81a072Randall Spangler 513108d991c678f80c99967bd07035de7418c81a072Randall Spanglerint main(int argc, char* argv[]) 514108d991c678f80c99967bd07035de7418c81a072Randall Spangler{ 515108d991c678f80c99967bd07035de7418c81a072Randall Spangler test_struct_packing(); 516108d991c678f80c99967bd07035de7418c81a072Randall Spangler test_common_header_functions(); 517108d991c678f80c99967bd07035de7418c81a072Randall Spangler test_sig_size(); 518108d991c678f80c99967bd07035de7418c81a072Randall Spangler test_verify_hash(); 519108d991c678f80c99967bd07035de7418c81a072Randall Spangler test_verify_keyblock(); 520108d991c678f80c99967bd07035de7418c81a072Randall Spangler test_verify_fw_preamble(); 521108d991c678f80c99967bd07035de7418c81a072Randall Spangler 522108d991c678f80c99967bd07035de7418c81a072Randall Spangler return gTestSuccess ? 0 : 255; 523108d991c678f80c99967bd07035de7418c81a072Randall Spangler} 524