From a283d19f82ddb635d9d9fa061e7fd956167ebe60 Mon Sep 17 00:00:00 2001 From: Rohit Ner Date: Fri, 6 May 2022 07:58:21 +0000 Subject: [PATCH] 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 Change-Id: I49bca7aab2c3884881c4b7d90d31786a895290e6 --- drivers/partition/partition.c | 23 +++++++++++++++++++++-- include/drivers/partition/partition.h | 4 +++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/drivers/partition/partition.c b/drivers/partition/partition.c index 7706f88af..c84816f41 100644 --- a/drivers/partition/partition.c +++ b/drivers/partition/partition.c @@ -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 #include +#include #include #include #include @@ -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) { diff --git a/include/drivers/partition/partition.h b/include/drivers/partition/partition.h index b292ec7b2..11e5acf72 100644 --- a/include/drivers/partition/partition.h +++ b/include/drivers/partition/partition.h @@ -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;