use sha2::{Digest, Sha256};
pub fn random_bytes<const N: usize>() -> [u8; N] {
let mut out = [0u8; N];
getrandom::fill(&mut out).expect("the OS random number generator is available");
out
}
pub fn sha256_hex(data: &[u8]) -> String {
hex::encode(Sha256::digest(data))
}
pub fn unix_now() -> i64 {
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.expect("the clock is after 1970")
.as_secs() as i64
}
pub fn rfc3339(unix: i64) -> String {
time::OffsetDateTime::from_unix_timestamp(unix)
.ok()
.and_then(|t| t.format(&time::format_description::well_known::Rfc3339).ok())
.unwrap_or_default()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn random_bytes_differ_between_calls() {
assert_ne!(random_bytes::<32>(), random_bytes::<32>());
}
#[test]
fn sha256_hex_matches_the_known_digest_of_abc() {
assert_eq!(
sha256_hex(b"abc"),
"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
);
}
#[test]
fn rfc3339_formats_kernel_timestamps_in_utc_and_out_of_range_as_empty() {
assert_eq!(rfc3339(0), "1970-01-01T00:00:00Z");
assert_eq!(rfc3339(1_700_000_000), "2023-11-14T22:13:20Z");
assert_eq!(rfc3339(i64::MAX), "");
}
}