The English version of this specification is the only normative version. Non-normative translations may also be available.
Copyright © 2013-2020 FIDO Alliance All Rights Reserved.
This document defines the assertion format "WAV1CBOR" in order to use Web Authentication assertions through the FIDO UAF protocol.
This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current FIDO Alliance publications and the latest revision of this technical report can be found in the FIDO Alliance specifications index at https://fidoalliance.org/specifications/.
This document was published by the FIDO Alliance as a Proposed Standard. If you wish to make comments regarding this document, please Contact Us. All comments are welcome.
Implementation of certain elements of this Specification may require licenses under third party intellectual property rights, including without limitation, patent rights. The FIDO Alliance, Inc. and its Members and any other contributors to the Specification are not, and shall not be held, responsible in any manner for identifying or failing to identify any or all such third party intellectual property rights.
THIS FIDO ALLIANCE SPECIFICATION IS PROVIDED “AS IS” AND WITHOUT ANY WARRANTY OF ANY KIND, INCLUDING, WITHOUT LIMITATION, ANY EXPRESS OR IMPLIED WARRANTY OF NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
This document has been reviewed by FIDO Aliance Members and is endorsed as a Proposed Standard. It is a stable document and may be used as reference material or cited from another document. FIDO Alliance's role in making the Recommendation is to draw attention to the specification and to promote its widespread deployment.
Type names, attribute names and element names are written as code.
String literals are enclosed in “”, e.g. “UAF-TLV”.
In formulas we use “|” to denote byte wise concatenation operations.
UAF specific terminology used in this document is defined in [FIDOGlossary].
All diagrams, examples, notes in this specification are non-normative.
The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in [RFC2119].
This section is non-normative.
This document defines the assertion format "WAV1CBOR" in order to use Web Authentication assertions through the FIDO UAF protocol.
This section is normative.
The registration assertion for the assertion format "WAV1CBOR" is a TLV encoded object containing
the CBOR encoded authenticatorData, the name of the attestation format, and the atestation statement itself.
| TLV Structure | Description | |
|---|---|---|
| 1 | UINT16 Tag | TAG_WAV1CBOR_REG_ASSERTION |
| 1.1 | UINT16 Length | Length of the structure. |
| 1.2 | UINT16 Tag | TAG_WAV1CBOR_REG_DATA |
| 1.2.1 | UINT16 Length | Length of the structure. |
| 1.2.2 | UINT8 tbsData | The binary authenticatorData structure as specified
in section 6.1 in [WebAuthn] with non-empty attestedCredentialData field being present
followed by (i.e. binary concatenation) the clientDataHash.
|
| 1.3 | UINT16 Tag | TAG_ATTESTATION_FORMAT |
| 1.3.1 | UINT16 Length | Length of Attestation Format |
| 1.3.2 | UINT8[] Attestation Format | Authenticator Attestation Format, see field "fmt" in section sctn-attestation in [WebAuthn] |
| 1.4 | UINT16 Tag | TAG_ATTESTATION_STATEMENT |
| 1.4.1 | UINT16 Length | Length of Attestation Statement |
| 1.4.2 | UINT8[] Attestation Statement | Authenticator Attestation Statement, see field "stmt" in section sctn-attestation in [WebAuthn]. This field contains the signature in sub-field "sig". |
The authentication assertion is a TLV structure containing the CBOR encoded authenticatorData object,
the authenticator model name (AAGUID), the key identifier and the signature of the authenticatorData object.
| TLV Structure | Description | |
|---|---|---|
| 1 | UINT16 Tag | TAG_WAV1CBOR_AUTH_ASSERTION |
| 1.1 | UINT16 Length | Length of the structure. |
| 1.2 | UINT16 Tag | TAG_WAV1CBOR_SIGNED_DATA |
| 1.2.1 | UINT16 Length | Length of the structure. |
| 1.2.2 | UINT8 tbsData | As described in step 11 in section 6.3.3 in [WebAuthn]: The binary authenticatorData structure as specified
in section 6.1 in [WebAuthn] with empty attestedCredentialData field being present
followed by (i.e. binary concatenation) the clientDataHash.
|
| 1.3 | UINT16 Tag | TAG_AAGUID |
| 1.3.1 | UINT16 Length | Length of AAGUID |
| 1.3.2 | UINT8[] AAGUID | Authenticator Attestation GUID, see section 6.4.1 in [WebAuthn] |
| 1.4 | UINT16 Tag | TAG_KEYID |
| 1.4.1 | UINT16 Length | Length of KeyID |
| 1.4.2 | UINT8[] KeyID | (binary value of) Credential ID (see definition of CredentialID in [WebAuthn]) |
| 1.5 | UINT16 Tag | TAG_SIGNATURE |
| 1.5.1 | UINT16 Length | Length of Signature |
| 1.5.2 | UINT8[] Signature | Signature calculated using UAuth.priv over tbsData - not including any TAGs nor the KeyID and AAGUID. |
This section is normative.
Refer to [UAFAuthnrCommands] document for more information about the TAGs and structure mentioned in this paragraph.
authenticatorIndex.
If the authenticator cannot be located, then fail with error code
UAF_ASM_STATUS_AUTHENTICATOR_DISCONNECTED.
authenticatorGetInfo [FIDOCTAP].
Remember whether the authenticator supports residentKeys (rk), clientPin,
User Presence (up), User Verification (uv).
Also remember whether the authenticator is a roaming authenticator (plat=false),
or a platform authenticator (plat=true). If the connection fails, then fail with error code
UAF_ASM_STATUS_AUTHENTICATOR_DISCONNECTED.
clientPin is the requested user verification method (see UVM extension), but
step 2 indicated that clientPin is not yet set (i.e. clientPin present but set to false),
then ask user to set (enroll) clientPin.
UAF_ASM_STATUS_USER_NOT_ENROLLED.
UAF_ASM_STATUS_ACCESS_DENIEDASMRequest.args.finalChallenge using the
authenticator-specific hash function and store the result in FinalChallengeHash.
An authenticator's preferred hash function information MUST meet the
algorithm defined in the AuthenticatorInfo.authenticationAlgorithm field.
ASMRequest.exts
rk to the
value of that extension and continue with the next extension.
ac to the
value of that extension and continue with the next extension.
extensionsCBOR. If no corresponding WebAuthn/FIDO2 extension is specified,
ignore this extension (if fail_if_unknown is false) or return UAF_ASM_STATUS_ERROR (if fail_if_unknown is true).
result containing the error code of that operation.
This interface has the following input parameters (see [FIDOCTAP]):
rk, uv, and up).
The output parameters are (see [FIDOCTAP]):
rp.rpId to the ASMRequest.args.AppIDuser.Id to the fido.uaf.userid extension retrieved from ASMRequest.exts;
set user.displayName to ASMRequest.args.username.
Fail if the fido.uaf.userid extension is missing in ASMRequest.exts.
clientDataHash to FinalChallengeHashpubKeyCredParams.type to "public-key" and pubKeyCredParams.alg
to the preferred algorithm, e.g. "ES256".excludeList to an empty listextensions to the CBOR map extensionsCBORpinAuth and pinProtocol to the respective values supported by this ASM
(to the extent the underlying platform allows specifying these values).options to an empty object and add items as follows
uvm.userVerificationMethod includes one or more of the flags USER_VERIFY_FINGERPRINT,
USER_VERIFY_PASSCODE, USER_VERIFY_VOICEPRINT, USER_VERIFY_FACEPRINT,
USER_VERIFY_LOCATION, USER_VERIFY_EYEPRINT, USER_VERIFY_PATTERN, or
USER_VERIFY_HANDPRINT
set options.userVerification to true and
set options.userPresence to true.
uvm.userVerificationMethod is equal to USER_VERIFY_CLIENTPIN
set options.userVerification to true and
set options.userPresence to false.
uvm.userVerificationMethod is equal to USER_VERIFY_PRESENCE
set options.userVerification to false and
set options.userPresence to true.
uvm.userVerificationMethod is eequal to USER_VERIFY_NONE
set options.userVerification to false and
set options.userPresence to false.
If the authenticator uses clientPin but the clientPin was not set
(indicated by CTAP2_ERR_PIN_NOT_SET), the ASM should ask the user for the clientPin and provide it to the authenticator.
result is not equal to CTAP2_OK and retry cannot fix the problem, then
map the CTAP error code to a UAF ASM error code using the table in section 5. Mapping CTAP2 error codes to ASM error codes
and return the resulting error code.
TAG_WAV1CBOR_REG_ASSERTION structure:
finalChallengeHash into field TAG_WAV1CBOR_SIGNED_DATATAG_ATTESTATION_FORMATTAG_ATTESTATION_STATEMENTRegisterOut object
RegisterOut.assertionScheme to "WAV1CBOR"TAG_WAV1CBOR_REG_ASSERTION
in base64url format and set as RegisterOut.assertion.
ASMResponse.responseData to RegisterOut.ASMResponse.statusCode to the correct status code corresponding to the result received earlier.ASMResponse.exts to emptyASMResponse objecta.assertionScheme == "WAV1CBOR" AND a.assertion.TAG_WAV1CBOR_REG_ASSERTION contains
TAG_WAV1CBOR_SIGNED_DATA as first element:
authenticatorData from TAG_WAV1CBOR_SIGNED_DATA.tbsDataclaimedAAGUID from authenticatorData.attestedCredentialData.AAGUID.a.assertionScheme matches Metadata(claimedAAGUID).assertionScheme
claimedAAGUID indeed matches the policy specified
in the registration request.
Depending on the policy (e.g. in the case of AND combinations), it
might be required to evaluate other assertions included in this RegistrationResponse in
order to determine whether this AAGUID matches the policy.
claimedAAGUID
(field authenticationAlgs).fcp is of type FinalChallengeParams [UAFProtocol], then
hash RegistrationResponse.fcParams using hashing algorithm
suitable for this authenticator type. Look up the hash
algorithm in authenticator metadata, field AuthenticationAlgs.
It is the hash algorithm associated with the first entry
related to a constant with prefix ALG_SIGN.
FCHash = hash(RegistrationResponse.fcParams)fcp is of type CollectedClientData [UAFProtocol], then
hash RegistrationResponse.fcParams using hashing algorithm
specified in fcp.hashAlg.
FCHash = hash(RegistrationResponse.fcParams)Metadata(claimedAAGUID).AttestationType for the claimedAAGUID and make sure
that a.assertion.TAG_WAV1CBOR_REG_ASSERTION contains the most preferred
attestation tag specified in field MatchCriteria.attestationTypes
in RegistrationRequest.policy (if this field is present).
a.assertion.TAG_WAV1CBOR_REG_ASSERTION doesn't contain the
preferred attestation - it is RECOMMENDED to skip this
assertion and continue with next onetbsData to the data contained in a.assertion.tbsData.authenticatorData to the CBOR object tbsData starts with.
Use the "length" field of the CBOR object to determine its end.clientDataHash to the remaining bytes of the tbsData (i.e. the bytes following the CBOR object).clientDataHash
== FCHash
up and uv bits from authenticatorData.
Verify whether these bits match the UVM extension sent in the request. Fail if the verification result is not acceptable.
up=false and uv=false means silent authentication (USER_VERIFY_NONE)up=true and uv=false means user presence check only (USER_VERIFY_PRESENCE)up=false and uv=true means user verification that doesn't provide user presence check, e.g. client Pin
or some other user verification method not necessarily implemented fully inside the authenticator
boundary (USER_VERIFY_CLIENTPIN)up=true and uv=true means user verification using a user verification method implemented
inside the authenticator boundary (e.g. USER_VERIFY_FINGERPRINT, ...) or client Pin plus user presence check
(USER_VERIFY_CLIENTPIN) AND USER_VERIFY_PRESENCE - depending on the authenticator
capabilities as declared in the related Metadata Statement.UVM extension is included in the response, extract this value and compare it
verify whether it matches the extension from the request. Fail if the verification result is not acceptable.
a.assertion.TAG_WAV1CBOR_REG_ASSERTION.TAG_ATTESTATION_STATEMENT
contains ATTESTATION_BASIC_FULL tag
AttestationRootCertificates for the claimedAAGUID in the
metadata [FIDOMetadataStatement] contains at least one element:
TAG_ATTESTATION_CERT tags from
a.assertion.TAG_WAV1CBOR_REG_ASSERTION.ATTESTATION_BASIC_FULL object.
The occurrences are ordered (see [UAFAuthnrCommands])
and represent the attestation certificate followed by the related
certificate chain.AttestationRootCertificates
for the claimedAAGUID in authenticator Metadata, field AttestationRootCertificates.a.assertion.TAG_WAV1CBOR_REG_ASSERTION.TAG_ATTESTATION_STATEMENT.sig
using the attestation certificate (obtained before).Metadata(claimedAAGUID).AttestationRootCertificates for this claimedAAGUID is
empty - continue with next assertiona.assertion.TAG_WAV1CBOR_REG_ASSERTION.TAG_ATESTATION_STATEMENT
contains an object of type ATTESTATION_BASIC_SURROGATE
AttestationRootCertificates for the claimedAAGUID in the
metadata is not empty - continue with next assertion
(as the AAGUID obviously is expecting a different attestation method).a.assertion.TAG_WAV1CBOR_REG_ASSERTION
contains an object of type ATTESTATION_ECDAA
ecdaaTrustAnchors for the claimedAAGUID in the
metadata [FIDOMetadataStatement] contains at least one element:
ecdaaTrustAnchors entries, perform the
ECDAA Verify operation as specified in [FIDOEcdaaAlgorithm].
ecdaaTrustAnchors entryMetadata(claimedAAID).ecdaaTrustAnchors for this claimedAAGUID is
empty - continue with next assertiona.assertion.TAG_UAFV1_REG_ASSERTION contains
another TAG_ATTESTATION tag - verify the attestation by following
appropriate processing rules applicable to that attestation.
Currently this document defines the processing rules for Basic Attestation and
direct anonymous attestation (ECDAA).
authenticatorData.attestedCredentialData.credentialPubKey into PublicKey,
authenticatorData.attestedCredentialData.credentialID into KeyID,
authenticatorData.counter into SignCounter,
authenticatorData.attestedCredentialData.AAGUID into AAGUID.
authenticatorIndex.
If the authenticator cannot be located, then fail with UAF_ASM_STATUS_AUTHENTICATOR_DISCONNECTED.
callerid against the one stored at registration time
and return UAF_ASM_STATUS_ACCESS_DENIED if it doesn't match.
AuthenticateIn.finalChallenge using the preferred authenticator-specific
hash function (FinalChallengeHash).
The authenticator's preferred hash function information MUST meet the
algorithm defined in the AuthenticatorInfo.authenticationAlgorithm field.
KeyIDRecords of KeyID, related KeyHandle and related usernameAuthenticateIn.keyIDs is not empty,
AuthenticateIn.appID and AuthenticateIn.keyIDs and matching entry into KeyIDRecords
UAF_ASM_STATUS_KEY_DISAPPEARED_PERMANENTLY if the related key
disappeared permanently from the authenticator.UAF_ASM_STATUS_ACCESS_DENIED if no entry has been found.AuthenticateIn.keyIDs
add an entry in KeyIDRecords with entry.KeyID and entry.KeyHandle
set to the respective keyID in AuthenticateIn.keyIDs. Set entry.userName to empty.
AuthenticateIn.keyIDs is empty, lookup all KeyHandles matching this request
and add an entry in KeyIDRecords with entry.KeyID and entry.KeyHandle
set to the respective KeyHandles. Set entry.userName the related userName.
KeyIDRecords containes multiple entries,
show the related distinct usernames and ask the user to choose a single username.
Remember the KeyHandle and the related KeyID to this key.
AuthenticateIn.transaction is NOT empty then select the
entry n with the content type best matching the authenticator capabilities.
AuthenticateIn.transaction[n].contentType == "text/plain"
then create a corresponding txAuthSimple extension in extensionsCBOR.
AuthenticateIn.transaction[n].contentType != "text/plain"
then create a corresponding txAuthGeneric extension in extensionsCBOR.
ASMRequest.exts
create a corresponding WebAuthn/FIDO2 extension (see [WebAuthn])
extension in extensionsCBOR. If no corrsponding WebAuthn/FIDO2 extension is specified, ignore this extension.
result containing the error code of that operation.
authenticatorGetAssertion has the following input parameters (see [FIDOCTAP]):
up for user presence
and uv for user verification).The output parameters are (see [FIDOCTAP]):
rpId to the ASMRequest.args.AppIDclientDataHash to FinalChallengeHashallowList to the KeyHandle remembered earlierextensions to the CBOR map extensionsCBORpinAuth and pinProtocol to the respective values supported by this ASM
(to the extent the underlying platform allows specifying these values).options to an empty object and add items as follows
uvm.userVerificationMethod includes one or more of the flags USER_VERIFY_FINGERPRINT,
USER_VERIFY_PASSCODE, USER_VERIFY_VOICEPRINT, USER_VERIFY_FACEPRINT,
USER_VERIFY_LOCATION, USER_VERIFY_EYEPRINT, USER_VERIFY_PATTERN, or
USER_VERIFY_HANDPRINT
set options.uv to true and
set options.up to true.
uvm.userVerificationMethod is equal to USER_VERIFY_CLIENTPIN
set options.uv to true and
set options.up to false. Remember to provide the clientPIN to the authenticator.
uvm.userVerificationMethod is equal to USER_VERIFY_PRESENCE
set options.uv to false and
set options.up to true.
uvm.userVerificationMethod is equal to USER_VERIFY_NONE
set options.uv to false and
set options.up to false.
If the authenticator uses clientPin but the clientPin was not set
(indicated by CTAP2_ERR_PIN_NOT_SET), the ASM should ask the user for the clientPin and provide it to the authenticator.
result is not equal to CTAP2_OK and retry cannot fix the problem, then
map the CTAP error code to a UAF ASM error code using the table in section 5. Mapping CTAP2 error codes to ASM error codes
and return the resulting error code.
numberOfCredentials in the response is > 1, then follow the rules in section "Client Logic" [FIDOCTAP] to receive and process the remaining (numberOfCredentials-1) responses
(see authenticatorGetNextAssertion in [FIDOCTAP]).
TAG_WAV1CBOR_AUTH_ASSERTION structure.
AAGUID (if known) into the respective TLV fields. Otherwise set the field to an empty value (zero length).
In the case of a platform authenticator, the AAGUID value can be remembered at registration time.
In the case of a roaming authenticator, it might be possible to call
authenticatorGetInfo [FIDOCTAP] which provides the AAGUID in the response.
KeyID into the respective TLV field.result.authData into the value of the TAG_WAV1CBOR_SIGNED_DATA field.result.signature into the value of the TAG_SIGNATURE field.AuthenticateOut object
AuthenticateOut.assertionScheme to "WAV1CBOR"
TAG_WAV1CBOR_AUTH_ASSERTION
in base64url format and
set as AuthenticateOut.assertion
ASMResponse.responseData to AuthenticateOut object.ASMResponse.statusCode to the correct status code corresponding to the result received earlier.ASMResponse.exts to emptyASMResponse objectInstead of skipping the assertion according to step 6.5. in section 3.5.7.5 [UAFProtocol], follow these rules:
a.assertionScheme == "WAV1CBOR" AND a.assertion starts with a valid structure
as defined in section 3.2 Authentication Assertion, then
tbsData to the data contained in a.assertion.tbsData.authenticatorData to the CBOR object tbsData starts with.
Use the "length" field of the CBOR object to determine its end.clientDataHash to the remaining bytes of the tbsData (i.e. the bytes following the CBOR object).claimedAAGUID from a.assertion.AAGUID (note that it might be empty).claimedKeyID from a.assertion.KeyID.UAuth.pub associated with (claimedAAGUID, claimedKeyID) in the user's record.
If claimedAAGUID is empty, search for a matching claimedKeyID.
claimedAAGUID is empty, set it to the AAGUID stored along with UAuth.puba.assertionScheme matches Metadata(claimedAAGUID).assertionScheme
claimedAAGUID
indeed matches the policy of the Authentication Request.
authenticatorData.SignCounter
and make sure it is either not supported by the authenticator
(i.e. the value provided and the value stored in the user's record are
both 0 or the value isKeyRestricted is set to 'false' in the related Metadata Statement)
or it has been incremented (compared to the value stored in the user's record)
AuthenticationAlgs)
fcp is of type FinalChallengeParams,
then hash AuthenticationResponse.FinalChallengeParams using the hashing
algorithm suitable for this authenticator type. Look up the
hash algorithm in authenticator Metadata, field
AuthenticationAlgs. It is the hash algorithm associated with
the first entry related to a constant with prefix ALG_SIGN.
FCHash = hash(AuthenticationResponse.FinalChallengeParams)fcp is of type CollectedClientData [UAFProtocol], then
hash AuthenticationResponse.fcParams using hashing algorithm
specified in fcp.hashAlg.
FCHash = hash(AuthenticationResponse.fcParams)clientDataHash == FCHash
up and uv bits from authenticatorData.
Verify whether these bits match the UVM extension sent in the request. Fail if the verification result is not acceptable.
up=false and uv=false means silent authentication (USER_VERIFY_NONE)up=true and uv=false means user presence check only (USER_VERIFY_PRESENCE)up=false and uv=true means user verification that doesn't provide user presence, e.g. client Pin
or some other user verification method not necessarily implemented fully inside the authenticator
boundary (USER_VERIFY_CLIENTPIN)up=true and uv=true means user verification using a user verification method implemented
inside the authenticator boundary (e.g. USER_VERIFY_FINGERPRINT, ...) or client Pin plus user presence check
(USER_VERIFY_CLIENTPIN) AND USER_VERIFY_PRESENCE - depending on the authenticator
capabilities as declared in the related Metadata Statement.UVM extension is included in the response, extract this value and compare it
verify whether it matches the extension from the request. Fail if the verification result is not acceptable.
authenticatorData contains "txAuthSimple" (see section 10.2 [WebAuthn])
or "txAuthGeneric" (see section 10.3 [WebAuthn]) extension(s),
The transaction/transaction hash included in this AuthenticationResponse
must match the transaction content specified in the related AuthenticationRequest.
As FIDO doesn’t mandate any specific FIDO Server API, the transaction content could be cached
by any relying party software component, e.g. the FIDO Server or the relying party Web Application.
cachedTransaction add hash(cachedTransaction) into
cachedTransactionHashList
cachedTransactionHashList
UAuth.pub key found in step 1.9 and the appropriate authentication algorithm to
verify the signature a.assertion.Signature of the to-be-signed object tbsData.
SignCounter in user's record with
authenticatorData.SignCounter.
The values of claimedAAGUID and claimedKeyID are now
confirmed since the public key we looked up using those values was the correct one.
| CTAP2 Code | CTAP2 Name | ASM Error Name |
|---|---|---|
| 0x00 | CTAP1_ERR_SUCCESS, CTAP2_OK | UAF_ASM_STATUS_OK |
| 0x01 | CTAP1_ERR_INVALID_COMMAND | UAF_ASM_STATUS_ERROR |
| 0x02 | CTAP1_ERR_INVALID_PARAMETER | UAF_ASM_STATUS_ERROR |
| 0x03 | CTAP1_ERR_INVALID_LENGTH | UAF_ASM_STATUS_ERROR |
| 0x04 | CTAP1_ERR_INVALID_SEQ | UAF_ASM_STATUS_ERROR |
| 0x05 | CTAP1_ERR_TIMEOUT | UAF_ASM_STATUS_USER_NOT_RESPONSIVE |
| 0x06 | CTAP1_ERR_CHANNEL_BUSY | UAF_ASM_STATUS_ERROR |
| 0x0A | CTAP1_ERR_LOCK_REQUIRED | UAF_ASM_STATUS_ERROR |
| 0x0B | CTAP1_ERR_INVALID_CHANNEL | UAF_ASM_STATUS_ERROR |
| 0x11 | CTAP2_ERR_CBOR_UNEXPECTED_TYPE | UAF_ASM_STATUS_ERROR |
| 0x12 | CTAP2_ERR_INVALID_CBOR | UAF_ASM_STATUS_ERROR |
| 0x14 | CTAP2_ERR_MISSING_PARAMETER | UAF_ASM_STATUS_ERROR |
| 0x15 | CTAP2_ERR_LIMIT_EXCEEDED | UAF_ASM_STATUS_ERROR |
| 0x16 | CTAP2_ERR_UNSUPPORTED_EXTENSION | UAF_ASM_STATUS_ERROR |
| 0x19 | CTAP2_ERR_CREDENTIAL_EXCLUDED | UAF_ASM_STATUS_ERROR |
| 0x21 | CTAP2_ERR_PROCESSING | UAF_ASM_STATUS_ERROR |
| 0x22 | CTAP2_ERR_INVALID_CREDENTIAL | UAF_ASM_STATUS_ERROR |
| 0x23 | CTAP2_ERR_USER_ACTION_PENDING | UAF_ASM_STATUS_USER_NOT_RESPONSIVE |
| 0x24 | CTAP2_ERR_OPERATION_PENDING | UAF_ASM_STATUS_ERROR |
| 0x25 | CTAP2_ERR_NO_OPERATIONS | UAF_ASM_STATUS_ERROR |
| 0x26 | CTAP2_ERR_UNSUPPORTED_ALGORITHM | UAF_ASM_STATUS_ERROR |
| 0x27 | CTAP2_ERR_OPERATION_DENIED | UAF_ASM_STATUS_ACCESS_DENIED |
| 0x28 | CTAP2_ERR_KEY_STORE_FULL | UAF_ASM_STATUS_INSUFFICIENT_AUTHENTICATOR_RESOURCES |
| 0x2A | CTAP2_ERR_NO_OPERATION_PENDING | UAF_ASM_STATUS_ERROR |
| 0x2B | CTAP2_ERR_UNSUPPORTED_OPTION | UAF_ASM_STATUS_ERROR |
| 0x2C | CTAP2_ERR_INVALID_OPTION | UAF_ASM_STATUS_ERROR |
| 0x2D | CTAP2_ERR_KEEPALIVE_CANCEL | UAF_ASM_STATUS_ERROR |
| 0x2E | CTAP2_ERR_NO_CREDENTIALS | UAF_ASM_STATUS_ERROR |
| 0x2F | CTAP2_ERR_USER_ACTION_TIMEOUT | UAF_ASM_STATUS_USER_NOT_RESPONSIVE |
| 0x30 | CTAP2_ERR_NOT_ALLOWED | UAF_ASM_STATUS_ERROR |
| 0x31 | CTAP2_ERR_PIN_INVALID | UAF_ASM_STATUS_ACCESS_DENIED |
| 0x32 | CTAP2_ERR_PIN_BLOCKED | UAF_ASM_STATUS_USER_LOCKOUT |
| 0x33 | CTAP2_ERR_PIN_AUTH_INVALID | UAF_ASM_STATUS_ACCESS_DENIED |
| 0x34 | CTAP2_ERR_PIN_AUTH_BLOCKED | UAF_ASM_STATUS_USER_LOCKOUT |
| 0x35 | CTAP2_ERR_PIN_NOT_SET | UAF_ASM_STATUS_USER_NOT_ENROLLED |
| 0x36 | CTAP2_ERR_PIN_REQUIRED | UAF_ASM_STATUS_ACCESS_DENIED |
| 0x37 | CTAP2_ERR_PIN_POLICY_VIOLATION | UAF_ASM_STATUS_ACCESS_DENIED |
| 0x38 | CTAP2_ERR_PIN_TOKEN_EXPIRED | UAF_ASM_STATUS_ACCESS_DENIED |
| 0x39 | CTAP2_ERR_REQUEST_TOO_LARGE | UAF_ASM_STATUS_INSUFFICIENT_AUTHENTICATOR_RESOURCES |
| 0x3A | CTAP2_ERR_ACTION_TIMEOUT | UAF_ASM_STATUS_USER_NOT_RESPONSIVE |
| 0x3B | CTAP2_ERR_UP_REQUIRED | UAF_ASM_STATUS_ACCESS_DENIED |
| 0x7F | CTAP1_ERR_OTHER | UAF_ASM_STATUS_ERROR |
| 0xDF | CTAP2_ERR_SPEC_LAST | UAF_ASM_STATUS_ERROR |
| 0xE0 | CTAP2_ERR_EXTENSION_FIRST | UAF_ASM_STATUS_ERROR |
| 0xEF | CTAP2_ERR_EXTENSION_LAST | UAF_ASM_STATUS_ERROR |
| 0xF0 | CTAP2_ERR_VENDOR_FIRST | UAF_ASM_STATUS_ERROR |
| 0xFF | CTAP2_ERR_VENDOR_LAST | UAF_ASM_STATUS_ERROR |