use crate::kem::Kem as KemTrait;
#[derive(Clone, Copy)]
pub struct PskBundle<'a> {
pub psk: &'a [u8],
pub psk_id: &'a [u8],
}
pub enum OpModeR<'a, Kem: KemTrait> {
Base,
Psk(PskBundle<'a>),
Auth(Kem::PublicKey),
AuthPsk(Kem::PublicKey, PskBundle<'a>),
}
impl<'a, Kem: KemTrait> OpModeR<'a, Kem> {
pub(crate) fn get_pk_sender_id(&self) -> Option<&Kem::PublicKey> {
match self {
OpModeR::Auth(pk) => Some(pk),
OpModeR::AuthPsk(pk, _) => Some(pk),
_ => None,
}
}
}
pub enum OpModeS<'a, Kem: KemTrait> {
Base,
Psk(PskBundle<'a>),
Auth((Kem::PrivateKey, Kem::PublicKey)),
AuthPsk((Kem::PrivateKey, Kem::PublicKey), PskBundle<'a>),
}
impl<'a, Kem: KemTrait> OpModeS<'a, Kem> {
pub(crate) fn get_sender_id_keypair(&self) -> Option<(&Kem::PrivateKey, &Kem::PublicKey)> {
match self {
OpModeS::Auth(keypair) => Some((&keypair.0, &keypair.1)),
OpModeS::AuthPsk(keypair, _) => Some((&keypair.0, &keypair.1)),
_ => None,
}
}
}
pub(crate) trait OpMode<Kem: KemTrait> {
fn mode_id(&self) -> u8;
fn get_psk_bytes(&self) -> &[u8];
fn get_psk_id(&self) -> &[u8];
}
impl<'a, Kem: KemTrait> OpMode<Kem> for OpModeR<'a, Kem> {
fn mode_id(&self) -> u8 {
match self {
OpModeR::Base => 0x00,
OpModeR::Psk(..) => 0x01,
OpModeR::Auth(..) => 0x02,
OpModeR::AuthPsk(..) => 0x03,
}
}
fn get_psk_bytes(&self) -> &[u8] {
match self {
OpModeR::Psk(bundle) => bundle.psk,
OpModeR::AuthPsk(_, bundle) => bundle.psk,
_ => &[],
}
}
fn get_psk_id(&self) -> &[u8] {
match self {
OpModeR::Psk(p) => p.psk_id,
OpModeR::AuthPsk(_, p) => p.psk_id,
_ => &[],
}
}
}
impl<'a, Kem: KemTrait> OpMode<Kem> for OpModeS<'a, Kem> {
fn mode_id(&self) -> u8 {
match self {
OpModeS::Base => 0x00,
OpModeS::Psk(..) => 0x01,
OpModeS::Auth(..) => 0x02,
OpModeS::AuthPsk(..) => 0x03,
}
}
fn get_psk_bytes(&self) -> &[u8] {
match self {
OpModeS::Psk(bundle) => bundle.psk,
OpModeS::AuthPsk(_, bundle) => bundle.psk,
_ => &[],
}
}
fn get_psk_id(&self) -> &[u8] {
match self {
OpModeS::Psk(p) => p.psk_id,
OpModeS::AuthPsk(_, p) => p.psk_id,
_ => &[],
}
}
}