pub const WOTS_HASH: u32 = 0;
pub const WOTS_PK: u32 = 1;
pub const TREE: u32 = 2;
pub const FORS_TREE: u32 = 3;
pub const FORS_ROOTS: u32 = 4;
pub const WOTS_PRF: u32 = 5;
pub const FORS_PRF: u32 = 6;
#[derive(Clone, Debug)]
pub struct Adrs {
data: [u8; 32],
}
impl Adrs {
pub fn new() -> Self {
Self { data: [0u8; 32] }
}
pub fn as_bytes(&self) -> &[u8; 32] {
&self.data
}
fn get_word(&self, offset: usize) -> u32 {
u32::from_be_bytes([
self.data[offset],
self.data[offset + 1],
self.data[offset + 2],
self.data[offset + 3],
])
}
fn set_word(&mut self, offset: usize, val: u32) {
let bytes = val.to_be_bytes();
self.data[offset..offset + 4].copy_from_slice(&bytes);
}
pub fn get_layer_address(&self) -> u32 {
self.get_word(0)
}
pub fn set_layer_address(&mut self, val: u32) {
self.set_word(0, val);
}
pub fn set_tree_address(&mut self, val: u64) {
self.set_word(4, 0);
self.set_word(8, (val >> 32) as u32);
self.set_word(12, val as u32);
}
pub fn get_tree_address(&self) -> u64 {
let hi = self.get_word(8) as u64;
let lo = self.get_word(12) as u64;
(hi << 32) | lo
}
pub fn set_type_and_clear(&mut self, addr_type: u32) {
self.set_word(16, addr_type);
for i in 20..32 {
self.data[i] = 0;
}
}
pub fn get_type(&self) -> u32 {
self.get_word(16)
}
pub fn get_key_pair_address(&self) -> u32 {
self.get_word(20)
}
pub fn set_key_pair_address(&mut self, val: u32) {
self.set_word(20, val);
}
pub fn get_chain_address(&self) -> u32 {
self.get_word(24)
}
pub fn set_chain_address(&mut self, val: u32) {
self.set_word(24, val);
}
pub fn get_hash_address(&self) -> u32 {
self.get_word(28)
}
pub fn set_hash_address(&mut self, val: u32) {
self.set_word(28, val);
}
pub fn get_tree_height(&self) -> u32 {
self.get_word(24)
}
pub fn set_tree_height(&mut self, val: u32) {
self.set_word(24, val);
}
pub fn get_tree_index(&self) -> u32 {
self.get_word(28)
}
pub fn set_tree_index(&mut self, val: u32) {
self.set_word(28, val);
}
}