9 个版本

2.0.0 2022 年 9 月 30 日
1.0.0 2022 年 9 月 19 日
0.1.8 2024 年 4 月 4 日
0.1.7 2023 年 10 月 24 日
0.1.4 2022 年 11 月 28 日

#8#ecdsa-signature

Download history 585/week @ 2024-05-02 599/week @ 2024-05-09 745/week @ 2024-05-16 803/week @ 2024-05-23 722/week @ 2024-05-30 1152/week @ 2024-06-06 1153/week @ 2024-06-13 1295/week @ 2024-06-20 1266/week @ 2024-06-27 1397/week @ 2024-07-04 1554/week @ 2024-07-11 1982/week @ 2024-07-18 1904/week @ 2024-07-25 1595/week @ 2024-08-01 1616/week @ 2024-08-08 1537/week @ 2024-08-15

6,995 每月下载量
3 crates 中使用

Apache-2.0

545KB
11K SLoC

fastcrypto

crate Docs Build status Update the fastcrypto pointer Sui Apache2/MIT licensed Rust Version codecov

fastcrypto 是 Mysten Labs 软件中使用的通用密码学库。它包含三个独立的 crate:fastcryptofastcrypto-zkpfastcrypto-cli。它们作为独立的 crate 发布,以鼓励在不同应用程序和领域中的可重用性。

fastcrypto 是围绕以下考虑的一些精心选择的 crate 的包装库

  • 安全性:库是否容易受到已知的攻击向量或可能的误用。
  • 性能:crate 是否经过广泛基准测试后以高速执行密码学操作。这对于 Sui 网络在签名和验证大量交易和证书时保持高性能至关重要。
  • 确定性:签名是否不可变。
  • 流行度:库是否被其他共识关键系统使用。

此外,我们通过以下方式扩展了选定的库

  • 强大的测试框架:在可能的情况下添加了 Wycheproof 测试prop 测试,以防止任意输入和精心设计的边缘情况。
  • 零化:使用 zeroize 特性,当敏感的私有密钥材料超出作用域时将其从内存中清除。请注意,这仅是 尽力而为,并且不能保证所有敏感数据都从内存中清除,因为数据可能会被编译器、FFI 等复制或移动。
  • 序列化:需要有效和标准化的序列化。

该库将根据基准测试结果、RFC 更新、新研究和审计员输入不断更新,以添加更多方案和更快的实现。

