mbedTLS ECDSA 数字签名示例

功能说明

演示如何使用 mbedTLS 库进行 ECDSA(椭圆曲线数字签名算法)签名和验证操作。本示例展示了 ECDSA 密钥生成、消息哈希、签名生成和签名验证的完整流程。

ECDSA 是一种基于椭圆曲线的数字签名算法,提供与 RSA 相当的安全性,但使用更短的密钥长度。

硬件连接

无需外部连接,mbedTLS 为纯软件加密库。如果启用硬件加速(CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY=y),可以使用硬件加速的 ECDSA 验证。

示例内容

本示例测试所有支持的哈希算法(从 MBEDTLS_MD_MD2MBEDTLS_MD_RIPEMD160)和所有支持的椭圆曲线(11 条曲线),对每个组合执行以下步骤:

  1. 初始化随机数生成器(CTR_DRBG)和熵源

  2. 计算消息的哈希值(使用指定的哈希算法)

  3. 生成 ECDSA 密钥对(私钥和公钥)

  4. 使用私钥对哈希值进行签名(生成 r 和 s 值)

  5. 使用公钥验证签名

测试的哈希算法

  • 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

说明

mbedtls_ecdsa_genkey()

生成 ECDSA 密钥对

mbedtls_ecdsa_sign()

使用私钥对哈希值进行签名

mbedtls_ecdsa_verify()

使用公钥验证签名

mbedtls_md()

计算消息的哈希值

mbedtls_ecp_point_write_binary()

将椭圆曲线点写入二进制格式

mbedtls_mpi_write_binary()

将大整数写入二进制格式

mbedtls_ctr_drbg_seed()

初始化 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: 启用硬件模幂运算

注意事项

  1. 哈希算法选择: 实际应用中应使用安全的哈希算法(如 SHA256 或 SHA512),避免使用 MD2、MD4、MD5 等已被认为不安全的算法

  2. 椭圆曲线选择: 不同的椭圆曲线提供不同的安全级别,应根据实际需求选择合适的曲线

  3. 消息哈希: ECDSA 是对消息的哈希值进行签名,而不是直接对消息签名

  4. 签名格式: ECDSA 签名由两个大整数 r 和 s 组成,需要同时保存和传输

  5. 随机数生成器: 签名生成需要高质量的随机数,必须正确初始化熵源和 CTR_DRBG

  6. 资源清理: 使用完所有 mbedTLS 结构后,必须调用相应的 free() 函数释放资源

  7. 测试范围: 本示例测试所有支持的哈希算法和椭圆曲线组合,某些组合可能在某些平台上不支持

  8. 曲线限制: CURVE25519 和 CURVE448 不能用于 ECDSA,只能用于 ECDH 等其他用途