diff --git a/index.html b/index.html index c54977921..6b7a73ebe 100644 --- a/index.html +++ b/index.html @@ -4,9 +4,9 @@ Web Authentication: An API for accessing Public Key Credentials - Level - + - + - - + - + - - - - - + -

Web Authentication:
An API for accessing Public Key Credentials
Level 3

-

Editor’s Draft,

+

Editor’s Draft,

More details about this document
@@ -569,7 +931,7 @@

Web Authentication:
An API for accessing Public Key Credentials
Level
Feedback:
GitHub
Editors: -
(Microsoft) +
(independent)
(Microsoft)
(Yubico)
Former Editors: @@ -590,7 +952,7 @@

Web Authentication:
An API for accessing Public Key Credentials
Level
Giridhar Mandyam (Qualcomm)
Matthew Miller (Cisco)
Nina Satragno (Google) -
Nick Steele (Gemini) +
Nick Steele (1Password)
Jiewen Tan (Apple)
Shane Weeden (IBM)
Mike West (Google) @@ -601,7 +963,7 @@

Web Authentication:
An API for accessing Public Key Credentials
Level

- +
@@ -632,7 +994,7 @@

Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.

-

This document is governed by the 2 November 2021 W3C Process Document.

+

This document is governed by the 12 June 2023 W3C Process Document.

@@ -698,8 +1060,9 @@

