Skip to content

Commit ec7c0fc

Browse files
committed
Adds test vectors for blake2x
1 parent 2bcd7bf commit ec7c0fc

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed

tests/vector_tests.rs

+107
Original file line numberDiff line numberDiff line change
@@ -149,3 +149,110 @@ fn blake2sp_vectors() {
149149
// count.
150150
assert_eq!(512, test_num);
151151
}
152+
153+
fn blake2x_test<F: Fn(&[u8], &[u8], u64) -> Vec<u8>, F2: Fn(&[u8], u64, usize) -> Vec<u8>>(h0_hasher: F, b2_hasher: F2, variant_hash_length: usize, variant_name: &str) {
154+
let mut test_num = 0u64;
155+
for case in TEST_CASES.iter() {
156+
if &case.hash == variant_name {
157+
test_num += 1;
158+
159+
let input_bytes = hex::decode(&case.in_).unwrap();
160+
let key = if !case.key.is_empty() {
161+
hex::decode(&case.key).unwrap()
162+
} else {
163+
vec![]
164+
};
165+
166+
let output_length = case.out.len()/2;
167+
let encoded_output_length = (((output_length & ((1 << 8) - 1)) << 32) | ((output_length >> 8) << 40)) as u64;
168+
let h0 = h0_hasher(&input_bytes, &key, encoded_output_length);
169+
170+
let num_hashes = (output_length + variant_hash_length - 1)/variant_hash_length;
171+
let mut buf = vec![];
172+
for i in 0..num_hashes {
173+
let hash_length = {
174+
if i == (num_hashes - 1) && (output_length % variant_hash_length) != 0 {
175+
output_length % variant_hash_length
176+
} else {
177+
variant_hash_length
178+
}
179+
};
180+
181+
let b2_out = b2_hasher(&h0, (i as u64) | encoded_output_length, hash_length);
182+
buf.extend_from_slice(&b2_out);
183+
}
184+
assert_eq!(case.out, hex::encode(&buf[..output_length]));
185+
}
186+
}
187+
188+
// Make sure we don't accidentally skip all the tests somehow. If the
189+
// number of test vectors changes in the future, we'll need to update this
190+
// count.
191+
assert_eq!(512, test_num);
192+
}
193+
194+
#[test]
195+
fn blake2xs_vectors() {
196+
let blake2xs_h0_hasher = |input_bytes: &[u8], key: &[u8], encoded_output_length: u64| -> Vec<u8> {
197+
let mut params = blake2s_simd::Params::new();
198+
if key.len() > 0 {
199+
params.key(key);
200+
}
201+
params
202+
.hash_length(32)
203+
.node_offset(encoded_output_length);
204+
let mut state = params.to_state();
205+
state.update(&input_bytes);
206+
let h0 = state.finalize().as_ref().to_vec();
207+
h0
208+
};
209+
let blake2xs_b2_hasher = |input_bytes: &[u8], encoded_output_length: u64, hash_length: usize| -> Vec<u8> {
210+
let mut params = blake2s_simd::Params::new();
211+
params
212+
.hash_length(hash_length)
213+
.max_leaf_length(32)
214+
.inner_hash_length(32)
215+
.fanout(0)
216+
.max_depth(0)
217+
.node_offset(encoded_output_length);
218+
let mut state = params.to_state();
219+
state.update(&input_bytes);
220+
let b2_out = state.finalize().as_ref().to_vec();
221+
b2_out
222+
};
223+
224+
blake2x_test(blake2xs_h0_hasher, blake2xs_b2_hasher, 32, "blake2xs");
225+
}
226+
227+
#[test]
228+
fn blake2xb_vectors() {
229+
let blake2xb_h0_hasher = |input_bytes: &[u8], key: &[u8], encoded_output_length: u64| -> Vec<u8> {
230+
let mut params = blake2b_simd::Params::new();
231+
if key.len() > 0 {
232+
params.key(key);
233+
}
234+
params
235+
.hash_length(64)
236+
.node_offset(encoded_output_length);
237+
let mut state = params.to_state();
238+
state.update(&input_bytes);
239+
let h0 = state.finalize().as_ref().to_vec();
240+
h0
241+
};
242+
let blake2xb_b2_hasher = |input_bytes: &[u8], encoded_output_length: u64, hash_length: usize| -> Vec<u8> {
243+
let mut params = blake2b_simd::Params::new();
244+
params
245+
.hash_length(hash_length)
246+
.max_leaf_length(64)
247+
.inner_hash_length(64)
248+
.fanout(0)
249+
.max_depth(0)
250+
.node_offset(encoded_output_length);
251+
let mut state = params.to_state();
252+
state.update(&input_bytes);
253+
let b2_out = state.finalize().as_ref().to_vec();
254+
b2_out
255+
};
256+
257+
blake2x_test(blake2xb_h0_hasher, blake2xb_b2_hasher, 64, "blake2xb");
258+
}

0 commit comments

Comments
 (0)