use std::array::TryFromSliceError;
use super::ResponseStatusWords;
#[derive(Debug)]
pub struct RegisterRequest {
pub challenge: [u8; 32],
pub application: [u8; 32],
}
impl TryFrom<&[u8]> for RegisterRequest {
type Error = TryFromSliceError;
fn try_from(data: &[u8]) -> Result<Self, Self::Error> {
Ok(Self {
challenge: data[..32].try_into()?,
application: data[32..].try_into()?,
})
}
}
pub struct RegisterResponse {
pub public_key: PublicKey,
pub key_handle: Vec<u8>,
pub attestation_certificate: Vec<u8>,
pub signature: Vec<u8>,
}
#[derive(Clone, Copy)]
pub struct PublicKey {
pub x: [u8; 32],
pub y: [u8; 32],
}
impl RegisterResponse {
#[expect(clippy::as_conversions)]
pub fn encode(self) -> Vec<u8> {
[0x05] .into_iter()
.chain(self.public_key.encode())
.chain([self.key_handle.len() as u8])
.chain(self.key_handle)
.chain(self.attestation_certificate)
.chain(self.signature)
.chain(ResponseStatusWords::NoError.as_primitive().to_be_bytes()) .collect()
}
}
impl PublicKey {
pub fn encode(self) -> impl Iterator<Item = u8> {
[0x04].into_iter().chain(self.x).chain(self.y)
}
}