<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>