<?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.29 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mvieuille-kerpass-ephemsec-02" category="info" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="EPHEMSEC">KerPass EPHEMSEC One-Time Password Algorithm</title>
    <seriesInfo name="Internet-Draft" value="draft-mvieuille-kerpass-ephemsec-02"/>
    <author initials="M." surname="Vieuille" fullname="Marc Vieuille">
      <organization/>
      <address>
        <email>marc.vieuille@polytechnique.org</email>
      </address>
    </author>
    <date year="2025" month="November" day="10"/>
    <workgroup>Individual Submission</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 34?>

<t>This document specifies EPHEMSEC, an algorithm for generating one-time passwords (OTPs)
and one-time keys (OTKs). Unlike traditional OTP algorithms that rely solely on static
shared secrets, EPHEMSEC uses public key cryptography, which simplifies secure
deployment on authentication servers. EPHEMSEC also supports binding the generated
OTP/OTK to contextual data. When this context is obtained and injected by a trusted
agent, the resulting codes can be made resistant to phishing and man-in-the-middle
attacks. Finally, EPHEMSEC includes a built-in time synchronization mechanism that
embeds a synchronization hint into the generated output. This allows both parties to
deterministically derive the same OTP/OTK value without requiring trial-and-error
validation, enabling compatibility with protocols such as Password Authenticated Key
Exchange (PAKE) and TLS with Pre-Shared Key (TLS-PSK) that require exact secret
agreement.</t>
    </abstract>
  </front>
  <middle>
    <?line 50?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The concept of one-time passwords has existed for decades. Proprietary systems such as
RSA SecurID have been available since the early days of the Internet and have
demonstrated the viability of time-based and event-based one-time passwords. HOTP
(specified in <xref target="RFC4226"/>) and TOTP (specified in <xref target="RFC6238"/>) are open algorithms that
enable the implementation of one-time password generators operating similarly to earlier
proprietary systems. These algorithms now form the foundation of various hardware tokens
and numerous smartphone authenticator applications that provide a second authentication
factor for high-profile web applications.</t>
      <t>While OTP authenticator applications are simple to use and widely available, they have
had limited impact on web application security. Two factors contribute to this limited
success:</t>
      <ol spacing="normal" type="1"><li>
          <t>Deployment of corresponding authentication servers introduces additional risks, as
stored credentials can be used to impersonate users if compromised. This problem is
particularly serious in today's cloud environments.</t>
        </li>
        <li>
          <t>The design of traditional authenticator applications does not address specific
security challenges of web applications. In particular, modern web browsers do not
provide a trusted input interface for entering authentication data, making users
vulnerable to phishing attacks that capture credentials.</t>
        </li>
      </ol>
      <t>These problems are the main reasons explaining the lack of attractiveness of one-time
passwords for securing web applications. In the current technological ecosystem,
one-time password solutions are seen as obsolete, and the current trend is toward using
authentication credentials such as <xref target="PASSKEY"/>, which address problems 1 and 2 by
relying on digital signature key pairs.</t>
      <t>The KerPass EPHEMSEC algorithm also addresses problems 1 and 2 but takes a meaningfully
different approach than digital signatures. The EPHEMSEC client credential contains a
Diffie-Hellman key pair, and the server stores only the public part of this key pair. To
obtain a new OTP from EPHEMSEC, a trusted agent obtains the server's ephemeral public
key and acquires context information such as the login page URL. This information is
passed to the EPHEMSEC client (also known as the Responder; see <xref target="responder"/>) in a
challenge message. The client first calculates a Diffie-Hellman secret using the
received public key and local key pair, then uses this ephemeral secret key to generate
an OTP using an algorithm based on principles similar to the HOTP algorithm described in
<xref target="RFC4226"/>. This simplified description excludes many important details but should be
sufficient to provide an understanding of how public key cryptography is used in
EPHEMSEC.</t>
      <t>Assuming that both EPHEMSEC OTP and digital signature solutions like <xref target="PASSKEY"/> can
solve the server credential storage issue described in problem 1 and the phishing issue
described in problem 2 (by having their output depend upon context input provided by a
trusted agent), are there differences between the two that could help determine which
option is better in a specific context?</t>
      <t>One advantage that an OTP authenticator application has over a digital signature
authenticator application is simpler integration, resulting from the smaller size of
OTPs compared to digital signatures. Integration of smartphone interfaces such as NFC
and Bluetooth to computing devices may eventually lessen this advantage, and EPHEMSEC
can also generate one-time keys (OTK) that would benefit from the ubiquity of such
interfaces.</t>
      <t>The main difference between OTP/OTK and digital signature credentials is that OTP/OTK
are ephemeral <strong>shared</strong> secrets known by both peers involved in an authentication
session, whereas digital signatures can only be generated by the peer controlling the
private key. There are contexts such as transaction validation in which the one-way
nature of digital signatures is an advantage. However, shared secrets have the
distinctive advantage that they can be used as the main credential with protocols like
Password Authenticated Key Exchange (PAKE) or TLS-PSK that enable <strong>mutual</strong>
authentication of the peers involved in an authentication session. The potential to use
EPHEMSEC OTP/OTK for mutual authentication is the distinctive feature of this solution.</t>
      <t>OTPs generated by HOTP/TOTP algorithms are also ephemeral shared secrets, but
synchronization problems make their integration with PAKE protocols complex (see
<xref target="key-exchange"/>). EPHEMSEC has a built-in auto-synchronization feature (see <xref target="PTIME"/>)
that addresses this issue.</t>
      <t>This document specifies the KerPass EPHEMSEC algorithm, which addresses the fundamental
limitations of HOTP/TOTP that have contributed to the low attractivity of OTP
authenticator applications for securing web applications. EPHEMSEC solves the server
credential storage security problem by using credentials based on public key
cryptography, provides a context binding mechanism that enables the generation of OTPs
and OTKs resistant to phishing and man-in-the-middle attacks, and produces shared
secrets that can be used with mutual authentication protocols such as PAKE and TLS-PSK.
Given the ease of implementing OTP/OTK authenticator applications on smartphones, an
OTP/OTK generation algorithm with properties similar to EPHEMSEC may be valuable across
a wide range of use cases.</t>
    </section>
    <section anchor="requirements-notation">
      <name>Requirements Notation</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" 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.
<?line -6?>
      </t>
    </section>
    <section anchor="functions-and-notation">
      <name>Functions and Notation</name>
      <t>This section defines notation and helper functions used throughout the specification.</t>
      <ul spacing="normal">
        <li>
          <t><tt>||</tt>: Denotes byte string concatenation.</t>
        </li>
        <li>
          <t><tt>byte(v)</tt>: Converts an integer or single-character input <tt>v</tt> to a one-byte string.</t>
        </li>
        <li>
          <t><tt>size(bs)</tt>: Returns the length of byte string <tt>bs</tt>, as an integer.</t>
        </li>
        <li>
          <t><tt>BE8(v)</tt>: Returns the 8-byte big-endian encoding of unsigned integer <tt>v</tt>.</t>
        </li>
        <li>
          <t><tt>U64(bs)</tt>: Converts an 8-byte string <tt>bs</tt> into an unsigned 64-bit integer, using
big-endian interpretation.</t>
        </li>
        <li>
          <t><tt>TLV(tag, bs)</tt>: Constructs a Tag-Length-Value encoding. Returns <tt>byte(tag) || byte(size(bs)) || bs</tt> where:  </t>
          <ul spacing="normal">
            <li>
              <t><tt>tag</tt>: An integer identifier in the range 0–255</t>
            </li>
            <li>
              <t><tt>bs</tt>: A byte string with length ≤ 255 bytes</t>
            </li>
          </ul>
        </li>
      </ul>
    </section>
    <section anchor="ephemsec-roles">
      <name>EPHEMSEC Roles</name>
      <t>EPHEMSEC distinguishes two roles: Initiator &amp; Responder.</t>
      <section anchor="initiator">
        <name>Initiator Role</name>
        <t>This role is normally assigned to relying web application.</t>
      </section>
      <section anchor="responder">
        <name>Responder Role</name>
        <t>This role is normally assigned to authenticator application.</t>
      </section>
    </section>
    <section anchor="instantation">
      <name>EPHEMSEC Parametrization</name>
      <t>Each EPHEMSEC protocol instance is characterized by its selection of cryptographic
primitives and operational parameters. These include:</t>
      <ul spacing="normal">
        <li>
          <t>A secure hash function,</t>
        </li>
        <li>
          <t>An elliptic-curve Diffie-Hellman (ECDH) function,</t>
        </li>
        <li>
          <t>A key exchange pattern defining key contributions from the parties,</t>
        </li>
        <li>
          <t>Code output parameters specifying how the OTP/OTK values are formatted.</t>
        </li>
      </ul>
      <section anchor="Hash">
        <name>Hash Function</name>
        <t>The hash function MUST be cryptographically secure (e.g., SHA-512) with digest length
