1 个不稳定版本
0.0.0 | 2024 年 1 月 22 日 |
---|
#41 在 #blake3
61KB
1.5K SLoC
BLAKE3 Guts API
简介
此 blake3_guts
子库包含 BLAKE3 压缩函数的低级、高性能、平台特定实现。此 API 复杂且不安全,此库永远不会有一个稳定的版本。大多数调用者应改用 blake3
库,该库最终将依赖于此库。
此处看到的代码(截至 2024 年 1 月)是大型计划重构的早期阶段。这次重构的动机是 Rust 和 C 实现中缺失的一些功能
- 输出端(Rust 中的
OutputReader
)没有充分利用计算多个块并行化的最重要的 SIMD 优化。这阻碍了任何想要将 BLAKE3 XOF 作为流密码([1],[2])使用的项目。 - 像 Bao 这样的低级调用者也需要树的内节点,但它们也得不到那些 SIMD 优化。他们必须使用一个慢速、简约、不稳定的、文档隐藏的模块 (也称为
guts
)。
添加这些功能困难在于它们需要修改所有我们的优化汇编和 C 内置代码。这是一二十个不同的文件,它们很大、平台特定、难以理解,且充满了重复的代码。BLAKE3 的 Rust 和 C 的高级实现都依赖于这些文件,并将需要协调更改。
同时,我们很快就会支持更多平台
- RISCV 矢量扩展
- ARM SVE
- WebAssembly SIMD
在添加新平台之前完成这次重构非常重要。
私有内部 API
这是每个平台重新实现的 API,因此我们希望它尽可能简单,除了它需要执行的高性能工作之外。它是完全 unsafe
,输入和输出是允许别名(对于 hash_parents
等很重要,见下文)的原始指针。
degree
compress
- 单个压缩函数,用于短输入和奇长尾。
hash_chunks
hash_parents
xof
xof_xor
- 与
xof
相同,但将结果异或到输出缓冲区。
- 与
universal_hash
- 这是专门为支持 BLAKE3-AEAD 而创建的新结构。一些实现可能只是用可移植代码来模拟它。
公共核心API
这是该crate向调用者公开的API,即主 blake3
crate。它是在上面私有API之上的一层薄薄的、可移植的层。此API的Rust版本是内存安全的。
degree
compress
hash_chunks
hash_parents
- 这处理树的多数层级,我们一次保持hash SIMD_DEGREE个父节点。
reduce_parents
- 这使用相同的
hash_parents
私有API,但它处理树的顶层,我们在原地减少到根父节点。
- 这使用相同的
xof
xof_xor
universal_hash