<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.2.3) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-mvieuille-kerpass-ephemsec-00" category="info">
  <front>
    <title abbrev="EPHEMSEC">KerPass EPHEMSEC One-Time Password Algorithm</title>

    <author initials="M." surname="Vieuille" fullname="Marc Vieuille">
      <organization></organization>
      <address>
        <email>marc.vieuille@polytechnique.org</email>
      </address>
    </author>

    <date year="2025" month="May" day="28"/>

    
    <workgroup>Individual Submission</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 28?>

<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 44?>

<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>

<t><list style="numbers" type="1">
  <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>
  <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>
</list></t>

<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>

<t><list style="symbols">
  <t><spanx style="verb">||</spanx>: Denotes byte string concatenation.</t>
  <t><spanx style="verb">byte(v)</spanx>: Converts an integer or single-character input <spanx style="verb">v</spanx> to a one-byte string.</t>
  <t><spanx style="verb">size(bs)</spanx>: Returns the length of byte string <spanx style="verb">bs</spanx>, as an integer.</t>
  <t><spanx style="verb">BE8(v)</spanx>: Returns the 8-byte big-endian encoding of unsigned integer <spanx style="verb">v</spanx>.</t>
  <t><spanx style="verb">U64(bs)</spanx>: Converts an 8-byte string <spanx style="verb">bs</spanx> into an unsigned 64-bit integer, using
big-endian interpretation.</t>
  <t><spanx style="verb">TLV(tag, bs)</spanx>: Constructs a Tag-Length-Value encoding. Returns <spanx style="verb">byte(tag) || byte(size(bs)) || bs</spanx> where:  <list style="symbols">
      <t><spanx style="verb">tag</spanx>: An integer identifier in the range 0–255</t>
      <t><spanx style="verb">bs</spanx>: A byte string with length ≤ 255 bytes</t>
    </list></t>
</list></t>

</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>

<t><list style="symbols">
  <t>A secure hash function,</t>
  <t>An elliptic-curve Diffie-Hellman (ECDH) function,</t>
  <t>A key exchange pattern defining key contributions from the parties,</t>
  <t>Code output parameters specifying how the OTP/OTK values are formatted.</t>
</list></t>

<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><spanx style="verb">HKDF(salt, ikm, info, L) → byte[L]</spanx> Function</name>

<t>This function follows the specification in <xref target="RFC5869"/>.</t>

<t><list style="symbols">
  <t><spanx style="verb">salt</spanx>, <spanx style="verb">ikm</spanx>, and <spanx style="verb">info</spanx> are arbitrary-length byte strings.</t>
  <t><spanx style="verb">L</spanx> is a positive integer indicating the desired output length in bytes.</t>
  <t>The function returns a byte string of length <spanx style="verb">L</spanx>.</t>
</list></t>

</section>
</section>
<section anchor="ECDH"><name><spanx style="verb">ECDH(privKey, PubKey) → byte[DHLEN]</spanx> 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 <spanx style="verb">DHLEN</spanx>.</t>

<t><list style="symbols">
  <t><spanx style="verb">privKey</spanx>: A private key from an elliptic curve key pair.</t>
  <t><spanx style="verb">PubKey</spanx>: A public key from the same elliptic curve group.</t>
</list></t>

<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 <spanx style="verb">DHLEN</spanx>. 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>

<t><list style="symbols">
  <t>Initiator contributes: 1 ephemeral key.</t>
  <t>Responder contributes: 1 static key.</t>
</list></t>

</section>
<section anchor="E1S2"><name>E1S2 Pattern</name>

<t><list style="symbols">
  <t>Initiator contributes: 1 ephemeral key and 1 static key.</t>
  <t>Responder contributes: 1 static key.</t>
</list></t>

</section>
<section anchor="E2S2"><name>E2S2 Pattern</name>

<t><list style="symbols">
  <t>Initiator contributes: 1 ephemeral key and 1 static key.</t>
  <t>Responder contributes: 1 ephemeral key and 1 static key.</t>
</list></t>

</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 <spanx style="verb">E1S1</spanx>. Patterns such as <spanx style="verb">E1S2</spanx> or <spanx style="verb">E2S2</spanx> 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 <spanx style="verb">E1S2</spanx> or <spanx style="verb">E2S2</spanx> 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 <spanx style="verb">T</spanx>, <spanx style="verb">B</spanx>, and <spanx style="verb">P</spanx>.</t>

