物联网嵌入式操作系统实时系统【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址https://gitcode.com/GitHub_Trending/riot/RIOT点击查看免费下载本文聚焦 RIOT 操作系统中 tests/sys/psa_crypto_mac 测试它是对 PSA Crypto 模块MAC 部分的专项配置测试验证在最小化模块裁剪仅启用 MAC、不引入对称加密与签名等无关组件的前提下HMAC SHA-256 计算能否正确运行。读完本文你将掌握该测试的目录结构、构建配置、模块依赖链与后端自动选择机制理解psa_mac_compute()的底层调用链并学会如何在自己的 RIOT 应用中裁剪出最小可用的 PSA MAC 配置。测试定位为什么需要一份仅 MAC的配置测试PSA Crypto 是 Arm 提出的跨厂商密码学 API 规范RIOT 在 sys/psa_crypto 中提供了完整实现涵盖对称加密cipher、消息认证码MAC、哈希hash、非对称签名asymmetric与密钥管理key management等能力。模块数量众多每个能力又对应若干伪模块与可选后端。examples/advanced/psa_crypto 是展示 PSA Crypto API 用法的综合示例AES 128 CBC、HMAC SHA-256、ECDSA P256、EdDSA Ed25519 四种操作一应俱全但综合示例无法回答一个问题当只启用 MAC 功能、其他全部裁剪时配置是否正确、依赖是否自洽。这正是tests/sys/psa_crypto_mac存在的意义——README 开宗明义This is a configuration test for only the mac of the PSA crypto module. It is based off the psa_crypto example.因此该测试目录中的 Makefile 只引入psa_crypto、psa_mac、psa_mac_hmac_sha_256三个模块测试程序也仅执行 HMAC SHA-256 一次运算以此验证模块裁剪后构建、链接、运行全流程的正确性。测试目录结构一览tests/sys/psa_crypto_mac/ ├── Makefile # 模块选择与编译参数 ├── Makefile.ci # 内存不足、不参与 CI 的板子清单 ├── README.md # 测试说明本文关联文档 ├── example_hmac_sha256.c # HMAC SHA-256 计算逻辑源自 psa_crypto 示例 ├── main.c # 测试入口计时执行并检查返回值 └── tests/ └── 01-run.py # testrunner 脚本断言串口输出 All Done构建配置逐行解析三个模块与一个编译参数Makefile 是整个测试的核心配置内容如下include ../Makefile.sys_common USEMODULE ztimer USEMODULE ztimer_usec USEMODULE psa_crypto USEMODULE psa_mac USEMODULE psa_mac_hmac_sha_256 CFLAGS -DCONFIG_PSA_SINGLE_KEY_COUNT1 include $(RIOTBASE)/Makefile.include逐项解读USEMODULE psa_crypto启用 PSA Crypto 实现本体。在 Makefile.dep 中它会自动引入random与prng_sha256prng作为随机数依赖。USEMODULE psa_mac启用 MAC 功能。依赖解析见 sys/psa_crypto/Makefile.deppsa_mac会进一步引入psa_key_management因为 MAC 计算必须先从密钥槽获取密钥材料。USEMODULE psa_mac_hmac_sha_256声明具体算法HMAC SHA-256。依赖解析见 sys/psa_crypto/Makefile.dep它会自动引入psa_hash与psa_hash_sha_256注释说明超过一个 SHA-256 分组长度的密钥需要先做哈希并根据目标平台特性自动选择一个后端。CFLAGS -DCONFIG_PSA_SINGLE_KEY_COUNT1将单密钥槽数量配置为 1。这个值决定了 psa_crypto_slot_management.h 中的PSA_SINGLE_KEY_COUNT进而决定PSA_KEY_SLOT_COUNT PSA_PROTECTED_KEY_COUNT PSA_ASYMMETRIC_KEYPAIR_COUNT PSA_SINGLE_KEY_COUNT。测试程序同时导入 32 字节和 128 字节两把 HMAC 密钥但两者串行使用、先psa_destroy_key再导入所以单槽配置足以覆盖。这是对配置测试身份的又一次印证显式压到最小资源占用。后端自动选择periph 硬件加速还是 RIOT 软件哈希RIOT 的 PSA 实现允许同一算法由不同后端提供板载外设、软件库、安全元件并在 sys/psa_crypto/Makefile.include 中把psa_mac_hmac_sha_256及其三个后端声明为伪模块且强制同一时刻只能选择一个后端## MAC PSEUDOMODULES psa_mac PSEUDOMODULES psa_mac_hmac_sha_256 PSEUDOMODULES psa_mac_hmac_sha_256_backend_periph PSEUDOMODULES psa_mac_hmac_sha_256_backend_riot PSEUDOMODULES psa_mac_hmac_sha_256_custom_backend # check that one and only one backend has been selected ifneq (,$(filter psa_mac_hmac_sha_256,$(USEMODULE))) ifneq (1,$(call backends,psa_mac_hmac_sha_256)) $(error One (and only one) backend should be selected for psa_mac_hmac_sha_256) endif endif选哪个后端取决于目标板卡是否具备periph_hmac_sha_256特性。依赖解析在 Makefile.dep 中完成## HMAC SHA-256 ifneq (,$(filter psa_mac_hmac_sha_256,$(USEMODULE))) USEMODULE psa_hash USEMODULE psa_hash_sha_256 ifeq (,$(filter psa_mac_hmac_sha_256_custom_backend,$(USEMODULE))) FEATURES_OPTIONAL periph_hmac_sha_256 include $(RIOTMAKE)/features_check.inc.mk ifneq (,$(filter periph_hmac_sha_256,$(FEATURES_USED))) USEMODULE psa_mac_hmac_sha_256_backend_periph else USEMODULE psa_mac_hmac_sha_256_backend_riot endif endif endif目标板具备periph_hmac_sha_256特性例如 nRF52840 的 CryptoCell 310 加速器自动选择psa_mac_hmac_sha_256_backend_periph并追加FEATURES_REQUIRED periph_hmac_sha_256否则回退到psa_mac_hmac_sha_256_backend_riot该后端依赖hashes、psa_riot_hashes、psa_riot_hashes_hmac_sha256即 RIOT 自带的软件哈希实现Makefile.dep应用也可以通过显式声明psa_mac_hmac_sha_256_custom_backend跳过自动选择改用自定义后端如安全元件。用native板构建时native不具备periph_hmac_sha_256因此会走 RIOT 软件哈希路径用BOARDnrf52840dk构建时则会自动接入 CryptoCell 310 硬件加速。上游示例 examples/advanced/psa_crypto/README.md 给出了同一块 nRF52840dk 上不同后端的 HMAC SHA-256 耗时对比CryptoCell 310 约 282 µs、RIOT 软件哈希约 468 µs、ATECC608A 安全元件约 56376 µs供读者直观理解后端差异。测试程序走读计时 状态断言入口 main.cmain.c 使用 RIOT 的ztimer对 HMAC 计算计时并检查返回值#include stdio.h #include psa/crypto.h #include ztimer.h extern psa_status_t example_hmac_sha256(void); int main(void) { bool failed false; psa_status_t status; ztimer_acquire(ZTIMER_USEC); ztimer_now_t start ztimer_now(ZTIMER_USEC); status example_hmac_sha256(); printf(HMAC SHA256 took %d us\n, (int)(ztimer_now(ZTIMER_USEC) - start)); if (status ! PSA_SUCCESS) { failed true; printf(HMAC SHA256 failed: %s\n, psa_status_to_humanly_readable(status)); } ztimer_release(ZTIMER_USEC); if (failed) { puts(Tests failed...); } else { puts(All Done); } return 0; }关键点程序没有显式调用psa_crypto_init()。RIOT 的 PSA 实现通过自动初始化机制完成库初始化psa_crypto.c 中的psa_crypto_init()负责初始化密钥槽并置位lib_initialized若未初始化psa_mac_compute()会直接返回PSA_ERROR_BAD_STATE。若返回码非PSA_SUCCESS通过psa_status_to_humanly_readable()打印可读的错误名同一函数在 psa_crypto.c 中把错误码映射为字符串。通过ztimer打印耗时作为后端差异的实测佐证——这继承了上游示例测量处理时间的做法。HMAC SHA-256 计算逻辑example_hmac_sha256.c 头注释明确说明内容复制自examples/advanced/psa_crypto。它依次演示了 PSA Crypto MAC 的完整用法初始化密钥属性psa_key_attributes_init()后依次设置算法PSA_ALG_HMAC(PSA_ALG_SHA_256)、用途PSA_KEY_USAGE_SIGN_MESSAGE、位长PSA_BYTES_TO_BITS(HMAC_KEY_LEN)与类型PSA_KEY_TYPE_HMAC按输出长度分配摘要缓冲PSA_MAC_LENGTH(PSA_KEY_TYPE_HMAC, HMAC_KEY_LEN, PSA_ALG_HMAC(PSA_ALG_SHA_256))导入 32 字节密钥标准 RFC 4231 测试向量0x0b重复 32 次并调用psa_mac_compute()一次性完成 HMAC 计算销毁密钥psa_destroy_key(key_id)导入 128 字节长密钥并再次psa_mac_compute()验证超过 SHA-256 分组长度64 字节的密钥路径这正是 Makefile.dep 中长密钥需要先哈希注释对应的代码路径全程若任一步返回非PSA_SUCCESS即提前返回。值得注意的细节源码注释指出某些 PSA 后端要求数据位于 RAM 而非 ROM因此这些值不能是const这解释了HMAC_MSG[]等缓冲区为何特意声明为可写的static数组——这是与硬件后端如 CryptoCell、安全元件兼容的实践。底层实现psa_mac_compute 的完整调用链测试调用的是公开 PSA APIRIOT 在 psa_crypto.c 中实现psa_mac_compute()其流程可概括为五步状态与参数检查库未初始化返回PSA_ERROR_BAD_STATEinput/mac/mac_length为 NULL 返回PSA_ERROR_INVALID_ARGUMENT读取密钥属性psa_get_key_attributes()取得密钥的类型与位长算法与缓冲区校验内部函数psa_mac_validate_alg_and_key_and_size()psa_crypto.c检查PSA_ALG_IS_HMAC(alg)否则PSA_ERROR_NOT_SUPPORTED、PSA_MAC_LENGTH()计算出的 MAC 长度不小于 4 字节过短的 MAC 可被暴力破解代码注释明确以 32 位为安全下限、不超过PSA_MAC_MAX_SIZE以及调用方提供的缓冲mac_size是否够大否则PSA_ERROR_BUFFER_TOO_SMALL获取并锁定密钥槽psa_get_and_lock_key_slot_with_policy()以PSA_KEY_USAGE_SIGN_MESSAGE策略校验用途并加锁防止并发访问位置分发执行psa_location_dispatch_mac_compute()根据密钥所在位置本地内存、受保护内存或安全元件路由到底层实现。底层实现再经 psa_crypto_algorithm_dispatch.c 按算法分发#if IS_USED(MODULE_PSA_MAC_HMAC_SHA_256) case PSA_ALG_HMAC(PSA_ALG_SHA_256): return psa_mac_compute_hmac_sha256(attributes, key_data, *key_bytes, input, input_length, mac, mac_size, mac_length); #endifpsa_mac_compute_hmac_sha256()等低层包装函数的声明集中在 sys/psa_crypto/include/psa_mac.h每个算法HMAC MD5/SHA-1/SHA-224/SHA-256/SHA-384/SHA-512/SHA3 系列都对应一组compute/verify/sign_setup/verify_setup/update/sign_finish/verify_finish/abort包装由IS_USED(MODULE_PSA_MAC_HMAC_*)条件编译控制——这正是 Makefile 中只启用psa_mac_hmac_sha_256时其余算法代码全部被裁剪掉的原因也是该测试能验证最小 MAC 配置的机制基础。运行与自动化验证测试的自动化断言由 tests/01-run.py 完成——它只做一件事通过 RIOT testrunner 框架等待串口输出精确匹配All Done匹配即判测试通过。常用运行方式RIOT 标准流程# 在 native 上构建并运行软件哈希后端 make -C tests/sys/psa_crypto_mac BOARDnative flash term # 或直接跑自动化测试 make -C tests/sys/psa_crypto_mac BOARDnative test # 指定硬件板将自动选用板载 HMAC 硬件加速后端 make -C tests/sys/psa_crypto_mac BOARDnrf52840dk flash term若 HMAC 计算失败程序会打印HMAC SHA256 failed: PSA 错误名与Tests failed...测试脚本因此无法匹配All Done而报失败——错误信息中的可读错误名可直接对应上述psa_mac_compute()各校验分支。受限于 Flash/RAM 容量并非所有板子都能运行本测试。Makefile.ci 声明了BOARD_INSUFFICIENT_MEMORY将arduino-duemilanove、arduino-leonardo、arduino-nano、arduino-uno、atmega328p、atmega328p-xplained-mini、atmega8、nucleo-l011k4等小内存 AVR/Cortex-M0 板排除在 CI 之外——这些板资源不足以承载 PSA Crypto 模块这也是配置测试必须同时验证的边界条件。进阶从测试到自定义配置本测试验证的是最小 MAC 配置若需要在实际应用中做更多扩展可参考其上游 examples/advanced/psa_crypto启用更多 MAC 算法在USEMODULE中追加psa_mac_hmac_sha_1、psa_mac_hmac_sha_384等每个算法同样支持_backend_periph/_backend_riot/_custom_backend三选一使用安全元件示例支持 Microchip ATECCX08A 设备通过SECURE_ELEMENT1/2启用并使用PSA_KEY_LOCATION_PRIMARY_SECURE_ELEMENT或PSA_KEY_LOCATION_SE_MIN与PSA_KEY_LOCATION_SE_MAX之间的自定义 location 值设备槽位配置结构key_type_allowed、key_persistent、slot_occupied定义于 cryptoauthlib 包中注意当前实现尚不支持使用设备上已预存的密钥通过 Kconfig 配置模块选择用 Make编译期配置如CONFIG_PSA_SINGLE_KEY_COUNT、CONFIG_PSA_PROTECTED_KEY_COUNT、CONFIG_PSA_ASYMMETRIC_KEYPAIR_COUNT则可用menuconfig进行slot 数量配置的宏定义与联动关系见 psa_crypto_slot_management.h。小结tests/sys/psa_crypto_mac虽是一个小型测试却是理解 RIOT PSA Crypto 模块化设计的最佳切片它同时验证了模块裁剪的正确性psa_cryptopsa_macpsa_mac_hmac_sha_256三个模块即可完成 HMAC 计算、后端自动选择机制periph_hmac_sha_256特性驱动 periph/riot 后端切换、密钥槽资源配置CONFIG_PSA_SINGLE_KEY_COUNT1的最小化、API 调用链psa_mac_compute→ 密钥槽加锁 → 算法分发 → 低层 wrapper以及自动化验证流程testrunner 断言All Done。阅读本文后你可以基于这份最小配置在自己的 RIOT 应用中快速搭建 PSA MAC 功能并根据目标硬件自由切换软件或硬件后端。赞分享物联网嵌入式操作系统实时系统【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址https://gitcode.com/GitHub_Trending/riot/RIOT点击查看免费下载相关推荐GetQzonehistoryQQ空间历史数据抓取架构深度解析与技术实现GetQzonehistoryQQ空间历史数据抓取架构深度解析与技术实现 在数字化记忆保存日益重要的今天GetQzonehistory作为一个专业的Pyth物联网嵌入式操作系统实时系统RIOT PSA Crypto Secure Element 测试指南在 ATECC608A 上验证 AES-128、HMAC-SHA256 与 ECDSA P256RIOT PSA Crypto Secure Element 测试指南在 ATECC608A 上验证 AES 128、HMAC SHA256 与 ECDSA物联网嵌入式操作系统实时系统FreeShow安全与隐私保护教堂数据管理的最佳实践与配置指南FreeShow安全与隐私保护教堂数据管理的最佳实践与配置指南 FreeShow作为一款免费开源的教堂演示软件在帮助教会高效管理礼拜内容的同时也非常重视数物联网嵌入式操作系统实时系统上一篇探索Chimee一款强大的开源视频播放器下一篇TencentDB Agent Memory批量操作工具高效管理大量记忆数据的技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考