mirror of
https://github.com/BLAKE3-team/BLAKE3
synced 2024-05-13 03:16:11 +02:00
f4ffbbca2f
TODO: figure out what environment variable should enable this
125 lines
3.5 KiB
Rust
125 lines
3.5 KiB
Rust
//! This implementation currently assumes riscv_rva23u64_zbb_zvbb. Zvbb in particular ("Vector
|
|
//! Bit-manipulation used in Cryptography") is a bleeding-edge extension that was only frozen a few
|
|
//! weeks ago at the time I'm writing this comment. Compiling and testing this code currently
|
|
//! requires quite a lot of effort, including building Clang from master and building QEMU from a
|
|
//! custom branch. Please don't expect this code to be usable on real hardware for some time.
|
|
|
|
use crate::{BlockBytes, CVBytes, Implementation};
|
|
|
|
// NOTE: Keep this in sync with the same constant in assembly.
|
|
pub(crate) const MAX_SIMD_DEGREE: usize = 16;
|
|
|
|
extern "C" {
|
|
fn blake3_guts_riscv_rva23u64_degree() -> usize;
|
|
fn blake3_guts_riscv_rva23u64_compress(
|
|
block: *const BlockBytes,
|
|
block_len: u32,
|
|
cv: *const CVBytes,
|
|
counter: u64,
|
|
flags: u32,
|
|
out: *mut CVBytes,
|
|
);
|
|
fn blake3_guts_riscv_rva23u64_hash_chunks(
|
|
input: *const u8,
|
|
input_len: usize,
|
|
key: *const CVBytes,
|
|
counter: u64,
|
|
flags: u32,
|
|
transposed_output: *mut u32,
|
|
);
|
|
fn blake3_guts_riscv_rva23u64_hash_parents(
|
|
transposed_input: *const u32,
|
|
num_parents: usize,
|
|
key: *const CVBytes,
|
|
flags: u32,
|
|
transposed_output: *mut u32,
|
|
);
|
|
fn blake3_guts_riscv_rva23u64_xof(
|
|
block: *const BlockBytes,
|
|
block_len: u32,
|
|
cv: *const CVBytes,
|
|
counter: u64,
|
|
flags: u32,
|
|
out: *mut u8,
|
|
out_len: usize,
|
|
);
|
|
fn blake3_guts_riscv_rva23u64_xof_xor(
|
|
block: *const BlockBytes,
|
|
block_len: u32,
|
|
cv: *const CVBytes,
|
|
counter: u64,
|
|
flags: u32,
|
|
out: *mut u8,
|
|
out_len: usize,
|
|
);
|
|
fn blake3_guts_riscv_rva23u64_universal_hash(
|
|
input: *const u8,
|
|
input_len: usize,
|
|
key: *const CVBytes,
|
|
counter: u64,
|
|
out: *mut [u8; 16],
|
|
);
|
|
}
|
|
|
|
pub fn implementation() -> Implementation {
|
|
Implementation::new(
|
|
blake3_guts_riscv_rva23u64_degree,
|
|
blake3_guts_riscv_rva23u64_compress,
|
|
blake3_guts_riscv_rva23u64_hash_chunks,
|
|
blake3_guts_riscv_rva23u64_hash_parents,
|
|
blake3_guts_riscv_rva23u64_xof,
|
|
blake3_guts_riscv_rva23u64_xof_xor,
|
|
blake3_guts_riscv_rva23u64_universal_hash,
|
|
)
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod test {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_compress_vs_portable() {
|
|
crate::test::test_compress_vs_portable(&implementation());
|
|
}
|
|
|
|
#[test]
|
|
fn test_compress_vs_reference() {
|
|
crate::test::test_compress_vs_reference(&implementation());
|
|
}
|
|
|
|
#[test]
|
|
fn test_hash_chunks_vs_portable() {
|
|
crate::test::test_hash_chunks_vs_portable(&implementation());
|
|
}
|
|
|
|
#[test]
|
|
fn test_hash_parents_vs_portable() {
|
|
crate::test::test_hash_parents_vs_portable(&implementation());
|
|
}
|
|
|
|
#[test]
|
|
fn test_chunks_and_parents_vs_reference() {
|
|
crate::test::test_chunks_and_parents_vs_reference(&implementation());
|
|
}
|
|
|
|
#[test]
|
|
fn test_xof_vs_portable() {
|
|
crate::test::test_xof_vs_portable(&implementation());
|
|
}
|
|
|
|
#[test]
|
|
fn test_xof_vs_reference() {
|
|
crate::test::test_xof_vs_reference(&implementation());
|
|
}
|
|
|
|
#[test]
|
|
fn test_universal_hash_vs_portable() {
|
|
crate::test::test_universal_hash_vs_portable(&implementation());
|
|
}
|
|
|
|
#[test]
|
|
fn test_universal_hash_vs_reference() {
|
|
crate::test::test_universal_hash_vs_reference(&implementation());
|
|
}
|
|
}
|