mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-25 22:35:42 +00:00
feat(partition): verify crc while loading gpt header
This change makes use of 32-bit crc for calculating gpt header crc and compares it with the given value. Signed-off-by: Rohit Ner <rohitner@google.com> Change-Id: I49bca7aab2c3884881c4b7d90d31786a895290e6
This commit is contained in:
parent
e682c723cd
commit
a283d19f82
2 changed files with 24 additions and 3 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2016-2019, ARM Limited and Contributors. All rights reserved.
|
||||
* Copyright (c) 2016-2022, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
@ -10,6 +10,7 @@
|
|||
#include <string.h>
|
||||
|
||||
#include <common/debug.h>
|
||||
#include <common/tf_crc32.h>
|
||||
#include <drivers/io/io_storage.h>
|
||||
#include <drivers/partition/efi.h>
|
||||
#include <drivers/partition/partition.h>
|
||||
|
@ -76,7 +77,7 @@ static int load_mbr_header(uintptr_t image_handle, mbr_entry_t *mbr_entry)
|
|||
}
|
||||
|
||||
/*
|
||||
* Load GPT header and check the GPT signature.
|
||||
* Load GPT header and check the GPT signature and header CRC.
|
||||
* If partition numbers could be found, check & update it.
|
||||
*/
|
||||
static int load_gpt_header(uintptr_t image_handle)
|
||||
|
@ -84,6 +85,7 @@ static int load_gpt_header(uintptr_t image_handle)
|
|||
gpt_header_t header;
|
||||
size_t bytes_read;
|
||||
int result;
|
||||
uint32_t header_crc, calc_crc;
|
||||
|
||||
result = io_seek(image_handle, IO_SEEK_SET, GPT_HEADER_OFFSET);
|
||||
if (result != 0) {
|
||||
|
@ -99,6 +101,23 @@ static int load_gpt_header(uintptr_t image_handle)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* UEFI Spec 2.8 March 2019 Page 119: HeaderCRC32 value is
|
||||
* computed by setting this field to 0, and computing the
|
||||
* 32-bit CRC for HeaderSize bytes.
|
||||
*/
|
||||
header_crc = header.header_crc;
|
||||
header.header_crc = 0U;
|
||||
|
||||
calc_crc = tf_crc32(0U, (uint8_t *)&header, DEFAULT_GPT_HEADER_SIZE);
|
||||
if (header_crc != calc_crc) {
|
||||
ERROR("Invalid GPT Header CRC: Expected 0x%x but got 0x%x.\n",
|
||||
header_crc, calc_crc);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
header.header_crc = header_crc;
|
||||
|
||||
/* partition numbers can't exceed PLAT_PARTITION_MAX_ENTRIES */
|
||||
list.entry_count = header.list_num;
|
||||
if (list.entry_count > PLAT_PARTITION_MAX_ENTRIES) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
|
||||
* Copyright (c) 2016-2022, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
@ -29,6 +29,8 @@ CASSERT((PLAT_PARTITION_BLOCK_SIZE == 512) ||
|
|||
|
||||
#define LEGACY_PARTITION_BLOCK_SIZE 512
|
||||
|
||||
#define DEFAULT_GPT_HEADER_SIZE 92
|
||||
|
||||
typedef struct partition_entry {
|
||||
uint64_t start;
|
||||
uint64_t length;
|
||||
|
|
Loading…
Add table
Reference in a new issue