diff options
author | Rohit Ner <rohitner@google.com> | 2022-05-06 07:58:21 +0000 |
---|---|---|
committer | Rohit Ner <rohitner@google.com> | 2022-05-18 06:25:47 -0700 |
commit | a283d19f82ddb635d9d9fa061e7fd956167ebe60 (patch) | |
tree | 0a6f286a004670194165e2e71eba9cfe3c0c7b29 | |
parent | e682c723cdbfffbca1204d9977b6846191c561c4 (diff) | |
download | arm-trusted-firmware-a283d19f82ddb635d9d9fa061e7fd956167ebe60.tar.gz |
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
-rw-r--r-- | drivers/partition/partition.c | 23 | ||||
-rw-r--r-- | 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 <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) { 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; |