use crate::{
Error, Instruction, KeyCount, KeyId, Permissions, 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<(Permissions, KeyCount), Error<IoBackendT::Error>> {
let (status_code, &[key_settings, num_keys]) = self
.default_exchange_de_minimis(&[Instruction::GetKeySettings as u8])
.await?
else {
return Err(Error::BadSize);
};
#[cfg(feature = "tracing")]
tracing::debug!(
method = "get_key_settings",
status_code = format!("{:?}", status_code)
);
if status_code != StatusCode::Ack {
return Err(Error::BadStatusCode(status_code));
}
Ok((
Permissions::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 (status_code, &[key_version]) = self
.default_exchange_de_minimis(&[Instruction::GetKeyVersion as u8, key_id])
.await?
else {
return Err(Error::BadSize);
};
#[cfg(feature = "tracing")]
tracing::debug!(
method = "get_key_version",
status_code = format!("{:?}", status_code)
);
if status_code != StatusCode::Ack {
return Err(Error::BadStatusCode(status_code));
}
Ok(key_version)
}
}