between 32 and 64 bytes. . This hash function is used to instantiate the HKDF key
derivation function, as specified in <xref target="RFC5869"/>.</t>
        <section anchor="HKDF">
          <name><tt>HKDF(salt, ikm, info, L) → byte[L]</tt> Function</name>
          <t>This function follows the specification in <xref target="RFC5869"/>.</t>
          <ul spacing="normal">
            <li>
              <t><tt>salt</tt>, <tt>ikm</tt>, and <tt>info</tt> are arbitrary-length byte strings.</t>
            </li>
            <li>
              <t><tt>L</tt> is a positive integer indicating the desired output length in bytes.</t>
            </li>
            <li>
              <t>The function returns a byte string of length <tt>L</tt>.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="ECDH">
        <name><tt>ECDH(privKey, PubKey) → byte[DHLEN]</tt> Function</name>
        <t>This function performs an Elliptic-Curve Diffie-Hellman (ECDH) key agreement over a
specified elliptic curve group, producing a shared secret of fixed length <tt>DHLEN</tt>.</t>
        <ul spacing="normal">
          <li>
            <t><tt>privKey</tt>: A private key from an elliptic curve key pair.</t>
          </li>
          <li>
            <t><tt>PubKey</tt>: A public key from the same elliptic curve group.</t>
          </li>
        </ul>
        <t>The function computes a shared secret using the standard ECDH primitive associated with
the curve in use. The result is a byte string of length <tt>DHLEN</tt>. The specific behavior,
including internal encoding and validation, is determined by the curve and cryptographic
library in use.</t>
        <t>An example of a suitable ECDH function is X25519, as defined in <xref target="RFC7748"/>,
which yields a 32-byte shared secret.</t>
      </section>
      <section anchor="pattern">
        <name>Key Exchange Pattern</name>
        <t>The key exchange pattern determines which types of keys (ephemeral or static) are
contributed by the Initiator and Responder during the ECDH exchanges.</t>
        <t>Note that in each of the pattern below, the Initiator always contribute an ephemeral key
and the Responder always contribute a static key.</t>
        <section anchor="E1S1">
          <name>E1S1 Pattern</name>
          <ul spacing="normal">
            <li>
              <t>Initiator contributes: 1 ephemeral key.</t>
            </li>
            <li>
              <t>Responder contributes: 1 static key.</t>
            </li>
          </ul>
        </section>
        <section anchor="E1S2">
          <name>E1S2 Pattern</name>
          <ul spacing="normal">
            <li>
              <t>Initiator contributes: 1 ephemeral key and 1 static key.</t>
            </li>
            <li>
              <t>Responder contributes: 1 static key.</t>
            </li>
          </ul>
        </section>
        <section anchor="E2S2">
          <name>E2S2 Pattern</name>
          <ul spacing="normal">
            <li>
              <t>Initiator contributes: 1 ephemeral key and 1 static key.</t>
            </li>
            <li>
              <t>Responder contributes: 1 ephemeral key and 1 static key.</t>
            </li>
          </ul>
        </section>
        <section anchor="rationale-for-selecting-a-key-exchange-pattern">
          <name>Rationale for Selecting a Key Exchange Pattern</name>
          <t>The choice of key exchange pattern should align with the authentication guarantees
provided by the method used to validate the generated OTP or OTK.</t>
          <t>If the selected authentication method provides only one-way authentication—verifying the
Responder to the Initiator—then there is no benefit in selecting a pattern more complex
than <tt>E1S1</tt>. Patterns such as <tt>E1S2</tt> or <tt>E2S2</tt> introduce additional computational and
communication overhead without improving the resulting security.</t>
          <t>If the authentication method provides mutual authentication—for example, using PAKE
or TLS-PSK—then the use of <tt>E1S2</tt> or <tt>E2S2</tt> becomes appropriate. These patterns
ensure that both the Initiator and the Responder contribute static keys to the
Diffie-Hellman exchange, reinforcing the mutual nature of the derived secret.</t>
        </section>
      </section>
      <section anchor="code">
        <name>Code Output</name>
        <t>The format and characteristics of the OTP/OTK values produced by EPHEMSEC are determined
by the parameters <tt>T</tt>, <tt>B</tt>, and <tt>P</tt>.</t>
        <section anchor="T">
          <name>T – Time Window</name>
          <t><tt>T</tt> defines the duration of a validity window for each generated code, expressed in
seconds. <tt>T</tt> MUST be a positive integer greater than parameter <tt>B</tt>.</t>
        </section>
        <section anchor="B">
          <name>B – Encoding Base</name>
          <t><tt>B</tt> specifies the base used for code encoding. Valid values are:</t>
          <ul spacing="normal">
            <li>
              <t><tt>10</tt>, <tt>16</tt>, or <tt>32</tt>: Encodes the output using a human-readable digit set, suitable for OTP.</t>
            </li>
            <li>
              <t><tt>256</tt>: Encodes the output in binary form, suitable for OTK.</t>
            </li>
          </ul>
        </section>
        <section anchor="P">
          <name>P – Code Size</name>
          <t><tt>P</tt> defines the number of digits in the generated code, where each digit is an integer
in the range <tt>[0..B)</tt>. The valid range of P depends on the encoding base B and the
minimum required entropy.</t>
          <t>The table below summarizes the minimum and maximum allowed values of P for each
supported base, along with the corresponding entropy range.</t>
          <table anchor="code-limits">
            <name>Code limits</name>
            <thead>
              <tr>
                <th align="left">Base</th>
                <th align="left">min P</th>
                <th align="left">max P</th>
                <th align="left">min Entropy</th>
                <th align="left">max Entropy</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">10</td>
                <td align="left">8</td>
                <td align="left">15</td>
                <td align="left">23 bits</td>
                <td align="left">46 bits</td>
              </tr>
              <tr>
                <td align="left">16</td>
                <td align="left">7</td>
                <td align="left">17</td>
                <td align="left">24 bits</td>
                <td align="left">64 bits</td>
              </tr>
              <tr>
                <td align="left">32</td>
                <td align="left">6</td>
                <td align="left">13</td>
                <td align="left">25 bits</td>
                <td align="left">60 bits</td>
              </tr>
              <tr>
                <td align="left">256</td>
                <td align="left">4</td>
                <td align="left">65</td>
                <td align="left">24 bits</td>
                <td align="left">512 bits</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="SCHEME">
        <name>Naming Scheme</name>
        <t>EPHEMSEC uses a structured naming scheme to identify specific protocol instantiations. A
valid EPHEMSEC name has the following format:</t>
        <t><tt>Kerpass_&lt;Hash&gt;_&lt;ECDH&gt;_&lt;Pattern&gt;_T&lt;T&gt;B&lt;B&gt;P&lt;P&gt;</tt></t>
        <t>For example:</t>
        <t><tt>Kerpass_SHA512_X25519_E1S1_T600B32P9</tt></t>
        <t>Where:</t>
        <ol spacing="normal" type="1"><li>
            <t><tt>&lt;Hash&gt;</tt> corresponds to the hash function used (see <xref target="Hash"/>), e.g., <tt>SHA512</tt>.</t>
          </li>
          <li>
            <t><tt>&lt;ECDH&gt;</tt> denotes the ECDH function used (see <xref target="ECDH"/>), e.g., <tt>X25519</tt>.</t>
          </li>
          <li>
            <t><tt>&lt;Pattern&gt;</tt> specifies the key exchange pattern (see <xref target="pattern"/>), e.g., <tt>E1S1</tt>.</t>
          </li>
          <li>
            <t><tt>T&lt;T&gt;B&lt;B&gt;P&lt;P&gt;</tt> encodes the code output parameters (see <xref target="code"/>), with <tt>&lt;T&gt;</tt>, <tt>&lt;B&gt;</tt>,
and <tt>&lt;P&gt;</tt> replaced by their respective values.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="credentials">
      <name>EPHEMSEC Credentials</name>
      <t>EPHEMSEC requires an <strong>enrollment phase</strong> during which the Responder (typically the
authenticator app) registers an account with the Initiator (the relying web
application). Implementations may support various enrollment scenarios depending on
their operational context and security requirements.</t>
      <t>This specification does not define a particular enrollment protocol, but it assumes the
following outcomes:</t>
      <ul spacing="normal">
        <li>
          <t>The Responder registers a static ECDH public key with the Initiator, corresponding to
a key pair it controls.</t>
        </li>
        <li>
          <t>Both parties derive and retain a shared secret (PSK) that will be used in subsequent
EPHEMSEC operations.</t>
        </li>
      </ul>
      <section anchor="PSK">
        <name>Shared PSK</name>
        <t>The <strong>pre-shared key (PSK)</strong> is a byte string shared between the Responder and
