1个稳定版本
1.0.0 | 2021年9月22日 |
---|
#2333 in 密码学
在 3 个crate中使用了(通过 ecdsa-flow)
45KB
604 行
签名
一个经过大量修改的版本,旨在与Flow-Rust-SDK一起使用。
lib.rs
:
RustCrypto: signature
crate.
提供生成和验证数字签名的通用、对象安全的API的特质,即使用公钥密码学进行消息认证。
最低支持的Rust版本
Rust 1.41 或更高。
最低支持的Rust版本可能在将来更改,但此类更改将伴随着小版本号的增加。
SemVer策略
- 如上所述,MSRV被视为免于SemVer
- 此库的所有默认功能都受SemVer的保护
- 默认关闭的功能以
*-preview
结尾(例如derive-preview
,digest-preview
)是不稳定的“预览”功能,也视为免于SemVer(通常因为它们依赖于1.0之前的crate作为依赖项)。然而,对这些功能的破坏性更改,就像MSRV一样,也将伴随着小版本号的增加。
设计
此crate提供了一组用于签名和验证数字签名的通用特质,旨在由实现数字签名算法的库实现,并由想要生成或验证数字签名同时支持任何兼容后端的库使用。
目标
此crate提供的特质是为了以下目标而设计的:
- 提供一个易于使用、误用防护的API,针对其特质的消费者(而不是实现者)进行优化。
- 支持围绕“字节包”表示的通用类型安全包装,这些表示可以直接从或写入“线”。
- 提供一个 trait/object-safe API,其中跨越多个同构提供者实现的签名者/验证者可以在同一个逻辑“密钥环”中无缝利用,只要它们操作的是相同的底层签名类型。
- 允许一个提供者类型可能实现对几种签名类型的支持(包括对通用的支持)。
- 将签名算法的定制/“旋钮”从签名/验证 API 中分离出来,理想情况下将这些关注点推入类型系统,以便在类型错误中捕获算法不匹配。
- 不透明的错误类型,最小化从加密失败中泄露的信息,因为在这些场景中,“丰富”的错误类型往往是攻击者获取侧信道信息的来源(例如,BB'06)
实现
为了实现上述目标,该库提供的Signer
和Verifier
trait是泛型于Signature
返回值的,并使用泛型参数而不是关联类型。值得注意的是,它们使用此类参数作为返回值,允许类型检查器根据所需的签名类型进行推断。
Signature
trait被绑定在AsRef<[u8]>
上,强制签名类型是围绕“字节包”序列化的瘦包装。这种方法的灵感来自 Ed25519 签名系统,该系统基于这样的观察:过去的系统没有规定签名应该如何在“线”上表示,这导致了不同的线格式激增,以及关于应该使用哪种格式的困惑。这个库旨在通过最小化获取可序列化签名所需步骤的数量来提供类似的简单性。
考虑的替代方案
这个库基于两年多的探索,如何以最灵活、开发者友好的方式封装数字签名系统。在这段时间里,探索了许多设计替代方案,比较了权衡,最终选择了提供的 API。
在这个 API 中做出的权衡都是为了提高简单性、人体工程学、类型安全性和特质的消费者的灵活性。有时,这会以实现者付出代价为代价。以下是我们意识到并在 API 设计中考虑的一些问题
- “字节包”序列化阻止了签名提供者使用其自己的签名内部表示,这对于许多原因(例如,具有批量验证等高级签名系统功能)可能是有帮助的。或者,每个提供者可以定义自己的签名类型,使用标记 trait 来标识特定的签名算法,有
From
实现用于从/到[u8; N]
转换,以及一个标记 trait 来标识特定的签名算法。 - 关联类型,而不是 trait 的泛型参数,可以允许更定制化特定签名系统使用的类型,例如使用自定义错误类型。
继续探索上述权衡可能仍有意义,但需要一套新的特性,这些特性旨在对实现者友好,而不是对消费者友好。现有的Signer
和Verifier
特性可以为“提供者友好”的特性提供通用的实现。然而,如上所述,在稳定面向消费者的特性之后,这是一个容易探索的设计空间,因此我们认为这些特性更为重要。
话虽如此,以下是一些设计此类特性的注意事项,以及为什么我们没有积极追求它们
- 返回位置中的泛型已经被用来选择使用哪个特型实现,即对于特定的签名算法/系统。避免使用统一的、具体的签名类型会增加复杂性和编译器错误,根据我们的经验,这使得它们不适合这种API。我们认为这样的API是签名系统的自然选择,反映了它们在没有特型时的自然编写方式。
- 关联类型排除了同一特型的多个(或泛型)实现。这些参数在签名系统中很常见,特别是支持不同摘要算法的系统。
- 数字签名几乎总是比当前32个条目的数组类型特型实现限制要大,这使这些类型的特型签名复杂化(尤其是像
From
或Borrow
界限这样的东西)。在const泛型之后这可能更有趣去探索。
不稳定的功能
尽管版本高于1.0,但这个crate包括一些名为*-preview
的不稳定特性,每个特性都依赖于一个低于1.0的crate。
这些特性被视为不受SemVer约束。有关更多信息,请参阅上方的SemVer策略。
以下是不稳定特性的当前支持情况
derive-preview
:对于使用DigestSigner
和DigestVerifier
的签名系统实现者,可以使用derive-preview
特性来生成使用特定Signature
类型的PrehashSignature::Digest
算法对输入消息进行预哈希的Signer
和Verifier
特型。启用derive-preview
特性后,使用use signature::{Signer, Verifier}
导入过程宏,然后给特定的摘要签名器/验证器类型添加一个derive(Signer)
或derive(Verifier)
属性。启用此功能还会启用digest
支持(见下文)。digest-preview
:启用基于DigestSigner
和DigestVerifier
特征的Digest
特质,这些特质来自digest
包。这些特质用于表示基于Fiat-Shamir启发式方法的签名系统,通过计算输入消息的加密散列来生成随机挑战值进行签名。rand-preview
:启用针对依赖密码学安全随机数生成器的签名系统的RandomizedSigner
特质。
注意:包async-signature
包含对Signer
和DigestSigner
的实验性async支持。
依赖项
~0–290KB