#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u8)]
pub enum PqScheme {
Falcon512 = 0x07,
Falcon1024 = 0x08,
MlDsa44 = 0x09,
MlDsa65 = 0x0A,
MlDsa87 = 0x0B,
}
impl PqScheme {
pub const KNOWN: [Self; 5] =
[Self::Falcon512, Self::Falcon1024, Self::MlDsa44, Self::MlDsa65, Self::MlDsa87];
pub const fn from_prefix(byte: u8) -> Option<Self> {
match byte {
0x07 => Some(Self::Falcon512),
0x08 => Some(Self::Falcon1024),
0x09 => Some(Self::MlDsa44),
0x0A => Some(Self::MlDsa65),
0x0B => Some(Self::MlDsa87),
_ => None,
}
}
pub const fn prefix(self) -> u8 {
self as u8
}
pub const fn pubkey_len(self) -> usize {
match self {
Self::Falcon512 => 897,
Self::Falcon1024 => 1793,
Self::MlDsa44 => 1312,
Self::MlDsa65 => 1952,
Self::MlDsa87 => 2592,
}
}
pub const fn seckey_len(self) -> usize {
match self {
Self::Falcon512 => 1281,
Self::Falcon1024 => 2305,
Self::MlDsa44 => 2560,
Self::MlDsa65 => 4032,
Self::MlDsa87 => 4896,
}
}
pub const fn max_sig_len(self) -> usize {
match self {
Self::Falcon512 => 752,
Self::Falcon1024 => 1462,
Self::MlDsa44 => 2420,
Self::MlDsa65 => 3309,
Self::MlDsa87 => 4627,
}
}
pub const fn max_sig_len_in_script(self) -> usize {
self.max_sig_len() + 1
}
pub const fn prefixed_pubkey_len(self) -> usize {
self.pubkey_len() + 1
}
pub const fn prefixed_seckey_len(self) -> usize {
self.seckey_len() + 1
}
pub const fn deterministic_seed_len(self) -> usize {
match self {
Self::Falcon512 | Self::Falcon1024 => 48,
Self::MlDsa44 | Self::MlDsa65 | Self::MlDsa87 => 32,
}
}
pub const fn is_allowed_at_height(self, height: u32, auxpow_start_height: Option<u32>) -> bool {
match auxpow_start_height {
Some(start_height) if height >= start_height => true,
_ => matches!(self, Self::Falcon512),
}
}
}