use crate::error::Error;
use alloc::vec::Vec;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PivData {
pub object_id: [u8; 3],
pub element_id: u8,
pub offset: u16,
pub data: Vec<u8>,
}
impl PivData {
pub fn encode(&self) -> Result<Vec<u8>, Error> {
let mut out = Vec::with_capacity(6 + self.data.len());
out.extend_from_slice(&self.object_id);
out.push(self.element_id);
out.extend_from_slice(&self.offset.to_le_bytes());
out.extend_from_slice(&self.data);
Ok(out)
}
pub fn decode(data: &[u8]) -> Result<Self, Error> {
if data.len() < 6 {
return Err(Error::MalformedPayload {
code: 0xA3,
reason: "PIVDATA requires at least 6 bytes",
});
}
let mut object_id = [0u8; 3];
object_id.copy_from_slice(&data[..3]);
Ok(Self {
object_id,
element_id: data[3],
offset: u16::from_le_bytes([data[4], data[5]]),
data: data[6..].to_vec(),
})
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GenAuth {
pub algorithm: u8,
pub key_ref: u8,
pub auth_template: Vec<u8>,
}
impl GenAuth {
pub fn encode(&self) -> Result<Vec<u8>, Error> {
let mut out = Vec::with_capacity(2 + self.auth_template.len());
out.push(self.algorithm);
out.push(self.key_ref);
out.extend_from_slice(&self.auth_template);
Ok(out)
}
pub fn decode(data: &[u8]) -> Result<Self, Error> {
if data.len() < 2 {
return Err(Error::MalformedPayload {
code: 0xA4,
reason: "GENAUTH requires at least 2 bytes",
});
}
Ok(Self {
algorithm: data[0],
key_ref: data[1],
auth_template: data[2..].to_vec(),
})
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CrAuth {
pub challenge: Vec<u8>,
}
impl CrAuth {
pub fn encode(&self) -> Result<Vec<u8>, Error> {
Ok(self.challenge.clone())
}
pub fn decode(data: &[u8]) -> Result<Self, Error> {
Ok(Self {
challenge: data.to_vec(),
})
}
}