libsecp256k1 只实现一条曲线,但实现得非常严谨:常量时间签名、详尽的测试,以及对部分域运算的形式化验证。Bitcoin Core、许多钱包,以及 coincurve 和 go-ethereum 的 cgo 后端等绑定都在使用它。本页的事实基于 Alpine 3.24.2 的软件包检查得出,即启用了 recovery、extrakeys 和 schnorrsig 模块的 0.5.0 版;当时上游已发布到 0.8.0。
签名保存在不透明的结构体中,编码在序列化时选择——serialize_compact 给出 64 字节的 r‖s,serialize_der 给出 DER——解析同样是显式的。parse_der 很严格:它接受最简 DER,而拒绝了 r 带有多余前导零的同一签名,这遵循的是比特币的 BIP-66 规则。历史上那些不严格的签名,需要使用仓库 contrib 目录中保留的宽松解析器。
签名的输入是 32 字节的哈希——这个库从不对你的消息计算哈希——它采用 RFC 6979(本次检查的结果与一个独立实现一致),并且总是生成 low-S 签名。严格之处在于验证:由有效签名镜像得到的 high-S 形式验证失败,而 secp256k1_ecdsa_signature_normalize 正是为修正通用签名方生成的签名而提供的。如果来自 OpenSSL、Java 或云 KMS 的签名大约只有一半能验证通过,原因就是 high-S;示例在验证前先做规范化。
公钥是 SEC1 点,未压缩为 65 字节,压缩为 33 字节;64 字节的 x‖y 会被拒绝,也不支持 SPKI、PEM 或 JWK。recovery 模块从签名中恢复公钥——这是以太坊地址的基础——schnorrsig 模块则实现了 BIP-340。可以用比特币消息验证工具检查比特币消息签名,用 Nostr 事件验证工具检查 Nostr 事件。