mbedTLS ECDSA 数字签名示例
源码位置: samples/security/mbedtls/ecdsa 查看源码
功能说明
演示如何使用 mbedTLS 库进行 ECDSA(椭圆曲线数字签名算法)签名和验证操作。本示例展示了 ECDSA 密钥生成、消息哈希、签名生成和签名验证的完整流程。
ECDSA 是一种基于椭圆曲线的数字签名算法,提供与 RSA 相当的安全性,但使用更短的密钥长度。
硬件连接
无需外部连接,mbedTLS 为纯软件加密库。如果启用硬件加速(CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY=y),可以使用硬件加速的 ECDSA 验证。
示例内容
本示例测试所有支持的哈希算法(从 MBEDTLS_MD_MD2 到 MBEDTLS_MD_RIPEMD160)和所有支持的椭圆曲线(11 条曲线),对每个组合执行以下步骤:
初始化随机数生成器(CTR_DRBG)和熵源
计算消息的哈希值(使用指定的哈希算法)
生成 ECDSA 密钥对(私钥和公钥)
使用私钥对哈希值进行签名(生成 r 和 s 值)
使用公钥验证签名
测试的哈希算法
MD2, MD4, MD5
SHA1
SHA224, SHA256, SHA384, SHA512
RIPEMD160
测试的椭圆曲线
SECP192R1, SECP224R1, SECP256R1, SECP384R1, SECP521R1
BP256R1, BP384R1, BP512R1
SECP192K1, SECP224K1, SECP256K1
注意:代码中注释说明 CURVE25519 和 CURVE448 不能用于 ECDSA,因此不测试这两条曲线。
编译
重要提示:在编译前,请先确认您使用的开发板型号。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 ecdsa test
mbedtls ecdsa test begin
================= 1================
. setup rng ... ok
1. hash msg ... ok
2. ecdsa generate keypair:
04...
3. ecdsa generate signature:
...
4. ecdsa verify signature ... ok
================= 2================
...
mbedtls ecdsa test done
说明:
输出开头包含系统启动信息和日志系统初始化信息
对每个哈希算法和椭圆曲线的组合都会输出测试编号
密钥对以十六进制格式输出(包含公钥和私钥)
签名(r 和 s 值)以十六进制格式输出
验证成功会显示 “ok”
核心 API
API |
说明 |
|---|---|
|
生成 ECDSA 密钥对 |
|
使用私钥对哈希值进行签名 |
|
使用公钥验证签名 |
|
计算消息的哈希值 |
|
将椭圆曲线点写入二进制格式 |
|
将大整数写入二进制格式 |
|
初始化 CTR_DRBG 随机数生成器 |
关键代码
/* 计算消息哈希 */
mbedtls_md_context_t md_ctx;
uint8_t hash[64];
uint8_t msg[100];
memset(msg, 0x12, sizeof(msg));
mbedtls_md(mbedtls_md_info_from_type(md_type), msg, sizeof(msg), hash);
/* 生成 ECDSA 密钥对 */
mbedtls_ecdsa_context ctx;
mbedtls_ecdsa_init(&ctx);
mbedtls_ecdsa_genkey(&ctx, grp_id,
mbedtls_ctr_drbg_random, &ctr_drbg);
/* 签名 */
mbedtls_mpi r, s;
mbedtls_mpi_init(&r);
mbedtls_mpi_init(&s);
mbedtls_ecdsa_sign(&ctx.grp, &r, &s, &ctx.d,
hash, hash_len, mbedtls_ctr_drbg_random, &ctr_drbg);
/* 验证 */
mbedtls_ecdsa_verify(&ctx.grp, hash, hash_len, &ctx.Q, &r, &s);
哈希算法说明
哈希长度
不同哈希算法产生不同长度的哈希值:
MD2, MD4, MD5, RIPEMD160: 16 或 20 字节
SHA1, RIPEMD160: 20 字节
SHA224: 28 字节
SHA256: 32 字节
SHA384: 48 字节
SHA512: 64 字节
代码中根据哈希算法类型自动确定哈希长度。
配置说明
必需配置
CONFIG_SDK_MODULE_MBEDTLS=y: 启用 mbedTLS 模块CONFIG_MBEDTLS_ECP_C=y: 启用椭圆曲线支持CONFIG_MBEDTLS_ECDSA_C=y: 启用 ECDSA 支持CONFIG_MBEDTLS_ECP_ALL_ENABLED=y: 启用所有椭圆曲线CONFIG_MBEDTLS_HASH_ALL_ENABLED=y: 启用所有哈希算法
硬件加速配置(可选)
CONFIG_MBEDTLS_HARDWARE_ENTROPY=y: 启用硬件熵源CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY=y: 启用 ECC 硬件加速(用于 ECDSA 验证)CONFIG_MBEDTLS_HARDWARE_MPI_MODULAR_EXPONENTIATION=y: 启用硬件模幂运算
注意事项
哈希算法选择: 实际应用中应使用安全的哈希算法(如 SHA256 或 SHA512),避免使用 MD2、MD4、MD5 等已被认为不安全的算法
椭圆曲线选择: 不同的椭圆曲线提供不同的安全级别,应根据实际需求选择合适的曲线
消息哈希: ECDSA 是对消息的哈希值进行签名,而不是直接对消息签名
签名格式: ECDSA 签名由两个大整数 r 和 s 组成,需要同时保存和传输
随机数生成器: 签名生成需要高质量的随机数,必须正确初始化熵源和 CTR_DRBG
资源清理: 使用完所有 mbedTLS 结构后,必须调用相应的
free()函数释放资源测试范围: 本示例测试所有支持的哈希算法和椭圆曲线组合,某些组合可能在某些平台上不支持
曲线限制: CURVE25519 和 CURVE448 不能用于 ECDSA,只能用于 ECDH 等其他用途