2024-01-13 22:45:33 +00:00
|
|
|
use generic_array::{ArrayLength, GenericArray};
|
2024-01-12 23:22:21 +00:00
|
|
|
use zeroize::{Zeroize, ZeroizeOnDrop};
|
|
|
|
|
|
2024-02-09 22:31:05 +00:00
|
|
|
|
2024-01-13 22:45:33 +00:00
|
|
|
/// Fig 16 on page 34
|
2024-01-25 02:42:54 +00:00
|
|
|
#[derive(Clone, Debug, Default, Zeroize, ZeroizeOnDrop)]
|
2024-02-09 22:31:05 +00:00
|
|
|
pub(crate) struct SlhDsaSig<
|
2024-01-16 02:08:41 +00:00
|
|
|
A: ArrayLength,
|
|
|
|
|
D: ArrayLength,
|
|
|
|
|
HP: ArrayLength,
|
|
|
|
|
K: ArrayLength,
|
|
|
|
|
LEN: ArrayLength,
|
|
|
|
|
N: ArrayLength,
|
|
|
|
|
> {
|
2024-01-17 01:00:05 +00:00
|
|
|
pub(crate) randomness: GenericArray<u8, N>,
|
|
|
|
|
pub(crate) fors_sig: ForsSig<A, K, N>,
|
|
|
|
|
pub(crate) ht_sig: HtSig<D, HP, LEN, N>,
|
2024-01-13 22:45:33 +00:00
|
|
|
}
|
|
|
|
|
|
2024-01-26 02:55:05 +00:00
|
|
|
|
2024-01-17 01:00:05 +00:00
|
|
|
#[derive(Clone, Default, Zeroize, ZeroizeOnDrop)]
|
|
|
|
|
pub struct SlhPublicKey<N: ArrayLength> {
|
|
|
|
|
pub(crate) pk_seed: GenericArray<u8, N>,
|
|
|
|
|
pub(crate) pk_root: GenericArray<u8, N>,
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-09 21:28:59 +00:00
|
|
|
|
|
|
|
|
#[derive(Clone, Debug, Default, Zeroize, ZeroizeOnDrop)]
|
2024-01-17 01:00:05 +00:00
|
|
|
pub struct SlhPrivateKey<N: ArrayLength> {
|
|
|
|
|
pub(crate) sk_seed: GenericArray<u8, N>,
|
|
|
|
|
pub(crate) sk_prf: GenericArray<u8, N>,
|
|
|
|
|
pub(crate) pk_seed: GenericArray<u8, N>,
|
|
|
|
|
pub(crate) pk_root: GenericArray<u8, N>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-01-13 22:45:33 +00:00
|
|
|
/// Fig 13 on page 29
|
2024-01-25 02:42:54 +00:00
|
|
|
#[derive(Clone, Debug, Default, Zeroize, ZeroizeOnDrop)]
|
2024-01-13 22:45:33 +00:00
|
|
|
pub(crate) struct ForsSig<A: ArrayLength, K: ArrayLength, N: ArrayLength> {
|
2024-01-17 01:00:05 +00:00
|
|
|
pub(crate) private_key_value: GenericArray<GenericArray<u8, N>, K>,
|
|
|
|
|
pub(crate) auth: GenericArray<Auth<A, N>, K>,
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-09 22:31:05 +00:00
|
|
|
|
2024-01-17 01:00:05 +00:00
|
|
|
#[derive(Clone, Default, Zeroize, ZeroizeOnDrop)]
|
|
|
|
|
pub(crate) struct ForsPk<N: ArrayLength> {
|
|
|
|
|
pub(crate) key: GenericArray<u8, N>,
|
2024-01-13 22:45:33 +00:00
|
|
|
}
|
|
|
|
|
|
2024-02-09 22:31:05 +00:00
|
|
|
|
2024-01-13 22:45:33 +00:00
|
|
|
/// Fig 10?
|
2024-01-25 02:42:54 +00:00
|
|
|
#[derive(Clone, Debug, Default, Zeroize, ZeroizeOnDrop)]
|
2024-01-13 22:45:33 +00:00
|
|
|
pub(crate) struct Auth<A: ArrayLength, N: ArrayLength> {
|
2024-01-17 01:00:05 +00:00
|
|
|
pub(crate) tree: GenericArray<GenericArray<u8, N>, A>,
|
2024-01-13 22:45:33 +00:00
|
|
|
}
|
|
|
|
|
|
2024-02-09 22:31:05 +00:00
|
|
|
|
2024-01-25 02:42:54 +00:00
|
|
|
#[derive(Clone, Debug, Default, Zeroize, ZeroizeOnDrop)]
|
2024-01-16 02:08:41 +00:00
|
|
|
pub(crate) struct HtSig<D: ArrayLength, HP: ArrayLength, LEN: ArrayLength, N: ArrayLength> {
|
|
|
|
|
pub(crate) xmss_sigs: GenericArray<XmssSig<HP, LEN, N>, D>,
|
2024-01-13 22:45:33 +00:00
|
|
|
}
|
|
|
|
|
|
2024-02-09 22:31:05 +00:00
|
|
|
|
2024-01-25 02:42:54 +00:00
|
|
|
#[derive(Clone, Debug, Default, Zeroize, ZeroizeOnDrop)]
|
2024-01-14 21:37:30 +00:00
|
|
|
pub struct WotsSig<LEN: ArrayLength, N: ArrayLength> {
|
2024-01-13 23:10:25 +00:00
|
|
|
pub(crate) data: GenericArray<GenericArray<u8, N>, LEN>,
|
2024-01-13 22:45:33 +00:00
|
|
|
}
|
|
|
|
|
|
2024-02-09 22:31:05 +00:00
|
|
|
|
2024-01-14 21:37:30 +00:00
|
|
|
#[derive(Clone, Default, Zeroize, ZeroizeOnDrop)]
|
|
|
|
|
pub struct WotsPk<N: ArrayLength>(pub(crate) GenericArray<u8, N>);
|
|
|
|
|
|
2024-01-13 22:45:33 +00:00
|
|
|
|
2024-01-25 02:42:54 +00:00
|
|
|
#[derive(Clone, Debug, Default, Zeroize, ZeroizeOnDrop)]
|
2024-01-16 02:08:41 +00:00
|
|
|
pub struct XmssSig<HP: ArrayLength, LEN: ArrayLength, N: ArrayLength> {
|
|
|
|
|
pub(crate) sig_wots: WotsSig<LEN, N>,
|
|
|
|
|
pub(crate) auth: GenericArray<GenericArray<u8, N>, HP>,
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-09 22:31:05 +00:00
|
|
|
|
2024-01-16 02:08:41 +00:00
|
|
|
impl<HP: ArrayLength, LEN: ArrayLength, N: ArrayLength> XmssSig<HP, LEN, N> {
|
|
|
|
|
pub(crate) fn get_wots_sig(&self) -> &WotsSig<LEN, N> { &self.sig_wots }
|
|
|
|
|
|
|
|
|
|
pub(crate) fn get_xmss_auth(&self) -> &GenericArray<GenericArray<u8, N>, HP> { &self.auth }
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-09 22:31:05 +00:00
|
|
|
|
2024-01-14 21:37:30 +00:00
|
|
|
pub(crate) const WOTS_HASH: u32 = 0;
|
2024-01-12 23:22:21 +00:00
|
|
|
pub(crate) const WOTS_PK: u32 = 1;
|
2024-01-14 21:37:30 +00:00
|
|
|
pub(crate) const TREE: u32 = 2;
|
2024-01-17 01:00:05 +00:00
|
|
|
pub(crate) const FORS_TREE: u32 = 3;
|
|
|
|
|
pub(crate) const FORS_ROOTS: u32 = 4;
|
2024-01-12 23:22:21 +00:00
|
|
|
pub(crate) const WOTS_PRF: u32 = 5;
|
2024-01-17 01:00:05 +00:00
|
|
|
pub(crate) const FORS_PRF: u32 = 6;
|
2024-01-12 23:22:21 +00:00
|
|
|
|
2024-02-09 22:31:05 +00:00
|
|
|
|
2024-01-12 23:22:21 +00:00
|
|
|
/// Straddling the line between struct, enum and union...
|
|
|
|
|
#[derive(Clone, Default, Zeroize, ZeroizeOnDrop)]
|
|
|
|
|
#[repr(align(32))]
|
2024-02-09 22:31:05 +00:00
|
|
|
pub(crate) struct Adrs {
|
|
|
|
|
pub(crate) f0: [u8; 4],
|
|
|
|
|
// layer address
|
|
|
|
|
pub(crate) f1: [u8; 4],
|
|
|
|
|
// tree address
|
|
|
|
|
pub(crate) f2: [u8; 4],
|
|
|
|
|
// tree address
|
|
|
|
|
pub(crate) f3: [u8; 4],
|
|
|
|
|
// tree address
|
|
|
|
|
pub(crate) f4: [u8; 4],
|
|
|
|
|
// type
|
|
|
|
|
pub(crate) f5: [u8; 4],
|
|
|
|
|
// key pair address OR padding
|
|
|
|
|
pub(crate) f6: [u8; 4],
|
|
|
|
|
// chain address OR padding OR tree height
|
|
|
|
|
pub(crate) f7: [u8; 4], // hash address OR padding OR tree index OR hash address = 0
|
2024-01-12 23:22:21 +00:00
|
|
|
}
|