secp256k1 0.3.0

secp256k1 0.3.0

测试已测试
Lang语言 CC
许可证 MIT
发布最后发布2018年2月

daviyang35 维护。



secp256k1 0.3.0

  • 作者:
  • daviyang35

libsecp256k1

为在 secp256k1 曲线上执行椭圆曲线操作的优化的 C 语言库。

此库仍在开发中,并用于研究最佳实践。请自行承担使用风险。

特性

  • secp256k1 ECDSA 签名/验证和密钥生成。
  • 添加/乘以私钥/公钥。
  • 私钥、公钥、签名的序列化/解析。
  • 常时、常内存访问的签名和公钥生成。
  • 去随机化 DSA(通过 RFC6979 或提供函数的调用者。)
  • 非常高效的实现。

实现细节

  • 通用
    • 无运行时堆分配。
    • 广泛的测试基础设施。
    • 结构化以促进审查和分析。
    • 旨在可移植到任何具有 C89 编译器和 uint64_t 支持的系统。
    • 仅公开高级接口,以最小化 API 表面积并提高应用程序安全性。("难以使用不安全。")
  • 域操作
    • 针对曲线的域大小(2^256 - 0x1000003D1)的算术运算的优化实现。
      • 使用 5 个 52 位肢,包括为 x86_64 手动优化的汇编(由 Diederik Huys 提供)。
      • 使用 10 个 26 位肢。
    • 使用滑动窗口在 1 块上(由 Peter Dettman 提供)进行域逆和平方根。
  • 标量运算
    • 没有数据相关分支的算术模曲线阶的优化实现。
      • 使用 4 个 64 位肢(依赖于编译器的 __int128 支持)。
      • 使用 8 个 32 位肢。
  • 群运算
    • 专门简化曲线方程(y^2 = x^3 + 7)的点加公式。
    • 尽可能使用雅可比坐标和仿射坐标之间的点加。
    • 当必要的时候使用统一的加/加倍公式来避免数据相关分支。
    • 通过在雅可比坐标空间中比较进行点/x比较,而不进行域逆。
  • 用于验证的点乘(aP + bG)。
    • 使用 wNAF 表示法表示点乘数。
    • 使用一个更大的窗口,使用预计算的多倍数来表示 G 的倍数。
    • 使用 Shamir 的技巧同时进行公钥和生成器的乘法。
    • 可选的(默认关闭)使用 secp256k1 的高效可计算自同构将 P 乘数分成两个大小减半的一个。
  • 用于签名的点乘
    • 使用一个包含生成器乘以 16 的幂的倍数的预计算表,因此通用乘法成为一系列加法。
    • 使用无分支的条件移动访问表,以便内存访问是一致的。
    • 无数据相关分支
    • 预计算表为没有已知标量(私钥)的点添加和最终减去点,防止有控制私钥的攻击者控制内部数据。

构建步骤

libsecp256k1 使用 autotools 构建

$ ./autogen.sh
$ ./configure
$ make
$ ./tests
$ sudo make install  # optional