ARMmbed/mbedtls项目中的驱动专用构建指南
mbedtls 项目地址: https://gitcode.com/gh_mirrors/mbe/mbedtls
概述
在嵌入式系统开发中,为了优化代码大小或利用硬件加速模块,开发者可能需要构建仅通过PSA驱动提供加密功能的Mbed TLS版本。本文将详细介绍如何在ARMmbed/mbedtls项目中配置驱动专用构建,以及相关的技术细节和注意事项。
基本概念
驱动专用构建是指Mbed TLS中某些加密机制完全由PSA驱动提供,而不包含内置实现。这种方式特别适用于以下场景:
- 使用硬件加速模块提高性能
- 采用针对代码大小优化的替代软件实现
- 需要减少固件体积的嵌入式应用
配置基础
必备编译选项
要启用驱动专用构建,需要配置以下编译选项:
MBEDTLS_PSA_CRYPTO_C
(默认启用):启用PSA加密功能MBEDTLS_USE_PSA_CRYPTO
(默认禁用):使PK、X.509和TLS模块使用PSA加密MBEDTLS_PSA_CRYPTO_CONFIG
(默认禁用):通过PSA_WANT
宏配置加密算法
机制配置步骤
对于每个仅由驱动提供的加密机制,需要:
- 在
psa/crypto_config.h
中定义对应的PSA_WANT
宏 - 在构建中定义对应的
MBEDTLS_PSA_ACCEL
宏 - 在
mbedtls/mbedtls_config.h
中取消定义对应的MBEDTLS_xxx_C
宏
例如,要仅通过驱动提供SHA-256,需要:
- 定义
PSA_WANT_ALG_SHA_256
和MBEDTLS_PSA_ACCEL_SHA_256
- 取消定义
MBEDTLS_SHA256_C
运行时注意事项
在使用驱动专用机制前,必须调用psa_crypto_init()
进行初始化。这已经是PSA加密API的基本要求,当启用MBEDTLS_USE_PSA_CRYPTO
时,PK、X.509和TLS模块也需遵循此要求。
支持的加密机制
哈希算法
所有哈希操作都可以仅由驱动提供,包括:
- SHA-3、SHA-2、SHA-1、MD5等
配置示例:
#define PSA_WANT_ALG_SHA_256
#define MBEDTLS_PSA_ACCEL_ALG_SHA_256
// 取消定义MBEDTLS_SHA256_C
HMAC
HMAC也可以加速,需要:
- 启用并加速HMAC算法和密钥类型
- 按照哈希部分配置所需的哈希算法
椭圆曲线密码学(ECC)
大多数ECC操作可以仅由驱动提供,包括:
- ECDH、ECDSA和EC J-PAKE算法
- 密钥导入、导出和随机生成
配置ECC时需注意:
- 必须为所有启用的ECC曲线提供驱动支持
- 可以禁用
MBEDTLS_ECP_C
和MBEDTLS_BIGNUM_C
以进一步减小代码大小
有限域Diffie-Hellman(FFDH)
配置方式与ECC类似,但需要注意:
- PSA API仅支持RFC 7919定义的群组
- 传统API支持自定义群组
RSA
所有RSA操作都可以仅由驱动提供,但目前存在限制:
- 仅PSA加密API可用
- PK、X.509和TLS模块不支持驱动专用RSA
密码算法(认证和非认证)
所有密码和AEAD操作都可以仅由驱动提供,包括:
- AES、ARIA、Camellia等密钥类型
- CBC、CTR、GCM等多种模式
限制与注意事项
ECC限制
-
完全移除
ecp.c
的限制:- 解析压缩格式ECC密钥
- 解析显式参数曲线
- 确定性派生ECC密钥对
-
可中断操作:
- 目前不支持驱动提供的可中断ECC操作
密码算法限制
-
部分传统模块需要内置实现:
- NIST密钥包装(MBEDTLS_NIST_KW_C)
- CMAC(MBEDTLS_CMAC_C)
- 传统密码API(MBEDTLS_CIPHER_C)
-
密钥解析限制:
- 只能解析使用内置算法加密的密钥
最佳实践
- 明确需求:确定哪些算法需要驱动专用实现
- 逐步验证:先验证PSA API功能,再测试上层模块
- 代码审查:检查所有依赖关系,确保没有意外依赖内置实现
- 性能测试:比较驱动实现与内置实现的性能差异
结论
ARMmbed/mbedtls的驱动专用构建功能为嵌入式开发者提供了更大的灵活性,可以在代码大小和性能之间做出最优选择。通过合理配置,开发者可以充分利用硬件加速模块或优化的软件实现,同时保持与标准Mbed TLS API的兼容性。
随着Mbed TLS的持续发展,预计未来会有更多加密机制支持完整的驱动专用构建,为嵌入式安全应用提供更多可能性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考