soc/amd/common/block/gfx: Use TPM-stored hash for vbios cache validation

Write the SHA256 hash of the cached VBIOS data when saving to FMAP,
and use it to validate the data read from FMAP on subsequent boots.

Add TPM2 as a dependency to the selection of VBIOS_CACHE_IN_FMAP.

BUG=b:255812886
TEST=tested with rest of patch train

Change-Id: I9c8f23b000b90a1072aeb7a57d3b7b2b2bc626dc
Signed-off-by: Matt DeVillier <matt.devillier@amd.corp-partner.google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/72402
Reviewed-by: Martin L Roth <gaumless@gmail.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Matt DeVillier 2023-01-23 18:38:45 -06:00 committed by Felix Held
parent 9ce755d05e
commit 1fbc1123d7
2 changed files with 7 additions and 6 deletions

View File

@ -13,7 +13,7 @@ config SOC_AMD_COMMON_BLOCK_GRAPHICS_ATIF
config SOC_AMD_GFX_CACHE_VBIOS_IN_FMAP config SOC_AMD_GFX_CACHE_VBIOS_IN_FMAP
bool "Support for caching modified VBIOS tables in flash" bool "Support for caching modified VBIOS tables in flash"
depends on SOC_AMD_COMMON_BLOCK_GRAPHICS && CHROMEOS && RUN_FSP_GOP depends on SOC_AMD_COMMON_BLOCK_GRAPHICS && CHROMEOS && RUN_FSP_GOP && TPM2
default n default n
help help
Enable support for flash based VBIOS cache. Enable support for flash based VBIOS cache.

View File

@ -9,6 +9,7 @@
#include <device/pci.h> #include <device/pci.h>
#include <fmap.h> #include <fmap.h>
#include <fsp/graphics.h> #include <fsp/graphics.h>
#include <security/vboot/vbios_cache_hash_tpm.h>
#include <security/vboot/vboot_common.h> #include <security/vboot/vboot_common.h>
#include <soc/intel/common/vbt.h> #include <soc/intel/common/vbt.h>
#include <timestamp.h> #include <timestamp.h>
@ -234,6 +235,9 @@ static void write_vbios_cache_to_fmap(void *unused)
VBIOS_CACHE_FMAP_SIZE) != VBIOS_CACHE_FMAP_SIZE) VBIOS_CACHE_FMAP_SIZE) != VBIOS_CACHE_FMAP_SIZE)
printk(BIOS_ERR, "Failed to save vbios data to flash; rdev_writeat() failed.\n"); printk(BIOS_ERR, "Failed to save vbios data to flash; rdev_writeat() failed.\n");
/* save data hash to TPM NVRAM for validation on subsequent boots */
vbios_cache_update_hash(vbios_data, VBIOS_CACHE_FMAP_SIZE);
printk(BIOS_SPEW, "VBIOS cache successfully written to FMAP.\n"); printk(BIOS_SPEW, "VBIOS cache successfully written to FMAP.\n");
} }
@ -254,14 +258,11 @@ void vbios_load_from_cache(void)
/* /*
* Return true if VBIOS cache data is valid * Return true if VBIOS cache data is valid
* *
* For now, just compare first 2 bytes of data * Compare hash of data with hash stored in TPM NVRAM
* TODO: replace with TPM hash verification once implemented
*/ */
bool vbios_cache_is_valid(void) bool vbios_cache_is_valid(void)
{ {
bool is_valid = vbios_data[0] == 0x55 && vbios_data[1] == 0xaa; return vbios_cache_verify_hash(vbios_data, VBIOS_CACHE_FMAP_SIZE) == CB_SUCCESS;
printk(BIOS_SPEW, "VBIOS cache is %s\n", is_valid ? "valid" : "invalid");
return is_valid;
} }
BOOT_STATE_INIT_ENTRY(BS_PRE_DEVICE, BS_ON_EXIT, read_vbios_cache_from_fmap, NULL); BOOT_STATE_INIT_ENTRY(BS_PRE_DEVICE, BS_ON_EXIT, read_vbios_cache_from_fmap, NULL);