mod sip;
pub use sip::SipHasher24 as SipHasher;
mod types;
pub use types::{DefaultHashable, HashWriter, Hashed, H256};
mod error;
pub use error::Unspecified;
use crate::blake2::{Params, State};
use crate::dalek::ristretto::RistrettoPoint;
#[inline]
pub fn blake160(data: &[u8]) -> H256 {
let mut params = Params::new();
params.hash_length(32);
let mut result = [0u8; 32];
result.clone_from_slice(¶ms.hash(data).as_bytes());
H256::from(result)
}
#[inline]
pub fn blake256(data: &[u8]) -> H256 {
let mut params = Params::new();
params.hash_length(32);
let mut result = [0u8; 32];
result.clone_from_slice(¶ms.hash(data).as_bytes());
H256::from(result)
}
#[inline]
pub fn blake512(data: &[u8]) -> [u8; 64] {
let mut params = Params::new();
params.hash_length(64);
let mut result = [0u8; 64];
result.clone_from_slice(¶ms.hash(data).as_bytes());
result
}
#[inline]
pub fn hmac_sign(key: &[u8], data: &[u8]) -> H256 {
let mut params = Params::new();
params.key(key);
params.hash_length(32);
let mut result = [0u8; 32];
result.clone_from_slice(¶ms.hash(data).as_bytes());
H256::from(result)
}
pub fn hmac_verify(key: &[u8], data: &[u8], tag: &[u8]) -> Result<(), Unspecified> {
use subtle::ConstantTimeEq;
let mut params = Params::new();
params.key(key);
params.hash_length(32);
let mut result = [0u8; 32];
result.clone_from_slice(¶ms.hash(data).as_bytes());
if tag.len() != result.len() {
return Err(Unspecified);
}
if tag.ct_eq(&result).unwrap_u8() == 1 {
Ok(())
} else {
return Err(Unspecified);
}
}
#[inline]
pub fn hash_to_ristretto(input: &[u8]) -> RistrettoPoint {
RistrettoPoint::from_uniform_bytes(&blake512(input))
}
pub struct BlakeHasher {
state: State,
}
impl Default for BlakeHasher {
fn default() -> BlakeHasher {
BlakeHasher::new()
}
}
impl BlakeHasher {
pub fn new() -> Self {
let mut params = Params::new();
params.hash_length(32);
Self {
state: params.to_state(),
}
}
pub fn new_personal(personal: &[u8]) -> Self {
let mut params = Params::new();
params.personal(personal);
params.hash_length(32);
Self {
state: params.to_state(),
}
}
#[inline]
pub fn write(&mut self, msg: &[u8]) {
self.state.update(msg);
}
#[inline]
pub fn finalize(&self) -> H256 {
let mut result = [0u8; 32];
let output = self.state.finalize();
result.clone_from_slice(&output.as_bytes());
H256::from(result)
}
#[inline]
pub fn chain(mut self, data: &[u8]) -> Self
where
Self: Sized,
{
self.state.update(data);
self
}
}