use crate::Result;
use derivative::Derivative;
pub use self::hmac::{
HMAC_SHA2_256, HMAC_SHA2_512, HMAC_SHA1,
HMAC_SHA2_256_ETM, HMAC_SHA2_512_ETM, HMAC_SHA1_ETM,
};
pub use self::none::NONE;
pub(crate) use self::none::{INVALID, Empty};
mod none;
mod hmac;
#[derive(Derivative)]
#[derivative(Debug)]
pub struct MacAlgo {
pub name: &'static str,
pub(crate) tag_len: usize,
pub(crate) key_len: usize,
pub(crate) variant: MacAlgoVariant,
#[derivative(Debug = "ignore")]
pub(crate) make_mac: fn(key: &[u8]) -> Box<dyn Mac + Send>,
}
#[derive(Debug, Copy, Clone)]
pub(crate) enum MacAlgoVariant {
EncryptAndMac,
EncryptThenMac,
}
pub(crate) trait Mac {
fn sign(&mut self, packet_seq: u32, data: &[u8], tag: &mut [u8]);
fn verify(&mut self, packet_seq: u32, data: &[u8], tag: &[u8]) -> Result<MacVerified>;
}
#[derive(Debug)]
pub(crate) struct MacVerified(());
impl MacVerified {
pub fn assertion() -> Self {
Self(())
}
}