rmls 0.0.4

Messaging Layer Security in Rust
Documentation
use bytes::Bytes;
use hmac::{Hmac, Mac};
use sha2::{Digest, Sha256, Sha384, Sha512};

#[derive(Default, Debug, Copy, Clone, Eq, PartialEq)]
pub(super) enum HashScheme {
    #[default]
    SHA256,
    SHA384,
    SHA512,
}

impl crate::crypto::provider::Hash for HashScheme {
    fn digest(&self, data: &[u8]) -> Bytes {
        match *self {
            HashScheme::SHA256 => {
                let mut h = Sha256::new();
                h.update(data);
                Bytes::from(h.finalize().to_vec())
            }
            HashScheme::SHA384 => {
                let mut h = Sha384::new();
                h.update(data);
                Bytes::from(h.finalize().to_vec())
            }
            HashScheme::SHA512 => {
                let mut h = Sha512::new();
                h.update(data);
                Bytes::from(h.finalize().to_vec())
            }
        }
    }

    fn mac(&self, key: &[u8], message: &[u8]) -> Bytes {
        match *self {
            HashScheme::SHA256 => {
                let mut m = Hmac::<Sha256>::new_from_slice(key).unwrap();
                m.update(message);
                Bytes::from(m.finalize().into_bytes().to_vec())
            }
            HashScheme::SHA384 => {
                let mut m = Hmac::<Sha384>::new_from_slice(key).unwrap();
                m.update(message);
                Bytes::from(m.finalize().into_bytes().to_vec())
            }
            HashScheme::SHA512 => {
                let mut m = Hmac::<Sha512>::new_from_slice(key).unwrap();
                m.update(message);
                Bytes::from(m.finalize().into_bytes().to_vec())
            }
        }
    }
}