mbedTLS 自检测试示例

功能说明

演示如何运行 mbedTLS 库的完整自检测试套件。本示例自动测试所有已启用的 mbedTLS 功能模块,包括加密算法、哈希算法、消息认证码、密钥交换算法等,确保 mbedTLS 库在目标平台上正常工作。

自检测试是验证 mbedTLS 库是否正确编译和配置的重要工具,特别适用于验证硬件加速功能是否正常工作。

硬件连接

无需外部连接,mbedTLS 为纯软件加密库。如果启用了硬件加速功能,测试会验证硬件加速是否正常工作。

示例内容

本示例运行以下自检测试(根据配置启用,按代码中的顺序):

  1. 内存分配测试 (calloc): 测试 mbedtls_callocmbedtls_free 的正确性

  2. 哈希算法测试: MD2, MD4, MD5, RIPEMD160, SHA1, SHA256, SHA512

  3. 对称加密算法测试: ARC4, DES, AES, Camellia, ARIA, XTEA

  4. 认证加密测试: GCM, CCM, NIST KW (NIST Key Wrapping)

  5. 流密码测试: ChaCha20

  6. 消息认证码测试: CMAC, Poly1305, ChaCha20-Poly1305

  7. 大整数运算测试 (mpi): 测试大整数运算功能

  8. RSA 测试: RSA 加密解密和签名验证

  9. X.509 测试: X.509 证书解析

  10. 椭圆曲线测试 (ecp): 椭圆曲线点运算

  11. ECJPAKE 测试: ECJPAKE 密钥交换

  12. DHM 测试: Diffie-Hellman 密钥交换

  13. 随机数生成器测试: CTR_DRBG, HMAC_DRBG

  14. 熵源测试 (entropy): 熵源功能测试

  15. Base64 测试: Base64 编码解码

  16. PKCS#5 测试: PBKDF2 密钥派生

  17. 定时测试 (timing): 定时功能测试(较慢的测试)

  18. 内存缓冲区分配测试 (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

说明

mbedtls_*_self_test()

各种模块的自检函数(如 mbedtls_aes_self_test, mbedtls_sha256_self_test 等)

mbedtls_snprintf()

格式化字符串函数(用于测试)

mbedtls_calloc() / mbedtls_free()

内存分配函数(用于测试)

关键代码

/* 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 硬件加速

注意事项

  1. 测试时间: 完整运行所有测试可能需要较长时间,特别是在资源受限的嵌入式系统上

  2. 内存使用: 某些测试(如大整数运算、RSA)可能需要较多内存

  3. 硬件加速验证: 如果启用了硬件加速,测试失败可能表示硬件加速配置不正确或硬件有问题

  4. 测试覆盖: 测试覆盖范围取决于编译时启用的功能模块,未启用的模块不会运行测试

  5. 平台兼容性: 某些测试可能在某些平台上失败,需要根据实际情况调整配置

  6. 调试信息: 使用详细模式(v=1)可以查看每个测试的详细输出,有助于定位问题

  7. 内存分配器: 如果使用自定义内存分配器(MBEDTLS_MEMORY_BUFFER_ALLOC_C),测试会验证内存分配器的正确性