<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.17 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-thomson-ppm-prss-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title abbrev="PRSS">High Performance Pseudorandom Secret Sharing (PRSS)</title>
    <seriesInfo name="Internet-Draft" value="draft-thomson-ppm-prss-00"/>
    <author initials="M." surname="Thomson" fullname="Martin Thomson">
      <organization>Mozilla</organization>
      <address>
        <email>mt@lowentropy.net</email>
      </address>
    </author>
    <author initials="B." surname="Savage" fullname="Ben Savage">
      <organization>Meta</organization>
      <address>
        <email>btsavage@meta.com</email>
      </address>
    </author>
    <date year="2024" month="July" day="08"/>
    <area>Security</area>
    <workgroup>Privacy Preserving Measurement</workgroup>
    <keyword>prng</keyword>
    <keyword>next generation</keyword>
    <keyword>unicorn</keyword>
    <keyword>sparkling distributed ledger</keyword>
    <abstract>
      <?line 40?>

<t>Pseudorandom secret sharing (PRSS) enables the generation of a large number of
shared pseudorandom values from a single shared seed.  This is useful in
contexts where a large amount of shared randomness is needed, such as
multi-party computation (MPC).</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://private-attribution.github.io/i-d/draft-thomson-ppm-prss.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-thomson-ppm-prss/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Privacy Preserving Measurement Working Group mailing list (<eref target="mailto:ppm@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ppm/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/ppm/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/private-attribution/i-d"/>.</t>
    </note>
  </front>
  <middle>
    <?line 48?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>A number of protocols benefit from having some means by which protocol entities
agree on a random value.  This is particularly useful in multi-party computation
(MPC), such as the three-party, honest majority setting, where many protocols
rely on being able to generate large amounts of shared randomness.</t>
      <t>Pseudorandom secret sharing (PRSS) <xref target="CDI05"/>
is a means of non-interactively establishing multiple shared values from a
single shared secret.  This document describes a concrete PRSS protocol that can
efficiently produce large quantities of shared randomness.</t>
      <t>This protocol is parameterized and offers algorithm agility.  This protocol
combines a chosen key encapsulation method (KEM) and key derivation function
(KDF) to generate shared secrets.  These shared secrets form the basis of a
randomness context (<xref target="context"/>) in which a chosen lightweight pseudorandom
function (PRF) is used to generate large amounts of shared randomness.  Each
randomness context can either be used as a sequential source of randomness
<xref target="sequential"/> or as an indexed source <xref target="indexed"/>, depending on need.</t>
      <section anchor="two-party-protocol">
        <name>Two-Party Protocol</name>
        <t>This document describes a PRSS protocol for two parties.  The set of KEMs
defined only work in a two-party context.  If the goal is to create randomness
that is shared with more than one entity, group key exchange methods, such as
MLS <xref target="MLS"/>, could be adapted as a means of key agreement, retaining
the other elements of this protocol unchanged.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t anchor="participant">This document uses the term "participant" to refer to entities that execute the
protocol.</t>
      <t>Notation for KEM and KDF functions is taken from <xref target="HPKE"/>.  <tt>e =
I2OSP(n, i)</tt> and <tt>i = OS2IP(e)</tt> functions are taken from <xref target="RSA"/> and
describe encoding and decoding non-negative integers to and from a byte string,
respectively, using network byte order.  <tt>rev()</tt> reverses the order of a
sequence of bytes; <tt>concat()</tt> concatenates multiple sequences of bytes; <tt>xor()</tt>
computes the exclusive or of byte strings or integers of the same type;
<tt>x[a..b]</tt> takes a range of bytes indexed from <tt>a</tt> (inclusive) to <tt>b</tt> (exclusive)
from <tt>x</tt>.</t>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>A PRSS begins with the establishment of a shared secret.  This protocol uses a
KEM to establish this value.  This is the only communication that occurs between
participants; see <xref target="fig-kex"/> and <xref target="kex"/>.</t>
      <figure anchor="fig-kex">
        <name>Key Agreement</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="176" width="320" viewBox="0 0 320 176" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
              <path d="M 48,64 L 48,144" fill="none" stroke="black"/>
              <path d="M 96,32 L 96,64" fill="none" stroke="black"/>
              <path d="M 224,32 L 224,64" fill="none" stroke="black"/>
              <path d="M 264,64 L 264,144" fill="none" stroke="black"/>
              <path d="M 312,32 L 312,64" fill="none" stroke="black"/>
              <path d="M 8,32 L 96,32" fill="none" stroke="black"/>
              <path d="M 224,32 L 312,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 96,64" fill="none" stroke="black"/>
              <path d="M 224,64 L 312,64" fill="none" stroke="black"/>
              <path d="M 56,96 L 136,96" fill="none" stroke="black"/>
              <path d="M 176,96 L 264,96" fill="none" stroke="black"/>
              <path d="M 48,128 L 128,128" fill="none" stroke="black"/>
              <path d="M 176,128 L 256,128" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="264,128 252,122.4 252,133.6" fill="black" transform="rotate(0,256,128)"/>
              <polygon class="arrowhead" points="64,96 52,90.4 52,101.6" fill="black" transform="rotate(180,56,96)"/>
              <g class="text">
                <text x="52" y="52">Sender</text>
                <text x="268" y="52">Receiver</text>
                <text x="156" y="100">pk</text>
                <text x="152" y="132">enc</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
   +----------+               +----------+
   |  Sender  |               | Receiver |
   +----+-----+               +----+-----+
        |                          |
        |<---------- pk -----------+
        |                          |
        +---------- enc ---------->|
        |                          |
]]></artwork>
        </artset>
      </figure>
      <t>From this shared secret, a KDF is used to generate one or more randomness
