<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-santesson-r2ps-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="R2PS">Remote Two-factor Protected Services</title>
    <seriesInfo name="Internet-Draft" value="draft-santesson-r2ps-00"/>
    <author initials="S." surname="Santesson" fullname="Stefan Santesson">
      <organization abbrev="IDsec Solutions">IDsec Solutions AB</organization>
      <address>
        <postal>
          <street>Forskningsbyn Ideon</street>
          <city>Lund</city>
          <code>223 70</code>
          <country>SE</country>
        </postal>
        <email>sts@aaa-sec.com</email>
      </address>
    </author>
    <author initials="P." surname="Altmann" fullname="Peter Altmann">
      <organization abbrev="SIROS">SIROS Foundation</organization>
      <address>
        <postal>
          <city>Stockholm</city>
          <country>SE</country>
        </postal>
        <email>peter.altman@siros.se</email>
      </address>
    </author>
    <date year="2026" month="June" day="15"/>
    <keyword>remote</keyword>
    <keyword>HSM</keyword>
    <keyword>opaque</keyword>
    <keyword>services</keyword>
    <abstract>
      <?line 51?>

<t>This document defines a generic service exchange protocol where service exchange data is protected and bound to a physical user using 1 or 2 factors (1FA and 2FA). The protocol facilitates registration and verification of either a knowledge-factor or a biometric factor in addition to a possession factor as means of achieving 2 factor protection.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-santesson-r2ps/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/Razumain/r2ps-ietf-draft"/>.</t>
    </note>
  </front>
  <middle>
    <?line 55?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Password-Authenticated Key Exchange (PAKE) protocols let two parties derive a shared key from a low-entropy password without disclosing it, while resisting offline guessing. An augmented PAKE (aPAKE) further protects against server compromise.</t>
      <t>This document complements the capabilities of PAKE protocols by defining a service exchange protocol that can be used to:</t>
      <ul spacing="normal">
        <li>
          <t>exchange data for a selected PAKE protocol, or any other protocol that validates a user knowledge or biometric factor, to establish a shared session key; and</t>
        </li>
        <li>
          <t>exchange service data protected under that session key.</t>
        </li>
      </ul>
      <t>This document uses the OPAQUE aPAKE <xref target="RFC9807"/> as its <bcp14>RECOMMENDED</bcp14> mechanism for verifying a knowledge factor without exposing it to the server.</t>
      <section anchor="applicability-for-eu-trust-frameworks">
        <name>Applicability for EU trust frameworks</name>
        <t>EU has defined a level of assurance framework for user authentication based on an eID [1502]. On the highest assurance level (LoA High) the key used to authenticate the user must be protected by tamper resistant hardware (HSM) that protects against an adversary with high attack potential. This framework further specifies that access to the protected authentication key must be protected by 2-factor authentication.</t>
        <t>The EU Digital Identity Wallet (EUDI Wallet) defined by the new eIDAS regulation [{add ref}] specifies that HSM protection when the wallet provides authentication on LoA High, must be realized by a Wallet Secure Cryptographic Application (WSCA) that includes a Wallet Secure Cryptographic Device (WSCD).</t>
        <t>The WSCA is a software module responsible for controlling access to keys protected by the hardware module (WSCD).</t>
        <t>Some wallet actions, such as presenting a Verifiable Presentation on LoA High, requires the user to provide a knowledge-factor or a biometric factor together with a possession factor to access necessary keys. This action may require one or more service request to a backend service such as the WSCA.</t>
        <t>This protocol is designed as a framework for such service exchanges based on two-factor user authentication that allows the client and server to use any suitable mechanism for user authentication.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<section anchor="definitions">
        <name>Definitions</name>
        <t>The following terms have a defined meaning in this document:</t>
        <ul spacing="normal">
          <li>
            <t>context: A security scope, cryptographically separated from other contexts by a unique set of context keys held at the client and the server. The client-side context keys also represent the user's possession factor in two-factor protection modes.</t>
          </li>
          <li>
            <t>context key: A public/private key pair. Each context is bound to one context key-agreement key and one context signing key, at both the server and the client.</t>
          </li>
          <li>
            <t>protection mode: This document defines two protection modes, one-factor protection (1FA) and two-factor protection (2FA). 1FA provides protection based on one user factor (the possession factor); 2FA provides protection based on two user factors (the possession factor together with a knowledge or biometric factor).</t>
          </li>
          <li>
            <t>session: A scope bound to a session key derived from two-factor authentication of the user, which requires the user to be present to provide a knowledge or biometric factor. A session <bcp14>MAY</bcp14> be bound to a specific task.</t>
          </li>
          <li>
            <t>service type: A defined message type, with its own data structure, that can be exchanged using R2PS.</t>
          </li>
          <li>
            <t>task: Defines what a session is to achieve before it is terminated. A task <bcp14>MAY</bcp14> be negotiated when creating a session and lets the client and the server terminate the session as soon as the task completes or fails, even before the session timeout is reached.</t>
          </li>
          <li>
            <t>first factor: The user's possession factor, which corresponds to a set of client context keys.</t>
          </li>
          <li>
            <t>second factor: The user's knowledge factor or biometric factor.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="basic-structure">
      <name>Basic structure</name>
      <t>R2PS is a stateless request/response protocol. Each request and each response is carried as a JSON Web Encryption (JWE) object <xref target="RFC7516"/> in compact serialization, providing end-to-end encryption between the client and the backend server that provides the service. The JWE payload is a JSON Web Signature (JWS) object <xref target="RFC7515"/> in compact serialization, signed by the sender, that carries a request or response structure common to all exchanges together with service data identified by a service type.</t>
      <t>The backend server determines the protection mode from the JWE protected header. R2PS defines two protection modes: <tt>1FA</tt>, authenticated by a possession factor (the device key); and <tt>2FA</tt>, authenticated additionally by the user's second factor. The service type identifier carried in the inner JWS determines the structure of the service data, the operations performed, and the required protection mode.</t>
      <figure>
        <name>R2PS outer JWE and inner JWS structure</name>
        <artwork type="ascii-art"><![CDATA[
+-----------------------------------------------------------------+
| JWE  (compact serialization)                                    |
|   protected header: typ (r2ps-1fa | r2ps-2fa), alg, enc         |
|                                                                 |
| +-----------------------------------------------------------+   |
| | JWS  (compact serialization)                              |   |
| |   protected header:                                       |   |
| |     typ (r2ps-request+jwt | r2ps-response+jwt),           |   |
| |     alg=ES256, kid                                        |   |
| |                                                           |   |
| |   payload:                                                |   |
| |     ver, nonce, iat       (common to all exchanges)       |   |
| |     type, jwe_hash        (requests only)                 |   |
| |     data { service-specific request or response }         |   |
| +-----------------------------------------------------------+   |
+-----------------------------------------------------------------+
]]></artwork>
      </figure>
      <t>The protocol allows the client and server to agree on any number of service type identifiers, each having its own defined data structure for request and response data.</t>
      <t>While the base protocol structure has no state, the inner service data structure may be used in a process that requires state. This is defined by each service type.</t>
      <t>This specification defines a set of default service types. Other service types <bcp14>MAY</bcp14> be defined by other documents.</t>
      <section anchor="bootstrapping-the-protocol">
        <name>Bootstrapping the protocol</name>
        <t>The protocol is designed to serve the need for service exchange with many different server resources, each cryptographically separated from the others.</t>
        <t>This is achieved by means of separate "context keys" at the client and server. A security context is a named scope identified by a context id, under which a set of service types is offered with a common security and key-management policy. Each security context has its own context key set (a signing key and a key-agreement key) and is cryptographically separated from all other security contexts.</t>
        <t>The manner through which the client and server share trusted context keys is out of scope of this specification.</t>
        <t>Initial registration of a user's 2nd factor may need authorization data that was provided to the user by out-of-band means. This <bcp14>MAY</bcp14> be a one-time password or other authorization data that asserts that the user factor is provided by the intended user. The protocol facilitates exchange of such authorization data in the registration process, but the composition of this data and the means for providing this data to the user is out of scope for this specification.</t>
      </section>
      <section anchor="protection-modes-and-sessions">
        <name>Protection modes and sessions</name>
        <t>The main purpose of this protocol is to exchange service data that is protected and authenticated under two user factors: a possession factor (the device key) and a user-bound factor (knowledge or biometric). Establishing the user-bound factor must complete before a two-factor protected exchange can take place, so the protocol also provides a one-factor protection mode, protected by the possession factor alone.</t>
        <t>The one-factor protection mode <bcp14>MAY</bcp14> be used:</t>
        <ul spacing="normal">
          <li>
            <t>to register or verify a user's knowledge or biometric factor; and</t>
          </li>
          <li>
            <t>for exchanges with lower protection requirements that are permitted without the user presenting a second factor.</t>
          </li>
        </ul>
        <t>The two-factor protection mode is used within a session bound to the user having presented a second factor, as typically required when the user signs a transaction or presents an identity. A session <bcp14>MAY</bcp14> be bound to a <tt>task</tt>, which in turn <bcp14>MAY</bcp14> bind to a sequence of service exchanges, each identified by a service type. This session lets both client and server track the task's progress within the session and terminate the session as soon as the task completes or the session times out.</t>
      </section>
    </section>
    <section anchor="r2ps-protocol-components">
      <name>R2PS Protocol Components</name>
      <section anchor="outer-jwe-object">
        <name>Outer JWE object</name>
        <t>The outer JWE object <xref target="RFC7516"/> provides end-to-end encryption of the exchanged service data. It is used in one of two protection modes:</t>
        <ul spacing="normal">
          <li>
            <t><tt>1FA</tt>, where the Content Encryption Key (CEK) is derived from a static recipient key and an ephemeral sender key.</t>
          </li>
          <li>
            <t><tt>2FA</tt>, where the session key derived from authentication of the user's two factors is used directly as the CEK. This mode provides forward secrecy.</t>
          </li>
        </ul>
        <t>The recipient determines the mode from the <tt>typ</tt> parameter of the JWE protected header. The JWE protected header is the only header used; per-recipient and unprotected headers are not used.</t>
        <t>This document defines the following <tt>typ</tt> parameters:</t>
        <ul spacing="normal">
          <li>
            <t><tt>r2ps-1fa</tt> : identifies the 1FA mode defined in this document.</t>
          </li>
          <li>
            <t><tt>r2ps-2fa</tt> : identifies the 2FA mode defined in this document.</t>
          </li>
        </ul>
        <t>Deployments <bcp14>MAY</bcp14> define and agree on alternative protection modes identified by other <tt>typ</tt> parameter values.</t>
        <section anchor="fa-mode">
          <name>1FA mode</name>
          <t>In <tt>1FA</tt> mode the CEK is derived using ECDH-ES <xref target="RFC7518"/>. The JWE protected header <bcp14>MUST</bcp14> contain:</t>
          <ul spacing="normal">
            <li>
              <t><tt>typ</tt>: <bcp14>MUST</bcp14> be <tt>r2ps-1fa</tt>.</t>
            </li>
            <li>
              <t><tt>alg</tt>: <bcp14>MUST</bcp14> be <tt>ECDH-ES</tt>.</t>
            </li>
            <li>
              <t><tt>enc</tt>: <bcp14>MUST</bcp14> be <tt>A256GCM</tt>.</t>
            </li>
            <li>
              <t><tt>epk</tt>: the sender's ephemeral public key.</t>
            </li>
            <li>
              <t><tt>kid</tt>: identifies the recipient's static key-agreement key: the server's static ECDH key in a request, the client's agreement key (CAK) in a response.</t>
            </li>
            <li>
              <t><tt>apu</tt>: <bcp14>MUST</bcp14> be the <tt>client_id</tt> in a request and the <tt>context</tt> in a response.</t>
            </li>
            <li>
              <t><tt>apv</tt>: <bcp14>MUST</bcp14> be the <tt>context</tt> in a request and the <tt>client_id</tt> in a response.</t>
            </li>
            <li>
              <t><tt>cty</tt>: <bcp14>MUST</bcp14> be <tt>JWT</tt>.</t>
            </li>
          </ul>
          <t>where <tt>context</tt> identifies the security context and <tt>client_id</tt> is the client's identifier within that context.</t>
          <t>The resulting compact serialization is <tt>&lt;header&gt;..&lt;iv&gt;.&lt;ciphertext&gt;.&lt;tag&gt;</tt>; the encrypted-key field is empty, as ECDH-ES uses direct key agreement. The sender <bcp14>MUST</bcp14> destroy the ephemeral private key and the CEK as soon as the JWE has been constructed.</t>
        </section>
        <section anchor="fa-mode-1">
          <name>2FA mode</name>
          <t>In <tt>2FA</tt> mode the session key, derived from authentication of the user's two factors, is used directly as the CEK (<tt>dir</tt>, direct encryption). The JWE protected header <bcp14>MUST</bcp14> contain:</t>
          <ul spacing="normal">
            <li>
              <t><tt>typ</tt>: <bcp14>MUST</bcp14> be <tt>r2ps-2fa</tt>.</t>
            </li>
            <li>
              <t><tt>alg</tt>: <bcp14>MUST</bcp14> be <tt>dir</tt>.</t>
            </li>
            <li>
              <t><tt>enc</tt>: <bcp14>MUST</bcp14> be <tt>A256GCM</tt>.</t>
            </li>
            <li>
              <t><tt>kid</tt>: the <tt>2FA</tt> session identifier.</t>
            </li>
            <li>
              <t><tt>cty</tt>: <bcp14>MUST</bcp14> be <tt>JWT</tt>.</t>
            </li>
          </ul>
          <t>The IV <bcp14>MUST</bcp14> be a freshly generated 96-bit random value for each message. The resulting compact serialization is <tt>&lt;header&gt;..&lt;iv&gt;.&lt;ciphertext&gt;.&lt;tag&gt;</tt>; the encrypted-key field is empty, as direct encryption uses the session key as the CEK.</t>
          <t>The <tt>2FA</tt> session identifier identifies the <tt>2FA</tt> session key that is negotiated during authentication of the users 2 factors. The <tt>2FA</tt> session key is ephemeral and <bcp14>MUST</bcp14> be destroyed after use to preserve forward secrecy.</t>
        </section>
      </section>
      <section anchor="inner-jws-object">
        <name>Inner JWS object</name>
        <t>The inner JWS object <xref target="RFC7515"/> is signed by the sender with its context signing key and carries the request or response structure common to all service types. Variant content specific to a service type resides entirely within the <tt>data</tt> member of the payload.</t>
        <t>The JWS protected header <bcp14>MUST</bcp14> contain at least:</t>
        <ul spacing="normal">
          <li>
            <t><tt>alg</tt>: <bcp14>SHOULD</bcp14> be <tt>ES256</tt>.</t>
          </li>
          <li>
            <t><tt>kid</tt>: identifies the signing key. In a request it <bcp14>MUST</bcp14> identify the client's Client Signing Key (CSK) for the security context; implementations <bcp14>SHOULD</bcp14> use the JWK Thumbprint <xref target="RFC7638"/> of the CSK public key. In a response it <bcp14>MUST</bcp14> identify the server's Server Signing Key (SSK).</t>
          </li>
          <li>
            <t><tt>typ</tt>: <bcp14>MUST</bcp14> be <tt>r2ps-request+jwt</tt> in a request and <tt>r2ps-response+jwt</tt> in a response.</t>
          </li>
        </ul>
        <t>The JWS payload is a JSON object. Members that hold a binary value are encoded as base64 strings as defined in <xref target="RFC4648"/>, Section 4 (the standard base64 alphabet, with padding). The following members are common to all exchanges and <bcp14>MUST</bcp14> be present in both requests and responses:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ver</tt> (string): the protocol version; <tt>"1.0"</tt> for this document.</t>
          </li>
          <li>
            <t><tt>nonce</tt> (string): a base64-encoded random byte array carrying at least 16 bytes of entropy. The client generates it for each request, and the server echoes it unchanged in the corresponding response.</t>
          </li>
          <li>
            <t><tt>iat</tt> (integer): the message creation time as a Unix timestamp. The server <bcp14>MUST</bcp14> enforce a maximum <tt>iat</tt> age and <bcp14>MUST</bcp14> reject a duplicate <tt>nonce</tt> received within that window. Freshness windows and the state required for replay protection are deployment-defined.</t>
          </li>
          <li>
            <t><tt>data</tt> (object): the service-specific payload, whose structure is determined by the service type.</t>
          </li>
        </ul>
        <section anchor="request-data">
          <name>Request data</name>
          <t>In addition to the common members, a request payload <bcp14>MUST</bcp14> include the following, which <bcp14>MUST NOT</bcp14> appear in a response:</t>
          <ul spacing="normal">
            <li>
              <t><tt>type</tt> (string): the service type identifier. It determines the structure of <tt>data</tt>, the operations performed, and the required protection mode (<tt>1FA</tt> or <tt>2FA</tt>).</t>
            </li>
            <li>
              <t><tt>jwe_hash</tt> (string): a digest binding this JWS to the JWE that encrypts it, constructed as defined below.</t>
            </li>
          </ul>
          <t>The <tt>jwe_hash</tt> binds the signed payload to the JWE protected header that carries it, preventing surreptitious forwarding (a recipient re-encrypting the inner JWS under a different JWE). It is computed over the JWE Protected Header exactly as transmitted in compact serialization. This is defined in JWE <xref target="RFC7516"/> as BASE64URL(UTF8(JWE Protected Header)), which is the octets preceding the first period in compact serialization. The sender computes the SHA-256 digest of the ASCII octets of that encoded header and carries the resulting 32-octet digest in the <tt>jwe_hash</tt> member, encoded as a base64 string.</t>
          <artwork type="ascii-art"><![CDATA[
jwe_hash = SHA-256( ASCII( BASE64URL(UTF8(JWE Protected Header)) ) )
]]></artwork>
          <t>The recipient <bcp14>MUST</bcp14> recompute <tt>jwe_hash</tt> over the received encoded JWE Protected Header and <bcp14>MUST</bcp14> reject the message on mismatch.</t>
        </section>
        <section anchor="response-data">
          <name>Response data</name>
          <section anchor="success-response">
            <name>Success Response</name>
            <t>This response <bcp14>SHOULD</bcp14> be used on successful service completion, or where error handling is provided as part of service data in the response.</t>
            <t>The response payload includes the common members only (<tt>ver</tt>, <tt>nonce</tt>, <tt>iat</tt> and  <tt>data</tt>). The <tt>nonce</tt> <bcp14>MUST</bcp14> equal the <tt>nonce</tt> of the request being answered. The response <tt>data</tt> object carries the service-specific response members defined by the service type, for example the <tt>p_data</tt> parameter.</t>
          </section>
          <section anchor="error-response">
            <name>Error response</name>
            <t>If a server fails to process a request and return a normal response, e.g. due to a missing or invalid parameter, decryption error or signature validation error, etc, it <bcp14>SHOULD</bcp14> return a suitable error response.</t>
            <t>When a HTTP API is used for service exchange, the server <bcp14>SHALL</bcp14> provide problem details as defined in <xref target="RFC9457"/>.</t>
            <t>The following response codes are <bcp14>RECOMMENDED</bcp14> for use in a HTTP API:</t>
            <table>
              <thead>
                <tr>
                  <th align="left">Response code</th>
                  <th align="left">HTTP response code</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">ILLEGAL_REQUEST_DATA</td>
                  <td align="left">400</td>
                </tr>
                <tr>
                  <td align="left">UNAUTHORIZED</td>
                  <td align="left">401</td>
                </tr>
                <tr>
                  <td align="left">ACCESS_DENIED</td>
                  <td align="left">403</td>
                </tr>
                <tr>
                  <td align="left">ILLEGAL_STATE</td>
                  <td align="left">409</td>
                </tr>
                <tr>
                  <td align="left">UNSUPPORTED_REQUEST_TYPE</td>
                  <td align="left">415</td>
                </tr>
                <tr>
                  <td align="left">SERVER_ERROR</td>
                  <td align="left">500</td>
                </tr>
                <tr>
                  <td align="left">TRY_LATER</td>
                  <td align="left">503</td>
                </tr>
              </tbody>
            </table>
          </section>
        </section>
      </section>
      <section anchor="second-factor-establishment-and-session-creation">
        <name>Second factor establishment and session creation</name>
        <t>This section defines common service types for registration, update and authentication of a user's second factor to support session creation based on the user's two factors.</t>
        <t>The output of session creation is:</t>
        <ul spacing="normal">
          <li>
            <t>session key: a key suitable for direct use as the CEK in the 2FA protection mode in use; its length and parameters are determined by that mode's encryption algorithm. This key <bcp14>MUST</bcp14> be uniformly distributed, <bcp14>MUST</bcp14> be unique per session, and <bcp14>MUST</bcp14> provide forward secrecy.</t>
          </li>
          <li>
            <t>session identifier: an identifier of the session key and the properties bound to it.</t>
          </li>
          <li>
            <t>context: the context under which the session is exchanged.</t>
          </li>
          <li>
            <t>task: an optional identifier of the task to be performed within the session.</t>
          </li>
          <li>
            <t>session expiration: the time at which the session expires, regardless of whether its task has completed.</t>
          </li>
        </ul>
        <t>A second-factor authentication mechanism that already outputs a key meeting these requirements (for example, the session key produced by OPAQUE <xref target="RFC9807"/>) <bcp14>MAY</bcp14> use that key directly as the session key. Otherwise, the mechanism <bcp14>MUST</bcp14> derive a suitable key from its output, for example using HKDF <xref target="RFC5869"/>.</t>
        <section anchor="request-parameters">
          <name>Request parameters</name>
          <t>These request parameters are defined for use in the defined service types for second factor establishment and session creation.</t>
          <ul spacing="normal">
            <li>
              <t><tt>protocol</tt> : (<strong>string</strong>) - Identifier of the protocol used for two-factor authentication. This parameter defines the content of the <tt>p_data</tt> parameter in both the request and the response.</t>
            </li>
            <li>
              <t><tt>state</tt> : (<strong>string</strong>) - Identifier of the state of the protocol exchange</t>
            </li>
            <li>
              <t><tt>authorization</tt> : (<strong>byte array</strong>) - Authorization data for registration of a new second factor</t>
            </li>
            <li>
              <t><tt>authorization_type</tt> : (<strong>string</strong>) - The type of authorization data provided in the <tt>authorization</tt> parameter</t>
            </li>
            <li>
              <t><tt>task</tt> : (<strong>string</strong>) - The requested session task used to determine the set of operations that are suitable for a created session</t>
            </li>
            <li>
              <t><tt>session_duration</tt> : (<strong>integer</strong>) - The requested max duration of the created session in seconds</t>
            </li>
            <li>
              <t><tt>p_data</tt> : (defined by protocol) - The protocol-specific request data. Its content is defined by the selected protocol and the current <tt>state</tt>, and <bcp14>MAY</bcp14> be a string, an object, or null.</t>
            </li>
          </ul>
        </section>
        <section anchor="response-parameters">
          <name>Response parameters</name>
          <t>These response parameters are defined for use in the defined service types for second factor establishment and session creation.</t>
          <ul spacing="normal">
            <li>
              <t><tt>success</tt> : (<strong>boolean</strong>) - Indicates whether the server accepted and successfully processed the exchange. This member <bcp14>MUST</bcp14> be present in every response.</t>
            </li>
            <li>
              <t><tt>p_data</tt> : (defined by protocol) - The protocol-specific response data for the current protocol and <tt>state</tt>. Its content is defined by the selected protocol and <bcp14>MAY</bcp14> be a string, an object, or null.</t>
            </li>
            <li>
              <t><tt>session_id</tt> : (<strong>string</strong>) - The session identifier of a created session</t>
            </li>
            <li>
              <t><tt>task</tt> : (<strong>string</strong>) - Confirming the session task set in the session request</t>
            </li>
            <li>
              <t><tt>session_expiration_time</tt> : (<strong>integer</strong>) - The latest time this session will end expressed as seconds since epoch</t>
            </li>
          </ul>
        </section>
        <section anchor="member-presence">
          <name>Member presence</name>
          <t>Each service type specifies, in the tables below, which members appear in its requests and responses. Presence depends on the member, on the position of the exchange within the protocol's sequence, and, for responses, on whether the server reports success.</t>
          <t>The exchange position is one of:</t>
          <ul spacing="normal">
            <li>
              <t><tt>first</tt>: the first exchange of the protocol.</t>
            </li>
            <li>
              <t><tt>last</tt>: the concluding exchange of the protocol.</t>
            </li>
            <li>
              <t><tt>all</tt>: every exchange.</t>
            </li>
            <li>
              <t><tt>protocol</tt> : presence is defined by the protocol.</t>
            </li>
          </ul>
          <t>A protocol that completes in a single exchange treats that exchange as both the first and the last.</t>
          <t>The presence rule is one of:</t>
          <ul spacing="normal">
            <li>
              <t><tt>required</tt>: the member <bcp14>MUST</bcp14> be present.</t>
            </li>
            <li>
              <t><tt>optional</tt>: the member <bcp14>MAY</bcp14> be present.</t>
            </li>
            <li>
              <t><tt>required on success</tt>: the member <bcp14>MUST</bcp14> be present when <tt>success</tt> is <tt>true</tt>, and <bcp14>MUST</bcp14> be absent otherwise.</t>
            </li>
            <li>
              <t><tt>required if requested</tt>: the member <bcp14>MUST</bcp14> be present when the corresponding member was present in the request.</t>
            </li>
          </ul>
          <t>A response with <tt>success</tt> set to <tt>false</tt> contains only the <tt>success</tt> member; the presence rules in the tables below describe the success path.</t>
        </section>
        <section anchor="service-types">
          <name>Service types</name>
          <t>The following service types are defined in this section</t>
          <ul spacing="normal">
            <li>
              <t><tt>create_session</tt>: Authenticates the user's two factors and creates a session</t>
            </li>
            <li>
              <t><tt>2fa_registration</tt>: Register a user's second factor</t>
            </li>
            <li>
              <t><tt>2fa_update</tt>: Update a user's second factor</t>
            </li>
          </ul>
          <t>These service types are designed to allow any suitable protocol for authentication, registration and updates of the user's second factor. These service types have defined data structures as defined below.</t>
          <section anchor="createsession-service-type">
            <name><tt>create_session</tt> Service type</name>
            <t>This service type is used to create a session based on authentication of the user's two factors. This service type <bcp14>MUST</bcp14> be exchanged using 1FA protection mode.</t>
            <t>The <tt>create_session</tt> request contains:</t>
            <table>
              <thead>
                <tr>
                  <th align="left">Member</th>
                  <th align="left">Exchange</th>
                  <th align="left">Presence</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">
                    <tt>protocol</tt></td>
                  <td align="left">all</td>
                  <td align="left">required</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>p_data</tt></td>
                  <td align="left">all</td>
                  <td align="left">required</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>state</tt></td>
                  <td align="left">all</td>
                  <td align="left">required</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>session_duration</tt></td>
                  <td align="left">first</td>
                  <td align="left">optional</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>task</tt></td>
                  <td align="left">first</td>
                  <td align="left">optional</td>
                </tr>
              </tbody>
            </table>
            <t>If <tt>session_duration</tt> is not specified, the server <bcp14>MUST</bcp14> use a default value.</t>
            <t>The <tt>create_session</tt> response contains:</t>
            <table>
              <thead>
                <tr>
                  <th align="left">Member</th>
                  <th align="left">Exchange</th>
                  <th align="left">Presence</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">
                    <tt>success</tt></td>
                  <td align="left">all</td>
                  <td align="left">required</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>session_id</tt></td>
                  <td align="left">all</td>
                  <td align="left">required on success</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>p_data</tt></td>
                  <td align="left">all</td>
                  <td align="left">required on success</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>task</tt></td>
                  <td align="left">last</td>
                  <td align="left">required if requested</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>session_expiration_time</tt></td>
                  <td align="left">last</td>
                  <td align="left">required on success</td>
                </tr>
              </tbody>
            </table>
            <t>The <tt>session_id</tt> identifies the session this exchange is bound to and attempts to create. It <bcp14>MUST</bcp14> be unique within the context and is returned in every response of the exchange. A returned <tt>session_id</tt> is NOT an indication that the session has been created; that is determined by <tt>success</tt> and the protocol data in the concluding response.</t>
          </section>
          <section anchor="faregistration-service-type">
            <name><tt>2fa_registration</tt> Service type</name>
            <t>This service type is used to register a user's second factor. This service type <bcp14>MUST</bcp14> be exchanged using 1FA protection mode.</t>
            <t>The <tt>2fa_registration</tt> request contains:</t>
            <table>
              <thead>
                <tr>
                  <th align="left">Member</th>
                  <th align="left">Exchange</th>
                  <th align="left">Presence</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">
                    <tt>protocol</tt></td>
                  <td align="left">all</td>
                  <td align="left">required</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>p_data</tt></td>
                  <td align="left">all</td>
                  <td align="left">required</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>state</tt></td>
                  <td align="left">all</td>
                  <td align="left">required</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>authorization</tt></td>
                  <td align="left">protocol</td>
                  <td align="left">required</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>authorization_type</tt></td>
                  <td align="left">protocol</td>
                  <td align="left">optional</td>
                </tr>
              </tbody>
            </table>
            <t>The <tt>authorization</tt> member provides out-of-band authorization that the user is authorized to register a second factor. Its content is defined by <tt>authorization_type</tt>.</t>
            <t>NOTE: <tt>authorization</tt> is carried in the last exchange rather than the first so that protocols with stateless registration are supported uniformly. OPAQUE, for example, processes the <tt>evaluate</tt> (first) exchange without retaining server state; requiring authorization in the first exchange would force the server to keep state across the exchange. Placing it in the last exchange, where the server commits the registration, keeps registration stateless-friendly for all protocols.</t>
            <t>This specification defines the following <tt>authorization_type</tt> values:</t>
            <ul spacing="normal">
              <li>
                <t><tt>otp</tt> : The <tt>authorization</tt> parameter is a one-time password given to the user by out-of-band means.</t>
              </li>
            </ul>
            <t>The <tt>2fa_registration</tt> response contains:</t>
            <table>
              <thead>
                <tr>
                  <th align="left">Member</th>
                  <th align="left">Exchange</th>
                  <th align="left">Presence</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">
                    <tt>success</tt></td>
                  <td align="left">all</td>
                  <td align="left">required</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>p_data</tt></td>
                  <td align="left">all</td>
                  <td align="left">required on success</td>
                </tr>
              </tbody>
            </table>
          </section>
          <section anchor="faupdate-service-type">
            <name><tt>2fa_update</tt> Service type</name>
            <t>This service type is used to update the user's second factor under the protection of the current 2 factors. This service type <bcp14>MUST</bcp14> be exchanged using 2FA protection mode. This means that a session must already exist that is bound to the user's current 2 factors. This session <bcp14>MUST</bcp14> be bound to a task with the value <tt>2fa_update</tt> which allows one exchange of the <tt>2fa_update</tt> service type under the 2FA protection mode. This ensures that the user <bcp14>MUST</bcp14> present its second factor as part of the process to update this factor.</t>
            <t>The <tt>2fa_update</tt> request contains:</t>
            <table>
              <thead>
                <tr>
                  <th align="left">Member</th>
                  <th align="left">Exchange</th>
                  <th align="left">Presence</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">
                    <tt>protocol</tt></td>
                  <td align="left">all</td>
                  <td align="left">required</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>p_data</tt></td>
                  <td align="left">all</td>
                  <td align="left">required</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>state</tt></td>
                  <td align="left">all</td>
                  <td align="left">required</td>
                </tr>
              </tbody>
            </table>
            <t>The <tt>2fa_update</tt> response contains:</t>
            <table>
              <thead>
                <tr>
                  <th align="left">Member</th>
                  <th align="left">Exchange</th>
                  <th align="left">Presence</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">
                    <tt>success</tt></td>
                  <td align="left">all</td>
                  <td align="left">required</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>p_data</tt></td>
                  <td align="left">all</td>
                  <td align="left">required on success</td>
                </tr>
              </tbody>
            </table>
          </section>
        </section>
        <section anchor="defined-authentication-protocols">
          <name>Defined authentication protocols</name>
          <t>This specification defines the following authentication protocols:</t>
          <ul spacing="normal">
            <li>
              <t><tt>opaque</tt>: Uses OPAQUE <xref target="RFC9807"/> to send a password knowledge proof to the server. This <bcp14>SHOULD</bcp14> be used for server-side password checks.</t>
            </li>
            <li>
              <t><tt>fido2</tt>: Proves the second factor with a roaming WebAuthn authenticator. This mode <bcp14>SHOULD</bcp14> be used for device-attested flows using a FIDO2 Authenticator.</t>
            </li>
          </ul>
          <section anchor="opaque-protocol">
            <name>OPAQUE protocol</name>
            <t>Use of the OPAQUE protocol option is identified by the protocol identifier <tt>opaque</tt>.</t>
            <t>OPAQUE needs two roundtrips to complete registration or authentication and uses the following defined state identifiers in the context of this protocol:</t>
            <ul spacing="normal">
              <li>
                <t><tt>evaluate</tt> - Identifies the initial server evaluation state where the server evaluates the blinded OPRF data.</t>
              </li>
              <li>
                <t><tt>finalize</tt> - Identifies the final state where registration or authentication is finalized.</t>
              </li>
            </ul>
            <section anchor="createsession">
              <name><tt>create_session</tt></name>
              <t>Protection mode <bcp14>MUST</bcp14> be 1FA.</t>
              <t>The following OPAQUE data is exchanged between the client and server:</t>
              <table>
                <thead>
                  <tr>
                    <th align="left">State</th>
                    <th align="left">Direction</th>
                    <th align="left">p_data content</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td align="left">
                      <tt>evaluate</tt></td>
                    <td align="left">Request</td>
                    <td align="left">AKE message 1 as Base64 encoded string</td>
                  </tr>
                  <tr>
                    <td align="left">
                      <tt>evaluate</tt></td>
                    <td align="left">Response</td>
                    <td align="left">AKE message 2 as Base64 encoded string</td>
                  </tr>
                  <tr>
                    <td align="left">
                      <tt>finalize</tt></td>
                    <td align="left">Request</td>
                    <td align="left">AKE message 3 as Base64 encoded string</td>
                  </tr>
                  <tr>
                    <td align="left">
                      <tt>finalize</tt></td>
                    <td align="left">Response</td>
                    <td align="left">null</td>
                  </tr>
                </tbody>
              </table>
            </section>
            <section anchor="faregistration">
              <name><tt>2fa_registration</tt></name>
              <t>Protection mode <bcp14>MUST</bcp14> be 1FA.</t>
              <t>Authorization data <bcp14>MUST</bcp14> be present in the <tt>finalize</tt> state of the protocol and <bcp14>MUST NOT</bcp14> be provided in the <tt>evaluate</tt> state.</t>
              <t>The following OPAQUE data is exchanged between the client and server:</t>
              <table>
                <thead>
                  <tr>
                    <th align="left">State</th>
                    <th align="left">Direction</th>
                    <th align="left">p_data content</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td align="left">
                      <tt>evaluate</tt></td>
                    <td align="left">Request</td>
                    <td align="left">Registration request as Base64 encoded string</td>
                  </tr>
                  <tr>
                    <td align="left">
                      <tt>evaluate</tt></td>
                    <td align="left">Response</td>
                    <td align="left">Registration response as Base64 encoded string</td>
                  </tr>
                  <tr>
                    <td align="left">
                      <tt>finalize</tt></td>
                    <td align="left">Request</td>
                    <td align="left">Registration record as Base64 encoded string</td>
                  </tr>
                  <tr>
                    <td align="left">
                      <tt>finalize</tt></td>
                    <td align="left">Response</td>
                    <td align="left">null</td>
                  </tr>
                </tbody>
              </table>
            </section>
            <section anchor="faupdate">
              <name><tt>2fa_update</tt></name>
              <t>Protection mode <bcp14>MUST</bcp14> be 2FA.</t>
              <t>When OPAQUE is used in <tt>2fa_update</tt>, the data exchanged between the client and server is the same as in <tt>2fa_registration</tt>. The only difference is that the exchange is sent in 2FA protection mode, protected by the previous second-factor session key, and therefore does not need to provide any authorization data.</t>
            </section>
          </section>
          <section anchor="fido2-authenticator-protocol">
            <name>FIDO2 Authenticator protocol</name>
            <t>Use of the FIDO2 Authenticator protocol option is identified by the protocol identifier <tt>fido2</tt>.</t>
            <t>The second factor is established and verified locally by the user's FIDO2 authenticator. The resulting device attestation is verified by the server.</t>
            <t>The mechanism relies on two complementary signatures: the JWS signature, which demonstrates possession, and a WebAuthn assertion carried inside data, which demonstrates user verification.</t>
            <t>Every exchange is signed as an <tt>ES256</tt> JWS by the context signing key (CSK). In a platform or smartphone deployment the CSK is the platform's registered signing key and signs the JWS directly. In a roaming FIDO2 deployment the CSK is held by the FIDO2 authenticator, and the JWS signature is produced over the JWS signing input using the WebAuthn sign extension [WebAuthn-sign] (a raw signature over the supplied input). Either way the result is an ordinary ES256 JWS.</t>
            <t>The second factor is demonstrated by a regular WebAuthn assertion whose authenticator data has the user-verification (UV) flag set. The server requests UV; the authenticator prompts for a PIN or biometric and sets the UV flag in the assertion. The assertion is carried inside the <tt>p_data</tt> of a <tt>fido2</tt> request.</t>
            <t>To complete the second-factor check the server <bcp14>MUST</bcp14>:</t>
            <ol spacing="normal" type="1"><li>
                <t>Verify the assertion signature under the CSK registered for the context.</t>
              </li>
              <li>
                <t>Verify that the UV flag is set.</t>
              </li>
            </ol>
            <t>There is no server-side password-verification object for this mechanism; registration enrols the WebAuthn credential itself.</t>
            <t>The following defined state identifiers are used in the context of this protocol:</t>
            <ul spacing="normal">
              <li>
                <t><tt>challenge</tt> - Establish a challenge for the second factor authentication.</t>
              </li>
              <li>
                <t><tt>finalize</tt> - Provide a WebAuthn signature that proves the second factor.</t>
              </li>
            </ul>
            <t>The <tt>p_data</tt> content for each state is defined per service type below. The session-key exchange used by <tt>create_session</tt> (the ephemeral keys and the session-key derivation) is out of scope of this revision and is defined separately.</t>
            <section anchor="createsession-1">
              <name><tt>create_session</tt></name>
              <t>Protection mode <bcp14>MUST</bcp14> be 1FA.</t>
              <t>FIDO2 authentication requires two round-trips; the first to establish a challenge, the second to create a WebAuthn signature that proves the second factor and to negotiate the <tt>2FA</tt> session.</t>
              <t>The following data is exchanged between the client and server:</t>
              <table>
                <thead>
                  <tr>
                    <th align="left">State</th>
                    <th align="left">Direction</th>
                    <th align="left">p_data content</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td align="left">
                      <tt>challenge</tt></td>
                    <td align="left">Request</td>
                    <td align="left">Authentication challenge request as JSON object</td>
                  </tr>
                  <tr>
                    <td align="left">
                      <tt>challenge</tt></td>
                    <td align="left">Response</td>
                    <td align="left">Authentication challenge response as JSON object</td>
                  </tr>
                  <tr>
                    <td align="left">
                      <tt>finalize</tt></td>
                    <td align="left">Request</td>
                    <td align="left">Authentication finalize request as JSON object</td>
                  </tr>
                  <tr>
                    <td align="left">
                      <tt>finalize</tt></td>
                    <td align="left">Response</td>
                    <td align="left">Authentication finalize response as JSON object</td>
                  </tr>
                </tbody>
              </table>
              <t>The <tt>challenge</tt> request <tt>p_data</tt> is <tt>null</tt>.</t>
              <t>The <tt>challenge</tt> response <tt>p_data</tt>:</t>
              <sourcecode type="json"><![CDATA[
{
  "challenge": "<base64 challenge, at least 16 bytes>",
  "token": "<opaque server state token>",
  "user_verification": "required"
}
]]></sourcecode>
              <ul spacing="normal">
                <li>
                  <t><tt>challenge</tt>: the WebAuthn challenge to be signed in the assertion.</t>
                </li>
                <li>
                  <t><tt>token</tt>: opaque server state bound to the challenge, echoed by the client in the <tt>finalize</tt> request so the server need not retain challenge state.</t>
                </li>
                <li>
                  <t><tt>user_verification</tt>: the WebAuthn user-verification requirement; <bcp14>MUST</bcp14> be <tt>required</tt>.</t>
                </li>
              </ul>
              <t>The <tt>token</tt> is an authenticated encryption of the server's challenge state under a key known only to the server. The server <bcp14>MUST</bcp14> encrypt at least the <tt>challenge</tt>, the <tt>iat</tt>, the <tt>client_id</tt>, and the <tt>context</tt>, so that the server can, on <tt>finalize</tt>, recover the issued challenge and confirm it was issued to the same client and context. The encryption algorithm is the server's choice and has no interoperability impact, since the token is produced and consumed only by the server; <tt>A256GCM</tt> is <bcp14>RECOMMENDED</bcp14>. The server <bcp14>MUST</bcp14> ensure the token cannot be replayed beyond a single authentication, for example by enforcing the <tt>iat</tt> freshness window and unique IVs.</t>
              <t>The <tt>finalize</tt> request <tt>p_data</tt>:</t>
              <sourcecode type="json"><![CDATA[
{
  "token": "<token from the challenge response>",
  "assertion": {
    "client_epub : "<base64 client ephemeral public key for session derivation>",
    "credential_id": "<base64 credential id>",
    "authenticator_data": "<base64 authenticatorData>",
    "client_data": "<base64 clientDataJSON>",
    "signature": "<base64 signature>"
  }
}
]]></sourcecode>
              <t>The <tt>finalize</tt> response <tt>p_data</tt>:</t>
              <sourcecode type="json"><![CDATA[
{
  "server_epub : "<base64 server ephemeral public key for session derivation>",
}
]]></sourcecode>
              <t>Both sides establish the negotiated <tt>2FA</tt> session key as follows:</t>
              <ol spacing="normal" type="1"><li>
                  <t>Compute <tt>ikm = ECDH(own ephemeral private key, peer ephemeral public key)</tt>.</t>
                </li>
                <li>
                  <t>Derive the <tt>2FA</tt> session key <tt>K = HKDF(ikm, salt, info, L)</tt> where <tt>salt</tt> is message <tt>nonce</tt> for the <tt>finalize</tt> round, <tt>info</tt> is the DST concatenated with a transcript-binding hash, and <tt>L</tt> is 32 bytes. The DST <bcp14>MUST</bcp14> be r2ps-2fa_authentication-fido2. The transcript binding hash <bcp14>MUST</bcp14> be <tt>SHA256(2fa_mode || client_epub || server_epub || task || fido2 assertion signature)</tt>.</t>
                </li>
              </ol>
            </section>
            <section anchor="faregistration-1">
              <name><tt>2fa_registration</tt></name>
              <t>Protection mode <bcp14>MUST</bcp14> be 1FA.</t>
              <t>Authorization data <bcp14>MUST</bcp14> be present in the finalize state of the protocol and <bcp14>MAY</bcp14> be present also in the challenge state.</t>
              <t>There is no server-side verification object to register for the <tt>fido2</tt> mechanism. Registration instead enrolls the WebAuthn UV-capable credential and binds it to the <tt>client_id</tt> for that security context. The request carries the result of the WebAuthn credential-creation ceremony (the attestation object and client data); the server validates it according to [WebAuthn] and stores the credential public key. The <tt>authorization</tt> field authorizes the enrolment, as for the other mechanisms.</t>
              <t>The flow is double-round. The client first requests a challenge. It then runs the WebAuthn credential-creation ceremony using the challenge it received in round 1.</t>
              <t>The following data is exchanged between the client and server:</t>
              <table>
                <thead>
                  <tr>
                    <th align="left">State</th>
                    <th align="left">Direction</th>
                    <th align="left">p_data content</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td align="left">
                      <tt>challenge</tt></td>
                    <td align="left">Request</td>
                    <td align="left">Registration challenge request as JSON object</td>
                  </tr>
                  <tr>
                    <td align="left">
                      <tt>challenge</tt></td>
                    <td align="left">Response</td>
                    <td align="left">Registration challenge response as JSON object</td>
                  </tr>
                  <tr>
                    <td align="left">
                      <tt>finalize</tt></td>
                    <td align="left">Request</td>
                    <td align="left">Registration finalize request as JSON object</td>
                  </tr>
                  <tr>
                    <td align="left">
                      <tt>finalize</tt></td>
                    <td align="left">Response</td>
                    <td align="left">null</td>
                  </tr>
                </tbody>
              </table>
              <t>The <tt>challenge</tt> request <tt>p_data</tt> <bcp14>MAY</bcp14> carry client capabilities or preferences; otherwise it is <tt>null</tt>.</t>
              <t>Note: Consider if this specification should define a structure for client capabilities and preferences.</t>
              <t>The <tt>challenge</tt> response <tt>p_data</tt>:</t>
              <sourcecode type="json"><![CDATA[
{
  "challenge": "<base64 challenge, at least 16 bytes>"
}
]]></sourcecode>
              <t>The <tt>finalize</tt> request <tt>p_data</tt>:</t>
              <sourcecode type="json"><![CDATA[
{
  "credential_id": "<base64 credential id>",
  "attestation_object": "<base64 attestationObject>",
  "client_data": "<base64 clientDataJSON>"
}
]]></sourcecode>
              <t>On receiving the <tt>finalize</tt> request, the server <bcp14>MUST</bcp14> validate the attestation according to [WebAuthn]. Specifically, the server <bcp14>MUST</bcp14>:</t>
              <ol spacing="normal" type="1"><li>
                  <t>Parse <tt>client_data</tt> (the <tt>clientDataJSON</tt>) and verify that its <tt>type</tt> field is exactly <tt>"webauthn.create"</tt>.</t>
                </li>
                <li>
                  <t>Verify that the <tt>challenge</tt> in <tt>client_data</tt> matches the <tt>challenge</tt> issued in the <tt>challenge</tt> response.</t>
                </li>
                <li>
                  <t>Verify that the <tt>origin</tt> in <tt>client_data</tt> matches the Relying Party's expected origin.</t>
                </li>
                <li>
                  <t>Decode <tt>attestation_object</tt> and verify that the <tt>rpIdHash</tt> in the authenticator data is the SHA-256 hash of the Relying Party ID.</t>
                </li>
                <li>
                  <t>Verify that the User Present (UP) flag in the authenticator data is set.</t>
                </li>
                <li>
                  <t>Verify that the User Verified (UV) flag in the authenticator data is set.</t>
                </li>
                <li>
                  <t>Verify the attestation statement's signature using the verification procedure for the attestation format.</t>
                </li>
              </ol>
              <t>On success, the server extracts the credential identifier and credential public key from the attested credential data, and binds the <tt>credential_id</tt> and public key to the <tt>client_id</tt> in that security context. This credential is the one from which UV assertions are required in subsequent <tt>create_session</tt> exchanges.</t>
              <t>On success, the <tt>finalize</tt> response <tt>p_data</tt> is <tt>null</tt>.</t>
            </section>
            <section anchor="faupdate-1">
              <name><tt>2fa_update</tt></name>
              <t>When the FIDO2 Authenticator protocol is used in <tt>2fa_update</tt>, the data exchanged between the client and server is the same as in <tt>2fa_registration</tt>. The only difference is that the exchange is sent in 2FA protection mode, protected by the previous second-factor session key, and therefore does not need to provide any authorization data.</t>
            </section>
          </section>
        </section>
      </section>
    </section>
    <section anchor="hardening-of-knowledge-factors">
      <name>Hardening of knowledge factors</name>
      <t>TBD - Separately provide recommendations on PIN/Password hardening and when to use it</t>
    </section>
    <section anchor="definition-of-service-types">
      <name>Definition of service types</name>
      <t>TBD - provide guidance on definition of new service types</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Security considerations goes here</t>
      <t>Note: write about the importance to provide a new random IV for every JWE</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA considerations goes here</t>
      <t>Determine registration of <tt>typ</tt> parameter values</t>
      <ul spacing="normal">
        <li>
          <t><tt>r2ps-request+jwt</tt></t>
        </li>
        <li>
          <t><tt>r2ps-response+jwt</tt></t>
        </li>
        <li>
          <t><tt>r2ps-1fa</tt></t>
        </li>
        <li>
          <t><tt>r2ps-2fa</tt></t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC4648">
        <front>
          <title>The Base16, Base32, and Base64 Data Encodings</title>
          <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
          <date month="October" year="2006"/>
          <abstract>
            <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="4648"/>
        <seriesInfo name="DOI" value="10.17487/RFC4648"/>
      </reference>
      <reference anchor="RFC5869">
        <front>
          <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
          <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
          <author fullname="P. Eronen" initials="P." surname="Eronen"/>
          <date month="May" year="2010"/>
          <abstract>
            <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="5869"/>
        <seriesInfo name="DOI" value="10.17487/RFC5869"/>
      </reference>
      <reference anchor="RFC7515">
        <front>
          <title>JSON Web Signature (JWS)</title>
          <author fullname="M. Jones" initials="M." surname="Jones"/>
          <author fullname="J. Bradley" initials="J." surname="Bradley"/>
          <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
          <date month="May" year="2015"/>
          <abstract>
            <t>JSON Web Signature (JWS) represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and an IANA registry defined by that specification. Related encryption capabilities are described in the separate JSON Web Encryption (JWE) specification.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7515"/>
        <seriesInfo name="DOI" value="10.17487/RFC7515"/>
      </reference>
      <reference anchor="RFC7516">
        <front>
          <title>JSON Web Encryption (JWE)</title>
          <author fullname="M. Jones" initials="M." surname="Jones"/>
          <author fullname="J. Hildebrand" initials="J." surname="Hildebrand"/>
          <date month="May" year="2015"/>
          <abstract>
            <t>JSON Web Encryption (JWE) represents encrypted content using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries defined by that specification. Related digital signature and Message Authentication Code (MAC) capabilities are described in the separate JSON Web Signature (JWS) specification.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7516"/>
        <seriesInfo name="DOI" value="10.17487/RFC7516"/>
      </reference>
      <reference anchor="RFC7518">
        <front>
          <title>JSON Web Algorithms (JWA)</title>
          <author fullname="M. Jones" initials="M." surname="Jones"/>
          <date month="May" year="2015"/>
          <abstract>
            <t>This specification registers cryptographic algorithms and identifiers to be used with the JSON Web Signature (JWS), JSON Web Encryption (JWE), and JSON Web Key (JWK) specifications. It defines several IANA registries for these identifiers.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7518"/>
        <seriesInfo name="DOI" value="10.17487/RFC7518"/>
      </reference>
      <reference anchor="RFC7638">
        <front>
          <title>JSON Web Key (JWK) Thumbprint</title>
          <author fullname="M. Jones" initials="M." surname="Jones"/>
          <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
          <date month="September" year="2015"/>
          <abstract>
            <t>This specification defines a method for computing a hash value over a JSON Web Key (JWK). It defines which fields in a JWK are used in the hash computation, the method of creating a canonical form for those fields, and how to convert the resulting Unicode string into a byte sequence to be hashed. The resulting hash value can be used for identifying or selecting the key represented by the JWK that is the subject of the thumbprint.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7638"/>
        <seriesInfo name="DOI" value="10.17487/RFC7638"/>
      </reference>
      <reference anchor="RFC9807">
        <front>
          <title>The OPAQUE Augmented Password-Authenticated Key Exchange (aPAKE) Protocol</title>
          <author fullname="D. Bourdrez" initials="D." surname="Bourdrez"/>
          <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
          <author fullname="K. Lewi" initials="K." surname="Lewi"/>
          <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
          <date month="July" year="2025"/>
          <abstract>
            <t>This document describes the OPAQUE protocol, an Augmented (or Asymmetric) Password-Authenticated Key Exchange (aPAKE) protocol that supports mutual authentication in a client-server setting without reliance on PKI and with security against pre-computation attacks upon server compromise. In addition, the protocol provides forward secrecy and the ability to hide the password from the server, even during password registration. This document specifies the core OPAQUE protocol and one instantiation based on 3DH. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9807"/>
        <seriesInfo name="DOI" value="10.17487/RFC9807"/>
      </reference>
      <reference anchor="RFC9457">
        <front>
          <title>Problem Details for HTTP APIs</title>
          <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
          <author fullname="E. Wilde" initials="E." surname="Wilde"/>
          <author fullname="S. Dalal" initials="S." surname="Dalal"/>
          <date month="July" year="2023"/>
          <abstract>
            <t>This document defines a "problem detail" to carry machine-readable details of errors in HTTP response content to avoid the need to define new error response formats for HTTP APIs.</t>
            <t>This document obsoletes RFC 7807.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9457"/>
        <seriesInfo name="DOI" value="10.17487/RFC9457"/>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
    <?line 649?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
