From 2e13c372f1419f08dab7797b244681f889dd9bcf Mon Sep 17 00:00:00 2001 From: Michal Hanus Date: Mon, 14 Apr 2025 22:04:32 +0200 Subject: nrfdemo --- .../build/tfm/api_ns/platform/common/attest_hal.c | 170 +++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 nrfdemo/build/tfm/api_ns/platform/common/attest_hal.c (limited to 'nrfdemo/build/tfm/api_ns/platform/common/attest_hal.c') diff --git a/nrfdemo/build/tfm/api_ns/platform/common/attest_hal.c b/nrfdemo/build/tfm/api_ns/platform/common/attest_hal.c new file mode 100644 index 0000000..4fe9c93 --- /dev/null +++ b/nrfdemo/build/tfm/api_ns/platform/common/attest_hal.c @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2018-2021, Arm Limited. All rights reserved. + * Copyright (c) 2022 Nordic Semiconductor ASA. + * + * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause + * + */ + +#include +#include +#include "tfm_attest_hal.h" +#include "tfm_plat_boot_seed.h" +#include "tfm_plat_device_id.h" +#include "tfm_plat_otp.h" +#include +#include "tfm_strnlen.h" +#include "nrf_provisioning.h" +#include +#include + +static enum tfm_security_lifecycle_t map_bl_storage_lcs_to_tfm_slc(enum lcs lcs) +{ + switch (lcs) { + case BL_STORAGE_LCS_ASSEMBLY: + return TFM_SLC_ASSEMBLY_AND_TEST; + case BL_STORAGE_LCS_PROVISIONING: + return TFM_SLC_PSA_ROT_PROVISIONING; + case BL_STORAGE_LCS_SECURED: + return TFM_SLC_SECURED; + case BL_STORAGE_LCS_DECOMMISSIONED: + return TFM_SLC_DECOMMISSIONED; + default: + return TFM_SLC_UNKNOWN; + } +} + +static enum lcs map_tfm_slc_to_bl_storage_lcs(enum tfm_security_lifecycle_t lcs) +{ + switch (lcs) { + case TFM_SLC_ASSEMBLY_AND_TEST: + return BL_STORAGE_LCS_ASSEMBLY; + case TFM_SLC_PSA_ROT_PROVISIONING: + return BL_STORAGE_LCS_PROVISIONING; + case TFM_SLC_SECURED: + return BL_STORAGE_LCS_SECURED; + case TFM_SLC_DECOMMISSIONED: + return BL_STORAGE_LCS_DECOMMISSIONED; + default: + return BL_STORAGE_LCS_UNKNOWN; + } +} + +enum tfm_security_lifecycle_t tfm_attest_hal_get_security_lifecycle(void) +{ + int err; + enum lcs otp_lcs; + + err = read_life_cycle_state(&otp_lcs); + if (err != 0) { + return TFM_SLC_UNKNOWN; + } + + return map_bl_storage_lcs_to_tfm_slc(otp_lcs); +} + +int tfm_attest_update_security_lifecycle_otp(enum tfm_security_lifecycle_t slc) +{ + enum lcs next_lcs; + + next_lcs = map_tfm_slc_to_bl_storage_lcs(slc); + + return update_life_cycle_state(next_lcs); +} + +enum tfm_plat_err_t tfm_attest_hal_get_verification_service(uint32_t *size, uint8_t *buf) +{ + enum tfm_plat_err_t err; + size_t otp_size; + size_t copy_size; + + err = tfm_plat_otp_read(PLAT_OTP_ID_VERIFICATION_SERVICE_URL, *size, buf); + if (err != TFM_PLAT_ERR_SUCCESS) { + return err; + } + + err = tfm_plat_otp_get_size(PLAT_OTP_ID_VERIFICATION_SERVICE_URL, &otp_size); + if (err != TFM_PLAT_ERR_SUCCESS) { + return err; + } + + /* Actually copied data is always the smaller */ + copy_size = *size < otp_size ? *size : otp_size; + /* String content */ + *size = tfm_strnlen((char *)buf, copy_size); + + return TFM_PLAT_ERR_SUCCESS; +} + +enum tfm_plat_err_t tfm_attest_hal_get_profile_definition(uint32_t *size, uint8_t *buf) +{ + enum tfm_plat_err_t err; + size_t otp_size; + size_t copy_size; + + err = tfm_plat_otp_read(PLAT_OTP_ID_PROFILE_DEFINITION, *size, buf); + if (err != TFM_PLAT_ERR_SUCCESS) { + return err; + } + + err = tfm_plat_otp_get_size(PLAT_OTP_ID_PROFILE_DEFINITION, &otp_size); + if (err != TFM_PLAT_ERR_SUCCESS) { + return err; + } + + /* Actually copied data is always the smaller */ + copy_size = *size < otp_size ? *size : otp_size; + /* String content */ + *size = tfm_strnlen((char *)buf, copy_size); + + return TFM_PLAT_ERR_SUCCESS; +} + +enum tfm_plat_err_t tfm_plat_get_boot_seed(uint32_t size, uint8_t *buf) +{ + int nrf_err; + + if (size != NRF_CC3XX_PLATFORM_TFM_BOOT_SEED_SIZE) { + return TFM_PLAT_ERR_INVALID_INPUT; + } + + nrf_err = nrf_cc3xx_platform_get_boot_seed(buf); + if (nrf_err != NRF_CC3XX_PLATFORM_SUCCESS) { + return TFM_PLAT_ERR_SYSTEM_ERR; + } + + return TFM_PLAT_ERR_SUCCESS; +} + +enum tfm_plat_err_t tfm_plat_get_implementation_id(uint32_t *size, uint8_t *buf) +{ + *size = BL_STORAGE_IMPLEMENTATION_ID_SIZE; + read_implementation_id_from_otp(buf); + + return TFM_PLAT_ERR_SUCCESS; +} + +enum tfm_plat_err_t tfm_plat_get_cert_ref(uint32_t *size, uint8_t *buf) + +{ + enum tfm_plat_err_t err; + size_t otp_size; + size_t copy_size; + + err = tfm_plat_otp_read(PLAT_OTP_ID_CERT_REF, *size, buf); + if (err != TFM_PLAT_ERR_SUCCESS) { + return err; + } + + err = tfm_plat_otp_get_size(PLAT_OTP_ID_CERT_REF, &otp_size); + if (err != TFM_PLAT_ERR_SUCCESS) { + return err; + } + + /* Actually copied data is always the smaller */ + copy_size = *size < otp_size ? *size : otp_size; + /* String content */ + *size = tfm_strnlen((char *)buf, copy_size); + + return TFM_PLAT_ERR_SUCCESS; +} -- cgit v1.2.3