]> git.baikalelectronics.ru Git - arm-tf.git/commitdiff
feat(partition): verify crc while loading gpt header
authorRohit Ner <rohitner@google.com>
Fri, 6 May 2022 07:58:21 +0000 (07:58 +0000)
committerRohit Ner <rohitner@google.com>
Wed, 18 May 2022 13:25:47 +0000 (06:25 -0700)
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

drivers/partition/partition.c
include/drivers/partition/partition.h

index 7706f88affe8d4d1bb2c02dc723fb1ba92274693..c84816f41d3d8836773f027a7d0f98b7ff3f1eef 100644 (file)
@@ -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) {
index b292ec7b228325128cd999b6c8c2c23df4fac01a..11e5acf724ec07dd9a7934701e1ff1ec688c32ad 100644 (file)
@@ -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;