PolarSSL项目中NIST密钥封装算法向PSA API迁移的技术解析
2025-06-05 06:19:53作者:明树来
背景与动机
在密码学领域,密钥封装(Key Wrapping)是一种重要的加密操作,用于安全地保护对称密钥的传输和存储。NIST SP 800-38F标准定义了两种密钥封装算法:KW(Key Wrap)和KWP(Key Wrap with Padding)。这些算法在PolarSSL/mbedTLS项目中已有实现,但当前实现基于传统的cipher.h接口。
随着PSA(Portable Security Architecture)加密API的成熟,将NIST KW/KWP算法迁移到PSA API成为必要之举。这种迁移不仅能统一项目的加密接口,还能更好地支持安全隔离环境下的密钥管理。
技术变更要点
本次迁移涉及以下几个核心变更:
- 接口重构:从基于上下文的传统接口转向基于PSA密钥标识符的现代接口
- 错误处理:从传统的错误代码转向PSA标准的错误代码体系
- 参数顺序:调整参数顺序以符合PSA API的规范
- 实现方式:底层从cipher.h转向psa_cipher_xxx系列函数
新旧接口对比
传统接口(将被废弃)
typedef struct mbedtls_nist_kw_context {
// 上下文数据结构
} mbedtls_nist_kw_context;
int mbedtls_nist_kw_setkey(mbedtls_nist_kw_context *ctx,
mbedtls_nist_kw_mode_t mode,
const unsigned char *key,
unsigned int keybits,
int is_wrap);
int mbedtls_nist_kw_wrap(mbedtls_nist_kw_context *ctx,
const unsigned char *input, size_t in_len,
unsigned char *output, size_t *out_len,
size_t out_size);
int mbedtls_nist_kw_unwrap(mbedtls_nist_kw_context *ctx,
const unsigned char *input, size_t in_len,
unsigned char *output, size_t *out_len,
size_t out_size);
新PSA接口
psa_status_t mbedtls_nist_kw_wrap(mbedtls_svc_key_id_t key,
mbedtls_nist_kw_mode_t mode,
const unsigned char *input, size_t input_length,
unsigned char *output, size_t output_size,
size_t *output_length);
psa_status_t mbedtls_nist_kw_unwrap(mbedtls_svc_key_id_t key,
mbedtls_nist_kw_mode_t mode,
const unsigned char *input, size_t input_length,
unsigned char *output, size_t output_size,
size_t *output_length);
实现细节分析
-
密钥管理:新接口直接使用PSA密钥标识符(mbedtls_svc_key_id_t),这意味着密钥可以来自安全存储或硬件安全模块(HSM),而不仅限于内存中的原始密钥数据。
-
算法限制:虽然KW/KWP理论上可以支持任何128位分组密码,但实现中仍限定为AES算法。这是出于兼容性和安全性的综合考虑:
- 验证密钥类型为PSA_KEY_TYPE_AES
- 不扩展支持其他分组密码(如Camellia)
-
底层实现:使用PSA的多部分API(psa_cipher_xxx)来实现ECB模式操作,这是KW/KWP算法的基础。
-
错误处理:全面采用PSA错误代码体系,便于与PSA生态系统集成。
迁移带来的优势
- 安全性提升:PSA API提供了更好的密钥隔离和保护机制
- 代码简化:消除了上下文管理相关的代码
- 一致性:与项目其他加密操作使用相同的API风格
- 未来扩展性:为将来可能的PSA原生KW/KWP支持奠定了基础
开发者注意事项
- 密钥准备:在使用新接口前,必须通过PSA密钥管理接口导入或生成AES密钥
- 缓冲区管理:输出缓冲区大小应足够容纳封装后的数据(KW模式需要至少8字节填充,KWP模式可能更多)
- 错误处理:需要适应PSA错误代码体系,特别是处理PSA_ERROR_NOT_SUPPORTED等新错误情况
- 线程安全:PSA API本身是线程安全的,但密钥的生命周期管理需要注意
总结
这次NIST KW/KWP算法向PSA API的迁移是PolarSSL/mbedTLS项目现代化进程中的重要一步。它不仅统一了加密接口,还提升了密钥管理的安全性。虽然目前实现仍限定于AES算法,但基于PSA的架构为未来可能的扩展留下了空间。开发者应尽快适应新的API风格,享受更安全、更一致的加密操作体验。
登录后查看全文
热门项目推荐
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0191
cann-learning-hubCANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。Jupyter Notebook0118
Step-3.7-FlashStep-3.7-Flash是一个拥有 1980 亿参数的稀疏混合专家(MoE)视觉语言模型,由 1960 亿参数的语言主干网络和 18 亿参数的视觉编码器组合而成,具备原生图像理解能力。Python00
JoyAI-EchoJoyAI-Echo,这是一个独立的、仅用于推理的版本,旨在实现分钟级多镜头音视频生成。它采用了经过蒸馏的DMD生成器、配对的跨模态记忆以及故事级别的一致性。其性能的核心在于,一个跨模态视听记忆库能够在长达五分钟的视频中保持角色外观和语音音色的一致性。同时,一个训练后处理流程将基于记忆的强化学习与分布匹配蒸馏相结合,实现了7.5倍的速度提升,显著增强了视觉质量和对齐效果。00
fun-rec推荐系统入门教程,在线阅读地址:https://datawhalechina.github.io/fun-rec/Python03
so-large-lm大模型基础: 一文了解大模型基础知识01
热门内容推荐
最新内容推荐
项目优选
收起
暂无描述
Dockerfile
764
4.98 K
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
857
1.93 K
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
684
1.33 K
Ascend Extension for PyTorch
Python
719
882
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.08 K
1.1 K
deepin linux kernel
C
32
16
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
457
439
用户可使用该项目在 OpenHarmony 平台开发应用,支持通过 IDE 或终端用 Flutter Tools 指令编译构建,基于 Flutter 3.27.4 版本,新增 impeller-vulkan 渲染模式,兼容多种开发指令与环境配置。
Dart
1.01 K
261
华为昇腾面向大规模分布式训练的多模态大模型套件,支撑多模态生成、多模态理解。
Python
151
253
CANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。
Python
998
609