Initiator. It is established during the enrollment process and MUST be at least 32 bytes
in length. The PSK is stored by both parties.</t>
      </section>
      <section anchor="responder-static-key">
        <name>Responder Static Key</name>
        <t>During enrollment, the Responder generates a static ECDH key pair and transmits the
corresponding public key to the Initiator. The Initiator stores this public key as part
of the Responder’s account data.</t>
      </section>
      <section anchor="initiator-static-key">
        <name>Initiator Static Key</name>
        <t>The Initiator is required to maintain a static ECDH key pair only when using key
exchange patterns that require an Initiator static key (e.g., E1S2 or E2S2). The
mechanism by which the Responder obtains and establishes trust in the Initiator’s static
public key is out of scope for this specification.</t>
      </section>
    </section>
    <section anchor="ephemsec-protocol-overview">
      <name>EPHEMSEC Protocol Overview</name>
      <t>This section outlines the overall flow of a complete EPHEMSEC OTP/OTK generation
exchange between an Initiator and a Responder.</t>
      <t>It assumes the following preconditions:</t>
      <ul spacing="normal">
        <li>
          <t>The two parties have agreed on an EPHEMSEC instantiation (see <xref target="instantation"/>).</t>
        </li>
        <li>
          <t>The Responder has registered an account with the Initiator, including a shared <tt>PSK</tt> and
necessary public key material (see <xref target="credentials"/>).</t>
        </li>
      </ul>
      <t>The protocol operates as a Challenge/Response exchange. The Initiator sends a message to
the Responder containing:</t>
      <ul spacing="normal">
        <li>
          <t>A <tt>CONTEXT</tt> byte string (e.g., relying party information),</t>
        </li>
        <li>
          <t>A freshly generated <tt>INONCE</tt>,</t>
        </li>
        <li>
          <t>Its Diffie-Hellman public key(s) as required by the selected key exchange pattern.</t>
        </li>
      </ul>
      <ul empty="true">
        <li>
          <t><strong>Note</strong>: The structure and transport of this message are out of scope for this specification.</t>
        </li>
      </ul>
      <t>Upon receiving this challenge, the Responder performs the following steps to compute the
OTP or OTK:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>Obtain nonces</strong> (see <xref target="nonces"/>):
          </t>
          <ul spacing="normal">
            <li>
              <t>Read or receive <tt>INONCE</tt> from the Initiator,</t>
            </li>
            <li>
              <t>Generate <tt>PTIME</tt> and extract <tt>SYNCHINT</tt>.</t>
            </li>
          </ul>
        </li>
        <li>
          <t><strong>Compute the Diffie-Hellman shared secret <tt>Z</tt></strong> (see <xref target="Z"/>):<br/>
Based on the agreed key exchange pattern and available keys.</t>
        </li>
        <li>
          <t><strong>Derive the intermediary secret <tt>ISK</tt></strong> (see <xref target="ISK"/>):<br/>
Using HKDF with <tt>Z</tt>, <tt>PSK</tt>, <tt>CONTEXT</tt>, <tt>SCHEME</tt>, <tt>INONCE</tt>, and <tt>PTIME</tt>.</t>
        </li>
        <li>
          <t><strong>Generate the OTP or OTK</strong> (see <xref target="OTP"/>):
          </t>
          <ul spacing="normal">
            <li>
              <t>The format is determined by the encoding base <tt>B</tt>,</t>
            </li>
            <li>
              <t>The last digit or byte encodes <tt>SYNCHINT</tt>.</t>
            </li>
          </ul>
        </li>
      </ol>
      <t>The Responder returns the resulting code to the Initiator.</t>
      <t>The Initiator, upon receiving the response, uses the included <tt>SYNCHINT</tt> to reconstruct
<tt>PTIME</tt> and repeat the same derivation steps to validate or use the resulting code.</t>
    </section>
    <section anchor="nonces">
      <name>Nonce Acquisition</name>
      <t>Each EPHEMSEC session uses two distinct nonces contributed independently by the two
parties involved:</t>
      <ul spacing="normal">
        <li>
          <t>The <strong>Initiator</strong> provides a nonce called <tt>INONCE</tt>, which ensures session uniqueness
from the Initiator's side.</t>
        </li>
        <li>
          <t>The <strong>Responder</strong> provides a time-based nonce called <tt>PTIME</tt>, which captures the
Responder’s local clock state.</t>
        </li>
      </ul>
      <t>These nonces serve as independent inputs to the intermediary secret derivation process
(see <xref target="ISK"/>).</t>
      <section anchor="INONCE">
        <name>INONCE – Initiator Nonce</name>
        <t>The Initiator generates a nonce <tt>INONCE</tt> that contributes to the personalization of the
derived intermediary secret (see <xref target="ISK"/>). This value acts as an Initiator-specific
input to ensure uniqueness of each EPHEMSEC execution.</t>
        <t><tt>INONCE</tt> MUST be a byte string of length between 16 and 64 bytes. It MUST be unique for
each run of the EPHEMSEC algorithm, and MUST NOT be reused across authentication
sessions.</t>
        <t>The value of <tt>INONCE</tt> is transmitted from the Initiator to the Responder as part of the
authentication request.</t>
      </section>
      <section anchor="PTIME">
        <name>PTIME – Responder Time Nonce</name>
        <t>The EPHEMSEC Responder derives a pseudo-time value, <tt>PTIME</tt>, from current time reading.
This <tt>PTIME</tt> acts as a Responder contributed nonce and is used in secret derivation
along with an Initiator-contributed nonce.</t>
        <t>The challenge lies in enabling the Initiator to reconstruct the same PTIME value
computed by the Responder, despite clock skew between the two parties. To address this,
the Responder includes a <strong>synchronization hint</strong>, <tt>SYNCHINT</tt>, in the last digit of the
generated OTP or OTK.</t>
        <t>Given <tt>SYNCHINT</tt>, the Initiator can recover the original <tt>PTIME</tt> as long as clock drift
remains within acceptable bounds.</t>
        <section anchor="inputs">
          <name>Inputs</name>
          <t>The following parameters are used throughout this section:</t>
          <ul spacing="normal">
            <li>
              <t><tt>time</tt>: Current Unix timestamp (seconds since 1970-01-01).</t>
            </li>
            <li>
              <t><tt>T</tt>: Code validity window (see <xref target="T"/>).</t>
            </li>
            <li>
              <t><tt>B</tt>: Encoding base (see <xref target="B"/>).</t>
            </li>
          </ul>
        </section>
        <section anchor="responder-function-ptimetime-ptime-synchint">
          <name>Responder Function – <tt>PTime(time) → (PTIME, SYNCHINT)</tt></name>
          <t>This function is executed by the Responder to compute the <tt>PTIME</tt> nonce and the
associated synchronization hint:</t>
          <sourcecode type="pseudo"><![CDATA[
step = T / (B - 1) # floating point division
PTIME = round(time / step) 
SYNCHINT = PTIME % B
return PTIME, SYNCHINT
]]></sourcecode>
        </section>
        <section anchor="initiator-function-syncptimetime-synchint-ptime">
          <name>Initiator Function – <tt>SyncPTime(time, SYNCHINT) → PTIME</tt></name>
          <t>This function is executed by the Initiator to reconstruct the Responder’s PTIME using
its local time and the received SYNCHINT:</t>
          <sourcecode type="pseudo"><![CDATA[
mintime = time - (T / 2)
step = T / (B - 1) # floating point division
mpt = round(mintime / step)
mphint = mpt % B

Q = mpt // B # integer division
PTIME = Q * B + SYNCHINT

if SYNCHINT < mphint:
    PTIME += B

return PTIME
]]></sourcecode>
          <t>This algorithm works correctly if the clock difference between the Responder and
Initiator is less than T / 2. Outside this range, synchronization will fail, resulting in
mismatched secrets.</t>
          <t>KerPass uses a 600-second time window, allowing up to  ±5 minutes clock drift in between
Initiator and Responder.</t>
        </section>
      </section>
    </section>
    <section anchor="Z">
      <name>Z - Diffie-Hellman Secret Derivation</name>
      <t>Each party derives a shared secret <tt>Z</tt> using the Diffie-Hellman key exchange, based on the
agreed EPHEMSEC key exchange pattern (see <xref target="pattern"/>). Key material is retrieved from
received protocol messages and account credential storage.</t>
      <t>The result of the Diffie-Hellman exchange is a byte string <tt>Z</tt>, which is used as part of
the key derivation input (see later sections).</t>
      <t>Where ephemeral key pairs are used, they MUST be freshly generated for each execution of