<section anchor="T"><name>T – Time Window</name>

<t><spanx style="verb">T</spanx> defines the duration of a validity window for each generated code, expressed in
seconds. <spanx style="verb">T</spanx> MUST be a positive integer greater than parameter <spanx style="verb">B</spanx>.</t>

</section>
<section anchor="B"><name>B – Encoding Base</name>

<t><spanx style="verb">B</spanx> specifies the base used for code encoding. Valid values are:</t>

<t><list style="symbols">
  <t><spanx style="verb">10</spanx>, <spanx style="verb">16</spanx>, or <spanx style="verb">32</spanx>: Encodes the output using a human-readable digit set, suitable for OTP.</t>
  <t><spanx style="verb">256</spanx>: Encodes the output in binary form, suitable for OTK.</t>
</list></t>

</section>
<section anchor="P"><name>P – Code Size</name>

<t><spanx style="verb">P</spanx> defines the number of digits in the generated code, where each digit is an integer
in the range <spanx style="verb">[0..B)</spanx>. 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>

<texttable title="Code limits" anchor="code-limits">
      <ttcol align='left'>Base</ttcol>
      <ttcol align='left'>min P</ttcol>
      <ttcol align='left'>max P</ttcol>
      <ttcol align='left'>min Entropy</ttcol>
      <ttcol align='left'>max Entropy</ttcol>
      <c>10</c>
      <c>8</c>
      <c>15</c>
      <c>23 bits</c>
      <c>46 bits</c>
      <c>16</c>
      <c>7</c>
      <c>17</c>
      <c>24 bits</c>
      <c>64 bits</c>
      <c>32</c>
      <c>6</c>
      <c>13</c>
      <c>25 bits</c>
      <c>60 bits</c>
      <c>256</c>
      <c>4</c>
      <c>65</c>
      <c>24 bits</c>
      <c>512 bits</c>
</texttable>

</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><spanx style="verb">Kerpass_&lt;Hash&gt;_&lt;ECDH&gt;_&lt;Pattern&gt;_T&lt;T&gt;B&lt;B&gt;P&lt;P&gt;</spanx></t>

<t>For example:</t>

<t><spanx style="verb">Kerpass_SHA512_X25519_E1S1_T600B32P9</spanx></t>

<t>Where:</t>

<t><list style="numbers" type="1">
  <t><spanx style="verb">&lt;Hash&gt;</spanx> corresponds to the hash function used (see <xref target="Hash"/>), e.g., <spanx style="verb">SHA512</spanx>.</t>
  <t><spanx style="verb">&lt;ECDH&gt;</spanx> denotes the ECDH function used (see <xref target="ECDH"/>), e.g., <spanx style="verb">X25519</spanx>.</t>
  <t><spanx style="verb">&lt;Pattern&gt;</spanx> specifies the key exchange pattern (see <xref target="pattern"/>), e.g., <spanx style="verb">E1S1</spanx>.</t>
  <t><spanx style="verb">T&lt;T&gt;B&lt;B&gt;P&lt;P&gt;</spanx> encodes the code output parameters (see <xref target="code"/>), with <spanx style="verb">&lt;T&gt;</spanx>, <spanx style="verb">&lt;B&gt;</spanx>,
and <spanx style="verb">&lt;P&gt;</spanx> replaced by their respective values.</t>
</list></t>

</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>

<t><list style="symbols">
  <t>The Responder registers a static ECDH public key with the Initiator, corresponding to
a key pair it controls.</t>
  <t>Both parties derive and retain a shared secret (PSK) that will be used in subsequent
EPHEMSEC operations.</t>
</list></t>

<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>

<t><list style="symbols">
  <t>The two parties have agreed on an EPHEMSEC instantiation (see <xref target="instantation"/>).</t>
  <t>The Responder has registered an account with the Initiator, including a shared <spanx style="verb">PSK</spanx> and
necessary public key material (see <xref target="credentials"/>).</t>
</list></t>

<t>The protocol operates as a Challenge/Response exchange. The Initiator sends a message to
the Responder containing:</t>

