
人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载导读本文基于仓库中 vendored 的 Mbed TLS 内部架构文档 strategy.md系统梳理 Mbed TLS 向 PSA Crypto 迁移的整体策略——包括五个迁移目标G1–G5、两个核心编译期选项MBEDTLS_PSA_CRYPTO_C与MBEDTLS_USE_PSA_CRYPTO及背后的设计权衡并逐一剖析 PK/MD/Cipher 三个抽象层所采用的三条迁移路径与最终退出 legacy API 的路线图。读完本文你将能够理解 TEN-framework 所依赖的 third_party/mbedtls 中这些配置宏的语义、相互约束关系以及它们在 TLS/X.509 与 PK 模块中的实际作用位置为评估或裁剪该第三方依赖提供直接依据。一、文档定位一份进行中的架构迁移策略strategy.md是 Mbed TLS 仓库中专门记录 PSA Crypto 迁移策略的架构文档。它的定位不是用户手册而是面向库维护者与深度集成者的策略说明书解释迄今为止的迁移思路、未来的展望方向以及仍悬而未决的开放问题。文档内容以early 2022为时间基准因此在阅读时需要注意部分结论例如mbedtls_cipher_setup_psa()的存废、PK 层对 PSA 的静默调用已在后续版本中发生了演进仓库内的实际头文件与实现代码才是判断当前状态的最终依据。在 TEN-framework 中Mbed TLS 以third_party/mbedtls形式完整 vendored 进仓库是 TLS/网络加密能力的基础依赖仓库内的 libwebsockets、curl 等第三方组件均依赖其密码学能力。因此本文所讨论的迁移策略不仅是一份上游文档的转述更直接影响仓库中 mbedtls 子树的配置解读与未来升级评估。二、迁移目标G1–G5 与它们的依赖关系文档首先明确了从 legacy API 迁移到 PSA Crypto 期望获得的五项收益编号目标含义G1使用 PSA Crypto 驱动当硬件/软件 PSA 驱动可用时X.509 与 TLS 中的密码学运算改由 PSA Crypto API 完成G2长期密钥隔离私钥等长期机密可交由 PSA 密钥槽key slot管理应用层不再接触明文密钥材料G3短期密钥隔离TLS 会话密钥等短期机密同样纳入隔离管理G4统一、干净的 Crypto API最终退役 legacy API只保留 PSA Crypto 这一套统一接口G5代码体积收益当 PSA 驱动可用时可将对应的软件实现整体编译掉compile out文档特别强调编号顺序并不代表严格的依赖链。G2–G5 在理论上可以以任意顺序推进但它们要么直接依赖 G1要么在 G1 先完成后实现起来便宜得多。这里要精确理解不是G1 必须整体完成才能做 G2而是G2–G5 的每一个具体片段都会被 G1 中的某个具体片段所帮助。基于此文档给出的一个稳妥的中间里程碑是在启用MBEDTLS_USE_PSA_CRYPTO时完整实现 G1——即 X.509 和 TLS 中的全部密码学运算都经由 PSA Crypto API 完成。截至文档写作时间G1 与 G2 的部分内容已在MBEDTLS_USE_PSA_CRYPTO启用时实现其中 G2 要真正生效还要求应用层改用新的 API例如下文将介绍的mbedtls_pk_setup_opaque()。三、两个核心编译期选项及其设计权衡迁移策略的落地依赖两个编译期宏二者的分工是MBEDTLS_PSA_CRYPTO_C默认启用控制 PSA Crypto API 本身是否存在。它是 PSA 能力的基础开关。MBEDTLS_USE_PSA_CRYPTO默认禁用在 full 配置中启用控制 X.509 与 TLS 内部是否使用PSA Crypto API 执行运算对应 G1同时打开若干新 API对应 G2。上述语义在仓库头文件中有完全一致的记载。查看 mbedtls_config.h 可以看到MBEDTLS_USE_PSA_CRYPTO的注释明确写着使 X.509 与 TLS 库使用 PSA 执行密码学运算并启用使用 PSA 管理密钥的新 APIRequires: MBEDTLS_PSA_CRYPTO_CConflicts with: MBEDTLS_ECP_RESTARTABLE默认状态为注释关闭//#define MBEDTLS_USE_PSA_CRYPTO。MBEDTLS_PSA_CRYPTO_CONFIG允许把通过 PSA API 支持的密码机制与通过 mbedtls API 支持的机制分开配置启用后由include/psa/crypto_config.h中的PSA_WANT_XXX符号决定 PSA 暴露哪些机制且注明该特性仍属实验性尚未达到生产就绪。3.1 为什么MBEDTLS_USE_PSA_CRYPTO是可选的且默认关闭文档给出了三组理由这正是策略中最值得深读的部分与MBEDTLS_ECP_RESTARTABLE不兼容详见第四节与MBEDTLS_PSA_CRYPTO_CONFIG配合不佳——二者虽然能同时编译但MBEDTLS_PSA_CRYPTO_CONFIG的核心价值纯驱动构建会失效详见第四节避免 TLS、X.509 和 PK 对MBEDTLS_PSA_CRYPTO_C产生硬依赖以保持向后兼容一旦MBEDTLS_PSA_CRYPTO_C被启用并被实际使用应用必须在 TLS/X.509 使用 PSA 函数之前调用psa_crypto_init()。这一硬性前置要求本身就足以阻止将该选项默认打开MBEDTLS_PSA_CRYPTO_C硬性依赖MBEDTLS_ENTROPY_C || MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG但当前完全可以构建一个不含上述任何选项的 TLS/X.509。又不能简单地自动打开MBEDTLS_ENTROPY_C它在所有平台上都无法开箱即用地构建更遑论MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG它要求用户提供 RNG 函数。由此带来的代价是在确定让MBEDTLS_USE_PSA_CRYPTO变为非可选始终启用之前代码库中部分模块必须同时维护两条路径——一条走 PSA一条走 legacy API。文档也指出这正是下一节三种抽象层策略试图降低的维护成本。截至文档写作时early 2022关于向后兼容问题的最终取舍例如在下一个大版本前维持双代码路径还是实现解决方案尚无定论。3.2 与源码的互相印证这些选项不仅在文档与头文件中被描述也在实际构建与测试流程中被反复验证。仓库 tests/scripts/all.sh 的构建矩阵中就大量出现scripts/config.py set MBEDTLS_USE_PSA_CRYPTO/scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO如第 1067、1090、1113、1141、1166 行说明上游 CI 会分别在启用与禁用该选项两种配置下构建并跑全套测试以保障双路径的质量。此外build_info.h 中有一条联动规则MBEDTLS_PK_C MBEDTLS_USE_PSA_CRYPTO会自动推导出MBEDTLS_PK_WRITE_C可见该选项并非孤立开关它还会触发一系列衍生配置变化。四、三个关键约束的深入解读4.1MBEDTLS_ECP_RESTARTABLE与 PSA 的可重启冲突MBEDTLS_ECP_RESTARTABLE不仅控制密码库中可重启 API 的存在还控制它们在 TLS 与 X.509 层中的使用。而PSA Crypto 目前不支持可重启运算冲突因此是结构性的TLS/X.509 层不可能只用 PSA API 又获得可重启行为。文档披露在 PSA 中支持可重启运算已列入路线图社区确有请求但其优先级远低于将MBEDTLS_USE_PSA_CRYPTO推广到主流用例。因此中期结论是二者保持不兼容。值得一提的是文档也指出一个技术上的如果愿意投入工作量就能兼容的方案启用USE_PSA_CRYPTO时默认走 PSA仅当运行时显式请求可重启行为时才分派到 legacy 路径——这需要分派逻辑与测试工作。但鉴于 PSA 迟早会支持可重启early 2022 的温和共识是不值得为了临时的兼容性投入。4.2MBEDTLS_PSA_CRYPTO_CONFIG算法可用性判定错位这一节内容源自维护者 Gilles 的评论。问题的本质是判定算法是否可用的宏体系错位X.509 与 TLS 代码使用MBEDTLS_xxx宏判断算法是否受支持而MBEDTLS_PSA_CRYPTO_CONFIG的价值恰恰是只通过 PSA 驱动支持某算法、完全不构建其软件实现结果库确实构建了该算法通过驱动但 TLS 层看MBEDTLS_xxx宏发现未定义于是认为算法不可用。也就是说MBEDTLS_USE_PSA_CRYPTO与MBEDTLS_PSA_CRYPTO_CONFIG并非编译不兼容而是与MBEDTLS_PSA_CRYPTO_CONFIG的大多数有价值的用法不兼容。文档坦承这一问题的既有设计方案对应上游跟踪的 #3674、#3677 两个 issue经重新审视后被认为行不通需要更多设计工作。该能力是多方合作伙伴的明确需求属必须支持的方向同时作者建议优先为MBEDTLS_USE_PSA_CRYPTO MBEDTLS_PSA_CRYPTO_CONFIG设计好架构再扩展协议特性覆盖——因为架构改动必然触及存量代码趁代码量少时做更划算而协议特性扩展无论先后工作量相同。4.3 始终启用时的向后兼容问题always on 的两难文档列出两条主要障碍psa_crypto_init()前置调用存量应用可能未在调用 TLS/X.509/PK 前初始化 PSA。可尝试在底层按需隐式调用但这大概率要求把初始化拆成可失败部分与不可失败部分对应上游 psa-crypto-api 的 #536 讨论。熵源依赖当前无法在无MBEDTLS_ENTROPY_C的配置中启用MBEDTLS_PSA_CRYPTO_C而ENTROPY_C又不能被自动启用平台适配问题。若想绕开需要做两类工作梳理 PSA 代码库的依赖使不依赖 RNG 的部分典型如公钥运算、对称密码、部分密钥管理如 destroy 等可在无ENTROPY_C的配置中启用——风险在于可能隐藏着恼人甚至意外的依赖为需要 RNG 的运算提供接收显式f_rng参数的替代函数对应上游 #5238供无熵构建使用——代价是这些函数的调用方仍需维护带熵版走标准函数、无熵版走显式参数的两份代码。这些问题的整体跟踪见上游 #5156。文档明确承认这些解决方案的成本是否低于维护双代码路径直到下一大版本的成本在当时并无结论。五、三条抽象层迁移路径PK / MD / CipherMbed TLS 的 Crypto 库现有三个提供算法无关 API的抽象层MD消息摘要哈希含 HMACCipher对称密码含 AEADPK非对称公钥密码不含密钥交换FFDH/ECDH 不在任何抽象层覆盖范围内。这些抽象层除运算 API 外还提供算法类型与数值标识符例如mbedtls_cipher_mode_t及其取值。当前策略是即使启用MBEDTLS_USE_PSA_CRYPTO在存量结构与公共 API 中继续沿用这些 legacy 标识符这对 G1–G3 无碍只与 G4 相关。针对这些抽象层在迁移中的位置文档给出了三种策略并逐一说明了当前early 2022的采用情况。5.1 策略 A抽象层内部静默调用 PSAsilently call to PSA做法在抽象层中条件编译于USE_PSA_CRYPTO提供包装函数的新实现内部调用 PSA 而非 legacy API优点改动收敛在单一位置TLS/X.509 代码完全不需要改动缺点若 PSA 实现目前正构建在该抽象层之上会形成依赖环实现起来棘手适用现状该策略当前用于 PK 层的全部运算对应 G1。文档预计 PK 层会在一段时间内继续采用此策略因为 PK 层的部分职责X.509/TLS 所需格式的解析/写出、ECDSA 签名尚未被 PSA 覆盖必须保留同时 PK 层也是将来在 PSA 未覆盖部分与mbedtls_xxx_restartable之间做分派的好位置。仓库源码可以直观印证这一静默调用路径。在 pk.c 中RSA-PSS 签名验证在MBEDTLS_USE_PSA_CRYPTO下直接走 PSA 路径先通过mbedtls_pk_write_pubkey()导出公钥再用psa_import_key()导入 PSA 密钥槽、以psa_verify_hash()完成验证最后psa_destroy_key()清理——而调用方mbedtls_pk_verify()等 PK 层 API 的签名对上层完全透明。这正是PK 层静默转 PSA、TLS/X.509 无感知的实现证据。5.2 策略 B逐调用点替换replace calls for each operation做法对 TLS/X.509 中经由该抽象层的每个运算在USE_PSA_CRYPTO条件下把函数调用直接替换为 PSA 调用优点一概念简单若 PSA 实现正构建在该抽象层之上也天然规避了依赖环问题优点二为构建不含该抽象层的 TLS/X.509打开大门可节省代码体积呼应 G5缺点TLS/X.509 代码需要在每一个运算点做改造适用现状当前用于 MD 层与 Cipher 层对应 G1。5.3 策略 C抽象层 opt-in 使用 PSAopt-in use of PSA from the abstraction layer做法提供一种新的上下文设置方式使得基于该上下文的运算经由 PSA 完成优点一改动基本集中在单点——TLS/X.509 只需在建立上下文时修改使用处无需改动尤其是不必改动/复制那些期望以本层上下文传入密钥的存量公共 API如mbedtls_pk_context优点二PSA 构建在该抽象层之上时同样可避免依赖环缺点当上下文通常由应用建立时要求应用代码做出修改局限对无上下文的单发函数如mbedtls_md()不适用。该策略有两个变体带密钥隔离密钥只由 PSA 持有同时支持该区域的 G1 与 G2与不带隔离密钥大部分时间仍存于 PSA 之外仅支持 G1。策略 C 的两个历史/现状落点都值得注意PK 层带隔离用于私有密钥运算即mbedtls_pk_setup_opaque()。仓库头文件 pk.h 给出了完整契约该函数在MBEDTLS_USE_PSA_CRYPTO下可用用于把一个可能是不透明的PSA 密钥包装进mbedtls_pk_context被包装的密钥在其被使用期间必须保持有效当前仅支持 ECC/RSA 密钥对含私钥材料且mbedtls_pk_free()不会释放底层 PSA 密钥用户需自行调用psa_destroy_key()。它的价值正如文档所述让 TLS/X.509 无需改动即可使用 PSA 持有的私有 ECDSA 密钥仅需应用层做一处受控修改。Cipher 层不带隔离历史方案即mbedtls_cipher_setup_psa()允许 TLS 在应用零改动的情况下经 PSA 做密码运算仅支持部分密码算法。文档注明该方案使用至 3.1 版本含在仓库当前头文件 cipher.h 中该函数已标记为MBEDTLS_DEPRECATED注释明确建议改用psa_aead_xxx()/psa_cipher_xxx()直接调用——这正是文档所描述演进路线在代码中的落点。5.4 策略小结文档原文表格当前early 2022各抽象层的采用情况抽象层目标策略PKG1静默调用 PSAPKG2opt-in 使用 PSA新密钥类型CipherG1逐调用点替换MDG1逐调用点替换文档还补充了一个重要观察在 PK 层的私有密钥运算上静默与opt-in两种策略可以互补共存——前者无需应用改动即可获得驱动支持但不提供隔离后者以不可避免的应用代码改动换取密钥隔离。六、迈向 G4离开 legacy API 的路线图6.1 用 PK/Cipher/MD 层降低用户迁移成本既然库内部正是借助这三个抽象层减少了需要改动的代码位置很自然地考虑把同一策略复用于应用层迁移。但一个必要前提是先确保 PSA 不再构建在这些抽象层之上否则会陷入依赖环。6.2 零成本兼容层是否可行最理想的情形是零成本抽象无运行时、RAM 或代码体积代价例如一组#define把mbedtls_API 直接映射到psa_等价物。文档的判断是不太可能完全成立。原因在于上下文模型的差异MD 层对哈希与 HMAC 共用同一上下文类型而 PSA API 将其区分为不同运算类型Cipher 层对非认证与 AEAD 密码共用同一上下文类型PSA API 同样区分二者。因此一个不完整如 MD 仅覆盖哈希、Cipher 仅覆盖 AEAD或与现有 API 差异显著如引入新上下文类型的零成本层其用户价值本身存疑。6.3 低成本兼容层临时过渡方案另一种思路是保留 PK/MD/Cipher 现有 API 的大部分乃至全部在其上基于 PSA 实现追求尽可能低的成本。文档给出的具体设计示例将mbedtls_md_context_t定义为psa_hash_operation_t与psa_mac_operation_t的带标签的联合体mbedtls_md_setup()初始化对应部分其余函数退化为 PSA 的简单包装——这样可大幅降低层内复杂度无需经函数指针分派直接调用对应 PSA API。不过这仍非零成本代码体积 测试等维护开销因此大概率是临时方案例如在 4.0 中保留并使其可选到 5.0 移除。其价值最大化前提是维持现有 API 不变而这与降低成本的目标可能存在冲突需要判断取舍。文档还给出两个与 PK 层相关的补充考量公钥存放位置取决于代码结构公钥数据更适合由 PK 层自己管理内存、仅在需要时移入 PSA 密钥槽参见MBEDTLS_USE_PSA_CRYPTO下ecdsa_verify_wrap的现状。例如一次性解析大量 X.509 证书如受信根证书列表时让 N 个公钥长期占据 N 个 PSA 密钥槽并不可取另一解法是X.509 按需解析对应 #2478将公钥以字节形式存在证书结构内、实际使用时才移入 PK 上下文/PSA 槽。PK 层的双重性质密码运算部分将归 PSA 覆盖而多格式的解析/写出导出部分目前未被 PSA Crypto API 完整覆盖——这两部分未来需要分开对待。6.4 算法标识符用#define提供过渡为用户提供一组标识符映射#define是低成本的例如#define MBEDTLS_MD_SHA256 PSA_ALG_SHA_256。多数此类定义位于 MD/Cipher/PK 兼容层内但其他模块如椭圆曲线的标识符也值得考虑。6.5 低层模块退役且不提供兼容 API文档明确所有低层、非通用的算法模块AES、SHA-256、RSA、DHM、ECDH、ECP、bignum 等整体退役且不提供兼容 API引导用户转向 PSA API。兼容实现只服务于原本使用 PK/MD/Cipher 通用 API 的用户而非使用低级算法专属 API 的用户。6.6 TLS 与 X.509 公共 API 的两种受影响方式依赖 legacy 密码类型的 API典型如mbedtls_ssl_conf_own_cert()——当前私钥以mbedtls_pk_context传入未来可能改为psa_key_id_t。由于部分用户仍会用兼容 PK 层需要提供从 PK 上下文便捷提取 PSA 密钥 ID 的手段。接受标识符列表的 API典型如mbedtls_ssl_conf_curves()接受mbedtls_ecp_group_id列表。可改为接受(psa_ecc_family_t, size)对列表但更值得借机迁移到与底层实现无关的 TLS 专用标识符基于 IANA 值或自定义枚举——这正是新版mbedtls_ssl_conf_groups()API对应 #4859已经采用的路线。6.7 测试质量的保全当低层 API 被移除、PK/MD/Cipher 变为可选兼容层时必须保住测试质量大量现存测试用例基于低层 API 编写届时要么继续以该 API 测试要么手工迁移到 PSA Crypto API也可能是二者组合并随时间渐进演化——文档将此列为需要仔细权衡的开放问题。七、总结当前状态与开放问题综合来看这份策略文档呈现了一幅清晰的演进图景已完成/进行中MBEDTLS_USE_PSA_CRYPTO下 X.509/TLS 部分密码学运算转入 PSAG1 部分达成PSA 持有的私有密钥可通过mbedtls_pk_setup_opaque()无缝用于 TLS/X.509G2 部分达成双路径维护成本在选项变为始终启用之前代码需同时维护 PSA 与 legacy 两条路径PK 层用静默调用、MD/Cipher 层用逐点替换、PK 私钥运算用opt-in来分别降低这一成本仍开放的决策PSA 内支持可重启运算解决与MBEDTLS_ECP_RESTARTABLE的冲突、MBEDTLS_USE_PSA_CRYPTO与MBEDTLS_PSA_CRYPTO_CONFIG协同的架构设计、无熵配置下启用 PSA 的依赖梳理、兼容层是走零成本还是低成本后者可能仅在 4.0/5.0 之间存在、低层 API 移除后的测试迁移策略等。对于希望深入验证的读者建议对照阅读仓库内的配套文档 use-psa-crypto.md对MBEDTLS_USE_PSA_CRYPTO当前行为与未覆盖部分有完整描述、配置头文件 mbedtls_config.h 以及 PK 层实现 pk.c并参考 tests/scripts/all.sh 中的双配置构建矩阵即可将本文所述策略逐一落实到代码层面加以印证。赞分享人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载相关推荐Academic Research Skills 安装指南两条命令搭好论文流水线Academic Research Skills 安装指南两条命令搭好论文流水线 Academic Research Skills简称 ARS是一款面向学AI 技能科研AI 评测人工智能Mbed TLS PSA 迁移测试策略全解如何为 MBEDTLS_USE_PSA_CRYPTO 构建三层验证体系Mbed TLS PSA 迁移测试策略全解如何为 MBEDTLS_USE_PSA_CRYPTO 构建三层验证体系 MBEDTLS_USE_PSA_CRYPTO人工智能AI Agent多模态语音AI 应用ESP-IDF v6.0 安全与加密迁移指南Mbed TLS 4.x 与 PSA Crypto 升级全解析ESP IDF v6.0 安全与加密迁移指南Mbed TLS 4.x 与 PSA Crypto 升级全解析 本文是 ESP IDF v6.0 迁移系列中关于安物联网嵌入式上一篇5分钟跑通WechatRealFriends微信单向好友检测把偷偷删你的人一次查清下一篇VK 视频下载工具如何 3 步把任意 VK 视频保存到本地创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考