Skip to main content

javm_guest_tests/tests/
crypto.rs

1//! Crypto test vectors: blake2b-256, keccak-256.
2//!
3//! Input: raw message bytes. Output: 32-byte hash. Each suite hashes
4//! a small corpus of fixed inputs and XOR-folds the resulting digests
5//! into a single u64 fingerprint.
6
7use crate::fold_bytes_to_u64;
8use blake2::digest::consts::U32;
9use blake2::digest::Digest as _;
10use blake2::Blake2b;
11
12type Blake2b256 = Blake2b<U32>;
13
14const HASH_INPUTS: &[&[u8]] = &[
15    &[],
16    b"abc",
17    b"The quick brown fox jumps over the lazy dog",
18    &[0u8; 64],
19];
20
21pub fn blake2b_256(input: &[u8], output: &mut [u8]) -> usize {
22    let mut hasher = Blake2b256::new();
23    hasher.update(input);
24    let result = hasher.finalize();
25    output[..32].copy_from_slice(&result);
26    32
27}
28
29pub fn keccak_256(input: &[u8], output: &mut [u8]) -> usize {
30    use sha3::Digest as _;
31    let mut hasher = sha3::Keccak256::new();
32    hasher.update(input);
33    let result = hasher.finalize();
34    output[..32].copy_from_slice(&result);
35    32
36}
37
38// -- Suites --------------------------------------------------------------------
39
40pub fn blake2b_256_suite() -> u64 {
41    let mut acc = 0u64;
42    let mut output = [0u8; 32];
43    for input in HASH_INPUTS {
44        let len = blake2b_256(input, &mut output);
45        debug_assert_eq!(len, 32);
46        acc ^= fold_bytes_to_u64(&output);
47    }
48    acc
49}
50
51pub fn keccak_256_suite() -> u64 {
52    let mut acc = 0u64;
53    let mut output = [0u8; 32];
54    for input in HASH_INPUTS {
55        let len = keccak_256(input, &mut output);
56        debug_assert_eq!(len, 32);
57        acc ^= fold_bytes_to_u64(&output);
58    }
59    acc
60}