#![allow(dead_code)]
pub trait SlhDsaParams: Clone + Copy + Default + 'static {
const N: usize;
const H: usize;
const D: usize;
const H_PRIME: usize;
const A: usize;
const K: usize;
const W: usize = 16;
const WOTS_LEN: usize;
const ALGORITHM: &'static str;
const SECURITY_LEVEL: usize;
const SIG_SIZE: usize;
const PK_SIZE: usize;
const SK_SIZE: usize;
const USE_SHA2: bool;
}
#[derive(Clone, Copy, Default, Debug, PartialEq, Eq)]
pub struct Sha2_128s;
impl SlhDsaParams for Sha2_128s {
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 WOTS_LEN: usize = 35; const ALGORITHM: &'static str = "SLH-DSA-SHA2-128s";
const SECURITY_LEVEL: usize = 128;
const SIG_SIZE: usize = 7_856;
const PK_SIZE: usize = 32;
const SK_SIZE: usize = 64;
const USE_SHA2: bool = true;
}
#[derive(Clone, Copy, Default, Debug, PartialEq, Eq)]
pub struct Sha2_128f;
impl SlhDsaParams for Sha2_128f {
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 WOTS_LEN: usize = 35;
const ALGORITHM: &'static str = "SLH-DSA-SHA2-128f";
const SECURITY_LEVEL: usize = 128;
const SIG_SIZE: usize = 17_088;
const PK_SIZE: usize = 32;
const SK_SIZE: usize = 64;
const USE_SHA2: bool = true;
}
#[derive(Clone, Copy, Default, Debug, PartialEq, Eq)]
pub struct Sha2_192s;
impl SlhDsaParams for Sha2_192s {
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 WOTS_LEN: usize = 51; const ALGORITHM: &'static str = "SLH-DSA-SHA2-192s";
const SECURITY_LEVEL: usize = 192;
const SIG_SIZE: usize = 16_224;
const PK_SIZE: usize = 48;
const SK_SIZE: usize = 96;
const USE_SHA2: bool = true;
}
#[derive(Clone, Copy, Default, Debug, PartialEq, Eq)]
pub struct Sha2_192f;
impl SlhDsaParams for Sha2_192f {
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 WOTS_LEN: usize = 51;
const ALGORITHM: &'static str = "SLH-DSA-SHA2-192f";
const SECURITY_LEVEL: usize = 192;
const SIG_SIZE: usize = 35_664;
const PK_SIZE: usize = 48;
const SK_SIZE: usize = 96;
const USE_SHA2: bool = true;
}
#[derive(Clone, Copy, Default, Debug, PartialEq, Eq)]
pub struct Sha2_256s;
impl SlhDsaParams for Sha2_256s {
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 WOTS_LEN: usize = 67; const ALGORITHM: &'static str = "SLH-DSA-SHA2-256s";
const SECURITY_LEVEL: usize = 256;
const SIG_SIZE: usize = 29_792;
const PK_SIZE: usize = 64;
const SK_SIZE: usize = 128;
const USE_SHA2: bool = true;
}
#[derive(Clone, Copy, Default, Debug, PartialEq, Eq)]
pub struct Sha2_256f;
impl SlhDsaParams for Sha2_256f {
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 WOTS_LEN: usize = 67;
const ALGORITHM: &'static str = "SLH-DSA-SHA2-256f";
const SECURITY_LEVEL: usize = 256;
const SIG_SIZE: usize = 49_856;
const PK_SIZE: usize = 64;
const SK_SIZE: usize = 128;
const USE_SHA2: bool = true;
}
#[derive(Clone, Copy, Default, Debug, PartialEq, Eq)]
pub struct Shake128s;
impl SlhDsaParams for Shake128s {
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 WOTS_LEN: usize = 35;
const ALGORITHM: &'static str = "SLH-DSA-SHAKE-128s";
const SECURITY_LEVEL: usize = 128;
const SIG_SIZE: usize = 7_856;
const PK_SIZE: usize = 32;
const SK_SIZE: usize = 64;
const USE_SHA2: bool = false;
}
#[derive(Clone, Copy, Default, Debug, PartialEq, Eq)]
pub struct Shake128f;
impl SlhDsaParams for Shake128f {
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 WOTS_LEN: usize = 35;
const ALGORITHM: &'static str = "SLH-DSA-SHAKE-128f";
const SECURITY_LEVEL: usize = 128;
const SIG_SIZE: usize = 17_088;
const PK_SIZE: usize = 32;
const SK_SIZE: usize = 64;
const USE_SHA2: bool = false;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_sha2_128s_params() {
assert_eq!(Sha2_128s::N, 16);
assert_eq!(Sha2_128s::H, 63);
assert_eq!(Sha2_128s::D, 7);
assert_eq!(Sha2_128s::H_PRIME, 9);
assert_eq!(Sha2_128s::H, Sha2_128s::D * Sha2_128s::H_PRIME);
assert_eq!(Sha2_128s::PK_SIZE, 2 * Sha2_128s::N);
assert_eq!(Sha2_128s::SK_SIZE, 4 * Sha2_128s::N);
}
#[test]
fn test_sha2_128f_params() {
assert_eq!(Sha2_128f::N, 16);
assert_eq!(Sha2_128f::H, 66);
assert_eq!(Sha2_128f::D, 22);
assert_eq!(Sha2_128f::H_PRIME, 3);
assert_eq!(Sha2_128f::H, Sha2_128f::D * Sha2_128f::H_PRIME);
}
#[test]
fn test_sha2_192s_params() {
assert_eq!(Sha2_192s::N, 24);
assert_eq!(Sha2_192s::SECURITY_LEVEL, 192);
assert_eq!(Sha2_192s::PK_SIZE, 48);
}
#[test]
fn test_sha2_256s_params() {
assert_eq!(Sha2_256s::N, 32);
assert_eq!(Sha2_256s::SECURITY_LEVEL, 256);
assert_eq!(Sha2_256s::PK_SIZE, 64);
}
#[test]
fn test_all_variants_have_w_16() {
assert_eq!(Sha2_128s::W, 16);
assert_eq!(Sha2_128f::W, 16);
assert_eq!(Sha2_192s::W, 16);
assert_eq!(Sha2_192f::W, 16);
assert_eq!(Sha2_256s::W, 16);
assert_eq!(Sha2_256f::W, 16);
}
}