the EPHEMSEC protocol and MUST NOT be reused across sessions.</t>
      <t>EPHEMSEC execution MUST be aborted if any required key is missing or invalid.</t>
      <section anchor="initiator-e1s1-z-derivation">
        <name>Initiator E1S1 Z Derivation</name>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ei</tt> Initiator ephemeral Keypair</t>
          </li>
          <li>
            <t><tt>Sr</tt> Responder static PublicKey</t>
          </li>
        </ul>
        <t><tt>Z = ECDH(ei, Sr)</tt></t>
      </section>
      <section anchor="responder-e1s1-z-derivation">
        <name>Responder E1S1 Z Derivation</name>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>sr</tt> Responder static Keypair</t>
          </li>
          <li>
            <t><tt>Ei</tt> Initiator ephemeral PublicKey</t>
          </li>
        </ul>
        <t><tt>Z = ECDH(sr, Ei)</tt></t>
      </section>
      <section anchor="initiator-e1s2-z-derivation">
        <name>Initiator E1S2 Z Derivation</name>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ei</tt> Initiator ephemeral Keypair</t>
          </li>
          <li>
            <t><tt>si</tt> Initiator static Keypair</t>
          </li>
          <li>
            <t><tt>Sr</tt> Responder static PublicKey</t>
          </li>
        </ul>
        <t><tt>Z = ECDH(ei, Sr) || ECDH(si, Sr)</tt></t>
      </section>
      <section anchor="responder-e1s2-z-derivation">
        <name>Responder E1S2 Z Derivation</name>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>sr</tt> Responder static Keypair</t>
          </li>
          <li>
            <t><tt>Ei</tt> Initiator ephemeral PublicKey</t>
          </li>
          <li>
            <t><tt>Si</tt> Initiator static PublicKey</t>
          </li>
        </ul>
        <t><tt>Z = ECDH(sr, Ei) || ECDH(sr, Si)</tt></t>
      </section>
      <section anchor="initiator-e2s2-z-derivation">
        <name>Initiator E2S2 Z Derivation</name>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ei</tt> Initiator ephemeral Keypair</t>
          </li>
          <li>
            <t><tt>si</tt> Initiator static Keypair</t>
          </li>
          <li>
            <t><tt>Er</tt> Responder ephemeral PublicKey</t>
          </li>
          <li>
            <t><tt>Sr</tt> Responder static PublicKey</t>
          </li>
        </ul>
        <t><tt>Z = ECDH(ei, Er) || ECDH(si, Sr)</tt></t>
      </section>
      <section anchor="responder-e2s2-z-derivation">
        <name>Responder E2S2 Z Derivation</name>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>er</tt> Responder ephemeral Keypair</t>
          </li>
          <li>
            <t><tt>sr</tt> Responder static Keypair</t>
          </li>
          <li>
            <t><tt>Ei</tt> Initiator ephemeral PublicKey</t>
          </li>
          <li>
            <t><tt>Si</tt> Initiator static PublicKey</t>
          </li>
        </ul>
        <t><tt>Z = ECDH(er, Ei) || ECDH(sr, Si)</tt></t>
      </section>
    </section>
    <section anchor="ISK">
      <name>10. ISK – Intermediary Secret Derivation</name>
      <t>EPHEMSEC derives an intermediary secret key <tt>ISK</tt> using the HKDF function (see
<xref target="HKDF"/>).</t>
      <section anchor="hkdf-inputs">
        <name>10.1 Inputs</name>
        <t>The function uses the following inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>CONTEXT</tt>: An implementation-specific byte string (≤ 64 bytes), used to encode
contextual information (e.g., login page url).</t>
          </li>
          <li>
            <t><tt>SCHEME</tt>: A byte string representing the EPHEMSEC instantiation (see <xref target="SCHEME"/>).</t>
          </li>
          <li>
            <t><tt>B</tt>: Code encoding base (see <xref target="B"/>).</t>
          </li>
          <li>
            <t><tt>P</tt>: Code size (see <xref target="P"/>).</t>
          </li>
          <li>
            <t><tt>INONCE</tt>: An Initiator-generated nonce, a byte string between 16 and 64 bytes (see
see <xref target="INONCE"/>).</t>
          </li>
          <li>
            <t><tt>PTIME</tt>: Responder-contributed time nonce (see <xref target="PTIME"/>).</t>
          </li>
          <li>
            <t><tt>PSK</tt>: A shared pre-established secret (≥ 32 bytes) (see <xref target="PSK"/>).</t>
          </li>
          <li>
            <t><tt>Z</tt>: Diffie-Hellman shared secret derived from the selected key exchange pattern (see
see <xref target="Z"/>).</t>
          </li>
        </ul>
      </section>
      <section anchor="hkdf-use">
        <name>10.2 ISK Derivation</name>
        <t>The <tt>ISK</tt> is derived using the following steps:</t>
        <sourcecode type="pseudo"><![CDATA[
# CONTEXT & SCHEME are used for domain separation
salt = TLV(byte('C'), CONTEXT) || TLV(byte('S'), SCHEME)

ikm = Z || PSK

# INONCE & PTIME are used for output personalization
info = TLV(byte('N'), INONCE) || TLV(byte('T'), BE8(PTIME))

# Output length
if B == 256:
  L = P - 1 # OTK case
else:
  L = 8 # OTP case

ISK = HKDF(salt, ikm, info, L)

return ISK
]]></sourcecode>
      </section>
    </section>
    <section anchor="OTP">
      <name>OTP/OTK Derivation</name>
      <t>The intermediate secret key <tt>ISK</tt> computed in <xref target="ISK"/> serves as the final source of
entropy for generating the OTP (one-time password) or OTK (one-time key). The output
format depends on the encoding base <tt>B</tt> (see <xref target="B"/>).</t>
      <section anchor="inputs-1">
        <name>Inputs</name>
        <ul spacing="normal">
          <li>
            <t><tt>B</tt>: Code encoding base (see <xref target="B"/>).</t>
          </li>
          <li>
            <t><tt>P</tt>: Code size (see <xref target="P"/>).</t>
          </li>
          <li>
            <t><tt>PTIME</tt>: Responder-contributed time nonce (see <xref target="PTIME"/>).</t>
          </li>
          <li>
            <t><tt>ISK</tt>: Intermediate secret key (see <xref target="ISK"/>).</t>
          </li>
        </ul>
      </section>
      <section anchor="otp-derivation-b-10-16-32">
        <name>OTP Derivation (<tt>B ∈ {10, 16, 32}</tt>)</name>
        <t>When <tt>B</tt> is 10, 16, or 32, the code is formatted as an <tt>OTP</tt> composed of <tt>P</tt> digits. The
first <tt>P - 1</tt> digits are derived from <tt>ISK</tt>, and the last digit is a synchronization
hint (<tt>SYNCHINT</tt>) derived from <tt>PTIME</tt>.</t>
        <t><tt>ISK</tt> MUST be exactly 8 bytes long and is interpreted as an unsigned 64-bit integer.</t>
        <sourcecode type="pseudo"><![CDATA[
# Interpret ISK as a big-endian unsigned integer
maxcode = B ^ (P - 1)
isrc = U64(ISK) % maxcode

# Extract (P - 1) digits in base B
OTP = '' # empty byte string
for i in 0 .. (P - 2):
    digit = byte(isrc % B)
    OTP = digit || OTP
    isrc /= B

# Append 1-digit time synchronization hint
SYNCHINT = byte(PTIME % B)
OTP = OTP || SYNCHINT

return OTP  # byte string of P digits in [0 .. B)
]]></sourcecode>
        <t><strong>Note</strong>: The result is returned as a sequence of <tt>P</tt> integer digits in base <tt>B</tt>.</t>
        <t>Conversion to a human-readable representation (for example, an alphanumeric alphabet) is
outside the scope of this specification. Nevertheless, the use of the <xref target="Crockford-B32"/>
alphabet is RECOMMENDED, as it is applicable to all EPHEMSEC OTP schemes and has been
designed to minimize transcription and input errors.</t>
      </section>
      <section anchor="otk-derivation-b-256">
        <name>OTK Derivation (<tt>B = 256</tt>)</name>
        <t>When <tt>B</tt> is 256, the output is an opaque binary key. The first <tt>P - 1</tt> bytes are taken
directly from <tt>ISK</tt>, and the last byte encodes the synchronization hint.</t>
        <sourcecode type="pseudo"><![CDATA[
SYNCHINT = byte(PTIME % 256)
OTK = ISK || SYNCHINT

return OTK  # byte string of length P
]]></sourcecode>
      </section>
    </section>
    <section anchor="key-exchange">
      <name>Key Exchange Protocol Integration</name>
      <t>EPHEMSEC OTPs/OTKs are ephemeral <strong>shared secrets</strong> that can serve as primary
