pub(crate) const MAX_N: usize = 32;
pub(crate) const MAX_M: usize = 49;
pub(crate) const MAX_K: usize = 35;
pub(crate) const MAX_WOTS_LEN: usize = 67;
pub(crate) const MAX_CONTEXT: usize = 255;
#[derive(Clone, Copy)]
pub(crate) struct Params {
pub(crate) is_shake: bool,
pub(crate) n: u32,
pub(crate) h: u32,
pub(crate) d: u32,
pub(crate) h_prime: u32,
pub(crate) a: u32,
pub(crate) k: u32,
pub(crate) m: u32,
pub(crate) len: u32,
pub(crate) sig_size: usize,
pub(crate) pk_size: usize,
pub(crate) sk_size: usize,
pub(crate) oid: &'static [u64],
}
impl Params {
pub(crate) fn md_len(&self) -> usize {
((self.k * self.a + 7) >> 3) as usize
}
pub(crate) fn tree_idx_len(&self) -> usize {
((self.h - self.h_prime + 7) >> 3) as usize
}
pub(crate) fn tree_idx_mask(&self) -> u64 {
let shift = self.h - self.h_prime;
if shift >= 64 {
u64::MAX
} else {
(1u64 << shift) - 1
}
}
pub(crate) fn leaf_idx_len(&self) -> usize {
((self.h_prime + 7) >> 3) as usize
}
pub(crate) fn leaf_idx_mask(&self) -> u64 {
if self.h_prime >= 64 {
u64::MAX
} else {
(1u64 << self.h_prime) - 1
}
}
}
pub(crate) const SETS: [Params; 12] = [
p(
false,
16,
63,
7,
9,
12,
14,
30,
35,
7856,
32,
64,
&[2, 16, 840, 1, 101, 3, 4, 3, 20],
),
p(
false,
16,
66,
22,
3,
6,
33,
34,
35,
17088,
32,
64,
&[2, 16, 840, 1, 101, 3, 4, 3, 21],
),
p(
false,
24,
63,
7,
9,
14,
17,
39,
51,
16224,
48,
96,
&[2, 16, 840, 1, 101, 3, 4, 3, 22],
),
p(
false,
24,
66,
22,
3,
8,
33,
42,
51,
35664,
48,
96,
&[2, 16, 840, 1, 101, 3, 4, 3, 23],
),
p(
false,
32,
64,
8,
8,
14,
22,
47,
67,
29792,
64,
128,
&[2, 16, 840, 1, 101, 3, 4, 3, 24],
),
p(
false,
32,
68,
17,
4,
9,
35,
49,
67,
49856,
64,
128,
&[2, 16, 840, 1, 101, 3, 4, 3, 25],
),
p(
true,
16,
63,
7,
9,
12,
14,
30,
35,
7856,
32,
64,
&[2, 16, 840, 1, 101, 3, 4, 3, 26],
),
p(
true,
16,
66,
22,
3,
6,
33,
34,
35,
17088,
32,
64,
&[2, 16, 840, 1, 101, 3, 4, 3, 27],
),
p(
true,
24,
63,
7,
9,
14,
17,
39,
51,
16224,
48,
96,
&[2, 16, 840, 1, 101, 3, 4, 3, 28],
),
p(
true,
24,
66,
22,
3,
8,
33,
42,
51,
35664,
48,
96,
&[2, 16, 840, 1, 101, 3, 4, 3, 29],
),
p(
true,
32,
64,
8,
8,
14,
22,
47,
67,
29792,
64,
128,
&[2, 16, 840, 1, 101, 3, 4, 3, 30],
),
p(
true,
32,
68,
17,
4,
9,
35,
49,
67,
49856,
64,
128,
&[2, 16, 840, 1, 101, 3, 4, 3, 31],
),
];
#[allow(clippy::too_many_arguments)]
const fn p(
is_shake: bool,
n: u32,
h: u32,
d: u32,
h_prime: u32,
a: u32,
k: u32,
m: u32,
len: u32,
sig_size: usize,
pk_size: usize,
sk_size: usize,
oid: &'static [u64],
) -> Params {
Params {
is_shake,
n,
h,
d,
h_prime,
a,
k,
m,
len,
sig_size,
pk_size,
sk_size,
oid,
}
}