Table of Contents

  • 5.1.5 Store an Existing Credential - PublicKeyCredential’s [[Store]](credential, sameOriginWithAncestors) Method
  • 5.1.6 Preventing Silent Access to an Existing Credential - PublicKeyCredential’s [[preventSilentAccess]](credential, sameOriginWithAncestors) Method
  • 5.1.7 Availability of User-Verifying Platform Authenticator - PublicKeyCredential’s isUserVerifyingPlatformAuthenticatorAvailable() Method -
  • 5.1.8 Deserialize Registration ceremony options - PublicKeyCredential’s parseCreationOptionsFromJSON() Method -
  • 5.1.9 Deserialize Authentication ceremony options - PublicKeyCredential’s parseRequestOptionsFromJSON() Methods +
  • 5.1.8 Availability of a passkey platform authenticator - PublicKeyCredential’s isPasskeyPlatformAuthenticatorAvailable() Method +
  • 5.1.9 Deserialize Registration ceremony options - PublicKeyCredential’s parseCreationOptionsFromJSON() Method +
  • 5.1.10 Deserialize Authentication ceremony options - PublicKeyCredential’s parseRequestOptionsFromJSON() Methods
  • 5.2 Authenticator Responses (interface AuthenticatorResponse) @@ -748,6 +1111,7 @@

    Table of Contents

  • 5.8.4 Authenticator Transport Enumeration (enum AuthenticatorTransport)
  • 5.8.5 Cryptographic Algorithm Identifier (typedef COSEAlgorithmIdentifier)
  • 5.8.6 User Verification Requirement Enumeration (enum UserVerificationRequirement) +
  • 5.8.7 User-agent Hints Enumeration (enum PublicKeyCredentialHints)
  • 5.9 Permissions Policy integration
  • 5.10 Using Web Authentication within iframe elements @@ -920,6 +1284,7 @@

    Table of Contents

  • 13.4.6 Credential Loss and Key Mobility
  • 13.4.7 Unprotected account detection
  • 13.4.8 Code injection attacks +
  • 13.4.9 Validating the origin of a credential
  • @@ -1584,10 +1949,11 @@

    Authenticator
    WebAuthn Authenticator
    -

    A cryptographic entity, existing in hardware or software, that can register a user with a given Relying Party and later assert possession of the registered public key credential, and optionally verify the user, when requested by the Relying Party. Authenticators can report information -regarding their type and security characteristics via attestation during registration.

    +

    A cryptographic entity, existing in hardware or software, that can register a user with a given Relying Party and later assert possession of the registered public key credential, and optionally verify the user to the Relying Party. Authenticators can report information +regarding their type and security characteristics via attestation during registration and assertion.

    A WebAuthn Authenticator could be a roaming authenticator, a dedicated hardware subsystem integrated into the client device, -or a software component of the client or client device.

    +or a software component of the client or client device. A WebAuthn Authenticator is not necessarily confined to operating in +a local context, and can generate or store a credential key pair in a server outside of client-side hardware.

    In general, an authenticator is assumed to have only one user. If multiple natural persons share access to an authenticator, they are considered to represent the same user in the context of that authenticator. @@ -1626,7 +1992,7 @@

    created on an authenticator"

    A public key credential source or public key credential is said to be bound to its managing -authenticator. This means that only the managing authenticator can generate assertions for the public key +authenticator. This means that only the managing authenticator can generate assertions for the public key credential sources bound to it.

    This may also be expressed as "the managing authenticator contains the bound credential", or "the bound credential was created on its managing authenticator". @@ -1669,6 +2035,7 @@

    Client-side discoverable Public Key Credential Source
    Client-side discoverable Credential
    Discoverable Credential +
    Passkey
    [DEPRECATED] Resident Credential
    [DEPRECATED] Resident Key
    @@ -1684,7 +2051,7 @@

    discoverable credential capable authenticator can generate an assertion signature for a discoverable credential given only an RP ID, which in turn necessitates that the public key credential source is stored in the authenticator or client platform. This is in contrast to a Server-side Public Key Credential Source, -which requires that the authenticator is given both the RP ID and the credential ID but does not require client-side storage of the public key credential source.

    +which requires that the authenticator is given both the RP ID and the credential ID but does not require client-side storage of the public key credential source.

    See also: client-side credential storage modality and non-discoverable credential.

    Note: Client-side discoverable credentials are also usable in authentication ceremonies where credential IDs are given, i.e., when calling navigator.credentials.get() with a non-empty allowCredentials argument.

    @@ -1712,14 +2079,14 @@

    User Public Key
    User Credential
    -

    A credential key pair is a pair of asymmetric cryptographic keys generated by an authenticator and scoped to a specific WebAuthn Relying Party. It is the central part of a public key credential.

    -

    A credential public key is the public key portion of a credential key pair. +

    A credential key pair is a pair of asymmetric cryptographic keys generated by an authenticator and scoped to a specific WebAuthn Relying Party. It is the central part of a public key credential.

    +

    A credential public key is the public key portion of a credential key pair. The credential public key is returned to the Relying Party during a registration ceremony.

    -

    A credential private key is the private key portion of a credential key pair. +

    A credential private key is the private key portion of a credential key pair. The credential private key is bound to a particular authenticator - its managing authenticator - and is expected to never be exposed to any other party, not even to the owner of the authenticator.

    Note that in the case of self -attestation, the credential key pair is also used as the attestation key pair, see self attestation for details.

    +attestation, the credential key pair is also used as the attestation key pair, see self attestation for details.

    Note: The credential public key is referred to as the user public key in FIDO UAF [UAFProtocol], and in FIDO U2F [FIDO-U2F-Message-Formats] and some parts of this specification that relate to it.

    Credential Properties
    @@ -1857,7 +2224,7 @@

    userHandle

    The user handle associated when this public key credential source was created. This item is -nullable.

    +nullable, however user handle MUST always be populated for discoverable credentials.

    otherUI

    OPTIONAL other information used by the authenticator to inform its UI. For example, this might include the user’s displayName. otherUI is a mutable item and SHOULD NOT be bound to the public key credential source in a way that prevents otherUI from being updated.

    @@ -1931,7 +2298,7 @@

    public key credential source that is only usable in an authentication ceremony when the Relying Party supplies its credential ID in navigator.credentials.get()'s allowCredentials argument. This means that the Relying Party must manage the credential’s storage and discovery, as well as be able to first identify the user in order to discover the credential IDs to supply in the navigator.credentials.get() call.

    -

    Client-side storage of the public key credential source is not required for a server-side credential. +

    Client-side storage of the public key credential source is not required for a server-side credential. This is in contrast to a client-side discoverable credential, which instead does not require the user to first be identified in order to provide the user’s credential IDs to a navigator.credentials.get() call.

    @@ -1947,7 +2314,7 @@

    user account denotes the mapping of a set of credentials [CREDENTIAL-MANAGEMENT-1] to a (sub)set of a Relying Party's resources, as maintained and authorized by the Relying Party. -The Relying Party maps a given public key credential to a user account by assigning a user account-specific value to the credential’s user handle and storing a credential record for the credential in the user account. +The Relying Party maps a given public key credential to a user account by assigning a user account-specific value to the credential’s user handle and storing a credential record for the credential in the user account. This mapping, the set of credentials, and their authorizations, may evolve over time. A given user account might be accessed by one or more natural persons (also known as "users"), and one natural person might have access to one or more user accounts, @@ -1958,15 +2325,16 @@

    authorization gesture is a ceremony component often employed to indicate user consent.

    User Handle
    -

    A user handle is an identifier for a user account, specified by the Relying Party as user.id during registration. Discoverable credentials store this identifier and return it as response.userHandle in authentication ceremonies started with an empty allowCredentials argument.

    -

    The main use of the user handle is to identify the user account in such authentication ceremonies, +

    A user handle is an identifier for a user account, specified by the Relying Party as user.id during registration. Discoverable credentials store this identifier and MUST return it as response.userHandle in authentication ceremonies started with an empty allowCredentials argument.

    +

    The main use of the user handle is to identify the user account in such authentication ceremonies, but the credential ID could be used instead. The main differences are -that the credential ID is chosen by the authenticator and unique for each credential, -while the user handle is chosen by the Relying Party and ought to be the same +that the credential ID is chosen by the authenticator and is unique for each credential, +while the user handle is chosen by the Relying Party and ought to be the same for all credentials registered to the same user account.

    -

    Authenticators map pairs of RP ID and user handle to public key credential sources. -As a consequence, an authenticator will store at most one discoverable credential per user handle per Relying Party.

    +

    Authenticators map pairs of RP ID and user handle to public key credential sources. +As a consequence, an authenticator will store at most one discoverable credential per user handle per Relying Party. Therefore +a secondary use of the user handle is to allow authenticators to know when to replace an existing discoverable credential with a new one during the registration ceremony.

    A user handle is an opaque byte sequence with a maximum size of 64 bytes, and is not meant to be displayed to the user. It MUST NOT contain personally identifying information, see § 14.6.1 User Handle Contents.

    User Present @@ -1975,23 +2343,23 @@

    present".

    User Verification
    -

    The technical process by which an authenticator locally authorizes the invocation of the authenticatorMakeCredential and authenticatorGetAssertion operations. User verification MAY be instigated +

    The technical process by which an authenticator locally authorizes the invocation of the authenticatorMakeCredential and authenticatorGetAssertion operations. User verification MAY be instigated through various authorization gesture modalities; for example, through a touch plus pin code, password entry, or biometric recognition (e.g., presenting a fingerprint) [ISOBiometricVocabulary]. The intent is to distinguish individual users. See also § 6.2.3 Authentication Factor Capability.

    Note that user verification does not give the Relying Party a concrete identification of the user, but when 2 or more ceremonies with user verification have been done with that credential it expresses that it was the same user that performed all of them. The same user might not always be the same natural person, however, -if multiple natural persons share access to the same authenticator.

    +if multiple natural persons share access to the same authenticator.

    Note: Distinguishing natural persons depends in significant part upon the client platform's -and authenticator's capabilities. +and authenticator's capabilities. For example, some devices are intended to be used by a single individual, yet they may allow multiple natural persons to enroll fingerprints or know the same PIN and thus access the same user account(s) using that device.

    Note: Invocation of the authenticatorMakeCredential and authenticatorGetAssertion operations implies use of key material managed by the authenticator. -

    Also, for security, user verification and use of credential private keys must all occur within the logical security boundary defining the authenticator.

    +

    Also, for security, user verification and use of credential private keys must all occur within the logical security boundary defining the authenticator.

    User verification procedures MAY implement rate limiting as a protection against brute force attacks.

    User Verified @@ -2000,7 +2368,7 @@

    5. Web Authentication API

    This section normatively specifies the API for creating and using public key credentials. The basic -idea is that the credentials belong to the user and are managed by a WebAuthn Authenticator, with which the WebAuthn Relying Party interacts through the client platform. Relying Party scripts can (with the user’s consent) request the +idea is that the credentials belong to the user and are managed by a WebAuthn Authenticator, with which the WebAuthn Relying Party interacts through the client platform. Relying Party scripts can (with the user’s consent) request the browser to create a new credential for future use by the Relying Party. See Figure , below.

    @@ -2027,10 +2395,10 @@

    5. is created as well as in all assertions produced by WebAuthn credentials.

    Additionally, to maintain user privacy and prevent malicious Relying Parties from probing for the presence of public key credentials belonging to other Relying Parties, each credential is also scoped to a Relying Party -Identifier, or RP ID. This RP ID is provided by the client to the authenticator for all operations, and the authenticator ensures that credentials created by a Relying Party can only be used in operations +Identifier, or RP ID. This RP ID is provided by the client to the authenticator for all operations, and the authenticator ensures that credentials created by a Relying Party can only be used in operations requested by the same RP ID. Separating the origin from the RP ID in this way allows the API to be used in cases where a single Relying Party maintains multiple origins.

    -

    The client facilitates these security measures by providing the Relying Party's origin and RP ID to the authenticator for +

    The client facilitates these security measures by providing the Relying Party's origin and RP ID to the authenticator for each operation. Since this is an integral part of the WebAuthn security model, user agents only expose this API to callers in secure contexts. For web contexts in particular, this only includes those accessed via a secure transport (e.g., TLS) established without errors.

    @@ -2059,7 +2427,7 @@

    This attribute returns the ArrayBuffer contained in the [[identifier]] internal slot.

    response, of type AuthenticatorResponse, readonly
    -

    This attribute contains the authenticator's response to the client’s request to either create a public key +

    This attribute contains the authenticator's response to the client’s request to either create a public key credential, or generate an authentication assertion. If the PublicKeyCredential is created in response to create(), this attribute’s value will be an AuthenticatorAttestationResponse, otherwise, the PublicKeyCredential was created in response to get(), and this attribute’s value will be an AuthenticatorAssertionResponse.

    @@ -2069,9 +2437,9 @@

    AuthenticatorAttachment. Relying Parties SHOULD treat unknown values as if the value were null.

    - Note: If, as the result of a registration or authentication ceremony, authenticatorAttachment's value is "cross-platform" and + Note: If, as the result of a registration or authentication ceremony, authenticatorAttachment's value is "cross-platform" and concurrently isUserVerifyingPlatformAuthenticatorAvailable returns true, then the user employed a roaming authenticator for this ceremony while there is an available platform authenticator. Thus the Relying Party has the opportunity to prompt the user to register the available platform authenticator, which may enable more streamlined user experience flows. -

    An authenticator’s attachment modality could change over time. +

    An authenticator’s attachment modality could change over time. For example, a mobile phone might at one time only support platform attachment but later receive updates to support cross-platform attachment as well.

    getClientExtensionResults() @@ -2094,6 +2462,8 @@

    [IANA-WebAuthn-Registries] but not defined in § 9 WebAuthn Extensions.

    The AuthenticatorAttestationResponseJSON.transports member MUST be set to the output of getTransports().

    +

    The AuthenticatorAttestationResponseJSON.publicKey member MUST be set to the output of getPublicKey().

    +

    The AuthenticatorAttestationResponseJSON.publicKeyAlgorithm member MUST be set to the output of getPublicKeyAlgorithm().

    typedef DOMString Base64URLString;
     typedef (RegistrationResponseJSON or AuthenticationResponseJSON) PublicKeyCredentialJSON;
    @@ -2109,13 +2479,24 @@ 

    dictionary AuthenticatorAttestationResponseJSON { required Base64URLString clientDataJSON; - required Base64URLString attestationObject; + required Base64URLString authenticatorData; required sequence<DOMString> transports; + // The publicKey field will be missing if pubKeyCredParams was used to + // negotiate a public-key algorithm that the user agent doesn’t + // understand. (See section “Easily accessing credential data” for a + // list of which algorithms user agents must support.) If using such an + // algorithm then the public key must be parsed directly from + // attestationObject or authenticatorData. + Base64URLString publicKey; + required long long publicKeyAlgorithm; + // This value contains copies of some of the fields above. See + // section “Easily accessing credential data”. + required Base64URLString attestationObject; }; dictionary AuthenticationResponseJSON { - required Base64URLString id; - required Base64URLString rawId; + required Base64URLString id; + required Base64URLString rawId; required AuthenticatorAssertionResponseJSON response; DOMString authenticatorAttachment; required AuthenticationExtensionsClientOutputsJSON clientExtensionResults; @@ -2123,10 +2504,11 @@

    dictionary AuthenticatorAssertionResponseJSON { - required Base64URLString clientDataJSON; - required Base64URLString authenticatorData; - required Base64URLString signature; - Base64URLString userHandle; + required Base64URLString clientDataJSON; + required Base64URLString authenticatorData; + required Base64URLString signature; + Base64URLString userHandle; + Base64URLString attestationObject; }; dictionary AuthenticationExtensionsClientOutputsJSON { @@ -2148,14 +2530,14 @@

    credential ID is used to look up credentials for use, and is therefore expected to be globally unique with high probability across all credentials of the same type, across all authenticators.

    Note: This API does not constrain -the format or length of this identifier, except that it MUST be sufficient for the authenticator to uniquely select a key. +the format or length of this identifier, except that it MUST be sufficient for the authenticator to uniquely select a key. For example, an authenticator without on-board storage may create identifiers containing a credential private key wrapped with a symmetric key that is burned into the authenticator.

    [[clientExtensionsResults]]

    This internal slot contains the results of processing client extensions requested by the Relying Party upon the Relying Party's invocation of either navigator.credentials.create() or navigator.credentials.get().

    -

    PublicKeyCredential's interface object inherits Credential's implementation of [[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors), and defines its own -implementation of [[Create]](origin, options, sameOriginWithAncestors), [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors), and [[Store]](credential, sameOriginWithAncestors).

    +

    PublicKeyCredential's interface object inherits Credential's implementation of [[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors), and defines its own +implementation of each of [[Create]](origin, options, sameOriginWithAncestors), [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors), and [[Store]](credential, sameOriginWithAncestors).

    5.1.1. CredentialCreationOptions Dictionary Extension

    To support registration via navigator.credentials.create(), this document extends the CredentialCreationOptions dictionary as follows:

    @@ -2172,7 +2554,7 @@

    5.1.3. Create a New Credential - PublicKeyCredential’s [[Create]](origin, options, sameOriginWithAncestors) Method

    PublicKeyCredential's interface object's implementation of the [[Create]](origin, -options, sameOriginWithAncestors) internal method [CREDENTIAL-MANAGEMENT-1] allows WebAuthn Relying Party scripts to call navigator.credentials.create() to request the creation of a new public key credential source, bound to an authenticator. This navigator.credentials.create() operation can be aborted by leveraging the AbortController; +options, sameOriginWithAncestors) internal method [CREDENTIAL-MANAGEMENT-1] allows WebAuthn Relying Party scripts to call navigator.credentials.create() to request the creation of a new public key credential source, bound to an authenticator. This navigator.credentials.create() operation can be aborted by leveraging the AbortController; see DOM § 3.3 Using AbortController and AbortSignal objects in APIs for detailed instructions.

    This internal method accepts three arguments:

    @@ -2327,9 +2709,11 @@

    Let issuedRequests be a new ordered set.

  • -

    Let authenticators represent a value which at any given instant is a set of client platform-specific handles, where each item identifies an authenticator presently available on this client platform at that instant.

    -

    Note: What qualifies an authenticator as "available" is intentionally unspecified; this is meant to represent how authenticators can be hot-plugged into (e.g., via USB) +

    Let authenticators represent a value which at any given instant is a set of client platform-specific handles, where each item identifies an authenticator presently available on this client platform at that instant.

    +

    Note: What qualifies an authenticator as "available" is intentionally unspecified; this is meant to represent how authenticators can be hot-plugged into (e.g., via USB) or discovered (e.g., via NFC or Bluetooth) by the client by various mechanisms, or permanently built into the client.

    +
  • +

    Consider the value of hints and craft the user interface accordingly, as the user-agent sees fit.

  • Start lifetimeTimer.

  • @@ -2452,7 +2836,7 @@

    If C.transports is not empty, and authenticator is connected over a transport not mentioned in C.transports, the client MAY continue.

    Note: If the client chooses to continue, this could result in -inadvertently registering multiple credentials bound to the same authenticator if the transport hints in C.transports are not accurate. +inadvertently registering multiple credentials bound to the same authenticator if the transport hints in C.transports are not accurate. For example, stored transport hints could become inaccurate as a result of software upgrades adding new connectivity options.

  • @@ -2475,7 +2859,7 @@

    Remove authenticator from issuedRequests.

  • For each remaining authenticator in issuedRequests invoke the authenticatorCancel operation on authenticator and remove it from issuedRequests.

    -

    Note: Authenticators may return an indication of "the user cancelled the entire operation". +

    Note: Authenticators may return an indication of "the user cancelled the entire operation". How a user agent manifests this state to users is unspecified.

    If any authenticator returns an error status equivalent to "InvalidStateError", @@ -2545,7 +2929,7 @@

    Anonymization CA).

    direct or enterprise
    -

    Convey the authenticator's AAGUID and attestation statement, unaltered, to the Relying Party.

    +

    Convey the authenticator's AAGUID and attestation statement, unaltered, to the Relying Party.

  • Let attestationObject be a new ArrayBuffer, created using global’s %ArrayBuffer%, containing the @@ -2576,7 +2960,7 @@

    A sequence of zero or more unique DOMStrings, in lexicographical order, that the authenticator is believed to support. The values SHOULD be members of AuthenticatorTransport, but client platforms MUST ignore unknown values.

    If a user agent does not wish to divulge this information it MAY substitute an arbitrary sequence designed to preserve privacy. This sequence MUST still be valid, i.e. lexicographically sorted and free of duplicates. For example, it may use the empty sequence. Either way, in this case the user agent takes the risk that Relying Party behavior may be suboptimal.

    If the user agent does not have any transport information, it SHOULD set this field to the empty sequence.

    -

    Note: How user agents discover transports supported by a given authenticator is outside the scope of this specification, but may include information from an attestation certificate (for example [FIDO-Transports-Ext]), metadata communicated in an authenticator protocol such as CTAP2, or special-case knowledge about a platform authenticator.

    +

    Note: How user agents discover transports supported by a given authenticator is outside the scope of this specification, but may include information from an attestation certificate (for example [FIDO-Transports-Ext]), metadata communicated in an authenticator protocol such as CTAP2, or special-case knowledge about a platform authenticator.

    [[clientExtensionsResults]]
    @@ -2607,7 +2991,7 @@

    user mediation (roughly, this specification’s authorization gesture), and if it does not find exactly one of those, it then calls PublicKeyCredential.[[DiscoverFromExternalSource]]() to have the user select a public key credential source.

    -

    Since this specification requires an authorization gesture to create any assertions, the PublicKeyCredential.[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors) internal method inherits the default behavior of Credential.[[CollectFromCredentialStore]](), of returning an empty set.

    +

    Since this specification requires an authorization gesture to create any assertions, the PublicKeyCredential.[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors) internal method inherits the default behavior of Credential.[[CollectFromCredentialStore]](), of returning an empty set.

    In general, the user agent SHOULD show some UI to the user to guide them in selecting and authorizing an authenticator with which to complete the operation. By setting options.mediation to conditional, Relying Parties can indicate that a prominent modal UI should not be shown unless credentials are discovered. Relying Party script SHOULD first check that isConditionalMediationAvailable() returns true in order to avoid the possibility of causing a user-visible error to be returned if the user agent does not support conditional user mediation.

    @@ -2722,9 +3106,13 @@
    origin

    The serialization of callerOrigin.

    +
    topOrigin +
    +

    The serialization of callerOrigin’s top-level origin if +the sameOriginWithAncestors argument passed to this internal method is false, else undefined.

    crossOrigin
    -

    The inverse of the value of the sameOriginWithAncestors argument passed to this internal method.

    +

    The inverse of the value of the sameOriginWithAncestors argument passed to this internal method.

  • Let clientDataJSON be the JSON-compatible serialization of client data constructed from collectedClientData.

    @@ -2738,11 +3126,13 @@
  • 5.2.1. Information About Public Key Credential (interface AuthenticatorAttestationResponse)

    -

    The AuthenticatorAttestationResponse interface represents the authenticator's response to a client’s request +

    The AuthenticatorAttestationResponse interface represents the authenticator's response to a client’s request for the creation of a new public key credential. It contains information about the new credential that can be used to -identify it for later use, and metadata that can be used by the WebAuthn Relying Party to assess the characteristics of the credential +identify it for later use, and metadata that can be used by the WebAuthn Relying Party to assess the characteristics of the credential during registration.

    [SecureContext, Exposed=Window]
     interface AuthenticatorAttestationResponse : AuthenticatorResponse {
         [SameObject] readonly attribute ArrayBuffer      attestationObject;
    -    sequence<DOMString>                              getTransports();
    +    sequence<DOMString>                              getTransports();
         ArrayBuffer                                      getAuthenticatorData();
         ArrayBuffer?                                     getPublicKey();
         COSEAlgorithmIdentifier                          getPublicKeyAlgorithm();
    @@ -3201,7 +3614,7 @@ 
    id, of type BufferSource
    -

    The user handle of the user account. -A user handle is an opaque byte sequence with a maximum size of 64 bytes, +

    The user handle of the user account. +A user handle is an opaque byte sequence with a maximum size of 64 bytes, and is not meant to be displayed to the user.

    To ensure secure operation, authentication and authorization decisions MUST be made on the basis of this id member, not the displayName nor name members. See Section 6.1 of [RFC8266].

    -

    The user handle MUST NOT contain personally identifying information about the user, such as a username or e-mail address; -see § 14.6.1 User Handle Contents for details. The user handle MUST NOT be empty.

    -

    Note: the user handle ought not be a constant value across different user accounts, -even for non-discoverable credentials, because some authenticators always create discoverable credentials. -Thus a constant user handle would prevent a user from using such an authenticator -with more than one user account at the Relying Party.

    -
    displayName, of type DOMString +

    The user handle MUST NOT contain personally identifying information about the user, such as a username or e-mail address; +see § 14.6.1 User Handle Contents for details. The user handle MUST NOT be empty.

    +

    Note: the user handle ought not be a constant value across different user accounts, +even for non-discoverable credentials, because some authenticators always create discoverable credentials. +Thus a constant user handle would prevent a user from using such an authenticator +with more than one user account at the Relying Party.

    +
    displayName, of type DOMString
    -

    A human-palatable name for the user account, intended only for display. For example, "Alex Müller" or "田中倫". The Relying Party SHOULD let the user choose this, and SHOULD NOT restrict the choice more than necessary.

    +

    A human-palatable name for the user account, intended only for display. For example, "Alex Müller" or "田中倫". The Relying Party SHOULD let the user choose this, and SHOULD NOT restrict the choice more than necessary.

    -

    When clients, client platforms, or authenticators display a displayName's value, they should always use UI elements to provide a clear boundary around the displayed value, and not allow overflow into other elements [css-overflow-3].

    -

    Authenticators MUST accept and store a 64-byte minimum length for a displayName member’s value. Authenticators MAY truncate a displayName member’s value so that it fits within 64 bytes. See § 6.4.1 String Truncation about truncation and other considerations.

    +

    When clients, client platforms, or authenticators display a displayName's value, they should always use UI elements to provide a clear boundary around the displayed value, and not allow overflow into other elements [css-overflow-3].

    +

    Authenticators MUST accept and store a 64-byte minimum length for a displayName member’s value. Authenticators MAY truncate a displayName member’s value so that it fits within 64 bytes. See § 6.4.1 String Truncation about truncation and other considerations.

    5.4.4. Authenticator Selection Criteria (dictionary AuthenticatorSelectionCriteria)

    -

    WebAuthn Relying Parties may use the AuthenticatorSelectionCriteria dictionary to specify their requirements regarding authenticator +

    WebAuthn Relying Parties may use the AuthenticatorSelectionCriteria dictionary to specify their requirements regarding authenticator attributes.

    dictionary AuthenticatorSelectionCriteria {
    -    DOMString                    authenticatorAttachment;
    -    DOMString                    residentKey;
    -    boolean                      requireResidentKey = false;
    -    DOMString                    userVerification = "preferred";
    +    DOMString                    authenticatorAttachment;
    +    DOMString                    residentKey;
    +    boolean                      requireResidentKey = false;
    +    DOMString                    userVerification = "preferred";
     };
     
    -
    authenticatorAttachment, of type DOMString +
    authenticatorAttachment, of type DOMString
    -

    If this member is present, eligible authenticators are filtered to be only those authenticators attached with the specified authenticator attachment modality (see also § 6.2.1 Authenticator Attachment Modality). +

    If this member is present, eligible authenticators are filtered to be only those authenticators attached with the specified authenticator attachment modality (see also § 6.2.1 Authenticator Attachment Modality). If this member is absent, then any attachment modality is acceptable. -The value SHOULD be a member of AuthenticatorAttachment but client platforms MUST ignore unknown values, +The value SHOULD be a member of AuthenticatorAttachment but client platforms MUST ignore unknown values, treating an unknown value as if the member does not exist.

    -

    See also the authenticatorAttachment member of PublicKeyCredential, +

    See also the authenticatorAttachment member of PublicKeyCredential, which can tell what authenticator attachment modality was used in a successful create() or get() operation.

    -
    residentKey, of type DOMString +
    residentKey, of type DOMString
    -

    Specifies the extent to which the Relying Party desires to create a client-side discoverable credential. For historical reasons the naming retains the deprecated “resident” terminology. The value SHOULD be a member of ResidentKeyRequirement but client platforms MUST ignore unknown values, treating an unknown value as if the member does not exist. If no value is given then the effective value is required if requireResidentKey is true or discouraged if it is false or absent.

    +

    Specifies the extent to which the Relying Party desires to create a client-side discoverable credential. For historical reasons the naming retains the deprecated “resident” terminology. The value SHOULD be a member of ResidentKeyRequirement but client platforms MUST ignore unknown values, treating an unknown value as if the member does not exist. If no value is given then the effective value is required if requireResidentKey is true or discouraged if it is false or absent.

    See ResidentKeyRequirement for the description of residentKey's values and semantics.

    -
    requireResidentKey, of type boolean, defaulting to false +
    requireResidentKey, of type boolean, defaulting to false
    -

    This member is retained for backwards compatibility with WebAuthn Level 1 and, for historical reasons, its naming retains the deprecated “resident” terminology for discoverable credentials. Relying Parties SHOULD set it to true if, and only if, residentKey is set to required.

    -
    userVerification, of type DOMString, defaulting to "preferred" +

    This member is retained for backwards compatibility with WebAuthn Level 1 and, for historical reasons, its naming retains the deprecated “resident” terminology for discoverable credentials. Relying Parties SHOULD set it to true if, and only if, residentKey is set to required.

    +
    userVerification, of type DOMString, defaulting to "preferred"
    -

    This member specifies the Relying Party's requirements regarding user verification for the create() operation. -The value SHOULD be a member of UserVerificationRequirement but client platforms MUST ignore unknown values, treating an unknown value as if the member does not exist.

    +

    This member specifies the Relying Party's requirements regarding user verification for the create() operation. +The value SHOULD be a member of UserVerificationRequirement but client platforms MUST ignore unknown values, treating an unknown value as if the member does not exist.

    See UserVerificationRequirement for the description of userVerification's values and semantics.

    5.4.5. Authenticator Attachment Enumeration (enum AuthenticatorAttachment)

    -

    This enumeration’s values describe authenticators' attachment modalities. Relying Parties use this to express a preferred authenticator attachment modality when calling navigator.credentials.create() to create a credential, and clients use this to report the authenticator attachment modality used to complete a registration or authentication ceremony.

    +

    This enumeration’s values describe authenticators' attachment modalities. Relying Parties use this to express a preferred authenticator attachment modality when calling navigator.credentials.create() to create a credential, and clients use this to report the authenticator attachment modality used to complete a registration or authentication ceremony.

    enum AuthenticatorAttachment {
         "platform",
         "cross-platform"
    @@ -3537,9 +3956,9 @@ 

    Note: An authenticator attachment modality selection option is available only in the [[Create]](origin, options, -sameOriginWithAncestors) operation. The Relying Party may use it to, for example, ensure the user has a roaming credential for +sameOriginWithAncestors) operation. The Relying Party may use it to, for example, ensure the user has a roaming credential for authenticating on another client device; or to specifically register a platform credential for easier reauthentication using a -particular client device. The [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) operation has no authenticator attachment modality selection option, so the Relying Party SHOULD accept any of the user’s registered credentials. The client and user will then use whichever is available and convenient at the time.

    +particular client device. The [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) operation has no authenticator attachment modality selection option, so the Relying Party SHOULD accept any of the user’s registered credentials. The client and user will then use whichever is available and convenient at the time.

    5.4.6. Resident Key Requirement Enumeration (enum ResidentKeyRequirement)

    enum ResidentKeyRequirement {
         "discouraged",
    @@ -3548,29 +3967,29 @@ 

    };

    Note: The ResidentKeyRequirement enumeration is deliberately not referenced, see § 2.1.1 Enumerations as DOMString types.

    -

    This enumeration’s values describe the Relying Party's requirements for client-side discoverable credentials (formerly known as resident credentials or resident keys):

    +

    This enumeration’s values describe the Relying Party's requirements for client-side discoverable credentials (formerly known as resident credentials or resident keys):

    discouraged
    -

    The Relying Party prefers creating a server-side credential, but will accept a client-side discoverable credential. -The client and authenticator SHOULD create a server-side credential if possible.

    -

    Note: A Relying Party cannot require that a created credential is a server-side credential and the Credential Properties Extension may not return a value for the rk property. Because of this, it may be the case that it does not know if a credential is a server-side credential or not and thus does not know whether creating a second credential with the same user handle will evict the first.

    +

    The Relying Party prefers creating a server-side credential, but will accept a client-side discoverable credential. +The client and authenticator SHOULD create a server-side credential if possible.

    +

    Note: A Relying Party cannot require that a created credential is a server-side credential and the Credential Properties Extension may not return a value for the rk property. Because of this, it may be the case that it does not know if a credential is a server-side credential or not and thus does not know whether creating a second credential with the same user handle will evict the first.

    preferred
    -

    The Relying Party strongly prefers creating a client-side discoverable credential, but will accept a server-side credential. -The client and authenticator SHOULD create a discoverable credential if possible. -For example, the client SHOULD guide the user through setting up user verification if needed to create a discoverable credential. This takes precedence over the setting of userVerification.

    +

    The Relying Party strongly prefers creating a client-side discoverable credential, but will accept a server-side credential. +The client and authenticator SHOULD create a discoverable credential if possible. +For example, the client SHOULD guide the user through setting up user verification if needed to create a discoverable credential. This takes precedence over the setting of userVerification.

    required
    -

    The Relying Party requires a client-side discoverable credential. -The client MUST return an error if a client-side discoverable credential cannot be created.

    +

    The Relying Party requires a client-side discoverable credential. +The client MUST return an error if a client-side discoverable credential cannot be created.

    -

    Note: The Relying Party can seek information on whether or not the authenticator created a client-side discoverable credential using the resident key credential property of the Credential Properties Extension. -This is useful when values of discouraged or preferred are used for options.authenticatorSelection.residentKey, because in those cases it is possible for an authenticator to create either a client-side discoverable credential or a server-side credential.

    +

    Note: The Relying Party can seek information on whether or not the authenticator created a client-side discoverable credential using the resident key credential property of the Credential Properties Extension. +This is useful when values of discouraged or preferred are used for options.authenticatorSelection.residentKey, because in those cases it is possible for an authenticator to create either a client-side discoverable credential or a server-side credential.

    5.4.7. Attestation Conveyance Preference Enumeration (enum AttestationConveyancePreference)

    -

    WebAuthn Relying Parties may use AttestationConveyancePreference to specify their preference regarding attestation conveyance during credential generation.

    +

    WebAuthn Relying Parties may use AttestationConveyancePreference to specify their preference regarding attestation conveyance during credential generation.

    enum AttestationConveyancePreference {
         "none",
         "indirect",
    @@ -3583,27 +4002,27 @@ 

    none
    -

    The Relying Party is not interested in authenticator attestation. For example, in order to -potentially avoid having to obtain user consent to relay identifying information to the Relying Party, or to save a +

    The Relying Party is not interested in authenticator attestation. For example, in order to +potentially avoid having to obtain user consent to relay identifying information to the Relying Party, or to save a roundtrip to an Attestation CA or Anonymization CA. -If the authenticator generates an attestation statement that is not a self attestation, -the client will replace it with a None attestation statement.

    +If the authenticator generates an attestation statement that is not a self attestation, +the client will replace it with a None attestation statement.

    This is the default, and unknown values fall back to the behavior of this value.

    indirect
    -

    The Relying Party wants to receive a verifiable attestation statement, -but allows the client to decide how to obtain such an attestation statement. +

    The Relying Party wants to receive a verifiable attestation statement, +but allows the client to decide how to obtain such an attestation statement. The client MAY replace an authenticator-generated attestation statement with one generated by an Anonymization CA, -in order to protect the user’s privacy, or to assist Relying Parties with attestation verification in a heterogeneous ecosystem.

    -

    Note: There is no guarantee that the Relying Party will obtain a verifiable attestation statement in this case. -For example, in the case that the authenticator employs self attestation and the client passes the attestation statement through unmodified.

    +in order to protect the user’s privacy, or to assist Relying Parties with attestation verification in a heterogeneous ecosystem.

    +

    Note: There is no guarantee that the Relying Party will obtain a verifiable attestation statement in this case. +For example, in the case that the authenticator employs self attestation and the client passes the attestation statement through unmodified.

    direct
    -

    The Relying Party wants to receive the attestation statement as generated by the authenticator.

    +

    The Relying Party wants to receive the attestation statement as generated by the authenticator.

    enterprise
    -

    The Relying Party wants to receive an attestation statement that may include uniquely identifying information. This is intended for controlled deployments within an enterprise where the organization wishes to tie registrations to specific authenticators. User agents MUST NOT provide such an attestation unless the user agent or authenticator configuration permits it for the requested RP ID.

    -

    If permitted, the user agent SHOULD signal to the authenticator (at invocation time) that enterprise attestation is requested, and convey the resulting AAGUID and attestation statement, unaltered, to the Relying Party.

    +

    The Relying Party wants to receive an attestation statement that may include uniquely identifying information. This is intended for controlled deployments within an enterprise where the organization wishes to tie registrations to specific authenticators. User agents MUST NOT provide such an attestation unless the user agent or authenticator configuration permits it for the requested RP ID.

    +

    If permitted, the user agent SHOULD signal to the authenticator (at invocation time) that enterprise attestation is requested, and convey the resulting AAGUID and attestation statement, unaltered, to the Relying Party.

    5.5. Options for Assertion Generation (dictionary PublicKeyCredentialRequestOptions)

    @@ -3613,74 +4032,78 @@

    < required BufferSource challenge; unsigned long timeout; USVString rpId; - sequence<PublicKeyCredentialDescriptor> allowCredentials = []; - DOMString userVerification = "preferred"; - DOMString attestation = "none"; - sequence<DOMString> attestationFormats = []; + sequence<PublicKeyCredentialDescriptor> allowCredentials = []; + DOMString userVerification = "preferred"; + sequence<DOMString> hints = []; + DOMString attestation = "none"; + sequence<DOMString> attestationFormats = []; AuthenticationExtensionsClientInputs extensions; };

    challenge, of type BufferSource
    -

    This member specifies a challenge that the authenticator signs, along with other data, when producing an authentication assertion. See the § 13.4.3 Cryptographic Challenges security consideration.

    +

    This member specifies a challenge that the authenticator signs, along with other data, when producing an authentication assertion. See the § 13.4.3 Cryptographic Challenges security consideration.

    timeout, of type unsigned long
    -

    This OPTIONAL member specifies a time, in milliseconds, that the Relying Party is willing to wait for the call to complete. -The value is treated as a hint, and MAY be overridden by the client.

    +

    This OPTIONAL member specifies a time, in milliseconds, that the Relying Party is willing to wait for the call to complete. +The value is treated as a hint, and MAY be overridden by the client.

    rpId, of type USVString
    -

    This OPTIONAL member specifies the RP ID claimed by the Relying Party. -The client MUST verify that the Relying Party's origin matches the scope of this RP ID. -The authenticator MUST verify -that this RP ID exactly equals the rpId of the credential to be used for the authentication ceremony.

    +

    This OPTIONAL member specifies the RP ID claimed by the Relying Party. +The client MUST verify that the Relying Party's origin matches the scope of this RP ID. +The authenticator MUST verify +that this RP ID exactly equals the rpId of the credential to be used for the authentication ceremony.

    If not specified, its value will be the CredentialsContainer object’s relevant settings object's origin's effective domain.

    allowCredentials, of type sequence<PublicKeyCredentialDescriptor>, defaulting to []
    -

    This OPTIONAL member is used by the client to find authenticators eligible for this authentication ceremony. +

    This OPTIONAL member is used by the client to find authenticators eligible for this authentication ceremony. It can be used in two ways:

    If not empty, the client MUST return an error if none of the listed credentials can be used.

    The list is ordered in descending order of preference: the first item in the list is the most preferred credential, and the last is the least preferred.

    -
    userVerification, of type DOMString, defaulting to "preferred" +
    userVerification, of type DOMString, defaulting to "preferred"
    -

    This OPTIONAL member specifies the Relying Party's requirements regarding user verification for the get() operation. The value SHOULD be a member of UserVerificationRequirement but client platforms MUST ignore unknown values, treating an unknown value as if the member does not exist. Eligible authenticators are filtered to only those capable of satisfying this requirement.

    +

    This OPTIONAL member specifies the Relying Party's requirements regarding user verification for the get() operation. The value SHOULD be a member of UserVerificationRequirement but client platforms MUST ignore unknown values, treating an unknown value as if the member does not exist. Eligible authenticators are filtered to only those capable of satisfying this requirement.

    See UserVerificationRequirement for the description of userVerification's values and semantics.

    -
    attestation, of type DOMString, defaulting to "none" +
    hints, of type sequence<DOMString>, defaulting to [] +
    +

    This OPTIONAL member contains zero or more elements from PublicKeyCredentialHints to guide the user agent in interacting with the user. Note that the elements have type DOMString despite being taken from that enumeration. See § 2.1.1 Enumerations as DOMString types.

    +
    attestation, of type DOMString, defaulting to "none"
    -

    The Relying Party MAY use this OPTIONAL member to specify a preference regarding attestation conveyance. -Its value SHOULD be a member of AttestationConveyancePreference. Client platforms MUST ignore unknown values, treating an unknown value as if the member does not exist.

    +

    The Relying Party MAY use this OPTIONAL member to specify a preference regarding attestation conveyance. +Its value SHOULD be a member of AttestationConveyancePreference. Client platforms MUST ignore unknown values, treating an unknown value as if the member does not exist.

    The default value is none.

    -
    attestationFormats, of type sequence<DOMString>, defaulting to [] +
    attestationFormats, of type sequence<DOMString>, defaulting to []
    -

    The Relying Party MAY use this OPTIONAL member to specify a preference regarding the attestation statement format used by the authenticator. +

    The Relying Party MAY use this OPTIONAL member to specify a preference regarding the attestation statement format used by the authenticator. Values SHOULD be taken from the IANA "WebAuthn Attestation Statement Format Identifiers" registry [IANA-WebAuthn-Registries] established by [RFC8809]. Values are ordered from most preferable to least preferable. -This parameter is advisory and the authenticator MAY use an attestation statement not enumerated in this parameter.

    +This parameter is advisory and the authenticator MAY use an attestation statement not enumerated in this parameter.

    The default value is the empty list, which indicates no preference.

    extensions, of type AuthenticationExtensionsClientInputs
    -

    The Relying Party MAY use this OPTIONAL member to provide client extension inputs requesting additional processing by the client and authenticator.

    +

    The Relying Party MAY use this OPTIONAL member to provide client extension inputs requesting additional processing by the client and authenticator.

    The extensions framework is defined in § 9 WebAuthn Extensions. Some extensions are defined in § 10 Defined Extensions; consult the IANA "WebAuthn Extension Identifiers" registry [IANA-WebAuthn-Registries] established by [RFC8809] for an up-to-date list @@ -3691,11 +4114,11 @@

    DOM § 3.3 Using AbortController and AbortSignal objects in APIs section for detailed instructions.

    Note: DOM § 3.3 Using AbortController and AbortSignal objects in APIs section specifies that web platform APIs integrating with the AbortController must reject the promise immediately once the AbortSignal is aborted. Given the complex inheritance and parallelization structure of the [[Create]](origin, options, sameOriginWithAncestors) and [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) methods, the algorithms for the two APIs fulfills this - requirement by checking the aborted property in three places. In the case of [[Create]](origin, options, sameOriginWithAncestors), the aborted property is checked first in Credential Management 1 § 2.5.4 Create a Credential immediately before calling [[Create]](origin, options, sameOriginWithAncestors), + requirement by checking the aborted property in three places. In the case of [[Create]](origin, options, sameOriginWithAncestors), the aborted property is checked first in Credential Management 1 § 2.5.4 Create a Credential immediately before calling [[Create]](origin, options, sameOriginWithAncestors), then in § 5.1.3 Create a New Credential - PublicKeyCredential’s [[Create]](origin, options, sameOriginWithAncestors) Method right before authenticator sessions start, and finally during authenticator sessions. The same goes for [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors).

    -

    The visibility and focus state of the Window object determines whether the [[Create]](origin, options, sameOriginWithAncestors) and [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) operations -should continue. When the Window object associated with the Document loses focus, [[Create]](origin, options, sameOriginWithAncestors) and [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) operations +

    The visibility and focus state of the Window object determines whether the [[Create]](origin, options, sameOriginWithAncestors) and [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) operations +should continue. When the Window object associated with the Document loses focus, [[Create]](origin, options, sameOriginWithAncestors) and [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) operations SHOULD be aborted.

    The WHATWG HTML WG is discussing whether to provide a hook when a browsing context gains or loses focuses. If a hook is provided, the above paragraph will be updated to include the hook. @@ -3722,7 +4145,7 @@

    5.7.4. Authentication Extensions Authenticator Outputs (CDDL type AuthenticationExtensionsAuthenticatorOutputs)

    AuthenticationExtensionsAuthenticatorOutputs = {
       * $$extensionOutput .within ( tstr => any )
    @@ -3735,76 +4158,76 @@ 

    5.8.1. Client Data Used in WebAuthn Signatures (dictionary CollectedClientData)

    -

    The client data represents the contextual bindings of both the WebAuthn Relying Party and the client. It is a key-value +

    The client data represents the contextual bindings of both the WebAuthn Relying Party and the client. It is a key-value mapping whose keys are strings. Values can be any type that has a valid encoding in JSON. Its structure is defined by the following Web IDL.

    Note: The CollectedClientData may be extended in the future. Therefore it’s critical when parsing to be tolerant of unknown keys and of any reordering of the keys. See also § 5.8.1.2 Limited Verification Algorithm.

    dictionary CollectedClientData {
    -    required DOMString           type;
    -    required DOMString           challenge;
    -    required DOMString           origin;
    -    DOMString                    topOrigin;
    -    boolean                      crossOrigin;
    +    required DOMString           type;
    +    required DOMString           challenge;
    +    required DOMString           origin;
    +    DOMString                    topOrigin;
    +    boolean                      crossOrigin;
     };
     
     dictionary TokenBinding {
    -    required DOMString status;
    -    DOMString id;
    +    required DOMString status;
    +    DOMString id;
     };
     
     enum TokenBindingStatus { "present", "supported" };
     
    -
    type, of type DOMString +
    type, of type DOMString

    This member contains the string "webauthn.create" when creating new credentials, and "webauthn.get" when getting an assertion from an existing credential. The purpose of this member is to prevent certain types of signature confusion attacks (where an attacker substitutes one legitimate signature for another).

    -
    challenge, of type DOMString +
    challenge, of type DOMString
    -

    This member contains the base64url encoding of the challenge provided by the Relying Party. See the § 13.4.3 Cryptographic Challenges security consideration.

    -
    origin, of type DOMString +

    This member contains the base64url encoding of the challenge provided by the Relying Party. See the § 13.4.3 Cryptographic Challenges security consideration.

    +
    origin, of type DOMString

    This member contains the fully qualified origin of the requester, as provided to the authenticator by the client, in the syntax defined by [RFC6454].

    -
    topOrigin, of type DOMString +
    topOrigin, of type DOMString
    -

    This OPTIONAL member contains the fully qualified top-level origin of the requester, in the syntax defined +

    This OPTIONAL member contains the fully qualified top-level origin of the requester, in the syntax defined by [RFC6454]. It is set only if the call was made from context that is not same-origin with its ancestors, i.e. if crossOrigin is true.

    -
    crossOrigin, of type boolean +
    crossOrigin, of type boolean

    This OPTIONAL member contains the inverse of the sameOriginWithAncestors argument value -that was passed into the internal method.

    +that was passed into the internal method.

    [RESERVED] tokenBinding

    This OPTIONAL member contains information about the state of the Token Binding protocol [TokenBinding] used when communicating -with the Relying Party. Its absence indicates that the client doesn’t support token binding

    +with the Relying Party. Its absence indicates that the client doesn’t support token binding

    Note: While Token Binding was present in Level 1 and Level 2 of WebAuthn, its use is not expected in Level 3. The tokenBinding field is reserved so that it will not be reused for a different purpose.

    -
    status, of type DOMString +
    status, of type DOMString
    -

    This member SHOULD be a member of TokenBindingStatus but client platforms MUST ignore unknown values, treating an unknown value as if the tokenBinding member does not exist. When known, this member is one of the following:

    +

    This member SHOULD be a member of TokenBindingStatus but client platforms MUST ignore unknown values, treating an unknown value as if the tokenBinding member does not exist. When known, this member is one of the following:

    supported
    -

    Indicates the client supports token binding, but it was not negotiated when communicating with the Relying Party.

    +

    Indicates the client supports token binding, but it was not negotiated when communicating with the Relying Party.

    present
    -

    Indicates token binding was used when communicating with the Relying Party. In this case, the id member MUST be present.

    +

    Indicates token binding was used when communicating with the Relying Party. In this case, the id member MUST be present.

    Note: The TokenBindingStatus enumeration is deliberately not referenced, see § 2.1.1 Enumerations as DOMString types.

    -
    id, of type DOMString +
    id, of type DOMString

    This member MUST be present if status is present, and MUST be a base64url -encoding of the Token Binding ID that was used when communicating with the Relying Party.

    +encoding of the Token Binding ID that was used when communicating with the Relying Party.

    -

    Note: Obtaining a Token Binding ID is a client platform-specific operation.

    +

    Note: Obtaining a Token Binding ID is a client platform-specific operation.

    The CollectedClientData structure is used by the client to compute the following quantities:

    @@ -3849,15 +4272,15 @@
    topOrigin is present:

    +

    If topOrigin is present:

    1. Append 0x2c22746f704f726967696e223a (,"topOrigin":) to result.

    2. -

      Append CCDToString(topOrigin) to result.

      +

      Append CCDToString(topOrigin) to result.

  • -

    Create a temporary copy of the CollectedClientData and remove the fields type, challenge, origin, crossOrigin (if present), and topOrigin (if present).

    +

    Create a temporary copy of the CollectedClientData and remove the fields type, challenge, origin, crossOrigin (if present), and topOrigin (if present).

  • If no fields remain in the temporary copy then:

      @@ -3974,7 +4397,7 @@
      5.8.1.3. Future development
      -

      In order to remain compatible with the limited verification algorithm, future versions of this specification must not remove any of the fields type, challenge, origin, crossOrigin, or topOrigin from CollectedClientData. They also must not change the serialization algorithm to change the order in which those fields are serialized, or insert new fields between them.

      +

      In order to remain compatible with the limited verification algorithm, future versions of this specification must not remove any of the fields type, challenge, origin, crossOrigin, or topOrigin from CollectedClientData. They also must not change the serialization algorithm to change the order in which those fields are serialized, or insert new fields between them.

      If additional fields are added to CollectedClientData then verifiers that employ the limited verification algorithm will not be able to consider them until the two algorithms above are updated to include them. Once such an update occurs then the added fields inherit the same limitations as described in the previous paragraph. Such an algorithm update would have to accomodate serializations produced by previous versions. I.e. the verification algorithm would have to handle the fact that a sixth key–value pair may not appear sixth (or at all) if generated by a user agent working from a previous version.

      5.8.2. Credential Type Enumeration (enum PublicKeyCredentialType)

      enum PublicKeyCredentialType {
      @@ -3990,34 +4413,34 @@ 

      5.8.3. Credential Descriptor (dictionary PublicKeyCredentialDescriptor)

      dictionary PublicKeyCredentialDescriptor {
      -    required DOMString                    type;
      +    required DOMString                    type;
           required BufferSource                 id;
      -    sequence<DOMString>                   transports;
      +    sequence<DOMString>                   transports;
       };
       

      This dictionary identifies a specific public key credential. -It is used in create() to prevent creating duplicate credentials on the same authenticator, -and in get() to determine if and how the credential can currently be reached by the client. -It mirrors some fields of the PublicKeyCredential object returned by create() and get().

      +It is used in create() to prevent creating duplicate credentials on the same authenticator, +and in get() to determine if and how the credential can currently be reached by the client. +It mirrors some fields of the PublicKeyCredential object returned by create() and get().

      -
      type, of type DOMString +
      type, of type DOMString
      -

      This member contains the type of the public key credential the caller is referring to. The value SHOULD be a member of PublicKeyCredentialType but client platforms MUST ignore any PublicKeyCredentialDescriptor with an unknown type.

      -

      This mirrors the type field of PublicKeyCredential.

      +

      This member contains the type of the public key credential the caller is referring to. The value SHOULD be a member of PublicKeyCredentialType but client platforms MUST ignore any PublicKeyCredentialDescriptor with an unknown type.

      +

      This mirrors the type field of PublicKeyCredential.

      id, of type BufferSource

      This member contains the credential ID of the public key credential the caller is referring to.

      -

      This mirrors the rawId field of PublicKeyCredential.

      -
      transports, of type sequence<DOMString> +

      This mirrors the rawId field of PublicKeyCredential.

      +
      transports, of type sequence<DOMString>
      -

      This OPTIONAL member contains a hint as to how the client might communicate with the managing authenticator of the public key credential the caller is referring to. The values SHOULD be members of AuthenticatorTransport but client platforms MUST ignore unknown values.

      +

      This OPTIONAL member contains a hint as to how the client might communicate with the managing authenticator of the public key credential the caller is referring to. The values SHOULD be members of AuthenticatorTransport but client platforms MUST ignore unknown values.

      This mirrors the response.getTransports() method -of a PublicKeyCredential structure created by a create() operation. +of a PublicKeyCredential structure created by a create() operation. When registering a new credential, -the Relying Party SHOULD store the value returned from getTransports(). +the Relying Party SHOULD store the value returned from getTransports(). When creating a PublicKeyCredentialDescriptor for that credential, -the Relying Party SHOULD retrieve that stored value +the Relying Party SHOULD retrieve that stored value and set it as the value of the transports member.

      @@ -4027,34 +4450,34 @@

      "nfc", "ble", "smart-card", - "hybrid", + "hybrid", "internal" };

      Note: The AuthenticatorTransport enumeration is deliberately not referenced, see § 2.1.1 Enumerations as DOMString types.

      - Authenticators may implement various transports for communicating with clients. This enumeration + Authenticators may implement various transports for communicating with clients. This enumeration defines hints as to how clients might communicate with a particular authenticator in order to obtain an assertion for a - specific credential. Note that these hints represent the WebAuthn Relying Party's best belief as to how an authenticator may be reached. A Relying Party will typically learn of the supported transports for a public key credential via getTransports(). + specific credential. Note that these hints represent the WebAuthn Relying Party's best belief as to how an authenticator may be reached. A Relying Party will typically learn of the supported transports for a public key credential via getTransports().
      usb
      -

      Indicates the respective authenticator can be contacted over removable USB.

      +

      Indicates the respective authenticator can be contacted over removable USB.

      nfc
      -

      Indicates the respective authenticator can be contacted over Near Field Communication (NFC).

      +

      Indicates the respective authenticator can be contacted over Near Field Communication (NFC).

      ble
      -

      Indicates the respective authenticator can be contacted over Bluetooth Smart (Bluetooth Low Energy / BLE).

      +

      Indicates the respective authenticator can be contacted over Bluetooth Smart (Bluetooth Low Energy / BLE).

      smart-card
      -

      Indicates the respective authenticator can be contacted over ISO/IEC 7816 smart card with contacts.

      +

      Indicates the respective authenticator can be contacted over ISO/IEC 7816 smart card with contacts.

      hybrid
      -

      Indicates the respective authenticator can be contacted using a combination of (often separate) data-transport and proximity mechanisms. This supports, for example, authentication on a desktop computer using a smartphone.

      +

      Indicates the respective authenticator can be contacted using a combination of (often separate) data-transport and proximity mechanisms. This supports, for example, authentication on a desktop computer using a smartphone.

      internal
      -

      Indicates the respective authenticator is contacted using a client device-specific transport, +

      Indicates the respective authenticator is contacted using a client device-specific transport, i.e., it is a platform authenticator. These authenticators are not removable from the client device.

      @@ -4087,52 +4510,78 @@

      "discouraged" };

  • -

    A WebAuthn Relying Party may require user verification for some of its operations but not for others, and may use this type to express its +

    A WebAuthn Relying Party may require user verification for some of its operations but not for others, and may use this type to express its needs.

    Note: The UserVerificationRequirement enumeration is deliberately not referenced, see § 2.1.1 Enumerations as DOMString types.

    required
    -

    The Relying Party requires user verification for the operation and will fail the overall ceremony if the +

    The Relying Party requires user verification for the operation and will fail the overall ceremony if the response does not have the UV flag set. -The client MUST return an error if user verification cannot be performed.

    +The client MUST return an error if user verification cannot be performed.

    preferred
    -

    The Relying Party prefers user verification for the operation if possible, but will not fail the +

    The Relying Party prefers user verification for the operation if possible, but will not fail the operation if the response does not have the UV flag set.

    discouraged
    -

    The Relying Party does not want user verification employed during the operation (e.g., in the +

    The Relying Party does not want user verification employed during the operation (e.g., in the interest of minimizing disruption to the user interaction flow).

    +

    5.8.7. User-agent Hints Enumeration (enum PublicKeyCredentialHints)

    +
    enum PublicKeyCredentialHints {
    +    "security-key",
    +    "client-device",
    +    "hybrid",
    +};
    +
    +

    Note: The PublicKeyCredentialHints enumeration is deliberately not referenced, see § 2.1.1 Enumerations as DOMString types.

    +
    + WebAuthn Relying Parties may use this enumeration to communicate hints to the user-agent about how a request may be best completed. These hints are not requirements, and do not bind the user-agent, but may guide it in providing the best experience by using contextual information that the Relying Party has about the request. Hints are provided in order of decreasing preference so, if two hints are contradictory, the first one controls. Hints may also overlap: if a more-specific hint is defined a Relying Party may still wish to send less specific ones for user-agents that may not recognise the more specific one. In this case the most specific hint should be sent before the less-specific ones. +

    Hints MAY contradict information contained in credential transports and authenticatorAttachment. When this occurs, the hints take precedence. (Note that transports values are not provided when using discoverable credentials, leaving hints as the only avenue for expressing some aspects of such a request.)

    +
    +
    security-key +
    +

    Indicates that the Relying Party believes that users will satisfy this request with a physical security key. For example, an enterprise Relying Party may set this hint if they have issued security keys to their employees and will only accept those authenticators for registration and authentication.

    +

    For compatibility with older user agents, when this hint is used in PublicKeyCredentialCreationOptions, the authenticatorAttachment SHOULD be set to cross-platform.

    +
    client-device +
    +

    Indicates that the Relying Party believes that users will satisfy this request with a platform authenticator attached to the client device.

    +

    For compatibility with older user agents, when this hint is used in PublicKeyCredentialCreationOptions, the authenticatorAttachment SHOULD be set to platform.

    +
    hybrid +
    +

    Indicates that the Relying Party believes that users will satisfy this request with general-purpose authenticators such as smartphones. For example, a consumer Relying Party may believe that only a small fraction of their customers possesses dedicated security keys. This option also implies that the local platform authenticator should not be promoted in the UI.

    +

    For compatibility with older user agents, when this hint is used in PublicKeyCredentialCreationOptions, the authenticatorAttachment SHOULD be set to cross-platform.

    +
    +

    5.9. Permissions Policy integration

    This specification defines two policy-controlled features identified by the feature-identifier tokens "publickey-credentials-create" and "publickey-credentials-get". Their default allowlists are both 'self'. [Permissions-Policy]

    -

    A Document's permissions policy determines whether any content in that document is allowed to successfully invoke the Web Authentication API, i.e., via navigator.credentials.create({publicKey:..., ...}) or navigator.credentials.get({publicKey:..., ...}) If disabled in any document, no content in the document will be allowed to use the foregoing methods: attempting to do so will return an error.

    -

    Note: Algorithms specified in [CREDENTIAL-MANAGEMENT-1] perform the actual permissions policy evaluation. This is because such policy evaluation needs to occur when there is access to the current settings object. The [[Create]](origin, options, sameOriginWithAncestors) and [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) internal methods does not have such access since they are invoked in parallel by CredentialsContainer's Create a Credential and Request a Credential abstract operations [CREDENTIAL-MANAGEMENT-1].

    +

    A Document's permissions policy determines whether any content in that document is allowed to successfully invoke the Web Authentication API, i.e., via navigator.credentials.create({publicKey:..., ...}) or navigator.credentials.get({publicKey:..., ...}) If disabled in any document, no content in the document will be allowed to use the foregoing methods: attempting to do so will return an error.

    +

    Note: Algorithms specified in [CREDENTIAL-MANAGEMENT-1] perform the actual permissions policy evaluation. This is because such policy evaluation needs to occur when there is access to the current settings object. The [[Create]](origin, options, sameOriginWithAncestors) and [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) internal methods does not have such access since they are invoked in parallel by CredentialsContainer's Create a Credential and Request a Credential abstract operations [CREDENTIAL-MANAGEMENT-1].

    5.10. Using Web Authentication within iframe elements

    -

    The Web Authentication API is disabled by default in cross-origin iframes. -To override this default policy and indicate that a cross-origin iframe is allowed to invoke the Web Authentication API's [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) method, specify the allow attribute on the iframe element and include the publickey-credentials-get feature-identifier token in the allow attribute’s value.

    -

    Relying Parties utilizing the WebAuthn API in an embedded context should review § 13.4.2 Visibility Considerations for Embedded Usage regarding UI redressing and its possible mitigations.

    +

    The Web Authentication API is disabled by default in cross-origin iframes. +To override this default policy and indicate that a cross-origin iframe is allowed to invoke the Web Authentication API's [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) method, specify the allow attribute on the iframe element and include the publickey-credentials-get feature-identifier token in the allow attribute’s value.

    +

    Relying Parties utilizing the WebAuthn API in an embedded context should review § 13.4.2 Visibility Considerations for Embedded Usage regarding UI redressing and its possible mitigations.

    6. WebAuthn Authenticator Model

    -

    The Web Authentication API implies a specific abstract functional model for a WebAuthn Authenticator. This section +

    The Web Authentication API implies a specific abstract functional model for a WebAuthn Authenticator. This section describes that authenticator model.

    -

    Client platforms MAY implement and expose this abstract model in any way desired. However, the behavior of the client’s Web -Authentication API implementation, when operating on the authenticators supported by that client platform, MUST be indistinguishable +

    Client platforms MAY implement and expose this abstract model in any way desired. However, the behavior of the client’s Web +Authentication API implementation, when operating on the authenticators supported by that client platform, MUST be indistinguishable from the behavior specified in § 5 Web Authentication API.

    -

    Note: [FIDO-CTAP] is an example of a concrete instantiation of this model, but it is one in which there are differences in the data it returns and those expected by the WebAuthn API's algorithms. The CTAP2 response messages are CBOR maps constructed using integer keys rather than the string keys defined in this specification for the same objects. The client is expected to perform any needed transformations on such data. The [FIDO-CTAP] specification details the mapping between CTAP2 integer keys and WebAuthn string keys, in section §6.2. Responses.

    +

    Note: [FIDO-CTAP] is an example of a concrete instantiation of this model, but it is one in which there are differences in the data it returns and those expected by the WebAuthn API's algorithms. The CTAP2 response messages are CBOR maps constructed using integer keys rather than the string keys defined in this specification for the same objects. The client is expected to perform any needed transformations on such data. The [FIDO-CTAP] specification details the mapping between CTAP2 integer keys and WebAuthn string keys, in section §6.2. Responses.

    For authenticators, this model defines the logical operations that they MUST support, and the data formats that they expose to -the client and the WebAuthn Relying Party. However, it does not define the details of how authenticators communicate with the client device, -unless they are necessary for interoperability with Relying Parties. For instance, this abstract model does not define protocols for +the client and the WebAuthn Relying Party. However, it does not define the details of how authenticators communicate with the client device, +unless they are necessary for interoperability with Relying Parties. For instance, this abstract model does not define protocols for connecting authenticators to clients over transports such as USB or NFC. Similarly, this abstract model does not define specific error codes or methods of returning them; however, it does define error behavior in terms of the needs of the client. Therefore, specific error codes are mentioned as a means of showing which error conditions MUST be distinguishable (or not) from each other in order to enable a compliant and secure client implementation.

    -

    Relying Parties may influence authenticator selection, if they deem necessary, by stipulating various authenticator characteristics +

    Relying Parties may influence authenticator selection, if they deem necessary, by stipulating various authenticator characteristics when creating credentials and/or when generating assertions, through use of credential creation options or assertion generation options, respectively. The algorithms underlying the WebAuthn API marshal these options and pass them to the applicable authenticator operations defined below.

    In this abstract model, the authenticator provides key management and cryptographic signatures. It can be embedded in the @@ -4144,25 +4593,25 @@

    Additionally, each authenticator has an AAGUID, which is a 128-bit identifier indicating the type (e.g. make and model) of the authenticator. The AAGUID MUST be chosen by the manufacturer to be identical across all substantially identical authenticators made by that manufacturer, and different (with high probability) from the AAGUIDs of all other types of authenticators. -The AAGUID for a given type of authenticator SHOULD be randomly generated to ensure this. The Relying Party MAY use the AAGUID to infer certain +The AAGUID for a given type of authenticator SHOULD be randomly generated to ensure this. The Relying Party MAY use the AAGUID to infer certain properties of the authenticator, such as certification level and strength of key protection, using information from other sources.

    The primary function of the authenticator is to provide WebAuthn signatures, which are bound to various contextual data. These data are observed and added at different levels of the stack as a signature request passes from the server to the authenticator. In verifying a signature, the server checks these bindings against expected values. These contextual bindings -are divided in two: Those added by the Relying Party or the client, referred to as client data; and those added by the authenticator, +are divided in two: Those added by the Relying Party or the client, referred to as client data; and those added by the authenticator, referred to as the authenticator data. The authenticator signs over the client data, but is otherwise not interested in its contents. To save bandwidth and processing requirements on the authenticator, the client hashes the client data and sends only the result to the authenticator. The authenticator signs over the combination of the hash of the serialized client data, and its own authenticator data.

    The goals of this design can be summarized as follows.

    • -

      The scheme for generating signatures should accommodate cases where the link between the client device and authenticator +

      The scheme for generating signatures should accommodate cases where the link between the client device and authenticator is very limited, in bandwidth and/or latency. Examples include Bluetooth Low Energy and Near-Field Communication.

    • The data processed by the authenticator should be small and easy to interpret in low-level code. In particular, authenticators should not have to parse high-level encodings such as JSON.

    • -

      Both the client and the authenticator should have the flexibility to add contextual bindings as needed.

      +

      Both the client and the authenticator should have the flexibility to add contextual bindings as needed.

    • The design aims to reuse as much as possible of existing encoding formats in order to aid adoption and implementation.

    @@ -4170,28 +4619,28 @@

  • An attestation signature is produced when a new public key credential is created via an authenticatorMakeCredential operation. An attestation signature provides cryptographic -proof of certain properties of the authenticator and the credential. For instance, an attestation signature asserts the authenticator type (as denoted by its AAGUID) and the credential public key. The attestation +proof of certain properties of the authenticator and the credential. For instance, an attestation signature asserts the authenticator type (as denoted by its AAGUID) and the credential public key. The attestation signature is signed by an attestation private key, which is chosen depending on the type of attestation desired. For more details on attestation, see § 6.5 Attestation.

  • An assertion signature is produced when the authenticatorGetAssertion method is invoked. It represents an -assertion by the authenticator that the user has consented to a specific transaction, such as logging -in, or completing a purchase. Thus, an assertion signature asserts that the authenticator possessing a particular credential private key has established, to the best of its ability, that the user requesting this transaction is the +assertion by the authenticator that the user has consented to a specific transaction, such as logging +in, or completing a purchase. Thus, an assertion signature asserts that the authenticator possessing a particular credential private key has established, to the best of its ability, that the user requesting this transaction is the same user who consented to creating that particular public key credential. It also asserts additional information, termed client data, that may be useful to the caller, such as the means by which user consent was -provided, and the prompt shown to the user by the authenticator. The assertion signature format is illustrated in Figure 4, below.

    +provided, and the prompt shown to the user by the authenticator. The assertion signature format is illustrated in Figure 4, below.

    The term WebAuthn signature refers to both attestation signatures and assertion signatures. The formats of these signatures, as well as the procedures for generating them, are specified below.

    6.1. Authenticator Data

    -

    The authenticator data structure encodes contextual bindings made by the authenticator. These bindings are -controlled by the authenticator itself, and derive their trust from the WebAuthn Relying Party's assessment of the security properties of the +

    The authenticator data structure encodes contextual bindings made by the authenticator. These bindings are +controlled by the authenticator itself, and derive their trust from the WebAuthn Relying Party's assessment of the security properties of the authenticator. In one extreme case, the authenticator may be embedded in the client, and its bindings may be no more trustworthy than the client data. At the other extreme, the authenticator may be a discrete entity with high-security hardware and -software, connected to the client over a secure channel. In both cases, the Relying Party receives the authenticator data in the same +software, connected to the client over a secure channel. In both cases, the Relying Party receives the authenticator data in the same format, and uses its knowledge of the authenticator to make trust decisions.

    The authenticator data has a compact but extensible encoding. This is desired since authenticators can be devices with -limited capabilities and low power requirements, with much simpler software stacks than the client platform.

    +limited capabilities and low power requirements, with much simpler software stacks than the client platform.

    The authenticator data structure is a byte array of 37 bytes or more, laid out as shown in Table .

    @@ -4279,12 +4728,12 @@

    Authenticator data layout. The names in the Name column are only for reference within this document, and are not present in the actual representation of the authenticator data.

    -

    The RP ID is originally received from the client when the credential is created, and again when an assertion is generated. +

    The RP ID is originally received from the client when the credential is created, and again when an assertion is generated. However, it differs from other client data in some important ways. First, unlike the client data, the RP ID of a credential does not change between operations but instead remains the same for the lifetime of that credential. Secondly, it is validated by the authenticator during the authenticatorGetAssertion operation, by verifying that the RP ID that -the requested credential is scoped to exactly matches the RP ID supplied by the client.

    -

    Authenticators perform the following steps to generate an authenticator data structure:

    +the requested credential is scoped to exactly matches the RP ID supplied by the client.

    +

    Authenticators perform the following steps to generate an authenticator data structure:

  • -

    It is RECOMMENDED that Relying Parties store the most recent value of these flags with the user account for future evaluation.

    -

    The following is a non-exhaustive list of how Relying Parties might use these flags:

    +

    It is RECOMMENDED that Relying Parties store the most recent value of these flags with the user account for future evaluation.

    +

    The following is a non-exhaustive list of how Relying Parties might use these flags:

    6.2. Authenticator Taxonomy

    -

    Many use cases are dependent on the capabilities of the authenticator used. +

    Many use cases are dependent on the capabilities of the authenticator used. This section defines some terminology for those capabilities, their most important combinations, and which use cases those combinations enable.

    For example:

    -

    The attestation type and attestation statement format is chosen by the authenticator; Relying Parties can only signal their preferences by setting the attestation and attestationFormats parameters, or those with the same names in PublicKeyCredentialRequestOptions.

    -

    It is expected that most authenticators will support a small number of attestation types and attestation statement -formats, while Relying Parties will decide what attestation types are acceptable to them by policy. Relying Parties will also need to -understand the characteristics of the authenticators that they trust, based on information they have about these authenticators. For example, the FIDO Metadata Service [FIDOMetadataService] provides one way to access such information.

    +

    The attestation type and attestation statement format is chosen by the authenticator; Relying Parties can only signal their preferences by setting the attestation and attestationFormats parameters, or those with the same names in PublicKeyCredentialRequestOptions.

    +

    It is expected that most authenticators will support a small number of attestation types and attestation statement +formats, while Relying Parties will decide what attestation types are acceptable to them by policy. Relying Parties will also need to +understand the characteristics of the authenticators that they trust, based on information they have about these authenticators. For example, the FIDO Metadata Service [FIDOMetadataService] provides one way to access such information.

    6.5.1. Attestation in assertions

    -

    Attestation is most commonly provided during credential creation. However, if supported by the authenticator and requested by the Relying Party using the attestation parameter, attestation MAY be provided in assertions.

    -

    Attestations in assertions could be helpful in at least the following situations:

    +

    Attestation is most commonly provided during credential creation. However, if supported by the authenticator and requested by the Relying Party using the attestation parameter, attestation MAY be provided in assertions.

    +

    Attestations in assertions could be helpful in at least the following situations:

    1. -

      For multi-device credentials, the generating authenticator may have returned a meaningfully different attestation than the authenticator currently exercising the credential. Thus returning an attestation for each use of the credential allows the Relying Party to observe these changes.

      +

      For multi-device credentials, the generating authenticator may have returned a meaningfully different attestation than the authenticator currently exercising the credential. Thus returning an attestation for each use of the credential allows the Relying Party to observe these changes.

    2. If the attestation statement format involves a 3rd-party attesting to the state of the authenticator, then returning an attestation with each use of the credential allows for the continued good health of the authenticator to be attested.

    @@ -5097,7 +5547,7 @@
    6.5.3. Attestation Statement Formats
    -

    As described above, an attestation statement format is a data format which represents a cryptographic signature by an authenticator over a set of contextual bindings. Each attestation statement format MUST be defined using the following +

    As described above, an attestation statement format is a data format which represents a cryptographic signature by an authenticator over a set of contextual bindings. Each attestation statement format MUST be defined using the following template:

    It is RECOMMENDED that any new attestation formats defined not use ASN.1 encodings, but instead represent signatures as equivalent fixed-length byte arrays without internal structure, @@ -5237,24 +5687,24 @@

    7. WebAuthn Relying Party Operations

    -

    A registration or authentication ceremony begins with the WebAuthn Relying Party creating a PublicKeyCredentialCreationOptions or PublicKeyCredentialRequestOptions object, respectively, which encodes the parameters for the ceremony. The Relying Party SHOULD take care to not leak sensitive information during this stage; see § 14.6.2 Username Enumeration for details.

    -

    Upon successful execution of create() or get(), the Relying Party's script receives -a PublicKeyCredential containing an AuthenticatorAttestationResponse or AuthenticatorAssertionResponse structure, -respectively, from the client. It must then deliver the contents of this structure to the Relying Party server, using methods outside -the scope of this specification. This section describes the operations that the Relying Party must perform upon receipt of these +

    7. WebAuthn Relying Party Operations

    +

    A registration or authentication ceremony begins with the WebAuthn Relying Party creating a PublicKeyCredentialCreationOptions or PublicKeyCredentialRequestOptions object, respectively, which encodes the parameters for the ceremony. The Relying Party SHOULD take care to not leak sensitive information during this stage; see § 14.6.2 Username Enumeration for details.

    +

    Upon successful execution of create() or get(), the Relying Party's script receives +a PublicKeyCredential containing an AuthenticatorAttestationResponse or AuthenticatorAssertionResponse structure, +respectively, from the client. It must then deliver the contents of this structure to the Relying Party server, using methods outside +the scope of this specification. This section describes the operations that the Relying Party must perform upon receipt of these structures.

    7.1. Registering a New Credential

    -

    In order to perform a registration ceremony, the Relying Party MUST proceed as follows:

    +

    In order to perform a registration ceremony, the Relying Party MUST proceed as follows:

    1. -

      Let options be a new PublicKeyCredentialCreationOptions structure configured to the Relying Party's needs for the ceremony.

      +

      Let options be a new PublicKeyCredentialCreationOptions structure configured to the Relying Party's needs for the ceremony.

    2. Call navigator.credentials.create() and pass options as the publicKey option. Let credential be the result of the successfully resolved promise. If the promise is rejected, abort the ceremony with a user-visible error, or otherwise guide the user experience as might be determinable from the context available in the rejected promise. For example if the promise is rejected with -an error code equivalent to "InvalidStateError", the user might be instructed to use a different authenticator. +an error code equivalent to "InvalidStateError", the user might be instructed to use a different authenticator. For information on different error contexts and the circumstances leading to them, see § 6.3.2 The authenticatorMakeCredential Operation.

    3. Let response be credential.response. @@ -5276,44 +5726,47 @@

      challenge equals the base64url encoding of options.challenge.

      +
    4. Verify that the value of C.origin is an origin expected by the Relying Party. + See § 13.4.9 Validating the origin of a credential for guidance.
    5. -

      Verify that the value of C.origin matches the Relying Party's origin.

      -
    6. -

      If C.topOrigin is present:

      +

      If C.topOrigin is present:

      1. -

        Verify that the Relying Party expects that this credential would have been created within an iframe that is +

        Verify that the Relying Party expects that this credential would have been created within an iframe that is not same-origin with its ancestors.

      2. -

        Verify that the value of C.topOrigin matches the origin of a page -that the Relying Party expects to be sub-framed within.

        +

        Verify that the value of C.topOrigin matches the origin of a page +that the Relying Party expects to be sub-framed within. +See § 13.4.9 Validating the origin of a credential for guidance.

    7. Let hash be the result of computing a hash over response.clientDataJSON using SHA-256.

    8. Perform CBOR decoding on the attestationObject field of the AuthenticatorAttestationResponse structure to obtain the attestation statement format fmt, the authenticator data authData, and the attestation statement attStmt.

    9. -

      Verify that the rpIdHash in authData is the SHA-256 hash of the RP ID expected by the Relying Party.

      +

      Verify that the rpIdHash in authData is the SHA-256 hash of the RP ID expected by the Relying Party.

    10. Verify that the UP bit of the flags in authData is set.

    11. -

      If the Relying Party requires user verification for this registration, +

      If the Relying Party requires user verification for this registration, verify that the UV bit of the flags in authData is set.

    12. -

      If the Relying Party uses the credential’s backup eligibility to inform its user experience flows and/or policies, evaluate the BE bit of the flags in authData.

      +

      If the BE bit of the flags in authData is not set, verify that the BS bit is not set.

    13. -

      If the Relying Party uses the credential’s backup state to inform its user experience flows and/or policies, evaluate the BS bit of the flags in authData.

      +

      If the Relying Party uses the credential’s backup eligibility to inform its user experience flows and/or policies, evaluate the BE bit of the flags in authData.

      +
    14. +

      If the Relying Party uses the credential’s backup state to inform its user experience flows and/or policies, evaluate the BS bit of the flags in authData.

    15. Verify that the "alg" parameter in the credential public key in authData matches the alg attribute of one of the items in options.pubKeyCredParams.

    16. Verify that the values of the client extension outputs in clientExtensionResults and the authenticator extension outputs in the extensions in authData are as expected, considering the client - extension input values that were given in options.extensions and any specific policy of the Relying Party regarding unsolicited extensions, i.e., those that were not specified as part of options.extensions. - In the general case, the meaning of "are as expected" is specific to the Relying Party and which extensions are in use. -

      Note: Client platforms MAY enact local policy that sets additional authenticator extensions or client extensions and thus cause values to appear in the authenticator extension outputs or client extension outputs that were not originally specified as part of options.extensions. Relying Parties MUST be prepared to handle such - situations, whether it be to ignore the unsolicited extensions or reject the attestation. The Relying Party can make this + extension input values that were given in options.extensions and any specific policy of the Relying Party regarding unsolicited extensions, i.e., those that were not specified as part of options.extensions. + In the general case, the meaning of "are as expected" is specific to the Relying Party and which extensions are in use. +

      Note: Client platforms MAY enact local policy that sets additional authenticator extensions or client extensions and thus cause values to appear in the authenticator extension outputs or client extension outputs that were not originally specified as part of options.extensions. Relying Parties MUST be prepared to handle such + situations, whether it be to ignore the unsolicited extensions or reject the attestation. The Relying Party can make this decision based on local policy and the extensions in use.

      -

      Note: Since all extensions are OPTIONAL for both the client and the authenticator, the Relying Party MUST also be +

      Note: Since all extensions are OPTIONAL for both the client and the authenticator, the Relying Party MUST also be prepared to handle cases where none or not all of the requested extensions were acted upon.

      Note: The devicePubKey extension has explicit verification procedures, see § 10.2.2.3.1 Registration (create()).

    17. @@ -5333,18 +5786,18 @@

      Assess the attestation trustworthiness using the outputs of the verification procedure in step 21, as follows:
    18. -

      Verify that the credentialId is ≤ 1023 bytes. Credential IDs larger than this many bytes SHOULD cause the RP to fail this registration ceremony.

      +

      Verify that the credentialId is ≤ 1023 bytes. Credential IDs larger than this many bytes SHOULD cause the RP to fail this registration ceremony.

    19. -

      Verify that the credentialId is not yet registered for any user. If the credentialId is already known then the Relying Party SHOULD fail this registration ceremony.

      -

      NOTE: The rationale for Relying Parties rejecting duplicate credential IDs is as follows: credential IDs contain sufficient entropy that accidental duplication is very unlikely. However, attestation types other than self attestation do not include a self-signature to explicitly prove possession of the credential private key at registration time. Thus an attacker who has managed to obtain a user’s credential ID and credential public key for a site (this could be potentially accomplished in various ways), could attempt to register a victim’s credential as their own at that site. If the Relying Party accepts this new registration and replaces the victim’s existing credential registration, and the credentials are discoverable, then the victim could be forced to sign into the attacker’s account at their next attempt. Data saved to the site by the victim in that state would then be available to the attacker.

      +

      Verify that the credentialId is not yet registered for any user. If the credentialId is already known then the Relying Party SHOULD fail this registration ceremony.

      +

      NOTE: The rationale for Relying Parties rejecting duplicate credential IDs is as follows: credential IDs contain sufficient entropy that accidental duplication is very unlikely. However, attestation types other than self attestation do not include a self-signature to explicitly prove possession of the credential private key at registration time. Thus an attacker who has managed to obtain a user’s credential ID and credential public key for a site (this could be potentially accomplished in various ways), could attempt to register a victim’s credential as their own at that site. If the Relying Party accepts this new registration and replaces the victim’s existing credential registration, and the credentials are discoverable, then the victim could be forced to sign into the attacker’s account at their next attempt. Data saved to the site by the victim in that state would then be available to the attacker.

    20. If the attestation statement attStmt verified successfully and is found to be trustworthy, then create and store a new credential record in the user account that was denoted in options.user, @@ -5356,7 +5809,7 @@
    -

    Verification of attestation objects requires that the Relying Party has a trusted method of determining acceptable trust anchors +

    Verification of attestation objects requires that the Relying Party has a trusted method of determining acceptable trust anchors in step 22 above. -Also, if certificates are being used, the Relying Party MUST have access to certificate status information for the -intermediate CA certificates. The Relying Party MUST also be able to build the attestation certificate chain if the client did not +Also, if certificates are being used, the Relying Party MUST have access to certificate status information for the +intermediate CA certificates. The Relying Party MUST also be able to build the attestation certificate chain if the client did not provide this chain in the attestation information.

    7.2. Verifying an Authentication Assertion

    -

    In order to perform an authentication ceremony, the Relying Party MUST proceed as follows:

    +

    In order to perform an authentication ceremony, the Relying Party MUST proceed as follows:

    1. -

      Let options be a new PublicKeyCredentialRequestOptions structure configured to the Relying Party's needs for the ceremony.

      +

      Let options be a new PublicKeyCredentialRequestOptions structure configured to the Relying Party's needs for the ceremony.

    2. Call navigator.credentials.get() and pass options as the publicKey option. Let credential be the result of the successfully resolved promise. @@ -5415,18 +5868,18 @@

      Let clientExtensionResults be the result of calling credential.getClientExtensionResults().

    3. -

      If options.allowCredentials is not empty, -verify that credential.id identifies one of the public key credentials listed in options.allowCredentials.

      +

      If options.allowCredentials is not empty, +verify that credential.id identifies one of the public key credentials listed in options.allowCredentials.

    4. Identify the user being authenticated and let credentialRecord be the credential record for the credential:

      -
      If the user was identified before the authentication ceremony was initiated, e.g., via a username or cookie, +
      If the user was identified before the authentication ceremony was initiated, e.g., via a username or cookie,

      verify that the identified user account contains a credential record whose id equals credential.rawId. Let credentialRecord be that credential record. If response.userHandle is present, -verify that it equals the user handle of the user account.

      -
      If the user was not identified before the authentication ceremony was initiated, +verify that it equals the user handle of the user account.

      +
      If the user was not identified before the authentication ceremony was initiated,

      verify that response.userHandle is present. Verify that the user account identified by response.userHandle contains a credential record whose id equals credential.rawId. @@ -5448,41 +5901,53 @@

      Verify that the value of C.challenge equals the base64url encoding of options.challenge.

      -
    5. Verify that the value of C.origin matches the Relying Party's origin. +
    6. Verify that the value of C.origin is an origin expected by the Relying Party. + See § 13.4.9 Validating the origin of a credential for guidance.
    7. -

      If C.topOrigin is present:

      +

      If C.topOrigin is present:

      1. -

        Verify that the Relying Party expects this credential to be used within an iframe that is not same-origin with its ancestors.

        +

        Verify that the Relying Party expects this credential to be used within an iframe that is not same-origin with its ancestors.

      2. -

        Verify that the value of C.topOrigin matches the origin of a page -that the Relying Party expects to be sub-framed within.

        +

        Verify that the value of C.topOrigin matches the origin of a page +that the Relying Party expects to be sub-framed within. +See § 13.4.9 Validating the origin of a credential for guidance.

    8. - Verify that the rpIdHash in authData is the SHA-256 hash of the RP ID expected by the Relying Party. + Verify that the rpIdHash in authData is the SHA-256 hash of the RP ID expected by the Relying Party.

      Note: If using the appid extension, this step needs some special logic. See § 10.1.1 FIDO AppID Extension (appid) for details.

    9. -

      Verify that the UP bit of the flags in authData is set.

      +

      Verify that the UP bit of the flags in authData is set.

    10. Determine whether user verification is required for this assertion. User verification SHOULD be required if, and only if, options.userVerification is set to required.

      If user verification was determined to be required, -verify that the UV bit of the flags in authData is set. -Otherwise, ignore the value of the UV flag.

      -
    11. -

      If the credential backup state is used as part of Relying Party business logic or policy, -let currentBe and currentBs be the values of the BE and BS bits, respectively, -of the flags in authData. -Compare currentBe and currentBs with credentialRecord.backupEligible and credentialRecord.backupState and apply Relying Party policy, if any.

      -

      Note: See § 6.1.3 Credential Backup State for examples of how a Relying Party might process the BS flag values.

      +verify that the UV bit of the flags in authData is set. +Otherwise, ignore the value of the UV flag.

      +
    12. +

      If the BE bit of the flags in authData is not set, verify that the BS bit is not set.

      +
    13. +

      If the credential backup state is used as part of Relying Party business logic or policy, +let currentBe and currentBs be the values of the BE and BS bits, respectively, +of the flags in authData. +Compare currentBe and currentBs with credentialRecord.backupEligible and credentialRecord.backupState:

      +
        +
      1. +

        If credentialRecord.backupEligible is set, verify that currentBe is set.

        +
      2. +

        If credentialRecord.backupEligible is not set, verify that currentBe is not set.

        +
      3. +

        Apply Relying Party policy, if any.

        +
      +

      Note: See § 6.1.3 Credential Backup State for examples of how a Relying Party might process the BS flag values.

    14. Verify that the values of the client extension outputs in clientExtensionResults and the authenticator extension outputs in the extensions in authData are as expected, considering the client - extension input values that were given in options.extensions and any specific policy of the Relying Party regarding unsolicited extensions, i.e., those that were not specified as part of options.extensions. - In the general case, the meaning of "are as expected" is specific to the Relying Party and which extensions are in use. -

      Note: Client platforms MAY enact local policy that sets additional authenticator extensions or client extensions and thus cause values to appear in the authenticator extension outputs or client extension outputs that were not originally specified as part of options.extensions. Relying Parties MUST be prepared to handle such - situations, whether it be to ignore the unsolicited extensions or reject the assertion. The Relying Party can make this + extension input values that were given in options.extensions and any specific policy of the Relying Party regarding unsolicited extensions, i.e., those that were not specified as part of options.extensions. + In the general case, the meaning of "are as expected" is specific to the Relying Party and which extensions are in use. +

      Note: Client platforms MAY enact local policy that sets additional authenticator extensions or client extensions and thus cause values to appear in the authenticator extension outputs or client extension outputs that were not originally specified as part of options.extensions. Relying Parties MUST be prepared to handle such + situations, whether it be to ignore the unsolicited extensions or reject the assertion. The Relying Party can make this decision based on local policy and the extensions in use.

      -

      Note: Since all extensions are OPTIONAL for both the client and the authenticator, the Relying Party MUST also be +

      Note: Since all extensions are OPTIONAL for both the client and the authenticator, the Relying Party MUST also be prepared to handle cases where none or not all of the requested extensions were acted upon.

      Note: The devicePubKey extension has explicit verification procedures, see § 10.2.2.3.2 Authentication (get()).

    15. @@ -5504,16 +5969,16 @@

      This is a signal that the authenticator may be cloned, i.e. at least two copies of the credential private key may exist and are - being used in parallel. Relying Parties should incorporate this information + being used in parallel. Relying Parties should incorporate this information into their risk scoring. - Whether the Relying Party updates credentialRecord.signCount below in this case, or not, or fails the authentication ceremony or not, is Relying Party-specific. + Whether the Relying Party updates credentialRecord.signCount below in this case, or not, or fails the authentication ceremony or not, is Relying Party-specific.

    16. -

      If response.attestationObject is present and the Relying Party wishes to verify the attestation then perform CBOR decoding on attestationObject to obtain the attestation statement format fmt, and the attestation statement attStmt.

      +

      If response.attestationObject is present and the Relying Party wishes to verify the attestation then perform CBOR decoding on attestationObject to obtain the attestation statement format fmt, and the attestation statement attStmt.

      1. -

        Verify that the AT bit in the flags field of authData is set, indicating that attested credential data is included.

        +

        Verify that the AT bit in the flags field of authData is set, indicating that attested credential data is included.

      2. Verify that the credentialPublicKey and credentialId fields of the attested credential data in authData match credentialRecord.publicKey and credentialRecord.id, respectively.

      3. @@ -5533,17 +5998,17 @@

        Update credentialRecord.backupState to the value of currentBs.

      4. If credentialRecord.uvInitialized is false, -update it to the value of the UV bit in the flags in authData. +update it to the value of the UV bit in the flags in authData. This change SHOULD require authorization by an additional authentication factor equivalent to WebAuthn user verification; if not authorized, skip this step.

      5. OPTIONALLY, if response.attestationObject is present, update credentialRecord.attestationObject to the value of response.attestationObject and update credentialRecord.attestationClientDataJSON to the value of response.clientDataJSON.

      -

      If the Relying Party performs additional security checks beyond these WebAuthn authentication ceremony steps, +

      If the Relying Party performs additional security checks beyond these WebAuthn authentication ceremony steps, the above state updates SHOULD be deferred to after those additional checks are completed successfully.

    17. -

      If all the above steps are successful, continue with the authentication ceremony as appropriate. Otherwise, fail the authentication ceremony.

      +

      If all the above steps are successful, continue with the authentication ceremony as appropriate. Otherwise, fail the authentication ceremony.

    8. Defined Attestation Statement Formats

    WebAuthn supports pluggable attestation statement formats. This section defines an initial set of such formats.

    @@ -5566,7 +6031,7 @@

    [IANA-WebAuthn-Registries] established by [RFC8809].

    8.2. Packed Attestation Statement Format

    This is a WebAuthn optimized attestation statement format. It uses a very compact but still extensible encoding method. It is -implementable by authenticators with limited resources (e.g., secure elements).

    +implementable by authenticators with limited resources (e.g., secure elements).

    Attestation statement format identifier
    @@ -5821,11 +6286,11 @@

    < See, for example, the FIDO Metadata Service [FIDOMetadataService].

    8.4. Android Key Attestation Statement Format

    -

    When the authenticator in question is a platform authenticator on the Android "N" or later platform, the +

    When the authenticator in question is a platform authenticator on the Android "N" or later platform, the attestation statement is based on the Android key attestation. In these cases, the attestation statement is produced by a component running in a secure operating environment, but the authenticator data for the attestation is -produced outside this environment. The WebAuthn Relying Party is expected to check that the authenticator data claimed to have been used for +produced outside this environment. The WebAuthn Relying Party is expected to check that the authenticator data claimed to have been used for the attestation is consistent with the fields of the attestation certificate’s extension data.

    Attestation statement format identifier @@ -5898,7 +6363,7 @@

    8.5. Android SafetyNet Attestation Statement Format

    -

    When the authenticator is a platform authenticator on certain Android platforms, the attestation +

    When the authenticator is a platform authenticator on certain Android platforms, the attestation statement may be based on the SafetyNet API. In this case the authenticator data is completely controlled by the caller of the SafetyNet API (typically an application running on the Android platform) and the attestation statement provides some statements about the health of the platform @@ -5991,7 +6456,7 @@

    sig

    The attestation signature. -The signature was calculated over the (raw) U2F registration response message [FIDO-U2F-Message-Formats] received by the client from the authenticator.

    +The signature was calculated over the (raw) U2F registration response message [FIDO-U2F-Message-Formats] received by the client from the authenticator.

    Signing procedure
    @@ -6046,9 +6511,9 @@

    8.7. None Attestation Statement Format

    -

    The none attestation statement format is used to replace any authenticator-provided attestation statement when a WebAuthn Relying Party indicates it does not wish to receive attestation information, see § 5.4.7 Attestation Conveyance Preference Enumeration (enum AttestationConveyancePreference).

    -

    The authenticator MAY also directly generate attestation statements of this format -if the authenticator does not support attestation.

    +

    The none attestation statement format is used to replace any authenticator-provided attestation statement when a WebAuthn Relying Party indicates it does not wish to receive attestation information, see § 5.4.7 Attestation Conveyance Preference Enumeration (enum AttestationConveyancePreference).

    +

    The authenticator MAY also directly generate attestation statements of this format +if the authenticator does not support attestation.

    Attestation statement format identifier
    @@ -6149,10 +6614,10 @@

    Client extension processing for registration extensions and authentication extensions.

    -

    When creating a public key credential or requesting an authentication assertion, a WebAuthn Relying Party can request the use of a set -of extensions. These extensions will be invoked during the requested operation if they are supported by the client and/or the WebAuthn Authenticator. The Relying Party sends the client extension input for each extension in the get() call -(for authentication extensions) or create() call (for registration extensions) to the client. -The client performs client extension processing for each extension that the client platform supports, and augments the client data as specified by each extension, by including the extension identifier and client extension output values.

    +

    When creating a public key credential or requesting an authentication assertion, a WebAuthn Relying Party can request the use of a set +of extensions. These extensions will be invoked during the requested operation if they are supported by the client and/or the WebAuthn Authenticator. The Relying Party sends the client extension input for each extension in the get() call +(for authentication extensions) or create() call (for registration extensions) to the client. +The client performs client extension processing for each extension that the client platform supports, and augments the client data as specified by each extension, by including the extension identifier and client extension output values.

    An extension can also be an authenticator extension, meaning that the extension involves communication with and processing by the authenticator. Authenticator extensions define the following steps and data:

    Note: In practice, several implementations do not implement steps four and onward of the @@ -6358,9 +6823,9 @@

    Client extension output
    -

    Returns the value of output. If true, the AppID was used and thus, when verifying the assertion, the Relying Party MUST expect the rpIdHash to be the hash of the AppID, not the RP ID.

    +

    Returns the value of output. If true, the AppID was used and thus, when verifying the assertion, the Relying Party MUST expect the rpIdHash to be the hash of the AppID, not the RP ID.

    partial dictionary AuthenticationExtensionsClientOutputs {
    -  boolean appid;
    +  boolean appid;
     };
     
    Authenticator extension input @@ -6374,8 +6839,8 @@

    None.

    10.1.2. FIDO AppID Exclusion Extension (appidExclude)

    -

    This registration extension allows WebAuthn Relying Parties to exclude authenticators that contain specified credentials that were created with the legacy FIDO U2F JavaScript API [FIDOU2FJavaScriptAPI].

    -

    During a transition from the FIDO U2F JavaScript API, a Relying Party may have a population of users with legacy credentials already registered. The appid extension allows the sign-in flow to be transitioned smoothly but, when transitioning the registration flow, the excludeCredentials field will not be effective in excluding authenticators with legacy credentials because its contents are taken to be WebAuthn credentials. This extension directs client platforms to consider the contents of excludeCredentials as both WebAuthn and legacy FIDO credentials. Note that U2F key handles commonly use base64url encoding but must be decoded to their binary form when used in excludeCredentials.

    +

    This registration extension allows WebAuthn Relying Parties to exclude authenticators that contain specified credentials that were created with the legacy FIDO U2F JavaScript API [FIDOU2FJavaScriptAPI].

    +

    During a transition from the FIDO U2F JavaScript API, a Relying Party may have a population of users with legacy credentials already registered. The appid extension allows the sign-in flow to be transitioned smoothly but, when transitioning the registration flow, the excludeCredentials field will not be effective in excluding authenticators with legacy credentials because its contents are taken to be WebAuthn credentials. This extension directs client platforms to consider the contents of excludeCredentials as both WebAuthn and legacy FIDO credentials. Note that U2F key handles commonly use base64url encoding but must be decoded to their binary form when used in excludeCredentials.

    Extension identifier
    @@ -6405,7 +6870,7 @@
    -

    Note: If PRF results are obtained during registration then the Relying Party MUST inspect the UV bit in the flags of the response in order to determine the correct value of userVerification for future assertions. Otherwise results from assertions may be inconsistent with those from the registration.

    +

    Note: If PRF results are obtained during registration then the Relying Party MUST inspect the UV bit in the flags of the response in order to determine the correct value of userVerification for future assertions. Otherwise results from assertions may be inconsistent with those from the registration.

    Client extension processing (authentication)
    1. -

      If evalByCredential is not empty but allowCredentials is empty, return a DOMException whose name is “NotSupportedError”.

      +

      If evalByCredential is not empty but allowCredentials is empty, return a DOMException whose name is “NotSupportedError”.

    2. -

      If any key in evalByCredential is the empty string, or is not a valid base64url encoding, or does not equal the id of some element of allowCredentials after performing base64url decoding, then return a DOMException whose name is “SyntaxError”.

      +

      If any key in evalByCredential is the empty string, or is not a valid base64url encoding, or does not equal the id of some element of allowCredentials after performing base64url decoding, then return a DOMException whose name is “SyntaxError”.

    3. Initialize the prf extension output to an empty dictionary.

    4. @@ -6605,18 +7070,18 @@

      second is present, let salt2 be the value of SHA-256(UTF8Encode("WebAuthn PRF") || 0x00 || ev.second).

    5. -

      Send an hmac-secret extension to the authenticator using the values of salt1 and, if set, salt2 as the parameters of the same name in that process.

      +

      Send an hmac-secret extension to the authenticator using the values of salt1 and, if set, salt2 as the parameters of the same name in that process.

    6. Decrypt the extension result and set results to the PRF result(s), if any.

    Authenticator extension input / processing / output
    -

    This extension uses the [FIDO-CTAP] hmac-secret extension when communicating with the authenticator. It thus does not specify any direct authenticator interaction for Relying Parties.

    +

    This extension uses the [FIDO-CTAP] hmac-secret extension when communicating with the authenticator. It thus does not specify any direct authenticator interaction for Relying Parties.

    Client extension output
    dictionary AuthenticationExtensionsPRFOutputs {
    -    boolean enabled;
    +    boolean enabled;
         AuthenticationExtensionsPRFValues results;
     };
     
    @@ -6626,7 +7091,7 @@ 

    enabled, of type boolean +
    enabled, of type boolean

    true if, and only if, the one or two PRFs are available for use with the created credential. This is only reported during registration and is not present in the case of authentication.

    results, of type AuthenticationExtensionsPRFValues @@ -6636,14 +7101,14 @@

    10.1.5. Large blob storage extension (largeBlob)

    -

    This client registration extension and authentication extension allows a Relying Party to store opaque data associated with a credential. Since authenticators can only store small amounts of data, and most Relying Parties are online services that can store arbitrary amounts of state for a user, this is only useful in specific cases. For example, the Relying Party might wish to issue certificates rather than run a centralised authentication service.

    -

    Note: Relying Parties can assume that the opaque data will be compressed when being written to a space-limited device and so need not compress it themselves.

    -

    Since a certificate system needs to sign over the public key of the credential, and that public key is only available after creation, this extension does not add an ability to write blobs in the registration context. However, Relying Parties SHOULD use the registration extension when creating the credential if they wish to later use the authentication extension.

    +

    This client registration extension and authentication extension allows a Relying Party to store opaque data associated with a credential. Since authenticators can only store small amounts of data, and most Relying Parties are online services that can store arbitrary amounts of state for a user, this is only useful in specific cases. For example, the Relying Party might wish to issue certificates rather than run a centralised authentication service.

    +

    Note: Relying Parties can assume that the opaque data will be compressed when being written to a space-limited device and so need not compress it themselves.

    +

    Since a certificate system needs to sign over the public key of the credential, and that public key is only available after creation, this extension does not add an ability to write blobs in the registration context. However, Relying Parties SHOULD use the registration extension when creating the credential if they wish to later use the authentication extension.

    Since certificates are sizable relative to the storage capabilities of typical authenticators, user agents SHOULD consider what indications and confirmations are suitable to best guide the user in allocating this limited resource and prevent abuse.

    Note: In order to interoperate, user agents storing large blobs on authenticators using [FIDO-CTAP] are expected to use the provisions detailed in that specification for storing large, per-credential blobs.

    -

    Note: Roaming authenticators that use [FIDO-CTAP] as their cross-platform transport protocol only support this Large Blob extension for discoverable credentials, +

    Note: Roaming authenticators that use [FIDO-CTAP] as their cross-platform transport protocol only support this Large Blob extension for discoverable credentials, and might return an error unless authenticatorSelection.residentKey is set to preferred or required. -However, authenticators that do not utilize [FIDO-CTAP] do not necessarily restrict this extension to discoverable credentials.

    +However, authenticators that do not utilize [FIDO-CTAP] do not necessarily restrict this extension to discoverable credentials.

    Extension identifier
    @@ -6663,22 +7128,22 @@

    < }; dictionary AuthenticationExtensionsLargeBlobInputs { - DOMString support; - boolean read; + DOMString support; + boolean read; BufferSource write; };

    -
    support, of type DOMString +
    support, of type DOMString

    A DOMString that takes one of the values of LargeBlobSupport. (See § 2.1.1 Enumerations as DOMString types.) Only valid during registration.

    -
    read, of type boolean +
    read, of type boolean
    -

    A boolean that indicates that the Relying Party would like to fetch the previously-written blob associated with the asserted credential. Only valid during authentication.

    +

    A boolean that indicates that the Relying Party would like to fetch the previously-written blob associated with the asserted credential. Only valid during authentication.

    write, of type BufferSource
    -

    An opaque byte string that the Relying Party wishes to store with the existing credential. Only valid during authentication.

    +

    An opaque byte string that the Relying Party wishes to store with the existing credential. Only valid during authentication.

    Client extension processing (registration) @@ -6688,7 +7153,7 @@

    <

    If read or write is present:

    1. -

      Return a DOMException whose name is “NotSupportedError”.

      +

      Return a DOMException whose name is “NotSupportedError”.

  • If support is present and has the value required:

    @@ -6700,7 +7165,7 @@

    < The AuthenticationExtensionsLargeBlobOutputs will be abandoned if no satisfactory authenticator becomes available.

  • If a candidate authenticator becomes available (Step 20 of [[Create]]()) then, - before evaluating any options, continue (i.e. ignore the candidate authenticator) + before evaluating any options, continue (i.e. ignore the candidate authenticator) if the candidate authenticator is not capable of storing large blobs.

  • @@ -6717,13 +7182,13 @@

    <

    If support is present:

    1. -

      Return a DOMException whose name is “NotSupportedError”.

      +

      Return a DOMException whose name is “NotSupportedError”.

  • If both read and write are present:

    1. -

      Return a DOMException whose name is “NotSupportedError”.

      +

      Return a DOMException whose name is “NotSupportedError”.

  • If read is present and has the value true:

    @@ -6740,13 +7205,13 @@

    <

    If write is present:

    1. -

      If allowCredentials does not contain exactly one element:

      +

      If allowCredentials does not contain exactly one element:

      1. -

        Return a DOMException whose name is “NotSupportedError”.

        +

        Return a DOMException whose name is “NotSupportedError”.

    2. -

      If the assertion operation is successful, attempt to store the contents of write on the authenticator, associated with the indicated credential.

      +

      If the assertion operation is successful, attempt to store the contents of write on the authenticator, associated with the indicated credential.

    3. Set written to true if successful and false otherwise.

    @@ -6758,27 +7223,27 @@

    < }; dictionary AuthenticationExtensionsLargeBlobOutputs { - boolean supported; + boolean supported; ArrayBuffer blob; - boolean written; + boolean written; };
    -
    supported, of type boolean +
    supported, of type boolean

    true if, and only if, the created credential supports storing large blobs. Only present in registration outputs.

    blob, of type ArrayBuffer

    The opaque byte string that was associated with the credential identified by rawId. Only valid if read was true.

    -
    written, of type boolean +
    written, of type boolean
    -

    A boolean that indicates that the contents of write were successfully stored on the authenticator, associated with the specified credential.

    +

    A boolean that indicates that the contents of write were successfully stored on the authenticator, associated with the specified credential.

    Authenticator extension processing
    -

    This extension directs the user-agent to cause the large blob to be stored on, or retrieved from, the authenticator. It thus does not specify any direct authenticator interaction for Relying Parties.

    +

    This extension directs the user-agent to cause the large blob to be stored on, or retrieved from, the authenticator. It thus does not specify any direct authenticator interaction for Relying Parties.

  • 10.2. Authenticator Extensions

    This section defines extensions that are both client extensions and authenticator extensions.

    @@ -6793,9 +7258,9 @@

    Registration and Authentication

    Client extension input
    -

    The Boolean value true to indicate that this extension is requested by the Relying Party.

    +

    The Boolean value true to indicate that this extension is requested by the Relying Party.

    partial dictionary AuthenticationExtensionsClientInputs {
    -  boolean uvm;
    +  boolean uvm;
     };
     
    Client extension processing @@ -6804,8 +7269,8 @@

    Client extension output

    Returns a JSON array of 3-element arrays of numbers that encodes the factors in the authenticator extension output.

    -
    typedef sequence<unsigned long> UvmEntry;
    -typedef sequence<UvmEntry> UvmEntries;
    +
    typedef sequence<unsigned long> UvmEntry;
    +typedef sequence<UvmEntry> UvmEntries;
     
     partial dictionary AuthenticationExtensionsClientOutputs {
       UvmEntries uvm;
    @@ -6820,7 +7285,7 @@ 

    Authenticator extension processing
    -

    The authenticator sets the authenticator extension output to be one or more user verification methods indicating the method(s) used +

    The authenticator sets the authenticator extension output to be one or more user verification methods indicating the method(s) used by the user to authorize the operation, as defined below. This extension can be added to attestation objects and assertions.

    Authenticator extension output
    @@ -6873,19 +7338,19 @@

    10.2.2. Device-bound public key extension (devicePubKey)

    -

    This authenticator registration extension and authentication extension provides a Relying Party with a "device continuity" signal for backup eligible credentials. This is done by creating a user credential-specific hardware-bound device key pair on the authenticator, if such a key pair does not already exist for the user credential being created or exercised, and returning the device public key along with a signature by the device private key to the Relying Party. This is done each time this devicePubKey extension is included with either a navigator.credentials.create() or navigator.credentials.get() call.

    -

    If the authenticator is incapable of generating a hardware-bound device key pair, or the registration or authentication operation fails for any reason, this extension is ignored and no hardware-bound device key pair is created. In this case, there is no devicePubKey extension output generated.

    -

    The hardware-bound device key pair is not on its own a user credential and does not have its own credential ID. Instead, the returned device public key is a device-specific contextual attribute of its associated user credential. That is, when that user credential is used—along with the devicePubKey extension—on a particular authenticator, a particular device public key is returned by the extension, along with a signature demonstrating proof-of-possession of the device private key by that device.

    +

    This authenticator registration extension and authentication extension provides a Relying Party with a "device continuity" signal for backup eligible credentials. This is done by creating a user credential-specific hardware-bound device key pair on the authenticator, if such a key pair does not already exist for the user credential being created or exercised, and returning the device public key along with a signature by the device private key to the Relying Party. This is done each time this devicePubKey extension is included with either a navigator.credentials.create() or navigator.credentials.get() call.

    +

    If the authenticator is incapable of generating a hardware-bound device key pair, or the registration or authentication operation fails for any reason, this extension is ignored and no hardware-bound device key pair is created. In this case, there is no devicePubKey extension output generated.

    +

    The hardware-bound device key pair is not on its own a user credential and does not have its own credential ID. Instead, the returned device public key is a device-specific contextual attribute of its associated user credential. That is, when that user credential is used—along with the devicePubKey extension—on a particular authenticator, a particular device public key is returned by the extension, along with a signature demonstrating proof-of-possession of the device private key by that device.

    10.2.2.1. Relying Party Usage
    -

    This extension is intended for use by those Relying Parties employing risk-analysis systems informing their sign-in decisions. This extension provides a "device continuity" signal when used consistently with both navigator.credentials.create() and navigator.credentials.get() operations:

    -

    When a Relying Party uses the devicePubKey extension with a create() call to create a new user credential, a signature by a new device-bound key ("dpk 1") is returned along with the new device public key. Even if the user credential is backed up, "dpk 1" never leaves the generating authenticator ("authenticator 1"). The Relying Party's subsequent get() operations using the same user credential with that same authenticator generate assertions including further signatures by the same device-bound key ("dpk 1"). This behavior on "authenticator 1" is independent of whether this user credential has been copied to any other authenticator.

    -

    Then, if this same user credential is copied to a different authenticator ("authenticator 2"), the Relying Party's first get() call on "authenticator 2" (that includes the devicePubKey extension) will produce an assertion including a signature by a new device-bound key ("dpk 2"). Note that such a multi-device credential can be exercised on "authenticator 2" without a create() having been performed on "authenticator 2". The Relying Party's subsequent get() calls on "authenticator 2", using the devicePubKey extension and the same user credential, yield further signatures by "dpk 2".

    +

    This extension is intended for use by those Relying Parties employing risk-analysis systems informing their sign-in decisions. This extension provides a "device continuity" signal when used consistently with both navigator.credentials.create() and navigator.credentials.get() operations:

    +

    When a Relying Party uses the devicePubKey extension with a create() call to create a new user credential, a signature by a new device-bound key ("dpk 1") is returned along with the new device public key. Even if the user credential is backed up, "dpk 1" never leaves the generating authenticator ("authenticator 1"). The Relying Party's subsequent get() operations using the same user credential with that same authenticator generate assertions including further signatures by the same device-bound key ("dpk 1"). This behavior on "authenticator 1" is independent of whether this user credential has been copied to any other authenticator.

    +

    Then, if this same user credential is copied to a different authenticator ("authenticator 2"), the Relying Party's first get() call on "authenticator 2" (that includes the devicePubKey extension) will produce an assertion including a signature by a new device-bound key ("dpk 2"). Note that such a multi-device credential can be exercised on "authenticator 2" without a create() having been performed on "authenticator 2". The Relying Party's subsequent get() calls on "authenticator 2", using the devicePubKey extension and the same user credential, yield further signatures by "dpk 2".

    A usage example is thus:

    Say that a sign-in request appears at a website along with some geolocation signal that has not been seen for this user account before, and is outside of the typical usage hours observed for the account. The risk may be deemed high enough not to allow the request, even with an assertion by a multi-device credential on its own. But if a signature by a device-bound key that is well established for this user can also be presented, then that may tip the balance.

    -

    Note: Relying Parties need to take care to verify device-bound key signatures before associating and storing extension output value fields in conjunction with the user account. See § 10.2.2.3 devicePubKey Extension Output Verification Procedures.

    -

    The weight that Relying Parties give to the presence of a signature from a device-bound key may be based on information learned from its optional attestation. An attestation can indicate the level of protection that the hardware offers the private key, certifications for the hardware, etc.

    +

    Note: Relying Parties need to take care to verify device-bound key signatures before associating and storing extension output value fields in conjunction with the user account. See § 10.2.2.3 devicePubKey Extension Output Verification Procedures.

    +

    The weight that Relying Parties give to the presence of a signature from a device-bound key may be based on information learned from its optional attestation. An attestation can indicate the level of protection that the hardware offers the private key, certifications for the hardware, etc.

    10.2.2.2. Extension Definition
    Extension identifier @@ -6897,8 +7362,8 @@
    dictionary AuthenticationExtensionsDevicePublicKeyInputs { - DOMString attestation = "none"; - sequence<DOMString> attestationFormats = []; + DOMString attestation = "none"; + sequence<DOMString> attestationFormats = []; }; partial dictionary AuthenticationExtensionsClientInputs { @@ -6907,17 +7372,17 @@
    attestation, of type DOMString, defaulting to "none" +
    attestation, of type DOMString, defaulting to "none"
    -

    The Relying Party MAY use this OPTIONAL member to specify a preference regarding attestation conveyance. -Its value SHOULD be a member of AttestationConveyancePreference. Client platforms MUST ignore unknown values, treating an unknown value as if the member does not exist.

    +

    The Relying Party MAY use this OPTIONAL member to specify a preference regarding attestation conveyance. +Its value SHOULD be a member of AttestationConveyancePreference. Client platforms MUST ignore unknown values, treating an unknown value as if the member does not exist.

    The default value is none.

    -
    attestationFormats, of type sequence<DOMString>, defaulting to [] +
    attestationFormats, of type sequence<DOMString>, defaulting to []
    -

    The Relying Party MAY use this OPTIONAL member to specify a preference regarding the attestation statement format used by the authenticator. +

    The Relying Party MAY use this OPTIONAL member to specify a preference regarding the attestation statement format used by the authenticator. Values SHOULD be taken from the IANA "WebAuthn Attestation Statement Format Identifiers" registry [IANA-WebAuthn-Registries] established by [RFC8809]. Values are ordered from most preferable to least preferable. -This parameter is advisory and the authenticator MAY use an attestation statement not enumerated in this parameter.

    +This parameter is advisory and the authenticator MAY use an attestation statement not enumerated in this parameter.

    The default value is the empty list, which indicates no preference.

    @@ -6955,7 +7420,7 @@
    public key credential source is not backup eligible then terminate these processing steps: this extension only applies to multi-device credentials.

  • -

    If a hardware-bound device key pair does not already exist for this {Credential ID, RP ID, userHandle} tuple on the authenticator, create it using the same public key algorithm as that used by the user credential's credential key pair, otherwise locate the existing device-bound key.

    +

    If a hardware-bound device key pair does not already exist for this {Credential ID, RP ID, userHandle} tuple on the authenticator, create it using the same public key algorithm as that used by the user credential's credential key pair, otherwise locate the existing device-bound key.

  • Let attFormat be the chosen attestation statement format, and attAaguid be a 16-byte value, based on the value of attestation in the extension input:

    @@ -7040,11 +7505,11 @@
    attAaguid is 16 zero bytes. (Note that, since the device-bound key is already exercised during navigator.credentials.get() calls, the proof-of-possession property provided by "self" attestation is superfluous in that context.)

    indirect, direct
    -

    attFormat is an attestation statement format appropriate for this authenticator based on attestationFormats, and attAaguid is the authenticator’s AAGUID. (Since the hardware-bound device key pair is specific to a particular authenticator, its attestation can be tied to hardware roots of trust, although they do not have to be. This is in contrast to the associated user credential's attestation, if it is a multi-device credential.)

    +

    attFormat is an attestation statement format appropriate for this authenticator based on attestationFormats, and attAaguid is the authenticator’s AAGUID. (Since the hardware-bound device key pair is specific to a particular authenticator, its attestation can be tied to hardware roots of trust, although they do not have to be. This is in contrast to the associated user credential's attestation, if it is a multi-device credential.)

    enterprise
    -

    The Relying Party wants to receive an attestation statement that may include uniquely identifying information. This is intended for controlled deployments within an enterprise where the organization wishes to tie registrations to specific authenticators. Authenticators MUST NOT provide such an attestation unless the user agent or authenticator configuration expressly permits it for the requested RP ID. If not permitted, then attFormat is "none" and attAaguid is 16 zero bytes. Otherwise attFormat is an attestation statement format appropriate for this authenticator based on attestationFormats, and attAaguid is the authenticator’s AAGUID. (Again, since the hardware-bound device key pair is specific to a particular authenticator, the attestation may be tied to hardware roots of trust.)

    -

    Note: CTAP2 does not currently provide for an enterpriseAttestation signal during an authenticatorGetAssertion call. Until that is changed, platform-managed enterprise attestation will not work in that context with CTAP2 authenticators.

    +

    The Relying Party wants to receive an attestation statement that may include uniquely identifying information. This is intended for controlled deployments within an enterprise where the organization wishes to tie registrations to specific authenticators. Authenticators MUST NOT provide such an attestation unless the user agent or authenticator configuration expressly permits it for the requested RP ID. If not permitted, then attFormat is "none" and attAaguid is 16 zero bytes. Otherwise attFormat is an attestation statement format appropriate for this authenticator based on attestationFormats, and attAaguid is the authenticator’s AAGUID. (Again, since the hardware-bound device key pair is specific to a particular authenticator, the attestation may be tied to hardware roots of trust.)

    +

    Note: CTAP2 does not currently provide for an enterpriseAttestation signal during an authenticatorGetAssertion call. Until that is changed, platform-managed enterprise attestation will not work in that context with CTAP2 authenticators.

  • Let dpk be the newly created or existing device public key, in COSE_Key format in the same fashion as for the user credential’s credentialPublicKey when the latter is conveyed in attested credential data.

    @@ -7052,7 +7517,7 @@