ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Flipper Zero 固件中 Mbed TLS 的替代实现机制:平台集成、PSA 驱动与 ALT 自定义加密路径

Flipper Zero 固件中 Mbed TLS 的替代实现机制:平台集成、PSA 驱动与 ALT 自定义加密路径 Flipper Zero 固件中 Mbed TLS 的替代实现机制平台集成、PSA 驱动与 ALT 自定义加密路径【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware本文以 Mbed TLS 官方的替代实现架构文档为核心系统讲解 Mbed TLS 功能在编译期被替换的四种机制——平台模块MBEDTLS_PLATFORM_XXX、PSA 密码驱动、模块级 ALT 实现与函数级 ALT 实现并结合 Flipper Zero 固件仓库中实际的mbedtls_cfg.h精简配置与mbedtls.scons构建脚本说明这些机制在嵌入式平台集成中的真实用法帮助读者掌握为 Mbed TLS 接入硬件加速器和裁剪平台依赖的完整路径。一、总体架构功能可在四个层面被替换Mbed TLS 在设计上允许集成者将库的若干功能替换为平台自定义代码。根据 替代实现架构文档替换机制按粒度从粗到细分为四层层级替换对象关键配置项典型场景平台层标准库函数calloc/free、printf、exit等MBEDTLS_PLATFORM_XXX_MACRO/MBEDTLS_PLATFORM_XXX_ALT嵌入式系统无完整 libc、需要自定义内存池PSA 驱动层PSA 接口的密码运算、不透明密钥运算、随机数生成PSA 驱动接口实验性硬件密码引擎HSM/安全协处理器模块层ALT 实现整个模块的上下文类型与全部函数MBEDTLS_XXX_ALT用硬件加速替换 AES/SHA/ECP 等整个模块函数层ALT 实现单个或少量函数MBEDTLS_XXX_YYY_ALT只加速某个热函数如仅mbedtls_aes_encrypt这四层机制在概念上正交平台层解决库如何与操作系统/标准库交互PSA 驱动与 ALT 机制解决密码运算由谁执行。官方文档明确指出一条演进路线PSA 驱动最终会取代替代实现alternative implementation机制但 ALT 机制至少在 Mbed TLS 所有 3.x 版本中仍受支持PSA 驱动接口目前仍处于实验阶段、可能随时变动。二、平台集成platform模块与MBEDTLS_PLATFORM_XXX选项2.1 平台模块的职责范围Mbed TLS 在 Unix/Linux/POSIX 类系统和 Windows 上开箱即用在嵌入式平台上通常需要定制库与底层平台的交互方式。平台模块头文件 platform.h负责控制 Mbed TLS 如何访问标准库能力内存管理calloc、free、printf、exit等。文档指出平台选项通常提供两套并存的机制宏替换机制在配置文件中把MBEDTLS_PLATFORM_XXX_MACRO定义为某个函数名Mbed TLS 内部直接改调该函数不再调用标准库函数xxxALT 动态注册机制定义MBEDTLS_PLATFORM_XXX_ALT然后在平台初始化阶段通过全局函数指针注册替代实现详见 6. 平台函数的替代实现 一节。除标准库函数外平台模块还控制以下方面均出自架构文档的 Platform integration 一节随机数非易失种子MBEDTLS_ENTROPY_NV_SEED启用的非易失种子存储同样通过平台模块控制计时函数可声明 timing 模块的替代实现多线程支持在多线程平台上声明 threading 模块的替代实现熵源配置硬件随机数生成器等熵源通过配置文件中MBEDTLS_ENTROPY_XXX系列选项配置网络层net_sockets模块目前不支持替代实现——如果它在你平台上不可用正确做法是禁用MBEDTLS_NET_C然后为 TLS 使用自定义网络函数加密加速器若平台带有硬件加密加速器可以通过 PSA 驱动接入或声明对应模块/特定函数的替代实现下两节展开。2.2 Flipper Zero 的实例一个刻意瘦身的平台集成Flipper Zero 固件没有使用完整的 Mbed TLS而是采用了一条更激进的集成路径。构建脚本 mbedtls.scons 中可以看到CPPDEFINES[(MBEDTLS_CONFIG_FILE, \\mbedtls_cfg.h\\)]即通过MBEDTLS_CONFIG_FILE宏将配置文件指向仓库根目录下的 mbedtls_cfg.h。该配置文件开头注释写明了它的定位这是与 Flipper Zero 固件和应用相关的 Mbed TLS 配置选项的一个子集编译成名为mbedtls的静态库供应用链接如果应用需要更多功能应通过fap_private_libs把完整 Mbed TLS 带入自己的应用。对照架构文档的平台集成思路mbedtls_cfg.h 中平台模块的两个总开关均被注释掉// #define MBEDTLS_PLATFORM_MEMORY // #define MBEDTLS_PLATFORM_C这意味着固件直接沿用 Mbed TLS 对标准库的默认路径未启用自定义内存池或自定义printf——因为 STM32WB 平台的 FreeRTOS 环境本身就提供了这些标准函数。mbedtls.scons 进一步只编译了固件真正用到的源文件aes.c、bignum.c、ecp.c、sha256.c、ecdsa.c等并加上-mword-relocations -mlong-calls使产物可链接进.fap应用。这个实例恰好验证了文档的要点mbedtls_config.h或自定义配置文件是平台集成的第一落点——Flipper Zero 甚至没有采用 ALT 机制而是从少编译模块这条正交路径完成了裁剪。三、PSA 密码驱动面向硬件密码引擎的驱动接口在存在硬件密码引擎的平台上可以为该引擎实现 PSA 接口驱动。架构文档对驱动能力的描述包括支持透明密钥明文可用的密钥上的密码运算支持不透明密钥仅存在于密码引擎内部上的密码运算支持随机数生成。启用后执行密码运算的psa_xxx函数调用会被路由到驱动而非内置代码。更完整的资料见仓库内的三份文档PSA 密码驱动接口规范PSA 驱动开发者指南PSA 驱动集成指南。文档特别标注了两点适用前提截至 Mbed TLS 3.0该接口仍是实验性的可能随时变动且并非所有运算都已支持驱动配置选项MBEDTLS_USE_PSA_CRYPTO会让部分mbedtls_xxxAPI 转走 PSA crypto 从而获得驱动支持但它与所有驱动尚不完全兼容。从 mbedtls_config.h 的选项注释可以确认MBEDTLS_USE_PSA_CRYPTO与MBEDTLS_ECDH_C/MBEDTLS_ECDSA_C等选项之间存在依赖关系实际启用前需按注释核对选项组合是否合法。Flipper Zero 当前的 mbedtls_cfg.h 未启用 PSA crypto 路径其密码运算全部走mbedtls_xxx传统 API。四、模块替代实现ALT 实现整体替换一个模块4.1 适用模块与启用步骤可以在编译期用自定义实现整体替换的模块包括底层密码模块对称算法、DHM、RSA、ECP、ECJPAKE以及部分平台相关模块threading、timing。此类自定义实现称为替代实现alternative implementation简称ALT 实现。通用原则分三步XXX 为模块名在编译期配置中启用MBEDTLS_XXX_ALT例如 AES 模块用MBEDTLS_AES_ALT。注意这是叠加要求必须同时启用MBEDTLS_XXX_C创建头文件xxx_alt.h定义该模块使用的上下文类型例如 AES 的mbedtls_aes_context实现该模块声明在include/mbedtls/xxx.h即 lib/mbedtls/include/mbedtls/ 目录下的全部函数。官方建议对照 Mbed TLS 文档站中更详细的硬件加速指南hw_acc_guidelines实施。4.2 上下文类型的约束ALT 实现的上下文类型原则上可以是除不完整类型和数组类型外的任意 C 类型实践中通常是struct但存在若干已知的必须保留特定字段的限制。通用规则字段类型和语义必须与内置实现一致但不必位于结构体中的相同位置除非另行说明字段只需可读可以是const不支持修改例如非对称密码的 ALT 实现若用另一种大整数表示只需提供下列字段的可读mbedtls_mpi副本即可。文档列出的具体约束AES若启用了MBEDTLS_AESNI_C或MBEDTLS_PADLOCK_Cmbedtls_aes_context必须包含字段nr和rkDHM若启用了MBEDTLS_DEBUG_Cmbedtls_dhm_context必须包含字段P、Q、G、GX、GY、KECPmbedtls_ecp_group必须包含字段id、P、A、B、G、N、pbits、nbits。若启用MBEDTLS_PK_PARSE_EC_EXTENDED上述字段必须可写并且mbedtls_ecp_point_read_binary()必须支持只设置了P、pbits、A、B的分组结构。4.3 上下文对象的可移动性要求文档还规定了一个容易被忽视的语义约束上下文对象必须能够在内存中搬动在该上下文作为参数传入库函数执行期间除外。这一要求的动机是支持以下应用形态在内层函数栈上构造上下文后向调用链上层拷贝的应用或者运行在具备自动内存管理、可能移动堆对象语言中的应用。文档给出的等价验证序列如下mbedtls_xxx_context ctx1, ctx2; mbedtls_xxx_init(ctx1); mbedtls_xxx_setup(ctx1, ...); ctx2 ctx1; memset(ctx1, 0, sizeof(ctx1)); mbedtls_xxx_do_stuff(ctx2, ...); mbedtls_xxx_free(ctx2);由此推导出的两条实现含义指向上下文或其一部分的指针不得跨函数调用保持有效——实现内部不能缓存某次调用时传入的上下文字段地址供下次调用使用ALT 实现无需支持上下文拷贝上下文的克隆只能通过显式的clone()函数完成。五、函数级替代实现只替换一两个函数在某些场景下无需替换整个模块只需替换一个或少数几个函数。5.1 命名规则与语义替换密码模块中单个函数的配置选项命名规则是函数名大写化并追加_ALT若函数名中含有_internal、_ext或_ret则在_ALT符号中将其去掉。启用对应选项后该函数的内置实现不会被编译必须由集成方在链接期提供替代实现。文档给出的两个典型例子启用MBEDTLS_AES_ENCRYPT_ALT并自行提供mbedtls_aes_encrypt()的实现即可得到一个与内置密钥调度兼容的 AES 加密加速版本若想连密钥调度一起换掉可同时启用MBEDTLS_AES_SETKEY_ENC_ALT并实现mbedtls_aes_setkey_enc()启用MBEDTLS_SHA256_PROCESS_ALT并实现mbedtls_internal_sha256_process()即可同时为 SHA-256 与 SHA-224 提供加速的压缩函数两者共享该内部函数。5.2 关键限制上下文布局必须与内置实现一致函数级 ALT 与模块级 ALT 的分水岭在于函数级替代实现要与其余函数的内置实现协同工作因此上下文对象必须使用与内置实现相同的内存布局。如果需要不同的上下文类型例如换成硬件引擎的句柄结构体就必须升级为提供整个模块的替代实现即第 4 节的MBEDTLS_XXX_ALT路径。六、平台函数的替代实现运行时注册机制与密码模块的链接期替换不同平台函数支持运行时动态重配置。将 Mbed TLS 对标准库函数xxx()的调用改为指向替代实现的完整流程是编译期定义符号MBEDTLS_PLATFORM_XXX_ALT在应用初始化阶段把全局变量mbedtls_xxx赋值为xxx()的替代实现。文档示例要提供自定义printf编译期启用MBEDTLS_PLATFORM_PRINTF_ALT然后在应用初始化期间给mbedtls_printf赋值。这里有一条容易踩坑的语义仅仅启用MBEDTLS_PLATFORM_XXX_ALT并不改变任何行为——默认情况下mbedtls_xxx仍然指向标准函数xxx必须完成第 2 步的运行时赋值才生效。上述全局指针机制在源码中可以直接印证。platform.c 中int (*mbedtls_printf)(const char *, ...) MBEDTLS_PLATFORM_STD_PRINTF; int mbedtls_platform_set_printf(int (*printf_func)(const char *, ...)) { mbedtls_printf printf_func; }全局函数指针默认指向MBEDTLS_PLATFORM_STD_PRINTF标准printf通过mbedtls_platform_set_printf()替换——与文档描述的默认指向标准函数 运行时可重指向完全一致。文档同时提醒存在命名模式的变化形式例如mbedtls_calloc和mbedtls_free这对可配置函数是通过MBEDTLS_PLATFORM_MEMORY成对启用的。因此实施前必须逐个查阅具体配置选项与平台模块的文档不能只凭命名规律推断。七、四种机制的选型与落地建议结合文档内容与仓库实例可以归纳出选型判断链要替换的是标准库交互内存、打印、退出、计时、线程→ 走平台模块优先MBEDTLS_PLATFORM_XXX_MACRO静态宏需要运行时切换时用MBEDTLS_PLATFORM_XXX_ALT 全局指针注册且切记注册必须发生在应用初始化阶段平台有硬件密码引擎且愿意承担实验性接口的风险→ 走 PSA 驱动路线参考 PSA 驱动接口规范 等三份 proposed 文档并接受接口可能变动、部分运算尚不支持的限制要整体替换一个密码模块例如把 ECP 全部换成协处理器实现→ 启用MBEDTLS_XXX_ALT 编写xxx_alt.h逐条核对该模块的上下文字段约束第 4.2 节清单与可移动性语义第 4.3 节只需要加速单个热函数且可接受与内置上下文布局绑定 → 启用MBEDTLS_XXX_YYY_ALT并在链接期提供同名函数实现。对于 Flipper Zero 固件而言当前的实际选择是不启用任何 ALT、直接裁剪模块集合 自定义精简配置文件 子集源码编译其证据链为 mbedtls_cfg.h仅开启 AES/DES、SHA1/SHA224/SHA256/MD5、ECP/ECDH/ECDSA、DHM 等固件所需选项且MBEDTLS_PLATFORM_C/MBEDTLS_PLATFORM_MEMORY保持关闭与 mbedtls.sconsMBEDTLS_CONFIG_FILE指向该配置文件源码白名单编译链接进.fap应用生态。这说明在资源受限但标准库完备的平台上配置裁剪往往比机制替换更经济而 ALT 与 PSA 驱动机制真正发挥价值的位置是标准库残缺或存在硬件密码加速器的平台。【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表