The English version of this specification is the only normative version. Non-normative translations may also be available.
Copyright © 2013-2017 FIDO Alliance All Rights Reserved.
The goal of the Universal Authentication Framework is to provide a unified and extensible authentication mechanism that supplants passwords while avoiding the shortcomings of current alternative authentication approaches.
This approach is designed to allow the relying party to choose the best available authentication mechanism for a particular end user or interaction, while preserving the option to leverage emerging device security capabilities in the future without requiring additional integration effort.
This document describes the FIDO architecture in detail, it defines the flow and content of all UAF protocol messages and presents the rationale behind the design choices.
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://www.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.
The notation base64url refers to "Base 64 Encoding with URL and Filename Safe Alphabet" [RFC4648] without padding.
Following [WebIDL-ED], dictionary members are optional unless
they are explicitly marked as required
.
WebIDL dictionary members MUST NOT have a value of null — i.e., there are no declarations of nullable dictionary members in this specification.
Unless otherwise specified, if a WebIDL dictionary member is DOMString, it MUST NOT be empty.
Unless otherwise specified, if a WebIDL dictionary member is a List, it MUST NOT be an empty list.
UAF specific terminology used in this document is defined in [FIDOGlossary].
All diagrams, examples, notes in this specification are non-normative.
Note: Certain dictionary members need to be present in order to
comply with FIDO requirements. Such members are marked in the
WebIDL definitions found in this document, as
required
. The keyword required
has been
introduced by [WebIDL-ED], which is a work-in-progress. If you
are using a WebIDL parser which implements [WebIDL], then you
may remove the keyword required
from your WebIDL and
use other means to ensure those fields are present.
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.
The goal of this Universal Authentication Framework is to provide a unified and extensible authentication mechanism that supplants passwords while avoiding the shortcomings of current alternative authentication approaches.
The design goal of the protocol is to enable Relying Parties to leverage the diverse and heterogeneous set of security capabilities available on end users' devices via a single, unified protocol.
This approach is designed to allow the FIDO Relying Parties to choose the best available authentication mechanism for a particular end user or interaction, while preserving the option for a relying party to leverage emerging device security capabilities in the future, without requiring additional integration effort.
This document describes FIDO architecture in detail and defines the UAF protocol as a network protocol. It defines the flow and content of all UAF messages and presents the rationale behind the design choices.
Particular application-level bindings are outside the scope of this document. This document is not intended to answer questions such as:
The answers to these questions can be found in other UAF specifications, e.g. [UAFAppAPIAndTransport] [UAFASM] [UAFAuthnrCommands].
The following diagram depicts the entities involved in UAF protocol.
Of these entities, only these three directly create and/or process UAF protocol messages:
It is assumed in this document that a FIDO Server has access to the UAF Authenticator Metadata [FIDOMetadataStatement] describing all the authenticators it will interact with.
The core UAF protocol consists of four conceptual conversations between a FIDO UAF Client and FIDO Server.
Registration: UAF allows the relying party to register a FIDO Authenticator with the user's account at the relying party. The relying party can specify a policy for supporting various FIDO Authenticator types. A FIDO UAF Client will only register existing authenticators in accordance with that policy.
Authentication: UAF allows the relying party to prompt the end user to authenticate using a previously registered FIDO Authenticator. This authentication can be invoked any time, at the relying party's discretion.
Transaction Confirmation: In addition to providing a general authentication prompt, UAF offers support for prompting the user to confirm a specific transaction.
This prompt includes the ability to communicate additional information to the client for display to the end user, using the client's transaction confirmation display. The goal of this additional authentication operation is to enable relying parties to ensure that the user is confirming a specified set of the transaction details (instead of authenticating a session to the user agent).
Deregistration: The relying party can trigger the deletion of the account-related authentication key material.
Although this document defines the FIDO Server as the initiator of requests, in a real world deployment the first UAF operation will always follow a user agent's (e.g. HTTP) request to a relying party.
The following sections give a brief overview of the protocol conversation for individual operations. More detailed descriptions can be found in the sections Registration Operation, Authentication Operation, and Deregistration Operation.
The following diagram shows the message flows for registration.
The client application should use the appropriate API to inform the FIDO UAF Client of the results of the operation (see section 2.3.1 in [UAFAppAPIAndTransport]) in order to allow the FIDO UAF Client to do some "housekeeping" tasks.
The following diagram depicts the message flows for the authentication operation.
The client application should use the appropriate API to inform the FIDO UAF Client of the results of the operation (see section 2.3.1 in [UAFAppAPIAndTransport]) in order to allow FIDO UAF Client to do some "housekeeping" tasks.
The following figure depicts the transaction confirmation message flow.
The client application should use the appropriate API to inform the FIDO UAF Client of the results of the operation (see section 2.3.1 in [UAFAppAPIAndTransport]) in order to allow the FIDO UAF Client to do some "housekeeping" tasks.
The following diagram depicts the deregistration message flow.
The client application should use the appropriate API to inform the FIDO UAF Client of the results of the operation (see section 2.3.1 in [UAFAppAPIAndTransport]) in order to allow the FIDO UAF Client to do some "housekeeping" tasks.
This section is normative.
This section provides a detailed description of operations supported by the UAF Protocol.
Support of all protocol elements is mandatory for conforming software, unless stated otherwise.
All string literals in this specification are constructed from
Unicode codepoints within the set U+0000
..U+007F
.
Unless otherwise specified, protocol messages are transferred with a UTF-8 content encoding.
All data used in this protocol must be exchanged using a secure transport protocol (such as TLS/HTTPS) established between the FIDO UAF Client and the relying party in order to follow the assumptions made in [FIDOSecRef]; details are specified in section 4.1.7 TLS Protected Communication.
The notation base64url(byte[8..64])
reads as 8-64 bytes of data
encoded in base64url, "Base 64 Encoding with URL and Filename
Safe Alphabet" [RFC4648] without padding.
The notation string[5]
reads as five unicode characters, represented as a
UTF-8 [RFC3629] encoded string of the type indicated in the declaration, typically a
WebIDL [WebIDL-ED] DOMString.
As the UTF-8 representation has variable length, the
maximum byte length of string[5]
is string[4*5]
.
All strings are case-sensitive unless stated otherwise.
This document uses WebIDL [WebIDL-ED] to define UAF protocol messages.
Implementations MUST serialize the UAF protocol messages for transmission using UTF-8 encoded JSON [RFC4627].
This section is normative.
The FIDO UAF Client MUST follow the following rules while parsing server policy:
Policy.accepted
is a list of combinations. Each combination
indicates a list of criteria for authenticators that the server
wants the user to register.Policy.accepted[][]
. The lists
are ordered with highest priority first.Policy.disallowed
criteriaPolicy.accepted
is a list of combinations. Each
combination indicates a set of criteria which is enough to completely
authenticate the current pending operation
Policy.accepted[][]
. The lists
are ordered with highest priority first.Policy.disallowed
criteriaThis section is non-normative.
{ "accepted": [ [{ "userVerification": 2, "authenticationAlgorithms": [1, 2, 5, 6], "assertionSchemes": ["UAFV1TLV"]}], [{ "userVerification": 16, "authenticationAlgorithms": [1, 2, 5, 6], "assertionSchemes": ["UAFV1TLV"]}] ] }
{ "accepted": [ [{ "userVerification": 18, "authenticationAlgorithms": [1, 2, 5, 6], "assertionSchemes": ["UAFV1TLV"]}] ] }
Combining these two bit-flags and the flag USER_VERIFY_ALL
(USER_VERIFY_ALL = 1024) into
a single userVerification
value would
match authenticators implementing FPS and Face Recognition as a mandatory combination of user
verification methods.
{ "accepted": [ [{ "userVerification": 1042, "authenticationAlgorithms": [1, 2, 5, 6], "assertionSchemes": ["UAFV1TLV"]}] ] }
The next example requires two authenticators to be used:
{ "accepted": [ [ { "userVerification": 2, "authenticationAlgorithms": [1, 2, 5, 6], "assertionSchemes": ["UAFV1TLV"]}, { "userVerification": 16, "authenticationAlgorithms": [1, 2, 5, 6], "assertionSchemes": ["UAFV1TLV"]} ] ] }
Other criteria can be specified in addition to the
userVerification
:
{ "accepted": [ [ { "userVerification": 2, "attachmentHint": 1, "authenticationAlgorithms": [1, 2, 5, 6], "assertionSchemes": ["UAFV1TLV"]}, { "userVerification": 16, "attachmentHint": 1, "authenticationAlgorithms": [1, 2, 5, 6], "assertionSchemes": ["UAFV1TLV"]} ] ] }
The policy for accepting authenticators of vendor with ID 1234
only is as follows:
{ "accepted": [ [{ "vendorID": "1234", "authenticationAlgorithms": [1, 2, 5, 6], "assertionSchemes": ["UAFV1TLV"]}] ] }
The UAF protocol includes multiple versioned constructs: UAF protocol version, the version of Key Registration Data and Signed Data objects (identified by their respective tags, see [UAFRegistry]), and the ASM version, see [UAFASM].
The Key Registration Data and Signed Data objects have to be parsed and verified by the FIDO Server. This verification is only possible if the FIDO Server understands their encoding and the content. Each UAF protocol version supports a set of Key Registration Data and SignedData object versions (called Assertion Schemes). Similarly each of the ASM versions supports a set Assertion Scheme versions.
As a consequence the FIDO UAF Client MUST select the authenticators which will generate the appropriately versioned constructs.
For version negotiation the FIDO UAF Client MUST perform the following steps:
FC_Version_Set
) of version pairs,
ASM version (asmVersion
) and UAF Protocol version (upv
) and add all pairs
supported by the FIDO UAF Client into FC_Version_Set
[{upv1, asmVersion1}, {upv2, asmVersion1}, ...]
The ASM versions are retrieved from the AuthenticatorInfo.asmVersion
field.
The UAF protocol version is derived from the related AuthenticatorInfo.assertionScheme
field.
FC_Version_Set
with the set of upv
included in UAF
Message (i.e. keep only those pairs where the upv
value is also
contained in the UAF Message).
Authnr_Version_Set
) of version pairs
including authenticator supported asmVersion
and the
compatible upv(s)
.
[{upv1, asmVersion1}, {upv2, asmVersion1}, ...]
Authnr_Version_Set
with FC_Version_Set
and select highest version pair from it.
upv
is highest. In all these
pairs leave only the one with highest asmVersion
.
Each version consists of major
and minor
fields.
In order to compare two versions - compare the Major fields and if they are equal
compare the Minor fields.
Each UAF message contains a version field upv
. UAF Protocol
version negotiation is always between FIDO UAF Client and FIDO
Server.
A possible implementation optimization is to have the RP web application itself preemptively convey to the FIDO Server the UAF protocol version(s) (UPV) supported by the FIDO Client. This allows the FIDO Server to craft its UAF messages using the UAF version most preferred by both the FIDO client and server.
The Registration operation allows the FIDO Server and the FIDO Authenticator to agree on an authentication key.
The steps 11a and 11b and 12 to 13 are not always necessary as the related data could be cached.
The following diagram depicts the cryptographic data flow for the registration sequence.
The FIDO Server sends the AppID
(see section AppID and FacetID
Assertion), the authenticator Policy,
the ServerChallenge
and the Username
to the FIDO UAF Client.
The FIDO UAF Client computes the FinalChallengeParams
(FCH) from
the ServerChallenge
and some other values
and sends the AppID
, the FCH
and the
Username
to the authenticator.
The authenticator creates a Key Registration Data object (e.g. TAG_UAFV1_KRD
,
see [UAFAuthnrCommands]) containing the hash of FCH
, the newly
generated user public key (UAuth.pub) and some other values and
signs it (see section Authenticator Attestation
for more details). This KRD object is then
cryptographically verified by the FIDO Server.
UAF Registration request message is represented as an array of dictionaries. The array MUST contain exactly one dictionary. The request is defined as RegistrationRequest dictionary.
[{ "header": { "upv": { "major": 1, "minor": 1 }, "op": "Reg", "appID": "https://uaf-test-1.noknoktest.com:8443/SampleApp/uaf/facets", "serverData": "IjycjPZYiWMaQ1tKLrJROiXQHmYG0tSSYGjP5mgjsDaM17RQgq0 dl3NNDDTx9d-aSR_6hGgclrU2F2Yj-12S67v5VmQHj4eWVseLulHdpk2v_hHtKSvv_DFqL4n 2IiUY6XZWVbOnvg" }, "challenge": "H9iW9yA9aAXF_lelQoi_DhUk514Ad8Tqv0zCnCqKDpo", "username": "apa", "policy": { "accepted": [ [ { "userVerification": 512, "keyProtection": 1, "tcDisplay": 1, "authenticationAlgorithms": [ 1 ], "assertionSchemes": [ "UAFV1TLV" ] } ], [ { "userVerification": 4, "keyProtection": 1, "tcDisplay": 1, "authenticationAlgorithms": [ 1 ], "assertionSchemes": [ "UAFV1TLV" ] } ], [ { "userVerification": 4, "keyProtection": 1, "tcDisplay": 1, "authenticationAlgorithms": [ 2 ] } ], [ { "userVerification": 2, "keyProtection": 4, "tcDisplay": 1, "authenticationAlgorithms": [ 2 ] } ], [ { "userVerification": 4, "keyProtection": 2, "tcDisplay": 1, "authenticationAlgorithms": [ 1, 3 ] } ], [ { "userVerification": 2, "keyProtection": 2, "authenticationAlgorithms": [ 2 ] } ], [ { "userVerification": 32, "keyProtection": 2, "assertionSchemes": [ "UAFV1TLV" ] }, { "userVerification": 2, "authenticationAlgorithms": [ 1, 3 ], "assertionSchemes": [ "UAFV1TLV" ] }, { "userVerification": 2, "authenticationAlgorithms": [ 1, 3 ], "assertionSchemes": [ "UAFV1TLV" ] }, { "userVerification": 4, "keyProtection": 1, "authenticationAlgorithms": [ 1, 3 ], "assertionSchemes": [ "UAFV1TLV" ] } ] ], "disallowed": [ { "userVerification": 512, "keyProtection": 16, "assertionSchemes": [ "UAFV1TLV" ] }, { "userVerification": 256, "keyProtection": 16 }, { "aaid": [ "ABCD#ABCD" ], "keyIDs": [ "RfY_RDhsf4z5PCOhnZExMeVloZZmK0hxaSi10tkY_c4" ] } ] } }]
RegistrationRequest contains a single, versioned, registration request.
dictionary RegistrationRequest {
required OperationHeader header;
required ServerChallenge challenge;
required DOMString username;
required Policy policy;
};
RegistrationRequest
Membersheader
of type required OperationHeaderHeader.op
MUST be "Reg"challenge
of type required ServerChallengeusername
of type required DOMStringstring[1..128]
A human-readable user name intended to allow the user to distinguish and select from among different accounts at the same relying party.
policy
of type required PolicyContains the authenticator's response to a RegistrationRequest message:
dictionary AuthenticatorRegistrationAssertion {
required DOMString assertionScheme;
required DOMString assertion;
DisplayPNGCharacteristicsDescriptor[] tcDisplayPNGCharacteristics;
Extension
[] exts;
};
AuthenticatorRegistrationAssertion
MembersassertionScheme
of type required DOMStringassertion
. See
UAF Supported Assertion Schemes for details.
This assertionScheme is not part of a signed object and hence considered the suspected assertionScheme.
assertion
of type required DOMStringbase64url(byte[1..4096])
Contains the TAG_UAFV1_REG_ASSERTION
object containing
the assertion scheme specific
KeyRegistrationData (KRD) object which in turn contains the newly
generated UAuth.pub
and is signed by the
Attestation Private Key.
This assertion MUST be generated by the
authenticator and it MUST be used only in this Registration operation.
The format of this assertion can vary from one assertion scheme to another
(e.g. for "UAFV1TLV" assertion scheme it MUST be TAG_UAFV1_KRD
).
tcDisplayPNGCharacteristics
of type array of DisplayPNGCharacteristicsDescriptorexts
of type array of Extension
A UAF Registration response message is represented as an array of dictionaries. Each dictionary contains a registration response for a specific protocol version. The array MUST NOT contain two dictionaries of the same protocol version. The response is defined as RegistrationResponse dictionary.
[{ "assertions": [ { "assertion": "AT7uAgM-sQALLgkAQUJDRCNBQkNEDi4HAAABAQEAAAEKLiAA9t BzZC64ecgVQBGSQb5QtEIPC8-Vav4HsHLZDflLaugJLiAAZMCPn92yHv1Ip-iCiBb6i4ADq6 ZOv569KFQCvYSJfNgNLggAAQAAAAEAAAAMLkEABJsvEtUsVKh7tmYHhJ2FBm3kHU-OCdWiUY VijgYa81MfkjQ1z6UiHbKP9_nRzIN9anprHqDGcR6q7O20q_yctZAHPjUCBi5AACv8L7YlRM x10gPnszGO6rLFqZFmmRkhtV0TIWuWqYxd1jO0wxam7i5qdEa19u4sfpHFZ9RGI_WHxINkH8 FfvAwFLu0BMIIB6TCCAY8CAQEwCQYHKoZIzj0EATB7MQswCQYDVQQGEwJVUzELMAkGA1UECA wCQ0ExCzAJBgNVBAcMAlBBMRAwDgYDVQQKDAdOTkwsSW5jMQ0wCwYDVQQLDAREQU4xMRMwEQ YDVQQDDApOTkwsSW5jIENBMRwwGgYJKoZIhvcNAQkBFg1ubmxAZ21haWwuY29tMB4XDTE0MD gyODIxMzU0MFoXDTE3MDUyNDIxMzU0MFowgYYxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQT EWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEQMA4GA1UECgwHTk5MLEluYzENMAsGA1UECwwERE FOMTETMBEGA1UEAwwKTk5MLEluYyBDQTEcMBoGCSqGSIb3DQEJARYNbm5sQGdtYWlsLmNvbT BZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCGBt3CIjnDowzSiF68C2aErYXnDUsWXOYxqIP im0OWg9FFdUYCa6AgKjn1R99Ek2d803sGKROivnavmdVH-SnEwCQYHKoZIzj0EAQNJADBGAi EAzAQujXnSS9AIAh6lGz6ydypLVTsTnBzqGJ4ypIqy_qUCIQCFsuOEGcRV-o4GHPBph_VMrG 3NpYh2GKPjsAim_cSNmQ", "assertionScheme": "UAFV1TLV" } ], "fcParams": "eyJhcHBJRCI6Imh0dHBzOi8vdWFmLXRlc3QtMS5ub2tub2t0ZXN0LmN vbTo4NDQzL1NhbXBsZUFwcC91YWYvZmFjZXRzIiwiY2hhbGxlbmdlIjoiSDlpVzl5QTlhQVh GX2xlbFFvaV9EaFVrNTE0QWQ4VHF2MHpDbkNxS0RwbyIsImNoYW5uZWxCaW5kaW5nIjp7fSw iZmFjZXRJRCI6ImNvbS5ub2tub2suYW5kcm9pZC5zYW1wbGVhcHAifQ", "header": { "appID": "https://uaf-test-1.noknoktest.com:8443/SampleApp/uaf/facets", "op": "Reg", "serverData": "IjycjPZYiWMaQ1tKLrJROiXQHmYG0tSSYGjP5mgjsDaM17RQgq0 dl3NNDDTx9d-aSR_6hGgclrU2F2Yj-12S67v5VmQHj4eWVseLulHdpk2v_hHtKSvv_DFqL4n 2IiUY6XZWVbOnvg", "upv": { "major": 1, "minor": 1 } } }]
Line breaks in fcParams have been inserted for improving readability.
Contains all fields related to the registration response.
dictionary RegistrationResponse {
required OperationHeader header;
required DOMString fcParams;
required AuthenticatorRegistrationAssertion[] assertions;
};
RegistrationResponse
Membersheader
of type required OperationHeaderHeader.op
MUST be "Reg".fcParams
of type required DOMStringFinalChallengeParams
using UTF8 encoding (see FinalChallengeParams dictionary)
which contains all parameters required
for the server to verify the Final Challenge.assertions
of type array of required AuthenticatorRegistrationAssertion
The policy contains a two-dimensional array of allowed
MatchCriteria
(see Policy). This array can be
considered a list (first dimension) of sets (second dimension)
of authenticators (identified by MatchCriteria
). All
authenticators in a specific set MUST be registered
simultaneously in order to match the policy. But any of those
sets in the list are valid, as the list elements are
alternatives.
The FIDO Server MUST follow the following steps:
p
m
.
a
to
be registered simultaneously that can be
identified by the same rule, create a
MatchCriteria object m
, where
m.aaid
MAY be combined with (one or more of) m.keyIDs
,
m.attachmentHint
, m.authenticatorVersion
,
and m.exts
, but m.aaid
MUST NOT be combined with any other match criteria field.
m.aaid
is not provided -
at least m.authenticationAlgorithms
and
m.assertionSchemes
MUST be providedm
to v
, e.g. v[j+1]=m
.v
to p.allowed
, e.g. p.allowed[i+1]=v
m[]
for all disallowed Authenticators.
m
and
add AAID and corresponding KeyIDs to
m.aaid
and m.KeyIDs
.The FIDO Server MUST include already registered
AAIDs and KeyIDs into field p.disallowed
to hint that the client
should not register these again.
m
and
add the AAIDs of all disallowed Authenticators
to m.aaid
.
The status (as provided in the metadata
TOC (Table-of-Contents file) [FIDOMetadataService]) of
some authenticators might be unacceptable. Such authenticators SHOULD
be included in p.disallowed
.
m
for other disallowed criteria
(e.g. unsupported authenticationAlgs)m
to p.disallowed
.RegistrationRequest
object r
with
appropriate r.header
for each supported version, and
r.header.serverData
.
FIDO Servers that depend on the integrity of r.header.serverData
SHOULD
apply and verify a cryptographically secure Message
Authentication Code (MAC) to serverData and they SHOULD also cryptographically bind serverData to
the related message, e.g. by re-including r.challenge
, see also section
ServerData and KeyHandle.
All other FIDO components (except the FIDO server) will treat
r.header.serverData
as an opaque value. As a consequence
the FIDO server can implement any suitable cryptographic protection method.
r.challenge
r.username
p
to r.policy
.r
to the array o
of message with various versions
(RegistrationRequest
)o
to the FIDO UAF ClientThe FIDO UAF Client MUST perform the following steps:
m
with upv set to the appropriate version number.m
RegRequest.policy.disallowed[].keyIDs
FacetID
of the requesting Application. If the AppID
is missing or
empty, set the AppID
to the FacetID
.
Verify that the FacetID
is authorized for the AppID
according to the algorithms in [FIDOAppIDAndFacets].
FacetID
of the requesting Application is not authorized, reject the operationFinalChallengeParams
structure fcp
and set fcp.appID
,
fcp.challenge
, fcp.facetID
, and
fcp.channelBinding
appropriately.
Serialize [RFC4627] fcp using UTF8 encoding and base64url
encode it.
FinalChallenge = base64url(serialize(utf8encode(fcp)))
AppID
, Username
, FinalChallenge
,
AttestationType
and all other required fields to the ASMRequest [UAFASM].The FIDO UAF Client MUST follow the server policy and find the single preferred attestation type. A single attestation type MUST be provided to the ASM.
ASMs are returning a status code in their responses to the FIDO Client. The FIDO Client needs to act on those responses and also map the status code returned the ASM [UAFASM] to an ErrorCode specified in [UAFAppAPIAndTransport].
The mapping of ASM status codes to ErrorCode is specified here:
ASM Status Code | ErrorCode | Comment |
---|---|---|
UAF_ASM_STATUS_OK |
NO_ERROR |
Pass-through success status. |
UAF_ASM_STATUS_ERROR |
UNKNOWN |
Map to UNKNOWN . |
UAF_ASM_STATUS_ACCESS_DENIED |
AUTHENTICATOR_ACCESS_DENIED |
Map to AUTHENTICATOR_ACCESS_DENIED |
UAF_ASM_STATUS_USER_CANCELLED |
USER_CANCELLED |
Pass-through status code. |
UAF_ASM_STATUS_CANNOT_RENDER_TRANSACTION_CONTENT |
INVALID_TRANSACTION_CONTENT |
Map to INVALID_TRANSACTION_CONTENT . This code indicates a problem
to be resolved by the entity providing the transaction text.
|
UAF_ASM_STATUS_KEY_DISAPPEARED_PERMANENTLY |
KEY_DISAPPEARED_PERMANENTLY |
Pass-through status code. It indicates that the Uauth key disappeared permanently and the RP App might want to trigger re-registration of the authenticator. |
UAF_ASM_STATUS_AUTHENTICATOR_DISCONNECTED |
NO_SUITABLE_AUTHENTICATOR or WAIT_USER_ACTION |
Retry operation with other suitable authenticators and map to NO_SUITABLE_AUTHENTICATOR if the problem persists.
Return WAIT_USER_ACTION if being called while retrying.
|
UAF_ASM_STATUS_USER_NOT_RESPONSIVE |
USER_NOT_RESPONSIVE |
Pass-through status code. The RP App might want to retry the operation once the user pays attention to the application again. |
UAF_ASM_STATUS_INSUFFICIENT_AUTHENTICATOR_RESOURCES |
INSUFFICIENT_AUTHENTICATOR_RESOURCES |
The FIDO Client SHALL try other authenticators matching the policy. If none exist, pass-through status code. |
UAF_ASM_STATUS_USER_LOCKOUT |
USER_LOCKOUT |
Pass-through status code. |
UAF_ASM_STATUS_USER_NOT_ENROLLED |
USER_NOT_ENROLLED |
Pass-through status code. |
Any other status code | UNKNOWN |
Map any unknown error code to UNKNOWN .
This might happen when a FIDO Client communicates with an ASM implementing a newer
UAF specification than the FIDO Client.
|
See [UAFAuthnrCommands], section "Register Command".
RegistrationResponse
messageRegistrationRequest.header
into RegistrationResponse.header
When the appID
provided in the request was empty, the
FIDO Client must set the appID
in this header to the facetID (see [FIDOAppIDAndFacets]).
RegistrationResponse.fcParams
to FinalChallenge
(base64url
encoded serialized and utf8 encoded FinalChallengeParams)RegistrationResponse.assertions
RegistrationResponse
message to FIDO ServerThe following processing rules assume that Authenticator supports "UAFV1TLV" assertion scheme. Currently "UAFV1TLV" is the only defined and supported assertion scheme. When a new assertion scheme is added to UAF protocol - this section will be extended with corresponding processing rules.
The FIDO Server MUST follow the steps:
RegistrationResponse.header.upv
) is not
supported – reject the operationRegistrationResponse.header.serverData
, if used,
passes any implementation-specific checks against its validity. See also section
ServerData and KeyHandle.
RegistrationResponse.fcParams
and convert it
into an object (fcp
)fcp.appID
corresponds to the one stored by the FIDO Server
When the appID
provided in the request was empty, the
FIDO Client must set the appID
to the facetID (see [FIDOAppIDAndFacets]).
In this case, the Uauth key cannot be used by other application facets.
fcp.facetID
is in the list of trusted FacetIDs [FIDOAppIDAndFacets]fcp.channelBinding
is as expected (see
section ChannelBinding dictionary)
There might be legitimate situations in which some methods of channel binding fail (see section 4.3.4 TLS Binding).
fcp.challenge
has really been generated by the FIDO Server
for this operation and it is not expireda
in RegistrationResponse.assertions
a.assertion
assuming it is encoded according to
the suspected assertion scheme a.assertionScheme
and make sure it
contains all mandatory fields (indicated in Authenticator Metadata) it is supposed to
have and has a valid syntax.
The AAID in TAG_UAFV1_KRD
is contained
in a.assertion.TAG_UAFV1_REG_ASSERTION.TAG_UAFV1_KRD.TAG_AAID
.
a.assertionScheme
matches Metadata(AAID).assertionScheme
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 AAID matches the policy.
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)
a.assertion
contains an object of type TAG_UAFV1_REG_ASSERTION
, then
a.assertion.TAG_UAFV1_REG_ASSERTION
contains
TAG_UAFV1_KRD
as first element:
Metadata(AAID).AttestationType
for the AAID and make sure
that a.assertion.TAG_UAFV1_REG_ASSERTION
contains the most preferred
attestation tag specified in field MatchCriteria.attestationTypes
in RegistrationRequest.policy
(if this field is present).
a.assertion.TAG_UAFV1_REG_ASSERTION
doesn't contain the
preferred attestation - it is RECOMMENDED to skip this
assertion and continue with next onea.assertion.TAG_UAFV1_REG_ASSERTION.TAG_UAFV1_KRD.FinalChallengeHash
== FCHash
Metadata(AAID).AuthenticatorVersion
for the AAID
and make sure that it is lower or equal to
a.assertion.TAG_UAFV1_REG_ASSERTION.TAG_UAFV1_KRD.AuthenticatorVersion
.
Metadata(AAID).AuthenticatorVersion
is higher (i.e. the
authenticator firmware is outdated),
it is RECOMMENDED to assume increased risk.
See sections "StatusReport dictionary" and "Metadata TOC object Processing Rules"
in [FIDOMetadataService] for more details on this.
a.assertion.TAG_UAFV1_REG_ASSERTION.TAG_UAFV1_KRD.RegCounter
is acceptable, i.e. it is either not supported (value is 0 or the field isKeyRestricted is set to 'false' in the related Metadata Statement) or it is not exceedingly high
a.assertion.TAG_UAFV1_REG_ASSERTION.TAG_UAFV1_KRD.RegCounter
is exceedingly high, this assertion might be skipped
and processing will continue with next onea.assertion.TAG_UAFV1_REG_ASSERTION
contains TAG_ATTESTATION_BASIC_FULL
tag
AttestationRootCertificates
for the AAID in the
metadata [FIDOMetadataStatement] contains at least one element:
TAG_ATTESTATION_CERT
tags from
a.assertion.TAG_UAFV1_REG_ASSERTION.TAG_ATTESTATION_BASIC_FULL
object.
The occurrences are ordered (see [UAFAuthnrCommands])
and represent the attestation certificate followed by the related
certificate chain.AttestationRootCertificates
for the AAID in authenticator Metadata, field AttestationRootCertificates
.a.assertion.TAG_UAFV1_REG_ASSERTION.TAG_UAFV1_KRD.TAG_ATTESTATION_BASIC_FULL.Signature
using the attestation certificate (obtained before).Metadata(AAID).AttestationRootCertificates
for this AAID is
empty - continue with next assertiona.assertion.TAG_UAFV1_REG_ASSERTION
contains an object of type TAG_ATTESTATION_BASIC_SURROGATE
AttestationRootCertificates
for the AAID in the
metadata is empty
a.assertion.TAG_UAFV1_REG_ASSERTION.TAG_ATTESTATION_BASIC_SURROGATE.Signature
using a.assertion.TAG_UAFV1_REG_ASSERTION.TAG_UAFV1_KRD.TAG_PUB_KEY
AttestationRootCertificates
for the AAID in the
metadata is not empty - continue with next assertion
(as the AAID obviously is expecting a different attestation method).a.assertion.TAG_UAFV1_REG_ASSERTION
contains an object of type TAG_ATTESTATION_ECDAA
ecdaaTrustAnchors
for the AAID in the
metadata [FIDOMetadataStatement] contains at least one element:
ecdaaTrustAnchors
entries, perform the
ECDAA Verify operation as specified in [FIDOEcdaaAlgorithm].
ecdaaTrustAnchors
entryMetadata(AAID).ecdaaTrustAnchors
for this AAID 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).a.assertion.TAG_UAFV1_REG_ASSERTION
contains a different object than
TAG_UAFV1_KRD
as first element, then follow the rules specific to that object.
a.assertion.TAG_UAFV1_REG_ASSERTION.TAG_UAFV1_KRD.PublicKey
into PublicKey,
a.assertion.TAG_UAFV1_REG_ASSERTION.TAG_UAFV1_KRD.KeyID
into KeyID,
a.assertion.TAG_UAFV1_REG_ASSERTION.TAG_UAFV1_KRD.SignCounter
into SignCounter,
a.assertion.TAG_UAFV1_REG_ASSERTION.TAG_UAFV1_KRD.TAG_ASSERTION_INFO.authenticatorVersion
into AuthenticatorVersion,
a.assertion.TAG_UAFV1_REG_ASSERTION.TAG_UAFV1_KRD.TAG_AAID
into AAID.
a.assertion
doesn't contain an object of type TAG_UAFV1_REG_ASSERTION
,
then skip this assertion (as in this UAF v1 only TAG_UAFV1_REG_ASSERTION
is defined).a
a.tcDisplayPNGCharacteristics
into a record
associated with the user's identity. If an entry with the same
pair of AAID and KeyID already exists then fail (should never
occur).The steps 7a and 7a and 8 to 9 are not always necessary as the related data could be cached.
The TransactionText (TranTxt) is only required in the case of Transaction Confirmation (see section 3.5.1 Transaction dictionary), it is absent in the case of a pure Authenticate operation.
During this operation, the FIDO Server asks the FIDO UAF Client to authenticate user with server-specified authenticators, and return an authentication response.
In order for this operation to succeed, the authenticator and the relying party must have a previously shared registration.
Diagram of cryptographic flow:
The FIDO Server sends the AppID
(see [FIDOAppIDAndFacets]), the
authenticator policy
and the ServerChallenge
to the FIDO UAF Client.
The FIDO UAF Client computes the hash of the
FinalChallengeParams
, produced
from the ServerChallenge
and other values, as described in this document, and sends
the AppID
and hashed FinalChallengeParams
to the Authenticator.
The authenticator creates the SignedData
object (see
TAG_UAFV1_SIGNED_DATA
in [UAFAuthnrCommands]) containing the hash of the final challenge parameters, and
some other values and signs it using the UAuth.priv
key. This assertion
is then cryptographically verified by the FIDO Server.
Contains the Transaction Content provided by the FIDO Server:
dictionary Transaction {
required DOMString contentType;
required DOMString content;
DisplayPNGCharacteristicsDescriptor tcDisplayPNGCharacteristics;
};
Transaction
MemberscontentType
of type required DOMStringThis version of the specification only supports the values
text/plain
or image/png
.
content
of type required DOMStringbase64url(byte[1...])
Contains the base64-url encoded transaction content according
to the contentType
to be shown to the user.
If contentType
is "text/plain" then the content MUST be the base64-url encoding of the ASCII
encoded text with a maximum of 200 characters.
tcDisplayPNGCharacteristics
of type DisplayPNGCharacteristicsDescriptorUAF Authentication request message is represented as an array of dictionaries. The array MUST contain exactly one dictionary. The request is defined as AuthenticationRequest dictionary.
[{ "header": { "upv": { "major": 1, "minor": 1 }, "op": "Auth", "appID": "https://uaf-test-1.noknoktest.com:8443/SampleApp/uaf/facets", "serverData": "5s7n8-7_LDAtRIKKYqbAtTTOezVKCjl2mPorYzbpxRrZ-_3wWro MXsF_pLYjNVm_l7bplAx4bkEwK6ibil9EHGfdfKOQ1q0tyEkNJFOgqdjVmLioroxgThlj8Is tpt7q" }, "challenge": "HQ1VkTUQC1NJDOo6OOWdxewrb9i5WthjfKIehFxpeuU", "policy": { "accepted": [ [ { "userVerification": 512, "keyProtection": 1, "tcDisplay": 1, "authenticationAlgorithms": [ 1 ], "assertionSchemes": [ "UAFV1TLV" ] } ], [ { "userVerification": 4, "keyProtection": 1, "tcDisplay": 1, "authenticationAlgorithms": [ 1 ], "assertionSchemes": [ "UAFV1TLV" ] } ], [ { "userVerification": 4, "keyProtection": 1, "tcDisplay": 1, "authenticationAlgorithms": [ 2 ] } ], [ { "userVerification": 2, "keyProtection": 4, "tcDisplay": 1, "authenticationAlgorithms": [ 2 ] } ], [ { "userVerification": 4, "keyProtection": 2, "tcDisplay": 1, "authenticationAlgorithms": [ 1, 3 ] } ], [ { "userVerification": 2, "keyProtection": 2, "authenticationAlgorithms": [ 2 ] } ], [ { "userVerification": 32, "keyProtection": 2, "assertionSchemes": [ "UAFV1TLV" ] }, { "userVerification": 2, "authenticationAlgorithms": [ 1, 3 ], "assertionSchemes": [ "UAFV1TLV" ] }, { "userVerification": 2, "authenticationAlgorithms": [ 1, 3 ], "assertionSchemes": [ "UAFV1TLV" ] }, { "userVerification": 4, "keyProtection": 1, "authenticationAlgorithms": [ 1, 3 ], "assertionSchemes": [ "UAFV1TLV" ] } ] ], "disallowed": [ { "userVerification": 512, "keyProtection": 16, "assertionSchemes": [ "UAFV1TLV" ] }, { "userVerification": 256, "keyProtection": 16 } ] } }]
Contains the UAF Authentication Request Message:
dictionary AuthenticationRequest {
required OperationHeader header;
required ServerChallenge challenge;
Transaction
[] transaction;
required Policy policy;
};
AuthenticationRequest
Membersheader
of type required OperationHeaderHeader.op
MUST be "Auth"challenge
of type required ServerChallengetransaction
of type array of Transaction
The list contains the same transaction content in various content types and various image sizes. Refer to [FIDOMetadataStatement] for more information about Transaction Confirmation Display characteristics.
policy
of type required PolicyRepresents a response generated by a specific Authenticator:
dictionary AuthenticatorSignAssertion {
required DOMString assertionScheme;
required DOMString assertion;
Extension
[] exts;
};
AuthenticatorSignAssertion
MembersassertionScheme
of type required DOMStringassertion
.
See