miniblink49 内嵌 wolfSSL ST 硬件加速指南:STM32 对称加密与 STSAFE-A100 ECC 加速实战
miniblink49 内嵌 wolfSSL ST 硬件加速指南STM32 对称加密与 STSAFE-A100 ECC 加速实战【免费下载链接】miniblink49a lighter, faster browser kernel of blink to integrate HTML UI in your app. 一个小巧、轻量的浏览器内核用来取代wke和libcef项目地址: https://gitcode.com/GitHub_Trending/mi/miniblink49wolfSSL 在本仓库中提供了针对 ST 系列硬件STM32 L4/F1/F2/F4/F7 与 STSAFE-A100 协处理器的密码学硬件加速移植层。本文以 third_party/wolfssl/wolfcrypt/src/port/st/README.md 为骨架结合仓库内 stm32.c、stsafe.c 及 settings.h 的源码证据系统讲解两类加速能力的启用宏、构建配置、编码规范与性能基准帮助嵌入式开发者在一台 STM32 或带 STSAFE-A100 的设备上把 AES/MD5/SHA 与 ECC 运算卸载到硬件并掌握 PK 回调的完整接线方法。一、ST 移植层能加速什么ST Ports 是 wolfSSL 面向意法半导体平台的硬件加速移植模块位于 third_party/wolfssl/wolfcrypt/src/port/st/由两个核心源文件组成stm32.c面向 STM32 系列板载加密硬件加速对称 AESECB/CBC/CTR/GCM 模式以及 MD5/SHA1/SHA224/SHA256 哈希算法stsafe.c面向STSAFE-A100 加密协处理器通过 I2C 总线访问加速 ECC支持 NIST 或 Brainpool 256 位与 384 位曲线供 TLS 与 wolfCrypt 两层使用。从源码看stm32.c 顶部明确注释为“Generic STM32 Hashing Function”并同时支持 CubeMX HAL 与标准外设库StdPeriLib两种底层stsafe.c 则依赖 ST 官方 ST-Safe SDK 中的stsafe_interface.c/.h如 stsafe.c 直接调用stsafe_interface_shared_secret。需要注意ST-Safe SDK 不随本仓库分发需联系 ST 获取。二、STM32 对称加密加速启用与构建2.1 选择目标芯片宏在编译前按目标芯片定义以下宏之一即会触发 settings.h 中对应的移植分支#define WOLFSSL_STM32L4 #define WOLFSSL_STM32F1 #define WOLFSSL_STM32F2 #define WOLFSSL_STM32F4 #define WOLFSSL_STM32F7settings.h在检测到 F1/F2/F4/F7 后会自动完成一系列配套定义见 settings.h固定SIZEOF_LONG_LONG 8关闭设备随机源NO_DEV_RANDOM与目录接口NO_WOLFSSL_DIR默认开启STM32_RNG、STM32_CRYPTO、STM32_HASH三个硬件驱动宏分别对应随机数、对称加密、哈希三条硬件通路非 GCC / IAR 编译器自动启用KEIL_INTRINSICS兼容 Keil 工具链。2.2 选择 HAL 层CubeMX 还是 StdPeriLibWOLFSSL_STM32_CUBEMX宏决定底层实现#define WOLFSSL_STM32_CUBEMX定义该宏 → 走CubeMX HALsettings.h 按芯片自动包含stm32f1xx_hal.h/stm32f2xx_hal.h/stm32f4xx_hal.h/stm32f7xx_hal.h并定义STM32_HAL_TIMEOUT默认0xFF不定义 → 走标准外设库StdPeriLibsettings.h 按芯片包含stm32f4xx.h、stm32f4xx_cryp.h、stm32f4xx_hash.h等头文件。两种分支在驱动代码中并存。以哈希时钟开关为例stm32.c 中的默认实现是#ifndef STM32_HASH_CLOCK_ENABLE static INLINE void wc_Stm32_Hash_Clock_Enable(STM32_HASH_Context* stmCtx) { #ifdef WOLFSSL_STM32_CUBEMX __HAL_RCC_HASH_CLK_ENABLE(); #else RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_HASH, ENABLE); #endif (void)stmCtx; }即 CubeMX 分支调用__HAL_RCC_HASH_CLK_ENABLE()StdPeriLib 分支调用RCC_AHB2PeriphClockCmd()且这两个时钟开关宏都允许用户在移植层覆盖便于适配自定义时钟管理。2.3 按需关闭部分加速可选如果只想用硬件加速的某一部分例如仅哈希、仅 AES可以逐项关闭#define NO_STM32_RNG /* 关闭硬件随机数禁用 STM32_RNG */ #define NO_STM32_CRYPTO /* 关闭对称加密加速禁用 STM32_CRYPTO */ #define NO_STM32_HASH /* 关闭哈希加速禁用 STM32_HASH */对应逻辑在 settings.h只有未定义NO_STM32_RNG时才会#define STM32_RNG其余同理。2.4 哈希驱动的上下文保存与恢复STM32_HASH驱动的健壮性体现在硬件上下文的保存/恢复上。stm32.c 实现了static INLINE void wc_Stm32_Hash_SaveContext(STM32_HASH_Context* ctx) { ctx-HASH_IMR HASH-IMR; ctx-HASH_STR HASH-STR; ctx-HASH_CR HASH-CR; for (i0; iHASH_CR_SIZE; i) { ctx-HASH_CSR[i] HASH-CSR[i]; } }wc_Stm32_Hash_RestoreContext()在ctx-HASH_CR ! 0时恢复寄存器并置位HASH_CR_INIT重新初始化哈希处理器。这样即使哈希运算被中断打断也可以完整恢复硬件状态保证多任务环境下摘要计算的正确性——这正是嵌入式实时场景中把摘要计算卸载给硬件时的关键细节。三、编码规范settings.h 与 user_settings.h无论使用哪种 ST 硬件工程代码都必须遵守同一条规则在任何 wolfSSL 头文件之前包含wolfssl/wolfcrypt/settings.h。若直接从源码构建而非使用 IDE 工程推荐定义WOLFSSL_USER_SETTINGS自行提供user_settings.h把全部平台宏集中放在里面。仓库根目录的 user_settings.h 就是可直接参考的样例对应原文档提到的IDE/GCC-ARM/Header/user_settings.h本仓库中该样例位于仓库根目录。典型内容组织如下#define WOLFSSL_USER_SETTINGS /* STM32 对称加速 */ #define WOLFSSL_STM32F4 #define WOLFSSL_STM32_CUBEMX /* 或 STSAFE-A100 ECC 加速 */ // #define HAVE_PK_CALLBACKS // #define WOLFSSL_STSAFEA100将平台相关宏收敛在user_settings.h中业务代码只需包含settings.h即可在换芯片型号或换 HAL 库时避免改动业务源码。四、STSAFE-A100 ECC 加速启用与构建STSAFE-A100 是独立的安全协处理器通过 I2C 与主控通信。启用方式二选一方式一autotools 构建Linux 交叉编译场景./configure --enable-pkcallbacks CFLAGS-DWOLFSSL_STSAFEA100方式二手工宏定义#define HAVE_PK_CALLBACKS #define WOLFSSL_STSAFEA100其中HAVE_PK_CALLBACKS打开 wolfSSL 的 PK 回调框架WOLFSSL_STSAFEA100才真正激活 stsafe.c 中整个移植实现整个文件主体都被#ifdef WOLFSSL_STSAFEA100包裹。从源码结构看该移植在两层都可用TLS 层通过SSL_STSAFE_CreateKeyCb/SSL_STSAFE_SignCertificateCb/SSL_STSAFE_VerifyPeerCertCb/SSL_STSAFE_SharedSecretCb四个回调接入握手流程可支撑纯 ECC 密码套件如 ECDHE-ECDSA-AES128-SHA256的 TLS 客户端或服务端wolfCrypt 层通过wolfSSL_CTX_SetDevId(ctx, 0)打开 ST-Safe 设备 ID 通路使wc_ecc_*原生 ECC API 也走硬件。五、TLS 层 PK 回调接线5.1 注册四个 ECC 回调STSAFE-A100 的四个回调注册方式如下stsafe.c 中SSL_STSAFE_SetupPkCallbacks函数内部正是这样实现的/* Setup PK Callbacks for STSAFE-A100 */ WOLFSSL_CTX* ctx; wolfSSL_CTX_SetEccKeyGenCb(ctx, SSL_STSAFE_CreateKeyCb); wolfSSL_CTX_SetEccSignCb(ctx, SSL_STSAFE_SignCertificateCb); wolfSSL_CTX_SetEccVerifyCb(ctx, SSL_STSAFE_VerifyPeerCertCb); wolfSSL_CTX_SetEccSharedSecretCb(ctx, SSL_STSAFE_SharedSecretCb); wolfSSL_CTX_SetDevId(ctx, 0); /* 使 wolfCrypt wc_ecc_* 走 ST-Safe */对应的参考实现位于 third_party/wolfssl/wolfcrypt/src/port/st/stsafe.cSSL_STSAFE_CreateKeyCb调用 ST-Safe 生成 ECC 密钥对stsafe.cSSL_STSAFE_VerifyPeerCertCb验签对端证书stsafe.cSSL_STSAFE_SignCertificateCb本地证书签名stsafe.cSSL_STSAFE_SharedSecretCbECDHE 共享密钥协商内部落到stsafe_interface_shared_secret()stsafe.c。这四步即可完成一套“密钥生成→签名→验签→共享密钥”的 ECDHE-ECDSA 握手闭环。5.2 为回调挂接自定义上下文若业务需要把自有状态如 I2C 句柄、会话 ID透传给回调可对每个 SSL 对象单独设置上下文/* Setup PK Callbacks context */ WOLFSSL* ssl; void* myOwnCtx; wolfSSL_SetEccKeyGenCtx(ssl, myOwnCtx); wolfSSL_SetEccVerifyCtx(ssl, myOwnCtx); wolfSSL_SetEccSignCtx(ssl, myOwnCtx); wolfSSL_SetEccSharedSecretCtx(ssl, myOwnCtx);这与 stsafe.c 中SSL_STSAFE_SetupPkCallbackCtx的写法一一对应。原文档强调必须为每个注册的回调都设置对应的 ctx否则回调拿不到用户数据。5.3 一键封装实际工程可直接调用 stsafe.c 提供的两个封装函数完成全部接线SSL_STSAFE_SetupPkCallbacks(ctx); /* 注册 4 个回调 设置 DevId */ SSL_STSAFE_SetupPkCallbackCtx(ssl, myOwnCtx); /* 为当前 SSL 挂自定义上下文 */六、基准数据与内存占用对比6.1 软件实现STM32L4120 MHzCortex-M4Fast MathECDHE 256 key gen SW 4 ops took 1.278 sec, avg 319.500 ms, 3.130 ops/sec ECDHE 256 agree SW 4 ops took 1.306 sec, avg 326.500 ms, 3.063 ops/sec ECDSA 256 sign SW 4 ops took 1.298 sec, avg 324.500 ms, 3.082 ops/sec ECDSA 256 verify SW 2 ops took 1.283 sec, avg 641.500 ms, 1.559 ops/sec内存占用Peak Stack: 18456 Peak Heap: 2640 Total: 210966.2 STSAFE-A100 硬件加速ECDHE 256 key gen HW 8 ops took 1.008 sec, avg 126.000 ms, 7.937 ops/sec ECDHE 256 agree HW 6 ops took 1.051 sec, avg 175.167 ms, 5.709 ops/sec ECDSA 256 sign HW 14 ops took 1.161 sec, avg 82.929 ms, 12.059 ops/sec ECDSA 256 verify HW 8 ops took 1.184 sec, avg 148.000 ms, 6.757 ops/sec内存占用Peak Stack: 9592 Peak Heap: 170 Total: 9762要点解读数据来自原文档性能上STSAFE-A100 在密钥生成、签名、验签上普遍比软件快 24 倍如 ECDSA 256 sign 从 324.5 ms 降到 82.9 ms验签从 641.5 ms 降到 148.0 ms内存上硬件方案总占用从 21096 字节降到 9762 字节其中堆从 2640 字节骤降至 170 字节——因为大整数运算被转移到协处理器内部这对 RAM 紧张的 MCU 意义重大注意以上为原文档公布的特定环境数据实际收益取决于芯片主频、I2C 速率与 wolfSSL 的数学库配置如是否启用 Fast Math移植到其他平台时应以本机实测为准。七、调试与排障要点结合源码可以给出几条实用的排查路径宏未生效确认WOLFSSL_STM32F*与WOLFSSL_STM32_CUBEMX是否在settings.h之前定义如统一放进 user_settings.h因为 settings.h 的这些分支只在编译期预处理阶段生效。HAL 头文件缺失CubeMX 分支按芯片 include 对应stm32f*xx_hal.hStdPeriLib 分支 includestm32f*xx_cryp.h/stm32f*xx_hash.h若报头文件找不到先核对芯片宏与 HAL 库是否配套。回调未触发检查HAVE_PK_CALLBACKS是否定义四个回调与四个 ctx 是否都设置齐全wolfSSL_CTX_SetDevId(ctx, 0)是否调用决定wc_ecc_*是否走硬件。ST-Safe 接口缺失stsafe_interface.c/.h来自 ST 官方 SDK不在本仓库内链接报未定义符号时优先检查该 SDK 是否正确加入工程。八、小结ST Ports 为嵌入式场景提供了两条清晰的硬件加速路径STM32 板载 AES/MD5/SHA 加速对应 stm32.c宏驱动、CubeMX/StdPeriLib 双 HAL 支持与 STSAFE-A100 ECC 协处理器加速对应 stsafe.cPK 回调驱动、TLS 与 wolfCrypt 双层覆盖。启用方式可归纳为三步在user_settings.h中定义芯片宏与 HAL 宏 → 按需关闭部分加速 → 在业务代码中先包含settings.h并对 STSAFE注册四个 PK 回调。如需深入源码可继续阅读 stm32.c、stsafe.c 与 settings.h。【免费下载链接】miniblink49a lighter, faster browser kernel of blink to integrate HTML UI in your app. 一个小巧、轻量的浏览器内核用来取代wke和libcef项目地址: https://gitcode.com/GitHub_Trending/mi/miniblink49创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →