use ts_keys::DiscoPublicKey;
use zerocopy::TryFromBytes;
use crate::Error;
#[derive(
Debug,
Copy,
Clone,
PartialEq,
Eq,
Hash,
zerocopy::Immutable,
zerocopy::KnownLayout,
zerocopy::FromBytes,
zerocopy::IntoBytes,
zerocopy::Unaligned,
)]
#[repr(C, packed)]
pub struct Header {
magic: [u8; Header::MAGIC.len()],
pub(crate) sender_pub: DiscoPublicKey,
pub(crate) nonce: [u8; Header::NONCE_LEN],
}
impl Header {
pub const MAGIC: [u8; 6] = *b"TS\xf0\x9f\x92\xac";
pub const NONCE_LEN: usize = 24;
pub const fn new(sender_pub: DiscoPublicKey, nonce: [u8; 24]) -> Self {
Self {
magic: Self::MAGIC,
sender_pub,
nonce,
}
}
pub fn from_bytes(buf: &[u8]) -> Result<(&Self, &[u8]), Error> {
let (slf, rest) = Self::try_ref_from_prefix(buf)?;
slf.validate()?;
Ok((slf, rest))
}
pub const fn is_valid(&self) -> bool {
matches!(self.magic, Self::MAGIC)
}
pub const fn validate(&self) -> Result<(), Error> {
if !self.is_valid() {
return Err(Error::WrongMagic);
}
Ok(())
}
}