<?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.36 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mvieuille-kerpass-ephemsec-03" category="info" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title abbrev="EPHEMSEC">KerPass EPHEMSEC One-Time Password Algorithm</title>
    <seriesInfo name="Internet-Draft" value="draft-mvieuille-kerpass-ephemsec-03"/>
    <author initials="M." surname="Vieuille" fullname="Marc Vieuille">
      <organization/>
      <address>
        <email>marc.vieuille@polytechnique.org</email>
      </address>
    </author>
    <date year="2026" month="May" day="05"/>
    <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 as a raw octet string, 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>
          <t>The lower bound on P ensures a minimum entropy of 23 bits across all bases, derived from
the entropy of 7 pseudo-random base-10 digits (one more than the 6-digit OTPs
commonplace in deployed systems). The upper bound varies by base. For bases 16 and 32, P
is bounded by the 64-bit integer from which the OTP is extracted (see
<xref target="otp-derivation"/>). Base 10 is subject to sampling bias (see <xref target="otp-bias"/>); its upper
bound is therefore reduced to ensure the bias remains negligible, corresponding to a
46-bit entropy limit. For base 256 (OTK), no extraction bound applies; the upper bound
of 64 bytes (512 bits of entropy) is set as a practical limit sufficient to address all
foreseeable use cases.</t>
        </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">
        <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">
        <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 831?>

<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 when B = 10 but not for bases that are powers of 2 (B = 16 and B = 32).</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>