<t><list style="symbols">
  <t>A <spanx style="verb">CONTEXT</spanx> byte string (e.g., relying party information),</t>
  <t>A freshly generated <spanx style="verb">INONCE</spanx>,</t>
  <t>Its Diffie-Hellman public key(s) as required by the selected key exchange pattern.</t>
</list></t>

<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>

<t><list style="numbers" type="1">
  <t><strong>Obtain nonces</strong> (see <xref target="nonces"/>):
  <list style="symbols">
      <t>Read or receive <spanx style="verb">INONCE</spanx> from the Initiator,</t>
      <t>Generate <spanx style="verb">PTIME</spanx> and extract <spanx style="verb">SYNCHINT</spanx>.</t>
    </list></t>
  <t><strong>Compute the Diffie-Hellman shared secret <spanx style="verb">Z</spanx></strong> (see <xref target="Z"/>):<br />
Based on the agreed key exchange pattern and available keys.</t>
  <t><strong>Derive the intermediary secret <spanx style="verb">ISK</spanx></strong> (see <xref target="ISK"/>):<br />
Using HKDF with <spanx style="verb">Z</spanx>, <spanx style="verb">PSK</spanx>, <spanx style="verb">CONTEXT</spanx>, <spanx style="verb">SCHEME</spanx>, <spanx style="verb">INONCE</spanx>, and <spanx style="verb">PTIME</spanx>.</t>
  <t><strong>Generate the OTP or OTK</strong> (see <xref target="OTP"/>):
  <list style="symbols">
      <t>The format is determined by the encoding base <spanx style="verb">B</spanx>,</t>
      <t>The last digit or byte encodes <spanx style="verb">SYNCHINT</spanx>.</t>
    </list></t>
</list></t>

<t>The Responder returns the resulting code to the Initiator.</t>

<t>The Initiator, upon receiving the response, uses the included <spanx style="verb">SYNCHINT</spanx> to reconstruct
<spanx style="verb">PTIME</spanx> 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>

<t><list style="symbols">
  <t>The <strong>Initiator</strong> provides a nonce called <spanx style="verb">INONCE</spanx>, which ensures session uniqueness
from the Initiator's side.</t>
  <t>The <strong>Responder</strong> provides a time-based nonce called <spanx style="verb">PTIME</spanx>, which captures the
Responder’s local clock state.</t>
</list></t>

<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 <spanx style="verb">INONCE</spanx> 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><spanx style="verb">INONCE</spanx> 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 <spanx style="verb">INONCE</spanx> 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, <spanx style="verb">PTIME</spanx>, from current time reading.
This <spanx style="verb">PTIME</spanx> 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>, <spanx style="verb">SYNCHINT</spanx>, in the last digit of the
generated OTP or OTK.</t>

<t>Given <spanx style="verb">SYNCHINT</spanx>, the Initiator can recover the original <spanx style="verb">PTIME</spanx> 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>

<t><list style="symbols">
  <t><spanx style="verb">time</spanx>: Current Unix timestamp (seconds since 1970-01-01).</t>
  <t><spanx style="verb">T</spanx>: Code validity window (see <xref target="T"/>).</t>
  <t><spanx style="verb">B</spanx>: Encoding base (see <xref target="B"/>).</t>
</list></t>

</section>
<section anchor="responder-function-ptimetime-ptime-synchint"><name>Responder Function – <spanx style="verb">PTime(time) → (PTIME, SYNCHINT)</spanx></name>

<t>This function is executed by the Responder to compute the <spanx style="verb">PTIME</spanx> nonce and the
associated synchronization hint:</t>

<figure><sourcecode type="pseudo"><![CDATA[
step = T / (B - 1) # floating point division
PTIME = round(time / step) 
SYNCHINT = PTIME % B
return PTIME, SYNCHINT
]]></sourcecode></figure>

</section>
<section anchor="initiator-function-syncptimetime-synchint-ptime"><name>Initiator Function – <spanx style="verb">SyncPTime(time, SYNCHINT) → PTIME</spanx></name>

<t>This function is executed by the Initiator to reconstruct the Responder’s PTIME using
its local time and the received SYNCHINT:</t>

<figure><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></figure>

<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 <spanx style="verb">Z</spanx> 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 <spanx style="verb">Z</spanx>, 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>

