pub use signature::SignatureEncoding;
use generic_array::GenericArray;
use super::ParameterSet;
use super::utils::typenum::Unsigned;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Signature<P: ParameterSet> {
pub(super) sig: GenericArray<u8, <P as crate::SignatureLen>::LEN>,
}
impl<P: ParameterSet> signature::SignatureEncoding for Signature<P> {
type Repr = GenericArray<u8, <P as crate::SignatureLen>::LEN>;
}
impl<P: ParameterSet> TryFrom<&[u8]> for Signature<P> {
type Error = signature::Error;
fn try_from(bytes: &[u8]) -> Result<Self, Self::Error> {
if bytes.len() != <<P as crate::SignatureLen>::LEN>::USIZE {
return Err(signature::Error::default());
}
let arr = GenericArray::from_slice(bytes).clone();
Ok(Signature { sig: arr })
}
}
impl<P: ParameterSet> From<Signature<P>> for GenericArray<u8, <P as crate::SignatureLen>::LEN> {
fn from(sig: Signature<P>) -> Self {
sig.sig
}
}
impl<P: ParameterSet> AsRef<[u8]> for Signature<P> {
fn as_ref(&self) -> &[u8] {
self.sig.as_ref()
}
}
pub(crate) fn prepare_domain_separation_prefix<P: ParameterSet>(
context: &[u8],
) -> Result<Vec<u8>, signature::Error> {
use crate::ffi;
let mut prefix = [0u8; ffi::MLD_DOMAIN_SEPARATION_MAX_BYTES as usize];
let ret = unsafe {
P::PREPARE_DOMAIN_SEPARATION_PREFIX_FN(
prefix.as_mut_ptr(),
std::ptr::null(),
0,
context.as_ptr(),
context.len(),
ffi::MLD_PREHASH_NONE as ffi::c_int,
)
};
match ret {
0 => Err(signature::Error::default()),
len => Ok(Vec::from(&prefix[0..len])),
}
}