use crate::{
Error, Instruction, StatusCode, VersionInfo,
client::{AuthenticationState, Card, CardIoDefault},
io,
std::mem::transmute,
};
impl<'card, IoBackendT, AuthenticationStateT> Card<'card, IoBackendT, AuthenticationStateT>
where
AuthenticationStateT: AuthenticationState,
IoBackendT: io::Backend,
Self: CardIoDefault<IoBackendT>,
{
pub async fn get_version_info(&mut self) -> Result<VersionInfo, Error<IoBackendT::Error>> {
let mut out = [0; 0xff];
let (status_code, response) = self
.default_exchange(&mut out, &[Instruction::GetVersionInfo as u8])
.await?;
if status_code != StatusCode::Ack {
return Err(Error::BadStatusCode(status_code));
}
if response.len() != 28 {
return Err(Error::BadSize);
}
let out: &[u8; 28] = response.try_into().unwrap();
Ok(*unsafe { transmute::<&[u8; 28], &VersionInfo>(out) })
}
}