tf-a/tf-a-stm32mp-2.2.r1/plat/st/common/stm32mp_trusted_boot.c

77 lines
1.5 KiB
C

/*
* Copyright (c) 2020, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <endian.h>
#include <errno.h>
#include <limits.h>
#include <platform_def.h>
#include <common/debug.h>
#include <plat/common/platform.h>
static uint32_t root_pk_hash[BOOT_API_SHA256_DIGEST_SIZE_IN_BYTES /
sizeof(uint32_t)];
int plat_get_rotpk_info(void *cookie, void **key_ptr, unsigned int *key_len,
unsigned int *flags)
{
uint32_t otp_idx;
uint32_t otp_val;
uint32_t len;
size_t i;
if (cookie != NULL) {
return -EINVAL;
}
if (stm32_get_otp_index(PKH_OTP, &otp_idx, &len) != 0) {
VERBOSE("get_rot_pk_hash: get index error\n");
return -EINVAL;
}
if (len != (CHAR_BIT * BOOT_API_SHA256_DIGEST_SIZE_IN_BYTES)) {
VERBOSE("get_rot_pk_hash: length Error\n");
return -EINVAL;
}
for (i = 0U; i < ARRAY_SIZE(root_pk_hash); i++) {
if (stm32_get_otp_value_from_idx(otp_idx + i, &otp_val) != 0) {
return -EINVAL;
}
root_pk_hash[i] = bswap32(otp_val);
}
*key_ptr = &root_pk_hash;
*key_len = BOOT_API_SHA256_DIGEST_SIZE_IN_BYTES;
*flags = ROTPK_IS_HASH;
if (!stm32mp_is_closed_device()) {
*flags |= ROTPK_NOT_DEPLOYED;
}
return 0;
}
int plat_get_nv_ctr(void *cookie, unsigned int *nv_ctr)
{
/*
* This monotonic counter is the counter used by ROM code
* to identify BL2.
*/
if ((cookie == NULL) &&
(stm32_get_otp_value(MONOTONIC_OTP, nv_ctr) == 0)) {
return 0;
}
return -EINVAL;
}
int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr)
{
return -EINVAL;
}