#blake2 #hash #blake2b #crypto

no-std blake2-rfc_bellman_edition

基于RFC 7693的BLAKE2纯Rust实现。为发布目的而分叉。

1个不稳定版本

使用旧的Rust 2015

0.0.1 2019年3月31日

#12 in #blake2s

Download history 8532/week @ 2024-04-22 5045/week @ 2024-04-29 9834/week @ 2024-05-06 12495/week @ 2024-05-13 7829/week @ 2024-05-20 10636/week @ 2024-05-27 13185/week @ 2024-06-03 8991/week @ 2024-06-10 8999/week @ 2024-06-17 9870/week @ 2024-06-24 9435/week @ 2024-07-01 14754/week @ 2024-07-08 1308/week @ 2024-07-15 10206/week @ 2024-07-22 12184/week @ 2024-07-29 7636/week @ 2024-08-05

31,494每月下载量
用于26个crate(直接使用4个)

MIT/Apache

53KB
996

blake2-rfc

这是基于RFC 7693的BLAKE2纯Rust实现。

设计

此crate遵循流式哈希函数的常见API设计,它有一个状态/上下文结构体和三个关联函数:一个用于初始化结构体,一个用于反复调用以处理传入数据,一个用于最终处理并返回哈希值。对于已全部数据已存在于内存中的情况,有一个方便的函数可以在单个调用中完成这三个步骤。

为了更好地利用Rust的特性,此基本设计略有改动:最终化函数消耗结构体,执行移动操作而不是借用,因此结构体在内部状态被最终化覆盖后不能意外使用。

为了防止时间攻击,比较哈希值需要恒定时间。为了更容易做到正确的事情,最终化函数返回一个默认执行恒定时间比较的结构体包裹的结果。如果不需要恒定时间比较,可以轻松从该结构体中提取哈希结果。

限制

单个BLAKE2b哈希限制为16泽字节,低于其理论极限(但与BLAKE2s的理论极限相同),这是由于使用了u64作为字节数计数器。如果需要,此限制可以在“稳定”Rust版本发布后,通过使用extprim crate(及其u128类型)或OverflowingOps trait来增加。

此crate不尝试从其工作内存中清除可能敏感的数据(包括状态上下文、堆栈和处理器寄存器)。要正确完成此操作而不产生沉重性能开销,需要编译器的帮助。不如尝试这样做,也不要提供虚假的保证。

非RFC用途

此crate仅限于RFC中描述的功能:只能使用“摘要长度”和“密钥长度”参数。

如果您需要使用其他高级BLAKE2功能,此crate提供了一个未文档化的函数来创建带有任意参数块的哈希上下文,以及一个未文档化的函数来最终化树哈希模式中的最后一个节点。您负责创建有效的参数块,如果使用密钥哈希则对填充的密钥块进行哈希,以及调用正确的最终化函数。这些函数不会验证参数块。

SIMD优化

此crate对显式SIMD优化有实验性支持。由于使用了不稳定的功能,它需要nightly Rust。

以下cargo功能启用了显式SIMD优化

  • simd启用显式使用SIMD向量而不是普通结构
  • simd_opt此外还启用了使用SIMD洗牌来执行一些旋转
  • simd_asm此外还启用了使用内联汇编来执行一些SIMD洗牌

虽然可能期望这些中的一个比前一个更快,并且它们都比不启用显式SIMD向量更快,但这并不总是如此。它可能取决于目标架构和编译器选项。如果您需要这些优化带来的额外速度,请为每个优化进行基准测试(此crate中的bench功能启用基准测试,因此您可以使用例如cargo bench,所以您可以使用例如cargo bench"--features="bench simd_asm")。它们目前针对SSE2(x86和x86-64)和NEON(arm)进行了优化。

no_std支持

默认情况下,此crate通过链接Rust标准库来提供std::io::Write的实现。要构建no_std,使用default-features = false

许可

在您的选择下,根据以下任一许可

贡献

除非您明确表示,否则任何根据Apache-2.0许可证定义的、有意提交以包含在您的工作中的贡献,都应按上述方式双重许可,不附加任何其他条款或条件。

依赖项

~205KB