credentials in mutually authenticated key exchange protocols, such as:</t>
      <ul spacing="normal">
        <li>
          <t>Password-Authenticated Key Exchange (PAKE)</t>
        </li>
        <li>
          <t>TLS with Pre-Shared Key authentication (TLS-PSK)</t>
        </li>
      </ul>
      <t>Traditional one-time password algorithms like HOTP, as defined in <xref target="RFC4226"/>, are
unsuitable for these protocols due to their reliance on loose synchronization.
Validation servers must compare a received OTP against a range of possible values, which
precludes direct use as cryptographic key material.</t>
      <t>EPHEMSEC addresses this limitation by appending a <strong>synchronization digit</strong> to each
OTP/OTK. This digit enables reconstruction of the time-based nonce <tt>PTIME</tt> (see
<xref target="PTIME"/>), ensuring that both parties derive identical secrets without relying on
trial-and-error validation.</t>
      <t>To use EPHEMSEC outputs as inputs to a key exchange protocol:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>Client Preparation</strong>:
          </t>
          <ul spacing="normal">
            <li>
              <t>Append the synchronization digit to the account identifier.</t>
            </li>
            <li>
              <t>Use this composite identifier to initiate the key exchange protocol.</t>
            </li>
          </ul>
        </li>
        <li>
          <t><strong>Server Operation</strong>:
          </t>
          <ul spacing="normal">
            <li>
              <t>Extract the synchronization digit from the received identifier.</t>
            </li>
            <li>
              <t>Remove the synchronization digit to recover the base account identifier.</t>
            </li>
            <li>
              <t>Load the corresponding client credentials using the base identifier.</t>
            </li>
            <li>
              <t>Execute the EPHEMSEC algorithm with the received session parameters, credentials,
and synchronization hint to derive the shared secret.</t>
            </li>
            <li>
              <t>Proceed with the key exchange protocol using the derived secret.</t>
            </li>
          </ul>
        </li>
      </ol>
    </section>
    <section anchor="security-considerations">
      <name>Security considerations</name>
      <t>This section outlines the security properties of the EPHEMSEC algorithm. The analysis
presented here is intended to demonstrate why the protocol is expected to meet its
security goals, based on widely accepted cryptographic assumptions.</t>
      <t>This document has not yet undergone comprehensive peer review by the cryptographic and
security communities. The security analysis presented should be considered preliminary,
and implementers should exercise appropriate caution in security-critical deployments
pending further review.</t>
      <section anchor="adversary-profiles">
        <name>Adversary Profiles</name>
        <t>Two adversary profiles are considered in this analysis:</t>
        <ul spacing="normal" anchor="network-observer">
          <li>
            <t><strong>Network Observer</strong><br/>
This adversary has access to all publicly visible data, including the Initiator’s and
Responder’s static ECDH public keys, session inputs (nonces, ephemeral public keys),
and outputs (OTPs/OTKs) from previous EPHEMSEC sessions. It does not have access to
any party’s private credentials.</t>
          </li>
        </ul>
        <ul spacing="normal" anchor="credential-leak">
          <li>
            <t><strong>Credential Leak Attacker</strong><br/>
This adversary has all the capabilities of a Network Observer, and additionally has
read access to the Initiator’s credential store — specifically the Responder’s shared
PSKs and static public keys. It does <strong>not</strong> have access to the Initiator’s private
keys or control over protocol behavior.</t>
          </li>
        </ul>
      </section>
      <section anchor="output-unpredictability-of-ephemsec">
        <name>Output Unpredictability of EPHEMSEC</name>
        <t>The primary security goal of an OTP/OTK algorithm is to ensure that outputs are
unpredictable — even to attackers with significant passive or partial access.</t>
        <t>EPHEMSEC achieves this by combining Diffie-Hellman key exchange and HKDF with
session-specific nonces. Specifically:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Unpredictability of the Shared Secret (<tt>Z</tt>)</strong><br/>
The ECDH-derived shared secret <tt>Z</tt> is indistinguishable from random to any adversary
lacking private keys, due to the hardness of the Decisional Diffie-Hellman (DDH)
problem on the chosen curve.</t>
          </li>
          <li>
            <t><strong>Unpredictability of the HKDF Input (<tt>ikm</tt>)</strong><br/>
The HKDF input key material (<tt>ikm = Z || PSK</tt>) inherits the unpredictability of <tt>Z</tt>.
Even if the attacker knows the pre-shared key (PSK), the presence of the fresh and
secret <tt>Z</tt> value ensures <tt>ikm</tt> remains secure.</t>
          </li>
          <li>
            <t><strong>Security of the Derived Secret (<tt>ISK</tt>)</strong><br/>
HKDF acts as a cryptographically strong pseudorandom function (PRF), meaning its
outputs — including the intermediary secret <tt>ISK</tt> — are indistinguishable from
random, provided the HKDF <tt>ikm</tt> secret input is unpredictable. Because each execution
of EPHEMSEC uses unique nonces and ephemeral keys, the <tt>ISK</tt> value changes with every
session.</t>
          </li>
          <li>
            <t><strong>Output Derivation (OTP/OTK)</strong>
            </t>
            <ul spacing="normal">
              <li>
                <t>For OTKs (<tt>B = 256</tt>): <tt>ISK</tt> is directly used, preserving its pseudorandomness.</t>
              </li>
              <li>
                <t>For OTPs (<tt>B ∈ {10, 16, 32}</tt>): <tt>ISK</tt> is converted to digits via modular arithmetic.
This process introduces bias when <tt>B = 10</tt>, but the bias is mitigated by
restricting code sizes (<tt>P</tt>) to the ranges specified in <xref target="code-limits"/> (see
<xref target="otp-bias"/> for analysis).</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Prevention of Replay and Forward Prediction</strong><br/>
The use of unique nonces (<tt>INONCE</tt>, <tt>PTIME</tt>) and ephemeral keys ensures that no two
executions produce the same output — even for the same account and context. This
prevents replay attacks and ensures that attackers cannot predict future codes based
on prior sessions.</t>
          </li>
        </ol>
        <t>As a result, even an attacker who observes multiple sessions (and even possesses some
server-side credentials) cannot derive or guess new OTPs or OTKs, nor can they reuse
prior ones.</t>
      </section>
      <section anchor="phishing-and-mitm-prevention-via-context-binding">
        <name>Phishing and MITM Prevention via Context Binding</name>
        <t>EPHEMSEC can mitigate web browser phishing and man-in-the-middle (MITM) attacks by binding
cryptographic outputs to authentication context through the <tt>CONTEXT</tt> input (see
<xref target="hkdf-inputs"/>). This mechanism enables:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Phishing Resistance</strong>:
            </t>
            <ul spacing="normal">
              <li>
                <t>By embedding the login page URL in <tt>CONTEXT</tt>, the derived OTP/OTK becomes
domain-specific.</t>
              </li>
              <li>
                <t>An attacker hosting a fake page cannot reuse intercepted codes, as their context
will differ.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>MITM Resistance</strong>:
            </t>
            <ul spacing="normal">
              <li>
                <t>Including the server's TLS certificate hash in <tt>CONTEXT</tt> ensures the OTP/OTK is
tied to the authenticated connection.</t>
              </li>
              <li>
                <t>A MITM with an invalid certificate cannot generate valid codes.</t>
              </li>
            </ul>
          </li>
        </ol>
        <section anchor="the-need-for-a-trusted-agent">
          <name>The need for a trusted Agent</name>
          <t>Context binding alone is <strong>insufficient</strong> to provide Phishing or MITM resistance.</t>
          <t>For Context binding to be efficient, it must be used jointly with a <strong>trusted Agent</strong>
(e.g., a browser extension) that:</t>
          <ul spacing="normal">
            <li>
              <t>Reliably acquire authentication context (e.g., page URL, certificate)</t>
            </li>
            <li>
              <t>Securely inject it into EPHEMSEC's <tt>CONTEXT</tt> parameter</t>
            </li>
            <li>
              <t>Resist spoofing or coercion by attackers</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="mutual-authentication">
        <name>Mutual Authentication</name>
        <t>Because the EPHEMSEC Initiator and Responder share a <tt>PSK</tt> (see <xref target="PSK"/>), all OTP/OTK
outputs are derived from a secret known to both parties. As a result, these values can
serve as credentials in protocols that support mutual authentication, such as PAKE or
TLS-PSK.</t>
        <t>However, when the <tt>E1S1</tt> key exchange pattern is used, the only contribution from the
Initiator is an ephemeral key. In this configuration, the mutuality of the shared secret
relies solely on the <tt>PSK</tt>. If the <tt>PSK</tt> is compromised — for example, by a Credential
Leak Attacker — the attacker can impersonate the Initiator to the Responder.</t>
        <t>To mitigate this risk, it is RECOMMENDED that mutual authentication deployments use the
