use crate::error::Error;
use alloc::vec::Vec;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CCrypt {
pub cuid: [u8; 8],
pub rnd_b: [u8; 8],
pub client_cryptogram: [u8; 16],
}
impl CCrypt {
pub fn encode(&self) -> Result<Vec<u8>, Error> {
let mut out = Vec::with_capacity(32);
out.extend_from_slice(&self.cuid);
out.extend_from_slice(&self.rnd_b);
out.extend_from_slice(&self.client_cryptogram);
Ok(out)
}
pub fn decode(data: &[u8]) -> Result<Self, Error> {
if data.len() != 32 {
return Err(Error::MalformedPayload {
code: 0x76,
reason: "CCRYPT requires 32 bytes",
});
}
let mut cuid = [0u8; 8];
cuid.copy_from_slice(&data[..8]);
let mut rnd_b = [0u8; 8];
rnd_b.copy_from_slice(&data[8..16]);
let mut client_cryptogram = [0u8; 16];
client_cryptogram.copy_from_slice(&data[16..32]);
Ok(Self {
cuid,
rnd_b,
client_cryptogram,
})
}
}