use std::cmp::max;
pub struct Buffer {
data: Vec<u8>,
count: u64,
hashinput_len: usize,
prevhash_slice_begin: usize,
prevhash_slice_end: usize,
count_slice_begin: usize,
count_slice_end: usize,
}
impl Buffer {
pub const COUNTSIZE: usize = 64 / 8;
pub fn new(seed: &Vec<u8>,
hash_size: usize,
hash_prevsize: usize) -> Buffer {
let seed_len = seed.len();
assert!(seed_len > 0);
assert!(hash_size > 0);
assert!(hash_prevsize <= hash_size);
let mut data = vec![0; seed_len +
max(hash_prevsize + Buffer::COUNTSIZE, hash_size)];
data[..seed_len].copy_from_slice(seed);
let prevhash_slice_begin = seed_len;
let prevhash_slice_end = seed_len + hash_size;
let count_slice_begin = seed_len + hash_prevsize;
let count_slice_end = count_slice_begin + Buffer::COUNTSIZE;
let hashinput_len = seed_len + hash_prevsize + Buffer::COUNTSIZE;
Buffer {
data,
count: 0,
hashinput_len,
prevhash_slice_begin,
prevhash_slice_end,
count_slice_begin,
count_slice_end,
}
}
#[inline]
pub fn next_count(&mut self) {
let count_bytes = self.count.to_le_bytes();
self.count += 1;
self.data[self.count_slice_begin..self.count_slice_end].copy_from_slice(&count_bytes);
}
#[inline]
pub fn hashalg_input(&self) -> &[u8] {
&self.data[..self.hashinput_len]
}
#[inline]
pub fn hashalg_output(&mut self) -> &mut [u8] {
&mut self.data[self.prevhash_slice_begin..self.prevhash_slice_end]
}
#[inline]
pub fn get_result(&mut self) -> &[u8] {
&self.data[self.prevhash_slice_begin..self.prevhash_slice_end]
}
}