use sha2::{Digest, Sha256};
#[inline]
pub fn hash_bytes_raw(data: &[u8]) -> [u8; 32] {
let mut hasher = Sha256::new();
hasher.update(data);
let result = hasher.finalize();
let mut arr = [0u8; 32];
arr.copy_from_slice(&result);
arr
}
#[inline]
pub fn hash_bytes(data: &[u8]) -> String {
let mut hasher = Sha256::new();
hasher.update(data);
let result = hasher.finalize();
format!("{:x}", result)
}
#[inline]
pub fn hash_string(input_string: &str) -> String {
hash_bytes(input_string.as_bytes())
}
pub fn hash_public_key(public_key_bytes: impl AsRef<[u8]>) -> String {
let public_key_bytes = public_key_bytes.as_ref();
let (encoding, _) =
encoding_rs::Encoding::for_bom(public_key_bytes).unwrap_or((encoding_rs::UTF_8, 0));
let public_key_string = encoding.decode(public_key_bytes).0.into_owned();
let normalized = public_key_string.trim().replace("\r", "");
hash_string(&normalized)
}
#[cfg(test)]
mod tests {
use super::hash_public_key;
#[test]
fn hash_public_key_normalizes_line_endings_and_trailing_whitespace() {
let with_crlf = b"-----BEGIN KEY-----\r\nabc123\r\n-----END KEY-----\r\n".as_slice();
let with_lf = b"-----BEGIN KEY-----\nabc123\n-----END KEY-----".as_slice();
assert_eq!(hash_public_key(with_crlf), hash_public_key(with_lf));
}
#[test]
fn hash_public_key_accepts_vec_and_slice_inputs() {
let public_key = b"demo-public-key".to_vec();
let from_vec = hash_public_key(&public_key);
let from_slice = hash_public_key(public_key.as_slice());
assert_eq!(from_vec, from_slice);
}
}