尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ESP-IDF ECDSA 数字签名外设(ECDSA_DS)完全指南:eFuse 密钥存储、曲线配置与 ESP-TLS 集成实战

ESP-IDF ECDSA 数字签名外设(ECDSA_DS)完全指南:eFuse 密钥存储、曲线配置与 ESP-TLS 集成实战 ESP-IDF ECDSA 数字签名外设ECDSA_DS完全指南eFuse 密钥存储、曲线配置与 ESP-TLS 集成实战【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf本文基于 ESP-IDF 官方文档 docs/en/api-reference/peripherals/ecdsa.rst 展开系统讲解 ECDSA 数字签名外设ECDSA_DS的硬件特性、私钥在 eFuse / Key Manager 中的存储与烧录方法、P-192/P-256/P-384 曲线与 SHA-224/SHA-256/SHA-384 哈希算法的支持范围以及如何通过 ESP-TLS 在应用层以最小工作量建立基于硬件私钥的 TLS 双向认证mTLS实现安全的设备身份Secure Device Identity。ECDSA_DS 外设是什么ECDSA_DSElliptic Curve Digital Signature Algorithm Digital Signature是集成在部分 Espressif SoC 上的硬件数字签名外设实现了基于椭圆曲线密码学的 ECDSA 算法——即 DSA 算法使用椭圆曲线加密的变体。与纯软件实现相比ECDSA_DS 提供以下核心价值安全且高效的签名计算环境运算速度快同时保证签名过程的机密性防止信息泄漏。私钥不可被软件读取签名过程使用的 ECDSA 私钥仅对硬件外设可访问软件无法读取。这是与纯软件私钥存储如 Flash、内存的本质区别。支撑安全设备身份可配合 TLS 双向认证mutual authentication等场景建立Secure Device Identity。该外设的关键安全前提是私钥一旦写入就对除密码学模块以外的任何资源完全不可访问默认模式从而避免密钥泄漏。支持的功能特性根据芯片能力宏如SOC_ECDSA_SUPPORT_CURVE_P384、SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE各目标芯片支持的特性有所差异主要特性如下ECDSA 数字签名生成与验证外设既支持签名也支持验签。椭圆曲线支持依据 FIPS 186-3 规范支持 P-384 的芯片SOC_ECDSA_SUPPORT_CURVE_P384为 1如 ESP32-C5、ESP32-H4、ESP32-P4、ESP32-S31见 components/soc/esp32c5/include/soc/soc_caps.h支持P-192、P-256、P-384三条曲线不支持 P-384 的芯片仅支持P-192 和 P-256两条曲线。消息哈希算法支持依据 FIPS PUB 180-4 规范支持 P-384 的芯片支持SHA-224、SHA-256、SHA-384三种哈希算法不支持 P-384 的芯片仅支持SHA-224、SHA-256两种。确定性签名SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE支持按 RFC 6979 第 3.2 节对参数 K 进行确定性推导从而生成确定性签名详见下文。非确定性签名依赖硬件真随机数生成器TRNG提供熵源详见下文。注意硬件不支持的曲线或哈希算法Mbed TLS 软件栈会自动回退到软件实现应用无需特殊处理详见应用开发指南一节。ECDSA 私钥的存储方式ECDSA 私钥有两种存储途径eFuse 密钥块与Key Manager仅支持 Key Manager 的芯片如SOC_KEY_MANAGER_SUPPORTED为 1 的目标。通过 eFuse 密钥块存储ECDSA 私钥存储在 eFuse 密钥块key block中所需密钥块数量取决于曲线尺寸曲线所需 eFuse 密钥块总位宽P-2561 个256 bitsP-3842 个512 bits对于需要两个密钥块的曲线如 P-384需要在esp_tls_cfg_t中配置两个字段见 components/esp-tls/esp_tls.h将esp_tls_cfg_t::ecdsa_key_efuse_blk设置为低块号将esp_tls_cfg_t::ecdsa_key_efuse_blk_high设置为高块号。对于单块曲线如 P-256只需设置ecdsa_key_efuse_blk将ecdsa_key_efuse_blk_high保持为 0 或不赋值即可源码注释明确说明ecdsa_key_efuse_blk_high仅用于 SECP384R1 曲线未设置0时只使用ecdsa_key_efuse_blk。可用的物理密钥块范围可用的物理 eFuse 密钥块数量取决于芯片多数芯片块 4 ~ 块 8共五个物理块可作为 ECDSA_DS 密钥对应SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK芯片部分芯片块 4 ~ 块 9共六个物理块对应未启用该 quirk 的芯片。命名约定块 4 是第一个密钥块参数写作BLOCK_KEY0依此类推BLOCK_KEY1、BLOCK_KEY2…… 这与EFUSE_BLK_KEY0枚举见 components/efuse/include/esp_efuse.h 中的esp_efuse_block_t对应。通过 Key Manager 存储部分芯片在支持 Key Manager 的芯片SOC_KEY_MANAGER_SUPPORTED为 1上ECDSA 私钥也可以存储在 Key Manager 中。使用方法将 ECDSA 私钥部署Deploy到 Key Manager对于持久化密钥persistent keys将生成的 Key Recovery 信息存储在 Flash 中。Key Manager 相关细节可参考 Key Manager 文档docs 中key-manager章节本仓库 eFuse 密钥块与 Key Manager 的能力宏定义可在 components/soc/esp32c5/include/soc/soc_caps.h 等芯片的soc_caps.h中查阅。烧录 ECDSA 私钥ECDSA 私钥既可以在主机端通过idf.py命令烧录也可以在目标设备上通过应用程序烧录。方式一使用 idf.py 命令行烧录主机端使用 eFuse 存储 ECDSA 密钥的命令如下该命令由 tools/idf_py_actions/serial_ext.py 提供idf.py efuse-burn-key BLOCK_NUM /path/to/ecdsa_private_key.pem ECDSA_KEY参数说明BLOCK_NUM目标密钥块编号例如BLOCK_KEY0对应物理块 4。/path/to/ecdsa_private_key.pemPEM 格式的 ECDSA 私钥文件路径。ECDSA_KEY密钥用途key purpose指定为 ECDSA 密钥即 eFuse 中的ESP_EFUSE_KEY_PURPOSE_ECDSA_KEY。使用 Key Manager 存储密钥的芯片同样可以在主机侧将 ECDSA 密钥部署到 Key Manager并将生成的 Key Recovery 信息存入 Flash 以实现持久化。方式二通过应用程序烧录目标端ECDSA 密钥也可以通过运行在目标设备上的应用程序烧录核心 API 是esp_efuse_write_key()声明于 components/efuse/include/esp_efuse.h。下面代码将物理密钥块 0EFUSE_BLK_KEY0写入 eFuse密钥用途为ESP_EFUSE_KEY_PURPOSE_ECDSA_KEY#include esp_efuse.h const uint8_t key_data[32] { ... }; esp_err_t status esp_efuse_write_key(EFUSE_BLK_KEY0, ESP_EFUSE_KEY_PURPOSE_ECDSA_KEY, key_data, sizeof(key_data)); if (status ESP_OK) { // written key } else { // writing key failed, maybe written already }需要说明的关键点key_data的长度应与曲线匹配P-256 为 32 字节对于 P-384 等需要两块密钥块的曲线需在两个块上分别写入。eFuse 是**一次性可编程OTP**存储已写入的位无法再改。因此当返回非ESP_OK时常见原因是密钥可能已写入过ESP_ERR_EFUSE_REPEATED_PROG属于预期的错误语义。相关错误码定义ESP_ERR_EFUSE基础错误码及其子码同样位于 components/efuse/include/esp_efuse.h。ECDSA 曲线配置P-192 默认关闭ECDSA_DS 外设通常同时支持 ECDSA-P192 与 ECDSA-P256 运算但默认只启用 ECDSA-P256。以 ESP32-H2 为例自 revision 1.2 起默认仅启用 P-256其他支持 P-192 的芯片同样默认关闭 P-192。若需要启用 P-192 运算有两种途径Kconfig 选项CONFIG_ESP_ECDSA_ENABLE_P192_CURVE定义于 components/esp_security/Kconfig。启用后设备可同时执行 192-bit 与 256-bit 曲线的 ECDSA 运算。重要限制如果 P-192 运算已在 eFuse 写保护时被永久禁用启用此选项无法重新开启 P-192 曲线运算。运行时 API调用esp_efuse_enable_ecdsa_p192_curve_mode()声明于 components/efuse/include/esp_efuse.h通过向 eFuse 写入相应值以编程方式启用 P-192 曲线运算使设备同时支持 P-192 与 P-256。该函数会检查当前曲线模式若尚未设置则尝试设置为同时允许 P192 与 P256若 eFuse 已写保护write-protected该 API 将失败返回ESP_FAIL其他错误码表示读写 eFuse 失败。确定性签名生成RFC 6979在支持SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE的芯片上ECDSA_DS 外设还支持确定性签名生成按 RFC 6979 第 3.2 节的方式对参数 K 进行确定性推导而不是使用随机数。确定性签名的价值在于同一消息、同一私钥每次产生的签名完全相同便于测试复现与审计同时避免了因随机数生成器缺陷如 K 值重用导致的私钥泄露风险。非确定性签名与 TRNG 依赖对于非确定性签名生成ECDSA_DS 外设依赖硬件**真随机数生成器TRNG**提供内部熵源根据 RFC 6090 第 5.3.2 节ECDSA 签名过程中需要生成一个随机整数。因此应用在开始 ECDSA 运算主要是签名之前必须确保硬件 RNG 已启用。在 ESP-IDF 中硬件 RNG 的启用与熵源相关配置可参考系统随机数文档docs中system/random章节。若 TRNG 未就绪签名流程可能无法获得所需熵源。应用开发指南ECDSA_DS ESP-TLS 集成与 Mbed TLS 的集成方式ECDSA_DS 外设在 Mbed TLS 软件栈中的集成方式是覆写overrideECDSA 签名与验签 API当硬件满足曲线与哈希算法要求时签名/验签走硬件外设当硬件不满足要求时实现自动回退到软件实现应用无需感知。ESP-TLS 中的配置针对特定 TLS 上下文ESP-IDF 提供了额外的 API 来填充某些字段如私钥上下文以区分路由到硬件还是软件。ESP-TLS 层在内部集成了这些 API因此应用层通常无需额外工作仅自定义使用场景custom use-cases需要参考下文 API 字段手动配置。在 ESP-TLS 的配置结构体esp_tls_cfg_t以及对应的esp_tls_client_config_t中与 ECDSA_DS 相关的字段见 components/esp-tls/esp_tls.h字段说明use_ecdsa_peripheral是否使用 ECDSA 外设执行私钥运算ecdsa_key_efuse_blkECDSA 密钥所在 eFuse 块SECP384R1 使用两块时设为低块ecdsa_key_efuse_blk_highECDSA 密钥的高 eFuse 块仅 SECP384R1 使用设为 0 表示仅用低块ecdsa_curve使用的曲线esp_tls_ecdsa_curve_t枚举SECP256R1 或 SECP384R1见 components/esp-tls/esp_tls.h参考示例来自 docs/en/api-reference/protocols/esp_tls.rst 的ecdsa-peri-with-esp-tls指南esp_tls_cfg_t tls_cfg { .use_ecdsa_peripheral true, .ecdsa_key_efuse_blk 4, // Low eFuse block for ECDSA key .ecdsa_key_efuse_blk_high 5, // High eFuse block for ECDSA key (SECP384R1 only) .ecdsa_curve ESP_TLS_ECDSA_CURVE_SECP384R1, // use ESP_TLS_ECDSA_CURVE_SECP256R1 for SECP256R1 // ... 其他 TLS 配置证书、主机名等 };使用该配置发起 TLS 连接时ESP-TLS 会在握手阶段自动将私钥运算路由到 ECDSA_DS 硬件外设完成基于 eFuse 私钥的客户端证书签名——整个过程私钥不会暴露给软件。这就是 ECDSA_DS 支撑TLS 双向认证mTLS、建立安全设备身份的标准做法。应用前提与限制仅限 Mbed TLS 后端使用 ECDSA_DS 外设仅当 ESP-TLS 以 MbedTLS 作为底层 SSL/TLS 栈时受支持即配置了use_ecdsa_peripheral的 ESP-TLS 场景。私钥必须先就位使用 ECDSA_DS 前ECDSA 私钥必须已写入 eFuse或 Key Manager烧录方法见上文烧录 ECDSA 私钥一节。曲线/哈希必须匹配外设只支持前述有限曲线与哈希集合其余情况回退软件实现。API 参考ECDSA_DS 相关的完整 API 参考包括 PSA Crypto 驱动上下文结构体即psa_crypto_driver_esp_ecdsa_contexts.inc中定义的内容由文档系统在API Reference一节自动生成。在实际开发中需要重点使用的公开接口集中在components/esp-tls/esp_tls.hesp_tls_cfg_t/esp_tls_client_config_t的use_ecdsa_peripheral、ecdsa_key_efuse_blk、ecdsa_key_efuse_blk_high、ecdsa_curve字段与esp_tls_ecdsa_curve_t枚举components/efuse/include/esp_efuse.hesp_efuse_write_key()、esp_efuse_enable_ecdsa_p192_curve_mode()、ESP_EFUSE_KEY_PURPOSE_ECDSA_KEY等密钥烧录与曲线使能接口components/esp_security/KconfigCONFIG_ESP_ECDSA_ENABLE_P192_CURVE编译期曲线选项芯片能力宏SOC_ECDSA_SUPPORT_CURVE_P384、SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE、SOC_KEY_MANAGER_SUPPORTED、SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK等定义于各芯片的 components/soc/esp32c5/include/soc/soc_caps.h 类似路径下。总结ECDSA_DS 是 ESP-IDF 在硬件层提供的一种密钥不可见的数字签名方案私钥烧录于 eFuse 或 Key Manager 后仅硬件密码学模块可访问签名运算既快又安全非常适合作为 IoT 设备的可信身份凭证。使用流程可归纳为三步选择存储介质并烧录私钥 → 可选按需启用 P-192 曲线 → 在 ESP-TLS 配置中启用use_ecdsa_peripheral并指定密钥块与曲线随后即可建立基于硬件私钥的 TLS 双向认证。对于硬件不支持的曲线与哈希算法Mbed TLS 会自动回退到软件实现保证了功能的完整性。【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表