19个版本
使用旧的Rust 2015
0.2.18 | 2017年11月24日 |
---|---|
0.2.17 | 2016年2月27日 |
0.2.16 | 2016年1月30日 |
0.2.12 | 2015年12月24日 |
0.1.0 | 2015年5月24日 |
386 在 加密学 中排名
174,385 每月下载量
用于 597 个crate (100 直接)
49KB
941 行
blake2-rfc
这是基于RFC 7693的BLAKE2纯Rust实现。
设计
此crate遵循常见的流式哈希函数API设计,其中有一个状态/上下文结构体和三个相关函数:一个用于初始化结构体,一个用于重复调用以处理传入数据,一个用于最终处理并返回哈希。对于全数据已存在于内存中的情况,有一个方便的函数可以在单个调用中完成这三个步骤。
此基本设计略作修改,以更好地利用Rust的特性:最终化函数消耗结构体,执行移动操作而不是借用操作,因此结构体在其内部状态被最终化覆盖后不能意外使用。
为了防止时间攻击,比较哈希值需要花费固定的时间。为了更容易做到这一点,最终化函数返回一个包装在结构体中的结果,该结构体默认执行固定时间比较。如果不需要固定时间比较,可以轻松地从该结构体中提取哈希结果。
限制
由于使用u64作为字节数计数器,单个BLAKE2b哈希限制为16埃字节,低于其理论极限(但与BLAKE2s的理论极限相同)。如果需要,可以在"稳定"Rust版本中可用后,通过extprim
crate(及其u128
类型)或OverflowingOps
trait将其增加到更高。
此crate不试图从其工作内存(包括状态上下文、堆栈和处理器寄存器)中清除可能敏感的数据。这样做需要编译器的帮助才能正确完成而不会产生严重的性能损失。与其提供错误的保证,不如不尝试这样做。
非RFC用法
此crate仅限于RFC中描述的功能:只能使用"摘要长度"和"密钥长度"参数。
如果您需要使用其他高级BLAKE2功能,此crate有一个未记录的函数用于创建具有任意参数块的哈希上下文,以及一个未记录的函数用于在树哈希模式下最终化最后一个节点。您负责创建有效的参数块、在密钥哈希中使用时哈希填充密钥块,并调用正确的最终化函数。这些函数不会验证参数块。
向量指令优化
这个软件包支持显式的SIMD优化。由于使用了不稳定的功能,它需要nightly Rust版本。
以下cargo特性启用了显式的SIMD优化
simd
启用显式使用SIMD向量而不是普通结构体simd_opt
此外还启用了使用SIMD洗牌来执行一些旋转simd_asm
此外还启用了使用内联汇编来执行一些SIMD洗牌
虽然人们可能期望这些中的一个比上一个更快,而且它们都比没有启用显式SIMD向量更快,但这并不总是如此。这取决于目标架构和编译器选项。如果您需要这些优化提供的额外速度,请为每个进行基准测试(此软件包中的bench
特性启用了cargo bench
,因此您可以使用例如cargo bench"--features="bench simd_asm"
)。它们目前针对SSE2(x86和x86-64)和NEON(arm)进行了优化。
no_std
支持
默认情况下,此软件包通过链接Rust标准库来提供std::io::Write
的实现。要构建no_std
,请使用default-features = false
。
许可证
根据您的选择,许可为以下之一
- Apache License,版本2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确表示,否则根据Apache-2.0许可证定义,您提交的任何旨在包含在作品中的贡献,均应按上述方式双许可,不附加任何额外条款或条件。
依赖关系
~89–560KB
~17K SLoC