diff --git a/crates/ctap2-proto/src/authenticator/credential/management.rs b/crates/ctap2-proto/src/authenticator/credential/management.rs index 8ef9428..1ba62aa 100644 --- a/crates/ctap2-proto/src/authenticator/credential/management.rs +++ b/crates/ctap2-proto/src/authenticator/credential/management.rs @@ -3,6 +3,9 @@ use fido_common::credential::public_key; pub type PinUvAuthParam = [u8; 16]; +#[cfg(feature = "serde")] +mod raw; + #[derive(Clone, Copy)] pub enum Request<'a> { GetCredentialsMetadata { @@ -106,3 +109,17 @@ pub enum Error { NoCredentials, KeyStoreFull, } + +impl Display for Error { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let message = match self { + Error::PinUvAuthTokenRequired => "PIN/UV auth token required", + Error::MissingParameter => "Missing parameter", + Error::InvalidParameter => "Invalid parameter", + Error::PinAuthInvalid => "PIN auth invalid", + Error::NoCredentials => "No credentials", + Error::KeyStoreFull => "Key store full", + }; + write!(f, "{}", message) + } +} diff --git a/crates/ctap2-proto/src/authenticator/credential/management/raw.rs b/crates/ctap2-proto/src/authenticator/credential/management/raw.rs new file mode 100644 index 0000000..4182b91 --- /dev/null +++ b/crates/ctap2-proto/src/authenticator/credential/management/raw.rs @@ -0,0 +1,37 @@ +use super::Error; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, Serialize, Deserialize)] +#[serde(into = "u8", try_from = "u8")] +enum RawSubcommand { + GetCredsMetadata = 0x01, + EnumerateRpsBegin = 0x02, + EnumerateRpsGetNextRp = 0x03, + EnumerateCredentialsBegin = 0x04, + EnumerateCredentialsGetNextCredential = 0x05, + DeleteCredential = 0x06, + UpdateUserInformation = 0x07, +} + +impl From for u8 { + fn from(val: RawSubcommand) -> Self { + val as u8 + } +} + +impl TryFrom for RawSubcommand { + type Error = Error; + + fn try_from(value: u8) -> Result { + Ok(match value { + 0x01 => RawSubcommand::GetCredsMetadata, + 0x02 => RawSubcommand::EnumerateRpsBegin, + 0x03 => RawSubcommand::EnumerateRpsGetNextRp, + 0x04 => RawSubcommand::EnumerateCredentialsBegin, + 0x05 => RawSubcommand::EnumerateCredentialsGetNextCredential, + 0x06 => RawSubcommand::DeleteCredential, + 0x07 => RawSubcommand::UpdateUserInformation, + _ => return Err(Error::InvalidParameter), + }) + } +}