
针对 secp256k1 曲线上的 ECDSA 签名和密钥操作优化的 C 语言库。
该库旨在成为公开可用的、针对 secp256k1 曲线密码学的最高质量的库。 然而,其开发的主要重点是在比特币系统中的使用,并且不同于比特币的用法可能测试、验证不足,或者接口设计不够周全。 正确使用需要一些谨慎和考虑,以确保该库适合您的应用程序用途。
特性
- secp256k1 ECDSA 签名/验证和密钥生成。
- 私钥/公钥的加法和乘法调整。
- 私钥、公钥和签名的序列化/解析。
- 恒定时间、恒定内存访问签名和公钥生成。
- 去随机化的 ECDSA (通过 RFC6979 或使用调用者提供的函数)。
- 非常高效的实现。
- 适用于嵌入式系统。
- 用于公钥恢复的可选模块。
- 用于 ECDH 密钥交换的可选模块。
- 根据 BIP-340 的 Schnorr 签名可选模块(实验性)。
实验性特性尚未经过足够的审查以满足此库的质量标准,但可用于社区的测试和审查。 这些特性的 API 不应被认为是稳定的。
- 通用
- 没有运行时堆分配。
- 广泛的测试基础设施。
- 结构化的设计,便于审查和分析。
- 旨在移植到任何具有 C89 编译器和 uint64_t 支持的系统。
- 不使用浮点类型。
- 仅公开更高级别的接口,以最小化 API 表面并提高应用程序安全性。(“难以不安全地使用。”)
- 域操作
- 优化的算术模曲线域大小(2^256 - 0x1000003D1)实现。
- 使用 5 个 52 位肢(包括 Diederik Huys 手工优化的 x86_64 汇编代码)。
- 使用 10 个 26 位肢(包括 Wladimir J. van der Laan 手工优化的 32 位 ARM 汇编代码)。
- 标量运算
- 没有数据相关分支的优化算术模曲线阶数实现。
- 使用 4 个 64 位肢(依赖于编译器中的 __int128 支持)。
- 使用 8 个 32 位肢。
- 基于 safegcd (带有一些修改) 和变量时间变体的模逆(域元素和标量)(作者:Peter Dettman)。
- 群操作
- 专门为曲线方程 (y^2 = x^3 + 7) 简化的点加法公式。
- 尽可能使用 Jacobian 和仿射坐标系中点之间的加法。
- 在必要时使用统一的加倍/加法公式,以避免数据相关的分支。
- 通过 Jacobian 坐标空间中的比较,无需字段反转即可进行点/x 比较。
- 用于验证的点乘法(aP + bG)。
- 对点乘数使用 wNAF 表示法。
- 对 G 的倍数使用更大的窗口,并使用预先计算的倍数。
- 使用 Shamir 的技巧同时与公钥和生成器进行乘法。
- 使用 secp256k1 的可高效计算的自同态将 P 乘数拆分为 2 个半大小的乘数。
- 用于签名的点乘法
- 使用预先计算的 16 的幂与生成器相乘的倍数表,因此一般乘法变成一系列加法。
- 旨在完全避免密钥操作的时间侧信道攻击(在合理的硬件/工具链上)
- 使用无分支条件移动访问表,因此内存访问是统一的。
- 没有数据相关的分支
- 可选的运行时盲化,试图阻止差分功率分析。
- 预先计算的表添加并最终减去没有已知标量(密钥)的数据点,从而防止攻击者控制用于在内部控制数据的密钥。
libsecp256k1 使用 autotools 构建
$ ./autogen.sh
$ ./configure
$ make
$ make check
$ sudo make install # optional
使用 valgrind 时,您可能需要增加最大堆栈大小
$ valgrind --max-stackframe=2500000 ./exhaustive_tests
该库旨在完全覆盖可访问的行和分支。
要创建测试覆盖率报告,请使用 --enable-coverage 进行配置(必须使用 GCC)
$ ./configure --enable-coverage
运行测试
要创建报告,建议使用 gcovr,因为它包括分支覆盖率报告
$ gcovr --exclude 'src/bench*' --print-summary
要创建带有彩色和注释源代码的 HTML 报告
$ mkdir -p coverage
$ gcovr --exclude 'src/bench*' --html --html-details -o coverage/coverage.html
如果使用 --enable-benchmark (默认配置) 进行配置,则构建后,用于基准测试 libsecp256k1 函数的二进制文件将存在于根目录中。
要将基准测试结果打印到命令行
要创建基准测试结果的 CSV 文件
$ ./bench_name | sed '2d;s/ \{1,\}//g' > bench_name.csv
请参见 SECURITY.md