Merge pull request #245 from kaczmarczyck/new-status-codes
Updates status codes for RD02 of CTAP 2.1
This commit is contained in:
@@ -219,7 +219,7 @@ impl CtapHid {
|
||||
cid,
|
||||
cmd: CtapHid::COMMAND_CBOR,
|
||||
payload: vec![
|
||||
Ctap2StatusCode::CTAP2_ERR_VENDOR_RESPONSE_TOO_LONG as u8,
|
||||
Ctap2StatusCode::CTAP2_ERR_VENDOR_INTERNAL_ERROR as u8,
|
||||
],
|
||||
})
|
||||
.unwrap()
|
||||
|
||||
@@ -371,10 +371,8 @@ where
|
||||
let mut response_vec = vec![0x00];
|
||||
if let Some(value) = response_data.into() {
|
||||
if !cbor::write(value, &mut response_vec) {
|
||||
response_vec = vec![
|
||||
Ctap2StatusCode::CTAP2_ERR_VENDOR_RESPONSE_CANNOT_WRITE_CBOR
|
||||
as u8,
|
||||
];
|
||||
response_vec =
|
||||
vec![Ctap2StatusCode::CTAP2_ERR_VENDOR_INTERNAL_ERROR as u8];
|
||||
}
|
||||
}
|
||||
response_vec
|
||||
@@ -496,7 +494,7 @@ where
|
||||
}
|
||||
None => {
|
||||
if self.persistent_store.pin_hash()?.is_some() {
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_PIN_REQUIRED);
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_PUAT_REQUIRED);
|
||||
}
|
||||
if options.uv {
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_INVALID_OPTION);
|
||||
@@ -542,13 +540,13 @@ where
|
||||
auth_data.extend(&self.persistent_store.aaguid()?);
|
||||
// The length is fixed to 0x20 or 0x70 and fits one byte.
|
||||
if credential_id.len() > 0xFF {
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_VENDOR_RESPONSE_TOO_LONG);
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_VENDOR_INTERNAL_ERROR);
|
||||
}
|
||||
auth_data.extend(vec![0x00, credential_id.len() as u8]);
|
||||
auth_data.extend(&credential_id);
|
||||
let cose_key = match pk.to_cose_key() {
|
||||
Some(cose_key) => cose_key,
|
||||
None => return Err(Ctap2StatusCode::CTAP2_ERR_VENDOR_RESPONSE_CANNOT_WRITE_CBOR),
|
||||
None => return Err(Ctap2StatusCode::CTAP2_ERR_VENDOR_INTERNAL_ERROR),
|
||||
};
|
||||
auth_data.extend(cose_key);
|
||||
if has_extension_output {
|
||||
@@ -558,7 +556,7 @@ where
|
||||
"credProtect" => cred_protect_policy,
|
||||
};
|
||||
if !cbor::write(extensions_output, &mut auth_data) {
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_VENDOR_RESPONSE_CANNOT_WRITE_CBOR);
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_VENDOR_INTERNAL_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -639,7 +637,7 @@ where
|
||||
"hmac-secret" => encrypted_output,
|
||||
};
|
||||
if !cbor::write(extensions_output, &mut auth_data) {
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_VENDOR_RESPONSE_CANNOT_WRITE_CBOR);
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_VENDOR_INTERNAL_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -722,7 +720,7 @@ where
|
||||
let hmac_secret_input = extensions.map(|e| e.hmac_secret).flatten();
|
||||
if hmac_secret_input.is_some() && !options.up {
|
||||
// The extension is actually supported, but we need user presence.
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_UNSUPPORTED_EXTENSION);
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_UNSUPPORTED_OPTION);
|
||||
}
|
||||
|
||||
// The user verification bit depends on the existance of PIN auth, since we do
|
||||
@@ -1592,7 +1590,7 @@ mod test {
|
||||
|
||||
assert_eq!(
|
||||
get_assertion_response,
|
||||
Err(Ctap2StatusCode::CTAP2_ERR_UNSUPPORTED_EXTENSION)
|
||||
Err(Ctap2StatusCode::CTAP2_ERR_UNSUPPORTED_OPTION)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1643,7 +1641,7 @@ mod test {
|
||||
|
||||
assert_eq!(
|
||||
get_assertion_response,
|
||||
Err(Ctap2StatusCode::CTAP2_ERR_UNSUPPORTED_EXTENSION)
|
||||
Err(Ctap2StatusCode::CTAP2_ERR_UNSUPPORTED_OPTION)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ fn encrypt_hmac_secret_output(
|
||||
cred_random: &[u8; 32],
|
||||
) -> Result<Vec<u8>, Ctap2StatusCode> {
|
||||
if salt_enc.len() != 32 && salt_enc.len() != 64 {
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_UNSUPPORTED_EXTENSION);
|
||||
return Err(Ctap2StatusCode::CTAP1_ERR_INVALID_PARAMETER);
|
||||
}
|
||||
let aes_enc_key = crypto::aes256::EncryptionKey::new(shared_secret);
|
||||
let aes_dec_key = crypto::aes256::DecryptionKey::new(&aes_enc_key);
|
||||
@@ -232,7 +232,7 @@ impl PinProtocolV1 {
|
||||
}
|
||||
}
|
||||
// This status code is not explicitly mentioned in the specification.
|
||||
None => return Err(Ctap2StatusCode::CTAP2_ERR_PIN_REQUIRED),
|
||||
None => return Err(Ctap2StatusCode::CTAP2_ERR_PUAT_REQUIRED),
|
||||
}
|
||||
persistent_store.reset_pin_retries()?;
|
||||
self.consecutive_pin_mismatches = 0;
|
||||
@@ -400,7 +400,7 @@ impl PinProtocolV1 {
|
||||
pin_auth: Option<Vec<u8>>,
|
||||
) -> Result<(), Ctap2StatusCode> {
|
||||
if min_pin_length_rp_ids.is_some() {
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_UNSUPPORTED_EXTENSION);
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_VENDOR_INTERNAL_ERROR);
|
||||
}
|
||||
if persistent_store.pin_hash()?.is_some() {
|
||||
match pin_auth {
|
||||
@@ -419,7 +419,7 @@ impl PinProtocolV1 {
|
||||
// TODO(kaczmarczyck) commented code is useful for the extension
|
||||
// https://github.com/google/OpenSK/issues/129
|
||||
// if !cbor::write(cbor_array_vec!(min_pin_length_rp_ids), &mut message) {
|
||||
// return Err(Ctap2StatusCode::CTAP2_ERR_VENDOR_RESPONSE_CANNOT_WRITE_CBOR);
|
||||
// return Err(Ctap2StatusCode::CTAP2_ERR_VENDOR_INTERNAL_ERROR);
|
||||
// }
|
||||
if !verify_pin_auth(&self.pin_uv_auth_token, &message, &pin_auth) {
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_PIN_AUTH_INVALID);
|
||||
@@ -593,7 +593,7 @@ impl PinProtocolV1 {
|
||||
// HMAC-secret does the same 16 byte truncated check.
|
||||
if !verify_pin_auth(&shared_secret, &salt_enc, &salt_auth) {
|
||||
// Hard to tell what the correct error code here is.
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_UNSUPPORTED_EXTENSION);
|
||||
return Err(Ctap2StatusCode::CTAP2_ERR_PIN_AUTH_INVALID);
|
||||
}
|
||||
encrypt_hmac_secret_output(&shared_secret, &salt_enc[..], cred_random)
|
||||
}
|
||||
@@ -1174,10 +1174,7 @@ mod test {
|
||||
|
||||
let salt_enc = [0x5E; 48];
|
||||
let output = encrypt_hmac_secret_output(&shared_secret, &salt_enc, &cred_random);
|
||||
assert_eq!(
|
||||
output,
|
||||
Err(Ctap2StatusCode::CTAP2_ERR_UNSUPPORTED_EXTENSION)
|
||||
);
|
||||
assert_eq!(output, Err(Ctap2StatusCode::CTAP1_ERR_INVALID_PARAMETER));
|
||||
|
||||
let salt_enc = [0x5E; 64];
|
||||
let output = encrypt_hmac_secret_output(&shared_secret, &salt_enc, &cred_random);
|
||||
|
||||
@@ -31,11 +31,10 @@ pub enum Ctap2StatusCode {
|
||||
CTAP2_ERR_INVALID_CBOR = 0x12,
|
||||
CTAP2_ERR_MISSING_PARAMETER = 0x14,
|
||||
CTAP2_ERR_LIMIT_EXCEEDED = 0x15,
|
||||
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_LARGE_BLOB_STORAGE_FULL = 0x18,
|
||||
CTAP2_ERR_CREDENTIAL_EXCLUDED = 0x19,
|
||||
CTAP2_ERR_PROCESSING = 0x21,
|
||||
CTAP2_ERR_INVALID_CREDENTIAL = 0x22,
|
||||
@@ -57,7 +56,7 @@ pub enum Ctap2StatusCode {
|
||||
CTAP2_ERR_PIN_AUTH_INVALID = 0x33,
|
||||
CTAP2_ERR_PIN_AUTH_BLOCKED = 0x34,
|
||||
CTAP2_ERR_PIN_NOT_SET = 0x35,
|
||||
CTAP2_ERR_PIN_REQUIRED = 0x36,
|
||||
CTAP2_ERR_PUAT_REQUIRED = 0x36,
|
||||
CTAP2_ERR_PIN_POLICY_VIOLATION = 0x37,
|
||||
CTAP2_ERR_PIN_TOKEN_EXPIRED = 0x38,
|
||||
CTAP2_ERR_REQUEST_TOO_LARGE = 0x39,
|
||||
@@ -68,14 +67,15 @@ pub enum Ctap2StatusCode {
|
||||
CTAP2_ERR_INTEGRITY_FAILURE = 0x3D,
|
||||
#[cfg(feature = "with_ctap2_1")]
|
||||
CTAP2_ERR_INVALID_SUBCOMMAND = 0x3E,
|
||||
#[cfg(feature = "with_ctap2_1")]
|
||||
CTAP2_ERR_UV_INVALID = 0x3F,
|
||||
#[cfg(feature = "with_ctap2_1")]
|
||||
CTAP2_ERR_UNAUTHORIZED_PERMISSION = 0x40,
|
||||
CTAP1_ERR_OTHER = 0x7F,
|
||||
CTAP2_ERR_SPEC_LAST = 0xDF,
|
||||
CTAP2_ERR_EXTENSION_FIRST = 0xE0,
|
||||
CTAP2_ERR_EXTENSION_LAST = 0xEF,
|
||||
// CTAP2_ERR_VENDOR_FIRST = 0xF0,
|
||||
CTAP2_ERR_VENDOR_RESPONSE_TOO_LONG = 0xF0,
|
||||
CTAP2_ERR_VENDOR_RESPONSE_CANNOT_WRITE_CBOR = 0xF1,
|
||||
|
||||
_CTAP2_ERR_SPEC_LAST = 0xDF,
|
||||
_CTAP2_ERR_EXTENSION_FIRST = 0xE0,
|
||||
_CTAP2_ERR_EXTENSION_LAST = 0xEF,
|
||||
_CTAP2_ERR_VENDOR_FIRST = 0xF0,
|
||||
/// An internal invariant is broken.
|
||||
///
|
||||
/// This type of error is unexpected and the current state is undefined.
|
||||
@@ -85,6 +85,5 @@ pub enum Ctap2StatusCode {
|
||||
///
|
||||
/// It may be possible that some of those errors are actually internal errors.
|
||||
CTAP2_ERR_VENDOR_HARDWARE_FAILURE = 0xF3,
|
||||
|
||||
CTAP2_ERR_VENDOR_LAST = 0xFF,
|
||||
_CTAP2_ERR_VENDOR_LAST = 0xFF,
|
||||
}
|
||||
|
||||
@@ -577,7 +577,7 @@ fn serialize_credential(credential: PublicKeyCredentialSource) -> Result<Vec<u8>
|
||||
if cbor::write(credential.into(), &mut data) {
|
||||
Ok(data)
|
||||
} else {
|
||||
Err(Ctap2StatusCode::CTAP2_ERR_VENDOR_RESPONSE_CANNOT_WRITE_CBOR)
|
||||
Err(Ctap2StatusCode::CTAP2_ERR_VENDOR_INTERNAL_ERROR)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -600,7 +600,7 @@ fn _serialize_min_pin_length_rp_ids(rp_ids: Vec<String>) -> Result<Vec<u8>, Ctap
|
||||
if cbor::write(cbor_array_vec!(rp_ids), &mut data) {
|
||||
Ok(data)
|
||||
} else {
|
||||
Err(Ctap2StatusCode::CTAP2_ERR_VENDOR_RESPONSE_CANNOT_WRITE_CBOR)
|
||||
Err(Ctap2StatusCode::CTAP2_ERR_VENDOR_INTERNAL_ERROR)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user