<tt>E1S2</tt> or <tt>E2S2</tt> key exchange patterns. These patterns require the Initiator to
contribute a static ECDH key, ensuring that mutual authentication depends on key
material not accessible to a Credential Leak Attacker. This prevents such an attacker
from successfully impersonating the Initiator.</t>
      </section>
      <section anchor="time-synchronization-attacks">
        <name>Time Synchronization Attacks</name>
        <t>EPHEMSEC's time-synchronized nature creates a potential attack vector against the
protocol's availability. The algorithm requires that clock drift between Initiator and
Responder remain within <tt>T/2</tt> seconds for successful PTIME recovery (see <xref target="PTIME"/>).</t>
        <t>An attacker who can manipulate the time sources or time synchronization mechanisms of
either party may cause authentication failures by forcing clock drift to exceed this
threshold. Such attacks could result in denial of service against the authentication
system.</t>
        <t>Future revisions will extend <tt>PTIME</tt> derivation to support event-based counters
alongside time-based synchronization. Setting <tt>T = 0</tt> will enable event-synchronized
OTP/OTK generation using shared counters, while <tt>T &gt; 0</tt> will maintain time-based
operation, allowing applications to choose the synchronization method best suited to
their threat model.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>No IANA action is required.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC7748">
          <front>
            <title>Elliptic Curves for Security</title>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <date month="January" year="2016"/>
            <abstract>
              <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS). These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7748"/>
          <seriesInfo name="DOI" value="10.17487/RFC7748"/>
        </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>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC4226">
          <front>
            <title>HOTP: An HMAC-Based One-Time Password Algorithm</title>
            <author fullname="D. M'Raihi" initials="D." surname="M'Raihi"/>
            <author fullname="M. Bellare" initials="M." surname="Bellare"/>
            <author fullname="F. Hoornaert" initials="F." surname="Hoornaert"/>
            <author fullname="D. Naccache" initials="D." surname="Naccache"/>
            <author fullname="O. Ranen" initials="O." surname="Ranen"/>
            <date month="December" year="2005"/>
            <abstract>
              <t>This document describes an algorithm to generate one-time password values, based on Hashed Message Authentication Code (HMAC). A security analysis of the algorithm is presented, and important parameters related to the secure deployment of the algorithm are discussed. The proposed algorithm can be used across a wide range of network applications ranging from remote Virtual Private Network (VPN) access, Wi-Fi network logon to transaction-oriented Web applications.</t>
              <t>This work is a joint effort by the OATH (Open AuTHentication) membership to specify an algorithm that can be freely distributed to the technical community. The authors believe that a common and shared algorithm will facilitate adoption of two-factor authentication on the Internet by enabling interoperability across commercial and open-source implementations. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4226"/>
          <seriesInfo name="DOI" value="10.17487/RFC4226"/>
        </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="RFC6238">
          <front>
            <title>TOTP: Time-Based One-Time Password Algorithm</title>
            <author fullname="D. M'Raihi" initials="D." surname="M'Raihi"/>
            <author fullname="S. Machani" initials="S." surname="Machani"/>
            <author fullname="M. Pei" initials="M." surname="Pei"/>
            <author fullname="J. Rydell" initials="J." surname="Rydell"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>This document describes an extension of the One-Time Password (OTP) algorithm, namely the HMAC-based One-Time Password (HOTP) algorithm, as defined in RFC 4226, to support the time-based moving factor. The HOTP algorithm specifies an event-based OTP algorithm, where the moving factor is an event counter. The present work bases the moving factor on a time value. A time-based variant of the OTP algorithm provides short-lived OTP values, which are desirable for enhanced security.</t>
              <t>The proposed algorithm can be used across a wide range of network applications, from remote Virtual Private Network (VPN) access and Wi-Fi network logon to transaction-oriented Web applications. The authors believe that a common and shared algorithm will facilitate adoption of two-factor authentication on the Internet by enabling interoperability across commercial and open-source implementations. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6238"/>
          <seriesInfo name="DOI" value="10.17487/RFC6238"/>
        </reference>
        <reference anchor="KerPass" target="https://github.com/amvtek/KerPass">
          <front>
            <title>KerPass open source project</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="PASSKEY" target="https://passkeys.dev/docs/reference/specs/">
          <front>
            <title>passkeys-Specifications</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Crockford-B32" target="https://www.crockford.com/base32.html">
          <front>
            <title>Crockford Base 32 Alphabet</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 821?>

<section anchor="otp-bias">
      <name>OTP Sampling Bias</name>
      <t>EPHEMSEC generates <tt>P</tt> (see <xref target="P"/>) digits OTPs from 64-bit pseudo-random integers as
described in <xref target="OTP"/>. This final operation may introduce a non-uniform distribution in
the generated OTP when the code base <tt>B</tt> (see <xref target="B"/>) does not evenly divide 2^64, which
occurs for all bases except <tt>B</tt> = 10.</t>
      <t>We apply the Bias Formula below to evaluate the bias for code base 10.</t>
      <t>The bias reaches its maximum when the code size <tt>P</tt> is at its maximum value. While
EPHEMSEC supports a maximum P of 15, only 14 digits are used to encode the pseudo-random
value. Therefore:</t>
      <t><tt>bias = 1 / floor(2^64 / 10^14) ≈ 5.4e-6</tt></t>
      <t>This value is negligibly close to zero, making the code base 10 bias insignificant.</t>
      <t>For comparison, <xref target="RFC4226"/> generates 6-digit base-10 OTPs from 31-bit pseudo-random
integers, resulting in:</t>
      <t><tt>bias = 1 / floor(2^31 / 10^6) ≈ 0.5e-3</tt></t>
      <t>While this value is also close to zero, it is approximately 100 times larger than
EPHEMSEC's code base 10 bias.</t>
      <section anchor="bias-formula">
        <name>Bias Formula</name>
        <t>For integers <tt>m</tt> and <tt>M</tt> where <tt>m</tt> ≤ <tt>M</tt> and <tt>m</tt> &gt; 0, when sampling uniformly from <tt>[0, M)</tt> and
taking remainder modulo m, remainder distribution may not be uniform.</t>
        <t>To quantify this non uniformity we can calculate a bias coefficient using:</t>
        <ul spacing="normal">
          <li>
            <t><tt>bias = 0 when M % m = 0</tt></t>
          </li>
          <li>
            <t><tt>bias = 1/floor(M/m) when M % m ≠ 0</tt></t>
          </li>
        </ul>
        <t>The <tt>bias</tt> value varies in <tt>[0,1]</tt> and indicates the relative overrepresentation of certain
remainders. When <tt>bias = 0</tt>, distribution is uniform.</t>
        <section anchor="derivation">
          <name>Derivation</name>
          <t>Let <tt>X</tt> be a uniformly distributed random variable that generates integers in the range <tt>[0,M)</tt>.
Let <tt>R = X % m</tt>, where <tt>R</tt> is a random variable that maps <tt>X</tt> to the remainder of the
division by <tt>m</tt>.</t>
          <t>We want to determine the probability distribution of <tt>R</tt> and quantify any bias that arises.</t>
          <t>Since <tt>X</tt> is uniformly distributed, the probability of <tt>X</tt> taking any specific value <tt>v</tt>
in <tt>[0, M)</tt> is <tt>1/M</tt>.</t>
          <t>Using the results from Lemma 1 below, we can determine the probability distribution of
<tt>R</tt>.</t>
        </section>
        <section anchor="case-1-when-m-is-divisible-by-m-m-m-0">
          <name>Case 1: When M is divisible by m (M % m = 0)</name>
          <t>From Lemma 1, each remainder <tt>r</tt> in <tt>[0, m)</tt> occurs exactly <tt>M/m</tt> times among the values
