use arrayvec::ArrayVec;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Token {
E,
S,
EE,
ES,
SE,
SS,
Ekem,
Skem,
}
#[derive(Clone, Debug)]
pub struct HandshakePattern {
name: &'static str,
pre_initiator: ArrayVec<Token, 4>,
pre_responder: ArrayVec<Token, 4>,
message_pattern: MessagePattern,
is_kem: bool,
}
#[derive(Clone, Debug)]
pub struct MessagePattern {
pub initiator: ArrayVec<ArrayVec<Token, 8>, 4>,
pub responder: ArrayVec<ArrayVec<Token, 8>, 4>,
}
impl HandshakePattern {
pub fn new(
name: &'static str,
pre_initiator: &[Token],
pre_responder: &[Token],
initiator: &[&[Token]],
responder: &[&[Token]],
is_kem: bool,
) -> Self {
Self {
name,
is_kem,
pre_initiator: pre_initiator.iter().copied().collect(),
pre_responder: pre_responder.iter().copied().collect(),
message_pattern: MessagePattern {
initiator: initiator
.iter()
.map(|p| p.iter().copied().collect())
.collect(),
responder: responder
.iter()
.map(|p| p.iter().copied().collect())
.collect(),
},
}
}
pub(crate) fn get_initiator_pattern_len(&self) -> usize {
self.message_pattern.initiator.len()
}
pub(crate) fn get_responder_pattern_len(&self) -> usize {
self.message_pattern.responder.len()
}
pub(crate) fn get_initiator_pre_shared(&self) -> &[Token] {
&self.pre_initiator
}
pub(crate) fn get_responder_pre_shared(&self) -> &[Token] {
&self.pre_responder
}
pub(crate) fn get_initiator_pattern(&self, index: usize) -> &[Token] {
&self.message_pattern.initiator[index]
}
pub(crate) fn get_responder_pattern(&self, index: usize) -> &[Token] {
&self.message_pattern.responder[index]
}
pub(crate) fn get_name(&self) -> &'static str {
self.name
}
pub(crate) fn is_kem(&self) -> bool {
self.is_kem
}
}
pub fn noise_pqnn() -> HandshakePattern {
HandshakePattern::new("pqNN", &[], &[], &[&[Token::E]], &[&[Token::Ekem]], true)
}
pub fn noise_pqnk() -> HandshakePattern {
HandshakePattern::new(
"pqNK",
&[],
&[Token::S],
&[&[Token::Skem, Token::E]],
&[&[Token::Ekem]],
true,
)
}
pub fn noise_pqnx() -> HandshakePattern {
HandshakePattern::new(
"pqNX",
&[],
&[],
&[&[Token::E], &[Token::Skem]],
&[&[Token::Ekem, Token::S]],
true,
)
}
pub fn noise_pqkn() -> HandshakePattern {
HandshakePattern::new(
"pqNK",
&[Token::S],
&[],
&[&[Token::E]],
&[&[Token::Ekem, Token::Skem]],
true,
)
}
pub fn noise_pqkk() -> HandshakePattern {
HandshakePattern::new(
"pqKK",
&[Token::S],
&[Token::S],
&[&[Token::Skem, Token::E]],
&[&[Token::Ekem, Token::Skem]],
true,
)
}
pub fn noise_pqkx() -> HandshakePattern {
HandshakePattern::new(
"pqKX",
&[Token::S],
&[],
&[&[Token::E], &[Token::Skem]],
&[&[Token::Ekem, Token::Skem, Token::S]],
true,
)
}
pub fn noise_pqxn() -> HandshakePattern {
HandshakePattern::new(
"pqXN",
&[],
&[],
&[&[Token::E], &[Token::S]],
&[&[Token::Ekem], &[Token::Skem]],
true,
)
}
pub fn noise_pqxk() -> HandshakePattern {
HandshakePattern::new(
"pqXK",
&[],
&[Token::S],
&[&[Token::Skem, Token::E], &[Token::S]],
&[&[Token::Ekem], &[Token::Skem]],
true,
)
}
pub fn noise_pqxx() -> HandshakePattern {
HandshakePattern::new(
"pqXX",
&[],
&[],
&[&[Token::E], &[Token::Skem, Token::S]],
&[&[Token::Ekem, Token::S], &[Token::Skem]],
true,
)
}
pub fn noise_pqin() -> HandshakePattern {
HandshakePattern::new(
"pqIN",
&[],
&[],
&[&[Token::E, Token::S]],
&[&[Token::Ekem, Token::Skem]],
true,
)
}
pub fn noise_pqik() -> HandshakePattern {
HandshakePattern::new(
"pqIK",
&[],
&[Token::S],
&[&[Token::Skem, Token::E, Token::S]],
&[&[Token::Ekem, Token::Skem]],
true,
)
}
pub fn noise_pqix() -> HandshakePattern {
HandshakePattern::new(
"pqIX",
&[],
&[],
&[&[Token::E, Token::S], &[Token::Skem]],
&[&[Token::Ekem, Token::Skem, Token::S]],
true,
)
}
pub fn noise_nn() -> HandshakePattern {
HandshakePattern::new(
"NN",
&[],
&[],
&[&[Token::E]],
&[&[Token::E, Token::EE]],
false,
)
}
pub fn noise_kn() -> HandshakePattern {
HandshakePattern::new(
"KN",
&[Token::S],
&[],
&[&[Token::E]],
&[&[Token::E, Token::EE, Token::SE]],
false,
)
}
pub fn noise_nk() -> HandshakePattern {
HandshakePattern::new(
"NK",
&[],
&[Token::S],
&[&[Token::E, Token::ES]],
&[&[Token::E, Token::EE]],
false,
)
}
pub fn noise_kk() -> HandshakePattern {
HandshakePattern::new(
"KK",
&[Token::S],
&[Token::S],
&[&[Token::E, Token::ES, Token::SS]],
&[&[Token::E, Token::EE, Token::SE]],
false,
)
}
pub fn noise_nx() -> HandshakePattern {
HandshakePattern::new(
"NX",
&[],
&[],
&[&[Token::E]],
&[&[Token::E, Token::EE, Token::S, Token::ES]],
false,
)
}
pub fn noise_kx() -> HandshakePattern {
HandshakePattern::new(
"KX",
&[Token::S],
&[],
&[&[Token::E]],
&[&[Token::E, Token::EE, Token::SE, Token::S, Token::ES]],
false,
)
}
pub fn noise_xn() -> HandshakePattern {
HandshakePattern::new(
"XN",
&[],
&[],
&[&[Token::E], &[Token::S, Token::SE]],
&[&[Token::E, Token::EE]],
false,
)
}
pub fn noise_in() -> HandshakePattern {
HandshakePattern::new(
"IN",
&[],
&[],
&[&[Token::E, Token::S]],
&[&[Token::E, Token::EE, Token::SE]],
false,
)
}
pub fn noise_xk() -> HandshakePattern {
HandshakePattern::new(
"XK",
&[],
&[Token::S],
&[&[Token::E, Token::ES], &[Token::S, Token::SE]],
&[&[Token::E, Token::EE]],
false,
)
}
pub fn noise_ik() -> HandshakePattern {
HandshakePattern::new(
"IK",
&[],
&[Token::S],
&[&[Token::E, Token::ES, Token::S, Token::SS]],
&[&[Token::E, Token::EE, Token::SE]],
false,
)
}
pub fn noise_xx() -> HandshakePattern {
HandshakePattern::new(
"XX",
&[],
&[],
&[&[Token::E], &[Token::S, Token::SE]],
&[&[Token::E, Token::EE, Token::S, Token::ES]],
false,
)
}
pub fn noise_ix() -> HandshakePattern {
HandshakePattern::new(
"IX",
&[],
&[],
&[&[Token::E, Token::S]],
&[&[Token::E, Token::EE, Token::SE, Token::S, Token::ES]],
false,
)
}