use super::hash::{ShakeFamily, TweakableHash};
use super::hash_sha2::Sha2Family;
pub trait Params: Clone + Default {
type Hash: TweakableHash;
const N: usize;
const H: usize;
const D: usize;
const H_PRIME: usize;
const A: usize;
const K: usize;
const LG_W: usize = 4;
const W: usize = 16;
const M: usize;
const LEN1: usize = 2 * Self::N;
const LEN2: usize = 3;
const LEN: usize = Self::LEN1 + Self::LEN2;
const PK_LEN: usize = 2 * Self::N;
const SK_LEN: usize = 4 * Self::N;
const NAME: &'static str;
}
pub fn sig_len<P: Params>() -> usize {
P::N + P::K * (1 + P::A) * P::N + (P::H + P::D * P::LEN) * P::N
}
#[derive(Clone, Default)]
pub struct Shake128s;
impl Params for Shake128s {
type Hash = ShakeFamily;
const N: usize = 16;
const H: usize = 63;
const D: usize = 7;
const H_PRIME: usize = 9;
const A: usize = 12;
const K: usize = 14;
const M: usize = 30;
const NAME: &'static str = "SLH-DSA-SHAKE-128s";
}
#[derive(Clone, Default)]
pub struct Shake128f;
impl Params for Shake128f {
type Hash = ShakeFamily;
const N: usize = 16;
const H: usize = 66;
const D: usize = 22;
const H_PRIME: usize = 3;
const A: usize = 6;
const K: usize = 33;
const M: usize = 34;
const NAME: &'static str = "SLH-DSA-SHAKE-128f";
}
#[derive(Clone, Default)]
pub struct Shake192s;
impl Params for Shake192s {
type Hash = ShakeFamily;
const N: usize = 24;
const H: usize = 63;
const D: usize = 7;
const H_PRIME: usize = 9;
const A: usize = 14;
const K: usize = 17;
const M: usize = 39;
const NAME: &'static str = "SLH-DSA-SHAKE-192s";
}
#[derive(Clone, Default)]
pub struct Shake192f;
impl Params for Shake192f {
type Hash = ShakeFamily;
const N: usize = 24;
const H: usize = 66;
const D: usize = 22;
const H_PRIME: usize = 3;
const A: usize = 8;
const K: usize = 33;
const M: usize = 42;
const NAME: &'static str = "SLH-DSA-SHAKE-192f";
}
#[derive(Clone, Default)]
pub struct Shake256s;
impl Params for Shake256s {
type Hash = ShakeFamily;
const N: usize = 32;
const H: usize = 64;
const D: usize = 8;
const H_PRIME: usize = 8;
const A: usize = 14;
const K: usize = 22;
const M: usize = 47;
const NAME: &'static str = "SLH-DSA-SHAKE-256s";
}
#[derive(Clone, Default)]
pub struct Shake256f;
impl Params for Shake256f {
type Hash = ShakeFamily;
const N: usize = 32;
const H: usize = 68;
const D: usize = 17;
const H_PRIME: usize = 4;
const A: usize = 9;
const K: usize = 35;
const M: usize = 49;
const NAME: &'static str = "SLH-DSA-SHAKE-256f";
}
#[derive(Clone, Default)]
pub struct Sha2_128s;
impl Params for Sha2_128s {
type Hash = Sha2Family;
const N: usize = 16;
const H: usize = 63;
const D: usize = 7;
const H_PRIME: usize = 9;
const A: usize = 12;
const K: usize = 14;
const M: usize = 30;
const NAME: &'static str = "SLH-DSA-SHA2-128s";
}
#[derive(Clone, Default)]
pub struct Sha2_128f;
impl Params for Sha2_128f {
type Hash = Sha2Family;
const N: usize = 16;
const H: usize = 66;
const D: usize = 22;
const H_PRIME: usize = 3;
const A: usize = 6;
const K: usize = 33;
const M: usize = 34;
const NAME: &'static str = "SLH-DSA-SHA2-128f";
}
#[derive(Clone, Default)]
pub struct Sha2_192s;
impl Params for Sha2_192s {
type Hash = Sha2Family;
const N: usize = 24;
const H: usize = 63;
const D: usize = 7;
const H_PRIME: usize = 9;
const A: usize = 14;
const K: usize = 17;
const M: usize = 39;
const NAME: &'static str = "SLH-DSA-SHA2-192s";
}
#[derive(Clone, Default)]
pub struct Sha2_192f;
impl Params for Sha2_192f {
type Hash = Sha2Family;
const N: usize = 24;
const H: usize = 66;
const D: usize = 22;
const H_PRIME: usize = 3;
const A: usize = 8;
const K: usize = 33;
const M: usize = 42;
const NAME: &'static str = "SLH-DSA-SHA2-192f";
}
#[derive(Clone, Default)]
pub struct Sha2_256s;
impl Params for Sha2_256s {
type Hash = Sha2Family;
const N: usize = 32;
const H: usize = 64;
const D: usize = 8;
const H_PRIME: usize = 8;
const A: usize = 14;
const K: usize = 22;
const M: usize = 47;
const NAME: &'static str = "SLH-DSA-SHA2-256s";
}
#[derive(Clone, Default)]
pub struct Sha2_256f;
impl Params for Sha2_256f {
type Hash = Sha2Family;
const N: usize = 32;
const H: usize = 68;
const D: usize = 17;
const H_PRIME: usize = 4;
const A: usize = 9;
const K: usize = 35;
const M: usize = 49;
const NAME: &'static str = "SLH-DSA-SHA2-256f";
}