pub(crate) const D_PBLC: u16 = 0x8080;
pub(crate) const D_MESG: u16 = 0x8181;
pub(crate) const D_LEAF: u16 = 0x8282;
pub(crate) const D_INTR: u16 = 0x8383;
pub(crate) const N: usize = 32;
pub(crate) const MAX_P: usize = 265;
#[allow(non_camel_case_types)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
#[repr(u32)]
pub enum LmotsType {
Sha256N32W1 = 1,
Sha256N32W2 = 2,
Sha256N32W4 = 3,
Sha256N32W8 = 4,
}
impl LmotsType {
pub(crate) fn from_u32(v: u32) -> Option<Self> {
Some(match v {
1 => LmotsType::Sha256N32W1,
2 => LmotsType::Sha256N32W2,
3 => LmotsType::Sha256N32W4,
4 => LmotsType::Sha256N32W8,
_ => return None,
})
}
pub(crate) fn typecode(self) -> u32 {
self as u32
}
pub(crate) fn w(self) -> u32 {
match self {
LmotsType::Sha256N32W1 => 1,
LmotsType::Sha256N32W2 => 2,
LmotsType::Sha256N32W4 => 4,
LmotsType::Sha256N32W8 => 8,
}
}
pub(crate) fn p(self) -> usize {
match self {
LmotsType::Sha256N32W1 => 265,
LmotsType::Sha256N32W2 => 133,
LmotsType::Sha256N32W4 => 67,
LmotsType::Sha256N32W8 => 34,
}
}
pub(crate) fn ls(self) -> u32 {
match self {
LmotsType::Sha256N32W1 => 7,
LmotsType::Sha256N32W2 => 6,
LmotsType::Sha256N32W4 => 4,
LmotsType::Sha256N32W8 => 0,
}
}
pub(crate) fn max_digit(self) -> u32 {
(1u32 << self.w()) - 1
}
pub(crate) fn sig_len(self) -> usize {
4 + N * (self.p() + 1)
}
}
#[allow(non_camel_case_types)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
#[repr(u32)]
pub enum LmsType {
Sha256M32H5 = 5,
Sha256M32H10 = 6,
Sha256M32H15 = 7,
Sha256M32H20 = 8,
Sha256M32H25 = 9,
}
impl LmsType {
pub(crate) fn from_u32(v: u32) -> Option<Self> {
Some(match v {
5 => LmsType::Sha256M32H5,
6 => LmsType::Sha256M32H10,
7 => LmsType::Sha256M32H15,
8 => LmsType::Sha256M32H20,
9 => LmsType::Sha256M32H25,
_ => return None,
})
}
pub(crate) fn typecode(self) -> u32 {
self as u32
}
pub(crate) fn h(self) -> u32 {
match self {
LmsType::Sha256M32H5 => 5,
LmsType::Sha256M32H10 => 10,
LmsType::Sha256M32H15 => 15,
LmsType::Sha256M32H20 => 20,
LmsType::Sha256M32H25 => 25,
}
}
pub(crate) fn leaves(self) -> u64 {
1u64 << self.h()
}
}