use generic_array::{ArrayLength, GenericArray}; use zeroize::{Zeroize, ZeroizeOnDrop}; /// Fig 16 on page 34 #[derive(Clone, Debug, Default, Zeroize, ZeroizeOnDrop)] pub(crate) struct SlhDsaSig< A: ArrayLength, D: ArrayLength, HP: ArrayLength, K: ArrayLength, LEN: ArrayLength, N: ArrayLength, > { pub(crate) randomness: GenericArray, pub(crate) fors_sig: ForsSig, pub(crate) ht_sig: HtSig, } #[derive(Clone, Default, Zeroize, ZeroizeOnDrop)] pub struct SlhPublicKey { pub(crate) pk_seed: GenericArray, pub(crate) pk_root: GenericArray, } #[derive(Clone, Debug, Default, Zeroize, ZeroizeOnDrop)] pub struct SlhPrivateKey { pub(crate) sk_seed: GenericArray, pub(crate) sk_prf: GenericArray, pub(crate) pk_seed: GenericArray, pub(crate) pk_root: GenericArray, } /// Fig 13 on page 29 #[derive(Clone, Debug, Default, Zeroize, ZeroizeOnDrop)] pub(crate) struct ForsSig { pub(crate) private_key_value: GenericArray, K>, pub(crate) auth: GenericArray, K>, } #[derive(Clone, Default, Zeroize, ZeroizeOnDrop)] pub(crate) struct ForsPk { pub(crate) key: GenericArray, } /// Fig 10? #[derive(Clone, Debug, Default, Zeroize, ZeroizeOnDrop)] pub(crate) struct Auth { pub(crate) tree: GenericArray, A>, } #[derive(Clone, Debug, Default, Zeroize, ZeroizeOnDrop)] pub(crate) struct HtSig { pub(crate) xmss_sigs: GenericArray, D>, } #[derive(Clone, Debug, Default, Zeroize, ZeroizeOnDrop)] pub struct WotsSig { pub(crate) data: GenericArray, LEN>, } #[derive(Clone, Default, Zeroize, ZeroizeOnDrop)] pub struct WotsPk(pub(crate) GenericArray); #[derive(Clone, Debug, Default, Zeroize, ZeroizeOnDrop)] pub struct XmssSig { pub(crate) sig_wots: WotsSig, pub(crate) auth: GenericArray, HP>, } impl XmssSig { pub(crate) fn get_wots_sig(&self) -> &WotsSig { &self.sig_wots } pub(crate) fn get_xmss_auth(&self) -> &GenericArray, HP> { &self.auth } } pub(crate) const WOTS_HASH: u32 = 0; pub(crate) const WOTS_PK: u32 = 1; pub(crate) const TREE: u32 = 2; pub(crate) const FORS_TREE: u32 = 3; pub(crate) const FORS_ROOTS: u32 = 4; pub(crate) const WOTS_PRF: u32 = 5; pub(crate) const FORS_PRF: u32 = 6; /// Straddling the line between struct, enum and union... #[derive(Clone, Default, Zeroize, ZeroizeOnDrop)] #[repr(align(32))] 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 }