use anyhow::{Context, Result};
use blake2::Blake2bVar;
use blake2::digest::core_api::RtVariableCoreWrapper;
use blake2::digest::{Update, VariableOutput};
use hex;
use sha3::{Digest, Sha3_256};
pub fn blake2b_224(data: &str) -> Result<String> {
let decoded_data: Vec<u8> = if let Ok(decoded) = hex::decode(data) {
decoded
} else {
data.as_bytes().to_vec()
};
let mut hasher: RtVariableCoreWrapper<blake2::Blake2bVarCore> =
Blake2bVar::new(28).context("Failed to create BLAKE2b hasher")?;
hasher.update(&decoded_data);
let mut result: [u8; 28] = [0u8; 28];
hasher
.finalize_variable(&mut result)
.context("Failed to finalize hash")?;
Ok(hex::encode(result))
}
pub fn blake2b_256(data: &str) -> Result<String> {
let decoded_data: Vec<u8> = if let Ok(decoded) = hex::decode(data) {
decoded
} else {
data.as_bytes().to_vec()
};
let mut hasher: RtVariableCoreWrapper<blake2::Blake2bVarCore> =
Blake2bVar::new(32).context("Failed to create BLAKE2b hasher")?;
hasher.update(&decoded_data);
let mut result: [u8; 32] = [0u8; 32];
hasher
.finalize_variable(&mut result)
.context("Failed to finalize hash")?;
Ok(hex::encode(result))
}
pub fn sha3_256(data: &str) -> Result<String> {
let mut sha3_hasher = Sha3_256::new();
Digest::update(
&mut sha3_hasher,
hex::decode(data).context("Invalid Input")?,
);
let result = sha3_hasher.finalize();
Ok(hex::encode(result))
}