contexts; see <xref target="context"/>.  Each randomness context can be used independently to
produce many random values through the use of a PRF; see <xref target="fig-context"/> and
<xref target="prf"/>.</t>
      <figure anchor="fig-context">
        <name>PRSS Key Schedule</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="352" width="464" viewBox="0 0 464 352" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 56,48 L 56,80" fill="none" stroke="black"/>
              <path d="M 56,112 L 56,328" fill="none" stroke="black"/>
              <path d="M 72,160 L 96,160" fill="none" stroke="black"/>
              <path d="M 296,160 L 312,160" fill="none" stroke="black"/>
              <path d="M 296,176 L 312,176" fill="none" stroke="black"/>
              <path d="M 296,192 L 312,192" fill="none" stroke="black"/>
              <path d="M 296,208 L 312,208" fill="none" stroke="black"/>
              <path d="M 296,224 L 312,224" fill="none" stroke="black"/>
              <path d="M 296,240 L 312,240" fill="none" stroke="black"/>
              <path d="M 72,288 L 96,288" fill="none" stroke="black"/>
              <path d="M 296,288 L 312,288" fill="none" stroke="black"/>
              <path d="M 72,320 L 96,320" fill="none" stroke="black"/>
              <path d="M 296,320 L 312,320" fill="none" stroke="black"/>
              <path d="M 56,288 L 72,320" fill="none" stroke="black"/>
              <path d="M 56,256 L 72,288" fill="none" stroke="black"/>
              <path d="M 56,128 L 72,160" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="320,320 308,314.4 308,325.6" fill="black" transform="rotate(0,312,320)"/>
              <polygon class="arrowhead" points="320,288 308,282.4 308,293.6" fill="black" transform="rotate(0,312,288)"/>
              <polygon class="arrowhead" points="320,240 308,234.4 308,245.6" fill="black" transform="rotate(0,312,240)"/>
              <polygon class="arrowhead" points="320,224 308,218.4 308,229.6" fill="black" transform="rotate(0,312,224)"/>
              <polygon class="arrowhead" points="320,208 308,202.4 308,213.6" fill="black" transform="rotate(0,312,208)"/>
              <polygon class="arrowhead" points="320,192 308,186.4 308,197.6" fill="black" transform="rotate(0,312,192)"/>
              <polygon class="arrowhead" points="320,176 308,170.4 308,181.6" fill="black" transform="rotate(0,312,176)"/>
              <polygon class="arrowhead" points="320,160 308,154.4 308,165.6" fill="black" transform="rotate(0,312,160)"/>
              <polygon class="arrowhead" points="104,320 92,314.4 92,325.6" fill="black" transform="rotate(0,96,320)"/>
              <polygon class="arrowhead" points="104,288 92,282.4 92,293.6" fill="black" transform="rotate(0,96,288)"/>
              <polygon class="arrowhead" points="104,160 92,154.4 92,165.6" fill="black" transform="rotate(0,96,160)"/>
              <polygon class="arrowhead" points="64,80 52,74.4 52,85.6" fill="black" transform="rotate(90,56,80)"/>
              <g class="text">
                <text x="28" y="36">shared</text>
                <text x="84" y="36">secret</text>
                <text x="64" y="100">Extract()</text>
                <text x="164" y="164">Expand(secret,</text>
                <text x="256" y="164">info_0)</text>
                <text x="380" y="164">PRF(context_0,</text>
                <text x="452" y="164">0)</text>
                <text x="380" y="180">PRF(context_0,</text>
                <text x="452" y="180">1)</text>
                <text x="380" y="196">PRF(context_0,</text>
                <text x="452" y="196">2)</text>
                <text x="380" y="212">PRF(context_0,</text>
                <text x="452" y="212">3)</text>
                <text x="380" y="228">PRF(context_0,</text>
                <text x="452" y="228">4)</text>
                <text x="380" y="244">PRF(context_0,</text>
                <text x="452" y="244">5)</text>
                <text x="336" y="260">...</text>
                <text x="164" y="292">Expand(secret,</text>
                <text x="256" y="292">info_1)</text>
                <text x="380" y="292">PRF(context_1,</text>
                <text x="452" y="292">0)</text>
                <text x="164" y="324">Expand(secret,</text>
                <text x="256" y="324">info_2)</text>
                <text x="380" y="324">PRF(context_2,</text>
                <text x="452" y="324">0)</text>
                <text x="56" y="340">...</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