<tt>[0, M)</tt>.<br/>
Therefore, <tt>R</tt> is uniformly distributed with:</t>
          <t><tt>p(r) = (M/m) × (1/M) = 1/m for all r in [0, m)</tt></t>
          <t>In this case, there is no bias since all remainders are equally likely.</t>
        </section>
        <section anchor="case-2-when-m-is-not-divisible-by-m-m-m-s-where-0-s-m">
          <name>Case 2: When M is not divisible by m (M % m = s where 0 &lt; s &lt; m)</name>
          <t>From Lemma 1, the remainders have different frequencies:</t>
          <ul spacing="normal">
            <li>
              <t>Remainders <tt>r</tt> in <tt>[0, s)</tt> occur <tt>floor(M/m) + 1</tt> times each</t>
            </li>
            <li>
              <t>Remainders <tt>r</tt> in <tt>[s, m)</tt> occur <tt>floor(M/m)</tt> times each</t>
            </li>
          </ul>
          <t>This leads to a non-uniform distribution:</t>
          <ul spacing="normal">
            <li>
              <t><tt>p(r) = p1 = (floor(M/m) + 1)/M for r in [0, s)</tt></t>
            </li>
            <li>
              <t><tt>p(r) = p2 = floor(M/m)/M for r in [s, m)</tt></t>
            </li>
          </ul>
        </section>
        <section anchor="bias-quantification">
          <name>Bias Quantification</name>
          <t>The bias arises because <tt>p1</tt> &gt; <tt>p2</tt>. We can express this relationship as:</t>
          <sourcecode type="pseudo"><![CDATA[
p1 = p2 × (1 + 1/floor(M/m)) = p2 × (1 + bias)

where:
bias = 1/floor(M/m)
]]></sourcecode>
          <t>This bias factor measures the non-uniformity of the distribution:</t>
          <ul spacing="normal">
            <li>
              <t><tt>bias</tt> = 0 when <tt>M</tt> is divisible by m (uniform case)</t>
            </li>
            <li>
              <t><tt>bias</tt> ∈ (0, 1] when <tt>M</tt> is not divisible by <tt>m</tt>, with larger values indicating greater non-uniformity</t>
            </li>
            <li>
              <t>The bias is maximized when <tt>floor(M/m) = 1</tt>, giving <tt>bias</tt> = 1</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="lemma-1-distribution-of-remainders-in-0-m">
        <name>Lemma 1: Distribution of Remainders in [0, M)</name>
        <t>Let <tt>m</tt> and <tt>M</tt> be integers where <tt>m</tt> ≤ <tt>M</tt> and <tt>m</tt> &gt; 0.</t>
        <t>For any integer <tt>r</tt> in <tt>[0, m)</tt>, the number of integers <tt>v</tt> in <tt>[0, M)</tt> that satisfy
<tt>v</tt> % <tt>m</tt> = <tt>r</tt> is:</t>
        <ol spacing="normal" type="1"><li>
            <t>When <tt>M</tt> is divisible by <tt>m</tt> (<tt>M</tt> % <tt>m</tt> = 0):
            </t>
            <ul spacing="normal">
              <li>
                <t>Exactly <tt>M/m</tt> values for every <tt>r</tt> in <tt>[0, m)</tt></t>
              </li>
            </ul>
          </li>
          <li>
            <t>When <tt>M</tt> is not divisible by <tt>m</tt> (<tt>M</tt> % <tt>m</tt> = <tt>s</tt> where 0 &lt; <tt>s</tt> &lt; <tt>m</tt>):
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>floor(M/m) + 1</tt> values for <tt>r</tt> in <tt>[0, s)</tt></t>
              </li>
              <li>
                <t><tt>floor(M/m)</tt> values for <tt>r</tt> in <tt>[s, m)</tt></t>
              </li>
            </ul>
          </li>
        </ol>
        <section anchor="proof">
          <name>Proof:</name>
          <sourcecode type="pseudo"><![CDATA[
For r in [0, m) let count(r) be the count of v satisfying v % m = r for v in [0, M)

Any v, such that v % m = r can be written as v = q·m + r where q ≥ 0
To keep v in [0, M), we must have q ≤ (M - 1 - r)/m, hence
count(r) = floor((M -1 - r)/m) + 1

When M = k·m (divisible case):

- count(r) = floor((k·m - 1 - r)/m) + 1 = k = M/m

When M = k·m + s (non-divisible case):

- For r < s: count(r) = k + 1
- For r ≥ s: count(r) = k
]]></sourcecode>
        </section>
      </section>
    </section>
    <section anchor="design-rationale">
      <name>Design Rationale</name>
      <t>The EPHEMSEC algorithm has undergone several implementation iterations, initially
starting by modifying the HOTP algorithm described in <xref target="RFC4226"/> to achieve the desired
security properties.</t>
      <t>The following sections explain the rationale behind key design choices.</t>
      <section anchor="use-of-hkdf">
        <name>Use of HKDF</name>
        <t>HKDF was chosen over the <xref target="RFC4226"/> HMAC approach for two reasons:</t>
        <ol spacing="normal" type="1"><li>
            <t>The HKDF domain separation feature enabled by the HKDF <tt>salt</tt> parameter (see
<xref target="hkdf-use"/>) provides the necessary context binding used for phishing protection.</t>
          </li>
          <li>
            <t>HKDF allows adjusting output size, which reduces the complexity of supporting the
range of OTP/OTK sizes supported by EPHEMSEC (see <xref target="code-limits"/>).</t>
          </li>
        </ol>
      </section>
      <section anchor="usage-of-psk">
        <name>Usage of PSK</name>
        <t>The inclusion of a pre-shared key (PSK) ensures that generated OTP/OTKs are always a
<strong>mutual</strong> secret, which the <tt>E1S1</tt> pattern (see <xref target="E1S1"/>) alone cannot guarantee.</t>
        <t>The incremental cost of mixing the <tt>PSK</tt> (see <xref target="PSK"/>) into the HKDF <tt>ikm</tt> input (see
<xref target="hkdf-use"/>) is expected to be low, and the <tt>PSK</tt> improves the secrecy of <tt>ikm</tt>.
Therefore, it is always used even when the pattern (e.g., <tt>E1S2</tt>; see <xref target="E1S2"/>) already
provides the desired <strong>mutual</strong> secrecy.</t>
      </section>
      <section anchor="usage-of-nonces">
        <name>Usage of Nonces</name>
        <t>The design requires that both the Initiator and Responder contribute a nonce and are
responsible for ensuring that their respective nonces are not reused.</t>
        <t>Although both parties currently contribute a nonce, the Initiator’s nonce may not be
strictly required. Since the Initiator already contributes an ephemeral public key, this
element provides sufficient entropy and freshness for the session. The Initiator’s nonce
is therefore retained primarily to simplify the security analysis and preserve symmetry
in the protocol design. Future revisions of this specification may remove it if it is
shown to be redundant.</t>
        <section anchor="transmission-of-the-responder-nonce">
          <name>Transmission of the Responder Nonce</name>
          <t>When using OTP output, bandwidth between the Responder and the Initiator is severely
constrained. Therefore, a synchronization digit <tt>SYNCHINT</tt> is used to "compress" the
Responder nonce <tt>PTIME</tt> (see <xref target="PTIME"/>).</t>
          <t>When using OTK output, it is assumed that the application has addressed the bandwidth
limitations that necessitate OTP output, and therefore <tt>PTIME</tt> could potentially be
transmitted in uncompressed form.</t>
          <t>However, explicit support for uncompressed transmission was not included for two
reasons:</t>
          <ol spacing="normal" type="1"><li>
              <t>The computational cost of running the synchronization algorithm to recover <tt>PTIME</tt>
from <tt>SYNCHINT</tt> is very low.</t>
            </li>
            <li>
              <t>Having the server rely on <tt>SYNCHINT</tt> to reconstruct <tt>PTIME</tt> limits the Responder's
ability to reuse its own nonces, which provides additional security benefits.</t>
            </li>
          </ol>
        </section>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>A minimal set of test vectors is provided for OTP and OTK schemes that use the SHA512
hash function and the X25519 ECDH function.</t>
      <t>The <xref target="KerPass"/> open source project provides an extensive set of vectors that allow
