new error codes and enum cleanups

This commit is contained in:
Fabian Kaczmarczyck
2020-06-18 15:58:12 +02:00
parent 33b2c76f4b
commit a4becf9aca
2 changed files with 41 additions and 36 deletions

View File

@@ -176,11 +176,12 @@ pub enum AuthenticatorTransport {
impl From<AuthenticatorTransport> for cbor::Value { impl From<AuthenticatorTransport> for cbor::Value {
fn from(transport: AuthenticatorTransport) -> Self { fn from(transport: AuthenticatorTransport) -> Self {
use AuthenticatorTransport::*;
match transport { match transport {
AuthenticatorTransport::Usb => "usb", Usb => "usb",
AuthenticatorTransport::Nfc => "nfc", Nfc => "nfc",
AuthenticatorTransport::Ble => "ble", Ble => "ble",
AuthenticatorTransport::Internal => "internal", Internal => "internal",
} }
.into() .into()
} }
@@ -190,12 +191,13 @@ impl TryFrom<cbor::Value> for AuthenticatorTransport {
type Error = Ctap2StatusCode; type Error = Ctap2StatusCode;
fn try_from(cbor_value: cbor::Value) -> Result<Self, Ctap2StatusCode> { fn try_from(cbor_value: cbor::Value) -> Result<Self, Ctap2StatusCode> {
use AuthenticatorTransport::*;
let transport_string = extract_text_string(cbor_value)?; let transport_string = extract_text_string(cbor_value)?;
match &transport_string[..] { match &transport_string[..] {
"usb" => Ok(AuthenticatorTransport::Usb), "usb" => Ok(Usb),
"nfc" => Ok(AuthenticatorTransport::Nfc), "nfc" => Ok(Nfc),
"ble" => Ok(AuthenticatorTransport::Ble), "ble" => Ok(Ble),
"internal" => Ok(AuthenticatorTransport::Internal), "internal" => Ok(Internal),
_ => Err(Ctap2StatusCode::CTAP2_ERR_CBOR_UNEXPECTED_TYPE), _ => Err(Ctap2StatusCode::CTAP2_ERR_CBOR_UNEXPECTED_TYPE),
} }
} }
@@ -469,10 +471,11 @@ impl TryFrom<cbor::Value> for CredentialProtectionPolicy {
type Error = Ctap2StatusCode; type Error = Ctap2StatusCode;
fn try_from(cbor_value: cbor::Value) -> Result<Self, Ctap2StatusCode> { fn try_from(cbor_value: cbor::Value) -> Result<Self, Ctap2StatusCode> {
use CredentialProtectionPolicy::*;
match extract_integer(cbor_value)? { match extract_integer(cbor_value)? {
0x01 => Ok(CredentialProtectionPolicy::UserVerificationOptional), 0x01 => Ok(UserVerificationOptional),
0x02 => Ok(CredentialProtectionPolicy::UserVerificationOptionalWithCredentialIdList), 0x02 => Ok(UserVerificationOptionalWithCredentialIdList),
0x03 => Ok(CredentialProtectionPolicy::UserVerificationRequired), 0x03 => Ok(UserVerificationRequired),
_ => Err(Ctap2StatusCode::CTAP2_ERR_CBOR_UNEXPECTED_TYPE), _ => Err(Ctap2StatusCode::CTAP2_ERR_CBOR_UNEXPECTED_TYPE),
} }
} }
@@ -683,27 +686,18 @@ impl TryFrom<CoseKey> for ecdh::PubKey {
#[cfg_attr(any(test, feature = "debug_ctap"), derive(Debug, PartialEq))] #[cfg_attr(any(test, feature = "debug_ctap"), derive(Debug, PartialEq))]
pub enum ClientPinSubCommand { pub enum ClientPinSubCommand {
GetPinRetries, GetPinRetries = 0x01,
GetKeyAgreement, GetKeyAgreement = 0x02,
SetPin, SetPin = 0x03,
ChangePin, ChangePin = 0x04,
GetPinUvAuthTokenUsingPin, GetPinUvAuthTokenUsingPin = 0x05,
GetPinUvAuthTokenUsingUv, GetPinUvAuthTokenUsingUv = 0x06,
GetUvRetries, GetUvRetries = 0x07,
} }
impl From<ClientPinSubCommand> for cbor::Value { impl From<ClientPinSubCommand> for cbor::Value {
fn from(subcommand: ClientPinSubCommand) -> Self { fn from(subcommand: ClientPinSubCommand) -> Self {
match subcommand { (subcommand as u64).into()
ClientPinSubCommand::GetPinRetries => 0x01,
ClientPinSubCommand::GetKeyAgreement => 0x02,
ClientPinSubCommand::SetPin => 0x03,
ClientPinSubCommand::ChangePin => 0x04,
ClientPinSubCommand::GetPinUvAuthTokenUsingPin => 0x05,
ClientPinSubCommand::GetPinUvAuthTokenUsingUv => 0x06,
ClientPinSubCommand::GetUvRetries => 0x07,
}
.into()
} }
} }
@@ -711,16 +705,19 @@ impl TryFrom<cbor::Value> for ClientPinSubCommand {
type Error = Ctap2StatusCode; type Error = Ctap2StatusCode;
fn try_from(cbor_value: cbor::Value) -> Result<Self, Ctap2StatusCode> { fn try_from(cbor_value: cbor::Value) -> Result<Self, Ctap2StatusCode> {
use ClientPinSubCommand::*;
let subcommand_int = extract_unsigned(cbor_value)?; let subcommand_int = extract_unsigned(cbor_value)?;
match subcommand_int { match subcommand_int {
0x01 => Ok(ClientPinSubCommand::GetPinRetries), 0x01 => Ok(GetPinRetries),
0x02 => Ok(ClientPinSubCommand::GetKeyAgreement), 0x02 => Ok(GetKeyAgreement),
0x03 => Ok(ClientPinSubCommand::SetPin), 0x03 => Ok(SetPin),
0x04 => Ok(ClientPinSubCommand::ChangePin), 0x04 => Ok(ChangePin),
0x05 => Ok(ClientPinSubCommand::GetPinUvAuthTokenUsingPin), 0x05 => Ok(GetPinUvAuthTokenUsingPin),
0x06 => Ok(ClientPinSubCommand::GetPinUvAuthTokenUsingUv), 0x06 => Ok(GetPinUvAuthTokenUsingUv),
0x07 => Ok(ClientPinSubCommand::GetUvRetries), 0x07 => Ok(GetUvRetries),
// TODO(kaczmarczyck) what is the correct status code for this error? #[cfg(feature = "with_ctap2_1")]
_ => Err(Ctap2StatusCode::CTAP2_ERR_INVALID_SUBCOMMAND),
#[cfg(not(feature = "with_ctap2_1"))]
_ => Err(Ctap2StatusCode::CTAP1_ERR_INVALID_PARAMETER), _ => Err(Ctap2StatusCode::CTAP1_ERR_INVALID_PARAMETER),
} }
} }

View File

@@ -32,6 +32,10 @@ pub enum Ctap2StatusCode {
CTAP2_ERR_MISSING_PARAMETER = 0x14, CTAP2_ERR_MISSING_PARAMETER = 0x14,
CTAP2_ERR_LIMIT_EXCEEDED = 0x15, CTAP2_ERR_LIMIT_EXCEEDED = 0x15,
CTAP2_ERR_UNSUPPORTED_EXTENSION = 0x16, CTAP2_ERR_UNSUPPORTED_EXTENSION = 0x16,
#[cfg(feature = "with_ctap2_1")]
CTAP2_ERR_FP_DATABASE_FULL = 0x17,
#[cfg(feature = "with_ctap2_1")]
CTAP2_ERR_PC_STORAGE_FULL = 0x18,
CTAP2_ERR_CREDENTIAL_EXCLUDED = 0x19, CTAP2_ERR_CREDENTIAL_EXCLUDED = 0x19,
CTAP2_ERR_PROCESSING = 0x21, CTAP2_ERR_PROCESSING = 0x21,
CTAP2_ERR_INVALID_CREDENTIAL = 0x22, CTAP2_ERR_INVALID_CREDENTIAL = 0x22,
@@ -60,6 +64,10 @@ pub enum Ctap2StatusCode {
CTAP2_ERR_ACTION_TIMEOUT = 0x3A, CTAP2_ERR_ACTION_TIMEOUT = 0x3A,
CTAP2_ERR_UP_REQUIRED = 0x3B, CTAP2_ERR_UP_REQUIRED = 0x3B,
CTAP2_ERR_UV_BLOCKED = 0x3C, CTAP2_ERR_UV_BLOCKED = 0x3C,
#[cfg(feature = "with_ctap2_1")]
CTAP2_ERR_INTEGRITY_FAILURE = 0x3D,
#[cfg(feature = "with_ctap2_1")]
CTAP2_ERR_INVALID_SUBCOMMAND = 0x3E,
CTAP1_ERR_OTHER = 0x7F, CTAP1_ERR_OTHER = 0x7F,
CTAP2_ERR_SPEC_LAST = 0xDF, CTAP2_ERR_SPEC_LAST = 0xDF,
CTAP2_ERR_EXTENSION_FIRST = 0xE0, CTAP2_ERR_EXTENSION_FIRST = 0xE0,