<t><list style="symbols">
  <t><spanx style="verb">ei</spanx> Initiator ephemeral Keypair</t>
  <t><spanx style="verb">Sr</spanx> Responder static PublicKey</t>
</list></t>

<t><spanx style="verb">Z = ECDH(ei, Sr)</spanx></t>

</section>
<section anchor="responder-e1s1-z-derivation"><name>Responder E1S1 Z Derivation</name>

<t>Inputs:
- <spanx style="verb">sr</spanx> Responder static Keypair
- <spanx style="verb">Ei</spanx> Initiator ephemeral PublicKey</t>

<t><spanx style="verb">Z = ECDH(sr, Ei)</spanx></t>

</section>
<section anchor="initiator-e1s2-z-derivation"><name>Initiator E1S2 Z Derivation</name>

<t>Inputs:</t>

<t><list style="symbols">
  <t><spanx style="verb">ei</spanx> Initiator ephemeral Keypair</t>
  <t><spanx style="verb">si</spanx> Initiator static Keypair</t>
  <t><spanx style="verb">Sr</spanx> Responder static PublicKey</t>
</list></t>

<t><spanx style="verb">Z = ECDH(ei, Sr) || ECDH(si, Sr)</spanx></t>

</section>
<section anchor="responder-e1s2-z-derivation"><name>Responder E1S2 Z Derivation</name>

<t>Inputs:</t>

<t><list style="symbols">
  <t><spanx style="verb">sr</spanx> Responder static Keypair</t>
  <t><spanx style="verb">Ei</spanx> Initiator ephemeral PublicKey</t>
  <t><spanx style="verb">Si</spanx> Initiator static PublicKey</t>
</list></t>

<t><spanx style="verb">Z = ECDH(sr, Ei) || ECDH(sr, Si)</spanx></t>

</section>
<section anchor="initiator-e2s2-z-derivation"><name>Initiator E2S2 Z Derivation</name>

<t>Inputs:</t>

<t><list style="symbols">
  <t><spanx style="verb">ei</spanx> Initiator ephemeral Keypair</t>
  <t><spanx style="verb">si</spanx> Initiator static Keypair</t>
  <t><spanx style="verb">Er</spanx> Responder ephemeral PublicKey</t>
  <t><spanx style="verb">Sr</spanx> Responder static PublicKey</t>
</list></t>

<t><spanx style="verb">Z = ECDH(ei, Er) || ECDH(si, Sr)</spanx></t>

</section>
<section anchor="responder-e2s2-z-derivation"><name>Responder E2S2 Z Derivation</name>

<t>Inputs:</t>

<t><list style="symbols">
  <t><spanx style="verb">er</spanx> Responder ephemeral Keypair</t>
  <t><spanx style="verb">sr</spanx> Responder static Keypair</t>
  <t><spanx style="verb">Ei</spanx> Initiator ephemeral PublicKey</t>
  <t><spanx style="verb">Si</spanx> Initiator static PublicKey</t>
</list></t>

<t><spanx style="verb">Z = ECDH(er, Ei) || ECDH(sr, Si)</spanx></t>

</section>
</section>
<section anchor="ISK"><name>10. ISK – Intermediary Secret Derivation</name>

<t>EPHEMSEC derives an intermediary secret key <spanx style="verb">ISK</spanx> 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>

<t><list style="symbols">
  <t><spanx style="verb">CONTEXT</spanx>: An implementation-specific byte string (≤ 64 bytes), used to encode
contextual information (e.g., login page url).</t>
  <t><spanx style="verb">SCHEME</spanx>: A byte string representing the EPHEMSEC instantiation (see <xref target="SCHEME"/>).</t>
  <t><spanx style="verb">B</spanx>: Code encoding base (see <xref target="B"/>).</t>
  <t><spanx style="verb">P</spanx>: Code size (see <xref target="P"/>).</t>
  <t><spanx style="verb">INONCE</spanx>: An Initiator-generated nonce, a byte string between 16 and 64 bytes (see
see <xref target="INONCE"/>).</t>
  <t><spanx style="verb">PTIME</spanx>: Responder-contributed time nonce (see <xref target="PTIME"/>).</t>
  <t><spanx style="verb">PSK</spanx>: A shared pre-established secret (≥ 32 bytes) (see <xref target="PSK"/>).</t>
  <t><spanx style="verb">Z</spanx>: Diffie-Hellman shared secret derived from the selected key exchange pattern (see
see <xref target="Z"/>).</t>
</list></t>

