Skip to main content

sofie_auth/
digest.rs

1use ring::digest::{Context, SHA256};
2
3use sofie_core::encoding::base64::{self, URL_SAFE};
4
5/// Each part is length-prefixed, so moving bytes between parts changes the digest.
6#[must_use]
7pub fn digest(parts: &[&[u8]]) -> String {
8    let mut context = Context::new(&SHA256);
9    for part in parts {
10        context.update(&(part.len() as u64).to_be_bytes());
11        context.update(part);
12    }
13    base64::encode(&URL_SAFE, context.finish().as_ref())
14}
15
16#[cfg(test)]
17mod tests {
18    use super::digest;
19
20    #[test]
21    fn the_digest_tells_parts_apart_and_is_stable() {
22        assert_eq!(digest(&[b"ab", b"c"]), digest(&[b"ab", b"c"]));
23        assert_ne!(digest(&[b"ab", b"c"]), digest(&[b"a", b"bc"]));
24        assert_eq!(digest(&[b""]).len(), 43);
25    }
26}