use openssl::pkey::PKey;
use crate::{Error, internal};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SignedTreeHead {
pub tree_size: u64,
pub timestamp: u64,
pub root_hash: [u8; 32],
pub signature: Vec<u8>
}
impl SignedTreeHead {
pub fn verify(&self, pub_key: &PKey<openssl::pkey::Public>) -> Result<(), Error> {
let mut verify_body: Vec<u8> = Vec::new();
verify_body.push(0); verify_body.push(1); verify_body.extend_from_slice(&self.timestamp.to_be_bytes()); verify_body.extend_from_slice(&self.tree_size.to_be_bytes()); verify_body.extend_from_slice(&self.root_hash);
internal::verify_dss(&self.signature, pub_key, &verify_body).map_err(|e| {
match e {
Error::InvalidSignature(desc) => Error::InvalidSignature(format!("When checking STH signature: {}", &desc)),
other => other
}
})
}
}