</section>
<section anchor="hkdf-use"><name>10.2 ISK Derivation</name>

<t>The <spanx style="verb">ISK</spanx> is derived using the following steps:</t>

<figure><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></figure>

</section>
</section>
<section anchor="OTP"><name>OTP/OTK Derivation</name>

<t>The intermediate secret key <spanx style="verb">ISK</spanx> 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 <spanx style="verb">B</spanx> (see <xref target="B"/>).</t>

<section anchor="inputs-1"><name>Inputs</name>

<t><list style="symbols">
  <t><spanx style="verb">B</spanx>: Code encoding base (see <xref target="B"/>).</t>
  <t><spanx style="verb">P</spanx>: Code size (see <xref target="P"/>).</t>
  <t><spanx style="verb">PTIME</spanx>: Responder-contributed time nonce (see <xref target="PTIME"/>).</t>
  <t><spanx style="verb">ISK</spanx>: Intermediate secret key (see <xref target="ISK"/>).</t>
</list></t>

</section>
<section anchor="otp-derivation-b-10-16-32"><name>OTP Derivation (<spanx style="verb">B ∈ {10, 16, 32}</spanx>)</name>

<t>When <spanx style="verb">B</spanx> is 10, 16, or 32, the code is formatted as an <spanx style="verb">OTP</spanx> composed of <spanx style="verb">P</spanx> digits. The
first <spanx style="verb">P - 1</spanx> digits are derived from <spanx style="verb">ISK</spanx>, and the last digit is a synchronization
hint (<spanx style="verb">SYNCHINT</spanx>) derived from <spanx style="verb">PTIME</spanx>.</t>

<t><spanx style="verb">ISK</spanx> MUST be exactly 8 bytes long and is interpreted as an unsigned 64-bit integer.</t>

<figure><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></figure>

<t><strong>Note</strong>: The result is returned as a sequence of <spanx style="verb">P</spanx> integer digits in base <spanx style="verb">B</spanx>.
Conversion to a human-readable representation (e.g., alphanumeric alphabet) is outside
the scope of this specification.</t>

</section>
<section anchor="otk-derivation-b-256"><name>OTK Derivation (<spanx style="verb">B = 256</spanx>)</name>

<t>When <spanx style="verb">B</spanx> is 256, the output is an opaque binary key. The first <spanx style="verb">P - 1</spanx> bytes are taken
directly from <spanx style="verb">ISK</spanx>, and the last byte encodes the synchronization hint.</t>

<figure><sourcecode type="pseudo"><![CDATA[
SYNCHINT = byte(PTIME % 256)
OTK = ISK || SYNCHINT

return OTK  # byte string of length P
]]></sourcecode></figure>

</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>

<t><list style="symbols">
  <t>Password-Authenticated Key Exchange (PAKE)</t>
  <t>TLS with Pre-Shared Key authentication (TLS-PSK)</t>
</list></t>

