From 71084705c911b2f4cbe7a43c980f05906bef9742 Mon Sep 17 00:00:00 2001 From: "harshal.patil" Date: Wed, 26 Nov 2025 15:17:12 +0530 Subject: [PATCH] fix(key_mgr): Correct XTS-AES key length register configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The key_mgr_ll_set_xts_aes_key_len() function was incorrectly using REG_SET_FIELD() with the key_len enum value directly. Since KEYMNG_FLASH_KEY_LEN is a 1-bit register field (0=128-bit, 1=256-bit), writing ESP_KEY_MGR_XTS_AES_LEN_128 (value 3) resulted in the LSB (1) being stored, incorrectly configuring 256-bit mode. Fixed by using a switch statement to properly map: - ESP_KEY_MGR_XTS_AES_LEN_128 → REG_CLR_BIT (0) - ESP_KEY_MGR_XTS_AES_LEN_256 → REG_SET_BIT (1) Thus, matching the correct ESP32-C5 implementation. --- .../hal/esp32c5/include/hal/key_mgr_ll.h | 9 ---- .../hal/esp32p4/include/hal/key_mgr_ll.h | 47 +++++++++++++++---- 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/components/hal/esp32c5/include/hal/key_mgr_ll.h b/components/hal/esp32c5/include/hal/key_mgr_ll.h index 83e4bbfbc26..5b08f6c6e60 100644 --- a/components/hal/esp32c5/include/hal/key_mgr_ll.h +++ b/components/hal/esp32c5/include/hal/key_mgr_ll.h @@ -213,23 +213,18 @@ 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_KEY: return (esp_key_mgr_key_usage_t) (REG_GET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_ECDSA)); - break; case ESP_KEY_MGR_FLASH_XTS_AES_KEY: return (esp_key_mgr_key_usage_t) (REG_GET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_FLASH)); - break; 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_XTS_AES_KEY: return (esp_key_mgr_key_usage_t) (REG_GET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_PSRAM)); - break; default: HAL_ASSERT(false && "Unsupported key type"); @@ -334,16 +329,12 @@ static inline bool key_mgr_ll_is_key_deployment_valid(const esp_key_mgr_key_type HAL_ASSERT(false && "Unsupported key type"); return 0; } - return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_FLASH_VLD); - break; case ESP_KEY_MGR_HMAC_KEY: return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_HMAC_VLD); - break; case ESP_KEY_MGR_DS_KEY: return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_DS_VLD); - break; case ESP_KEY_MGR_PSRAM_XTS_AES_KEY: switch (key_len) { diff --git a/components/hal/esp32p4/include/hal/key_mgr_ll.h b/components/hal/esp32p4/include/hal/key_mgr_ll.h index 60906963554..9f97b405dab 100644 --- a/components/hal/esp32p4/include/hal/key_mgr_ll.h +++ b/components/hal/esp32p4/include/hal/key_mgr_ll.h @@ -229,7 +229,7 @@ static inline void key_mgr_ll_set_key_usage(const esp_key_mgr_key_type_t key_typ break; #endif default: - HAL_ASSERT(false && "Unsupported mode"); + HAL_ASSERT(false && "Unsupported key type"); return; } } @@ -254,7 +254,7 @@ static inline esp_key_mgr_key_usage_t key_mgr_ll_get_key_usage(esp_key_mgr_key_t return (esp_key_mgr_key_usage_t) (REG_GET_BIT(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY_PSRAM)); #endif default: - HAL_ASSERT(false && "Unsupported mode"); + HAL_ASSERT(false && "Unsupported key type"); return ESP_KEY_MGR_USAGE_INVALID; } } @@ -352,7 +352,6 @@ static inline bool key_mgr_ll_is_key_deployment_valid(const esp_key_mgr_key_type case ESP_KEY_MGR_FLASH_XTS_AES_KEY: switch (key_len) { case ESP_KEY_MGR_XTS_AES_LEN_128: - return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_FLASH_VLD); case ESP_KEY_MGR_XTS_AES_LEN_256: return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_FLASH_VLD); default: @@ -370,7 +369,6 @@ static inline bool key_mgr_ll_is_key_deployment_valid(const esp_key_mgr_key_type case ESP_KEY_MGR_PSRAM_XTS_AES_KEY: switch (key_len) { case ESP_KEY_MGR_XTS_AES_LEN_128: - return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_PSRAM_VLD); case ESP_KEY_MGR_XTS_AES_LEN_256: return REG_GET_FIELD(KEYMNG_KEY_VLD_REG, KEYMNG_KEY_PSRAM_VLD); default: @@ -445,33 +443,64 @@ 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) { - REG_SET_FIELD(KEYMNG_STATIC_REG, KEYMNG_FLASH_KEY_LEN, key_len); + key_len_bit_mask = KEYMNG_FLASH_KEY_LEN; } #if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300 else if (key_type == ESP_KEY_MGR_PSRAM_XTS_AES_KEY) { - REG_SET_FIELD(KEYMNG_STATIC_REG, KEYMNG_PSRAM_KEY_LEN, key_len); + key_len_bit_mask = KEYMNG_PSRAM_KEY_LEN; } #endif + 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) { - return (esp_key_mgr_key_len_t) REG_GET_FIELD(KEYMNG_STATIC_REG, KEYMNG_FLASH_KEY_LEN); + key_len_bit = REG_GET_BIT(KEYMNG_STATIC_REG, KEYMNG_FLASH_KEY_LEN); } #if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300 else if (key_type == ESP_KEY_MGR_PSRAM_XTS_AES_KEY) { - return (esp_key_mgr_key_len_t) REG_GET_FIELD(KEYMNG_STATIC_REG, KEYMNG_PSRAM_KEY_LEN); + key_len_bit = REG_GET_BIT(KEYMNG_STATIC_REG, KEYMNG_PSRAM_KEY_LEN); } #endif else { HAL_ASSERT(false && "Unsupported key type"); - return (esp_key_mgr_key_len_t) 0; + 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; } }