#[derive(Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
pub(crate) enum AdrsType {
Ots = 0,
Ltree = 1,
HashTree = 2,
}
#[derive(Clone, Copy)]
pub(crate) struct Adrs {
words: [u32; 8],
}
impl Adrs {
pub(crate) fn new() -> Self {
Adrs { words: [0; 8] }
}
pub(crate) fn to_bytes(self) -> [u8; 32] {
let mut out = [0u8; 32];
for (i, w) in self.words.iter().enumerate() {
out[i * 4..i * 4 + 4].copy_from_slice(&w.to_be_bytes());
}
out
}
pub(crate) fn set_layer(&mut self, layer: u32) {
self.words[0] = layer;
}
pub(crate) fn set_tree(&mut self, tree: u64) {
self.words[1] = (tree >> 32) as u32;
self.words[2] = tree as u32;
}
pub(crate) fn set_type(&mut self, ty: AdrsType) {
self.words[3] = ty as u32;
self.words[4] = 0;
self.words[5] = 0;
self.words[6] = 0;
self.words[7] = 0;
}
pub(crate) fn copy_subtree(&mut self, src: &Adrs) {
self.words[0] = src.words[0];
self.words[1] = src.words[1];
self.words[2] = src.words[2];
}
pub(crate) fn set_ots(&mut self, ots: u32) {
self.words[4] = ots;
}
pub(crate) fn set_chain(&mut self, chain: u32) {
self.words[5] = chain;
}
pub(crate) fn set_hash(&mut self, hash: u32) {
self.words[6] = hash;
}
pub(crate) fn set_ltree(&mut self, ltree: u32) {
self.words[4] = ltree;
}
pub(crate) fn set_tree_height(&mut self, height: u32) {
self.words[5] = height;
}
pub(crate) fn set_tree_index(&mut self, index: u32) {
self.words[6] = index;
}
pub(crate) fn set_key_and_mask(&mut self, k: u32) {
self.words[7] = k;
}
}