dUjoLUyHXQ/bM3Xy9DEdzPwLfin1155Se+7ZvWO1962c4QxItXVm//u9Pr5X
l290Qe9wRCjKAym6K0+iDn0dCmt8y4YT93q/8anOSDoeNwS02zw+ZCHGW0s7
UmklzgwDdEEVRdKDNVIDAWc2CQ+03WyLeBMGEdm5QC+DU2IBsOJVA1AtFDRX
2LYzgsMWT4ImGbYKzm41L1espLjXaLv3n+vL0YDRnbNGaYsh00LqwZrR0mbL
A5rAk0gdEx/LOTovKj99QytviLqeWH2X4gyzdklBtZd+G/rkVVsrMjNmo9Ng
QVTlxXW0mBzEMjl5xq4GHdhAzlmjhJbXdf7Jeb4eeyV5TvCydPWmL4pR1b18
hDKjQ9x9qZjFt2mjIjtbJjeblZZviUU+1xPfvAlfC85Gdu2E2VThPIA2JEn6
NiF2gyAxvy3Jt5KCzWY9WXhCBvuHUz8La+7zod9Fow2FdBmkApKzly7D2OaY
XcLHCxEG2/VKbItrESaO2eEtHAIlGBOVXm9mKpRhvMVd7e0kxs+BA29d8BQ4
ojMIgVQjuRhYiql7PLLzaaHhO9HdU7jpp2HAmy/wZXwSFYF72tkE4bPu4vf4
IerfrDBtbcN7lADTUguFNv79cSgUGHo/YMGvdGFyZhBubtAVq93jKjFirBj2
OU7swf7szUp9R13m9lFAdfaL64N1ugPggym5Had8XKxlJ9Hc0x9hBjwXtg+T
AfMmeY1V64uyr54fTCV4P8XLxJI2VGyPuFvTPcQ8ahw8Mw+DuCZ+p9xGCqV0
kdgGwbbD7hysyHpg+3xgJwMWldPn9P6XR6yFWQbgSFY32PZwr2PGHpD7x4/7
CVQ4gVcvk2cocvZxFDKE7+5UyF3wZ0gp8Cclle+wpBAm6XIKEe3/gGC4s6Pu
CYVHBeDcoto6bU2VvdP57PI5w5KhgATI6XZu6DAODON3eXWSsjva9EevXw7o
69S5DgUOfdmcWrT4ryCHHSJ5avpec9wBbBie2upo+WGx1eEPD9yB5TngY1UW
W3bawqChYIG0GYtc3KiDJ6EW95+xzuj7wSX3gYFVuHjRK3Y6QEba04d+6WH7
MRJtjQoZ7vnnqrikVghRi+ZTn2UKbwz3eXXbYnUW5lbJbSxhKj0gto06UrFH
5w+keJqhakrkOFVtip2RhQ5M+mCapz/snmi7lQBxEhzq8J/JiYvI/Pe5cDuH
+mgHLhrp97hvNinzXp8MpQ31PXPfz4u+N09npiQ/Yp74syLyJULnzr0A8XiM
58JQ+lRYXNz+tAF+XBbL6GwH5MZna7rmp54AHoB/kN+40zq530j8GGtsL5BM
r3k/I1vM3z2nm/LWB1pidgHnhXCpM49bq2lXylsZqJoCdIc8HKqJ3eU837bG
Y+voIqmMVwPSzC3QDBb26YHPGtn2pLWxDdF8z1RplTXdu9UzlKfFkINTe9PO
oG1IMZgQjOCgdkm2pDR8kN0x6193EN2w92XHXCDbb7LiPRNd6pxaDQJi6i02
tHi35iwivz3sPUQbkDrDTNu0Mm1hiWau1mfpM+opZUMO7YxBFvfjIrtKFGsE
kzo7HfYedcS/MW0l30lX+9cXB3EGoHNCCpQ/3jHWS5vJ8xmL9w/2VRzkD6iU
LCNUp5+bMOTvdFhkGVGdXmolUHMoTIMlGOI/d6VkEXmDzVIBHbbMgCBbKme5
2gaCdyFd3VTwHCcNvSXFBBjKF6aAYLwOS8t2Z+wytDAjE0Bsm/XLZwA4XXn9
0lvKnEHwp0cQIzM+iVq3I+auBWgH8u7z9yKd0lVQwDUD9fI9Se3/X03wUdUE
6llSASlQk69F67u4WBf5w6kaqInLUbgxqaEdcFsqbRxg0IuzF3+8sLWISzcw
AsknRUvuMFDjxP5T660PhdlZ7VQ3G1BL9MkVKcp0r3FvjOhVatzERG+NEoaw
15sE3BDcUDeIN8SitWZu4Sk8JWs/iZOt8JQCgRB9eRqnl2ayZy85PEVp/D/9
PEZAzkYvRi0g6OJuAE5dt4xmJ5DuLz/4L12EjYmDi0En4uijGNEHLoC9wGim
b9wi4KO5pQTqpNP79Zg/VqjT7/boWC59+fD89BwsA0czw97/ABozVI9ujgAA

-->

</rfc>
