use super::*;
pub const SIGNATURE_VERSION1: u8 = b'\x01';
pub const SIGNATURE_SIZE: usize = ed::SIGNATURE_LENGTH + VERSION_SIZE;
#[derive(Copy, Clone, Eq, PartialEq)]
pub struct EdSignature(ed::Signature);
impl EdSignature {
pub fn to_bytes(&self) -> Vec<u8> {
let mut res = Vec::with_capacity(SIGNATURE_SIZE);
res.push(SIGNATURE_VERSION1);
res.extend_from_slice(&self.0.to_bytes()[..]);
res
}
pub fn from_bytes<D: AsRef<[u8]>>(bytes: D) -> Result<Self> {
let bytes = bytes.as_ref();
ensure!(bytes.len() == SIGNATURE_SIZE, "Signature length is not {}", SIGNATURE_SIZE);
ensure!(
bytes[0] == SIGNATURE_VERSION1,
"Only identifier version {:x} is supported",
SIGNATURE_VERSION1
);
let sig = ed::Signature::from_bytes(&bytes[VERSION_SIZE..])?;
Ok(Self(sig))
}
}
impl From<ed::Signature> for EdSignature {
fn from(sig: ed::Signature) -> Self {
Self(sig)
}
}
impl<'a> From<&'a EdSignature> for &'a ed::Signature {
fn from(sig: &'a EdSignature) -> Self {
&sig.0
}
}