<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 <spanx style="verb">PTIME</spanx> (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>

<t><list style="numbers" type="1">
  <t><strong>Client Preparation</strong>:
  <list style="symbols">
      <t>Append the synchronization digit to the account identifier.</t>
      <t>Use this composite identifier to initiate the key exchange protocol.</t>
    </list></t>
  <t><strong>Server Operation</strong>:
  <list style="symbols">
      <t>Extract the synchronization digit from the received identifier.</t>
      <t>Remove the synchronization digit to recover the base account identifier.</t>
      <t>Load the corresponding client credentials using the base identifier.</t>
      <t>Execute the EPHEMSEC algorithm with the received session parameters, credentials,
and synchronization hint to derive the shared secret.</t>
      <t>Proceed with the key exchange protocol using the derived secret.</t>
    </list></t>
</list></t>

</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>

<t><list style="symbols" anchor="network-observer">
  <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>
</list></t>

<t><list style="symbols" anchor="credential-leak">
  <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>
</list></t>

</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>

<t><list style="numbers" type="1">
  <t><strong>Unpredictability of the Shared Secret (<spanx style="verb">Z</spanx>)</strong><br />
The ECDH-derived shared secret <spanx style="verb">Z</spanx> 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>
  <t><strong>Unpredictability of the HKDF Input (<spanx style="verb">ikm</spanx>)</strong><br />
The HKDF input key material (<spanx style="verb">ikm = Z || PSK</spanx>) inherits the unpredictability of <spanx style="verb">Z</spanx>.
Even if the attacker knows the pre-shared key (PSK), the presence of the fresh and
secret <spanx style="verb">Z</spanx> value ensures <spanx style="verb">ikm</spanx> remains secure.</t>
  <t><strong>Security of the Derived Secret (<spanx style="verb">ISK</spanx>)</strong><br />
HKDF acts as a cryptographically strong pseudorandom function (PRF), meaning its
outputs — including the intermediary secret <spanx style="verb">ISK</spanx> — are indistinguishable from
random, provided the HKDF <spanx style="verb">ikm</spanx> secret input is unpredictable. Because each execution
of EPHEMSEC uses unique nonces and ephemeral keys, the <spanx style="verb">ISK</spanx> value changes with every
session.</t>
  <t><strong>Output Derivation (OTP/OTK)</strong>
  <list style="symbols">
      <t>For OTKs (<spanx style="verb">B = 256</spanx>): <spanx style="verb">ISK</spanx> is directly used, preserving its pseudorandomness.</t>
      <t>For OTPs (<spanx style="verb">B ∈ {10, 16, 32}</spanx>): <spanx style="verb">ISK</spanx> is converted to digits via modular arithmetic.
This process introduces bias when <spanx style="verb">B = 10</spanx>, but the bias is mitigated by
restricting code sizes (<spanx style="verb">P</spanx>) to the ranges specified in <xref target="code-limits"/> (see
<xref target="otp-bias"/> for analysis).</t>
    </list></t>
  <t><strong>Prevention of Replay and Forward Prediction</strong><br />
The use of unique nonces (<spanx style="verb">INONCE</spanx>, <spanx style="verb">PTIME</spanx>) 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>
</list></t>

<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 <spanx style="verb">CONTEXT</spanx> input (see
<xref target="hkdf-inputs"/>). This mechanism enables:</t>

<t><list style="numbers" type="1">
  <t><strong>Phishing Resistance</strong>:
  <list style="symbols">
      <t>By embedding the login page URL in <spanx style="verb">CONTEXT</spanx>, the derived OTP/OTK becomes
domain-specific.</t>
      <t>An attacker hosting a fake page cannot reuse intercepted codes, as their context
will differ.</t>
    </list></t>
  <t><strong>MITM Resistance</strong>:
  <list style="symbols">
      <t>Including the server's TLS certificate hash in <spanx style="verb">CONTEXT</spanx> ensures the OTP/OTK is
tied to the authenticated connection.</t>
      <t>A MITM with an invalid certificate cannot generate valid codes.</t>
    </list></t>
</list></t>

<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>

<t><list style="symbols">
  <t>Reliably acquire authentication context (e.g., page URL, certificate)</t>
  <t>Securely inject it into EPHEMSEC's <spanx style="verb">CONTEXT</spanx> parameter</t>
  <t>Resist spoofing or coercion by attackers</t>
</list></t>

</section>
</section>
<section anchor="mutual-authentication"><name>Mutual Authentication</name>

<t>Because the EPHEMSEC Initiator and Responder share a <spanx style="verb">PSK</spanx> (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 <spanx style="verb">E1S1</spanx> 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 <spanx style="verb">PSK</spanx>. If the <spanx style="verb">PSK</spanx> 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
<spanx style="verb">E1S2</spanx> or <spanx style="verb">E2S2</spanx> 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 <spanx style="verb">T/2</spanx> 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 <spanx style="verb">PTIME</spanx> derivation to support event-based counters
alongside time-based synchronization. Setting <spanx style="verb">T = 0</spanx> will enable event-synchronized
OTP/OTK generation using shared counters, while <spanx style="verb">T &gt; 0</spanx> 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 title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



<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 title='Informative References' anchor="sec-informative-references">



<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="PASSKEY" target="https://passkeys.dev/docs/reference/specs/">
  <front>
    <title>passkeys-Specifications</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>

</references>


<?line 811?>

<section anchor="otp-bias"><name>OTP Sampling Bias</name>

<t>EPHEMSEC generates <spanx style="verb">P</spanx> (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 <spanx style="verb">B</spanx> (see <xref target="B"/>) does not evenly divide 2^64, which
occurs for all bases except <spanx style="verb">B</spanx> = 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 <spanx style="verb">P</spanx> 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><spanx style="verb">bias = 1 / floor(2^64 / 10^14) ≈ 5.4e-6</spanx></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><spanx style="verb">bias = 1 / floor(2^31 / 10^6) ≈ 0.5e-3</spanx></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 <spanx style="verb">m</spanx> and <spanx style="verb">M</spanx> where <spanx style="verb">m</spanx> ≤ <spanx style="verb">M</spanx> and <spanx style="verb">m</spanx> &gt; 0, when sampling uniformly from <spanx style="verb">[0, M)</spanx> 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>

<t><list style="symbols">
  <t><spanx style="verb">bias = 0 when M % m = 0</spanx></t>
  <t><spanx style="verb">bias = 1/floor(M/m) when M % m ≠ 0</spanx></t>
</list></t>

<t>The <spanx style="verb">bias</spanx> value varies in <spanx style="verb">[0,1]</spanx> and indicates the relative overrepresentation of certain
remainders. When <spanx style="verb">bias = 0</spanx>, distribution is uniform.</t>

<section anchor="derivation"><name>Derivation</name>

<t>Let <spanx style="verb">X</spanx> be a uniformly distributed random variable that generates integers in the range <spanx style="verb">[0,M)</spanx>.
Let <spanx style="verb">R = X % m</spanx>, where <spanx style="verb">R</spanx> is a random variable that maps <spanx style="verb">X</spanx> to the remainder of the
division by <spanx style="verb">m</spanx>.</t>

<t>We want to determine the probability distribution of <spanx style="verb">R</spanx> and quantify any bias that arises.</t>

<t>Since <spanx style="verb">X</spanx> is uniformly distributed, the probability of <spanx style="verb">X</spanx> taking any specific value <spanx style="verb">v</spanx>
in <spanx style="verb">[0, M)</spanx> is <spanx style="verb">1/M</spanx>.</t>

<t>Using the results from Lemma 1 below, we can determine the probability distribution of
<spanx style="verb">R</spanx>.</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 <spanx style="verb">r</spanx> in <spanx style="verb">[0, m)</spanx> occurs exactly <spanx style="verb">M/m</spanx> times among the values
<spanx style="verb">[0, M)</spanx>.<br />
Therefore, <spanx style="verb">R</spanx> is uniformly distributed with:</t>

<t><spanx style="verb">p(r) = (M/m) × (1/M) = 1/m for all r in [0, m)</spanx></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>

<t><list style="symbols">
  <t>Remainders <spanx style="verb">r</spanx> in <spanx style="verb">[0, s)</spanx> occur <spanx style="verb">floor(M/m) + 1</spanx> times each</t>
  <t>Remainders <spanx style="verb">r</spanx> in <spanx style="verb">[s, m)</spanx> occur <spanx style="verb">floor(M/m)</spanx> times each</t>
</list></t>

<t>This leads to a non-uniform distribution:</t>

<t><list style="symbols">
  <t><spanx style="verb">p(r) = p1 = (floor(M/m) + 1)/M for r in [0, s)</spanx></t>
  <t><spanx style="verb">p(r) = p2 = floor(M/m)/M for r in [s, m)</spanx></t>
</list></t>

</section>
<section anchor="bias-quantification"><name>Bias Quantification</name>

<t>The bias arises because <spanx style="verb">p1</spanx> &gt; <spanx style="verb">p2</spanx>. We can express this relationship as:</t>

<figure><artwork><![CDATA[
p1 = p2 × (1 + 1/floor(M/m)) = p2 × (1 + bias)

where:
bias = 1/floor(M/m)
]]></artwork></figure>

<t>This bias factor measures the non-uniformity of the distribution:</t>

<t><list style="symbols">
  <t><spanx style="verb">bias</spanx> = 0 when <spanx style="verb">M</spanx> is divisible by m (uniform case)</t>
  <t><spanx style="verb">bias</spanx> ∈ (0, 1] when <spanx style="verb">M</spanx> is not divisible by <spanx style="verb">m</spanx>, with larger values indicating greater non-uniformity</t>
  <t>The bias is maximized when <spanx style="verb">floor(M/m) = 1</spanx>, giving <spanx style="verb">bias</spanx> = 1</t>
</list></t>

</section>
</section>
<section anchor="lemma-1-distribution-of-remainders-in-0-m"><name>Lemma 1: Distribution of Remainders in [0, M)</name>

<t>Let <spanx style="verb">m</spanx> and <spanx style="verb">M</spanx> be integers where <spanx style="verb">m</spanx> ≤ <spanx style="verb">M</spanx> and <spanx style="verb">m</spanx> &gt; 0.</t>

<t>For any integer <spanx style="verb">r</spanx> in <spanx style="verb">[0, m)</spanx>, the number of integers <spanx style="verb">v</spanx> in <spanx style="verb">[0, M)</spanx> that satisfy
<spanx style="verb">v</spanx> % <spanx style="verb">m</spanx> = <spanx style="verb">r</spanx> is:</t>

<t><list style="numbers" type="1">
  <t>When <spanx style="verb">M</spanx> is divisible by <spanx style="verb">m</spanx> (<spanx style="verb">M</spanx> % <spanx style="verb">m</spanx> = 0):
  <list style="symbols">
      <t>Exactly <spanx style="verb">M/m</spanx> values for every <spanx style="verb">r</spanx> in <spanx style="verb">[0, m)</spanx></t>
    </list></t>
  <t>When <spanx style="verb">M</spanx> is not divisible by <spanx style="verb">m</spanx> (<spanx style="verb">M</spanx> % <spanx style="verb">m</spanx> = <spanx style="verb">s</spanx> where 0 &lt; <spanx style="verb">s</spanx> &lt; <spanx style="verb">m</spanx>):
  <list style="symbols">
      <t><spanx style="verb">floor(M/m) + 1</spanx> values for <spanx style="verb">r</spanx> in <spanx style="verb">[0, s)</spanx></t>
      <t><spanx style="verb">floor(M/m)</spanx> values for <spanx style="verb">r</spanx> in <spanx style="verb">[s, m)</spanx></t>
    </list></t>
</list></t>

<section anchor="proof"><name>Proof:</name>

<figure><artwork><![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
]]></artwork></figure>

</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>

<t><list style="numbers" type="1">
  <t>The HKDF domain separation feature enabled by the HKDF <spanx style="verb">salt</spanx> parameter (see
<xref target="hkdf-use"/>) provides the necessary context binding used for phishing protection.</t>
  <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>
</list></t>

</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 <spanx style="verb">E1S1</spanx> pattern (see <xref target="E1S1"/>) alone cannot guarantee.</t>

<t>The incremental cost of mixing the <spanx style="verb">PSK</spanx> (see <xref target="PSK"/>) into the HKDF <spanx style="verb">ikm</spanx> input (see
<xref target="hkdf-use"/>) is expected to be low, and the <spanx style="verb">PSK</spanx> improves the secrecy of <spanx style="verb">ikm</spanx>.
Therefore, it is always used even when the pattern (e.g., <spanx style="verb">E1S2</spanx>; 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>During development, it was considered whether the Initiator nonce could serve dual
purposes with the ephemeral public key contributed by the Initiator. However, after
recognizing that all practical authentication server designs supporting EPHEMSEC require
maintaining unique session identifiers, no attempt was made to evaluate whether removing
the Initiator nonce could provide benefits.</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 <spanx style="verb">SYNCHINT</spanx> is used to "compress" the
Responder nonce <spanx style="verb">PTIME</spanx> (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 <spanx style="verb">PTIME</spanx> could potentially be
transmitted in uncompressed form.</t>

<t>However, explicit support for uncompressed transmission was not included for two
reasons:</t>

<t><list style="numbers" type="1">
  <t>The computational cost of running the synchronization algorithm to recover <spanx style="verb">PTIME</spanx>
from <spanx style="verb">SYNCHINT</spanx> is very low.</t>
  <t>Having the server rely on <spanx style="verb">SYNCHINT</spanx> to reconstruct <spanx style="verb">PTIME</spanx> limits the Responder's
ability to reuse its own nonces, which provides additional security benefits.</t>
</list></t>

</section>
</section>
</section>


  </back>

<!-- ##markdown-source:
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

-->

</rfc>

