use super::*;
#[derive(Debug, Clone, Serialize, Deserialize, TlsDeserialize, TlsSerialize, TlsSize)]
pub(crate) struct Mac {
pub(crate) mac_value: TlsByteVecU8,
}
impl PartialEq for Mac {
fn eq(&self, other: &Mac) -> bool {
equal_ct(self.mac_value.as_slice(), other.mac_value.as_slice())
}
}
impl Mac {
pub(crate) fn new(
backend: &impl OpenMlsCryptoProvider,
salt: &Secret,
ikm: &[u8],
) -> Result<Self, CryptoError> {
Ok(Mac {
mac_value: salt
.hkdf_extract(
backend,
&Secret::from_slice(ikm, salt.mls_version, salt.ciphersuite),
)?
.value
.into(),
})
}
#[cfg(test)]
pub(crate) fn flip_last_byte(&mut self) {
let mut last_bits = self.mac_value.pop().expect("An unexpected error occurred.");
last_bits ^= 0xff;
self.mac_value.push(last_bits);
}
}