mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-25 06:19:56 +00:00
feat(drivers/measured_boot): add RSS backend
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
This commit is contained in:
parent
ce0c40edc9
commit
0442ebd2e9
3 changed files with 213 additions and 0 deletions
125
drivers/measured_boot/rss/rss_measured_boot.c
Normal file
125
drivers/measured_boot/rss/rss_measured_boot.c
Normal file
|
@ -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;
|
||||||
|
}
|
35
drivers/measured_boot/rss/rss_measured_boot.mk
Normal file
35
drivers/measured_boot/rss/rss_measured_boot.mk
Normal file
|
@ -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
|
53
include/drivers/measured_boot/rss/rss_measured_boot.h
Normal file
53
include/drivers/measured_boot/rss/rss_measured_boot.h
Normal file
|
@ -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 */
|
Loading…
Add table
Reference in a new issue