use sha2::{Digest, Sha512};
use subtle::ConstantTimeEq;
use zeroize::Zeroize;
pub(crate) struct Sha512Context {
inner: Sha512,
}
impl Sha512Context {
pub(crate) fn new() -> Self {
Self {
inner: Sha512::new(),
}
}
pub(crate) fn update(&mut self, data: &[u8]) {
self.inner.update(data);
}
pub(crate) fn finish(self) -> [u8; 64] {
self.inner.finalize().into()
}
}
pub(crate) fn constant_time_eq(a: &[u8], b: &[u8]) -> bool {
if a.len() != b.len() {
return false;
}
a.ct_eq(b).into()
}
pub(crate) fn random_bytes(buf: &mut [u8]) {
getrandom::fill(buf).expect("crypt-sha512: getrandom failed");
}
pub(crate) fn secure_zero_bytes(data: &mut [u8]) {
data.zeroize();
}