use zerocopy::{BigEndian, FromBytes, Immutable, IntoBytes, KnownLayout, Unaligned};
use crate::{FloeAead, FloeKdf};
#[derive(
Debug, Clone, Copy, PartialEq, Eq, FromBytes, IntoBytes, Unaligned, Immutable, KnownLayout,
)]
#[repr(C)]
pub struct Parameters {
aead_id: u8,
kdf_id: u8,
segment_length: zerocopy::U32<BigEndian>,
floe_iv_size: zerocopy::U32<BigEndian>,
}
impl Parameters {
pub const LENGTH: usize = 10;
pub(crate) fn new<A, K, const N: usize, const S: u32>() -> Self
where
A: FloeAead,
K: FloeKdf,
{
#[allow(clippy::expect_used)]
let floe_iv_length =
u32::try_from(N).expect("the Floe IV is too long, it must be smaller than u32::MAX");
let floe_iv_length = zerocopy::U32::new(floe_iv_length);
Self {
aead_id: A::AEAD_ID,
kdf_id: K::KDF_ID,
segment_length: zerocopy::U32::new(S),
floe_iv_size: floe_iv_length,
}
}
pub fn aead_id(&self) -> u8 {
self.aead_id
}
pub fn kdf_id(&self) -> u8 {
self.kdf_id
}
pub fn segment_length(&self) -> u32 {
self.segment_length.get()
}
pub fn floe_iv_size(&self) -> u32 {
self.floe_iv_size.get()
}
}