<p>Philipp Deppenwiese <strong>merged</strong> this change.</p><p><a href="https://review.coreboot.org/24904">View Change</a></p><div style="white-space:pre-wrap">Approvals:
build bot (Jenkins): Verified
Aaron Durbin: Looks good to me, approved
Philipp Deppenwiese: Looks good to me, approved
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">security/vboot: Add interface for FSP 2.0 mrc caching<br><br>* Move vboot/tpm specific implementation to vboot.<br>* Only call functions if CONFIG_FSP2_0_USES_TPM_MRC_HASH is set.<br>* Preparation for software hash function support, no logic changed.<br><br>Change-Id: I41a458186c7981adaf3fea8974adec2ca8668f14<br>Signed-off-by: Philipp Deppenwiese <zaolin@das-labor.org><br>Reviewed-on: https://review.coreboot.org/24904<br>Reviewed-by: Aaron Durbin <adurbin@chromium.org><br>Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com><br>Tested-by: build bot (Jenkins) <no-reply@coreboot.org><br>---<br>A src/drivers/intel/fsp2_0/include/fsp/memory_init.h<br>M src/drivers/intel/fsp2_0/memory_init.c<br>M src/security/vboot/Makefile.inc<br>A src/security/vboot/mrc_cache_hash_tpm.c<br>4 files changed, 155 insertions(+), 99 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/drivers/intel/fsp2_0/include/fsp/memory_init.h b/src/drivers/intel/fsp2_0/include/fsp/memory_init.h</span><br><span>new file mode 100644</span><br><span>index 0000000..05ea440</span><br><span>--- /dev/null</span><br><span>+++ b/src/drivers/intel/fsp2_0/include/fsp/memory_init.h</span><br><span>@@ -0,0 +1,32 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2018 Facebook Inc</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef _FSP2_0_MEMORY_INIT_H_</span><br><span style="color: hsl(120, 100%, 40%);">+#define _FSP2_0_MEMORY_INIT_H_</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <types.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Updates mrc cache hash if it differs.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void mrc_cache_update_hash(const uint8_t *data, size_t size);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Verifies mrc cache hash which is stored somewhere.</span><br><span style="color: hsl(120, 100%, 40%);">+ * return 1 verification was successful and 0 for error.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int mrc_cache_verify_hash(const uint8_t *data, size_t size);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#endif /* _FSP2_0_MEMORY_INIT_H_ */</span><br><span>diff --git a/src/drivers/intel/fsp2_0/memory_init.c b/src/drivers/intel/fsp2_0/memory_init.c</span><br><span>index 1ca5208..cf033d7 100644</span><br><span>--- a/src/drivers/intel/fsp2_0/memory_init.c</span><br><span>+++ b/src/drivers/intel/fsp2_0/memory_init.c</span><br><span>@@ -31,63 +31,10 @@</span><br><span> #include <string.h></span><br><span> #include <symbols.h></span><br><span> #include <timestamp.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <security/tpm/tspi.h></span><br><span> #include <security/vboot/vboot_common.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <security/tpm/tspi.h></span><br><span> #include <vb2_api.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void mrc_cache_update_tpm_hash(const uint8_t *data, size_t size)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t data_hash[VB2_SHA256_DIGEST_SIZE];</span><br><span style="color: hsl(0, 100%, 40%);">- static const uint8_t dead_hash[VB2_SHA256_DIGEST_SIZE] = {</span><br><span style="color: hsl(0, 100%, 40%);">- 0xba, 0xad, 0xda, 0x1a, /* BAADDA1A */</span><br><span style="color: hsl(0, 100%, 40%);">- 0xde, 0xad, 0xde, 0xad, /* DEADDEAD */</span><br><span style="color: hsl(0, 100%, 40%);">- 0xde, 0xad, 0xda, 0x1a, /* DEADDA1A */</span><br><span style="color: hsl(0, 100%, 40%);">- 0xba, 0xad, 0xba, 0xad, /* BAADBAAD */</span><br><span style="color: hsl(0, 100%, 40%);">- 0xba, 0xad, 0xda, 0x1a, /* BAADDA1A */</span><br><span style="color: hsl(0, 100%, 40%);">- 0xde, 0xad, 0xde, 0xad, /* DEADDEAD */</span><br><span style="color: hsl(0, 100%, 40%);">- 0xde, 0xad, 0xda, 0x1a, /* DEADDA1A */</span><br><span style="color: hsl(0, 100%, 40%);">- 0xba, 0xad, 0xba, 0xad, /* BAADBAAD */</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">- const uint8_t *hash_ptr = data_hash;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* We do not store normal mode data hash in TPM. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!vboot_recovery_mode_enabled())</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Bail out early if no mrc hash space is supported in TPM. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!IS_ENABLED(CONFIG_FSP2_0_USES_TPM_MRC_HASH))</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize TPM driver. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (tlcl_lib_init() != VB2_SUCCESS) {</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_ERR, "MRC: TPM driver initialization failed.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Calculate hash of data generated by MRC. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (vb2_digest_buffer(data, size, VB2_HASH_SHA256, data_hash,</span><br><span style="color: hsl(0, 100%, 40%);">- sizeof(data_hash))) {</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_ERR, "MRC: SHA-256 calculation failed for data. "</span><br><span style="color: hsl(0, 100%, 40%);">- "Not updating TPM hash space.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- /*</span><br><span style="color: hsl(0, 100%, 40%);">- * Since data is being updated in recovery cache, the hash</span><br><span style="color: hsl(0, 100%, 40%);">- * currently stored in TPM recovery hash space is no longer</span><br><span style="color: hsl(0, 100%, 40%);">- * valid. If we are not able to calculate hash of the data being</span><br><span style="color: hsl(0, 100%, 40%);">- * updated, reset all the bits in TPM recovery hash space to</span><br><span style="color: hsl(0, 100%, 40%);">- * pre-defined hash pattern.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">- hash_ptr = dead_hash;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Write hash of data to TPM space. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (antirollback_write_space_rec_hash(hash_ptr, VB2_SHA256_DIGEST_SIZE)</span><br><span style="color: hsl(0, 100%, 40%);">- != TPM_SUCCESS) {</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_ERR, "MRC: Could not save hash to TPM.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_INFO, "MRC: TPM MRC hash updated successfully.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+#include <fsp/memory_init.h></span><br><span> </span><br><span> static void save_memory_training_data(bool s3wake, uint32_t fsp_version)</span><br><span> {</span><br><span>@@ -113,7 +60,8 @@</span><br><span> mrc_data_size) < 0)</span><br><span> printk(BIOS_ERR, "Failed to stash MRC data\n");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- mrc_cache_update_tpm_hash(mrc_data, mrc_data_size);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (IS_ENABLED(CONFIG_FSP2_0_USES_TPM_MRC_HASH))</span><br><span style="color: hsl(120, 100%, 40%);">+ mrc_cache_update_hash(mrc_data, mrc_data_size);</span><br><span> }</span><br><span> </span><br><span> static void do_fsp_post_memory_init(bool s3wake, uint32_t fsp_version)</span><br><span>@@ -156,48 +104,6 @@</span><br><span> tpm_setup(s3wake);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int mrc_cache_verify_tpm_hash(const uint8_t *data, size_t size)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t data_hash[VB2_SHA256_DIGEST_SIZE];</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t tpm_hash[VB2_SHA256_DIGEST_SIZE];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* We do not store normal mode data hash in TPM. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!vboot_recovery_mode_enabled())</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!IS_ENABLED(CONFIG_FSP2_0_USES_TPM_MRC_HASH))</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Calculate hash of data read from RECOVERY_MRC_CACHE. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (vb2_digest_buffer(data, size, VB2_HASH_SHA256, data_hash,</span><br><span style="color: hsl(0, 100%, 40%);">- sizeof(data_hash))) {</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_ERR, "MRC: SHA-256 calculation failed for data.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize TPM driver. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (tlcl_lib_init() != VB2_SUCCESS) {</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_ERR, "MRC: TPM driver initialization failed.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Read hash of MRC data saved in TPM. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (antirollback_read_space_rec_hash(tpm_hash, sizeof(tpm_hash))</span><br><span style="color: hsl(0, 100%, 40%);">- != TPM_SUCCESS) {</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_ERR, "MRC: Could not read hash from TPM.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (memcmp(tpm_hash, data_hash, sizeof(tpm_hash))) {</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_ERR, "MRC: Hash comparison failed.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_INFO, "MRC: Hash comparison successful. "</span><br><span style="color: hsl(0, 100%, 40%);">- "Using data from RECOVERY_MRC_CACHE\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void fsp_fill_mrc_cache(FSPM_ARCH_UPD *arch_upd, uint32_t fsp_version)</span><br><span> {</span><br><span> struct region_device rdev;</span><br><span>@@ -230,7 +136,8 @@</span><br><span> if (data == NULL)</span><br><span> return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!mrc_cache_verify_tpm_hash(data, region_device_sz(&rdev)))</span><br><span style="color: hsl(120, 100%, 40%);">+ if (IS_ENABLED(CONFIG_FSP2_0_USES_TPM_MRC_HASH) &&</span><br><span style="color: hsl(120, 100%, 40%);">+ !mrc_cache_verify_hash(data, region_device_sz(&rdev)))</span><br><span> return;</span><br><span> </span><br><span> /* MRC cache found */</span><br><span>diff --git a/src/security/vboot/Makefile.inc b/src/security/vboot/Makefile.inc</span><br><span>index 75c2a9e..b542425 100644</span><br><span>--- a/src/security/vboot/Makefile.inc</span><br><span>+++ b/src/security/vboot/Makefile.inc</span><br><span>@@ -78,6 +78,8 @@</span><br><span> ramstage-y += common.c</span><br><span> postcar-y += common.c</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+romstage-$(CONFIG_FSP2_0_USES_TPM_MRC_HASH) += mrc_cache_hash_tpm.c</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> ifeq ($(CONFIG_VBOOT_SEPARATE_VERSTAGE),y)</span><br><span> VB_FIRMWARE_ARCH := $(ARCHDIR-$(ARCH-verstage-y))</span><br><span> else</span><br><span>diff --git a/src/security/vboot/mrc_cache_hash_tpm.c b/src/security/vboot/mrc_cache_hash_tpm.c</span><br><span>new file mode 100644</span><br><span>index 0000000..d54f8f4</span><br><span>--- /dev/null</span><br><span>+++ b/src/security/vboot/mrc_cache_hash_tpm.c</span><br><span>@@ -0,0 +1,115 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2018 Facebook Inc</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2015-2016 Intel Corp.</span><br><span style="color: hsl(120, 100%, 40%);">+ * (Written by Andrey Petrov <andrey.petrov@intel.com> for Intel Corp.)</span><br><span style="color: hsl(120, 100%, 40%);">+ * (Written by Alexandru Gagniuc <alexandrux.gagniuc@intel.com> for Intel Corp.)</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <security/vboot/antirollback.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <program_loading.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <security/vboot/vboot_common.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <vb2_api.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <security/tpm/tss.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <fsp/memory_init.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <console/console.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void mrc_cache_update_hash(const uint8_t *data, size_t size)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t data_hash[VB2_SHA256_DIGEST_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+ static const uint8_t dead_hash[VB2_SHA256_DIGEST_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xba, 0xad, 0xda, 0x1a, /* BAADDA1A */</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xde, 0xad, 0xde, 0xad, /* DEADDEAD */</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xde, 0xad, 0xda, 0x1a, /* DEADDA1A */</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xba, 0xad, 0xba, 0xad, /* BAADBAAD */</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xba, 0xad, 0xda, 0x1a, /* BAADDA1A */</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xde, 0xad, 0xde, 0xad, /* DEADDEAD */</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xde, 0xad, 0xda, 0x1a, /* DEADDA1A */</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xba, 0xad, 0xba, 0xad, /* BAADBAAD */</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint8_t *hash_ptr = data_hash;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* We do not store normal mode data hash in TPM. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!vboot_recovery_mode_enabled())</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize TPM driver. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (tlcl_lib_init() != VB2_SUCCESS) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_ERR, "MRC: TPM driver initialization failed.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Calculate hash of data generated by MRC. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (vb2_digest_buffer(data, size, VB2_HASH_SHA256, data_hash,</span><br><span style="color: hsl(120, 100%, 40%);">+ sizeof(data_hash))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_ERR, "MRC: SHA-256 calculation failed for data. "</span><br><span style="color: hsl(120, 100%, 40%);">+ "Not updating TPM hash space.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ /*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Since data is being updated in recovery cache, the hash</span><br><span style="color: hsl(120, 100%, 40%);">+ * currently stored in TPM recovery hash space is no longer</span><br><span style="color: hsl(120, 100%, 40%);">+ * valid. If we are not able to calculate hash of the data being</span><br><span style="color: hsl(120, 100%, 40%);">+ * updated, reset all the bits in TPM recovery hash space to</span><br><span style="color: hsl(120, 100%, 40%);">+ * pre-defined hash pattern.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+ hash_ptr = dead_hash;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Write hash of data to TPM space. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (antirollback_write_space_rec_hash(hash_ptr, VB2_SHA256_DIGEST_SIZE)</span><br><span style="color: hsl(120, 100%, 40%);">+ != TPM_SUCCESS) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_ERR, "MRC: Could not save hash to TPM.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_INFO, "MRC: TPM MRC hash updated successfully.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int mrc_cache_verify_hash(const uint8_t *data, size_t size)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t data_hash[VB2_SHA256_DIGEST_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t tpm_hash[VB2_SHA256_DIGEST_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* We do not store normal mode data hash in TPM. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!vboot_recovery_mode_enabled())</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Calculate hash of data read from RECOVERY_MRC_CACHE. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (vb2_digest_buffer(data, size, VB2_HASH_SHA256, data_hash,</span><br><span style="color: hsl(120, 100%, 40%);">+ sizeof(data_hash))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_ERR, "MRC: SHA-256 calculation failed for data.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize TPM driver. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (tlcl_lib_init() != VB2_SUCCESS) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_ERR, "MRC: TPM driver initialization failed.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Read hash of MRC data saved in TPM. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (antirollback_read_space_rec_hash(tpm_hash, sizeof(tpm_hash))</span><br><span style="color: hsl(120, 100%, 40%);">+ != TPM_SUCCESS) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_ERR, "MRC: Could not read hash from TPM.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (memcmp(tpm_hash, data_hash, sizeof(tpm_hash))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_ERR, "MRC: Hash comparison failed.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_INFO, "MRC: Hash comparison successful. "</span><br><span style="color: hsl(120, 100%, 40%);">+ "Using data from RECOVERY_MRC_CACHE\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/24904">change 24904</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/24904"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I41a458186c7981adaf3fea8974adec2ca8668f14 </div>
<div style="display:none"> Gerrit-Change-Number: 24904 </div>
<div style="display:none"> Gerrit-PatchSet: 13 </div>
<div style="display:none"> Gerrit-Owner: Philipp Deppenwiese <zaolin.daisuki@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Aaron Durbin <adurbin@chromium.org> </div>
<div style="display:none"> Gerrit-Reviewer: Patrick Rudolph <patrick.rudolph@9elements.com> </div>
<div style="display:none"> Gerrit-Reviewer: Paul Menzel <paulepanter@users.sourceforge.net> </div>
<div style="display:none"> Gerrit-Reviewer: Philipp Deppenwiese <zaolin.daisuki@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Werner Zeh <werner.zeh@siemens.com> </div>
<div style="display:none"> Gerrit-Reviewer: build bot (Jenkins) <no-reply@coreboot.org> </div>
<div style="display:none"> Gerrit-CC: Patrick Rudolph <siro@das-labor.org> </div>