ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Mbed TLS 完全指南:配置、编译、测试与 PSA 密码学 API(结合 Flipper Zero 固件仓库实例解析)

Mbed TLS 完全指南:配置、编译、测试与 PSA 密码学 API(结合 Flipper Zero 固件仓库实例解析) Mbed TLS 完全指南配置、编译、测试与 PSA 密码学 API结合 Flipper Zero 固件仓库实例解析【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware导读本文以 Flipper Zero 固件仓库内 OpenThread 无线协议栈所内置vendored的 Mbed TLS 上游 README 为核心系统讲解 Mbed TLS 这一嵌入式密码学库的配置机制、三大构建系统GNU Make / CMake / Visual Studio、测试体系、平台移植要求与 PSA 密码学 API。读完本文你将掌握如何裁剪 Mbed TLS 特性开关、如何用不同构建模式产出目标库、如何理解并复用其测试框架并能对照当前仓库中主固件侧lib/mbedtls与协处理器侧STM32WB 无线栈两套 Mbed TLS 实例的实际裁剪方式。Mbed TLS 是什么定位与本仓库中的存在形式Mbed TLS 是一个用 C 语言实现的密码学库提供三类核心能力密码学原语cryptographic primitivesAES、DES、RSA、ECCECDH/ECDSA、SHA-1/SHA-256、MD5、RIPEMD-160 等X.509 证书操作证书解析、写入与验证SSL/TLS 与 DTLS 协议完整的安全传输层协议栈。其核心卖点是极小的代码占用small code footprint使其天然适配嵌入式系统——这正是 Flipper Zero 这类资源受限设备的诉求。此外Mbed TLS 还内置了PSA Cryptography API的参考实现在 README 写作时期标注为 preview for evaluation purposes only即仅用于评估的预览版本。在当前仓库中该库以两种形态出现主固件侧独立副本lib/mbedtls含 include 与 library 目录供 Flipper 主固件与外部 .fap 应用链接STM32WB 无线栈内置副本lib/stm32wb_copro/wpan/thread/openthread/stack/third_party/mbedtls/repo即本文关联文档所在目录服务 OpenThread 协议栈Thread 网状网络、CoAP-Secure 等场景。从目录结构看vendored 副本保留了include/含mbedtls/与psa/两套头文件和library/约 120 个.c实现文件覆盖 AES、ECP、ECDSA、TLS/DTLS、X.509、PSA 等全部模块但未包含上游仓库中的programs/示例程序、tests/测试套件、scripts/配置脚本与Makefile/CMakeLists.txt等构建脚本。这一点在阅读下文构建与测试章节时需特别注意README 中描述的make、ctest、scripts/config.py等流程面向上游完整源码树而本仓库内的 vendored 副本是经过裁剪的源码快照。配置机制从 config.h 到仓库内的两套裁剪实践上游配置方式README 原文Mbed TLS 在大多数平台上开箱即用build out of the box但提供了两类配置入口手工编辑完全文档化的配置文件 include/mbedtls/config.h这是选择特性的唯一权威位置——每个MBEDTLS_XXX_C宏开关都对应一个模块的编译与否脚本化编辑使用 Python 3 脚本scripts/config.py运行--help查看用法可在命令行上以程序化方式增删配置项便于 CI 与自动化构建。此外上游在configs/目录中提供了若干面向特定用例的非标准配置例如最小化配置、全功能配置等详见configs/README.txt。编译器选项则沿用惯例通过CC、CFLAGS等环境变量注入 Make 与 CMake 构建系统。仓库实践一主固件侧以独立头文件覆盖默认配置Flipper 主固件没有直接修改上游config.h而是通过编译期强制指定自定义配置头文件。在 lib/mbedtls.scons 中CPPDEFINES[(MBEDTLS_CONFIG_FILE, \\mbedtls_cfg.h\\)],即在编译每个源文件时预定义MBEDTLS_CONFIG_FILEmbedtls_cfg.h而 lib/mbedtls_cfg.h 是 Flipper 维护的精简配置清单其中明确写着设计意图A subset of the mbedTLS configuration options that are relevant to the Flipper Zero firmware and apps并提示如需更多特性应通过fap_private_libs自带完整 mbedTLS 或提交 issue 补充默认配置。该文件呈现了非常典型的嵌入式裁剪思路关键开关包括类别配置宏说明平台/内存MBEDTLS_HAVE_ASM、MBEDTLS_NO_UDBL_DIVISION、MBEDTLS_NO_64BIT_MULTIPLICATION针对 Cortex-M 等无 64 位除法/乘法指令的平台关闭相关代码路径分组密码模式MBEDTLS_CIPHER_MODE_CBC/CFB/CTR/OFB/XTS使能全部常用分组模式填充方式MBEDTLS_CIPHER_PADDING_PKCS7、ONE_AND_ZEROS、ZEROS_AND_LEN、ZEROS支持 PKCS7 等主流填充椭圆曲线MBEDTLS_ECP_DP_SECP256R1_ENABLED其余曲线全部注释、MBEDTLS_ECP_NIST_OPTIM只保留 secp256r1显著缩小 ECP 代码体积模块开关MBEDTLS_AES_C、MBEDTLS_MD5_C、MBEDTLS_SHA1_C、MBEDTLS_SHA224_C、MBEDTLS_SHA256_C、MBEDTLS_DES_C、MBEDTLS_ECDH_C、MBEDTLS_ECDSA_C、MBEDTLS_ECP_C、MBEDTLS_GCM_C、MBEDTLS_CIPHER_C、MBEDTLS_BIGNUM_C、MBEDTLS_ASN1_PARSE_C、MBEDTLS_ASN1_WRITE_C、MBEDTLS_BASE64_C、MBEDTLS_OID_C、MBEDTLS_MD_C、MBEDTLS_DHM_C、MBEDTLS_GENPRIME、MBEDTLS_ERROR_C按需开启的算法与工具模块明确关闭MBEDTLS_CHACHA20_C、MBEDTLS_CHACHAPOLY_C、MBEDTLS_RSA_C、MBEDTLS_RIPEMD160_C、MBEDTLS_PEM_PARSE_C、MBEDTLS_PEM_WRITE_C、MBEDTLS_PLATFORM_C、MBEDTLS_PLATFORM_MEMORY等关闭对固件无用的重模块换体积同时 lib/mbedtls.scons 只挑选了 13 个源文件参与编译aes、bignum、bignum_core、ecdsa、ecp、ecp_curves、md、md5、platform_util、ripemd160、sha1、sha256、des并注释说明如果我们构建完整 mbedtls需要GlobRecursive全部文件否则只取所需文件。这是配置头 源文件白名单双管齐下的体积控制手段。仓库实践二OpenThread 侧面向 Thread 场景的极简配置无线栈副本的配置在 third_party/mbedtls/mbedtls-config.h它不直接定义MBEDTLS_CONFIG_FILE覆盖文件而是自身定义了MBEDTLS_CONFIG_H并#include openthread-core-config.h随后按 OpenThread 的编译选项OPENTHREAD_CONFIG_*条件化地开启 Mbed TLS 特性。几个值得注意的细节算法面收敛到 Thread 实际所需默认开启 AES、ASN1、BIGNUM、CCM、CIPHER、CMAC、CTR_DRBG、ECJPAKE、ECP、MD、SHA224/SHA256、TLS/DTLS 客户端等仅当开启 CoAP-Secure、Border Agent、Commissioner 等选项时才追加MBEDTLS_SSL_SRV_C、MBEDTLS_SSL_COOKIE_C、PSK/ECDHE-ECDSA 密钥交换等内存与性能参数被显式收紧MBEDTLS_MPI_WINDOW_SIZE1、MBEDTLS_MPI_MAX_SIZE32、MBEDTLS_ECP_MAX_BITS256、MBEDTLS_ECP_WINDOW_SIZE2、MBEDTLS_ECP_FIXED_POINT_OPTIM0、MBEDTLS_ENTROPY_MAX_SOURCES1直接限定大数运算与 ECP 的资源上限TLS 层面做定向压缩固定唯一密码套件MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8并依据是否启用 CoAP-Secure 将MBEDTLS_SSL_MAX_CONTENT_LEN设为 900 或 768 字节进出方向同值平台适配关闭默认熵源MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES、MBEDTLS_NO_PLATFORM_ENTROPY内存分配走 OpenThread 平台层MBEDTLS_PLATFORM_STD_CALLOCotPlatCAlloc、MBEDTLS_PLATFORM_STD_FREEotPlatFree未启用外部堆时则退回MBEDTLS_MEMORY_BUFFER_ALLOC_C静态缓冲分配器。以上两套配置恰好是 README 所述在 config.h 中选择特性这一机制在两个不同工程约束下的真实演绎。文档体系在线文档与本地 Doxygen上游 Mbed TLS 主文档托管在 ReadTheDocsPSA Cryptography API 规范文档独立成册。README 同时给出了生成本地 HTML 文档的完整步骤安装 DoxygenREADME 时代推荐 1.8.11稍旧或更新的版本亦可在源码树根目录执行make apidoc用浏览器打开apidoc/index.html或apidoc/modules.html。apidoc输出会针对你当前的编译期配置生成即被config.h裁掉的模块不会出现在文档中。需要注意的是该流程依赖上游完整的 Makefile 体系本仓库的 vendored 副本未携带 Makefile因此这一流程适用于从上游拉取的完整源码树。其他问题渠道可参考同目录下的 SUPPORT.md。编译三大构建系统详解产物划分与链接顺序Make 与 CMake 构建系统产出三个库库依赖关系libmbedcrypto基础密码学原语无依赖libmbedx509依赖libmbedcryptolibmbedtls依赖libmbedx509与libmbedcrypto由于存在链式依赖部分链接器如 GNU ld要求链接旗标按序排列-lmbedtls -lmbedx509 -lmbedcrypto。工具版本要求README 原文GNU Make或 CMake 所支持的构建工具C99 工具链编译器、链接器、归档器——官方测试矩阵为 GCC 5.4、Clang 3.8、IAR8、Visual Studio 2013更新版本应可工作略旧版本可能可用Python 3.6用于生成测试代码Perl用于运行测试。GNU Make 构建仓库上游刻意只使用 Makefile 的最小功能子集以保持与不同工具链的兼容性便于跨平台迁移需要更复杂特性的用户被推荐使用 CMake。make # 构建库与示例程序 make check # 构建并运行测试需 Python 构建 Perl 运行 make no_test # 跳过测试构建 programs/test/selftest # 无测试工具时仍可运行的小型自检集平台相关的关键变量WINDOWS_BUILD1目标为 Windows、但构建环境是 Unix 风格交叉编译、MSYS shell时使用WINDOWS1构建环境本身是 Windows shell如 mingw32-make时使用此时部分目标不可用SHARED1在静态库之外额外生成共享库DEBUG1生成调试构建CFLAGS/LDFLAGS可在环境或命令行覆盖注意CFLAGS会覆盖默认的-O2若只想追加警告选项可写CFLAGS-O2 -WerrorWARNING_CFLAGS单独覆盖默认警告选项默认以-Wall -Wextra开头当编译器不支持-Wall时可用它清空默认值。CMake 构建推荐的独立目录out-of-tree构建mkdir /path/to/build_dir cd /path/to/build_dir cmake /path/to/mbedtls_source cmake --build . ctest # 运行测试需 Python 构建 Perl 执行关键开关与模式cmake -DENABLE_TESTINGOff无 Python/Perl 环境时禁用测试套件仍可运行programs/test/selftestcmake -DUSE_SHARED_MBEDTLS_LIBRARYOn构建共享库cmake -D CMAKE_BUILD_TYPEDebug切换构建模式cmake -LH列出所有可用 CMake 选项。CMake 提供的构建模式大部分面向 gcc/clang如下表模式用途Release默认代码二进制中不含冗余信息Debug含调试信息、关闭优化Coverage在调试信息之外生成代码覆盖率ASan注入 AddressSanitizer 检测内存错误新版 gcc/clang 附带 LeakSanitizer新版 clang 还注入 UndefinedSanitizerASanDbg同 ASan但更慢含调试信息与更好栈回溯MemSan注入 MemorySanitizer 检测未初始化内存读取实验性需 Linux/x86_64 上的新版 clangMemSanDbg同 MemSan更慢含调试信息、栈回溯与来源追踪origin trackingCheck激活依赖优化的编译器警告并将全部警告视为错误CMake 的两条重要约束README 反复强调首次调用cmake之后不能再改编译器与旗标CCyour_cc make/make CCyour_cc均无效CFLAGS同理必须在首次配置时指定CCyour_cc cmake /path/to/mbedtls_source若已配置过想改这些设置必须删除构建目录重建就地构建in-place会覆盖提供的 Makefile可用scripts/tmp_ignore_makefiles.sh防止git status显示它们被修改改CC/CFLAGS时需清除 CMake 缓存例如用 GNU findfind . -iname *cmake* -not -name CMakeLists.txt -exec rm -rf {} 。此外命令行设置CFLAGS时其值不会覆盖CMake 按构建模式提供的内容而是被前置拼接到其后。作为子项目subproject嵌入Mbed TLS 支持被父 CMake 工程通过add_subdirectory()直接引入编译这是将 Mbed TLS 嵌入更大工程的推荐方式。Microsoft Visual Studio上游为 Visual Studio 2010 生成构建文件解决方案文件mbedTLS.sln包含构建库与全部示例程序所需的基础工程。由于测试文件需要 Python 与 Perl 环境生成/执行tests/下的文件不随 VS 工程编译但programs/test/中的 selftest 程序仍可用。与本仓库主固件侧构建的对照Flipper 主固件使用 SCons见根目录 SConstruct 与 firmware.scons而非 Make/CMake但其思路与 README 高度一致在 lib/mbedtls.scons 中为 mbedtls 库附加-mword-relocations与-mlong-calls注释注明Required for lib to be linkable with .faps即让库能被外部应用 ELF 链接并忽略-Wno-redundant-decls这类噪音警告。若你希望在 SCons 工程中以同样的方式复用完整 Mbed TLSGlobRecursive全部library/*.c即为等价于完整构建的做法。示例程序programs/ 目录的定位上游在programs/目录下为大量特性与用例提供了示例程序其说明见上游programs/README.md。README 特别提醒这些示例旨在演示库的特定特性代码需要改造后才能用于真实应用——切勿直接拷贝进产品代码。本仓库的 vendored 副本未包含programs/目录仅保留include/与library/如需示例需取自上游完整源码。测试体系生成式测试与集成测试矩阵Mbed TLS 的测试套件采用**代码生成 数据驱动**模式README 原文测试文件如test_suite_mpi.c最初需要 Python 生成生成的依据是两类源文件function file如suites/test_suite_mpi.function存放测试函数与data file如suites/test_suite_mpi.data存放测试用例——即传给测试函数的参数。在具备 Unix shell 与 OpenSSL可选 GnuTLS的机器上还有一组高层脚本脚本作用tests/ssl-opt.sh各种 TLS 选项重协商、会话恢复等的集成测试并测试与其他实现的互操作性tests/compat.sh每个密码套件与其他实现OpenSSL/GnuTLS的互操作测试tests/scripts/test-ref-configs.pl在多种精简配置下做构建测试tests/scripts/depends.py分别只开启单一曲线、密钥交换、哈希、密码或 pkalg 进行构建测试验证依赖完整性tests/scripts/all.sh组合上述测试并附加更多变体ASan、全量config.h等若不想手工安装全部测试工具可复用 CI 所用的 Docker 镜像详见上游测试基础设施仓库说明。同样地这些脚本在本仓库的 vendored 副本中未包含属于上游工程化资产。移植 Mbed TLS平台前提条件README 明确指出 Mbed TLS 大部分代码是可移植的 C99但存在少量超出 C 标准、而现代主流架构普遍满足的平台要求字节必须为8 位全零位all-bits-zero必须是空指针的合法表示有符号整数必须采用二进制补码表示int与size_t至少32 位宽必须提供uint8_t、uint16_t、uint32_t及其有符号对应类型。结合本仓库Flipper Zero 的两套移植都额外做了平台定制主固件侧通过 lib/mbedtls_cfg.h 的MBEDTLS_NO_UDBL_DIVISION、MBEDTLS_NO_64BIT_MULTIPLICATION适配 Cortex-M 内核缺少 64 位除法/乘法指令的问题改为软件模拟路径OpenThread 侧则在 mbedtls-config.h 中通过MBEDTLS_PLATFORM_MEMORYotPlatCAlloc/otPlatFree或MBEDTLS_MEMORY_BUFFER_ALLOC_C把内存分配接回 Thread 平台层并关闭默认熵源由平台自备随机数这正对应 README 知识库中移植到新环境/OS外部依赖有哪些如何配置三类经典问题。PSA Cryptography API设计与参考实现PSA 是什么Arm 的Platform Security ArchitecturePSA是一套涵盖威胁模型、安全分析、硬件与固件架构规范、以及开源固件参考实现的整体安全方案主张基于行业最佳实践把安全在硬件和固件两个层面一致地设计进去。PSA Cryptography API则提供对一组密码学原语的统一访问接口具备双重用途在 PSA 合规平台上构建安全服务安全启动 secure boot、安全存储 secure storage、安全通信 secure communication脱离其他 PSA 组件在任意平台上独立使用。API 设计目标README 原文调用者内存与内部内存分离库可在隔离空间实现无需隔离时可退化为直接函数调用需要隔离时可实现为远程过程调用RPC内部数据结构对应用隐藏允许在编译期或运行期替换替代实现如接入硬件加速器密钥全部通过 key identifier 访问透明支持外部密码协处理器算法接口泛化优先算法敏捷性algorithm agility易用且难以误用接口设计以安全易用为第一目标。本仓库中的 PSA 实现Mbed TLS 内置 PSA Cryptography API 的参考实现README 明确声明其成熟度低于库的其他部分——部分代码未经同样深入的评审部分实现尚未针对代码体积充分优化。X.509 与 TLS 代码可以通过在config.h中开启MBEDTLS_USE_PSA_CRYPTO来对有限的操作子集使用 PSA 密码学路径。当前仍存在若干与最新规范的偏差合规问题清单以 GitHub 上游 issue 为准。在本仓库的 vendored 副本中可看到 PSA 模块的实体存在include/psa 头文件目录以及 library 下的psa_crypto.c、psa_crypto_aead.c、psa_crypto_cipher.c、psa_crypto_ecp.c、psa_crypto_hash.c、psa_crypto_mac.c、psa_crypto_rsa.c、psa_crypto_slot_management.c、psa_crypto_storage.c、psa_crypto_driver_wrappers.c等系列实现文件同时存在include/mbedtls/config_psa.h与include/mbedtls/psa_util.h印证了 README 对 PSA 实现模块的描述。展望中的特性README 原文上游计划中的后续能力包括驱动编程接口为选定算法接入硬件加速器代替软件实现、外部密钥支持密钥只存储与操作于独立密码协处理器、按需编译的配置机制只编译应用所需算法、以及更广的算法集合。License 与贡献方式除非文件内另有明确说明Mbed TLS 文件采用Apache-2.0 OR GPL-2.0-or-later双许可证SPDX 表达完整文本见 LICENSE贡献规范中License and Copyright一节见 CONTRIBUTING.md。联系方式上游渠道供参考报告安全漏洞发送邮件至 mbed-tls-security 列表流程详见 SECURITY.md报告 Bug 或请求特性在上游 GitHub 仓库提交 issue其他讨论与支持渠道SUPPORT.md。总结在 Flipper Zero 固件中实际运用本文知识将 README 的通用知识与本仓库落地结合可以形成三条可直接执行的行动路线裁剪验证对照 lib/mbedtls_cfg.h 理解每个MBEDTLS_*宏对固件体积/功能的影响新增功能时按曲线→模块→填充/模式逐级放开并用MBEDTLS_ERROR_C辅助运行时诊断跨副本比对主固件侧副本lib/mbedtls与 OpenThread 侧副本repo功能面完全不同——前者偏重 AES/DES/哈希与 ECDSA 的本地应用场景后者收敛到 Thread 的 ECJPAKE AES-128-CCM-8 DTLS 场景可据此判断新增密码学需求应接入哪一侧复用测试思想虽然 vendored 副本不含上游tests/但其function 文件 data 文件生成测试与单一特性构建验证depends.py 思路的方法论同样适用于为 Flipper 固件的密码学模块编写数据驱动的单元测试。【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表