3个版本
0.1.3 | 2023年5月10日 |
---|---|
0.1.2 | 2022年9月28日 |
0.1.0 | 2022年9月16日 |
113 在 #private-key
每月下载量 7,341
在 4 个crate中(通过 fastcrypto)使用
19KB
53 行
fastcrypto
fastcrypto
是 Mysten Labs 软件中使用的通用密码学库。它包含三个独立的crate: fastcrypto
、fastcrypto-zkp
和 fastcrypto-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签名和验证的函数。
- Ed25519:由
-
密码学原语上的实用函数。其中一些是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通过具有自定义序列化和验证功能的编码特性定义,由base64ct和hex库支持,分别可从这里和这里访问。值得注意的是,选择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曲线。验证器由Arkworks和blst库支持。
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
中不同方案的消息签名和签名验证,我们得到以下时间。
以下是使用基准测试报告中的数据制作的另一个图表,显示了批量签名验证的基准测试,其中所有签名都是针对同一消息的。
在fastcrypto-zkp
中,可以运行Arkworks到blst
字段元素表示的基准测试,以及验证BN254和BLS12381中的Groth16。
$ cd fastcrypto-zkp/
$ cargo bench
许可协议
所有库均受以下任一协议的许可:
依赖项
~2MB
~44K SLoC