<?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-01" 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="30"/>

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

    <abstract>


<?line 31?>

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

<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:</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>
</list></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="KerPass" target="https://github.com/amvtek/KerPass">
  <front>
    <title>KerPass open source project</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</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 815?>

<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><sourcecode type="pseudo"><![CDATA[
p1 = p2 × (1 + 1/floor(M/m)) = p2 × (1 + bias)

where:
bias = 1/floor(M/m)
]]></sourcecode></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><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></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>
<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>

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

</section>
<section anchor="kerpasssha512x25519e1s2t600b16p8-vector"><name>Kerpass_SHA512_X25519_E1S2_T600B16P8 vector</name>

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

</section>
<section anchor="kerpasssha512x25519e2s2t600b32p9-vector"><name>Kerpass_SHA512_X25519_E2S2_T600B32P9 vector</name>

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

</section>
<section anchor="kerpasssha512x25519e1s2t1024b256p33-vector"><name>Kerpass_SHA512_X25519_E1S2_T1024B256P33 vector</name>

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

</section>
</section>


  </back>

<!-- ##markdown-source:
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
hJThvctW+I9ogbnPU8StsB/0W9COMlmzEO6A0oLcE1I6FAPYekghaTFX78Ij
2CTQviDIrtJ4gFniRf5IXnrhMIBh1W0vwOz8SAyc88unL84wSiAS2ZqvDBXW
R6eHw6+bj1rELeNbP19QuIADFvOAnV3tzwETDs68GCZz5yJbO24O9W9dGS29
KNryEWfxB5wau3ZW6b6pGuzR6da/NLoZJCJWli/3nJFlLZWgGe7V6plQZvS2
CdY2Y5aaq2o/MKl5iYiV1QuFrX9MaNW4mqJT1iZWICQcGEmj/VAnRZg893PZ
nkgkkbGOMZKIOA3+jnxPHZCrmfts/IpWarXKYUySXLD6lldvY9keZJzlauTb
Wkmw1rNzLdZJ92KDFJpl6ZVk1aoGWDnuE1Ys77BUigZlWDbpxrtwFdhR4TBG
+HIlZCxKk4xScabvvPj64vJOR/4NX77iv1+f/frrp6/PHtPfF08ePH9u/wj0
ExdPXn39/LH7y7356NWLF2cvH8vL+DZsfBXcefHg7+8ISu+8Amu/evng+R0O
wTQ4WAJztGdW+GvgmjVE0/R8+Oj83/41GkBI/AcY/HEUTWH4yodJNB7gA/Tt
UmZj1SofSfMEwJlKxBiczymSQcqOI09k8UO/kz49DT7/1ZxMye7oV18GBNSv
tstMxwgwqA/VkrMhEk6BEbOU4I/G9lKMUyjxwg4gYSxIvu0Vh9qZp/30FLDY
DWfffTe7Hz5WGIuM31vo+3pTSax9SWpv6T1LPx/dHOOFR6slhMOGFTZLb0xN
IgYvzlUXvEvCic1PssNnNzMCd8JmgDeHjEqm51Fa07CvFUSzdpXJxwTpgu78
Vc3SesZQdBPLKA/PJrI0f4yJzJaWV124CCXegRG3Mm7UdknGB+NadoB1ymBf
jwZ6Rf5GJ932SiRdwi6aHmo06KblxozY0UGb0F+CJTkPspfPf3ME2wUq08yK
WbYZzRteJlfd5wyM7m84eWL2cGr3KpjBAMfhd98xvI4MVOUbLJVtQ0lbYkI8
i3keOOyVLLih1SphF8P3ve//8l/j4dC8h5HwWgMlLGE0tr7/638P8TT/XhNB
WxnzejWnb+xnMUautpDRJNjhaVX0BKWkSygQknt/48IRJHHuej/RaOH7u6X5
4oNmERqDzB1OKJMfAc0siAGeTKCrpf9kbDuVGdtFPj5l7IMS+7QBhXMwxkIB
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
VXpZykLZZUo88tTv/J0pdJ1x2dpMpM47LgWDTfz3Lx89efrycianik5OHrmV
7lThN5T27JuZW+o3bpUPTQ0Xx8mEOfcawSwK7LFDPtwckC19cvLYnQPlHMlC
5SWfrtMzPwWTubnxyc3+NYt1znSK8fsNmb7ElR1H4uQLsE9FfxlC1XEghhEW
MqCFWNjpsJPGm5sb3/n48eJXe1M3zQAAR5+8N+dkGEjIAfMwGxqbv4Gntj3n
aleaR4h31XRLe3akAN4nch6DZUvHnJuwCf7cW4bURmSm5iTwiQtehUo2LnHn
pZstQ9jANXZKcc7d1bPmekksED6g8y11qXOjmi3adQ+68lWv+u3Klq5qvmpU
RZZLMeMheqm8+daU7gdGtZgqW6t3Tk4s2IB+rwyRR6fTK3Nf7Gm9L2HY2i2O
GxjQSTKgfZdpP6NaO9q6mdOiuTmnd662Ob1gwcyuD8OJMRe27C05KpPhnzds
XSh7Tk7Di4s5STZ7wJLiLOt77+NOD9vaAg4ajKptO4YTx+2c1hJsv78rP35o
23q+BSvbtvJPn7iwKR6zQH0ac25qZ8TyDExAet/6m4uVEgs5gJ5wbVXdMGi6
9gSllK3RuWAJvTtU06yqQavqHTxDrWfsHlwAeH9i2dhT0ahVBwILyrwrk5IM
CnjGamurx/fVGlvXhKoiU+JAKXvnWs4DJwbMKQeBCeUnzAbK2voPfCJ9h7wN
VjzXqvYOzal23TsZBbCPhWKYtJlg3OscpjdUI1XZsjhXQuYSv4xzrgSp1TZf
yaEP3kXHMQ4v2p6mpCcojs11h0wJVs4ZWtibQjFsmchhTOvMtjkk8MKvDara
GerUZBfNQbq5SCnX52AH0p54drJYoMi7DrRRYrWT3UmHimHW5UYZ8fBGvd05
5GR80vDSnuBkI6nTsjS9nhMnJ/v6R5ycdDzF0jH+j68NhToO5DelPtofoQkK
KsUmWNxwBoU0DgalUI3FJQlDsuJrvd+8KotNUFEnGihWwk7JnoBa61A8Hd+v
dfLhKUtEk7uyzosLypHJuVtY67wuybEQrVEVpya9r5flO6Y/iObFmoQSp4p0
d4ZoOu51exH+j52Y2SXXf+ZqJw+lhdml9nZgcdx3aSI2QvQTD41k9uMLtiCJ
uA7QwnKOaE1Su3TE4OuEBvDHs3bBEoVJWNLtobGWVWyR4RiHBYIrytlHOgDd
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
JlmZFJQPpvzG1bL8s90g11vzLejZbp5KCgw0zGufl9t3GwQmZK5DSVR/ZMus
7eELrnqhbASd4mTYLBJpy2qjqAZCFR0coaqTw6AyyX99jZYtL5CWi7WRBY00
o9CSVq6SEODeeSzS6LjBMn9b5l5zyebbhokayVpWg/A7AznXlNAxMi9+2tk9
4KvPvnjdY71bSu/I0YS6vsMS002+ey6qmaBq7OmZ3ZNmYG4pnluq9nMXUh2u
T3/JBi0gAncMzNSGsUKh71QDdho2smm7TI0qkwyk5rIq8Lti0u2MS7NlUUgL
P8lOGrvMSpevJyZtvLHxEf5Wn/awLXq18g12lG/zNjQjiavtcmnra1pYczaK
d2pJb1TSrU2MsrEP4auVaWJbCmu+qnRC/mAXYQtFc7+QT4yf1YEJI/FbXHOE
h6hiwpxoEIXlGuW6u+Cs1eRzT3hJ6anfcKIW8vaBXKfET0v/LvpZ8rjsKdqa
V319FdMAa3W+dkcTjCkcketmgub9NIaj5PqY5n0zWmG+f6+busGwgoW3NJ0U
MDuXwrjtLU0Jzo0ySzarNcJu9TagXTRkmDZonEEgTETHfIQ5rr0r4bmekaq9
a3O758cv74l65xO9Cu0y/RF0GLyH43VHwHTnfnjnU0a5QydR7mgrjl5K+v3R
dKL6/WKSZP0kUZOsn0bDeJxlvWiqhmlf9QdqOMRDk348wW/JeFikRaomRT8f
51E+zCL808unvWG/n/f7/d4wwd+jXloomW5dv6GphsNk0J+qUZyoIp/GSqXp
uBik2VgNi2gUj1QxGA6GRTKYTuNhnOeT0XCSjqLhYFxM86KnBxOD7Fsxp2jY
3qTX78W9ca+H/056PXlstVnTj1jzuBdP9JfkSXzLdE2/5ZNBHCXDZDIq4iwp
JvlgqLCIYTaK8346xI9pMk68NylEhhcHUX8QjaeTaex+khKOb6FLaWTvHatu
zW/DXh4n2I2Kol6a90aj3kClvb4ajpP+eDzqZ9NoOhhgM0DCtFf0VTGK4lRF
E5XlveGk741N+m2jWnMXEUaOgK54MB6qcZEDlgn2N5pm0WA4TfvJAFjoxdMi
6ReErGk+VqPhOO33o8k0infH39mCPEIGTQsk08nA/aQl37d0dhGP9LxfmgtO
QD2gsVGvP5n2QUt5Tw16w2wyKIoizqNxPJgUCfYU56NREk3H02E0zPNiBHIa
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
ioiiqjnQg6H6058tQ41C+T8e3c8CmbMAAA==

-->

</rfc>