shared secret
      |
      |
      v
   Extract()
      |
      |
      |\
      | `--> Expand(secret, info_0) --> PRF(context_0, 0)
      |                             --> PRF(context_0, 1)
      |                             --> PRF(context_0, 2)
      |                             --> PRF(context_0, 3)
      |                             --> PRF(context_0, 4)
      |                             --> PRF(context_0, 5)
      |                                 ...
      |\
      | `--> Expand(secret, info_1) --> PRF(context_1, 0)
      |\
      | `--> Expand(secret, info_2) --> PRF(context_2, 0)
     ...
]]></artwork>
        </artset>
      </figure>
      <t>This document describes both sequential (<xref target="sequential"/>) and indexed
(<xref target="indexed"/>) access to randomness contexts, with different sampling methods
(<xref target="sampling"/>).</t>
    </section>
    <section anchor="kex">
      <name>Key Agreement</name>
      <t>The first stage of the protocol is key agreement.  In this phase, participants
communicate and establish a shared secret.</t>
      <t>Protocol participants are assumed to have a means of authenticating each other.
A confidential communications channel is not necessary, though the use of TLS
<xref target="TLS"/> for authentication purposes will also provide confidentiality
in most cases.</t>
      <t>This document uses the system of describing, naming, and identifying KEMs
defined in <xref target="HPKE"/>.  For use in PRSS, a KEM is first chosen for use.
KEM identifiers from <xref section="7.1" sectionFormat="of" target="HPKE"/> are used for identification and
can be used in negotiation.</t>
      <t>Once a KEM is chosen, one participant is assigned the "sender" role; the other
participant becomes the "receiver".</t>
      <t>The receiver commences by generating a KEM key pair as follows:</t>
      <sourcecode type="pseudocode"><![CDATA[
def sk, pk_bytes = KeyGen(kem):
    sk, pk = kem.GenerateKeyPair()
    pk_bytes = kem.SerializePublicKey(pk)
]]></sourcecode>
      <t>The receiver advertises their public key to the sender by transmitting
<tt>pk_bytes</tt>.  The sender then encapsulates the KEM shared secret as follows:</t>
      <sourcecode type="pseudocode"><![CDATA[
def ss, enc = Send(kem, pk_bytes):
    pk = kem.DeserializePublicKey(pk_bytes)
    ss, enc = kem.Encap(pk)
]]></sourcecode>
      <t>The sender then sends the encapsulated public key, <tt>enc</tt>, to the receiver.  The
receiver decapsulates this value to obtain the shared secret, <tt>secret</tt>:</t>
      <sourcecode type="pseudocode"><![CDATA[
def ss = Receive(kem, sk, enc):
    ss = kem.Decap(enc, sk)
]]></sourcecode>
      <t>This produces a value, <tt>ss</tt>, that is <tt>Nsecret</tt> bytes in length.</t>
    </section>
    <section anchor="context">
      <name>Randomness Contexts</name>
      <t>The single shared secret that is produced by a KEM is not suitable for use as a
source of randomness.  A key derivation function (KDF) is used to first extract
randomness from the secret and then to expand it for use in different contexts.</t>
      <t>A randomness context is a concept that is defined by protocols that use PRSS.
Each context is identified by a unique string of bytes.  This string is passed
to the KDF to produce a shared value that is unique to that context.</t>
      <t>This document uses the system of describing, naming, and identifying KEMs
defined in <xref target="HPKE"/>.  A KDF is first chosen for use.  KDF identifiers
from <xref section="7.2" sectionFormat="of" target="HPKE"/> are used for identification and can be used in
negotiation.</t>
      <section anchor="extract">
        <name>Entropy Extraction</name>
        <t>A labeled method of entropy extraction is used by this document to ensure that
the randomness provided is bound to both the chosen protocol parameters (KEM,
KDF, and PRF) as well as the values chosen by participants during key agreement.</t>
        <t>Each participant constructs a byte sequence by concatenating the following
sequences of bytes:</t>
        <ol spacing="normal" type="1"><li>
            <t>The ASCII encoding <xref target="ASCII"/> of the string "PRSS-00".</t>
          </li>
          <li>
            <t>The identifier for the chosen KEM from <xref section="7.1" sectionFormat="of" target="HPKE"/>, encoded in
two bytes in network byte order.</t>
          </li>
          <li>
            <t>The identifier for the chosen KDF from <xref section="7.2" sectionFormat="of" target="HPKE"/>, encoded in
two bytes in network byte order.</t>
          </li>
          <li>
            <t>The identifier for the chosen PRF from <xref target="prf"/>, encoded in two bytes in
network byte order.</t>
          </li>
          <li>
            <t>A two byte encoding of the KEM parameter <tt>Npk</tt> in network byte order.</t>
          </li>
          <li>
            <t>The value of <tt>pk_bytes</tt>, the public key from the receiver.</t>
          </li>
          <li>
            <t>A two byte encoding of the KEM parameter <tt>Nenc</tt> in network byte order.</t>
          </li>
          <li>
            <t>The value of <tt>enc</tt>, the key encapsulation from the sender.</t>
          </li>
        </ol>
        <dl>
          <dt>Note:</dt>
          <dd>
            <t>Draft versions of this protocol will be identified as "PRSS-00".  The suffix
of this string matches the draft revision in which the scheme last changed.
The string will not be updated unless the scheme changes in an incompatible
fashion.  A final version might either omit this suffix or include a different
string.</t>
          </dd>
        </dl>
        <t>This byte sequence is provided as the <tt>ikm</tt> input to the <tt>Extract()</tt> function of
the chosen KDF.  The shared secret, <tt>ss</tt>, is provided as the <tt>salt</tt> input, as
follows:</t>
        <sourcecode type="pseudocode"><![CDATA[
def extracted = LabeledExtract(kem, kdf, prf, ss, pk_bytes, enc):
    label = concat(
            ascii("PRSS-00"),
            I2OSP(kem.id, 2),
            I2OSP(kdf.id, 2),
            I2OSP(prf.id, 2),
            I2OSP(kem.Npk, 2),
            pk_bytes,
            I2OSP(kem.Nenc, 2),
            enc,
          )
    extracted = kdf.Extract(salt = ss, ikm = label)
]]></sourcecode>
        <t>This process extracts shared entropy that is bound to this protocol and the
context in which it was created.</t>
      </section>
      <section anchor="creating-randomness-contexts">
        <name>Creating Randomness Contexts</name>
        <t>A randomness context is identified by a byte sequence.  Applications that use
PRSS need to describe how each randomness context it uses is identified.
Participants with the same shared entropy and the same randomness context
identifier will produce the same randomness.</t>
        <t>A randomness context is produced by invoking the <tt>Expand()</tt> function of the
chosen KDF, passing the shared entropy generated in <xref target="extract"/> as the <tt>prk</tt>
input, the byte sequence that identifies the context (<tt>ctxᵢd</tt>) as the <tt>info</tt>
input, and the PRF parameter <tt>Nk</tt> as the <tt>L</tt> input (see <xref target="prf"/>), as follows:</t>
        <sourcecode type="pseudocode"><![CDATA[
def context = Context.new(kdf, prf, extracted, ctxᵢd):
    context = kdf.Expand(prk = extracted, info = ctxᵢd, L = prf.Nk)
]]></sourcecode>
        <t>The expanded entropy produced by this process is the only information that is
essential for a randomness context, though a real instantiation might also track
which KEM, KDF, and PRF are used.</t>
      </section>
    </section>
    <section anchor="prf">
      <name>Pseudorandom Function</name>
      <t>A PRF is instantiated with a secret key, <tt>k</tt>, and provides a single function
<tt>PRF(i)</tt>.</t>
      <t>This document adapts the PRF interface to take a non-negative integer as input
and to produce a non-negative integer as output.  New PRF definitions <bcp14>MUST</bcp14>
define three parameters:</t>
      <ul spacing="normal">
        <li>
          <t>the size of the key (<tt>Nk</tt>),</t>
        </li>
        <li>
          <t>the maximum allowed value for the input (<tt>Mi</tt>), and</t>
        </li>
        <li>
          <t>the maximum value that can be produced as output (<tt>Mo</tt>).</t>
        </li>
      </ul>
      <t>Importantly, the maximum input value <bcp14>SHOULD</bcp14> reflect a limit that is based on
keeping attacker advantage negligible relative to an ideal PRF.  Any advantage
needs to be bounded when an attacker is able to obtain output values for all
input values between 0 (inclusive) and that maximum (exclusive).  The maximum
input (<tt>Mi</tt>) is therefore likely to be less than the underlying function might
otherwise permit.</t>
      <t>This assumes the usage modes from <xref target="modes"/>; alternative usage modes that pass
inputs that are randomized or sparse across the entire input space of the
underlying function are possible, but these have not been specified.</t>
      <t>Each PRF is identified by a two-byte identifier, allocated using the process in
<xref target="iana"/>.</t>
      <section anchor="aes">
        <name>Cached-Key AES PRF</name>
        <t>This document defines a PRF based on that described in
<xref target="GKWY20"/>.  This provides a PRF that has
circular correlation robustness.</t>
        <t>This PRF uses the AES function, either AES-128 or AES-256, as defined in
<xref target="AES"/>.  Both of these functions accept a 16 byte
input.  The primary difference in these functions is the size of the key;
AES-128 uses a 16 byte key, whereas AES-256 uses a 32 byte key.  This
information is summarized in <xref target="_table-prf"/>.</t>
        <table anchor="_table-prf">
          <name>Pseudorandom Function Summary</name>
          <thead>
            <tr>
              <th align="left">PRF Name</th>
              <th align="right">Identifier</th>
              <th align="right">Nk</th>
              <th align="right">Mi</th>
              <th align="right">Mo</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">PRF_AES_128</td>
              <td align="right">0x0001</td>
              <td align="right">16</td>
              <td align="right">2<sup>42</sup></td>
              <td align="right">2<sup>128</sup></td>
            </tr>
            <tr>
              <td align="left">PRF_AES_256</td>
              <td align="right">0x0002</td>
              <td align="right">32</td>
              <td align="right">2<sup>43</sup></td>
              <td align="right">2<sup>128</sup></td>
            </tr>
          </tbody>
        </table>
        <t>Both AES PRFs use the same process:</t>
        <ol spacing="normal" type="1"><li>
            <t>The input, <tt>i</tt>, is converted to a 16-byte input using a little-endian
encoding.</t>
          </li>
          <li>
            <t>These bytes are then input to the AES function to produce a 16 byte output.</t>
          </li>
          <li>
            <t>The AES input and output are XORed produce a 16 byte sequence.</t>
          </li>
          <li>
            <t>The byte sequence is interpreted as an integer using little-endian encoding
to produce the output randomness.</t>
          </li>
        </ol>
        <t>The process in pseudocode is:</t>
        <sourcecode type="pseudocode"><![CDATA[
def randomness = Context.PRF(i):
    input = rev(I2OSP(i, 16))
    output = aes(k, input)
    r_bytes = xor(output, input)
    randomness = OS2IP(rev(r_bytes))
]]></sourcecode>
        <t>This step is performance-sensitive, so little endian encoding is chosen to match
the endianness of most hardware that is in use.  This PRF uses a constant key,
which allows implementations to avoid computing the key expansion on each PRF
invocation by caching the expanded values.</t>
        <dl>
          <dt>Note:</dt>
          <dd>
            <t>A similar PRF core is described in <xref section="6.2.2" sectionFormat="of" target="VDAF"/>, based on the analysis in
<xref target="GKWWY20"/>.  The function described in this
document operates from a limited input domain that always results in the high
bits being zero in all cases, making the difference between the two approaches
negligible; these approaches consequently only differ in the placement of the
input bits.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="modes">
      <name>Randomness Usage Modes</name>
      <t>The same PRF input <bcp14>MUST NOT</bcp14> be used more than once.  Using the same input more
than once will produce identical outputs, which might be exploited by an
attacker.</t>
      <t>This section describes two basic access modes for randomness contexts that
provide some safeguards against accidental reuse of inputs:</t>
      <ul spacing="normal">
        <li>
          <t>A sequential randomness context provides access using a counter; see
<xref target="sequential"/>.</t>
        </li>
        <li>
          <t>An indexed randomness context provides concurrent access; see <xref target="indexed"/>.</t>
        </li>
      </ul>
      <t>These usages are incompatible; only one mode of access can be used for a given
context.</t>
      <t>These usage modes are intended to use a contiguous block of input values,
starting from 0.  The definition of the <tt>Mi</tt> parameter of the PRF function (see
<xref target="aes"/>) assumes this usage model.</t>
      <section anchor="sequential">
        <name>Sequential Randomness</name>
        <t>In this mode, a counter, starting at zero, is retained with the randomness
context.  Each use of the randomness context first uses that counter as input to
the PRF, then increments it.</t>
        <sourcecode type="pseudocode"><![CDATA[
def randomness = Context.next():
    randomness = Context.PRF(this.counter)
    this.counter = this.counter + 1
]]></sourcecode>
        <t>This is the simplest access scheme, which is compatible with any sampling
method; see <xref target="sampling"/>.</t>
      </section>
      <section anchor="indexed">
        <name>Indexed Randomness</name>
        <t>Indexed randomness ties the use of the randomness context to a sequence of
application records.  The processing of each record is defined to each use <tt>M</tt>
invocations of a certain randomness context.  Therefore, for a given record,
<tt>r</tt>, and usage, <tt>m</tt>, the context is invoked as <tt>context.PRF(r * M + m)</tt>.  The
simplest indexing scheme sets <tt>M</tt> to 1.</t>
        <t>Indexed usage is best suited to applications where individual records might be
processed concurrently.  Using indices based on identifiers from an application,
such as record indices, can ensure that the same PRF input is only used once and
frees the randomness context from maintaining its own counter.</t>
        <t>Binary sampling (<xref target="binary"/>) or oversampling (<xref target="oversampling"/>) are best suited
for use with indexed modes.  Rejection sampling (<xref target="rejection"/>) is likely to be
unsuitable for an indexed mode because it requires an unpredictable number of
PRF invocations to successfully complete.</t>
      </section>
    </section>
    <section anchor="sampling">
      <name>Sampling from the PRF Output</name>
      <t>PRSS natively produces a uniformly random value in the range from 0 (inclusive)
to <tt>Mo</tt> (exclusive).</t>
      <t>Many applications of PRSS require the selection of a uniform random value from a
fixed range of values.</t>
      <section anchor="available-randomness">
        <name>Available Randomness</name>
        <t>The total randomness available is limited by the entropy from the chosen KEM,
KDF, and PRF.  Each KEM is only able to convey a maximum amount of entropy.
Similarly, each KDF is limited in the amount of entropy it only able to retain.
Finally, each PRF also has limits that might further reduce the maximum entropy
available.</t>
        <t>Selecting values from a range that is larger than the available entropy will
affect the uniformity of the output.  In particular, these methods <bcp14>MUST NOT</bcp14> be
used to select from a range that has more values than the <tt>Mo</tt> parameter of the
chosen PRF.</t>
        <t>If values larger than <tt>Mo</tt> are needed, the output of multiple PRF invocations
can be combined.  With <tt>k</tt> invocations, the effective value of <tt>Mo</tt> increases to
<tt>Mo</tt><sup><tt>k</tt></sup>.</t>
      </section>
      <section anchor="binary">
        <name>Binary Sampling</name>
        <t>If the range of desired values is a whole power of 2, then simple bit operations
can be used to obtain a value. For a maximum of 2<sup>n</sup> (exclusive),
bitwise operations can produce a value of <tt>randomness &amp; ((1 &lt;&lt; n) - 1)</tt>.</t>
        <t>Binary sampling produces uniformly random values with the only drawback being
the constraint on its output range.</t>
        <t>For small values of <tt>n</tt>, the same PRF invocation could be used to produce
multiple values, depending on the value of <tt>Mo</tt> for the chosen PRF.</t>
      </section>
      <section anchor="rejection">
        <name>Rejection Sampling</name>
        <t>Rejection sampling takes random values until the resulting value is in range.</t>
        <t>For values in the range 0 (inclusive) to <tt>m</tt> (exclusive), the value <tt>m</tt> is
rounded up to the next power of 2; that is, an integer <tt>n</tt> is chosen such that
2<sup>n-1</sup> &lt; <tt>m</tt> &lt;= 2<sup>n</sup>.  Then, binary sampling (<xref target="binary"/>) is
applied repeatedly for this larger range until the resulting value is less than
<tt>m</tt>.</t>
        <t>Rejection sampling provides uniform randomness across the range from 0 to <tt>m</tt>
without bias.  However, rejection sampling can require an indefinite number of
PRF invocations to produce a result.  Rejection is more likely -- and so the
expected number of PRF invocations increases -- when <tt>m</tt> is closer to
2<sup>n-1</sup> than 2<sup>n</sup>.  This can make rejection sampling unsuitable
for use with indexed randomness (<xref target="indexed"/>).</t>
        <t>Rejection sampling might be used a limited number of times before falling back
to oversampling (<xref target="oversampling"/>), which can reduce oversampling bias while
capping the number of PRF invocations.</t>
      </section>
      <section anchor="oversampling">
        <name>Oversampling</name>
        <t>For a target range that is much smaller than the range of values produced by the
PRF, reducing the PRF output modulo the maximum in the range can produce outputs
with negligible bias.</t>
        <t>For example, an application goal might seek to produce values in the prime field
<tt>p</tt> = 2<sup>61</sup> - 1.  Using the AES PRF, where <tt>Mo</tt> is 2<sup>128</sup>, and
reducing its output modulo <tt>p</tt> results in a bias that causes the first 64 values
of the field to be chosen with a probability of about 2<sup>-67</sup> more than
other values. This degree of bias might be acceptable in some applications.</t>
        <t>To avoid excessive bias, applications <bcp14>SHOULD NOT</bcp14> use oversampling where the
output is less than 2<sup>48</sup> times smaller than <tt>Mo</tt>.  The output of
multiple PRF invocations could be combined to reduce bias.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This document describes a small component of a larger system.  A discussion of
considerations necessary to ensure correct application of the included
techniques is provided in relevant sections.  This section concentrates on a
more general analysis of these mechanisms.</t>
      <section anchor="usage-limit-analysis">
        <name>Usage Limit Analysis</name>
        <t>The usage limits in <xref target="aes"/> ensure that attacker advantage remains small.
Theorem 4 of <xref target="GKWY20"/> models the underlying permutation function as an ideal
PRP and shows that attacker advantage comprises two components:</t>
        <ul spacing="normal">
          <li>
            <t>a computational limit of <tt>q²/(2*2^k)</tt> that is based solely on attacker work
(<tt>q</tt>) and the key size (<tt>k</tt>) of the permutation</t>
          </li>
          <li>
            <t>a usage limit of <tt>2pq/2^b</tt> that provides advantage proportional to the number
of uses of the PRF (<tt>p</tt>), with the entropy of the pseudorandom function (<tt>b</tt>)
acting to counteract attacker advantage</t>
          </li>
        </ul>
        <t>The number of uses (<tt>p</tt>) are only affected by the second component, as the first
component is unaffected by usage of the permutation.  However, the first
component guides our assumptions about the number of times the attacker might be
willing to invoke the permutation (<tt>q</tt>). The result shows that statistical security is
provided based on the birthday bound. For instance, <tt>q</tt> being 2<sup>64</sup>
results in a disastrous advantage of 0.5 for the AES-128 key size of 128 bits.
This first term therefore places an upper bound on the value that <tt>q</tt> can take
before an attacker can rely solely on this computational limit.</t>
        <!--
2^{-a}/2 >= q^2/2^k/2
2^{-a} >= q^2/2^k
2^{k-a} >= q^2
2^{(k-a)/2} >= q

With this value of q, the second component then becomes:

2^{-a}/2 >= 2pq/2^b
    >= 2p.2^{(k-a)/2}/2^b
    >= 2p.2^{-a/2}.2^{k/2-b}
2^{-a/2}/4/2^{k/2-b} >= p
2^{b-k/2-a/2-2} >= p
p <= 2^{b-(k+a)/2-2}
-->

<t>We use this first component to bound the value of <tt>q</tt> for the second component.
If advantage is equally divided between each component we can bound <tt>q</tt> to be at
most <tt>2⁽(k-a)/2)</tt>, where <tt>a</tt> is the desired attacker advantage in bits (that
is, advantage is at most 2<sup>-a</sup>).</t>
        <t>Using that value for <tt>q</tt> and an advantage of <tt>(2^a)/2</tt> for the second component
leads to a limit for <tt>p</tt> of <tt>2⁽b-(k+a)/2-2)</tt>.  For example, to obtain 40 bits
of security, the value of <tt>p</tt> for AES-128 is limited to 2<sup>42</sup>, which
assumes a value of <tt>q</tt> no more than 2<sup>44</sup>.</t>
        <t>For AES-256, the larger key size means that the first component is negligible
for any value of <tt>q</tt>, unless <tt>p</tt> and <tt>a</tt> are both very small.  This is due to
AES-256 having the same 128-bit block size as AES-128.  Consequently, increasing
<tt>q</tt> only reduces the value of <tt>p</tt>.</t>
        <t>On this basis, the same <tt>q</tt> value can be used for AES-256 as for AES-128. The
usage limit for AES-256 can be doubled to <tt>2⁽b-(k+a)/2-1)</tt> (2<sup>43</sup> for
40 bits of security; the first component is a negligible 2<sup>-169</sup>).</t>
        <t>This analysis models AES as an ideal pseudorandom permutation.</t>
      </section>
      <section anchor="formal-analysis">
        <name>Formal Analysis</name>
        <t>TODO</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document establishes a new registry for "PRF Functions", under the grouping
"PRSS".  This registry operates on a "Expert Review" for provisional
registrations or the "Specification Required" policy for permanent registrations
<xref target="RFC8126"/>.  Experts for the registry are advised to reject registrations only
when the requests are invalid, abusive, or duplicative of existing entries.</t>
      <t>New entries for the "PRF Functions" registry <bcp14>MUST</bcp14> include the following
information:</t>
      <dl spacing="compact">
        <dt>Name:</dt>
        <dd>
          <t>A short mnemonic for the PRF.</t>
        </dd>
        <dt>Identifier:</dt>
        <dd>
          <t>An identifier from the range 0 to 65535 (inclusive).</t>
        </dd>
        <dt>Nk:</dt>
        <dd>
          <t>The number of bytes in the PRF key.</t>
        </dd>
        <dt>Mi:</dt>
        <dd>
          <t>The maximum value of the PRF input.</t>
        </dd>
        <dt>Mo:</dt>
        <dd>
          <t>The maximum value of the PRF output.</t>
        </dd>
        <dt>Status:</dt>
        <dd>
          <t>Either "permanent" or "provisional".</t>
        </dd>
        <dt>Specification:</dt>
        <dd>
          <t>A reference to a specification for the PRF.  Citing a specification is
optional for provisional registrations.</t>
        </dd>
        <dt>Last Updated:</dt>
        <dd>
          <t>The date of when the registration was last updated.</t>
        </dd>
      </dl>
      <t>The name and identifier <bcp14>MUST</bcp14> be unique within this registry.</t>
      <t>No special allowance is made for private use or experimentation in this
registry.  People conducting experiments are encouraged to provisionally
register a codepoint so that conflicting use of the same identifier can be
avoided.  New PRFs are encouraged to use an identifier that is selected at
random.  IANA are advised not to perform allocation for identifiers, but to use
the identifier that is provided with the registration.</t>
      <t>Provisional registrations <bcp14>MAY</bcp14> be removed on request.  Experts can approve
removal after having first attempted to determine that the value is no longer in
use and attempting to contact registrants.  Two months notice <bcp14>MUST</bcp14> be provided
before removing a registration, even when the original registrant requests
removal.  Any entry that are in standards track RFCs or that has been updated in
the past 24 months cannot be removed.</t>
      <t>A request to update an entry can be made at any time; any request only refreshes
the "Last Updated" field can be allowed automatically, without consulting the
assigned experts.</t>
      <t>Starting values for the registry are shown in <xref target="_table-prf"/>; these entries are
given a "permanent" status and entries reference <xref target="prf"/> of this document.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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>
        <reference anchor="HPKE">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
        <reference anchor="RSA">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson"/>
            <author fullname="A. Rusch" initials="A." surname="Rusch"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
              <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series. By publishing this RFC, change control is transferred to the IETF.</t>
              <t>This document also obsoletes RFC 3447.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8017"/>
          <seriesInfo name="DOI" value="10.17487/RFC8017"/>
        </reference>
        <reference anchor="ASCII">
          <front>
            <title>ASCII format for network interchange</title>
            <author fullname="V.G. Cerf" initials="V.G." surname="Cerf"/>
            <date month="October" year="1969"/>
          </front>
          <seriesInfo name="STD" value="80"/>
          <seriesInfo name="RFC" value="20"/>
          <seriesInfo name="DOI" value="10.17487/RFC0020"/>
        </reference>
        <reference anchor="AES">
          <front>
            <title>Advanced encryption standard (AES)</title>
            <author>
              <organization/>
            </author>
            <date month="November" year="2001"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.197"/>
          <refcontent>National Institute of Standards and Technology</refcontent>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="CDI05">
          <front>
            <title>Share Conversion, Pseudorandom Secret-Sharing and Applications to Secure Computation</title>
            <author fullname="Ronald Cramer" initials="R." surname="Cramer">
              <organization/>
            </author>
            <author fullname="Ivan Damgård" initials="I." surname="Damgård">
              <organization/>
            </author>
            <author fullname="Yuval Ishai" initials="Y." surname="Ishai">
              <organization/>
            </author>
            <date year="2005"/>
          </front>
          <seriesInfo name="Theory of Cryptography" value="pp. 342-362"/>
          <seriesInfo name="DOI" value="10.1007/978-3-540-30576-7_19"/>
          <seriesInfo name="ISBN" value="[&quot;9783540245735&quot;, &quot;9783540305767&quot;]"/>
          <refcontent>Springer Berlin Heidelberg</refcontent>
        </reference>
        <reference anchor="MLS">
          <front>
            <title>The Messaging Layer Security (MLS) Protocol</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
            <author fullname="R. Robert" initials="R." surname="Robert"/>
            <author fullname="J. Millican" initials="J." surname="Millican"/>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="K. Cohn-Gordon" initials="K." surname="Cohn-Gordon"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>Messaging applications are increasingly making use of end-to-end security mechanisms to ensure that messages are only accessible to the communicating endpoints, and not to any servers involved in delivering messages. Establishing keys to provide such protections is challenging for group chat settings, in which more than two clients need to agree on a key but may not be online at the same time. In this document, we specify a key establishment protocol that provides efficient asynchronous group key establishment with forward secrecy (FS) and post-compromise security (PCS) for groups in size ranging from two to thousands.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9420"/>
          <seriesInfo name="DOI" value="10.17487/RFC9420"/>
        </reference>
        <reference anchor="TLS">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="GKWY20">
          <front>
            <title>Efficient and Secure Multiparty Computation from Fixed-Key Block Ciphers</title>
            <author fullname="Chun Guo" initials="C." surname="Guo">
              <organization/>
            </author>
            <author fullname="Jonathan Katz" initials="J." surname="Katz">
              <organization/>
            </author>
            <author fullname="Xiao Wang" initials="X." surname="Wang">
              <organization/>
            </author>
            <author fullname="Yu Yu" initials="Y." surname="Yu">
              <organization/>
            </author>
            <date month="May" year="2020"/>
          </front>
          <seriesInfo name="2020 IEEE Symposium on Security and Privacy" value="(SP)"/>
          <seriesInfo name="DOI" value="10.1109/sp40000.2020.00016"/>
          <refcontent>IEEE</refcontent>
        </reference>
        <reference anchor="VDAF">
          <front>
            <title>Verifiable Distributed Aggregation Functions</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="David Cook" initials="D." surname="Cook">
              <organization>ISRG</organization>
            </author>
            <author fullname="Christopher Patton" initials="C." surname="Patton">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Phillipp Schoppmann" initials="P." surname="Schoppmann">
              <organization>Google</organization>
            </author>
            <date day="8" month="July" year="2024"/>
            <abstract>
              <t>   This document describes Verifiable Distributed Aggregation Functions
   (VDAFs), a family of multi-party protocols for computing aggregate
   statistics over user measurements.  These protocols are designed to
   ensure that, as long as at least one aggregation server executes the
   protocol honestly, individual measurements are never seen by any
   server in the clear.  At the same time, VDAFs allow the servers to
   detect if a malicious or misconfigured client submitted an
   measurement that would result in an invalid aggregate result.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-vdaf-10"/>
        </reference>
        <reference anchor="GKWWY20">
          <front>
            <title>Better Concrete Security for Half-Gates Garbling (in the Multi-instance Setting)</title>
            <author fullname="Chun Guo" initials="C." surname="Guo">
              <organization/>
            </author>
            <author fullname="Jonathan Katz" initials="J." surname="Katz">
              <organization/>
            </author>
            <author fullname="Xiao Wang" initials="X." surname="Wang">
              <organization/>
            </author>
            <author fullname="Chenkai Weng" initials="C." surname="Weng">
              <organization/>
            </author>
            <author fullname="Yu Yu" initials="Y." surname="Yu">
              <organization/>
            </author>
            <date year="2020"/>
          </front>
          <seriesInfo name="Advances in Cryptology – CRYPTO 2020" value="pp. 793-822"/>
          <seriesInfo name="DOI" value="10.1007/978-3-030-56880-1_28"/>
          <seriesInfo name="ISBN" value="[&quot;9783030568795&quot;, &quot;9783030568801&quot;]"/>
          <refcontent>Springer International Publishing</refcontent>
        </reference>
      </references>
    </references>
    <?line 675?>

<section anchor="alternative-designs">
      <name>Alternative Designs</name>
      <t>Where a small number of shared secrets is desired, communication can be a good
substitute for the methods described in this document.  Depending on the
context, protocol participants can use one of a range of methods to agree on a
random value.  This might involve the use of the KEM and KDF method described in
<xref target="kex"/>, a commit-then-reveal protocol, or one of many alternative protocols.</t>
      <t>TLS exporters <xref section="7.5" sectionFormat="of" target="TLS"/> are an existing example of
pseudorandom secret sharing.  TLS exporters are suitable for small numbers of
secrets if a TLS connection is available for use, but TLS exporters are an not
efficient means of generating large amounts of randomness.</t>
      <t>In some applications, a TLS exporter might be used in place of the KEM to
produce a shared secret; alternatively, the randomness context identifier might
be provided as context to a TLS exporter so that a randomness context might be
produced directly.</t>
    </section>
    <section anchor="application-to-2-of-3-replicated-secret-sharing">
      <name>Application to 2-of-3 Replicated Secret Sharing</name>
      <t>This section describes how PRSS might be used to produce replicated shares for
use with replicated secret sharing MPC protocols that use additive or XOR secret
sharing.  <xref target="CDI05"/> describes how to use PRSS for protocols that use polynomial
shares.</t>
      <t>The simplest replicated secret sharing involves three participants that are
arranged logically in a ring.  Each participant receives two of the three shares
of values.  In this scheme, each participant has one share in common with the
participant to its left and right respectively.</t>
      <t>Executing PRSS in this setting requires use of the protocol in a pairwise
fashion; each participant executes the protocol once with the participant to its
left and once with the participant to its right.  As long as participants agree
on parameters - which randomness context is used (<xref target="context"/>), which mode is
used (<xref target="modes"/>), which index (if using an indexed mode; <xref target="indexed"/>), and the
sampling method (<xref target="sampling"/>) - this produces replicated shares of a random
value that is not known to any single participant.</t>
      <t><xref target="CDI05"/> also describes how shares of a known, specific value might be
produced using the same scheme, but this is more trivially accomplished in this
setting by setting a pre-arranged share value to the desired value and all
others to zero.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA71963IbR7Lm/3qKOlTEBjkGQBKiLpZEezi6jBkWRa5or8/E
7LHRAApgHza6oe4GKZrSROybbOwjbMT+3D/nTXafZPPLzLo0CMoe/1jFjEV2
d1VlZWVlfnmpUr/fN23eFu6Z3foun1/YM1fPqnqRlRNnzxq3mlZ1Vk6rhT13
k9q19vwiq/NybrfP3p+f72yZbDyu3RW1xu9bZpK1bl7VN89s006NmVaTMltQ
59M6m7X99qJaNFXZXy4X/WXdNP29PdOsxou8afKqbG+W9OXx6x/emElVNq5s
Vs0z29YrZ2iAhyarXUYDESGrOm9vtsx1VV/O62q1xPB1fpVNbuxZ7RpXX4HE
E5c1q9otXNlumUt3Q59Pnxnbt8u6nOPv0n1s7dyVrs5aGh+PVmU+qWr+sVlm
9WWBjqZ509b5eNW6qS3cdO5qc+XKlaPO7O8d31qZ3tZPRDTe/hUN8XyR5QU9
J578OXftbFDVczzO6skFPb5o22XzbHcXX+FRfuUG/rNdPNgd19V143ap/S7a
zfP2YjVGh6Codf2sFeJphrt5f4pvCnretEnvG74dSEeDvEKr3c0LOLhoF8WW
MdmK3tRgLvVuraz5SVa3eWl/kDb8gojOyvxXZjd9UP2aF0XGb5ywYdH+uaiu
iWN1tbwZlK7tdvkXV9rz7Cqbu03dubbT17ht+NM/L+jFYFItjCkh2i3x8Jkx
eTlLfjP9ft9mY1robNIa0xH9RkS/6Yi+dWU2Llxj2wuXCJGtZjYjBtdzZ8vV
YuxqemLQlIRnmfZ6lRUraj6r6efMNtRz4ax+2Dg3HVhiXd5Y+t+qcbNVYfMS
G6MlqW3s9YWrXRgpW1SrssXY2oGMUbqG25fUnZv2bLOaXNisMYtV0eZ9ku/2
xhJflqtWaN8+OXu5M1BmLPLptHDGPLDHWI7pasKbxBzFedFOqtpqUhWNHRMH
Znkr07nIeAM01cLZhctKen1DFOc0um9B7CO9k7vGZPPaOUujZzblTDJ9EJpP
VjTV4ibywt4zC8OzCJPl9WkvaAz5tGcvKuJLS/vu3yvoEWJ2S3I67ylPSffd
xImZ2tGgRN3YYUpYcttWfsFdh//NxgUY/C5pur399uWr471Hh69Ojwf7e/S/
vSe7Xz952n/Yf3Sw13+49+jJ4/6TX/a//vzZEEsy5SsNWNJ+zEkqILgky0Qt
zY7ozJsL9M9cWkbR6oidWRc7kOY5T8p7BeVlp66ZkFpwGJYEEN+QcSCy42q2
F1lrJ1lp3GyWT3JqVTATSWo8jz6sMl3y+9jEo4YuZeFp29PU8l/pW/qUWs5c
TXQUc6zdBU1hnhe0iJ5m35o2ymKcl0LyRUXGxJIFIKGbZMuGJInFnbq+qKZ2
+/vXJzvcOz6ZOtaFeD9blSLz29+/erPTWfYOwxoenfT+2mMLBcPyN86anKed
mWRn6ma227e3+uPnzzuQbNkqgfKCDHN77fDfjgoxnkAIEREommL6z8qnta+z
ycUmwmhBrSM202YfO+k7A0cb92GF/ZsVtMdXNS0xdRzbm9vb+MXnz6SmuVlJ
U5u6j+CPNLq91QefP/eI70tXTiGxNB8oLOihBw/sD9dV/4z3+JlfW3O/eHal
kvhv2+tKFIjTZcJ+B7206o2ZktIqiaKqJHkFngD7MzQKioVZQU2PZ6Lqq4xl
k5hMiwwWJxPnbUAvlcnXxDu7qGooIJo+6R1Re6SEGDeITH6c0Mu5U3Fsopo+
eXsOvUB/Hb5/8/Lrg+EeGDWpVsUU65FNs2XrlySoA3TJKhW86VmSwywvia0G
xFe8lq7gl/x529lzJE9MizDfvqzKKxBMaIz3xytwK+ffsQiOBwOsauzWyY/n
P2z15G/77pR/fv/6P/94/P71K/x8/t3R27fhB6NfnH93+uPbV/Gn2PLl6cnJ
63evpDE9tZ1HZuvk6G/0BlRtnZ79cHz67ujtFhav7chGVrO6Jm6xilxCdYFj
xgvNFG3+8vLsP/77/gEx+1+I0cN9aFn95en+kwP6hUxDKaOJpPCvxMwbky2X
LqtZbIqCdswyb7OCFjGDFFTXpYVRIXb+6e/gzL89sy/Gk+X+wTf6ABPuPPQ8
6zxknt19cqexMHHDow3DBG52nq9xukvv0d86v3u+Jw9ffEuI2dn+/tNvvyER
+ruY7nxJqp++etB50OBJ8vv6viZ9o9bbkRrdSr7cwprWjkwBfvBIQowQ6ZMJ
IXU0NF6uB+b2GS0eqdP6sNPPZ2PeVQp+oCxIJ/Aik74P2p8hSJtdkiJmo0ly
8d3Z9695S+4/pS1JumHk7KE5Hp6en22TXOQ7I+5llNtDe3o+PD7bdvQodshS
2enx/fkROny6t/+EpI0aBwGFzapYL6LLqdNfYPVLN2f4yrI9h10kbuArxZTj
G1iqFjCjRzimWTpFCD3iLXfiWtZ5/CFtY1djLuTPbRO59Bd1qUvAL8WAiWoX
nY+GzXM7AirIWrSSnwgb04sEe2ibJm30saqphRHopuOQMiyItiuM6L/VKTR4
FGZaiTZuCB+wZ/XcjD7+PRsMxv82YtY2AifnkcxgfZg7o2xkt/NSR2PjPhrT
o0DAjpHvPo5EF55ewa1z1wDAbGXGbp7TWrKOZ9I96mLhZTdgI6yKyhbMzQxk
DlLsm4sGW8fAvAhQPcSuBbxUEVoW+WpCHjEgOIEEV5p0iz2HK0ECNsvn/Uv3
UWSLfuefaWL/+Mc/bJY1V3M4Tl/1w5+vbPdP+gqffrL2nMw1yQR+7Pz5ZN+7
iSMO1vZT6PWr+3v9Kvaq7e/98yl+9CISZJeXtr9G3+/vKZkZtlrS0zeffl9P
xEPolwfKY8vxlMOt78k2HnlDDE3zBvLEi9uRCzIVrG82oTcgBpJ6hhAJzPBe
oF/dgB4Vy9l7sJwHcdgJQFsC09vKeKTOvk/XPyXXqVrNRcSpsQg2wc1UssL4
rLlub5f1bE26OjM23TXwf1/h79cf2QPf3rnno0//1f9gR7RE9D3J+XTbsxJO
/S97OxaviMhtpeyXvZ7dC13ev5j0Z0PL/T/ccviHWz78wy0P/nDLR7+vJf4M
BoN/YkH27y7Ifrogv6OL4d0uhrELkJNuQy/0uhVZX2M/nk8u3HRVOGzH+5yI
MYHk1MPZ7noz4imqLTHbiQ9DbyYTbDmAkzsbkCAhm4ppDhcWQ5LtWnJ8UYE/
OvPPqDcxOx0tYm8fQHEL9p7ldUOdtJnYOOzP1Hfu+AFwXxQaLy+yxvVsaiRM
tCmOZxdt0boNM8Z7YZ0eGNFkTUO8ZAV2kV251ClBfBAMhNWiCTvoKPZFBmRN
iUGzfKrc7pg3Yh65I6XjCZVVS4AFDM7qG4DvdbX0w9tz0j3f/iDu0tODg8ek
kIDq0tHJZi5X9bKC7b3OCbETWK/AuCsioUMKuWkGUaaqgfKk7wf3AtTmpmnd
AjSoGHE4qcwW/DfLC3c6u8HsO44njbAJUL4hsjEteg3hZRtBOIFGl2XXyMBM
PhswiNAxcsAjxZXnTuIDTwb7oI7HgZau1RCgvW+m3IEG79oK4vq8Io5wVNiY
U2C/QI4Q0mNLlUgEXpE85HPMESzaahgubNm6KtxzG5zRFK3QmLT8ytOtWlHE
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
v8i0TzWGoipmq5ojRyR03ln1pOo4JjCJ+HsuS0SS1T20Livh3TE+alrHMGdk
s6cdWNZkBL0nrQZCea1xCFvNSAipE3iIx757ium1UDpF1saXm4kYbaAMHGDk
HQ40KH0sseugyMRaDqhnL2SdyXFDKBJ/rj5x9uGs+lNPa7vXl9Xq0WQc8P8J
WmfEZRzhM+nOMZcQx42FExiWoUrG2KYyeMKxIepCYkO6GVRLBoVw+0CVJE8p
bmWpIcuTc+FcQXd9URUI5F4LW4YKk8SqwStSPzCdlV8HDb5n/gTTGza2XrrQ
G1Ncaiwr0Rg9Qz1z8Dv2zoYmRnEiL5Lt/J/s9va+ffHClju2b/c5JbRuJoKK
26zgkpyt+Id1dj0mv0l8VKM4AJdD5NiNpRimEN6ZY5Ngos0Cbqx2CTJLRRGJ
bQzhg3CQ17NOiTRBgBTmd89GtxfrMnG3DEnFINqvRBKi+TJmg4GTw3Nd5pAK
ygstEYI7HzSBRmFSFng5Si3G3p2jdouOreglk8KrvDG15nlWSx8c5Ntaokw+
93qnl0boiOFJRInRCzusKnT9fRW7FzzOi8OuNAp6K3t2/CWUQdSxUYMpooVB
LoJERhYhqkGZ+Rc5F7JChogZbFyN4LF2zaKYsZil6Rhm4a+BRFccxMiAZb4j
zl3B+6rvjoJN5k2yIhb2IH8DisR9KZPrIKZcta6iI9yuUuLkPytZ9xFnUYmB
8SqR9f6joqOmnO0TybCTgtYWB3/vLCor57sLmosWWSD3u2HyEbFtBoMJxzun
fTYvWAjEyG0JwZ7Hibb5gjOPnCWckb5AMygboKjfgK/e5ZMFY+Z3WmCt8QnN
ZUIy6qNL93JZ9cRp2sftg86gsqsz0gsk1u2ayV9gg7HSSw3/GkBbq2JA1c2b
npDvCQRZqk4JJq+Kai0FnXSbGgQNgrGop5llFnkh3H3ERFxvzbORaxxkscgv
vkzFuavBkODCYStXTM1oObJeZTz2UkcmpxPK0wSLv05GrHaznsSRjH1gQmJP
lAEYKwmeZrK2ms4P+UCJdTw+UKKNwigmV3PPqgu1zIImOc7GfGcK4+0xVITQ
1n/8RKcUApWSkPZAW6+FcXJhz0woCgIvaUKB1aVEBlPsj7iXj7WT5oe3fyUr
1ev6CPHCAokvpLIpLIUMKbNSLeoTZz5NJhutI51YDA05BLxm7sNr0UB7xCZ4
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
agAA

-->

</rfc>
