3个版本
使用旧的Rust 2015
0.1.2 | 2016年2月1日 |
---|---|
0.1.1 | 2016年1月31日 |
0.1.0 | 2016年1月30日 |
#2164 in 密码学
655 monthly downloads
用于 9 个crate(8个直接使用)
65KB
1.5K SLoC
这是一个从RFC 7539中实现的纯Rust ChaCha20-Poly1305 AEAD。
设计
加密/解密API主要有两种设计:一个是拥有一个状态/上下文结构体,其中包含一个方法,该方法被反复调用以加密/解密下一个数据片段;另一个是只有一个独立函数,该函数一次调用完成所有工作。
对于认证加密,在解密过程中,验证认证标签之前不产生任何输出是很重要的。这需要对数据进行两次遍历以进行解密:第一次遍历验证标签,第二次遍历进行输出。使用状态/上下文结构体来实现这一功能将过于复杂,因此此crate使用单个函数调用来完成整个解密。为了对称性,加密函数也使用了相同的设计。
基本原语(ChaCha20和Poly1305)没有单独暴露,因为它们更难以安全使用。这也允许它们的实现针对组合使用情况进行优化;例如,基本原语不需要缓冲。
限制
单个调用中可以加密的数据量是2^32 - 1个64字节的块,略小于256 GiB。如果需要,可以通过允许使用较短的nonce将此限制增加到2^64字节。
此crate不尝试从其工作内存中清除可能敏感的数据(包括栈和处理器寄存器)。要正确地完成此操作而不会带来沉重的性能损失,需要编译器的帮助。最好不要尝试这样做,以免提供错误的保证。
SIMD优化
此crate具有实验性的显式SIMD优化支持。由于使用不稳定的特性,它需要nightly Rust。
以下cargo功能启用显式SIMD优化
simd
启用显式使用SIMD向量而不是普通结构体simd_opt
此外还启用使用SIMD洗牌来实现一些旋转
虽然人们可能认为这些优化中的每一个都比上一个更快,并且都比没有启用显式SIMD向量要快,但这并不总是如此。这取决于目标架构和编译器选项。如果您需要这些优化带来的额外速度,请对每个优化进行基准测试(bench
功能启用了这个crate中的cargo bench
,因此您可以使用例如cargo bench --features="bench simd_opt"
)。目前它们已经被调整以支持SSE2(x86和x86-64)和NEON(arm)。
许可证
根据以下任一许可证授权:
- Apache许可证2.0版本(LICENSE-APACHE或http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在作品中的任何贡献,都将按照上述方式双授权,不附加任何额外条款或条件。
依赖
~245KB