use blake2_rfc::blake2b::Blake2b;
use filebuffer::FileBuffer;
use std::path::Path;
use std::fs;
#[derive(Debug)]
pub struct Blake2bSum {
digest_size: usize,
}
impl Blake2bSum {
pub fn new(digest: usize) -> Self {
if digest > 0 && digest <= 64 {
return Blake2bSum {
digest_size: digest,
}
}
else {
panic!("Digest Size is either too large or too small. It should be 1-64.")
}
}
pub fn read<T: AsRef<Path>>(&self, path: T) -> String {
let fbuffer = FileBuffer::open(path).expect("failed to open file");
let mut context = Blake2b::new(self.digest_size);
context.update(&fbuffer);
let hash = context.finalize();
return hex::encode_upper(hash.as_bytes());
}
pub fn read_with_key<T: AsRef<Path>>(&self, path: T, key: &[u8]) -> String {
let fbuffer = FileBuffer::open(path).expect("failed to open file");
let mut context = Blake2b::with_key(self.digest_size, key);
context.update(&fbuffer);
let hash = context.finalize();
return hex::encode_upper(hash.as_bytes());
}
#[deprecated(
note = "Please use the `read()` function instead which uses Filebuffer. This function uses the standard library."
)]
pub fn read_using_fs<T: AsRef<Path>>(&self, path: T) -> String {
let fbuffer = fs::read_to_string(path).expect("failed to open file");
let mut context = Blake2b::new(self.digest_size);
context.update(&fbuffer.as_bytes());
let hash = context.finalize();
return hex::encode_upper(hash.as_bytes());
}
pub fn read_str<T: AsRef<str>>(&self, string: T) -> String {
let mut context = Blake2b::new(self.digest_size);
context.update(string.as_ref().as_bytes());
let hash = context.finalize();
return hex::encode_upper(hash.as_bytes())
}
pub fn read_bytes(&self, bytes: &[u8]) -> String {
let mut context = Blake2b::new(self.digest_size);
context.update(bytes);
let hash = context.finalize();
return hex::encode_upper(hash.as_bytes())
}
pub fn as_bytes(s: &str) -> Vec<u8> {
return hex::decode(s).unwrap()
}
pub fn return_digest_size(&self) -> usize {
return self.digest_size
}
}