#blake3 #low-level #blocks #hash #simd #vector #guts

no-std blake3_guts

BLAKE3 哈希函数的低级构建块

1 个不稳定版本

0.0.0 2024 年 1 月 22 日

#41#blake3

CC0-1.0 OR Apache-2.0

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

无运行时依赖