fips205-source/src/types.rs

112 lines
3.7 KiB
Rust
Raw Normal View History

2024-01-12 23:22:21 +00:00
use alloc::vec::Vec;
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-01-13 22:45:33 +00:00
/// Fig 16 on page 34
#[derive(Clone, Default, Zeroize, ZeroizeOnDrop)]
2024-01-16 02:08:41 +00:00
pub struct SlhDsaSig<
A: ArrayLength,
D: ArrayLength,
HP: ArrayLength,
K: ArrayLength,
LEN: ArrayLength,
N: ArrayLength,
> {
2024-01-13 22:45:33 +00:00
randomness: GenericArray<u8, N>,
fors_sig: ForsSig<A, K, N>,
2024-01-16 02:08:41 +00:00
ht_sig: HtSig<D, HP, LEN, N>,
2024-01-13 22:45:33 +00:00
}
/// Fig 13 on page 29
#[derive(Clone, Default, Zeroize, ZeroizeOnDrop)]
pub(crate) struct ForsSig<A: ArrayLength, K: ArrayLength, N: ArrayLength> {
private_key_value: GenericArray<GenericArray<u8, N>, K>,
auth: GenericArray<Auth<A, N>, K>,
}
/// Fig 10?
#[derive(Clone, Default, Zeroize, ZeroizeOnDrop)]
pub(crate) struct Auth<A: ArrayLength, N: ArrayLength> {
2024-01-13 23:10:25 +00:00
tree: GenericArray<GenericArray<u8, N>, A>,
2024-01-13 22:45:33 +00:00
}
#[derive(Clone, 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
}
#[derive(Clone, 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-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-16 02:08:41 +00:00
#[derive(Clone, Default, Zeroize, ZeroizeOnDrop)]
pub struct XmssSig<HP: ArrayLength, LEN: ArrayLength, N: ArrayLength> {
pub(crate) sig_wots: WotsSig<LEN, N>,
pub(crate) auth: GenericArray<GenericArray<u8, N>, HP>,
}
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-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-12 23:22:21 +00:00
const FORS_TREE: u32 = 3;
const FORS_ROOTS: u32 = 4;
pub(crate) const WOTS_PRF: u32 = 5;
const FORS_PRF: u32 = 6;
/// Straddling the line between struct, enum and union...
#[derive(Clone, Default, Zeroize, ZeroizeOnDrop)]
#[repr(align(32))]
2024-01-13 23:10:25 +00:00
pub struct Adrs {
2024-01-12 23:22:21 +00:00
f0: [u8; 4], // layer address
f1: [u8; 4], // tree address (LSB?)
f2: [u8; 4], // tree address
f3: [u8; 4], // tree address (MSB)
f4: [u8; 4], // type
f5: [u8; 4], // key pair address OR padding
f6: [u8; 4], // chain address OR padding OR tree height
2024-01-14 21:37:30 +00:00
f7: [u8; 4], // hash address OR padding OR tree index OR hash address = 0
2024-01-12 23:22:21 +00:00
}
2024-01-13 23:10:25 +00:00
impl Adrs {
2024-01-16 02:08:41 +00:00
pub(crate) fn set_layer_address(&mut self, la: u32) { self.f0 = la.to_be_bytes() }
2024-01-12 23:22:21 +00:00
2024-01-16 02:08:41 +00:00
pub(crate) fn get_key_pair_address(&self) -> u32 { u32::from_be_bytes(self.f5) }
pub(crate) fn set_key_pair_address(&mut self, kp_addr: u32) { self.f5 = kp_addr.to_be_bytes(); }
2024-01-12 23:22:21 +00:00
2024-01-13 23:10:25 +00:00
#[allow(clippy::cast_possible_truncation)]
2024-01-16 02:08:41 +00:00
pub(crate) fn set_chain_address(&mut self, i: u32) { self.f6 = i.to_be_bytes(); }
2024-01-12 23:22:21 +00:00
pub(crate) fn set_type_and_clear(&mut self, type_t: u32) {
self.f4 = type_t.to_be_bytes();
self.f5 = 0u32.to_be_bytes();
self.f6 = 0u32.to_be_bytes();
self.f7 = 0u32.to_be_bytes();
}
2024-01-16 02:08:41 +00:00
pub(crate) fn set_tree_address(&mut self, t: u32) { self.f1 = t.to_be_bytes() }
// TODO: revisit 16 bytes
2024-01-14 21:37:30 +00:00
pub(crate) fn set_hash_address(&mut self, addr: u32) { self.f7 = addr.to_be_bytes() }
2024-01-12 23:22:21 +00:00
2024-01-14 21:37:30 +00:00
pub(crate) fn set_tree_height(&mut self, z: u32) { self.f6 = z.to_be_bytes() }
2024-01-16 02:08:41 +00:00
pub(crate) fn get_tree_index(&mut self) -> u32 { u32::from_be_bytes(self.f7) }
2024-01-14 21:37:30 +00:00
pub(crate) fn set_tree_index(&mut self, i: u32) { self.f7 = i.to_be_bytes() }
pub(crate) fn to_bytes(&self) -> Vec<u8> { [self.f0, self.f1, self.f2, self.f3].concat() }
2024-01-12 23:22:21 +00:00
}