mbedTLS 自检测试示例
源码位置: samples/security/mbedtls/self_check 查看源码
功能说明
演示如何运行 mbedTLS 库的完整自检测试套件。本示例自动测试所有已启用的 mbedTLS 功能模块,包括加密算法、哈希算法、消息认证码、密钥交换算法等,确保 mbedTLS 库在目标平台上正常工作。
自检测试是验证 mbedTLS 库是否正确编译和配置的重要工具,特别适用于验证硬件加速功能是否正常工作。
硬件连接
无需外部连接,mbedTLS 为纯软件加密库。如果启用了硬件加速功能,测试会验证硬件加速是否正常工作。
示例内容
本示例运行以下自检测试(根据配置启用,按代码中的顺序):
内存分配测试 (
calloc): 测试mbedtls_calloc和mbedtls_free的正确性哈希算法测试: MD2, MD4, MD5, RIPEMD160, SHA1, SHA256, SHA512
对称加密算法测试: ARC4, DES, AES, Camellia, ARIA, XTEA
认证加密测试: GCM, CCM, NIST KW (NIST Key Wrapping)
流密码测试: ChaCha20
消息认证码测试: CMAC, Poly1305, ChaCha20-Poly1305
大整数运算测试 (
mpi): 测试大整数运算功能RSA 测试: RSA 加密解密和签名验证
X.509 测试: X.509 证书解析
椭圆曲线测试 (
ecp): 椭圆曲线点运算ECJPAKE 测试: ECJPAKE 密钥交换
DHM 测试: Diffie-Hellman 密钥交换
随机数生成器测试: CTR_DRBG, HMAC_DRBG
熵源测试 (
entropy): 熵源功能测试Base64 测试: Base64 编码解码
PKCS#5 测试: PBKDF2 密钥派生
定时测试 (
timing): 定时功能测试(较慢的测试)内存缓冲区分配测试 (
memory_buffer_alloc): 内存管理测试(最后执行)
注意:代码中还会在运行测试前进行以下检查:
NULL 指针表示检查(验证全零位模式是否为 NULL 指针)
snprintf实现检查(验证格式化字符串函数的正确性)
编译
重要提示:在编译前,请先确认您使用的开发板型号。SDK 目前支持以下开发板:
arcs_evb - ARCS EVB 评估板
arcs_mini - ARCS Mini 开发板
根据您的开发板型号,选择对应的编译命令:
在示例目录下执行编译:
# 使用 arcs_evb 开发板
./build.sh -C -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -DBOARD=arcs_mini
Note
如果在 SDK 根目录执行,需要指定示例路径:
# 使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_mini
Note
确保已安装对应的工具链。
烧录
编译完成后,使用 SDK tools 目录下的 cskburn 工具烧录固件:
./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs
Note
烧录参数说明:
-s /dev/ttyUSB0:串口设备路径,需要根据实际情况修改 - Linux 系统:通常是/dev/ttyUSB0或/dev/ttyACM0- 可通过ls /dev/tty*命令查看可用串口设备 - 不同开发板或 USB 转串口芯片可能使用不同的设备名-b 3000000:烧录波特率(3Mbps)0x0:烧录起始地址build/arcs.bin:编译生成的固件路径-C arcs:芯片类型
注意事项:
确保开发板已正确连接到电脑
如果无法识别串口设备,请检查 USB 连接线是否正常,或尝试其他 USB 端口
预期输出
********Arcs SDK 0.1.0 @ v0.0.23.temp.docs-96-gf56c5084660d********
Running on hart-id: 1
I/elog [1034:42:44.159 1 elog_async] EasyLogger V2.2.99 is initialize success.
Hello, world!
mbedtls self test
run all tests: v:1, e:0
CALLOC(0,1): passed (NULL)
CALLOC(1,0): passed (NULL)
CALLOC(1): passed
CALLOC(1 again): passed
MD2 test #1: passed
MD2 test #2: passed
...
Executed XX test suites
[ All tests PASS ]
说明:
输出开头包含系统启动信息和日志系统初始化信息
每个测试套件会输出测试结果(passed 或 failed)
最后汇总显示执行的测试套件数量和通过/失败情况
如果所有测试通过,显示 “All tests PASS”
如果有测试失败,显示失败数量
核心 API
本示例主要调用 mbedTLS 库提供的自检函数,包括:
API |
说明 |
|---|---|
|
各种模块的自检函数(如 |
|
格式化字符串函数(用于测试) |
|
内存分配函数(用于测试) |
关键代码
/* NULL 指针表示检查 */
void *pointer;
memset(&pointer, 0, sizeof(void *));
if (pointer != NULL) {
mbedtls_printf("all-bits-zero is not a NULL pointer\n");
mbedtls_exit(MBEDTLS_EXIT_FAILURE);
}
/* 测试 snprintf 实现 */
if (run_test_snprintf() != 0) {
mbedtls_printf("the snprintf implementation is broken\n");
mbedtls_exit(MBEDTLS_EXIT_FAILURE);
}
/* 初始化内存缓冲区分配器(如果启用) */
#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
mbedtls_memory_buffer_alloc_init(init_buf, sizeof(init_buf));
#endif
/* 运行所有自检测试 */
const selftest_t *test;
for (test = selftests; test->name != NULL; test++) {
if (test->function(v) != 0) {
suites_failed++;
}
suites_tested++;
}
/* 输出测试结果 */
if (v != 0) {
mbedtls_printf(" Executed %d test suites\n\n", suites_tested);
if (suites_failed > 0) {
mbedtls_printf(" [ %d tests FAIL ]\n\n", suites_failed);
} else {
mbedtls_printf(" [ All tests PASS ]\n\n");
}
}
/* 根据测试结果退出 */
if (suites_failed > 0) {
mbedtls_exit(MBEDTLS_EXIT_FAILURE);
}
mbedtls_exit(MBEDTLS_EXIT_SUCCESS);
硬件加速测试
如果启用了硬件加速,自检测试会验证以下硬件加速功能:
AES: AES 加密解密硬件加速
AES-GCM: AES-GCM 认证加密硬件加速
AES-CCM: AES-CCM 认证加密硬件加速
AES-CMAC: AES-CMAC 消息认证码硬件加速
HMAC: HMAC 消息认证码硬件加速
Entropy: 硬件熵源
RSA: RSA 模幂运算硬件加速
ECDH: ECDH 密钥交换硬件加速(如果支持)
ECDSA: ECDSA 签名验证硬件加速
配置说明
必需配置
CONFIG_SDK_MODULE_MBEDTLS=y: 启用 mbedTLS 模块CONFIG_MBEDTLS_TEST=y: 启用 mbedTLS 自检测试功能
可选配置(启用更多测试)
CONFIG_MBEDTLS_CIPHER_ALL_ENABLED=y: 启用所有对称加密算法CONFIG_MBEDTLS_HASH_ALL_ENABLED=y: 启用所有哈希算法CONFIG_MBEDTLS_MAC_ALL_ENABLED=y: 启用所有消息认证码CONFIG_MBEDTLS_ECP_ALL_ENABLED=y: 启用所有椭圆曲线
硬件加速配置
CONFIG_MBEDTLS_HARDWARE_ENTROPY=y: 启用硬件熵源CONFIG_MBEDTLS_HARDWARE_AES=y: 启用 AES 硬件加速CONFIG_MBEDTLS_HARDWARE_AES_GCM=y: 启用 AES-GCM 硬件加速CONFIG_MBEDTLS_HARDWARE_AES_CCM=y: 启用 AES-CCM 硬件加速CONFIG_MBEDTLS_HARDWARE_AES_CMAC=y: 启用 AES-CMAC 硬件加速CONFIG_MBEDTLS_HARDWARE_SHA_HMAC=y: 启用 SHA-HMAC 硬件加速CONFIG_MBEDTLS_HARDWARE_MPI_MODULAR_EXPONENTIATION=y: 启用 RSA 硬件加速CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY=y: 启用 ECDSA 硬件加速
注意事项
测试时间: 完整运行所有测试可能需要较长时间,特别是在资源受限的嵌入式系统上
内存使用: 某些测试(如大整数运算、RSA)可能需要较多内存
硬件加速验证: 如果启用了硬件加速,测试失败可能表示硬件加速配置不正确或硬件有问题
测试覆盖: 测试覆盖范围取决于编译时启用的功能模块,未启用的模块不会运行测试
平台兼容性: 某些测试可能在某些平台上失败,需要根据实际情况调整配置
调试信息: 使用详细模式(
v=1)可以查看每个测试的详细输出,有助于定位问题内存分配器: 如果使用自定义内存分配器(
MBEDTLS_MEMORY_BUFFER_ALLOC_C),测试会验证内存分配器的正确性