mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-03 03:31:41 +03:00
feat: enable key manager and HUK support for S31
This commit is contained in:
@@ -94,6 +94,14 @@ static inline ds_key_check_t ds_ll_key_error_source(void)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the DS key source.
|
||||
*/
|
||||
static inline void ds_ll_set_key_source(ds_key_source_t key_source)
|
||||
{
|
||||
REG_WRITE(DS_STATIC_REG, key_source);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Write the initialization vector to the corresponding register field.
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,129 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* NOTICE
|
||||
* The hal is not public api, don't use it in application code.
|
||||
******************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "soc/soc_caps.h"
|
||||
|
||||
#if SOC_KEY_MANAGER_SUPPORTED
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "hal/huk_types.h"
|
||||
#include "soc/huk_reg.h"
|
||||
#include "soc/soc_caps.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
static inline void huk_ll_power_up(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/* @brief Configure the HUK mode */
|
||||
static inline void huk_ll_configure_mode(const esp_huk_mode_t huk_mode)
|
||||
{
|
||||
REG_SET_FIELD(HUK_CONF_REG, HUK_MODE, huk_mode);
|
||||
}
|
||||
|
||||
static inline void huk_ll_write_info(const uint8_t *buffer, const size_t size)
|
||||
{
|
||||
memcpy((uint8_t *)HUK_INFO_MEM, buffer, size);
|
||||
}
|
||||
|
||||
static inline void huk_ll_read_info(uint8_t *buffer, const size_t size)
|
||||
{
|
||||
memcpy(buffer, (uint8_t *)HUK_INFO_MEM, size);
|
||||
}
|
||||
|
||||
/* @brief Start the HUK at IDLE state */
|
||||
static inline void huk_ll_start(void)
|
||||
{
|
||||
REG_SET_FIELD(HUK_START_REG, HUK_START, 1);
|
||||
}
|
||||
|
||||
/* @brief Continue HUK operation at LOAD/GAIN state */
|
||||
static inline void huk_ll_continue(void)
|
||||
{
|
||||
REG_SET_FIELD(HUK_START_REG, HUK_CONTINUE, 1);
|
||||
}
|
||||
|
||||
/* @bried Enable or Disable the HUK interrupts */
|
||||
static inline void huk_ll_configure_interrupt(const esp_huk_interrupt_type_t intr, const bool en)
|
||||
{
|
||||
switch (intr) {
|
||||
case ESP_HUK_INT_PREP_DONE:
|
||||
REG_SET_FIELD(HUK_INT_ENA_REG, HUK_PREP_DONE_INT_ENA, en);
|
||||
break;
|
||||
case ESP_HUK_INT_PROC_DONE:
|
||||
REG_SET_FIELD(HUK_INT_ENA_REG, HUK_PROC_DONE_INT_ENA, en);
|
||||
break;
|
||||
case ESP_HUK_INT_POST_DONE:
|
||||
REG_SET_FIELD(HUK_INT_ENA_REG, HUK_POST_DONE_INT_ENA, en);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* @bried Clear the HUK interrupts */
|
||||
static inline void huk_ll_clear_int(const esp_huk_interrupt_type_t intr)
|
||||
{
|
||||
switch (intr) {
|
||||
case ESP_HUK_INT_PREP_DONE:
|
||||
REG_SET_FIELD(HUK_INT_CLR_REG, HUK_PREP_DONE_INT_CLR, 1);
|
||||
break;
|
||||
case ESP_HUK_INT_PROC_DONE:
|
||||
REG_SET_FIELD(HUK_INT_CLR_REG, HUK_PROC_DONE_INT_CLR, 1);
|
||||
break;
|
||||
case ESP_HUK_INT_POST_DONE:
|
||||
REG_SET_FIELD(HUK_INT_CLR_REG, HUK_POST_DONE_INT_CLR, 1);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Read state of Hardware Unique Key Generator
|
||||
*
|
||||
* @return esp_huk_state_t
|
||||
*/
|
||||
static inline esp_huk_state_t huk_ll_get_state(void)
|
||||
{
|
||||
return (esp_huk_state_t) REG_GET_FIELD(HUK_STATE_REG, HUK_STATE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the HUK generation status
|
||||
*/
|
||||
static inline esp_huk_gen_status_t huk_ll_get_gen_status(void)
|
||||
{
|
||||
return (esp_huk_gen_status_t) REG_GET_FIELD(HUK_STATUS_REG, HUK_STATUS);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Read the HUK date information
|
||||
*/
|
||||
static inline uint32_t huk_ll_get_date_info(void)
|
||||
{
|
||||
// Only the least significant 28 bits have desired information
|
||||
return (uint32_t)(0x0FFFFFFF & REG_READ(HUK_DATE_REG));
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
@@ -0,0 +1,470 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* NOTICE
|
||||
* The hal is not public api, don't use it in application code.
|
||||
******************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "hal/assert.h"
|
||||
#include "hal/key_mgr_types.h"
|
||||
#include "soc/keymng_reg.h"
|
||||
#include "soc/hp_sys_clkrst_struct.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* ESP32-S31 Key Manager register differences from ESP32-P4:
|
||||
*
|
||||
* - use_efuse_key: Packed 5-bit field KEYMNG_USE_EFUSE_KEY[4:0] in KEYMNG_STATIC_REG
|
||||
* bit 0: ECDSA, bit 1: Flash, bit 2: HMAC, bit 3: DS, bit 4: PSRAM
|
||||
* - use_efuse_key_lock: Packed 5-bit field KEYMNG_USE_EFUSE_KEY_LOCK[4:0] in KEYMNG_LOCK_REG
|
||||
* Same bit assignment as use_efuse_key
|
||||
* - Clock/Reset: key_manager_ctrl0 register (not peri_clk_ctrl25 / hp_rst_en2)
|
||||
*/
|
||||
|
||||
/* Bit positions within the packed KEYMNG_USE_EFUSE_KEY field */
|
||||
#define KEY_MGR_EFUSE_KEY_ECDSA_BIT 0
|
||||
#define KEY_MGR_EFUSE_KEY_FLASH_BIT 1
|
||||
#define KEY_MGR_EFUSE_KEY_HMAC_BIT 2
|
||||
#define KEY_MGR_EFUSE_KEY_DS_BIT 3
|
||||
#define KEY_MGR_EFUSE_KEY_PSRAM_BIT 4
|
||||
|
||||
static inline void key_mgr_ll_power_up(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void key_mgr_ll_power_down(void)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Enable the bus clock for Key Manager peripheral
|
||||
* Note: Please use key_mgr_ll_enable_bus_clock which requires the critical section
|
||||
* and do not use _key_mgr_ll_enable_bus_clock
|
||||
* @param true to enable, false to disable
|
||||
*/
|
||||
static inline void _key_mgr_ll_enable_bus_clock(bool enable)
|
||||
{
|
||||
HP_SYS_CLKRST.key_manager_ctrl0.reg_key_manager_sys_clk_en = enable;
|
||||
}
|
||||
|
||||
/// use a macro to wrap the function, force the caller to use it in a critical section
|
||||
/// the critical section needs to declare the __DECLARE_RCC_ATOMIC_ENV variable in advance
|
||||
#define key_mgr_ll_enable_bus_clock(...) do { \
|
||||
(void)__DECLARE_RCC_ATOMIC_ENV; \
|
||||
_key_mgr_ll_enable_bus_clock(__VA_ARGS__); \
|
||||
} while(0)
|
||||
|
||||
/**
|
||||
* @brief Enable the peripheral clock for Key Manager
|
||||
*
|
||||
* Note: Please use key_mgr_ll_enable_peripheral_clock which requires the critical section
|
||||
* and do not use _key_mgr_ll_enable_peripheral_clock
|
||||
* @param true to enable, false to disable
|
||||
*/
|
||||
static inline void _key_mgr_ll_enable_peripheral_clock(bool enable)
|
||||
{
|
||||
HP_SYS_CLKRST.key_manager_ctrl0.reg_crypto_km_clk_en = enable;
|
||||
}
|
||||
|
||||
#define key_mgr_ll_enable_peripheral_clock(...) do { \
|
||||
(void)__DECLARE_RCC_ATOMIC_ENV; \
|
||||
_key_mgr_ll_enable_peripheral_clock(__VA_ARGS__); \
|
||||
} while(0)
|
||||
|
||||
/**
|
||||
* @brief Read state of Key Manager
|
||||
*
|
||||
* @return esp_key_mgr_state_t
|
||||
*/
|
||||
static inline esp_key_mgr_state_t key_mgr_ll_get_state(void)
|
||||
{
|
||||
return (esp_key_mgr_state_t) REG_GET_FIELD(KEYMNG_STATE_REG, KEYMNG_STATE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Reset the Key Manager peripheral
|
||||
* Note: Please use key_mgr_ll_reset_register which requires the critical section
|
||||
* and do not use _key_mgr_ll_reset_register
|
||||
*/
|
||||
static inline void _key_mgr_ll_reset_register(void)
|
||||
{
|
||||
HP_SYS_CLKRST.key_manager_ctrl0.reg_crypto_km_rst_en = 1;
|
||||
HP_SYS_CLKRST.key_manager_ctrl0.reg_crypto_km_rst_en = 0;
|
||||
|
||||
while (key_mgr_ll_get_state() != ESP_KEY_MGR_STATE_IDLE) {
|
||||
};
|
||||
}
|
||||
|
||||
/// use a macro to wrap the function, force the caller to use it in a critical section
|
||||
/// the critical section needs to declare the __DECLARE_RCC_ATOMIC_ENV variable in advance
|
||||
#define key_mgr_ll_reset_register(...) do { \
|
||||
(void)__DECLARE_RCC_ATOMIC_ENV; \
|
||||
_key_mgr_ll_reset_register(__VA_ARGS__); \
|
||||
} while(0)
|
||||
|
||||
/* @brief Start the key manager at IDLE state */
|
||||
static inline void key_mgr_ll_start(void)
|
||||
{
|
||||
REG_SET_BIT(KEYMNG_START_REG, KEYMNG_START);
|
||||
}
|
||||
|
||||
/* @brief Continue key manager operation at LOAD/GAIN state */
|
||||
static inline void key_mgr_ll_continue(void)
|
||||
{
|
||||
REG_SET_BIT(KEYMNG_START_REG, KEYMNG_CONTINUE);
|
||||
}
|
||||
|
||||
/* @brief Enable or Disable the KEY_MGR interrupts */
|
||||
static inline void key_mgr_ll_configure_interrupt(const esp_key_mgr_interrupt_type_t intr, bool en)
|
||||
{
|
||||
switch (intr) {
|
||||
case ESP_KEY_MGR_INT_PREP_DONE:
|
||||
REG_SET_FIELD(KEYMNG_INT_ENA_REG, KEYMNG_PREP_DONE_INT_ENA, en);
|
||||
break;
|
||||
case ESP_KEY_MGR_INT_PROC_DONE:
|
||||
REG_SET_FIELD(KEYMNG_INT_ENA_REG, KEYMNG_PROC_DONE_INT_ENA, en);
|
||||
break;
|
||||
case ESP_KEY_MGR_INT_POST_DONE:
|
||||
REG_SET_FIELD(KEYMNG_INT_ENA_REG, KEYMNG_POST_DONE_INT_ENA, en);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* @brief Clear the KEY_MGR interrupts */
|
||||
static inline void key_mgr_ll_clear_int(const esp_key_mgr_interrupt_type_t intr)
|
||||
{
|
||||
switch (intr) {
|
||||
case ESP_KEY_MGR_INT_PREP_DONE:
|
||||
REG_SET_FIELD(KEYMNG_INT_CLR_REG, KEYMNG_PREP_DONE_INT_CLR, 1);
|
||||
break;
|
||||
case ESP_KEY_MGR_INT_PROC_DONE:
|
||||
REG_SET_FIELD(KEYMNG_INT_CLR_REG, KEYMNG_PROC_DONE_INT_CLR, 1);
|
||||
break;
|
||||
case ESP_KEY_MGR_INT_POST_DONE:
|
||||
REG_SET_FIELD(KEYMNG_INT_CLR_REG, KEYMNG_POST_DONE_INT_CLR, 1);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Helper: get the bit position for a key type in the packed use_efuse_key field
|
||||
*/
|
||||
static inline int _key_mgr_ll_get_efuse_key_bit(const esp_key_mgr_key_type_t key_type)
|
||||
{
|
||||
switch (key_type) {
|
||||
case ESP_KEY_MGR_ECDSA_KEY:
|
||||
return KEY_MGR_EFUSE_KEY_ECDSA_BIT;
|
||||
case ESP_KEY_MGR_FLASH_XTS_AES_KEY:
|
||||
return KEY_MGR_EFUSE_KEY_FLASH_BIT;
|
||||
case ESP_KEY_MGR_HMAC_KEY:
|
||||
return KEY_MGR_EFUSE_KEY_HMAC_BIT;
|
||||
case ESP_KEY_MGR_DS_KEY:
|
||||
return KEY_MGR_EFUSE_KEY_DS_BIT;
|
||||
case ESP_KEY_MGR_PSRAM_XTS_AES_KEY:
|
||||
return KEY_MGR_EFUSE_KEY_PSRAM_BIT;
|
||||
default:
|
||||
HAL_ASSERT(false && "Unsupported key type");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the key manager to use the software provided init key
|
||||
*/
|
||||
static inline void key_mgr_ll_use_sw_init_key(void)
|
||||
{
|
||||
REG_SET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_SW_INIT_KEY);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Configure the key manager key usage policy for a particular key type
|
||||
*
|
||||
* On ESP32-S31, use_efuse_key is a packed 5-bit field. We use read-modify-write
|
||||
* to set/clear individual bits.
|
||||
*/
|
||||
static inline void key_mgr_ll_set_key_usage(const esp_key_mgr_key_type_t key_type, const esp_key_mgr_key_usage_t key_usage)
|
||||
{
|
||||
int bit = _key_mgr_ll_get_efuse_key_bit(key_type);
|
||||
if (bit < 0) {
|
||||
return;
|
||||
}
|
||||
uint32_t val = REG_GET_FIELD(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY);
|
||||
if (key_usage == ESP_KEY_MGR_USE_EFUSE_KEY) {
|
||||
val |= (1U << bit);
|
||||
} else {
|
||||
val &= ~(1U << bit);
|
||||
}
|
||||
REG_SET_FIELD(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY, val);
|
||||
}
|
||||
|
||||
static inline esp_key_mgr_key_usage_t key_mgr_ll_get_key_usage(esp_key_mgr_key_type_t key_type)
|
||||
{
|
||||
int bit = _key_mgr_ll_get_efuse_key_bit(key_type);
|
||||
if (bit < 0) {
|
||||
return ESP_KEY_MGR_USAGE_INVALID;
|
||||
}
|
||||
uint32_t val = REG_GET_FIELD(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY);
|
||||
return (val & (1U << bit)) ? ESP_KEY_MGR_USE_EFUSE_KEY : ESP_KEY_MGR_USE_OWN_KEY;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the lock for the use_sw_init_key_reg
|
||||
* After this lock has been set,
|
||||
* The Key manager configuration about the use of software init key cannot be changed
|
||||
*/
|
||||
static inline void key_mgr_ll_lock_use_sw_init_key_reg(void)
|
||||
{
|
||||
REG_SET_BIT(KEYMNG_LOCK_REG, KEYMNG_USE_SW_INIT_KEY_LOCK);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the lock for use_efuse_key for a particular key type
|
||||
* After this lock has been set,
|
||||
* The Key manager configuration about whether to use a particular key from efuse or key manager cannot be changed.
|
||||
*
|
||||
* On ESP32-S31, use_efuse_key_lock is a packed 5-bit field (same bit positions as use_efuse_key).
|
||||
*/
|
||||
static inline void key_mgr_ll_lock_use_efuse_key_reg(esp_key_mgr_key_type_t key_type)
|
||||
{
|
||||
int bit = _key_mgr_ll_get_efuse_key_bit(key_type);
|
||||
if (bit < 0) {
|
||||
return;
|
||||
}
|
||||
uint32_t val = REG_GET_FIELD(KEYMNG_LOCK_REG, KEYMNG_USE_EFUSE_KEY_LOCK);
|
||||
val |= (1U << bit);
|
||||
REG_SET_FIELD(KEYMNG_LOCK_REG, KEYMNG_USE_EFUSE_KEY_LOCK, val);
|
||||
}
|
||||
|
||||
/* @brief Configure the key purpose to be used by the Key Manager for key generator operation */
|
||||
static inline void key_mgr_ll_set_key_purpose(const esp_key_mgr_key_purpose_t key_purpose)
|
||||
{
|
||||
REG_SET_FIELD(KEYMNG_CONF_REG, KEYMNG_KEY_PURPOSE, key_purpose);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Configure the mode which is used by the Key Manager for the generator key deployment process
|
||||
*/
|
||||
static inline void key_mgr_ll_set_key_generator_mode(const esp_key_mgr_key_generator_mode_t mode)
|
||||
{
|
||||
REG_SET_FIELD(KEYMNG_CONF_REG, KEYMNG_KGEN_MODE, mode);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Read the key manager process result
|
||||
* @return 1 for Success
|
||||
* 0 for failure
|
||||
*/
|
||||
static inline bool key_mgr_ll_is_result_success(void)
|
||||
{
|
||||
return REG_GET_FIELD(KEYMNG_RESULT_REG, KEYMNG_PROC_RESULT);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Check if the deployed key is valid or not
|
||||
* @return 1 for Success
|
||||
* 0 for failure
|
||||
*/
|
||||
static inline bool key_mgr_ll_is_key_deployment_valid(const esp_key_mgr_key_type_t key_type, const esp_key_mgr_key_len_t key_len)
|
||||
{
|
||||
switch (key_type) {
|
||||
case ESP_KEY_MGR_ECDSA_KEY:
|
||||
switch (key_len) {
|
||||
case ESP_KEY_MGR_ECDSA_LEN_192:
|
||||
return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_ECDSA_192_VLD);
|
||||
case ESP_KEY_MGR_ECDSA_LEN_256:
|
||||
return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_ECDSA_256_VLD);
|
||||
case ESP_KEY_MGR_ECDSA_LEN_384:
|
||||
return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_ECDSA_384_VLD);
|
||||
default:
|
||||
HAL_ASSERT(false && "Unsupported key type");
|
||||
return 0;
|
||||
}
|
||||
|
||||
case ESP_KEY_MGR_FLASH_XTS_AES_KEY:
|
||||
switch (key_len) {
|
||||
case ESP_KEY_MGR_XTS_AES_LEN_128:
|
||||
case ESP_KEY_MGR_XTS_AES_LEN_256:
|
||||
return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_FLASH_VLD);
|
||||
default:
|
||||
HAL_ASSERT(false && "Unsupported key type");
|
||||
return 0;
|
||||
}
|
||||
|
||||
case ESP_KEY_MGR_HMAC_KEY:
|
||||
return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_HMAC_VLD);
|
||||
|
||||
case ESP_KEY_MGR_DS_KEY:
|
||||
return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_DS_VLD);
|
||||
|
||||
case ESP_KEY_MGR_PSRAM_XTS_AES_KEY:
|
||||
switch (key_len) {
|
||||
case ESP_KEY_MGR_XTS_AES_LEN_128:
|
||||
case ESP_KEY_MGR_XTS_AES_LEN_256:
|
||||
return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_PSRAM_VLD);
|
||||
default:
|
||||
HAL_ASSERT(false && "Unsupported key type");
|
||||
return 0;
|
||||
}
|
||||
|
||||
default:
|
||||
HAL_ASSERT(false && "Unsupported mode");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief Write the SW init key in the key manager registers
|
||||
*
|
||||
* @input
|
||||
* sw_init_key_buf Init key buffer, this should be a readable buffer of data_len size which should contain the sw init key. The buffer must be 32 bit aligned
|
||||
* data_len Length of the init key buffer
|
||||
*/
|
||||
static inline void key_mgr_ll_write_sw_init_key(const uint8_t *sw_init_key_buf, const size_t data_len)
|
||||
{
|
||||
memcpy((uint8_t *)KEYMNG_SW_INIT_KEY_MEM, sw_init_key_buf, data_len);
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief Write the Assist info in the key manager registers
|
||||
*
|
||||
* @input
|
||||
* assist_info_buf Assist info buffer, this should be a readable buffer of data_len size which should contain the assist info. The buffer must be 32 bit aligned
|
||||
* data_len Length of the assist info buffer
|
||||
*/
|
||||
static inline void key_mgr_ll_write_assist_info(const uint8_t *assist_info_buf, const size_t data_len)
|
||||
{
|
||||
memcpy((uint8_t *)KEYMNG_ASSIST_INFO_MEM, assist_info_buf, data_len);
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief Read the Assist info from the key manager registers
|
||||
*
|
||||
* @input
|
||||
* assist_info_buf Assist info buffer, this should be a writable buffer of size KEY_MGR_ASSIST_INFO_LEN. The buffer must be 32 bit aligned
|
||||
*/
|
||||
static inline void key_mgr_ll_read_assist_info(uint8_t *assist_info_buf)
|
||||
{
|
||||
memcpy(assist_info_buf, (uint8_t *)KEYMNG_ASSIST_INFO_MEM, KEY_MGR_ASSIST_INFO_LEN);
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief Write the Public info in the key manager registers
|
||||
* @input
|
||||
* public_info_buf Public info buffer, this should be a readable buffer of data_len size which should contain the public info. The buffer must be 32 bit aligned
|
||||
* data_len Length of the public info buffer
|
||||
*/
|
||||
static inline void key_mgr_ll_write_public_info(const uint8_t *public_info_buf, const size_t data_len)
|
||||
{
|
||||
memcpy((uint8_t *)KEYMNG_PUBLIC_INFO_MEM, public_info_buf, data_len);
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief Read the Public info in the key manager registers
|
||||
* @input
|
||||
* public_info_buf Public info buffer, this should be a writable buffer of read_len, The buffer must be 32 bit aligned
|
||||
* read_len Length of the public info buffer
|
||||
*/
|
||||
static inline void key_mgr_ll_read_public_info(uint8_t *public_info_buf, const size_t read_len)
|
||||
{
|
||||
memcpy(public_info_buf, (uint8_t *)KEYMNG_PUBLIC_INFO_MEM, read_len);
|
||||
}
|
||||
|
||||
static inline bool key_mgr_ll_is_huk_valid(void)
|
||||
{
|
||||
return REG_GET_FIELD(KEYMNG_HUK_VLD_REG, KEYMNG_HUK_VALID);
|
||||
}
|
||||
|
||||
/* @brief Set the XTS-AES (Flash Encryption) key length for the Key Manager */
|
||||
static inline void key_mgr_ll_set_xts_aes_key_len(const esp_key_mgr_key_type_t key_type, const esp_key_mgr_key_len_t key_len)
|
||||
{
|
||||
uint32_t key_len_bit_mask;
|
||||
|
||||
if (key_type == ESP_KEY_MGR_FLASH_XTS_AES_KEY) {
|
||||
key_len_bit_mask = KEYMNG_FLASH_KEY_LEN;
|
||||
} else if (key_type == ESP_KEY_MGR_PSRAM_XTS_AES_KEY) {
|
||||
key_len_bit_mask = KEYMNG_PSRAM_KEY_LEN;
|
||||
} else {
|
||||
HAL_ASSERT(false && "Unsupported key type");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (key_len) {
|
||||
case ESP_KEY_MGR_XTS_AES_LEN_128:
|
||||
REG_CLR_BIT(KEYMNG_STATIC_REG, key_len_bit_mask);
|
||||
break;
|
||||
case ESP_KEY_MGR_XTS_AES_LEN_256:
|
||||
REG_SET_BIT(KEYMNG_STATIC_REG, key_len_bit_mask);
|
||||
break;
|
||||
default:
|
||||
HAL_ASSERT(false && "Unsupported key length");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* @brief Get the XTS-AES (Flash Encryption) key length for the Key Manager */
|
||||
static inline esp_key_mgr_key_len_t key_mgr_ll_get_xts_aes_key_len(const esp_key_mgr_key_type_t key_type)
|
||||
{
|
||||
uint32_t key_len_bit = 0;
|
||||
|
||||
if (key_type == ESP_KEY_MGR_FLASH_XTS_AES_KEY) {
|
||||
key_len_bit = REG_GET_BIT(KEYMNG_STATIC_REG, KEYMNG_FLASH_KEY_LEN);
|
||||
} else if (key_type == ESP_KEY_MGR_PSRAM_XTS_AES_KEY) {
|
||||
key_len_bit = REG_GET_BIT(KEYMNG_STATIC_REG, KEYMNG_PSRAM_KEY_LEN);
|
||||
} else {
|
||||
HAL_ASSERT(false && "Unsupported key type");
|
||||
return (esp_key_mgr_key_len_t) key_len_bit;
|
||||
}
|
||||
|
||||
switch (key_len_bit) {
|
||||
case 0:
|
||||
return ESP_KEY_MGR_XTS_AES_LEN_128;
|
||||
case 1:
|
||||
return ESP_KEY_MGR_XTS_AES_LEN_256;
|
||||
default:
|
||||
HAL_ASSERT(false && "Unsupported key length");
|
||||
return (esp_key_mgr_key_len_t) key_len_bit;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Read the Key Manager date information
|
||||
*/
|
||||
static inline uint32_t key_mgr_ll_get_date_info(void)
|
||||
{
|
||||
// Only the least significant 28 bits have desired information
|
||||
return (uint32_t)(0x0FFFFFFF & REG_READ(KEYMNG_DATE_REG));
|
||||
}
|
||||
|
||||
static inline bool key_mgr_ll_is_supported(void)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool key_mgr_ll_flash_encryption_supported(void)
|
||||
{
|
||||
if (!key_mgr_ll_is_supported()) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user