use crate::{
Error, Instruction, KeyCount, KeyId, KeySettings, StatusCode,
client::{AuthenticationState, Card, CardIoDefault},
io,
};
impl<'card, IoBackendT, AuthenticationStateT> Card<'card, IoBackendT, AuthenticationStateT>
where
AuthenticationStateT: AuthenticationState,
IoBackendT: io::Backend,
Self: CardIoDefault<IoBackendT>,
{
pub async fn get_key_settings(
&mut self,
) -> Result<(KeySettings, KeyCount), Error<IoBackendT::Error>> {
let mut out = [0; 0xff];
let (status_code, &[key_settings, num_keys]) = self
.default_exchange(&mut out, &[Instruction::GetKeySettings as u8])
.await?
else {
return Err(Error::BadSize);
};
if status_code != StatusCode::Ack {
return Err(Error::BadStatusCode);
}
Ok((
KeySettings::from_u8(key_settings),
KeyCount::from_u8(num_keys)?,
))
}
pub async fn get_key_version(&mut self, key_id: KeyId) -> Result<u8, Error<IoBackendT::Error>> {
let mut out = [0; 0xff];
let (status_code, &[key_version]) = self
.default_exchange(&mut out, &[Instruction::GetKeyVersion as u8, key_id])
.await?
else {
return Err(Error::BadSize);
};
if status_code != StatusCode::Ack {
return Err(Error::BadStatusCode);
}
Ok(key_version)
}
}