pub(crate) mod parameters;
pub(crate) mod tag;
use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout, Unaligned};
use crate::{
FloeAead, FloeKdf,
result::HeaderDecodeError,
types::{FloeIv, HeaderTag, Parameters},
};
#[derive(Debug, FromBytes, IntoBytes, Unaligned, Immutable, KnownLayout)]
#[repr(C)]
pub struct Header<const N: usize> {
parameters: Parameters,
floe_iv: FloeIv<N>,
tag: HeaderTag,
}
impl<const N: usize> Header<N> {
pub const LENGTH: usize = N + Parameters::LENGTH + HeaderTag::LENGTH;
pub(crate) fn new<A, K, const S: u32>(floe_iv: FloeIv<N>, header_tag: HeaderTag) -> Self
where
A: FloeAead,
K: FloeKdf,
{
let parameters = Parameters::new::<A, K, N, S>();
Self { parameters, floe_iv, tag: header_tag }
}
pub fn from_bytes(bytes: &[u8]) -> Result<Self, HeaderDecodeError> {
Self::read_from_bytes(bytes).map_err(|_| HeaderDecodeError::InvalidLength {
expected: Self::LENGTH,
got: bytes.len(),
})
}
pub fn parameters(&self) -> &Parameters {
&self.parameters
}
pub fn iv(&self) -> &FloeIv<N> {
&self.floe_iv
}
pub fn tag(&self) -> &HeaderTag {
&self.tag
}
}