1个不稳定版本
使用旧的Rust 2015
0.0.1 | 2019年3月31日 |
---|
#12 in #blake2s
31,494每月下载量
用于26个crate(直接使用4个)
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 License,版本2.0,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确表示,否则任何根据Apache-2.0许可证定义的、有意提交以包含在您的工作中的贡献,都应按上述方式双重许可,不附加任何其他条款或条件。
依赖项
~205KB