]> git.baikalelectronics.ru Git - arm-tf.git/commitdiff
feat(drivers/measured_boot): add RSS backend
authorTamas Ban <tamas.ban@arm.com>
Tue, 11 Jan 2022 19:24:24 +0000 (20:24 +0100)
committerDavid Vincze <david.vincze@arm.com>
Wed, 11 May 2022 13:47:02 +0000 (15:47 +0200)
Runtime Security Subsystem (RSS) provides for the host:
- Runtime service to store measurments, which were
  computed by the host during measured boot.

Signed-off-by: Tamas Ban <tamas.ban@arm.com>
Change-Id: Ia9e4e8a1fe8f01a28da1fd8c434b780f2a08f94e

drivers/measured_boot/rss/rss_measured_boot.c [new file with mode: 0644]
drivers/measured_boot/rss/rss_measured_boot.mk [new file with mode: 0644]
include/drivers/measured_boot/rss/rss_measured_boot.h [new file with mode: 0644]

diff --git a/drivers/measured_boot/rss/rss_measured_boot.c b/drivers/measured_boot/rss/rss_measured_boot.c
new file mode 100644 (file)
index 0000000..fe2baf0
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2022, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+#include <assert.h>
+#include <stdint.h>
+
+#include <common/debug.h>
+#include <drivers/auth/crypto_mod.h>
+#include <drivers/measured_boot/rss/rss_measured_boot.h>
+#include <lib/psa/measured_boot.h>
+#include <psa/crypto_types.h>
+#include <psa/crypto_values.h>
+#include <psa/error.h>
+
+#define MBOOT_ALG_SHA512 0
+#define MBOOT_ALG_SHA384 1
+#define MBOOT_ALG_SHA256 2
+
+#if MBOOT_ALG_ID == MBOOT_ALG_SHA512
+#define        CRYPTO_MD_ID            CRYPTO_MD_SHA512
+#define PSA_CRYPTO_MD_ID       PSA_ALG_SHA_512
+#elif MBOOT_ALG_ID == MBOOT_ALG_SHA384
+#define        CRYPTO_MD_ID            CRYPTO_MD_SHA384
+#define PSA_CRYPTO_MD_ID       PSA_ALG_SHA_384
+#elif MBOOT_ALG_ID == MBOOT_ALG_SHA256
+#define        CRYPTO_MD_ID            CRYPTO_MD_SHA256
+#define PSA_CRYPTO_MD_ID       PSA_ALG_SHA_256
+#else
+#  error Invalid Measured Boot algorithm.
+#endif /* MBOOT_ALG_ID */
+
+/* Pointer to struct rss_mboot_metadata */
+static struct rss_mboot_metadata *plat_metadata_ptr;
+
+/* Functions' declarations */
+void rss_measured_boot_init(void)
+{
+       /* At this point it is expected that communication channel over MHU
+        * is already initialised by platform init.
+        */
+
+       /* Get pointer to platform's struct rss_mboot_metadata structure */
+       plat_metadata_ptr = plat_rss_mboot_get_metadata();
+       assert(plat_metadata_ptr != NULL);
+}
+
+int rss_mboot_measure_and_record(uintptr_t data_base, uint32_t data_size,
+                                uint32_t data_id)
+{
+       unsigned char hash_data[CRYPTO_MD_MAX_SIZE];
+       int rc;
+       psa_status_t ret;
+       const struct rss_mboot_metadata *metadata_ptr = plat_metadata_ptr;
+
+       /* Get the metadata associated with this image. */
+       while ((metadata_ptr->id != RSS_MBOOT_INVALID_ID) &&
+               (metadata_ptr->id != data_id)) {
+               metadata_ptr++;
+       }
+
+       /* If image is not present in metadata array then skip */
+       if (metadata_ptr->id == RSS_MBOOT_INVALID_ID) {
+               return 0;
+       }
+
+       /* Calculate hash */
+       rc = crypto_mod_calc_hash(CRYPTO_MD_ID,
+                                 (void *)data_base, data_size, hash_data);
+       if (rc != 0) {
+               return rc;
+       }
+
+       ret = rss_measured_boot_extend_measurement(
+                                               metadata_ptr->slot,
+                                               metadata_ptr->signer_id,
+                                               metadata_ptr->signer_id_size,
+                                               metadata_ptr->version,
+                                               metadata_ptr->version_size,
+                                               PSA_CRYPTO_MD_ID,
+                                               metadata_ptr->sw_type,
+                                               metadata_ptr->sw_type_size,
+                                               hash_data,
+                                               MBOOT_DIGEST_SIZE,
+                                               metadata_ptr->lock_measurement);
+       if (ret != PSA_SUCCESS) {
+               return ret;
+       }
+
+       return 0;
+}
+
+int rss_mboot_set_signer_id(unsigned int img_id,
+                           const void *pk_ptr,
+                           size_t pk_len)
+{
+       unsigned char hash_data[CRYPTO_MD_MAX_SIZE];
+       struct rss_mboot_metadata *metadata_ptr = plat_metadata_ptr;
+       int rc;
+
+       /* Get the metadata associated with this image. */
+       while ((metadata_ptr->id != RSS_MBOOT_INVALID_ID) &&
+               (metadata_ptr->id != img_id)) {
+               metadata_ptr++;
+       }
+
+       /* If image is not present in metadata array then skip */
+       if (metadata_ptr->id == RSS_MBOOT_INVALID_ID) {
+               return 0;
+       }
+
+       /* Calculate public key hash */
+       rc = crypto_mod_calc_hash(CRYPTO_MD_ID, (void *)pk_ptr,
+                                 pk_len, hash_data);
+       if (rc != 0) {
+               return rc;
+       }
+
+       /* Update metadata struct with the received signer_id */
+       (void)memcpy(metadata_ptr->signer_id, hash_data, MBOOT_DIGEST_SIZE);
+       metadata_ptr->signer_id_size = MBOOT_DIGEST_SIZE;
+
+       return 0;
+}
diff --git a/drivers/measured_boot/rss/rss_measured_boot.mk b/drivers/measured_boot/rss/rss_measured_boot.mk
new file mode 100644 (file)
index 0000000..01545af
--- /dev/null
@@ -0,0 +1,35 @@
+#
+# Copyright (c) 2022, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+# Hash algorithm for measured boot
+# SHA-256 (or stronger) is required.
+# TODO: The measurement algorithm incorrectly suggests that the TPM backend
+#       is used which may not be the case. It is currently being worked on and
+#       soon TPM_HASH_ALG will be replaced by a more generic name.
+TPM_HASH_ALG                   :=      sha256
+
+ifeq (${TPM_HASH_ALG}, sha512)
+    MBOOT_ALG_ID               :=      MBOOT_ALG_SHA512
+    MBOOT_DIGEST_SIZE          :=      64U
+else ifeq (${TPM_HASH_ALG}, sha384)
+    MBOOT_ALG_ID               :=      MBOOT_ALG_SHA384
+    MBOOT_DIGEST_SIZE          :=      48U
+else
+    MBOOT_ALG_ID               :=      MBOOT_ALG_SHA256
+    MBOOT_DIGEST_SIZE          :=      32U
+endif #TPM_HASH_ALG
+
+# Set definitions for Measured Boot driver.
+$(eval $(call add_defines,\
+    $(sort \
+        MBOOT_ALG_ID \
+        MBOOT_DIGEST_SIZE \
+        MBOOT_RSS_BACKEND \
+)))
+
+MEASURED_BOOT_SRC_DIR  := drivers/measured_boot/rss/
+
+MEASURED_BOOT_SOURCES  += ${MEASURED_BOOT_SRC_DIR}rss_measured_boot.c
diff --git a/include/drivers/measured_boot/rss/rss_measured_boot.h b/include/drivers/measured_boot/rss/rss_measured_boot.h
new file mode 100644 (file)
index 0000000..b8cf8da
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2022, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef RSS_MEASURED_BOOT_H
+#define RSS_MEASURED_BOOT_H
+
+#include <stdint.h>
+
+#include <common/debug.h>
+#include <measured_boot.h>
+
+#define RSS_MBOOT_INVALID_ID   UINT32_MAX
+
+/*
+ * Each boot measurement has some metadata (i.e. a string) that identifies
+ * what was measured and how. The sw_type field of the rss_mboot_metadata
+ * structure represents the role of the software component that was measured.
+ * The below macros define strings suitable for the sw_type.
+ * The key thing is to choose meaningful strings so that when the attestation
+ * token is verified, then the different components can be identified.
+ */
+#define RSS_MBOOT_BL2_STRING           "BL_2"
+#define RSS_MBOOT_BL31_STRING          "SECURE_RT_EL3"
+#define RSS_MBOOT_FW_CONFIG_STRING     "FW_CONFIG"
+#define RSS_MBOOT_TB_FW_CONFIG_STRING  "TB_FW_CONFIG"
+#define RSS_MBOOT_RMM_STRING           "RMM"
+
+
+struct rss_mboot_metadata {
+       unsigned int id;
+       uint8_t slot;
+       uint8_t signer_id[SIGNER_ID_MAX_SIZE];
+       size_t  signer_id_size;
+       uint8_t version[VERSION_MAX_SIZE];
+       size_t  version_size;
+       uint8_t sw_type[SW_TYPE_MAX_SIZE];
+       size_t  sw_type_size;
+       bool    lock_measurement;
+};
+
+/* Functions' declarations */
+void rss_measured_boot_init(void);
+struct rss_mboot_metadata *plat_rss_mboot_get_metadata(void);
+int rss_mboot_measure_and_record(uintptr_t data_base, uint32_t data_size,
+                                uint32_t data_id);
+
+/* TODO: These metadata are currently not available during TF-A boot */
+int rss_mboot_set_signer_id(unsigned int img_id, const void *pk_ptr, size_t pk_len);
+
+#endif /* RSS_MEASURED_BOOT_H */