3个版本

0.1.3 2023年5月10日
0.1.2 2022年9月28日
0.1.0 2022年9月16日

113#private-key

Download history 530/week @ 2024-04-17 594/week @ 2024-04-24 590/week @ 2024-05-01 626/week @ 2024-05-08 738/week @ 2024-05-15 800/week @ 2024-05-22 788/week @ 2024-05-29 1100/week @ 2024-06-05 1172/week @ 2024-06-12 1321/week @ 2024-06-19 1243/week @ 2024-06-26 1336/week @ 2024-07-03 1529/week @ 2024-07-10 1954/week @ 2024-07-17 1941/week @ 2024-07-24 1685/week @ 2024-07-31

每月下载量 7,341
4 个crate中(通过 fastcrypto)使用

Apache-2.0

19KB
53

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 trait 安全且主动地从内存中清除敏感私钥材料,当它们超出作用域时。
  • 序列化:需要有效和标准化的序列化。

该库将根据基准测试结果、RFC更新、新研究和审计员反馈,持续更新以包含更多方案和更快的实现。

fastcrypto crate 包含

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

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

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

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

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

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

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

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

fastcrypto-cli库包含用于调试的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

测试

所有三个库中的所有原语都存在单元测试,可以通过以下方式运行:

$ cargo test

基准测试

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

$ cargo bench

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

Signature schemes comparison.

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

Batched signature verification with all signatures on same message.

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

$ cd fastcrypto-zkp/
$ cargo bench

许可协议

所有库均受以下任一协议的许可:

依赖项

~2MB
~44K SLoC