《fastcrypto》包包含

  • 应由表示数字加密材料的具体类型实现的特质。

    • SigningKey:由私钥实现的特质,其关联类型包括其公钥和签名。
    • VerifyingKey:由公钥实现的特质,其关联类型包括其私钥和签名。它还包括一个默认的批量验证实现,当批量验证为空时将失败。
    • Authenticator:由签名实现的特质,其关联类型包括其公钥和私钥。
    • AggregateAuthenticator:由聚合签名实现的特质,允许将签名添加到聚合签名中,并针对相应消息的公钥进行验证。
    • KeyPair:表示公私钥对的特质,包括常见的获取私钥/公钥函数以及带有随机种子的密钥对生成函数。
    • ToFromBytes:旨在最小化获取可序列化密钥涉及的步骤的特质。
    • EncodeDecodeBase64:扩展了ToFromBytes,以便立即转换为/从Base64字符串。这是加密材料存储的格式。
  • 实现所需特质的具体签名方案类型,以实现加密灵活性。

    • Ed25519:由 ed25519-consensus 包支持。符合ZIP-215,该规范定义了签名有效性,这是RFC8032中缺乏但对共识算法至关重要的。由于最近发现的Chalkias双公钥API漏洞ed25519-dalek 已完全弃用。
    • Secp256k1:在secp256k1曲线上进行ECDSA签名。由绑定到C库并提供比原生Rust实现k256库快30%性能的Secp256k1 FFI包装器支持。产生标准的ECDSA签名或形状为[r, s, v]的65字节可恢复签名,其中v可以是0或1,表示恢复ID。使用根据RFC6979的伪随机确定性非ces生成确定性签名,无需生成随机数以保护非ces。默认使用sha256作为签名和验证的哈希函数。提供了verify_hashed接口,可以接受预哈希的消息及其签名以进行验证。通过提供带有相应预哈希消息的Secp256k1可恢复签名来支持公钥恢复。接受的签名必须具有其s位于曲线阶数下半部分的s。如果s太高,将s标准化为order - s,其中曲线阶数是0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141。更多信息请参阅BIP-0062
    • Secp256r1:基于 p256 crate 的 ECDSA 签名,该 crate 是 Secp256r1(即 NIST P-256 和 prime256v1)曲线的纯 Rust 实现。扩展了 p256 的功能,除了标准 ECDSA 签名外,我们的实现还可以生成和验证 65 字节的可恢复签名 [r, s, v],其中 v 是恢复 ID。签名使用根据 RFC6979 的伪随机确定性 nonce 生成,无需生成随机数来保护 nonce。使用 sha256 作为默认的签名和验证的哈希函数。通过提供相应的预哈希消息的 Secp256r1 ECDSA 可恢复签名,支持公钥恢复。接受的签名必须在其 s 位于曲线阶的下半部分。如果 s 太高,则将 s 规范化为 order - s,其中曲线阶为 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551,在 此处 定义。
    • BLS12-381:由 blst crate 提供,该 crate 用汇编和 C 编写,针对性能和安全进行了优化。G1 和 G2 点按照 ZCash 规范 以压缩格式序列化。提供在 G1 组中验证签名与 G2 组中的公钥(min-sig)或反之亦然(min-pk)的函数。提供聚合签名和快速验证聚合签名的函数,其中假设公钥已验证以证明所有权。
    • RSA:由 crate rsa 提供。提供根据 RFC 8017 签名和验证 RSA 签名的函数。
  • 加密原语上的实用函数。其中一些是 Sui 中 Move 智能合约 API 的 Rust 实现。

    • HKDF:基于 RFC-5869 的基于 HMAC 的密钥推导函数,用于根据给定的密钥对和盐以及可选的域推导密钥对。这需要选择一个 HMAC 函数,该函数精确扩展到所选 KeyPair 参数的私钥字节数。
    • Pedersen 承诺:创建一个具有值和遮蔽因子的 Pedersen 承诺的函数。添加或减去表示 Pedersen 承诺的 Ristretto 点。
    • Bulletproofs 范围证明:证明提交的值是一个在 [0, 2^bits) 范围内的无符号整数。验证承诺是某个值的 Pedersen 承诺的函数,该值是长度为无符号位的整数。
    • 椭圆曲线 VRF(ECVRF):使用 Ristretto255 组的可验证随机函数实现。基于给定的输入创建证明的函数,基于给定的输出验证证明的函数,根据 draft-irtf-cfrg-vrf-15 规范。
  • 编码:Base64和Hex使用自定义序列化和验证的编码特性进行定义,由base64cthex支持。值得注意的是,选择了base64ct crate而不是最受欢迎的base64 Rust crate,因为(a)它是常数时间且(b)显式拒绝混乱的编码以防止在解码时的可变形攻击,请参阅论文以深入了解。

  • 哈希函数包装器:256位摘要的SHA2_256,256位摘要的SHA3_256,512位摘要的SHA2_512,512位摘要的SHA3_512,256位摘要的KECCAK,256位摘要的BLAKE2-256

  • 多重集哈希:一种哈希函数,其哈希函数的输出是椭圆曲线上的一个点。它还允许对两个多重集的并集的哈希进行高效的计算。

  • 提供异步签名服务以进行测试和基准测试。

fastcryto-zkp crate包含验证Groth16证明及其准备好的验证密钥和公共输入的API。支持BN254和BLS12381曲线。验证器由Arkworksblst库支持。

fastcrypto-cli crate包括可用于调试的CLI工具。使用-h标志查看用法。

$ cargo build --bin encode-cli
$ target/debug/encode-cli -h
$ cargo build --bin sigs-cli
$ target/debug/sigs-cli -h
$ cargo build --bin ecvrf-cli
$ target/debug/ecvrf-cli -h

测试

所有三个crate的所有原语都存在单元测试,可以通过

$ cargo test

基准测试

fastcrypto中,可以通过运行来比较当前实现的签名方案的签名、验证、批量验证密钥生成

$ cargo bench

为每个发布版本生成基准测试报告,允许轻松比较fastcrypto中不同加密原语和方案的性能。例如,对于fastcrypto中不同方案的签名消息和验证签名的时间,我们可以获得以下数据,截至修订dd5adb

Signature schemes comparison.

以下是另一个使用基准测试报告中的数据制作的图表,显示了所有签名都在同一消息上的批量签名验证基准测试。

Batched signature verification with all signatures on same message.

fastcrypto-zkp中,可以运行Arkworks到blst表示的字段元素的基准测试,以及验证BN254和BLS12381中的Groth16。

$ cd fastcrypto-zkp/
$ cargo bench

许可证

所有crate都受以下之一许可:

依赖关系

~25MB
~469K SLoC