use crate::{
algorithm::ED25519_ALG_ID,
error::{Error, ErrorKind},
};
use anomaly::fail;
use core::convert::TryFrom;
pub const ED25519_SIGNATURE_SIZE: usize = 64;
pub struct Ed25519Signature(pub [u8; ED25519_SIGNATURE_SIZE]);
impl TryFrom<&[u8]> for Ed25519Signature {
type Error = Error;
fn try_from(slice: &[u8]) -> Result<Self, Error> {
if slice.len() != ED25519_SIGNATURE_SIZE {
fail!(
ErrorKind::ParseError,
"bad Ed25519 signature length: {} (expected {})",
slice.len(),
ED25519_SIGNATURE_SIZE
);
}
let mut sig_bytes = [0u8; ED25519_SIGNATURE_SIZE];
sig_bytes.copy_from_slice(slice);
Ok(Ed25519Signature(sig_bytes))
}
}
impl AsRef<[u8]> for Ed25519Signature {
fn as_ref(&self) -> &[u8] {
&self.0[..]
}
}
impl_encodable_signature!(Ed25519Signature, ED25519_ALG_ID);