@ -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
* SPDX - License - Identifier : BSD - 3 - Clause
*/
*/
@ -10,6 +10,7 @@
# include <string.h>
# include <string.h>
# include <common/debug.h>
# include <common/debug.h>
# include <common/tf_crc32.h>
# include <drivers/io/io_storage.h>
# include <drivers/io/io_storage.h>
# include <drivers/partition/efi.h>
# include <drivers/partition/efi.h>
# include <drivers/partition/partition.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 .
* If partition numbers could be found , check & update it .
*/
*/
static int load_gpt_header ( uintptr_t image_handle )
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 ;
gpt_header_t header ;
size_t bytes_read ;
size_t bytes_read ;
int result ;
int result ;
uint32_t header_crc , calc_crc ;
result = io_seek ( image_handle , IO_SEEK_SET , GPT_HEADER_OFFSET ) ;
result = io_seek ( image_handle , IO_SEEK_SET , GPT_HEADER_OFFSET ) ;
if ( result ! = 0 ) {
if ( result ! = 0 ) {
@ -99,6 +101,23 @@ static int load_gpt_header(uintptr_t image_handle)
return - EINVAL ;
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 */
/* partition numbers can't exceed PLAT_PARTITION_MAX_ENTRIES */
list . entry_count = header . list_num ;
list . entry_count = header . list_num ;
if ( list . entry_count > PLAT_PARTITION_MAX_ENTRIES ) {
if ( list . entry_count > PLAT_PARTITION_MAX_ENTRIES ) {