use sha2::{Digest, Sha256};
pub fn witness_signing_message(tree_size: u64, root_hash: &[u8; 32]) -> Vec<u8> {
let mut msg = Vec::with_capacity(b"ConfiumWitness/v1".len() + 8 + 32);
msg.extend_from_slice(b"ConfiumWitness/v1");
msg.extend_from_slice(&tree_size.to_be_bytes());
msg.extend_from_slice(root_hash);
msg
}
pub fn witness_signing_digest(tree_size: u64, root_hash: &[u8; 32]) -> [u8; 32] {
let mut h = Sha256::new();
h.update(witness_signing_message(tree_size, root_hash));
let digest: [u8; 32] = h.finalize().into();
digest
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn signing_message_has_fixed_shape() {
let root = [0xaa; 32];
let prefix = b"ConfiumWitness/v1";
let msg = witness_signing_message(42, &root);
assert_eq!(msg.len(), prefix.len() + 8 + 32);
assert_eq!(&msg[..prefix.len()], prefix);
assert_eq!(&msg[prefix.len()..prefix.len() + 8], &42u64.to_be_bytes());
assert_eq!(&msg[prefix.len() + 8..], &root);
}
#[test]
fn digest_is_deterministic() {
let root = [0x42; 32];
assert_eq!(
witness_signing_digest(1, &root),
witness_signing_digest(1, &root)
);
}
#[test]
fn different_tree_sizes_produce_different_messages() {
let root = [0x00; 32];
assert_ne!(
witness_signing_message(1, &root),
witness_signing_message(2, &root)
);
}
}