mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 11:10:54 +03:00
Merge branch 'feat/esp32p4_eco5_support_km_memprot' into 'master'
Support newer Key Manager key sources for ESP32-P4 V3 Closes IDF-13524, IDF-13527, IDF-13528, and IDF-12233 See merge request espressif/esp-idf!42360
This commit is contained in:
@@ -19,7 +19,7 @@
|
||||
#include "soc/hp_sys_clkrst_struct.h"
|
||||
#include "soc/soc_caps.h"
|
||||
#include "hal/ds_types.h"
|
||||
|
||||
#include "hal/config.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -95,6 +95,16 @@ 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)
|
||||
{
|
||||
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
|
||||
REG_WRITE(DS_KEY_SOURCE_REG, key_source);
|
||||
#endif /* HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Write the initialization vector to the corresponding register field.
|
||||
*/
|
||||
|
||||
@@ -19,12 +19,32 @@
|
||||
#include "hal/key_mgr_types.h"
|
||||
#include "soc/keymng_reg.h"
|
||||
#include "soc/hp_sys_clkrst_struct.h"
|
||||
#include "esp_private/esp_crypto_lock_internal.h"
|
||||
#include "hal/config.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) < 300
|
||||
#define KEYMNG_USE_EFUSE_KEY_FLASH KEYMNG_USE_EFUSE_KEY_XTS
|
||||
#define KEYMNG_USE_EFUSE_KEY_LOCK_FLASH KEYMNG_USE_EFUSE_KEY_LOCK_XTS
|
||||
#define KEYMNG_KEY_FLASH_VLD KEYMNG_KEY_XTS_VLD
|
||||
#define KEYMNG_KEY_FLASH_VLD_V KEYMNG_KEY_XTS_VLD_V
|
||||
#define KEYMNG_KEY_FLASH_VLD_S KEYMNG_KEY_XTS_VLD_S
|
||||
#define KEYMNG_KEY_ECDSA_192_VLD KEYMNG_KEY_ECDSA_VLD
|
||||
#define KEYMNG_KEY_ECDSA_192_VLD_V KEYMNG_KEY_ECDSA_VLD_V
|
||||
#define KEYMNG_KEY_ECDSA_192_VLD_S KEYMNG_KEY_ECDSA_VLD_S
|
||||
#define KEYMNG_KEY_ECDSA_256_VLD KEYMNG_KEY_ECDSA_VLD
|
||||
#define KEYMNG_KEY_ECDSA_256_VLD_V KEYMNG_KEY_ECDSA_VLD_V
|
||||
#define KEYMNG_KEY_ECDSA_256_VLD_S KEYMNG_KEY_ECDSA_VLD_S
|
||||
#define KEYMNG_KEY_ECDSA_384_VLD KEYMNG_KEY_ECDSA_VLD
|
||||
#define KEYMNG_KEY_ECDSA_384_VLD_V KEYMNG_KEY_ECDSA_VLD_V
|
||||
#define KEYMNG_KEY_ECDSA_384_VLD_S KEYMNG_KEY_ECDSA_VLD_S
|
||||
#define KEYMNG_FLASH_KEY_LEN KEYMNG_XTS_AES_KEY_LEN
|
||||
#define KEYMNG_FLASH_KEY_LEN_V KEYMNG_XTS_AES_KEY_LEN_V
|
||||
#define KEYMNG_FLASH_KEY_LEN_S KEYMNG_XTS_AES_KEY_LEN_S
|
||||
#endif
|
||||
|
||||
static inline void key_mgr_ll_power_up(void)
|
||||
{
|
||||
// TODO: IDF-13524
|
||||
@@ -116,7 +136,6 @@ 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)
|
||||
{
|
||||
@@ -153,7 +172,6 @@ static inline void key_mgr_ll_clear_int(const esp_key_mgr_interrupt_type_t intr)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Set the key manager to use the software provided init key
|
||||
*/
|
||||
@@ -171,20 +189,48 @@ static inline void key_mgr_ll_set_key_usage(const esp_key_mgr_key_type_t key_typ
|
||||
switch (key_type) {
|
||||
case ESP_KEY_MGR_ECDSA_192_KEY:
|
||||
case ESP_KEY_MGR_ECDSA_256_KEY:
|
||||
case ESP_KEY_MGR_ECDSA_384_KEY:
|
||||
if (key_usage == ESP_KEY_MGR_USE_EFUSE_KEY) {
|
||||
REG_SET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_ECDSA);
|
||||
} else {
|
||||
REG_CLR_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_ECDSA);
|
||||
}
|
||||
break;
|
||||
|
||||
case ESP_KEY_MGR_XTS_AES_128_KEY:
|
||||
case ESP_KEY_MGR_XTS_AES_256_KEY:
|
||||
if (key_usage == ESP_KEY_MGR_USE_EFUSE_KEY) {
|
||||
REG_SET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_XTS);
|
||||
} else {
|
||||
REG_CLR_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_XTS);
|
||||
}
|
||||
if (key_usage == ESP_KEY_MGR_USE_EFUSE_KEY) {
|
||||
REG_SET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_FLASH);
|
||||
} else {
|
||||
REG_CLR_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_FLASH);
|
||||
}
|
||||
break;
|
||||
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
|
||||
case ESP_KEY_MGR_HMAC_KEY:
|
||||
if (key_usage == ESP_KEY_MGR_USE_EFUSE_KEY) {
|
||||
REG_SET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_HMAC);
|
||||
} else {
|
||||
REG_CLR_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_HMAC);
|
||||
}
|
||||
break;
|
||||
|
||||
case ESP_KEY_MGR_DS_KEY:
|
||||
if (key_usage == ESP_KEY_MGR_USE_EFUSE_KEY) {
|
||||
REG_SET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_DS);
|
||||
} else {
|
||||
REG_CLR_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_DS);
|
||||
}
|
||||
break;
|
||||
|
||||
case ESP_KEY_MGR_PSRAM_128_KEY:
|
||||
case ESP_KEY_MGR_PSRAM_256_KEY:
|
||||
if (key_usage == ESP_KEY_MGR_USE_EFUSE_KEY) {
|
||||
REG_SET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_PSRAM);
|
||||
} else {
|
||||
REG_CLR_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_PSRAM);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
HAL_ASSERT(false && "Unsupported mode");
|
||||
return;
|
||||
@@ -196,14 +242,28 @@ static inline esp_key_mgr_key_usage_t key_mgr_ll_get_key_usage(esp_key_mgr_key_t
|
||||
switch (key_type) {
|
||||
case ESP_KEY_MGR_ECDSA_192_KEY:
|
||||
case ESP_KEY_MGR_ECDSA_256_KEY:
|
||||
case ESP_KEY_MGR_ECDSA_384_KEY:
|
||||
return (esp_key_mgr_key_usage_t) (REG_GET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_ECDSA));
|
||||
break;
|
||||
|
||||
case ESP_KEY_MGR_XTS_AES_128_KEY:
|
||||
case ESP_KEY_MGR_XTS_AES_256_KEY:
|
||||
return (esp_key_mgr_key_usage_t) (REG_GET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_XTS));
|
||||
break;
|
||||
return (esp_key_mgr_key_usage_t) (REG_GET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_FLASH));
|
||||
break;
|
||||
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
|
||||
case ESP_KEY_MGR_HMAC_KEY:
|
||||
return (esp_key_mgr_key_usage_t) (REG_GET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_HMAC));
|
||||
break;
|
||||
|
||||
case ESP_KEY_MGR_DS_KEY:
|
||||
return (esp_key_mgr_key_usage_t) (REG_GET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_DS));
|
||||
break;
|
||||
|
||||
case ESP_KEY_MGR_PSRAM_128_KEY:
|
||||
case ESP_KEY_MGR_PSRAM_256_KEY:
|
||||
return (esp_key_mgr_key_usage_t) (REG_GET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_PSRAM));
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
HAL_ASSERT(false && "Unsupported mode");
|
||||
return ESP_KEY_MGR_USAGE_INVALID;
|
||||
@@ -231,12 +291,28 @@ static inline void key_mgr_ll_lock_use_efuse_key_reg(esp_key_mgr_key_type_t key_
|
||||
switch(key_type) {
|
||||
case ESP_KEY_MGR_ECDSA_192_KEY:
|
||||
case ESP_KEY_MGR_ECDSA_256_KEY:
|
||||
case ESP_KEY_MGR_ECDSA_384_KEY:
|
||||
REG_SET_BIT(KEYMNG_LOCK_REG, KEYMNG_USE_EFUSE_KEY_LOCK_ECDSA);
|
||||
break;
|
||||
|
||||
case ESP_KEY_MGR_XTS_AES_128_KEY:
|
||||
case ESP_KEY_MGR_XTS_AES_256_KEY:
|
||||
REG_SET_BIT(KEYMNG_LOCK_REG, KEYMNG_USE_EFUSE_KEY_LOCK_XTS);
|
||||
break;
|
||||
REG_SET_BIT(KEYMNG_LOCK_REG, KEYMNG_USE_EFUSE_KEY_LOCK_FLASH);
|
||||
break;
|
||||
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
|
||||
case ESP_KEY_MGR_HMAC_KEY:
|
||||
REG_SET_BIT(KEYMNG_LOCK_REG, KEYMNG_USE_EFUSE_KEY_LOCK_HMAC);
|
||||
break;
|
||||
|
||||
case ESP_KEY_MGR_DS_KEY:
|
||||
REG_SET_BIT(KEYMNG_LOCK_REG, KEYMNG_USE_EFUSE_KEY_LOCK_DS);
|
||||
break;
|
||||
|
||||
case ESP_KEY_MGR_PSRAM_128_KEY:
|
||||
case ESP_KEY_MGR_PSRAM_256_KEY:
|
||||
REG_SET_BIT(KEYMNG_LOCK_REG, KEYMNG_USE_EFUSE_KEY_LOCK_PSRAM);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
HAL_ASSERT(false && "Unsupported key type");
|
||||
return;
|
||||
@@ -246,21 +322,7 @@ static inline void key_mgr_ll_lock_use_efuse_key_reg(esp_key_mgr_key_type_t key_
|
||||
/* @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)
|
||||
{
|
||||
switch(key_purpose) {
|
||||
case ESP_KEY_MGR_KEY_PURPOSE_ECDSA_192:
|
||||
case ESP_KEY_MGR_KEY_PURPOSE_ECDSA_256:
|
||||
REG_SET_FIELD(KEYMNG_CONF_REG, KEYMNG_KEY_PURPOSE, KEYMNG_KEY_PURPOSE_ECDSA);
|
||||
break;
|
||||
case ESP_KEY_MGR_KEY_PURPOSE_XTS_AES_256_1:
|
||||
REG_SET_FIELD(KEYMNG_CONF_REG, KEYMNG_KEY_PURPOSE, KEYMNG_KEY_PURPOSE_XTS_AES_256_1);
|
||||
break;
|
||||
case ESP_KEY_MGR_KEY_PURPOSE_XTS_AES_256_2:
|
||||
REG_SET_FIELD(KEYMNG_CONF_REG, KEYMNG_KEY_PURPOSE, KEYMNG_KEY_PURPOSE_XTS_AES_256_2);
|
||||
break;
|
||||
default:
|
||||
HAL_ASSERT(false && "Unsupported mode");
|
||||
return;
|
||||
}
|
||||
REG_SET_FIELD(KEYMNG_CONF_REG, KEYMNG_KEY_PURPOSE, key_purpose);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -289,17 +351,27 @@ static inline bool key_mgr_ll_is_result_success(void)
|
||||
static inline bool key_mgr_ll_is_key_deployment_valid(const esp_key_mgr_key_type_t key_type)
|
||||
{
|
||||
switch (key_type) {
|
||||
|
||||
case ESP_KEY_MGR_ECDSA_192_KEY:
|
||||
return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_ECDSA_192_VLD);
|
||||
case ESP_KEY_MGR_ECDSA_256_KEY:
|
||||
return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_ECDSA_VLD);
|
||||
break;
|
||||
return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_ECDSA_256_VLD);
|
||||
case ESP_KEY_MGR_ECDSA_384_KEY:
|
||||
return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_ECDSA_384_VLD);
|
||||
|
||||
case ESP_KEY_MGR_XTS_AES_128_KEY:
|
||||
case ESP_KEY_MGR_XTS_AES_256_KEY:
|
||||
return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_XTS_VLD);
|
||||
break;
|
||||
return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_FLASH_VLD);
|
||||
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
|
||||
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_128_KEY:
|
||||
case ESP_KEY_MGR_PSRAM_256_KEY:
|
||||
return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_PSRAM_VLD);
|
||||
#endif
|
||||
default:
|
||||
HAL_ASSERT(false && "Unsupported mode");
|
||||
return 0;
|
||||
@@ -367,17 +439,31 @@ static inline bool key_mgr_ll_is_huk_valid(void)
|
||||
{
|
||||
return REG_GET_FIELD(KEYMNG_HUK_VLD_REG, KEYMNG_HUK_VALID);
|
||||
}
|
||||
|
||||
/* @brief Set the AES-XTS key length for the Key Manager */
|
||||
static inline void key_mgr_ll_set_xts_aes_key_len(const esp_key_mgr_xts_aes_key_len_t key_len)
|
||||
/* @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_xts_aes_key_len_t key_len)
|
||||
{
|
||||
REG_SET_FIELD(KEYMNG_STATIC_REG, KEYMNG_XTS_AES_KEY_LEN, key_len);
|
||||
if (key_type == ESP_KEY_MGR_XTS_AES_128_KEY || key_type == ESP_KEY_MGR_XTS_AES_256_KEY) {
|
||||
REG_SET_FIELD(KEYMNG_STATIC_REG, KEYMNG_FLASH_KEY_LEN, key_len);
|
||||
}
|
||||
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
|
||||
else if (key_type == ESP_KEY_MGR_PSRAM_128_KEY || key_type == ESP_KEY_MGR_PSRAM_256_KEY) {
|
||||
REG_SET_FIELD(KEYMNG_STATIC_REG, KEYMNG_PSRAM_KEY_LEN, key_len);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* @brief Get the AES-XTS key length for the Key Manager */
|
||||
static inline esp_key_mgr_xts_aes_key_len_t key_mgr_ll_get_xts_aes_key_len(void)
|
||||
/* @brief Get the XTS-AES (Flash Encryption) key length for the Key Manager */
|
||||
static inline esp_key_mgr_xts_aes_key_len_t key_mgr_ll_get_xts_aes_key_len(const esp_key_mgr_key_type_t key_type)
|
||||
{
|
||||
return (esp_key_mgr_xts_aes_key_len_t) REG_GET_FIELD(KEYMNG_STATIC_REG, KEYMNG_XTS_AES_KEY_LEN);
|
||||
if (key_type == ESP_KEY_MGR_XTS_AES_128_KEY || key_type == ESP_KEY_MGR_XTS_AES_256_KEY) {
|
||||
return (esp_key_mgr_xts_aes_key_len_t) REG_GET_FIELD(KEYMNG_STATIC_REG, KEYMNG_FLASH_KEY_LEN);
|
||||
} else {
|
||||
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
|
||||
return (esp_key_mgr_xts_aes_key_len_t) REG_GET_FIELD(KEYMNG_STATIC_REG, KEYMNG_PSRAM_KEY_LEN);
|
||||
#else
|
||||
HAL_ASSERT(false && "Unsupported key type");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -385,10 +471,19 @@ static inline esp_key_mgr_xts_aes_key_len_t key_mgr_ll_get_xts_aes_key_len(void)
|
||||
*/
|
||||
static inline uint32_t key_mgr_ll_get_date_info(void)
|
||||
{
|
||||
// Only the lest siginificantt 28 bits have desired information
|
||||
// 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)
|
||||
{
|
||||
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) < 300
|
||||
return false;
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user