testing EPHEMSEC output generated using common hash functions and curves.</t>
      <section anchor="kerpasssha512x25519e1s1t600b10p8-vector">
        <name>Kerpass_SHA512_X25519_E1S1_T600B10P8 vector</name>
        <sourcecode type="json"><![CDATA[
{
  "scheme": "Kerpass_SHA512_X25519_E1S1_T600B10P8",
  "context": "a33698e33f8ac3aae8c3b1527cc019e5b3e34e5569883283b1a75fbfbe8f3d7d1d5c17d10d90533d33305a90560bfe",
  "psk": "55a439e62aefd92eebb7f4bc7e5f1626ef4545fa499252dd8658b61547f9df0e",
  "shared_secret": "0803020700020800",
  "otp": "83270280",
  "init_nonce": "d8421a5a86f2caf8d45e6ef5c62d3b5421ba7a",
  "init_time": 4134179892,
  "init_static_key": "",
  "init_ephemeral_key": "50d2af0ee110bd06604eb03e57a37763c9194400015290f3ef612be18ecd0583",
  "init_remote_static_key": "f1e1116982475e7fd252a2ca69c1459b3a4439029fa3f33059d7e657b3318912",
  "init_remote_ephemeral_key": "",
  "resp_time": 4134179984,
  "resp_synchro_hint": 0,
  "resp_static_key": "fad1034e60389317dd0e405c84fff2d17248fa1112d66a1979515ddf65a44a06",
  "resp_ephemeral_key": "",
  "resp_remote_static_key": "",
  "resp_remote_ephemeral_key": "0fc4c28b9d85a476a1b664050901c78c9b4ff69bde707829bd1e05e5602a3d55",
  "hkdf_salt": "432fa33698e33f8ac3aae8c3b1527cc019e5b3e34e5569883283b1a75fbfbe8f3d7d1d5c17d10d90533d33305a90560bfe53244b6572706173735f5348413531325f5832353531395f453153315f543630304231305038",
  "hkdf_info": "4e13d8421a5a86f2caf8d45e6ef5c62d3b5421ba7a54080000000003b23d1c",
  "hkdf_secret": "31215fcaafce8df63bd3a21371d15233501da05b5c52248fb6d4cafbdad20d3655a439e62aefd92eebb7f4bc7e5f1626ef4545fa499252dd8658b61547f9df0e"
}
]]></sourcecode>
      </section>
      <section anchor="kerpasssha512x25519e1s2t600b16p8-vector">
        <name>Kerpass_SHA512_X25519_E1S2_T600B16P8 vector</name>
        <sourcecode type="json"><![CDATA[
{
  "scheme": "Kerpass_SHA512_X25519_E1S2_T600B16P8",
  "context": "037f9aae0e39c770b7c216572382e1b78ccff597a27aeb004cd14c881fe1944eb630e8af0f9840b1ef3ffaf2cf697fb0a08d9cacd5e8c5ff4a1be583b4",
  "psk": "a2096639c4a3b6de9bb4d76bfe5b047545eaa3ccb8b67839c55e580ba54feb0d",
  "shared_secret": "0e0f0b02070e020e",
  "otp": "EFB27E2E",
  "init_nonce": "a5ddd81c502e054357c58ac483b8d39ce1e7",
  "init_time": 568923577,
  "init_static_key": "77166d9d14b2cc221a3829f600aad1f2f18872e8a7e7cb7aae2def72b69bff58",
  "init_ephemeral_key": "90533d33305a90560bfef99d07c496ca92ef5001b62441860509af3d226d8ba4",
  "init_remote_static_key": "dc94881a2063e4d30a0e7fe377838202e542b46d8836e57187e9abef99216078",
  "init_remote_ephemeral_key": "",
  "resp_time": 568923459,
  "resp_synchro_hint": 14,
  "resp_static_key": "dcad0c9e9aafe811761199f7e2286fda5036e5f5fc6f98c5f4b97fce71532ef8",
  "resp_ephemeral_key": "",
  "resp_remote_static_key": "176198d01d29325b022a5efff4d315bbf9fb4a07755d19581f857754797f6b54",
  "resp_remote_ephemeral_key": "ecb63fa01c06b8d2c4de23d1abc4a5d57647481fbed22fb5866fda4c7989103c",
  "hkdf_salt": "433d037f9aae0e39c770b7c216572382e1b78ccff597a27aeb004cd14c881fe1944eb630e8af0f9840b1ef3ffaf2cf697fb0a08d9cacd5e8c5ff4a1be583b453244b6572706173735f5348413531325f5832353531395f453153325f543630304231365038",
  "hkdf_info": "4e12a5ddd81c502e054357c58ac483b8d39ce1e754080000000000d906ee",
  "hkdf_secret": "ca2a1d1f71d686ad52f6ef62571d38a5d579f96a86150861e736ea3e71aeba59c85cae9ec5404221a87423eaf952c151bc74b0213fa8a41fba0786ccf315fd5ba2096639c4a3b6de9bb4d76bfe5b047545eaa3ccb8b67839c55e580ba54feb0d"
}
]]></sourcecode>
      </section>
      <section anchor="kerpasssha512x25519e2s2t600b32p9-vector">
        <name>Kerpass_SHA512_X25519_E2S2_T600B32P9 vector</name>
        <sourcecode type="json"><![CDATA[
{
  "scheme": "Kerpass_SHA512_X25519_E2S2_T600B32P9",
  "context": "9e2d582a0afac79709941506151e9e6ce20cef6da6c3aa457b",
  "psk": "3ec69559723db8a20cdace8bee0bf6534a1de8902786fc3b3626e4897f261dee",
  "shared_secret": "13010a191603100111",
  "otp": "K1ASP3G1H",
  "init_nonce": "716fbb9b9872e0b49dce2723a52ade9d5fdc59",
  "init_time": 2246779725,
  "init_static_key": "6a846ddc06f426e60dd4ae3fbd5b9b06286abc3862e473855e89a138c56ea0b2",
  "init_ephemeral_key": "aa2b0e1b2e4704f08a377ba26e4475aaf1aab010fb8c6ad4bf63890816d3d3f2",
  "init_remote_static_key": "acc4416cd58c4a1a43272253c75a8f27708174f24548466757e13374e161c74b",
  "init_remote_ephemeral_key": "d32119b92d8a61d0c204a4355c86e19c7027376c2e42be84ffa907a1aaec9e6a",
  "resp_time": 2246779996,
  "resp_synchro_hint": 17,
  "resp_static_key": "6716e0cf047f6721662c501ad15f9884cada29210c019c7df566a0e71b67b1dd",
  "resp_ephemeral_key": "d45cf4b5736ef3f3fb0d2a98459a304e595276243d4af91aa5ef2366d44ade2e",
  "resp_remote_static_key": "f7c192278ea1c2323e92cc13da9ac5f0a8d53ac879eadbd774413c66659d865e",
  "resp_remote_ephemeral_key": "86e53308c5bcefe25707f0ffee26cbdc260fc98d22fc9f9e53f4c1994347c27c",
  "hkdf_salt": "43199e2d582a0afac79709941506151e9e6ce20cef6da6c3aa457b53244b6572706173735f5348413531325f5832353531395f453253325f543630304233325039",
  "hkdf_info": "4e13716fbb9b9872e0b49dce2723a52ade9d5fdc5954080000000006eb4bb1",
  "hkdf_secret": "36d0bdc70509bb9cff6f2d899e4b9dd261c91da06604f43e408e96da1253827fc37f09bdd64436333faab1150a0bd26d9c8ef3d5935e175b9db3c5ebacdbe7633ec69559723db8a20cdace8bee0bf6534a1de8902786fc3b3626e4897f261dee"
}
]]></sourcecode>
      </section>
      <section anchor="kerpasssha512x25519e1s2t1024b256p33-vector">
        <name>Kerpass_SHA512_X25519_E1S2_T1024B256P33 vector</name>
        <sourcecode type="json"><![CDATA[
{
  "scheme": "Kerpass_SHA512_X25519_E1S2_T1024B256P33",
  "context": "c58ac483b8d39ce1e7037f9aae0e39c770b7c216572382e1",
  "psk": "aad1f2f18872e8a7e7cb7aae2def72b69bff58a2096639c4a3b6de9bb4d76bfe",
  "shared_secret": "8479fca69f6d1dbc9164f20eaa4d799ba3b8dae83f915864766fa66d4cae17422c",
  "otp": "",
  "init_nonce": "5b047545eaa3ccb8b67839c55e580ba54feb0da5ddd81c502e054357",
  "init_time": 3762980154,
  "init_static_key": "6fda5036e5f5fc6f98c5f4b97fce71532ef8d077166d9d14b2cc221a3829f600",
  "init_ephemeral_key": "4e5569883283b1a75fbfbe8f3d7d1d5c17d10d90533d33305a90560bfef99d07",
  "init_remote_static_key": "2f92f4b84f1b107ca934e641f34bfae2b2251e9b70876cd1a256301f8f3ccc0e",
  "init_remote_ephemeral_key": "",
  "resp_time": 3762980663,
  "resp_synchro_hint": 44,
  "resp_static_key": "c496ca92ef5001b62441860509af3d226d8ba4dcad0c9e9aafe811761199f7e2",
  "resp_ephemeral_key": "",
  "resp_remote_static_key": "c52b20d6825127ecb33dfff5c1d9a0ed7f57b41eda1dd6855d7ad6268372fc70",
  "resp_remote_ephemeral_key": "6a5a0dd77082720ebd55bcab514a68be8db117af5a17fbb06a7e035e44959307",
  "hkdf_salt": "4318c58ac483b8d39ce1e7037f9aae0e39c770b7c216572382e153274b6572706173735f5348413531325f5832353531395f453153325f543130323442323536503333",
  "hkdf_info": "4e1c5b047545eaa3ccb8b67839c55e580ba54feb0da5ddd81c502e05435754080000000037da8f2c",
  "hkdf_secret": "04b954ad9d6d42e39217b6a32ae83bc52ba662a39e2bcf18240e6b07034a8c4c86e7a23622ce6b4cd46665d4309b624dd16fa39e57c86c7daf115ddd17f24039aad1f2f18872e8a7e7cb7aae2def72b69bff58a2096639c4a3b6de9bb4d76bfe"
}
]]></sourcecode>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
