<?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.6.22 (Ruby 3.1.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-voprf-20" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title abbrev="OPRFs">Oblivious Pseudorandom Functions (OPRFs) using Prime-Order Groups</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-voprf-20"/>
    <author initials="A." surname="Davidson" fullname="Alex Davidson">
      <organization>Brave Software</organization>
      <address>
        <email>alex.davidson92@gmail.com</email>
      </address>
    </author>
    <author initials="A." surname="Faz-Hernandez" fullname="Armando Faz-Hernandez">
      <organization>Cloudflare, Inc.</organization>
      <address>
        <postal>
          <street>101 Townsend St</street>
          <city>San Francisco</city>
          <country>United States of America</country>
        </postal>
        <email>armfazh@cloudflare.com</email>
      </address>
    </author>
    <author initials="N." surname="Sullivan" fullname="Nick Sullivan">
      <organization>Cloudflare, Inc.</organization>
      <address>
        <postal>
          <street>101 Townsend St</street>
          <city>San Francisco</city>
          <country>United States of America</country>
        </postal>
        <email>nick@cloudflare.com</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Cloudflare, Inc.</organization>
      <address>
        <postal>
          <street>101 Townsend St</street>
          <city>San Francisco</city>
          <country>United States of America</country>
        </postal>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2023" month="February" day="02"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>An Oblivious Pseudorandom Function (OPRF) is a two-party protocol between
client and server for computing the output of a Pseudorandom Function (PRF).
The server provides the PRF secret key, and the client provides the PRF
input. At the end of the protocol, the client learns the PRF output without
learning anything about the PRF secret key, and the server learns neither
the PRF input nor output. An OPRF can also satisfy a notion of 'verifiability',
called a VOPRF. A VOPRF ensures clients can verify that the server used a
specific private key during the execution of the protocol. A VOPRF can also
be partially-oblivious, called a POPRF. A POPRF allows clients and servers
to provide public input to the PRF computation. This document specifies an OPRF,
VOPRF, and POPRF instantiated within standard prime-order groups, including
elliptic curves. This document is a product of the Crypto Forum Research Group
(CFRG) in the IRTF.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
  <eref target="https://github.com/cfrg/draft-irtf-cfrg-voprf"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>A Pseudorandom Function (PRF) F(k, x) is an efficiently computable
function taking a private key k and a value x as input. This function is
pseudorandom if the keyed function K(_) = F(k, _) is indistinguishable
from a randomly sampled function acting on the same domain and range as
K(). An Oblivious PRF (OPRF) is a two-party protocol between a server
and a client, where the server holds a PRF key k and the client holds
some input x. The protocol allows both parties to cooperate in computing
F(k, x) such that the client learns F(k, x) without learning anything
about k; and the server does not learn anything about x or F(k, x).
A Verifiable OPRF (VOPRF) is an OPRF wherein the server also proves
to the client that F(k, x) was produced by the key k corresponding
to the server's public key the client knows. A Partially-Oblivious PRF (POPRF)
is a variant of a VOPRF wherein client and server interact in computing
F(k, x, y), for some PRF F with server-provided key k, client-provided
input x, and public input y, and client receives proof
that F(k, x, y) was computed using k corresponding to the public key
that the client knows. A POPRF with fixed input y is functionally
equivalent to a VOPRF.</t>
      <t>OPRFs have a variety of applications, including: password-protected secret
sharing schemes <xref target="JKKX16"/>, privacy-preserving password stores <xref target="SJKS17"/>, and
password-authenticated key exchange or PAKE <xref target="OPAQUE"/>.
Verifiable OPRFs are necessary in some applications such as Privacy Pass
<xref target="PRIVACYPASS"/>. Verifiable OPRFs have also been used for
password-protected secret sharing schemes such as that of <xref target="JKK14"/>.</t>
      <t>This document specifies OPRF, VOPRF, and POPRF protocols built upon
prime-order groups. The document describes each protocol variant,
along with application considerations, and their security properties.</t>
      <t>This document represents the consensus of the Crypto Forum Research
Group (CFRG). It is not an IETF product and is not a standard.</t>
      <section anchor="change-log">
        <name>Change log</name>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-20">draft-20</eref>:</t>
        <ul spacing="normal">
          <li>Address IRSG comments.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-19">draft-19</eref>:</t>
        <ul spacing="normal">
          <li>Fix error.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-18">draft-18</eref>:</t>
        <ul spacing="normal">
          <li>Apply editorial suggestions from CFRG chair review.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-17">draft-17</eref>:</t>
        <ul spacing="normal">
          <li>Change how suites are identified and finalize test vectors.</li>
          <li>Apply editorial suggestions from IRTF chair review.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-16">draft-16</eref>:</t>
        <ul spacing="normal">
          <li>Apply editorial suggestions from document shepherd.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-15">draft-15</eref>:</t>
        <ul spacing="normal">
          <li>Apply editorial suggestions from CFRG RGLC.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-14">draft-14</eref>:</t>
        <ul spacing="normal">
          <li>Correct current state of formal analysis for the VOPRF protocol variant.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-13">draft-13</eref>:</t>
        <ul spacing="normal">
          <li>Editorial improvements based on Crypto Panel Review.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-12">draft-12</eref>:</t>
        <ul spacing="normal">
          <li>Small editorial fixes</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-11">draft-11</eref>:</t>
        <ul spacing="normal">
          <li>Change Evaluate to BlindEvaluate, and add Evaluate for PRF evaluation</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-10">draft-10</eref>:</t>
        <ul spacing="normal">
          <li>Editorial improvements</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-09">draft-09</eref>:</t>
        <ul spacing="normal">
          <li>Split syntax for OPRF, VOPRF, and POPRF functionalities.</li>
          <li>Make Blind function fallible for invalid private and public inputs.</li>
          <li>Specify key generation.</li>
          <li>Remove serialization steps from core protocol functions.</li>
          <li>Refactor protocol presentation for clarity.</li>
          <li>Simplify security considerations.</li>
          <li>Update application interface considerations.</li>
          <li>Update test vectors.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-08">draft-08</eref>:</t>
        <ul spacing="normal">
          <li>Adopt partially-oblivious PRF construction from <xref target="TCRSTW21"/>.</li>
          <li>Update P-384 suite to use SHA-384 instead of SHA-512.</li>
          <li>Update test vectors.</li>
          <li>Apply various editorial changes.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-07">draft-07</eref>:</t>
        <ul spacing="normal">
          <li>Bind blinding mechanism to mode (additive for verifiable mode and
multiplicative for base mode).</li>
          <li>Add explicit errors for deserialization.</li>
          <li>Document explicit errors and API considerations.</li>
          <li>Adopt SHAKE-256 for decaf448 ciphersuite.</li>
          <li>Normalize HashToScalar functionality for all ciphersuites.</li>
          <li>Refactor and generalize DLEQ proof functionality and domain separation
tags for use in other protocols.</li>
          <li>Update test vectors.</li>
          <li>Apply various editorial changes.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-06">draft-06</eref>:</t>
        <ul spacing="normal">
          <li>Specify of group element and scalar serialization.</li>
          <li>Remove info parameter from the protocol API and update domain separation guidance.</li>
          <li>Fold Unblind function into Finalize.</li>
          <li>Optimize ComputeComposites for servers (using knowledge of the private key).</li>
          <li>Specify deterministic key generation method.</li>
          <li>Update test vectors.</li>
          <li>Apply various editorial changes.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-05">draft-05</eref>:</t>
        <ul spacing="normal">
          <li>Move to ristretto255 and decaf448 ciphersuites.</li>
          <li>Clean up ciphersuite definitions.</li>
          <li>Pin domain separation tag construction to draft version.</li>
          <li>Move key generation outside of context construction functions.</li>
          <li>Editorial changes.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-04">draft-04</eref>:</t>
        <ul spacing="normal">
          <li>Introduce Client and Server contexts for controlling verifiability and
required functionality.</li>
          <li>Condense API.</li>
          <li>Remove batching from standard functionality (included as an extension)</li>
          <li>Add Curve25519 and P-256 ciphersuites for applications that prevent
strong-DH oracle attacks.</li>
          <li>Provide explicit prime-order group API and instantiation advice for
each ciphersuite.</li>
          <li>Proof-of-concept implementation in sage.</li>
          <li>Remove privacy considerations advice as this depends on applications.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-03">draft-03</eref>:</t>
        <ul spacing="normal">
          <li>Certify public key during VerifiableFinalize.</li>
          <li>Remove protocol integration advice.</li>
          <li>Add text discussing how to perform domain separation.</li>
          <li>Drop OPRF_/VOPRF_ prefix from algorithm names.</li>
          <li>Make prime-order group assumption explicit.</li>
          <li>Changes to algorithms accepting batched inputs.</li>
          <li>Changes to construction of batched DLEQ proofs.</li>
          <li>Updated ciphersuites to be consistent with hash-to-curve and added
OPRF specific ciphersuites.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-02">draft-02</eref>:</t>
        <ul spacing="normal">
          <li>Added section discussing cryptographic security and static DH oracles.</li>
          <li>Updated batched proof algorithms.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-01">draft-01</eref>:</t>
        <ul spacing="normal">
          <li>Updated ciphersuites to be in line with
https://tools.ietf.org/html/draft-irtf-cfrg-hash-to-curve-04.</li>
          <li>Made some necessary modular reductions more explicit.</li>
        </ul>
      </section>
      <section anchor="requirements">
        <name>Requirements</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.</t>
      </section>
      <section anchor="notation-and-terminology">
        <name>Notation and Terminology</name>
        <t>The following functions and notation are used throughout the document.</t>
        <ul spacing="normal">
          <li>For any object <tt>x</tt>, we write <tt>len(x)</tt> to denote its length in bytes.</li>
          <li>For two byte arrays <tt>x</tt> and <tt>y</tt>, write <tt>x || y</tt> to denote their
concatenation.</li>
          <li>I2OSP(x, xLen): Converts a non-negative integer <tt>x</tt> into a byte array
of specified length <tt>xLen</tt> as described in <xref target="RFC8017"/>. Note that
this function returns a byte array in big-endian byte order.</li>
          <li>The notation <tt>T U[N]</tt> refers to an array called U containing N items of type
T. The type <tt>opaque</tt> means one single byte of uninterpreted data. Items of
the array are zero-indexed and referred as <tt>U[j]</tt> such that 0 &lt;= j &lt; N.</li>
        </ul>
        <t>All algorithms and procedures described in this document are laid out
in a Python-like pseudocode. Each function takes a set of inputs and parameters
and produces a set of output values. Parameters become constant values once the
protocol variant and the ciphersuite are fixed.</t>
        <t>The <tt>PrivateInput</tt> data type refers to inputs that are known only to the client
in the protocol, whereas the <tt>PublicInput</tt> data type refers to inputs that are
known to both client and server in the protocol. Both <tt>PrivateInput</tt> and
<tt>PublicInput</tt> are opaque byte strings of arbitrary length no larger than 2<sup>16</sup> - 1 bytes.
This length restriction exists because <tt>PublicInput</tt> and <tt>PrivateInput</tt> values
are length-prefixed with two bytes before use throughout the protocol.</t>
        <t>String values such as "DeriveKeyPair", "Seed-", and "Finalize" are ASCII string literals.</t>
        <t>The following terms are used throughout this document.</t>
        <ul spacing="normal">
          <li>PRF: Pseudorandom Function.</li>
          <li>OPRF: Oblivious Pseudorandom Function.</li>
          <li>VOPRF: Verifiable Oblivious Pseudorandom Function.</li>
          <li>POPRF: Partially Oblivious Pseudorandom Function.</li>
          <li>Client: Protocol initiator. Learns pseudorandom function evaluation as
the output of the protocol.</li>
          <li>Server: Computes the pseudorandom function using a private key. Learns
nothing about the client's input or output.</li>
        </ul>
      </section>
    </section>
    <section anchor="preliminaries">
      <name>Preliminaries</name>
      <t>The protocols in this document have two primary dependencies:</t>
      <ul spacing="normal">
        <li>
          <tt>Group</tt>: A prime-order group implementing the API described below in <xref target="pog"/>.
See <xref target="ciphersuites"/> for specific instances of groups.</li>
        <li>
          <tt>Hash</tt>: A cryptographic hash function whose output length is <tt>Nh</tt> bytes.</li>
      </ul>
      <t><xref target="ciphersuites"/> specifies ciphersuites as combinations of <tt>Group</tt> and <tt>Hash</tt>.</t>
      <section anchor="pog">
        <name>Prime-Order Group</name>
        <t>In this document, we assume the construction of an additive, prime-order
group <tt>Group</tt> for performing all mathematical operations. In prime-order groups,
any element (other than the identity) can generate the other elements of the
group. Usually, one element
is fixed and defined as the group generator. Such groups are
uniquely determined by the choice of the prime <tt>p</tt> that defines the
order of the group. (There may, however, exist different representations
of the group for a single <tt>p</tt>. <xref target="ciphersuites"/> lists specific groups which
indicate both order and representation.)</t>
        <t>The fundamental group operation is addition <tt>+</tt> with identity element
<tt>I</tt>. For any elements <tt>A</tt> and <tt>B</tt> of the group, <tt>A + B = B + A</tt> is
also a member of the group. Also, for any <tt>A</tt> in the group, there exists an element
<tt>-A</tt> such that <tt>A + (-A) = (-A) + A = I</tt>. Scalar multiplication by <tt>r</tt> is
equivalent to the repeated application of the group operation on an
element A with itself <tt>r-1</tt> times, this is denoted as <tt>r*A = A + ... + A</tt>.
For any element <tt>A</tt>, <tt>p*A=I</tt>. The case when the scalar multiplication is
performed on the group generator is denoted as <tt>ScalarMultGen(r)</tt>.
Given two elements A and B, the discrete logarithm problem is to find
an integer k such that B = k*A. Thus, k is the discrete logarithm of
B with respect to the base A.
The set of scalars corresponds to <tt>GF(p)</tt>, a prime field of order p, and are
represented as the set of integers defined by <tt>{0, 1, ..., p-1}</tt>.
This document uses types
<tt>Element</tt> and <tt>Scalar</tt> to denote elements of the group and its set of
scalars, respectively.</t>
        <t>We now detail a number of member functions that can be invoked on a
prime-order group.</t>
        <ul spacing="normal">
          <li>Order(): Outputs the order of the group (i.e. <tt>p</tt>).</li>
          <li>Identity(): Outputs the identity element of the group (i.e. <tt>I</tt>).</li>
          <li>Generator(): Outputs the generator element of the group.</li>
          <li>HashToGroup(x): Deterministically maps
an array of bytes <tt>x</tt> to an element of <tt>Group</tt>. The map must ensure that,
for any adversary receiving <tt>R = HashToGroup(x)</tt>, it is
computationally difficult to reverse the mapping. This function is optionally
parameterized by a domain separation tag (DST); see <xref target="ciphersuites"/>.
Security properties of this function are described
in <xref target="I-D.irtf-cfrg-hash-to-curve"/>.</li>
          <li>HashToScalar(x): Deterministically maps
an array of bytes <tt>x</tt> to an element in GF(p). This function is optionally
parameterized by a DST; see <xref target="ciphersuites"/>. Security properties of this
function are described in <xref section="10.5" sectionFormat="comma" target="I-D.irtf-cfrg-hash-to-curve"/>.</li>
          <li>RandomScalar(): Chooses at random a non-zero element in GF(p).</li>
          <li>ScalarInverse(s): Returns the inverse of input <tt>Scalar</tt> <tt>s</tt> on <tt>GF(p)</tt>.</li>
          <li>SerializeElement(A): Maps an <tt>Element</tt> <tt>A</tt>
to a canonical byte array <tt>buf</tt> of fixed length <tt>Ne</tt>.</li>
          <li>DeserializeElement(buf): Attempts to map a byte array <tt>buf</tt> to
an <tt>Element</tt> <tt>A</tt>, and fails if the input is not the valid canonical byte
representation of an element of the group. This function can raise a
DeserializeError if deserialization fails or <tt>A</tt> is the identity element of
the group; see <xref target="ciphersuites"/> for group-specific input validation steps.</li>
          <li>SerializeScalar(s): Maps a <tt>Scalar</tt> <tt>s</tt> to a canonical
byte array <tt>buf</tt> of fixed length <tt>Ns</tt>.</li>
          <li>DeserializeScalar(buf): Attempts to map a byte array <tt>buf</tt> to a <tt>Scalar</tt> <tt>s</tt>.
This function can raise a DeserializeError if deserialization fails; see
<xref target="ciphersuites"/> for group-specific input validation steps.</li>
        </ul>
        <t><xref target="ciphersuites"/> contains details for the implementation of this interface
for different prime-order groups instantiated over elliptic curves. In
particular, for some choices of elliptic curves, e.g., those detailed in
<xref target="RFC7748"/>, which require accounting for cofactors, <xref target="ciphersuites"/>
describes required steps necessary to ensure the resulting group is of
prime order.</t>
      </section>
      <section anchor="dleq">
        <name>Discrete Logarithm Equivalence Proofs</name>
        <t>A proof of knowledge allows a prover to convince a verifier that some
statement is true. If the prover can generate a proof without interaction
with the verifier, the proof is noninteractive. If the verifier learns
nothing other than whether the statement claimed by the prover is true or
false, the proof is zero-knowledge.</t>
        <t>This section describes a noninteractive zero-knowledge proof for discrete
logarithm equivalence (DLEQ), which is used in the construction of VOPRF and
POPRF. A DLEQ proof demonstrates that two pairs of
group elements have the same discrete logarithm without revealing the
discrete logarithm.</t>
        <t>The DLEQ proof resembles the Chaum-Pedersen <xref target="ChaumPedersen"/> proof, which
is shown to be zero-knowledge by Jarecki, et al. <xref target="JKK14"/> and is
noninteractive after applying the Fiat-Shamir transform <xref target="FS00"/>.
Furthermore, Davidson, et al. <xref target="DGSTV18"/> showed a proof system for
batching DLEQ proofs that has constant-size proofs with respect to the
number of inputs.
The specific DLEQ proof system presented below follows this latter
construction with two modifications: (1) the transcript used to generate
the seed includes more context information, and (2) the individual challenges
for each element in the proof is derived from a seed-prefixed hash-to-scalar
invocation rather than being sampled from a seeded PRNG.
The description is split into
two sub-sections: one for generating the proof, which is done by servers
in the verifiable protocols, and another for verifying the proof, which is
done by clients in the protocol.</t>
        <section anchor="proof-generation">
          <name>Proof Generation</name>
          <t>Generating a proof is done with the <tt>GenerateProof</tt> function, defined below.
Given elements A and B, two non-empty lists of elements C and D of length
<tt>m</tt>, and a scalar k; this function produces a proof that <tt>k*A == B</tt>
and <tt>k*C[i] == D[i]</tt> for each <tt>i</tt> in <tt>[0, ..., m - 1]</tt>.
The output is a value of type Proof, which is a tuple of two Scalar
values. We use the notation <tt>proof[0]</tt> and <tt>proof[1]</tt> to denote
the first and second elements in this tuple, respectively.</t>
          <t><tt>GenerateProof</tt> accepts lists of inputs to amortize the cost of proof
generation. Applications can take advantage of this functionality to
produce a single, constant-sized proof for <tt>m</tt> DLEQ inputs, rather
than <tt>m</tt> proofs for <tt>m</tt> DLEQ inputs.</t>
          <sourcecode type="pseudocode"><![CDATA[
Input:

  Scalar k
  Element A
  Element B
  Element C[m]
  Element D[m]

Output:

  Proof proof

Parameters:

  Group G

def GenerateProof(k, A, B, C, D)
  (M, Z) = ComputeCompositesFast(k, B, C, D)

  r = G.RandomScalar()
  t2 = r * A
  t3 = r * M

  Bm = G.SerializeElement(B)
  a0 = G.SerializeElement(M)
  a1 = G.SerializeElement(Z)
  a2 = G.SerializeElement(t2)
  a3 = G.SerializeElement(t3)

  challengeTranscript =
    I2OSP(len(Bm), 2) || Bm ||
    I2OSP(len(a0), 2) || a0 ||
    I2OSP(len(a1), 2) || a1 ||
    I2OSP(len(a2), 2) || a2 ||
    I2OSP(len(a3), 2) || a3 ||
    "Challenge"

  c = G.HashToScalar(challengeTranscript)
  s = r - c * k

  return [c, s]
]]></sourcecode>
          <t>The helper function ComputeCompositesFast is as defined below, and is an
optimization of the ComputeComposites function for servers since they have
knowledge of the private key.</t>
          <sourcecode type="pseudocode"><![CDATA[
Input:

  Scalar k
  Element B
  Element C[m]
  Element D[m]

Output:

  Element M
  Element Z

Parameters:

  Group G
  PublicInput contextString

def ComputeCompositesFast(k, B, C, D):
  Bm = G.SerializeElement(B)
  seedDST = "Seed-" || contextString
  seedTranscript =
    I2OSP(len(Bm), 2) || Bm ||
    I2OSP(len(seedDST), 2) || seedDST
  seed = Hash(seedTranscript)

  M = G.Identity()
  for i in range(m):
    Ci = G.SerializeElement(C[i])
    Di = G.SerializeElement(D[i])
    compositeTranscript =
      I2OSP(len(seed), 2) || seed || I2OSP(i, 2) ||
      I2OSP(len(Ci), 2) || Ci ||
      I2OSP(len(Di), 2) || Di ||
      "Composite"

    di = G.HashToScalar(compositeTranscript)
    M = di * C[i] + M

  Z = k * M

  return (M, Z)
]]></sourcecode>
          <t>When used in the protocol described in <xref target="protocol"/>, the parameter <tt>contextString</tt> is
as defined in <xref target="offline"/>.</t>
        </section>
        <section anchor="proof-verification">
          <name>Proof Verification</name>
          <t>Verifying a proof is done with the <tt>VerifyProof</tt> function, defined below.
This function takes elements A and B, two non-empty lists of elements C and D
of length <tt>m</tt>, and a Proof value output from <tt>GenerateProof</tt>. It outputs a
single boolean value indicating whether or not the proof is valid for the
given DLEQ inputs. Note this function can verify proofs on lists of inputs
whenever the proof was generated as a batched DLEQ proof with the same inputs.</t>
          <sourcecode type="pseudocode"><![CDATA[
Input:

  Element A
  Element B
  Element C[m]
  Element D[m]
  Proof proof

Output:

  boolean verified

Parameters:

  Group G

def VerifyProof(A, B, C, D, proof):
  (M, Z) = ComputeComposites(B, C, D)
  c = proof[0]
  s = proof[1]

  t2 = ((s * A) + (c * B))
  t3 = ((s * M) + (c * Z))

  Bm = G.SerializeElement(B)
  a0 = G.SerializeElement(M)
  a1 = G.SerializeElement(Z)
  a2 = G.SerializeElement(t2)
  a3 = G.SerializeElement(t3)

  challengeTranscript =
    I2OSP(len(Bm), 2) || Bm ||
    I2OSP(len(a0), 2) || a0 ||
    I2OSP(len(a1), 2) || a1 ||
    I2OSP(len(a2), 2) || a2 ||
    I2OSP(len(a3), 2) || a3 ||
    "Challenge"

  expectedC = G.HashToScalar(challengeTranscript)
  verified = (expectedC == c)

  return verified
]]></sourcecode>
          <t>The definition of <tt>ComputeComposites</tt> is given below.</t>
          <sourcecode type="pseudocode"><![CDATA[
Input:

  Element B
  Element C[m]
  Element D[m]

Output:

  Element M
  Element Z

Parameters:

  Group G
  PublicInput contextString

def ComputeComposites(B, C, D):
  Bm = G.SerializeElement(B)
  seedDST = "Seed-" || contextString
  seedTranscript =
    I2OSP(len(Bm), 2) || Bm ||
    I2OSP(len(seedDST), 2) || seedDST
  seed = Hash(seedTranscript)

  M = G.Identity()
  Z = G.Identity()
  for i in range(m):
    Ci = G.SerializeElement(C[i])
    Di = G.SerializeElement(D[i])
    compositeTranscript =
      I2OSP(len(seed), 2) || seed || I2OSP(i, 2) ||
      I2OSP(len(Ci), 2) || Ci ||
      I2OSP(len(Di), 2) || Di ||
      "Composite"

    di = G.HashToScalar(compositeTranscript)
    M = di * C[i] + M
    Z = di * D[i] + Z

  return (M, Z)
]]></sourcecode>
          <t>When used in the protocol described in <xref target="protocol"/>, the parameter <tt>contextString</tt> is
as defined in <xref target="offline"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="protocol">
      <name>Protocol</name>
      <t>In this section, we define and describe three protocol variants referred to as the
OPRF, VOPRF, and POPRF modes. Each of these variants involve two messages between
client and server but differ slightly in terms of the security properties; see
<xref target="properties"/> for more information. A high level description of the functionality
of each mode follows.</t>
      <t>In the OPRF mode, a client and server interact to compute <tt>output = F(skS, input)</tt>,
where <tt>input</tt> is the client's private input, <tt>skS</tt> is the server's private key,
and <tt>output</tt> is the OPRF output. After the execution of the protocol, the
client learns <tt>output</tt> and the server learns nothing.
This interaction is shown below.</t>
      <figure anchor="fig-oprf">
        <name>OPRF protocol overview</name>
        <artwork><![CDATA[
    Client(input)                                        Server(skS)
  -------------------------------------------------------------------
  blind, blindedElement = Blind(input)

                             blindedElement
                               ---------->

                evaluatedElement = BlindEvaluate(skS, blindedElement)

                             evaluatedElement
                               <----------

  output = Finalize(input, blind, evaluatedElement)
]]></artwork>
      </figure>
      <t>In the VOPRF mode, the client additionally receives proof that the server used
<tt>skS</tt> in computing the function. To achieve verifiability, as in <xref target="JKK14"/>, the
server provides a zero-knowledge proof that the key provided as input by the server in
the <tt>BlindEvaluate</tt> function is the same key as it used to produce the server's public key, <tt>pkS</tt>,
which the client receives as input to the protocol. This proof does not reveal the server's
private key to the client. This interaction is shown below.</t>
      <figure anchor="fig-voprf">
        <name>VOPRF protocol overview with additional proof</name>
        <artwork><![CDATA[
    Client(input, pkS)       <---- pkS ------        Server(skS, pkS)
  -------------------------------------------------------------------
  blind, blindedElement = Blind(input)

                             blindedElement
                               ---------->

              evaluatedElement, proof = BlindEvaluate(skS, pkS,
                                                      blindedElement)

                         evaluatedElement, proof
                               <----------

  output = Finalize(input, blind, evaluatedElement,
                    blindedElement, pkS, proof)
]]></artwork>
      </figure>
      <t>The POPRF mode extends the VOPRF mode such that the client and
server can additionally provide a public input <tt>info</tt> that is used in computing
the pseudorandom function. That is, the client and server interact to compute
<tt>output = F(skS, input, info)</tt> as is shown below.</t>
      <figure anchor="fig-poprf">
        <name>POPRF protocol overview with additional public input</name>
        <artwork><![CDATA[
    Client(input, pkS, info) <---- pkS ------  Server(skS, pkS, info)
  -------------------------------------------------------------------
  blind, blindedElement, tweakedKey = Blind(input, info, pkS)

                             blindedElement
                               ---------->

         evaluatedElement, proof = BlindEvaluate(skS, blindedElement,
                                                 info)

                         evaluatedElement, proof
                               <----------

  output = Finalize(input, blind, evaluatedElement,
                    blindedElement, proof, info, tweakedKey)
]]></artwork>
      </figure>
      <t>Each protocol consists of an offline setup phase and an online phase,
described in <xref target="offline"/> and <xref target="online"/>, respectively. Configuration details
for the offline phase are described in <xref target="configuration"/>.</t>
      <section anchor="configuration">
        <name>Configuration</name>
        <t>Each of the three protocol variants are identified with a one-byte value (in hexadecimal):</t>
        <table anchor="tab-modes">
          <name>Identifiers for protocol variants.</name>
          <thead>
            <tr>
              <th align="left">Mode</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">modeOPRF</td>
              <td align="left">0x00</td>
            </tr>
            <tr>
              <td align="left">modeVOPRF</td>
              <td align="left">0x01</td>
            </tr>
            <tr>
              <td align="left">modePOPRF</td>
              <td align="left">0x02</td>
            </tr>
          </tbody>
        </table>
        <t>Additionally, each protocol variant is instantiated with a ciphersuite,
or suite. Each ciphersuite is identified with an ASCII string identifier,
referred to as identifier; see <xref target="ciphersuites"/> for the set of initial
ciphersuite values.</t>
        <t>The mode and ciphersuite identifier values are combined to create a
"context string" used throughout the protocol with the following function:</t>
        <sourcecode type="pseudocode"><![CDATA[
def CreateContextString(mode, identifier):
  return "OPRFV1-" || I2OSP(mode, 1) || "-" || identifier
]]></sourcecode>
      </section>
      <section anchor="offline">
        <name>Key Generation and Context Setup</name>
        <t>In the offline setup phase, the server generates a fresh, random key
pair (<tt>skS</tt>, <tt>pkS</tt>). There are two ways to generate this key pair.
The first of which is using the <tt>GenerateKeyPair</tt> function described below.</t>
        <sourcecode type="pseudocode"><![CDATA[
Input: None

Output:

  Scalar skS
  Element pkS

Parameters:

  Group G

def GenerateKeyPair():
  skS = G.RandomScalar()
  pkS = G.ScalarMultGen(skS)
  return skS, pkS
]]></sourcecode>
        <t>The second way to generate the key pair is via the deterministic key
generation function <tt>DeriveKeyPair</tt> described in <xref target="derive-key-pair"/>.
Applications and implementations can use either method in practice.</t>
        <t>Also during the offline setup phase, both the client and server create a
context used for executing the online phase of the protocol after agreeing on a
mode and ciphersuite identifier. The context, such as <tt>OPRFServerContext</tt>,
is an implementation-specific data structure that stores a context string and
the relevant key material for each party.</t>
        <t>The OPRF variant server and client contexts are created as follows:</t>
        <sourcecode type="pseudocode"><![CDATA[
def SetupOPRFServer(identifier, skS):
  contextString = CreateContextString(modeOPRF, identifier)
  return OPRFServerContext(contextString, skS)

def SetupOPRFClient(identifier):
  contextString = CreateContextString(modeOPRF, identifier)
  return OPRFClientContext(contextString)
]]></sourcecode>
        <t>The VOPRF variant server and client contexts are created as follows:</t>
        <sourcecode type="pseudocode"><![CDATA[
def SetupVOPRFServer(identifier, skS):
  contextString = CreateContextString(modeVOPRF, identifier)
  return VOPRFServerContext(contextString, skS)

def SetupVOPRFClient(identifier, pkS):
  contextString = CreateContextString(modeVOPRF, identifier)
  return VOPRFClientContext(contextString, pkS)
]]></sourcecode>
        <t>The POPRF variant server and client contexts are created as follows:</t>
        <sourcecode type="pseudocode"><![CDATA[
def SetupPOPRFServer(identifier, skS):
  contextString = CreateContextString(modePOPRF, identifier)
  return POPRFServerContext(contextString, skS)

def SetupPOPRFClient(identifier, pkS):
  contextString = CreateContextString(modePOPRF, identifier)
  return POPRFClientContext(contextString, pkS)
]]></sourcecode>
        <section anchor="derive-key-pair">
          <name>Deterministic Key Generation</name>
          <t>This section describes a deterministic key generation function, <tt>DeriveKeyPair</tt>.
It accepts a seed of <tt>Ns</tt> bytes generated from a cryptographically secure
random number generator and an optional (possibly empty) <tt>info</tt> string.
The constant <tt>Ns</tt> corresponds to the size in bytes of a serialized Scalar
and is defined in <xref target="pog"/>. Note that by design knowledge of <tt>seed</tt> and <tt>info</tt>
is necessary to compute this function, which means that the secrecy of the
output private key (<tt>skS</tt>) depends on the secrecy of <tt>seed</tt> (since the <tt>info</tt>
string is public).</t>
          <sourcecode type="pseudocode"><![CDATA[
Input:

  opaque seed[Ns]
  PublicInput info

Output:

  Scalar skS
  Element pkS

Parameters:

  Group G
  PublicInput contextString

Errors: DeriveKeyPairError

def DeriveKeyPair(seed, info):
  deriveInput = seed || I2OSP(len(info), 2) || info
  counter = 0
  skS = 0
  while skS == 0:
    if counter > 255:
      raise DeriveKeyPairError
    skS = G.HashToScalar(deriveInput || I2OSP(counter, 1),
                          DST = "DeriveKeyPair" || contextString)
    counter = counter + 1
  pkS = G.ScalarMultGen(skS)
  return skS, pkS
]]></sourcecode>
        </section>
      </section>
      <section anchor="online">
        <name>Online Protocol</name>
        <t>In the online phase, the client and server engage in a two message protocol
to compute the protocol output. This section describes the protocol details
for each protocol variant. Throughout each description the following parameters
are assumed to exist:</t>
        <ul spacing="normal">
          <li>G, a prime-order Group implementing the API described in <xref target="pog"/>.</li>
          <li>contextString, a PublicInput domain separation tag constructed during context setup as created in <xref target="configuration"/>.</li>
          <li>skS and pkS, a Scalar and Element representing the private and public keys configured for client and server in <xref target="offline"/>.</li>
        </ul>
        <t>Applications serialize protocol messages between client and server for
transmission. Elements and scalars are serialized to byte arrays, and values
of type Proof are serialized as the concatenation of two serialized scalars.
Deserializing these values can fail, in which case the application MUST abort
the protocol raising a <tt>DeserializeError</tt> failure.</t>
        <t>Applications MUST check that input Element values received over the wire
are not the group identity element. This check is handled after deserializing
Element values; see <xref target="ciphersuites"/> for more information and requirements
on input validation for each ciphersuite.</t>
        <section anchor="oprf">
          <name>OPRF Protocol</name>
          <t>The OPRF protocol begins with the client blinding its input, as described
by the <tt>Blind</tt> function below. Note that this function can fail with an
<tt>InvalidInputError</tt> error for certain inputs that map to the group identity
element. Dealing with this failure is an application-specific decision;
see <xref target="errors"/>.</t>
          <sourcecode type="pseudocode"><![CDATA[
Input:

  PrivateInput input

Output:

  Scalar blind
  Element blindedElement

Parameters:

  Group G

Errors: InvalidInputError

def Blind(input):
  blind = G.RandomScalar()
  inputElement = G.HashToGroup(input)
  if inputElement == G.Identity():
    raise InvalidInputError
  blindedElement = blind * inputElement

  return blind, blindedElement
]]></sourcecode>
          <t>Clients store <tt>blind</tt> locally, and send <tt>blindedElement</tt> to the server for evaluation.
Upon receipt, servers process <tt>blindedElement</tt> using the <tt>BlindEvaluate</tt> function described
below.</t>
          <sourcecode type="pseudocode"><![CDATA[
Input:

  Scalar skS
  Element blindedElement

Output:

  Element evaluatedElement

def BlindEvaluate(skS, blindedElement):
  evaluatedElement = skS * blindedElement
  return evaluatedElement
]]></sourcecode>
          <t>Servers send the output <tt>evaluatedElement</tt> to clients for processing.
Recall that servers may process multiple client inputs by applying the
<tt>BlindEvaluate</tt> function to each <tt>blindedElement</tt> received, and returning an
array with the corresponding <tt>evaluatedElement</tt> values.</t>
          <t>Upon receipt of <tt>evaluatedElement</tt>, clients process it to complete the
OPRF evaluation with the <tt>Finalize</tt> function described below.</t>
          <sourcecode type="pseudocode"><![CDATA[
Input:

  PrivateInput input
  Scalar blind
  Element evaluatedElement

Output:

  opaque output[Nh]

Parameters:

  Group G

def Finalize(input, blind, evaluatedElement):
  N = G.ScalarInverse(blind) * evaluatedElement
  unblindedElement = G.SerializeElement(N)

  hashInput = I2OSP(len(input), 2) || input ||
              I2OSP(len(unblindedElement), 2) || unblindedElement ||
              "Finalize"
  return Hash(hashInput)
]]></sourcecode>
          <t>An entity which knows both the secret key and the input can compute the PRF
result using the following <tt>Evaluate</tt> function.</t>
          <sourcecode type="pseudocode"><![CDATA[
Input:

  Scalar skS
  PrivateInput input

Output:

  opaque output[Nh]

Parameters:

  Group G

Errors: InvalidInputError

def Evaluate(skS, input):
  inputElement = G.HashToGroup(input)
  if inputElement == G.Identity():
    raise InvalidInputError
  evaluatedElement = skS * inputElement
  issuedElement = G.SerializeElement(evaluatedElement)

  hashInput = I2OSP(len(input), 2) || input ||
              I2OSP(len(issuedElement), 2) || issuedElement ||
              "Finalize"
  return Hash(hashInput)
]]></sourcecode>
        </section>
        <section anchor="voprf">
          <name>VOPRF Protocol</name>
          <t>The VOPRF protocol begins with the client blinding its input, using the same
<tt>Blind</tt> function as in <xref target="oprf"/>. Clients store the output <tt>blind</tt> locally
and send <tt>blindedElement</tt> to the server for evaluation. Upon receipt,
servers process <tt>blindedElement</tt> to compute an evaluated element and DLEQ
proof using the following <tt>BlindEvaluate</tt> function.</t>
          <sourcecode type="pseudocode"><![CDATA[
Input:

  Scalar skS
  Element pkS
  Element blindedElement

Output:

  Element evaluatedElement
  Proof proof

Parameters:

  Group G

def BlindEvaluate(skS, pkS, blindedElement):
  evaluatedElement = skS * blindedElement
  blindedElements = [blindedElement]     // list of length 1
  evaluatedElements = [evaluatedElement] // list of length 1
  proof = GenerateProof(skS, G.Generator(), pkS,
                        blindedElements, evaluatedElements)
  return evaluatedElement, proof
]]></sourcecode>
          <t>In the description above, inputs to <tt>GenerateProof</tt> are one-item
lists. Using larger lists allows servers to batch the evaluation of multiple
elements while producing a single batched DLEQ proof for them.</t>
          <t>The server sends both <tt>evaluatedElement</tt> and <tt>proof</tt> back to the client.
Upon receipt, the client processes both values to complete the VOPRF computation
using the <tt>Finalize</tt> function below.</t>
          <sourcecode type="pseudocode"><![CDATA[
Input:

  PrivateInput input
  Scalar blind
  Element evaluatedElement
  Element blindedElement
  Element pkS
  Proof proof

Output:

  opaque output[Nh]

Parameters:

  Group G

Errors: VerifyError

def Finalize(input, blind, evaluatedElement,
             blindedElement, pkS, proof):
  blindedElements = [blindedElement]     // list of length 1
  evaluatedElements = [evaluatedElement] // list of length 1
  if VerifyProof(G.Generator(), pkS, blindedElements,
                 evaluatedElements, proof) == false:
    raise VerifyError

  N = G.ScalarInverse(blind) * evaluatedElement
  unblindedElement = G.SerializeElement(N)

  hashInput = I2OSP(len(input), 2) || input ||
              I2OSP(len(unblindedElement), 2) || unblindedElement ||
              "Finalize"
  return Hash(hashInput)
]]></sourcecode>
          <t>As in <tt>BlindEvaluate</tt>, inputs to <tt>VerifyProof</tt> are one-item lists. Clients can
verify multiple inputs at once whenever the server produced a batched DLEQ proof
for them.</t>
          <t>Finally, an entity which knows both the secret key and the input can compute the PRF
result using the <tt>Evaluate</tt> function described in <xref target="oprf"/>.</t>
        </section>
        <section anchor="poprf">
          <name>POPRF Protocol</name>
          <t>The POPRF protocol begins with the client blinding its input, using the
following modified <tt>Blind</tt> function. In this step, the client also binds a
public info value, which produces an additional <tt>tweakedKey</tt> to be used later
in the protocol. Note that this function can fail with an
<tt>InvalidInputError</tt> error for certain private inputs that map to the group
identity element, as well as certain public inputs that, if not detected at
this point, will cause server evaluation to fail. Dealing with either failure
is an application-specific decision; see <xref target="errors"/>.</t>
          <sourcecode type="pseudocode"><![CDATA[
Input:

  PrivateInput input
  PublicInput info
  Element pkS

Output:

  Scalar blind
  Element blindedElement
  Element tweakedKey

Parameters:

  Group G

Errors: InvalidInputError

def Blind(input, info, pkS):
  framedInfo = "Info" || I2OSP(len(info), 2) || info
  m = G.HashToScalar(framedInfo)
  T = G.ScalarMultGen(m)
  tweakedKey = T + pkS
  if tweakedKey == G.Identity():
    raise InvalidInputError

  blind = G.RandomScalar()
  inputElement = G.HashToGroup(input)
  if inputElement == G.Identity():
    raise InvalidInputError

  blindedElement = blind * inputElement

  return blind, blindedElement, tweakedKey
]]></sourcecode>
          <t>Clients store the outputs <tt>blind</tt> and <tt>tweakedKey</tt> locally and send <tt>blindedElement</tt> to
the server for evaluation. Upon receipt, servers process <tt>blindedElement</tt> to
compute an evaluated element and DLEQ proof using the following <tt>BlindEvaluate</tt> function.</t>
          <sourcecode type="pseudocode"><![CDATA[
Input:

  Scalar skS
  Element blindedElement
  PublicInput info

Output:

  Element evaluatedElement
  Proof proof

Parameters:

  Group G

Errors: InverseError

def BlindEvaluate(skS, blindedElement, info):
  framedInfo = "Info" || I2OSP(len(info), 2) || info
  m = G.HashToScalar(framedInfo)
  t = skS + m
  if t == 0:
    raise InverseError

  evaluatedElement = G.ScalarInverse(t) * blindedElement

  tweakedKey = G.ScalarMultGen(t)
  evaluatedElements = [evaluatedElement] // list of length 1
  blindedElements = [blindedElement]     // list of length 1
  proof = GenerateProof(t, G.Generator(), tweakedKey,
                        evaluatedElements, blindedElements)

  return evaluatedElement, proof
]]></sourcecode>
          <t>In the description above, inputs to <tt>GenerateProof</tt> are one-item
lists. Using larger lists allows servers to batch the evaluation of multiple
elements while producing a single batched DLEQ proof for them.</t>
          <t><tt>BlindEvaluate</tt> triggers <tt>InverseError</tt> when the function is about to
calculate the inverse of a zero scalar, which does not exist and therefore
yields a failure in the protocol.
This only occurs for <tt>info</tt> values that map to the secret key of the server. Thus,
clients that observe this signal are assumed to know the server secret key. Hence,
this error can be a signal for the server to replace its secret key.</t>
          <t>The server sends both <tt>evaluatedElement</tt> and <tt>proof</tt> back to the client.
Upon receipt, the client processes both values to complete the POPRF computation
using the <tt>Finalize</tt> function below.</t>
          <sourcecode type="pseudocode"><![CDATA[
Input:

  PrivateInput input
  Scalar blind
  Element evaluatedElement
  Element blindedElement
  Proof proof
  PublicInput info
  Element tweakedKey

Output:

  opaque output[Nh]

Parameters:

  Group G

Errors: VerifyError

def Finalize(input, blind, evaluatedElement, blindedElement,
             proof, info, tweakedKey):
  evaluatedElements = [evaluatedElement] // list of length 1
  blindedElements = [blindedElement]     // list of length 1
  if VerifyProof(G.Generator(), tweakedKey, evaluatedElements,
                 blindedElements, proof) == false:
    raise VerifyError

  N = G.ScalarInverse(blind) * evaluatedElement
  unblindedElement = G.SerializeElement(N)

  hashInput = I2OSP(len(input), 2) || input ||
              I2OSP(len(info), 2) || info ||
              I2OSP(len(unblindedElement), 2) || unblindedElement ||
              "Finalize"
  return Hash(hashInput)
]]></sourcecode>
          <t>As in <tt>BlindEvaluate</tt>, inputs to <tt>VerifyProof</tt> are one-item lists.
Clients can verify multiple inputs at once whenever the server produced a
batched DLEQ proof for them.</t>
          <t>Finally, an entity which knows both the secret key and the input can compute
the PRF result using the <tt>Evaluate</tt> function described below.</t>
          <sourcecode type="pseudocode"><![CDATA[
Input:

  Scalar skS
  PrivateInput input
  PublicInput info

Output:

  opaque output[Nh]

Parameters:

  Group G

Errors: InvalidInputError, InverseError

def Evaluate(skS, input, info):
  inputElement = G.HashToGroup(input)
  if inputElement == G.Identity():
    raise InvalidInputError

  framedInfo = "Info" || I2OSP(len(info), 2) || info
  m = G.HashToScalar(framedInfo)
  t = skS + m
  if t == 0:
    raise InverseError
  evaluatedElement = G.ScalarInverse(t) * inputElement
  issuedElement = G.SerializeElement(evaluatedElement)

  hashInput = I2OSP(len(input), 2) || input ||
              I2OSP(len(info), 2) || info ||
              I2OSP(len(issuedElement), 2) || issuedElement ||
              "Finalize"
  return Hash(hashInput)
]]></sourcecode>
        </section>
      </section>
    </section>
    <section anchor="ciphersuites">
      <name>Ciphersuites</name>
      <t>A ciphersuite (also referred to as 'suite' in this document) for the protocol
wraps the functionality required for the protocol to take place. The
ciphersuite should be available to both the client and server, and agreement
on the specific instantiation is assumed throughout.</t>
      <t>A ciphersuite contains instantiations of the following functionalities:</t>
      <ul spacing="normal">
        <li>
          <tt>Group</tt>: A prime-order Group exposing the API detailed in <xref target="pog"/>, with the
generator element defined in the corresponding reference for each group. Each
group also specifies HashToGroup, HashToScalar, and serialization
functionalities. For
HashToGroup, the domain separation tag (DST) is constructed in accordance
with the recommendations in <xref section="3.1" sectionFormat="comma" target="I-D.irtf-cfrg-hash-to-curve"/>.
For HashToScalar, each group specifies an integer order that is used in
reducing integer values to a member of the corresponding scalar field.</li>
        <li>
          <tt>Hash</tt>: A cryptographic hash function whose output length is Nh bytes long.</li>
      </ul>
      <t>This section includes an initial set of ciphersuites with supported groups
and hash functions. It also includes implementation details for each ciphersuite,
focusing on input validation. Future documents can specify additional ciphersuites
as needed provided they meet the requirements in <xref target="suite-requirements"/>.</t>
      <t>For each ciphersuite, <tt>contextString</tt> is that which is computed in the Setup functions.
Applications should take caution in using ciphersuites targeting P-256 and ristretto255.
See <xref target="cryptanalysis"/> for related discussion.</t>
      <section anchor="oprfristretto255-sha-512">
        <name>OPRF(ristretto255, SHA-512)</name>
        <t>This ciphersuite uses ristretto255 <xref target="RISTRETTO"/> for the Group and SHA-512 for the Hash
function. The value of the ciphersuite identifier is "ristretto255-SHA512".</t>
        <ul spacing="normal">
          <li>
            <t>Group: ristretto255 <xref target="RISTRETTO"/>
            </t>
            <ul spacing="normal">
              <li>Order(): Return 2^252 + 27742317777372353535851937790883648493 (see <xref target="RISTRETTO"/>)</li>
              <li>Identity(): As defined in <xref target="RISTRETTO"/>.</li>
              <li>Generator(): As defined in <xref target="RISTRETTO"/>.</li>
              <li>HashToGroup(): Use hash_to_ristretto255
<xref target="I-D.irtf-cfrg-hash-to-curve"/> with DST =
"HashToGroup-" || contextString, and <tt>expand_message</tt> = <tt>expand_message_xmd</tt>
using SHA-512.</li>
              <li>HashToScalar(): Compute <tt>uniform_bytes</tt> using <tt>expand_message</tt> = <tt>expand_message_xmd</tt>,
DST = "HashToScalar-" || contextString, and output length 64, interpret
<tt>uniform_bytes</tt> as a 512-bit integer in little-endian order, and reduce the
integer modulo <tt>Group.Order()</tt>.</li>
              <li>ScalarInverse(s): Returns the multiplicative inverse of input Scalar <tt>s</tt> mod <tt>Group.Order()</tt>.</li>
              <li>RandomScalar(): Implemented by returning a uniformly random Scalar in the range
[0, <tt>G.Order()</tt> - 1]. Refer to <xref target="random-scalar"/> for implementation guidance.</li>
              <li>SerializeElement(A): Implemented using the 'Encode' function from Section 4.3.2 of <xref target="RISTRETTO"/>; Ne = 32.</li>
              <li>DeserializeElement(buf): Implemented using the 'Decode' function from Section 4.3.1 of <xref target="RISTRETTO"/>.
Additionally, this function validates that the resulting element is not the group
identity element. If these checks fail, deserialization returns an InputValidationError error.</li>
              <li>SerializeScalar(s): Implemented by outputting the little-endian 32-byte encoding of
the Scalar value with the top three bits set to zero; Ns = 32.</li>
              <li>DeserializeScalar(buf): Implemented by attempting to deserialize a Scalar from a
little-endian 32-byte string. This function can fail if the input does not
represent a Scalar in the range [0, <tt>G.Order()</tt> - 1]. Note that this means the
top three bits of the input MUST be zero.</li>
            </ul>
          </li>
          <li>Hash: SHA-512; Nh = 64.</li>
        </ul>
      </section>
      <section anchor="oprfdecaf448-shake-256">
        <name>OPRF(decaf448, SHAKE-256)</name>
        <t>This ciphersuite uses decaf448 <xref target="RISTRETTO"/> for the Group and SHAKE-256 for the Hash
function. The value of the ciphersuite identifier is "decaf448-SHAKE256".</t>
        <ul spacing="normal">
          <li>
            <t>Group: decaf448 <xref target="RISTRETTO"/>
            </t>
            <ul spacing="normal">
              <li>Order(): Return 2^446 - 13818066809895115352007386748515426880336692474882178609894547503885</li>
              <li>Identity(): As defined in <xref target="RISTRETTO"/>.</li>
              <li>Generator(): As defined in <xref target="RISTRETTO"/>.</li>
              <li>RandomScalar(): Implemented by returning a uniformly random Scalar in the range
[0, <tt>G.Order()</tt> - 1]. Refer to <xref target="random-scalar"/> for implementation guidance.</li>
              <li>HashToGroup(): Use hash_to_decaf448
<xref target="I-D.irtf-cfrg-hash-to-curve"/> with DST =
"HashToGroup-" || contextString, and <tt>expand_message</tt> = <tt>expand_message_xof</tt>
using SHAKE-256.</li>
              <li>HashToScalar(): Compute <tt>uniform_bytes</tt> using <tt>expand_message</tt> = <tt>expand_message_xof</tt>,
DST = "HashToScalar-" || contextString, and output length 64, interpret
<tt>uniform_bytes</tt> as a 512-bit integer in little-endian order, and reduce the
integer modulo <tt>Group.Order()</tt>.</li>
              <li>ScalarInverse(s): Returns the multiplicative inverse of input Scalar <tt>s</tt> mod <tt>Group.Order()</tt>.</li>
              <li>SerializeElement(A): Implemented using the 'Encode' function from Section 5.3.2 of <xref target="RISTRETTO"/>; Ne = 56.</li>
              <li>DeserializeElement(buf): Implemented using the 'Decode' function from Section 5.3.1 of <xref target="RISTRETTO"/>.
Additionally, this function validates that the resulting element is not the group
identity element. If these checks fail, deserialization returns an InputValidationError error.</li>
              <li>SerializeScalar(s): Implemented by outputting the little-endian 56-byte encoding of
the Scalar value; Ns = 56.</li>
              <li>DeserializeScalar(buf): Implemented by attempting to deserialize a Scalar from a
little-endian 56-byte string. This function can fail if the input does not
represent a Scalar in the range [0, <tt>G.Order()</tt> - 1].</li>
            </ul>
          </li>
          <li>Hash: SHAKE-256; Nh = 64.</li>
        </ul>
      </section>
      <section anchor="oprfp-256-sha-256">
        <name>OPRF(P-256, SHA-256)</name>
        <t>This ciphersuite uses P-256 <xref target="NISTCurves"/> for the Group and SHA-256 for the Hash
function. The value of the ciphersuite identifier is "P256-SHA256".</t>
        <ul spacing="normal">
          <li>
            <t>Group: P-256 (secp256r1) <xref target="NISTCurves"/>
            </t>
            <ul spacing="normal">
              <li>Order(): Return 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551.</li>
              <li>Identity(): As defined in <xref target="NISTCurves"/>.</li>
              <li>Generator(): As defined in <xref target="NISTCurves"/>.</li>
              <li>RandomScalar(): Implemented by returning a uniformly random Scalar in the range
[0, <tt>G.Order()</tt> - 1]. Refer to <xref target="random-scalar"/> for implementation guidance.</li>
              <li>HashToGroup(): Use hash_to_curve with suite P256_XMD:SHA-256_SSWU_RO_
<xref target="I-D.irtf-cfrg-hash-to-curve"/> and DST =
"HashToGroup-" || contextString.</li>
              <li>HashToScalar(): Use hash_to_field from <xref target="I-D.irtf-cfrg-hash-to-curve"/>
using L = 48, <tt>expand_message_xmd</tt> with SHA-256,
DST = "HashToScalar-" || contextString, and
prime modulus equal to <tt>Group.Order()</tt>.</li>
              <li>ScalarInverse(s): Returns the multiplicative inverse of input Scalar <tt>s</tt> mod <tt>Group.Order()</tt>.</li>
              <li>SerializeElement(A): Implemented using the compressed Elliptic-Curve-Point-to-Octet-String
method according to <xref target="SEC1"/>;  Ne = 33.</li>
              <li>DeserializeElement(buf): Implemented by attempting to deserialize a 33 byte input string to
a public key using the compressed Octet-String-to-Elliptic-Curve-Point method according to <xref target="SEC1"/>,
and then performs partial public-key validation as defined in section 5.6.2.3.4 of
<xref target="KEYAGREEMENT"/>. This includes checking that the
coordinates of the resulting point are in the correct range, that the point is on
the curve, and that the point is not the group identity element.
If these checks fail, deserialization returns an InputValidationError error.</li>
              <li>SerializeScalar(s): Implemented using the Field-Element-to-Octet-String conversion
according to <xref target="SEC1"/>; Ns = 32.</li>
              <li>DeserializeScalar(buf): Implemented by attempting to deserialize a Scalar from a 32-byte
string using Octet-String-to-Field-Element from <xref target="SEC1"/>. This function can fail if the
input does not represent a Scalar in the range [0, <tt>G.Order()</tt> - 1].</li>
            </ul>
          </li>
          <li>Hash: SHA-256; Nh = 32.</li>
        </ul>
      </section>
      <section anchor="oprfp-384-sha-384">
        <name>OPRF(P-384, SHA-384)</name>
        <t>This ciphersuite uses P-384 <xref target="NISTCurves"/> for the Group and SHA-384 for the Hash
function. The value of the ciphersuite identifier is "P384-SHA384".</t>
        <ul spacing="normal">
          <li>
            <t>Group: P-384 (secp384r1) <xref target="NISTCurves"/>
            </t>
            <ul spacing="normal">
              <li>Order(): Return 0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973.</li>
              <li>Identity(): As defined in <xref target="NISTCurves"/>.</li>
              <li>Generator(): As defined in <xref target="NISTCurves"/>.</li>
              <li>RandomScalar(): Implemented by returning a uniformly random Scalar in the range
[0, <tt>G.Order()</tt> - 1]. Refer to <xref target="random-scalar"/> for implementation guidance.</li>
              <li>HashToGroup(): Use hash_to_curve with suite P384_XMD:SHA-384_SSWU_RO_
<xref target="I-D.irtf-cfrg-hash-to-curve"/> and DST =
"HashToGroup-" || contextString.</li>
              <li>HashToScalar(): Use hash_to_field from <xref target="I-D.irtf-cfrg-hash-to-curve"/>
using L = 72, <tt>expand_message_xmd</tt> with SHA-384,
DST = "HashToScalar-" || contextString, and
prime modulus equal to <tt>Group.Order()</tt>.</li>
              <li>ScalarInverse(s): Returns the multiplicative inverse of input Scalar <tt>s</tt> mod <tt>Group.Order()</tt>.</li>
              <li>SerializeElement(A): Implemented using the compressed Elliptic-Curve-Point-to-Octet-String
method according to <xref target="SEC1"/>; Ne = 49.</li>
              <li>DeserializeElement(buf): Implemented by attempting to deserialize a 49-byte array  to
a public key using the compressed Octet-String-to-Elliptic-Curve-Point method according to <xref target="SEC1"/>,
and then performs partial public-key validation as defined in section 5.6.2.3.4 of
<xref target="KEYAGREEMENT"/>. This includes checking that the
coordinates of the resulting point are in the correct range, that the point is on
the curve, and that the point is not the point at infinity. Additionally, this function
validates that the resulting element is not the group identity element.
If these checks fail, deserialization returns an InputValidationError error.</li>
              <li>SerializeScalar(s): Implemented using the Field-Element-to-Octet-String conversion
according to <xref target="SEC1"/>; Ns = 48.</li>
              <li>DeserializeScalar(buf): Implemented by attempting to deserialize a Scalar from a 48-byte
string using Octet-String-to-Field-Element from <xref target="SEC1"/>. This function can fail if the
input does not represent a Scalar in the range [0, <tt>G.Order()</tt> - 1].</li>
            </ul>
          </li>
          <li>Hash: SHA-384; Nh = 48.</li>
        </ul>
      </section>
      <section anchor="oprfp-521-sha-512">
        <name>OPRF(P-521, SHA-512)</name>
        <t>This ciphersuite uses P-521 <xref target="NISTCurves"/> for the Group and SHA-512 for the Hash
function. The value of the ciphersuite identifier is "P521-SHA512".</t>
        <ul spacing="normal">
          <li>
            <t>Group: P-521 (secp521r1) <xref target="NISTCurves"/>
            </t>
            <ul spacing="normal">
              <li>Order(): Return 0x01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409.</li>
              <li>Identity(): As defined in <xref target="NISTCurves"/>.</li>
              <li>Generator(): As defined in <xref target="NISTCurves"/>.</li>
              <li>RandomScalar(): Implemented by returning a uniformly random Scalar in the range
[0, <tt>G.Order()</tt> - 1]. Refer to <xref target="random-scalar"/> for implementation guidance.</li>
              <li>HashToGroup(): Use hash_to_curve with suite P521_XMD:SHA-512_SSWU_RO_
<xref target="I-D.irtf-cfrg-hash-to-curve"/> and DST =
"HashToGroup-" || contextString.</li>
              <li>HashToScalar(): Use hash_to_field from <xref target="I-D.irtf-cfrg-hash-to-curve"/>
using L = 98, <tt>expand_message_xmd</tt> with SHA-512,
DST = "HashToScalar-" || contextString, and
prime modulus equal to <tt>Group.Order()</tt>.</li>
              <li>ScalarInverse(s): Returns the multiplicative inverse of input Scalar <tt>s</tt> mod <tt>Group.Order()</tt>.</li>
              <li>SerializeElement(A): Implemented using the compressed Elliptic-Curve-Point-to-Octet-String
method according to <xref target="SEC1"/>; Ne = 67.</li>
              <li>DeserializeElement(buf): Implemented by attempting to deserialize a 49 byte input string to
a public key using the compressed Octet-String-to-Elliptic-Curve-Point method according to <xref target="SEC1"/>,
and then performs partial public-key validation as defined in section 5.6.2.3.4 of
<xref target="KEYAGREEMENT"/>. This includes checking that the
coordinates of the resulting point are in the correct range, that the point is on
the curve, and that the point is not the point at infinity. Additionally, this function
validates that the resulting element is not the group identity element.
If these checks fail, deserialization returns an InputValidationError error.</li>
              <li>SerializeScalar(s): Implemented using the Field-Element-to-Octet-String conversion
according to <xref target="SEC1"/>; Ns = 66.</li>
              <li>DeserializeScalar(buf): Implemented by attempting to deserialize a Scalar from a 66-byte
string using Octet-String-to-Field-Element from <xref target="SEC1"/>. This function can fail if the
input does not represent a Scalar in the range [0, <tt>G.Order()</tt> - 1].</li>
            </ul>
          </li>
          <li>Hash: SHA-512; Nh = 64.</li>
        </ul>
      </section>
      <section anchor="suite-requirements">
        <name>Future Ciphersuites</name>
        <t>A critical requirement of implementing the prime-order group using
elliptic curves is a method to instantiate the function
<tt>HashToGroup</tt>, that maps inputs to group elements. In the elliptic
curve setting, this deterministically maps inputs (as byte arrays) to
uniformly chosen points on the curve.</t>
        <t>In the security proof of the construction Hash is modeled as a random
oracle. This implies that any instantiation of <tt>HashToGroup</tt> must be
pre-image and collision resistant. In <xref target="ciphersuites"/> we give
instantiations of this functionality based on the functions described in
<xref target="I-D.irtf-cfrg-hash-to-curve"/>. Consequently, any OPRF implementation
must adhere to the implementation and security considerations discussed
in <xref target="I-D.irtf-cfrg-hash-to-curve"/> when instantiating the function.</t>
        <t>The DeserializeElement and DeserializeScalar functions instantiated for a
particular prime-order group corresponding to a ciphersuite MUST adhere to
the description in <xref target="pog"/>. Future ciphersuites MUST describe how input
validation is done for DeserializeElement and DeserializeScalar.</t>
        <t>Additionally, future ciphersuites must take care when choosing the
security level of the group. See <xref target="limits"/> for additional details.</t>
      </section>
      <section anchor="random-scalar">
        <name>Random Scalar Generation</name>
        <t>Two popular algorithms for generating a random integer uniformly distributed in
the range [0, G.Order() -1] are as follows:</t>
        <section anchor="rejection-sampling">
          <name>Rejection Sampling</name>
          <t>Generate a random byte array with <tt>Ns</tt> bytes, and attempt to map to a Scalar
by calling <tt>DeserializeScalar</tt> in constant time. If it succeeds, return the
result. If it fails, try again with another random byte array, until the
procedure succeeds. Failure to implement <tt>DeserializeScalar</tt> in constant time
can leak information about the underlying corresponding Scalar.</t>
          <t>As an optimization, if the group order is very close to a power of
2, it is acceptable to omit the rejection test completely.  In
particular, if the group order is p, and there is an integer b
such that |p - 2<sup>b</sup>| is less than 2<sup>(b/2)</sup>, then
<tt>RandomScalar</tt> can simply return a uniformly random integer of at
most b bits.</t>
        </section>
        <section anchor="random-number-generation-using-extra-random-bits">
          <name>Random Number Generation Using Extra Random Bits</name>
          <t>Generate a random byte array with <tt>L = ceil(((3 * ceil(log2(G.Order()))) / 2) / 8)</tt>
bytes, and interpret it as an integer; reduce the integer modulo <tt>G.Order()</tt> and return the
result. See <xref section="5" sectionFormat="comma" target="I-D.irtf-cfrg-hash-to-curve"/> for the underlying derivation of <tt>L</tt>.</t>
        </section>
      </section>
    </section>
    <section anchor="apis">
      <name>Application Considerations</name>
      <t>This section describes considerations for applications, including external interface
recommendations, explicit error treatment, and public input representation for the
POPRF protocol variant.</t>
      <section anchor="input-limits">
        <name>Input Limits</name>
        <t>Application inputs, expressed as PrivateInput or PublicInput values, MUST be smaller
than 2<sup>16</sup>-1 bytes in length. Applications that require longer inputs can use a cryptographic
hash function to map these longer inputs to a fixed-length input that fits within the
PublicInput or PrivateInput length bounds. Note that some cryptographic hash functions
have input length restrictions themselves, but these limits are often large enough to
not be a concern in practice. For example, SHA-256 has an input limit of 2^61 bytes.</t>
      </section>
      <section anchor="external-interface-recommendations">
        <name>External Interface Recommendations</name>
        <t>In <xref target="online"/>, the interface of the protocol functions allows that some inputs
(and outputs) to be group elements and scalars. However, implementations can
instead operate over group elements and scalars internally, and only expose
interfaces that operate with an application-specific format of messages.</t>
      </section>
      <section anchor="errors">
        <name>Error Considerations</name>
        <t>Some OPRF variants specified in this document have fallible operations. For example, <tt>Finalize</tt>
and <tt>BlindEvaluate</tt> can fail if any element received from the peer fails input validation.
The explicit errors generated throughout this specification, along with the
conditions that lead to each error, are as follows:</t>
        <ul spacing="normal">
          <li>
            <tt>VerifyError</tt>: Verifiable OPRF proof verification failed; <xref target="voprf"/> and <xref target="poprf"/>.</li>
          <li>
            <tt>DeserializeError</tt>: Group Element or Scalar deserialization failure; <xref target="pog"/> and <xref target="online"/>.</li>
          <li>
            <tt>InputValidationError</tt>: Validation of byte array inputs failed; <xref target="ciphersuites"/>.</li>
        </ul>
        <t>There are other explicit errors generated in this specification; however, they occur with
negligible probability in practice. We note them here for completeness.</t>
        <ul spacing="normal">
          <li>
            <tt>InvalidInputError</tt>: OPRF Blind input produces an invalid output element; <xref target="oprf"/> and <xref target="poprf"/>.</li>
          <li>
            <tt>InverseError</tt>: A tweaked private key is invalid (has no multiplicative inverse); <xref target="pog"/> and <xref target="online"/>.</li>
        </ul>
        <t>In general, the errors in this document are meant as a guide to implementors.
They are not an exhaustive list of all the errors an implementation might emit.
For example, implementations might run out of memory and return a corresponding error.</t>
      </section>
      <section anchor="poprf-public-input">
        <name>POPRF Public Input</name>
        <t>Functionally, the VOPRF and POPRF variants differ in that the POPRF variant
admits public input, whereas the VOPRF variant does not. Public input allows
clients and servers to cryptographically bind additional data to the POPRF output.
A POPRF with fixed public input is functionally equivalent to a VOPRF. However, there
are differences in the underlying security assumptions made about each variant;
see <xref target="cryptanalysis"/> for more details.</t>
        <t>This public input is known to both parties at the start of the protocol. It is RECOMMENDED
that this public input be constructed with some type of higher-level domain separation
to avoid cross protocol attacks or related issues. For example, protocols using
this construction might ensure that the public input uses a unique, prefix-free encoding.
See <xref section="10.4" sectionFormat="comma" target="I-D.irtf-cfrg-hash-to-curve"/> for further discussion on
constructing domain separation values.</t>
        <t>Implementations of the POPRF may choose to not let applications control <tt>info</tt> in
cases where this value is fixed or otherwise not useful to the application. In this
case, the resulting protocol is functionally equivalent to the VOPRF, which does not
admit public input.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
    <section anchor="sec">
      <name>Security Considerations</name>
      <t>This section discusses the security of the protocols defined in this specification, along
with some suggestions and trade-offs that arise from the implementation
of the protocol variants in this document. Note that the syntax of the POPRF
variant is different from that of the OPRF and VOPRF variants since it
admits an additional public input, but the same security considerations apply.</t>
      <section anchor="properties">
        <name>Security Properties</name>
        <t>The security properties of an OPRF protocol with functionality y = F(k, x)
include those of a standard PRF. Specifically:</t>
        <ul spacing="normal">
          <li>Pseudorandomness: For a random sampling of k, F is pseudorandom if the output
y = F(k, x) on any input x is indistinguishable from uniformly sampling any
element in F's range.</li>
        </ul>
        <t>In other words, consider an adversary that picks inputs x from the
domain of F and evaluates F on (k, x) (without knowledge of randomly
sampled k). Then the output distribution F(k, x) is indistinguishable
from the output distribution of a randomly chosen function with the same
domain and range.</t>
        <t>A consequence of showing that a function is pseudorandom is that it is
necessarily non-malleable (i.e. we cannot compute a new evaluation of F
from an existing evaluation). A genuinely random function will be
non-malleable with high probability, and so a pseudorandom function must
be non-malleable to maintain indistinguishability.</t>
        <ul spacing="normal">
          <li>Unconditional input secrecy: The server does not learn anything about
the client input x, even with unbounded computation.</li>
        </ul>
        <t>In other words, an attacker with infinite computing power cannot recover any
information about the client's private input x from an invocation of the
protocol.</t>
        <t>Essentially, input secrecy is the property that, even if the server learns
the client's private input x at some point in the future, the server cannot
link any particular PRF evaluation to x. This property is
also known as unlinkability <xref target="DGSTV18"/>.</t>
        <t>Beyond client input secret, in the OPRF protocol, the server learns nothing about
the output y of the function, nor does the client learn anything about the
server's private key k.</t>
        <t>For the VOPRF and POPRF protocol variants, there is an additional
security property:</t>
        <ul spacing="normal">
          <li>Verifiable: The client must only complete execution of the protocol if
it can successfully assert that the output it computes is
correct. This is taken with respect to the private key held by the
server.</li>
        </ul>
        <t>Any VOPRF or POPRF that satisfies the 'verifiable' security property is known
as 'verifiable'. In practice, the notion of verifiability requires that
the server commits to the key before the actual protocol execution takes
place. Then the client verifies that the server has used the key in the
protocol using this commitment. In the following, we may also refer to this
commitment as a public key.</t>
        <t>Finally, the POPRF variant also has the following security property:</t>
        <ul spacing="normal">
          <li>Partial obliviousness: The client and server must be able to perform the
PRF on client's private input and public input. Both client and server know
the public input, but similar to the OPRF and VOPRF protocols, the server
learns nothing about the client's private input or the output of the function,
and the client learns nothing about the server's private key.</li>
        </ul>
        <t>This property becomes useful when dealing with key management operations such as
the rotation of server's keys. Note that partial obliviousness only applies
to the POPRF variant because neither the OPRF nor VOPRF variants accept public
input to the protocol.</t>
        <t>Since the POPRF variant has a different syntax than the OPRF and VOPRF variants,
i.e., y = F(k, x, info), the pseudorandomness property is generalized:</t>
        <ul spacing="normal">
          <li>Pseudorandomness: For a random sampling of k, F is pseudorandom if the output
y = F(k, x, info) on any input pairs (x, info) is indistinguishable from uniformly
sampling any element in F's range.</li>
        </ul>
      </section>
      <section anchor="cryptanalysis">
        <name>Security Assumptions</name>
        <t>Below, we discuss the cryptographic security of each protocol variant
from <xref target="protocol"/>, relative to the necessary cryptographic assumptions
that need to be made.</t>
        <section anchor="oprf-and-voprf-assumptions">
          <name>OPRF and VOPRF Assumptions</name>
          <t>The OPRF and VOPRF protocol variants in this document are based on <xref target="JKK14"/>.
In particular, the VOPRF construction is similar to the <xref target="JKK14"/> construction
with the following distinguishing properties:</t>
          <ol spacing="normal" type="1"><li>This document does not use session identifiers to differentiate different instances of the protocol; and</li>
            <li>This document supports batching so that multiple evaluations can happen at once whilst only constructing
one DLEQ proof object. This is enabled using an established batching technique <xref target="DGSTV18"/>.</li>
          </ol>
          <t>The pseudorandomness and input secrecy (and verifiability) of the OPRF (and
VOPRF) protocols in <xref target="JKK14"/> are based on the One-More Gap Computational
Diffie Hellman assumption that is computationally difficult to solve in the corresponding prime-order group.
In <xref target="JKK14"/>, these properties are proven for one instance (i.e., one key) of
the VOPRF protocol, and without batching. There is currently no security
analysis available for the VOPRF protocol described in this document in
a setting with multiple server keys or batching.</t>
        </section>
        <section anchor="poprf-assumptions">
          <name>POPRF Assumptions</name>
          <t>The POPRF construction in this document is based on the construction known
as 3HashSDHI given by <xref target="TCRSTW21"/>. The construction is identical to
3HashSDHI, except that this design can optionally perform multiple POPRF
evaluations in one batch, whilst only constructing one DLEQ proof object.
This is enabled using an established batching technique <xref target="DGSTV18"/>.</t>
          <t>Pseudorandomness, input secrecy, verifiability, and partial obliviousness of the POPRF variant is
based on the assumption that the One-More Gap Strong Diffie-Hellman Inversion (SDHI)
assumption from <xref target="TCRSTW21"/> is computationally difficult to solve in the corresponding
prime-order group. Tyagi et al. <xref target="TCRSTW21"/> show that both the One-More Gap Computational Diffie Hellman assumption
and the One-More Gap SDHI assumption reduce to the q-DL (Discrete Log) assumption
in the algebraic group model, for some q number of <tt>BlindEvaluate</tt> queries.
(The One-More Gap Computational Diffie Hellman assumption was the hardness assumption used to
evaluate the OPRF and VOPRF designs based on <xref target="JKK14"/>, which is a predecessor
to the POPRF variant in <xref target="poprf"/>.)</t>
        </section>
        <section anchor="limits">
          <name>Static Diffie Hellman Attack and Security Limits</name>
          <t>A side-effect of the OPRF protocol variants in this document is that they allow
instantiation of an oracle for constructing static DH samples; see <xref target="BG04"/> and <xref target="Cheon06"/>.
These attacks are meant to recover (bits of) the server private key.
Best-known attacks reduce the security of the prime-order group instantiation by log_2(Q)/2
bits, where Q is the number of <tt>BlindEvaluate</tt> calls made by the attacker.</t>
          <t>As a result of this class of attacks, choosing prime-order groups with a 128-bit security
level instantiates an OPRF with a reduced security level of 128-(log_2(Q)/2) bits of security.
Moreover, such attacks are only possible for those certain applications where the
adversary can query the OPRF directly. Applications can mitigate against this problem
in a variety of ways, e.g., by rate-limiting client queries to <tt>BlindEvaluate</tt> or by
rotating private keys. In applications where such an oracle is not made available
this security loss does not apply.</t>
          <t>In most cases, it would require an informed and persistent attacker to
launch a highly expensive attack to reduce security to anything much
below 100 bits of security. Applications that admit the aforementioned
oracle functionality, and that cannot tolerate discrete logarithm security
of lower than 128 bits, are RECOMMENDED to choose groups that target a
higher security level, such as decaf448 (used by ciphersuite decaf448-SHAKE256),
P-384 (used by ciphersuite P384-SHA384), or P-521 (used by ciphersuite P521-SHA512).</t>
        </section>
      </section>
      <section anchor="domain-separation">
        <name>Domain Separation</name>
        <t>Applications SHOULD construct input to the protocol to provide domain
separation. Any system which has multiple OPRF applications should
distinguish client inputs to ensure the OPRF results are separate.
Guidance for constructing info can be found in <xref section="3.1" sectionFormat="comma" target="I-D.irtf-cfrg-hash-to-curve"/>.</t>
      </section>
      <section anchor="timing-leaks">
        <name>Timing Leaks</name>
        <t>To ensure no information is leaked during protocol execution, all
operations that use secret data MUST run in constant time. This includes
all prime-order group operations and proof-specific operations that
operate on secret data, including <tt>GenerateProof</tt> and <tt>BlindEvaluate</tt>.</t>
      </section>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This document resulted from the work of the Privacy Pass team
<xref target="PrivacyPass"/>. The authors would also like to acknowledge helpful
conversations with Hugo Krawczyk. Eli-Shaoul Khedouri provided
additional review and comments on key consistency. Daniel Bourdrez,
Tatiana Bradley, Sofia Celi, Frank Denis, Julia Hesse, Russ Housley,
Kevin Lewi, Christopher Patton, and Bas Westerbaan also provided
helpful input and contributions to the document.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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="RFC8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty">
              <organization/>
            </author>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski">
              <organization/>
            </author>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson">
              <organization/>
            </author>
            <author fullname="A. Rusch" initials="A." surname="Rusch">
              <organization/>
            </author>
            <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="I-D.irtf-cfrg-hash-to-curve">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="Armando Faz-Hernandez" initials="A." surname="Faz-Hernandez">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Sam Scott" initials="S." surname="Scott">
              <organization>Cornell Tech</organization>
            </author>
            <author fullname="Nick Sullivan" initials="N." surname="Sullivan">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Riad S. Wahby" initials="R. S." surname="Wahby">
              <organization>Stanford University</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="15" month="June" year="2022"/>
            <abstract>
              <t>   This document specifies a number of algorithms for encoding or
   hashing an arbitrary string to a point on an elliptic curve.  This
   document is a product of the Crypto Forum Research Group (CFRG) in
   the IRTF.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-hash-to-curve-16"/>
        </reference>
        <reference anchor="RISTRETTO">
          <front>
            <title>The ristretto255 and decaf448 Groups</title>
            <author fullname="Henry de Valence" initials="H." surname="de Valence">
         </author>
            <author fullname="Jack Grigg" initials="J." surname="Grigg">
         </author>
            <author fullname="Mike Hamburg" initials="M." surname="Hamburg">
         </author>
            <author fullname="Isis Lovecruft" initials="I." surname="Lovecruft">
         </author>
            <author fullname="George Tankersley" initials="G." surname="Tankersley">
         </author>
            <author fullname="Filippo Valsorda" initials="F." surname="Valsorda">
         </author>
            <date day="29" month="November" year="2022"/>
            <abstract>
              <t>   This memo specifies two prime-order groups, ristretto255 and
   decaf448, suitable for safely implementing higher-level and complex
   cryptographic protocols.  The ristretto255 group can be implemented
   using Curve25519, allowing existing Curve25519 implementations to be
   reused and extended to provide a prime-order group.  Likewise, the
   decaf448 group can be implemented using edwards448.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-ristretto255-decaf448-05"/>
        </reference>
        <reference anchor="KEYAGREEMENT">
          <front>
            <title>Recommendation for pair-wise key-establishment schemes using discrete logarithm cryptography</title>
            <author fullname="Elaine Barker" initials="E." surname="Barker">
              <organization/>
            </author>
            <author fullname="Lily Chen" initials="L." surname="Chen">
              <organization/>
            </author>
            <author fullname="Allen Roginsky" initials="A." surname="Roginsky">
              <organization/>
            </author>
            <author fullname="Apostol Vassilev" initials="A." surname="Vassilev">
              <organization/>
            </author>
            <author fullname="Richard Davis" initials="R." surname="Davis">
              <organization/>
            </author>
            <date month="April" year="2018"/>
          </front>
          <seriesInfo name="National Institute of Standards and Technology" value="report"/>
          <seriesInfo name="DOI" value="10.6028/nist.sp.800-56ar3"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC7748">
          <front>
            <title>Elliptic Curves for Security</title>
            <author fullname="A. Langley" initials="A." surname="Langley">
              <organization/>
            </author>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg">
              <organization/>
            </author>
            <author fullname="S. Turner" initials="S." surname="Turner">
              <organization/>
            </author>
            <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="PrivacyPass" target="https://github.com/privacypass/team">
          <front>
            <title>Privacy Pass</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="BG04" target="https://eprint.iacr.org/2004/306">
          <front>
            <title>The Static Diffie-Hellman Problem</title>
            <author initials="D." surname="Brown">
              <organization>Certicom Research</organization>
            </author>
            <author initials="R." surname="Gallant">
              <organization>Certicom Research</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="ChaumPedersen">
          <front>
            <title>Wallet Databases with Observers</title>
            <author fullname="David Chaum" initials="D." surname="Chaum">
              <organization/>
            </author>
            <author fullname="Torben Pryds Pedersen" initials="T." surname="Pedersen">
              <organization/>
            </author>
            <date month="August" year="2007"/>
          </front>
          <seriesInfo name="Advances in Cryptology - CRYPTO' 92" value="pp. 89-105"/>
          <seriesInfo name="DOI" value="10.1007/3-540-48071-4_7"/>
        </reference>
        <reference anchor="Cheon06">
          <front>
            <title>Security Analysis of the Strong Diffie-Hellman Problem</title>
            <author fullname="Jung Hee Cheon" initials="J." surname="Cheon">
              <organization/>
            </author>
            <date year="2006"/>
          </front>
          <seriesInfo name="Advances in Cryptology - EUROCRYPT 2006" value="pp. 1-11"/>
          <seriesInfo name="DOI" value="10.1007/11761679_1"/>
        </reference>
        <reference anchor="FS00">
          <front>
            <title>How To Prove Yourself: Practical Solutions to Identification and Signature Problems</title>
            <author fullname="Amos Fiat" initials="A." surname="Fiat">
              <organization/>
            </author>
            <author fullname="Adi Shamir" initials="A." surname="Shamir">
              <organization/>
            </author>
            <date month="April" year="2007"/>
          </front>
          <seriesInfo name="Advances in Cryptology - CRYPTO' 86" value="pp. 186-194"/>
          <seriesInfo name="DOI" value="10.1007/3-540-47721-7_12"/>
        </reference>
        <reference anchor="JKKX16">
          <front>
            <title>Highly-Efficient and Composable Password-Protected Secret Sharing (Or: How to Protect Your Bitcoin Wallet Online)</title>
            <author fullname="Stanislaw Jarecki" initials="S." surname="Jarecki">
              <organization/>
            </author>
            <author fullname="Aggelos Kiayias" initials="A." surname="Kiayias">
              <organization/>
            </author>
            <author fullname="Hugo Krawczyk" initials="H." surname="Krawczyk">
              <organization/>
            </author>
            <author fullname="Jiayu Xu" initials="J." surname="Xu">
              <organization/>
            </author>
            <date month="March" year="2016"/>
          </front>
          <seriesInfo name="2016 IEEE European Symposium on Security and Privacy" value="(EuroS&amp;P)"/>
          <seriesInfo name="DOI" value="10.1109/eurosp.2016.30"/>
        </reference>
        <reference anchor="JKK14">
          <front>
            <title>Round-Optimal Password-Protected Secret Sharing and T-PAKE in the Password-Only Model</title>
            <author fullname="Stanislaw Jarecki" initials="S." surname="Jarecki">
              <organization/>
            </author>
            <author fullname="Aggelos Kiayias" initials="A." surname="Kiayias">
              <organization/>
            </author>
            <author fullname="Hugo Krawczyk" initials="H." surname="Krawczyk">
              <organization/>
            </author>
            <date year="2014"/>
          </front>
          <seriesInfo name="Lecture Notes in Computer Science" value="pp. 233-253"/>
          <seriesInfo name="DOI" value="10.1007/978-3-662-45608-8_13"/>
        </reference>
        <reference anchor="SJKS17" target="https://doi.org/10.1109/ICDCS.2017.64">
          <front>
            <title>SPHINX: A Password Store that Perfectly Hides Passwords from Itself</title>
            <author initials="M." surname="Shirvanian" fullname="Maliheh Shirvanian">
              <organization/>
            </author>
            <author initials="S." surname="Jarecki" fullname="Stanislaw Jarecki">
              <organization/>
            </author>
            <author initials="H." surname="Krawczyk" fullname="Hugo Krawczyk">
              <organization/>
            </author>
            <author initials="N." surname="Saxena" fullname="Nitesh Saxena">
              <organization/>
            </author>
            <date year="2017" month="June"/>
          </front>
          <seriesInfo name="In" value="2017 IEEE 37th International Conference on Distributed Computing Systems (ICDCS)"/>
          <seriesInfo name="DOI" value="10.1109/ICDCS.2017.64"/>
        </reference>
        <reference anchor="TCRSTW21">
          <front>
            <title>A Fast and Simple Partially Oblivious PRF, with Applications</title>
            <author fullname="Nirvan Tyagi" initials="N." surname="Tyagi">
              <organization/>
            </author>
            <author fullname="Sofía Celi" initials="S." surname="Celi">
              <organization/>
            </author>
            <author fullname="Thomas Ristenpart" initials="T." surname="Ristenpart">
              <organization/>
            </author>
            <author fullname="Nick Sullivan" initials="N." surname="Sullivan">
              <organization/>
            </author>
            <author fullname="Stefano Tessaro" initials="S." surname="Tessaro">
              <organization/>
            </author>
            <author fullname="Christopher A. Wood" initials="C." surname="Wood">
              <organization/>
            </author>
            <date year="2022"/>
          </front>
          <seriesInfo name="Advances in Cryptology - EUROCRYPT 2022" value="pp. 674-705"/>
          <seriesInfo name="DOI" value="10.1007/978-3-031-07085-3_23"/>
        </reference>
        <reference anchor="DGSTV18">
          <front>
            <title>Privacy Pass: Bypassing Internet Challenges Anonymously</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>Royal Holloway, University of London (work completed during an internship at Cloudflare), London , UK</organization>
            </author>
            <author fullname="Ian Goldberg" initials="I." surname="Goldberg">
              <organization>University of Waterloo, Waterloo , Belgium</organization>
            </author>
            <author fullname="Nick Sullivan" initials="N." surname="Sullivan">
              <organization>Cloudflare, San Francisco, California , USA</organization>
            </author>
            <author fullname="George Tankersley" initials="G." surname="Tankersley">
              <organization/>
            </author>
            <author fullname="Filippo Valsorda" initials="F." surname="Valsorda">
              <organization/>
            </author>
            <date month="April" year="2018"/>
          </front>
          <seriesInfo name="Proceedings on Privacy Enhancing Technologies" value="vol. 2018, no. 3, pp. 164-180"/>
          <seriesInfo name="DOI" value="10.1515/popets-2018-0026"/>
        </reference>
        <reference anchor="SEC1" target="https://www.secg.org/sec1-v2.pdf">
          <front>
            <title>SEC 1: Elliptic Curve Cryptography</title>
            <author initials="" surname="Standards for Efficient Cryptography Group (SECG)">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="NISTCurves">
          <front>
            <title>Digital Signature Standard (DSS)</title>
            <author>
              <organization/>
            </author>
            <date month="July" year="2013"/>
          </front>
          <seriesInfo name="National Institute of Standards and Technology" value="report"/>
          <seriesInfo name="DOI" value="10.6028/nist.fips.186-4"/>
        </reference>
        <reference anchor="OPAQUE">
          <front>
            <title>The OPAQUE Asymmetric PAKE Protocol</title>
            <author fullname="Daniel Bourdrez" initials="D." surname="Bourdrez">
         </author>
            <author fullname="Dr. Hugo Krawczyk" initials="H." surname="Krawczyk">
              <organization>Algorand Foundation</organization>
            </author>
            <author fullname="Kevin Lewi" initials="K." surname="Lewi">
              <organization>Novi Research</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="6" month="July" year="2022"/>
            <abstract>
              <t>   This document describes the OPAQUE protocol, a secure asymmetric
   password-authenticated key exchange (aPAKE) that supports mutual
   authentication in a client-server setting without reliance on PKI and
   with security against pre-computation attacks upon server compromise.
   In addition, the protocol provides forward secrecy and the ability to
   hide the password from the server, even during password registration.
   This document specifies the core OPAQUE protocol and one
   instantiation based on 3DH.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-09"/>
        </reference>
        <reference anchor="PRIVACYPASS">
          <front>
            <title>Privacy Pass Issuance Protocol</title>
            <author fullname="Sofia Celi" initials="S." surname="Celi">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Armando Faz-Hernandez" initials="A." surname="Faz-Hernandez">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Steven Valdez" initials="S." surname="Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="30" month="January" year="2023"/>
            <abstract>
              <t>   This document specifies two variants of the two-message issuance
   protocol for Privacy Pass tokens: one that produces tokens that are
   privately verifiable using the issuance private key, and another that
   produces tokens that are publicly verifiable using the issuance
   public key.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-protocol-08"/>
        </reference>
      </references>
    </references>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This section includes test vectors for the protocol variants specified
in this document. For each ciphersuite specified in <xref target="ciphersuites"/>,
there is a set of test vectors for the protocol when run the OPRF,
VOPRF, and POPRF modes. Each test vector lists the batch size for
the evaluation. Each test vector value is encoded as a hexadecimal
byte string. The fields of each test vector are described below.</t>
      <ul spacing="normal">
        <li>"Input": The private client input, an opaque byte string.</li>
        <li>"Info": The public info, an opaque byte string. Only present for POPRF test
 vectors.</li>
        <li>"Blind": The blind value output by <tt>Blind()</tt>, a serialized <tt>Scalar</tt>
of <tt>Ns</tt> bytes long.</li>
        <li>"BlindedElement": The blinded value output by <tt>Blind()</tt>, a serialized
<tt>Element</tt> of <tt>Ne</tt> bytes long.</li>
        <li>"EvaluatedElement": The evaluated element output by <tt>BlindEvaluate()</tt>,
a serialized <tt>Element</tt> of <tt>Ne</tt> bytes long.</li>
        <li>"Proof": The serialized <tt>Proof</tt> output from <tt>GenerateProof()</tt> composed of
two serialized <tt>Scalar</tt> values each of <tt>Ns</tt> bytes long. Only present for
VOPRF and POPRF test vectors.</li>
        <li>"ProofRandomScalar": The random scalar <tt>r</tt> computed in <tt>GenerateProof()</tt>, a
serialized <tt>Scalar</tt> of <tt>Ns</tt> bytes long. Only present for VOPRF and POPRF
test vectors.</li>
        <li>"Output": The protocol output, an opaque byte string of length <tt>Nh</tt> bytes.</li>
      </ul>
      <t>Test vectors with batch size B &gt; 1 have inputs separated by a comma
",". Applicable test vectors will have B different values for the
"Input", "Blind", "BlindedElement", "EvaluationElement", and
"Output" fields.</t>
      <t>The server key material, <tt>pkSm</tt> and <tt>skSm</tt>, are listed under the mode for
each ciphersuite. Both <tt>pkSm</tt> and <tt>skSm</tt> are the serialized values of
<tt>pkS</tt> and <tt>skS</tt>, respectively, as used in the protocol. Each key pair
is derived from a seed <tt>Seed</tt> and info string <tt>KeyInfo</tt>, which are
listed as well, using the <tt>DeriveKeyPair</tt> function from <xref target="offline"/>.</t>
      <section anchor="ristretto255-sha512">
        <name>ristretto255-SHA512</name>
        <section anchor="oprf-mode">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 5ebcea5ee37023ccb9fc2d2019f9d7737be85591ae8652ffa9ef0f4d37063
b0e
]]></artwork>
          <section anchor="test-vector-1-batch-size-1">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = 609a0ae68c15a3cf6903766461307e5c8bb2f95e7e6550e1ffa
2dc99e412803c
EvaluationElement = 7ec6578ae5120958eb2db1745758ff379e77cb64fe77b0b2
d8cc917ea0869c7e
Output = 527759c3d9366f277d8c6020418d96bb393ba2afb20ff90df23fb770826
4e2f3ab9135e3bd69955851de4b1f9fe8a0973396719b7912ba9ee8aa7d0b5e24bcf
6
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = da27ef466870f5f15296299850aa088629945a17d1f5b7f5ff0
43f76b3c06418
EvaluationElement = b4cbf5a4f1eeda5a63ce7b77c7d23f461db3fcab0dd28e4e
17cecb5c90d02c25
Output = f4a74c9c592497375e796aa837e907b1a045d34306a749db9f34221f7e7
50cb4f2a6413a6bf6fa5e19ba6348eb673934a722a7ede2e7621306d18951e7cf2c7
3
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = e6f73f344b79b379f1a0dd37e07ff62e38d9f71345ce62ae3a9bc60b04ccd
909
pkSm = c803e2cc6b05fc15064549b5920659ca4a77b2cca6f04f6b357009335476a
d4e
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-1">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = 863f330cc1a1259ed5a5998a23acfd37fb4351a793a5b3c090b
642ddc439b945
EvaluationElement = aa8fa048764d5623868679402ff6108d2521884fa138cd7f
9c7669a9a014267e
Proof = ddef93772692e535d1a53903db24367355cc2cc78de93b3be5a8ffcc6985
dd066d4346421d17bf5117a2a1ff0fcb2a759f58a539dfbe857a40bce4cf49ec600d
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = b58cfbe118e0cb94d79b5fd6a6dafb98764dff49c14e1770b566e42402d
a1a7da4d8527693914139caee5bd03903af43a491351d23b430948dd50cde10d32b3
c
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-1">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = cc0b2a350101881d8a4cba4c80241d74fb7dcbfde4a61fde2f9
1443c2bf9ef0c
EvaluationElement = 60a59a57208d48aca71e9e850d22674b611f752bed48b36f
7a91b372bd7ad468
Proof = 401a0da6264f8cf45bb2f5264bc31e109155600babb3cd4e5af7d181a2c9
dc0a67154fabf031fd936051dec80b0b6ae29c9503493dde7393b722eafdf5a50b02
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = 8a9a2f3c7f085b65933594309041fc1898d42d0858e59f90814ae90571a
6df60356f4610bf816f27afdd84f47719e480906d27ecd994985890e5f539e7ea74b
6
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706,222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d9881aa6f61d645fc0
e
BlindedElement = 863f330cc1a1259ed5a5998a23acfd37fb4351a793a5b3c090b
642ddc439b945,90a0145ea9da29254c3a56be4fe185465ebb3bf2a1801f7124bbba
dac751e654
EvaluationElement = aa8fa048764d5623868679402ff6108d2521884fa138cd7f
9c7669a9a014267e,cc5ac221950a49ceaa73c8db41b82c20372a4c8d63e5dded2db
920b7eee36a2a
Proof = cc203910175d786927eeb44ea847328047892ddf8590e723c37205cb7460
0b0a5ab5337c8eb4ceae0494c2cf89529dcf94572ed267473d567aeed6ab873dee08
ProofRandomScalar = 419c4f4f5052c53c45f3da494d2b67b220d02118e0857cdb
cf037f9ea84bbe0c
Output = b58cfbe118e0cb94d79b5fd6a6dafb98764dff49c14e1770b566e42402d
a1a7da4d8527693914139caee5bd03903af43a491351d23b430948dd50cde10d32b3
c,8a9a2f3c7f085b65933594309041fc1898d42d0858e59f90814ae90571a6df6035
6f4610bf816f27afdd84f47719e480906d27ecd994985890e5f539e7ea74b6
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 145c79c108538421ac164ecbe131942136d5570b16d8bf41a24d4337da981
e07
pkSm = c647bef38497bc6ec077c22af65b696efa43bff3b4a1975a3e8e0a1c5a79d
631
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-2">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = c8713aa89241d6989ac142f22dba30596db635c772cbf25021f
dd8f3d461f715
EvaluationElement = 1a4b860d808ff19624731e67b5eff20ceb2df3c3c03b906f
5693e2078450d874
Proof = 41ad1a291aa02c80b0915fbfbb0c0afa15a57e2970067a602ddb9e8fd6b7
100de32e1ecff943a36f0b10e3dae6bd266cdeb8adf825d86ef27dbc6c0e30c52206
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = ca688351e88afb1d841fde4401c79efebb2eb75e7998fa9737bd5a82a15
2406d38bd29f680504e54fd4587eddcf2f37a2617ac2fbd2993f7bdf45442ace7d22
1
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-2">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = f0f0b209dd4d5f1844dac679acc7761b91a2e704879656cb7c2
01e82a99ab07d
EvaluationElement = 8c3c9d064c334c6991e99f286ea2301d1bde170b54003fb9
c44c6d7bd6fc1540
Proof = 4c39992d55ffba38232cdac88fe583af8a85441fefd7d1d4a8d0394cd1de
77018bf135c174f20281b3341ab1f453fe72b0293a7398703384bed822bfdeec8908
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = 7c6557b276a137922a0bcfc2aa2b35dd78322bd500235eb6d6b6f91bc5b
56a52de2d65612d503236b321f5d0bebcbc52b64b92e426f29c9b8b69f52de98ae50
7
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-1">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706,222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d9881aa6f61d645fc0
e
BlindedElement = c8713aa89241d6989ac142f22dba30596db635c772cbf25021f
dd8f3d461f715,423a01c072e06eb1cce96d23acce06e1ea64a609d7ec9e9023f304
9f2d64e50c
EvaluationElement = 1a4b860d808ff19624731e67b5eff20ceb2df3c3c03b906f
5693e2078450d874,aa1f16e903841036e38075da8a46655c94fc92341887eb5819f
46312adfc0504
Proof = 43fdb53be399cbd3561186ae480320caa2b9f36cca0e5b160c4a677b8bbf
4301b28f12c36aa8e11e5a7ef551da0781e863a6dc8c0b2bf5a149c9e00621f02006
ProofRandomScalar = 419c4f4f5052c53c45f3da494d2b67b220d02118e0857cdb
cf037f9ea84bbe0c
Output = ca688351e88afb1d841fde4401c79efebb2eb75e7998fa9737bd5a82a15
2406d38bd29f680504e54fd4587eddcf2f37a2617ac2fbd2993f7bdf45442ace7d22
1,7c6557b276a137922a0bcfc2aa2b35dd78322bd500235eb6d6b6f91bc5b56a52de
2d65612d503236b321f5d0bebcbc52b64b92e426f29c9b8b69f52de98ae507
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="decaf448-shake256">
        <name>decaf448-SHAKE256</name>
        <section anchor="oprf-mode-1">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = e8b1375371fd11ebeb224f832dcc16d371b4188951c438f751425699ed29e
cc80c6c13e558ccd67634fd82eac94aa8d1f0d7fee990695d1e
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-3">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = e0ae01c4095f08e03b19baf47ffdc19cb7d98e583160522a3c7
d6a0b2111cd93a126a46b7b41b730cd7fc943d4e28e590ed33ae475885f6c
EvaluationElement = 50ce4e60eed006e22e7027454b5a4b8319eb2bc8ced609eb
19eb3ad42fb19e06ba12d382cbe7ae342a0cad6ead0ef8f91f00bb7f0cd9c0a2
Output = 37d3f7922d9388a15b561de5829bbf654c4089ede89c0ce0f3f85bcdba0
9e382ce0ab3507e021f9e79706a1798ffeac68ebd5cf62e5eb9838c7068351d97ae3
7
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-3">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = 86a88dc5c6331ecfcb1d9aacb50a68213803c462e377577cacc
00af28e15f0ddbc2e3d716f2f39ef95f3ec1314a2c64d940a9f295d8f13bb
EvaluationElement = 162e9fa6e9d527c3cd734a31bf122a34dbd5bcb7bb23651f
1768a7a9274cc116c03b58afa6f0dede3994a60066c76370e7328e7062fd5819
Output = a2a652290055cb0f6f8637a249ee45e32ef4667db0b4c80c0a70d2a6416
4d01525cfdad5d870a694ec77972b9b6ec5d2596a5223e5336913f945101f0137f55
e
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-1">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = e3c01519a076a326a0eb566343e9b21c115fa18e6e85577ddbe890b33104f
cc2835ddfb14a928dc3f5d79b936e17c76b99e0bf6a1680930e
pkSm = 945fc518c47695cf65217ace04b86ac5e4cbe26ca649d52854bb16c494ce0
9069d6add96b20d4b0ae311a87c9a73e3a146b525763ab2f955
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-4">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = 7261bbc335c664ba788f1b1a1a4cd5190cc30e787ef277665ac
1d314f8861e3ec11854ce3ddd42035d9e0f5cddde324c332d8c880abc00eb
EvaluationElement = ca1491a526c28d880806cf0fb0122222392cf495657be6e4
c9d203bceffa46c86406caf8217859d3fb259077af68e5d41b3699410781f467
Proof = f84bbeee47aedf43558dae4b95b3853635a9fc1a9ea7eac9b454c64c66c4
f49cd1c72711c7ac2e06c681e16ea693d5500bbd7b56455df52f69e00b76b4126961
e1562fdbaaac40b7701065cbeece3febbfe09e00160f81775d36daed99d8a2a10be0
759e01b7ee81217203416c9db208
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = e2ac40b634f36cccd8262b285adff7c9dcc19cd308564a5f4e581d1a853
5773b86fa4fc9f2203c370763695c5093aea4a7aedec4488b1340ba3bf663a23098c
1
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-4">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = 88287e553939090b888ddc15913e1807dc4757215555e1c3a79
488ef311594729c7fa74c772a732b78440b7d66d0aa35f3bb316f1d93e1b2
EvaluationElement = c00978c73e8e4ee1d447ab0d3ad1754055e72cc85c08e3a0
db170909a9c61cbff1f1e7015f289e3038b0f341faea5d7780c130106065c231
Proof = 7a2831a6b237e11ac1657d440df93bc5ce00f552e6020a99d5c956ffc4d0
7b5ade3e82ecdc257fd53d76239e733e0a1313e84ce16cc0d82734806092a693d7e8
d3c420c2cb6ccd5d0ca32514fb78e9ad0973ebdcb52eba438fc73948d76339ee7101
21d83e2fe6f001cfdf551aff9f36
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = 862952380e07ec840d9f6e6f909c5a25d16c3dacb586d89a181b4aa7380
c959baa8c480fe8e6c64e089d68ea7aeeb5817bd524d7577905b5bab487690048c94
1
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-2">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112,b1b748135d405ce
48c6973401d9455bb8ccd18b01d0295c0627f67661200dbf9569f73fbb3925daa043
a070e5f953d80bb464ea369e5522b
BlindedElement = 7261bbc335c664ba788f1b1a1a4cd5190cc30e787ef277665ac
1d314f8861e3ec11854ce3ddd42035d9e0f5cddde324c332d8c880abc00eb,2e15f3
93c035492a1573627a3606e528c6294c767c8d43b8c691ef70a52cc7dc7d1b53fe45
8350a270abb7c231b87ba58266f89164f714d9
EvaluationElement = ca1491a526c28d880806cf0fb0122222392cf495657be6e4
c9d203bceffa46c86406caf8217859d3fb259077af68e5d41b3699410781f467,8ec
68e9871b296e81c55647ce64a04fe75d19932f1400544cd601468c60f998408bbb54
6601d4a636e8be279e558d70b95c8d4a4f61892be
Proof = 167d922f0a6ffa845eed07f8aa97b6ac746d902ecbeb18f49c009adc0521
eab1e4d275b74a2dc266b7a194c854e85e7eb54a9a36376dfc04ec7f3bd55fc9618c
3970cb548e064f8a2f06183a5702933dbc3e4c25a73438f2108ee1981c306181003c
7ea92fce963ec7b4ba4f270e6d38
ProofRandomScalar = 63798726803c9451ba405f00ef3acb633ddf0c420574a2ec
6cbf28f840800e355c9fbaac10699686de2724ed22e797a00f3bd93d105a7f23
Output = e2ac40b634f36cccd8262b285adff7c9dcc19cd308564a5f4e581d1a853
5773b86fa4fc9f2203c370763695c5093aea4a7aedec4488b1340ba3bf663a23098c
1,862952380e07ec840d9f6e6f909c5a25d16c3dacb586d89a181b4aa7380c959baa
8c480fe8e6c64e089d68ea7aeeb5817bd524d7577905b5bab487690048c941
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-1">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 792a10dcbd3ba4a52a054f6f39186623208695301e7adb9634b74709ab22d
e402990eb143fd7c67ac66be75e0609705ecea800992aac8e19
pkSm = 6c9d12723a5bbcf305522cc04b4a34d9ced2e12831826018ea7b5dcf54526
47ad262113059bf0f6e4354319951b9d513c74f29cb0eec38c1
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-5">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = 161183c13c6cb33b0e4f9b7365f8c5c12d13c72f8b62d276ca0
9368d093dce9b42198276b9e9d870ac392dda53efd28d1b7e6e8c060cdc42
EvaluationElement = 06ec89dfde25bb2a6f0145ac84b91ac277b35de39ad1d6f4
02a8e46414952ce0d9ea1311a4ece283e2b01558c7078b040cfaa40dd63b3e6c
Proof = 66caee75bf2460429f620f6ad3e811d524cb8ddd848a435fc5d89af48877
abf6506ee341a0b6f67c2d76cd021e5f3d1c9abe5aa9f0dce016da746135fedba2af
41ed1d01659bfd6180d96bc1b7f320c0cb6926011ce392ecca748662564892bae665
16acaac6ca39aadf6fcca95af406
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = 4423f6dcc1740688ea201de57d76824d59cd6b859e1f9884b7eebc49b0b
971358cf9cb075df1536a8ea31bcf55c3e31c2ba9cfa8efe54448d17091daeb9924e
d
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-5">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = 12082b6a381c6c51e85d00f2a3d828cdeab3f5cb19a10b9c014
c33826764ab7e7cfb8b4ff6f411bddb2d64e62a472af1cd816e5b712790c6
EvaluationElement = f2919b7eedc05ab807c221fce2b12c4ae9e19e6909c47845
64b690d1972d2994ca623f273afc67444d84ea40cbc58fcdab7945f321a52848
Proof = a295677c54d1bc4286330907fc2490a7de163da26f9ce03a462a452fea42
2b19ade296ba031359b3b6841e48455d20519ad01b4ac4f0b92e76d3cf16fbef0a3f
72791a8401ef2d7081d361e502e96b2c60608b9fa566f43d4611c2f161d83aabef7f
8017332b26ed1daaf80440772022
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = 8691905500510843902c44bdd9730ab9dc3925aa58ff9dd42765a2baf63
3126de0c3adb93bef5652f38e5827b6396e87643960163a560fc4ac9738c8de4e4a8
d
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-3">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112,b1b748135d405ce
48c6973401d9455bb8ccd18b01d0295c0627f67661200dbf9569f73fbb3925daa043
a070e5f953d80bb464ea369e5522b
BlindedElement = 161183c13c6cb33b0e4f9b7365f8c5c12d13c72f8b62d276ca0
9368d093dce9b42198276b9e9d870ac392dda53efd28d1b7e6e8c060cdc42,fc8847
d43fb4cea4e408f585661a8f2867533fa91d22155d3127a22f18d3b007add480f7d3
00bca93fa47fe87ae06a57b7d0f0d4c30b12f0
EvaluationElement = 06ec89dfde25bb2a6f0145ac84b91ac277b35de39ad1d6f4
02a8e46414952ce0d9ea1311a4ece283e2b01558c7078b040cfaa40dd63b3e6c,2e7
4c626d07de49b1c8c21d87120fd78105f485e36816af9bde3e3efbeef76815326062
fd333925b66c5ce5a20f100bf01770c16609f990a
Proof = fd94db736f97ea4efe9d0d4ad2933072697a6bbeb32834057b23edf7c700
9f011dfa72157f05d2a507c2bbf0b54cad99ab99de05921c021fda7d70e65bcecdb0
5f9a30154127ace983c74d10fd910b554c5e95f6bd1565fd1f3dbbe3c523ece5c72d
57a559b7be1368c4786db4a3c910
ProofRandomScalar = 63798726803c9451ba405f00ef3acb633ddf0c420574a2ec
6cbf28f840800e355c9fbaac10699686de2724ed22e797a00f3bd93d105a7f23
Output = 4423f6dcc1740688ea201de57d76824d59cd6b859e1f9884b7eebc49b0b
971358cf9cb075df1536a8ea31bcf55c3e31c2ba9cfa8efe54448d17091daeb9924e
d,8691905500510843902c44bdd9730ab9dc3925aa58ff9dd42765a2baf633126de0
c3adb93bef5652f38e5827b6396e87643960163a560fc4ac9738c8de4e4a8d
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="p256-sha256">
        <name>P256-SHA256</name>
        <section anchor="oprf-mode-2">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 159749d750713afe245d2d39ccfaae8381c53ce92d098a9375ee70739c7ac
0bf
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-6">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 03723a1e5c09b8b9c18d1dcbca29e8007e95f14f4732d9346d4
90ffc195110368d
EvaluationElement = 030de02ffec47a1fd53efcdd1c6faf5bdc270912b8749e78
3c7ca75bb412958832
Output = a0b34de5fa4c5b6da07e72af73cc507cceeb48981b97b7285fc375345fe
495dd
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-6">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 03cc1df781f1c2240a64d1c297b3f3d16262ef5d4cf10273488
2675c26231b0838
EvaluationElement = 03a0395fe3828f2476ffcd1f4fe540e5a8489322d398be3c
4e5a869db7fcb7c52c
Output = c748ca6dd327f0ce85f4ae3a8cd6d4d5390bbb804c9e12dcf94f853fece
3dcce
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-2">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = ca5d94c8807817669a51b196c34c1b7f8442fde4334a7121ae4736364312f
ca6
pkSm = 03e17e70604bcabe198882c0a1f27a92441e774224ed9c702e51dd17038b1
02462
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-7">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 02dd05901038bb31a6fae01828fd8d0e49e35a486b5c5d4b499
4013648c01277da
EvaluationElement = 0209f33cab60cf8fe69239b0afbcfcd261af4c1c5632624f
2e9ba29b90ae83e4a2
Proof = e7c2b3c5c954c035949f1f74e6bce2ed539a3be267d1481e9ddb178533df
4c2664f69d065c604a4fd953e100b856ad83804eb3845189babfa5a702090d6fc5fa
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 0412e8f78b02c415ab3a288e228978376f99927767ff37c5718d420010a
645a1
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-7">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 03cd0f033e791c4d79dfa9c6ed750f2ac009ec46cd4195ca6fd
3800d1e9b887dbd
EvaluationElement = 030d2985865c693bf7af47ba4d3a3813176576383d19aff0
03ef7b0784a0d83cf1
Proof = 2787d729c57e3d9512d3aa9e8708ad226bc48e0f1750b0767aaff73482c4
4b8d2873d74ec88aebd3504961acea16790a05c542d9fbff4fe269a77510db00abab
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 771e10dcd6bcd3664e23b8f2a710cfaaa8357747c4a8cbba03133967b5c
24f18
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-4">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364,f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b
1
BlindedElement = 02dd05901038bb31a6fae01828fd8d0e49e35a486b5c5d4b499
4013648c01277da,03462e9ae64cae5b83ba98a6b360d942266389ac369b923eb3d5
57213b1922f8ab
EvaluationElement = 0209f33cab60cf8fe69239b0afbcfcd261af4c1c5632624f
2e9ba29b90ae83e4a2,02bb24f4d838414aef052a8f044a6771230ca69c0a5677540
fff738dd31bb69771
Proof = bdcc351707d02a72ce49511c7db990566d29d6153ad6f8982fad2b435d6c
e4d60da1e6b3fa740811bde34dd4fe0aa1b5fe6600d0440c9ddee95ea7fad7a60cf2
ProofRandomScalar = 350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = 0412e8f78b02c415ab3a288e228978376f99927767ff37c5718d420010a
645a1,771e10dcd6bcd3664e23b8f2a710cfaaa8357747c4a8cbba03133967b5c24f
18
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-2">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 6ad2173efa689ef2c27772566ad7ff6e2d59b3b196f00219451fb2c89ee4d
ae2
pkSm = 030d7ff077fddeec965db14b794f0cc1ba9019b04a2f4fcc1fa525dedf72e
2a3e3
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-8">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Info = 7465737420696e666f
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 031563e127099a8f61ed51eeede05d747a8da2be329b40ba1f0
db0b2bd9dd4e2c0
EvaluationElement = 02c5e5300c2d9e6ba7f3f4ad60500ad93a0157e6288eb04b
67e125db024a2c74d2
Proof = f8a33690b87736c854eadfcaab58a59b8d9c03b569110b6f31f8bf7577f3
fbb85a8a0c38468ccde1ba942be501654adb106167c8eb178703ccb42bccffb9231a
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 193a92520bd8fd1f37accb918040a57108daa110dc4f659abe212636d24
5c592
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-8">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 021a440ace8ca667f261c10ac7686adc66a12be31e3520fca31
7643a1eee9dcd4d
EvaluationElement = 0208ca109cbae44f4774fc0bdd2783efdcb868cb4523d521
96f700210e777c5de3
Proof = 043a8fb7fc7fd31e35770cabda4753c5bf0ecc1e88c68d7d35a62bf2631e
875af4613641be2d1875c31d1319d191c4bbc0d04875f4fd03c31d3d17dd8e069b69
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 1e6d164cfd835d88a31401623549bf6b9b306628ef03a7962921d62bc5f
fce8c
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-5">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364,f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b
1
BlindedElement = 031563e127099a8f61ed51eeede05d747a8da2be329b40ba1f0
db0b2bd9dd4e2c0,03ca4ff41c12fadd7a0bc92cf856732b21df652e01a3abdf0fa8
847da053db213c
EvaluationElement = 02c5e5300c2d9e6ba7f3f4ad60500ad93a0157e6288eb04b
67e125db024a2c74d2,02f0b6bcd467343a8d8555a99dc2eed0215c71898c5edb77a
3d97ddd0dbad478e8
Proof = 8fbd85a32c13aba79db4b42e762c00687d6dbf9c8cb97b2a225645ccb00d
9d7580b383c885cdfd07df448d55e06f50f6173405eee5506c0ed0851ff718d13e68
ProofRandomScalar = 350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = 193a92520bd8fd1f37accb918040a57108daa110dc4f659abe212636d24
5c592,1e6d164cfd835d88a31401623549bf6b9b306628ef03a7962921d62bc5ffce
8c
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="p384-sha384">
        <name>P384-SHA384</name>
        <section anchor="oprf-mode-3">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = dfe7ddc41a4646901184f2b432616c8ba6d452f9bcd0c4f75a5150ef2b2ed
02ef40b8b92f60ae591bcabd72a6518f188
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-9">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 02a36bc90e6db34096346eaf8b7bc40ee1113582155ad379700
3ce614c835a874343701d3f2debbd80d97cbe45de6e5f1f
EvaluationElement = 03af2a4fc94770d7a7bf3187ca9cc4faf3732049eded2442
ee50fbddda58b70ae2999366f72498cdbc43e6f2fc184afe30
Output = ed84ad3f31a552f0456e58935fcc0a3039db42e7f356dcb32aa6d487b6b
815a07d5813641fb1398c03ddab5763874357
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-9">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 02def6f418e3484f67a124a2ce1bfb19de7a4af568ede6a1ebb
2733882510ddd43d05f2b1ab5187936a55e50a847a8b900
EvaluationElement = 034e9b9a2960b536f2ef47d8608b21597ba400d5abfa1825
fd21c36b75f927f396bf3716c96129d1fa4a77fa1d479c8d7b
Output = dd4f29da869ab9355d60617b60da0991e22aaab243a3460601e48b07585
9d1c526d36597326f1b985778f781a1682e75
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-3">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 051646b9e6e7a71ae27c1e1d0b87b4381db6d3595eeeb1adb41579adbf992
f4278f9016eafc944edaa2b43183581779d
pkSm = 031d689686c611991b55f1a1d8f4305ccd6cb719446f660a30db61b7aa87b
46acf59b7c0d4a9077b3da21c25dd482229a0
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-10">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 02d338c05cbecb82de13d6700f09cb61190543a7b7e2c6cd4fc
a56887e564ea82653b27fdad383995ea6d02cf26d0e24d9
EvaluationElement = 02a7bba589b3e8672aa19e8fd258de2e6aae20101c8d7612
46de97a6b5ee9cf105febce4327a326255a3c604f63f600ef6
Proof = bfc6cf3859127f5fe25548859856d6b7fa1c7459f0ba5712a806fc091a30
00c42d8ba34ff45f32a52e40533efd2a03bc87f3bf4f9f58028297ccb9ccb18ae718
2bcd1ef239df77e3be65ef147f3acf8bc9cbfc5524b702263414f043e3b7ca2e
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = 3333230886b562ffb8329a8be08fea8025755372817ec969d114d1203d0
26b4a622beab60220bf19078bca35a529b35c
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-10">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 02f27469e059886f221be5f2cca03d2bdc61e55221721c3b3e5
6fc012e36d31ae5f8dc058109591556a6dbd3a8c69c433b
EvaluationElement = 03f16f903947035400e96b7f531a38d4a07ac89a80f89d86
a1bf089c525a92c7f4733729ca30c56ce78b1ab4f7d92db8b4
Proof = d005d6daaad7571414c1e0c75f7e57f2113ca9f4604e84bc90f9be52da89
6fff3bee496dcde2a578ae9df315032585f801fb21c6080ac05672b291e575a40295
b306d967717b28e08fcc8ad1cab47845d16af73b3e643ddcc191208e71c64630
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = b91c70ea3d4d62ba922eb8a7d03809a441e1c3c7af915cbc2226f485213
e895942cd0f8580e6d99f82221e66c40d274f
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-6">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364,803d955f0e073a04aa5d92b3fb739f5
6f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
BlindedElement = 02d338c05cbecb82de13d6700f09cb61190543a7b7e2c6cd4fc
a56887e564ea82653b27fdad383995ea6d02cf26d0e24d9,02fa02470d7f151018b4
1e82223c32fad824de6ad4b5ce9f8e9f98083c9a726de9a1fc39d7a0cb6f4f188dd9
cea01474cd
EvaluationElement = 02a7bba589b3e8672aa19e8fd258de2e6aae20101c8d7612
46de97a6b5ee9cf105febce4327a326255a3c604f63f600ef6,028e9e115625ff4c2
f07bf87ce3fd73fc77994a7a0c1df03d2a630a3d845930e2e63a165b114d98fe34e6
1b68d23c0b50a
Proof = 6d8dcbd2fc95550a02211fb78afd013933f307d21e7d855b0b1ed0af7807
6d8137ad8b0a1bfa05676d325249c1dbb9a52bd81b1c2b7b0efc77cf7b278e1c947f
6283f1d4c513053fc0ad19e026fb0c30654b53d9cea4b87b037271b5d2e2d0ea
ProofRandomScalar = a097e722ed2427de86966910acba9f5c350e8040f828bf6c
eca27405420cdf3d63cb3aef005f40ba51943c8026877963
Output = 3333230886b562ffb8329a8be08fea8025755372817ec969d114d1203d0
26b4a622beab60220bf19078bca35a529b35c,b91c70ea3d4d62ba922eb8a7d03809
a441e1c3c7af915cbc2226f485213e895942cd0f8580e6d99f82221e66c40d274f
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-3">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 5b2690d6954b8fbb159f19935d64133f12770c00b68422559c65431942d72
1ff79d47d7a75906c30b7818ec0f38b7fb2
pkSm = 02f00f0f1de81e5d6cf18140d4926ffdc9b1898c48dc49657ae36eb1e45de
b8b951aaf1f10c82d2eaa6d02aafa3f10d2b6
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-11">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Info = 7465737420696e666f
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 03859b36b95e6564faa85cd3801175eda2949707f6aa0640ad0
93cbf8ad2f58e762f08b56b2a1b42a64953aaf49cbf1ae3
EvaluationElement = 0220710e2e00306453f5b4f574cb6a512453f35c45080d09
373e190c19ce5b185914fbf36582d7e0754bb7c8b683205b91
Proof = 82a17ef41c8b57f1e3122311b4d5cd39a63df0f67443ef18d961f9b659c1
601ced8d3c64b294f604319ca80230380d437a49c7af0d620e22116669c008ebb767
d90283d573b49cdb49e3725889620924c2c4b047a2a6225a3ba27e640ebddd33
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = 0188653cfec38119a6c7dd7948b0f0720460b4310e40824e048bf82a165
27303ed449a08caf84272c3bbc972ede797df
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-11">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 03f7efcb4aaf000263369d8a0621cb96b81b3206e99876de2a0
0699ed4c45acf3969cd6e2319215395955d3f8d8cc1c712
EvaluationElement = 034993c818369927e74b77c400376fd1ae29b6ac6c6ddb77
6cf10e4fbc487826531b3cf0b7c8ca4d92c7af90c9def85ce6
Proof = 693471b5dff0cd6a5c00ea34d7bf127b2795164e3bdb5f39a1e5edfbd13e
443bc516061cd5b8449a473c2ceeccada9f3e5b57302e3d7bc5e28d38d6e3a3056e1
e73b6cc030f5180f8a1ffa45aa923ee66d2ad0a07b500f2acc7fb99b5506465c
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = ff2a527a21cc43b251a567382677f078c6e356336aec069dea8ba369953
43ca3b33bb5d6cf15be4d31a7e6d75b30d3f5
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-7">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364,803d955f0e073a04aa5d92b3fb739f5
6f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
BlindedElement = 03859b36b95e6564faa85cd3801175eda2949707f6aa0640ad0
93cbf8ad2f58e762f08b56b2a1b42a64953aaf49cbf1ae3,021a65d618d645f1a20b
c33b06deaa7e73d6d634c8a56a3d02b53a732b69a5c53c5a207ea33d5afdcde9a22d
59726bce51
EvaluationElement = 0220710e2e00306453f5b4f574cb6a512453f35c45080d09
373e190c19ce5b185914fbf36582d7e0754bb7c8b683205b91,02017657b315ec65e
f861505e596c8645d94685dd7602cdd092a8f1c1c0194a5d0485fe47d071d972ab51
4370174cc23f5
Proof = 4a0b2fe96d5b2a046a0447fe079b77859ef11a39a3520d6ff7c626aad9b4
73b724fb0cf188974ec961710a62162a83e97e0baa9eeada73397032d928b3e97b1e
a92ad9458208302be3681b8ba78bcc17745bac00f84e0fdc98a6a8cba009c080
ProofRandomScalar = a097e722ed2427de86966910acba9f5c350e8040f828bf6c
eca27405420cdf3d63cb3aef005f40ba51943c8026877963
Output = 0188653cfec38119a6c7dd7948b0f0720460b4310e40824e048bf82a165
27303ed449a08caf84272c3bbc972ede797df,ff2a527a21cc43b251a567382677f0
78c6e356336aec069dea8ba36995343ca3b33bb5d6cf15be4d31a7e6d75b30d3f5
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="p521-sha512">
        <name>P521-SHA512</name>
        <section anchor="oprf-mode-4">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 0153441b8faedb0340439036d6aed06d1217b34c42f17f8db4c5cc610a4a9
55d698a688831b16d0dc7713a1aa3611ec60703bffc7dc9c84e3ed673b3dbe1d5fcc
ea6
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-12">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 0300e78bf846b0e1e1a3c320e353d758583cd876df56100a3a1
e62bacba470fa6e0991be1be80b721c50c5fd0c672ba764457acc18c6200704e9294
fbf28859d916351
EvaluationElement = 030166371cf827cb2fb9b581f97907121a16e2dc5d8b10ce
9f0ede7f7d76a0d047657735e8ad07bcda824907b3e5479bd72cdef6b839b967ba5c
58b118b84d26f2ba07
Output = 26232de6fff83f812adadadb6cc05d7bbeee5dca043dbb16b03488abb99
81d0a1ef4351fad52dbd7e759649af393348f7b9717566c19a6b8856284d69375c80
9
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-12">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 0300c28e57e74361d87e0c1874e5f7cc1cc796d61f9cad50427
cf54655cdb455613368d42b27f94bf66f59f53c816db3e95e68e1b113443d66a99b3
693bab88afb556b
EvaluationElement = 0301ad453607e12d0cc11a3359332a40c3a254eaa1afc642
96528d55bed07ba322e72e22cf3bcb50570fd913cb54f7f09c17aff8787af75f6a7f
af5640cbb2d9620a6e
Output = ad1f76ef939042175e007738906ac0336bbd1d51e287ebaa66901abdd32
4ea3ffa40bfc5a68e7939c2845e0fd37a5a6e76dadb9907c6cc8579629757fd4d04b
a
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-4">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 015c7fc1b4a0b1390925bae915bd9f3d72009d44d9241b962428aad5d13f2
2803311e7102632a39addc61ea440810222715c9d2f61f03ea424ec9ab1fe5e31cf9
238
pkSm = 0301505d646f6e4c9102451eb39730c4ba1c4087618641edbdba4a60896b0
7fd0c9414ce553cbf25b81dfcca50a8f6724ab7a2bc4d0cf736967a287bb6084cc06
78ac0
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-13">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 0301d6e4fb545e043ddb6aee5d5ceeee1b44102615ab04430c2
7dd0f56988dedcb1df32ef384f160e0e76e718605f14f3f582f9357553d153b99679
5b4b3628a4f6380
EvaluationElement = 03013fdeaf887f3d3d283a79e696a54b66ff0edcb559265e
204a958acf840e0930cc147e2a6835148d8199eebc26c03e9394c9762a1c991dde40
bca0f8ca003eefb045
Proof = 0077fcc8ec6d059d7759b0a61f871e7c1dadc65333502e09a51994328f79
e5bda3357b9a4f410a1760a3612c2f8f27cb7cb032951c047cc66da60da583df7b24
7edd0188e5eb99c71799af1d80d643af16ffa1545acd9e9233fbb370455b10eb257e
a12a1667c1b4ee5b0ab7c93d50ae89602006960f083ca9adc4f6276c0ad60440393c
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 5e003d9b2fb540b3d4bab5fedd154912246da1ee5e557afd8f56415faa1
a0fadff6517da802ee254437e4f60907b4cda146e7ba19e249eef7be405549f62954
b
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-13">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 03005b05e656cb609ce5ff5faf063bb746d662d67bbd07c0626
38396f52f0392180cf2365cabb0ece8e19048961d35eeae5d5fa872328dce98df076
ee154dd191c615e
EvaluationElement = 0301b19fcf482b1fff04754e282292ed736c5f0aa080d4f4
2663cd3a416c6596f03129e8e096d8671fe5b0d19838312c511d2ce08d431e43e3ef
06199d8cab7426238d
Proof = 01ec9fece444caa6a57032e8963df0e945286f88fbdf233fb5101f0924f7
ea89c47023f5f72f240e61991fd33a299b5b38c45a5e2dd1a67b072e59dfe86708a3
59c701e38d383c60cf6969463bcf13251bedad47b7941f52e409a3591398e2792441
0b18a301c0e19f527cad504fa08388050ac634e1b05c5216d337742f2754e1fc502f
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = fa15eebba81ecf40954f7135cb76f69ef22c6bae394d1a4362f9b03066b
54b6604d39f2e53369ca6762a3d9787e230e832aa85955af40ecb8deebb009a8cf47
4
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-8">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364,015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e073a04aa5d92b3fb7
39f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b
1
BlindedElement = 0301d6e4fb545e043ddb6aee5d5ceeee1b44102615ab04430c2
7dd0f56988dedcb1df32ef384f160e0e76e718605f14f3f582f9357553d153b99679
5b4b3628a4f6380,0301403b597538b939b450c93586ba275f9711ba07e42364bac1
d5769c6824a8b55be6f9a536df46d952b11ab2188363b3d6737635d9543d4dba14a6
e19421b9245bf5
EvaluationElement = 03013fdeaf887f3d3d283a79e696a54b66ff0edcb559265e
204a958acf840e0930cc147e2a6835148d8199eebc26c03e9394c9762a1c991dde40
bca0f8ca003eefb045,03001f96424497e38c46c904978c2fa1636c5c3dd2e634a85
d8a7265977c5dce1f02c7e6c118479f0751767b91a39cce6561998258591b5d7c1bb
02445a9e08e4f3e8d
Proof = 00b4d215c8405e57c7a4b53398caf55f1f1623aaeb22408ddb9ea2913090
9b3f95dbb1ff366e81e86e918f9f2fd8b80dbb344cd498c9499d112905e585417e00
68c600fe5dea18b389ef6c4cc062935607b8ccbbb9a84fba3143868a3e8a58efa0bf
6ca642804d09dc06e980f64837811227c4267b217f1099a4e28b0854f4e5ee659796
ProofRandomScalar = 01ec21c7bb69b0734cb48dfd68433dd93b0fa097e722ed24
27de86966910acba9f5c350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = 5e003d9b2fb540b3d4bab5fedd154912246da1ee5e557afd8f56415faa1
a0fadff6517da802ee254437e4f60907b4cda146e7ba19e249eef7be405549f62954
b,fa15eebba81ecf40954f7135cb76f69ef22c6bae394d1a4362f9b03066b54b6604
d39f2e53369ca6762a3d9787e230e832aa85955af40ecb8deebb009a8cf474
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-4">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 014893130030ce69cf714f536498a02ff6b396888f9bb507985c32928c442
7d6d39de10ef509aca4240e8569e3a88debc0d392e3361bcd934cb9bdd59e339dff7
b27
pkSm = 0301de8ceb9ffe9237b1bba87c320ea0bebcfc3447fe6f278065c6c69886d
692d1126b79b6844f829940ace9b52a5e26882cf7cbc9e57503d4cca3cd834584729
f812a
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-14">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Info = 7465737420696e666f
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 020095cff9d7ecf65bdfee4ea92d6e748d60b02de34ad98094f
82e25d33a8bf50138ccc2cc633556f1a97d7ea9438cbb394df612f041c485a515849
d5ebb2238f2f0e2
EvaluationElement = 0301408e9c5be3ffcc1c16e5ae8f8aa68446223b0804b119
62e856af5a6d1c65ebbb5db7278c21db4e8cc06d89a35b6804fb1738a295b691638a
f77aa1327253f26d01
Proof = 0106a89a61eee9dd2417d2849a8e2167bc5f56e3aed5a3ff23e22511fa1b
37a29ed44d1bbfd6907d99cfbc558a56aec709282415a864a281e49dc53792a4a638
a0660034306d64be12a94dcea5a6d664cf76681911c8b9a84d49bf12d4893307ec14
436bd05f791f82446c0de4be6c582d373627b51886f76c4788256e3da7ec8fa18a86
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 808ae5b87662eaaf0b39151dd85991b94c96ef214cb14a68bf5c1439548
82d330da8953a80eea20788e552bc8bbbfff3100e89f9d6e341197b122c46a208733
b
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-14">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 030112ea89cf9cf589496189eafc5f9eb13c9f9e170d6ecde7c
5b940541cb1a9c5cfeec908b67efe16b81ca00d0ce216e34b3d5f46a658d3fd8573d
671bdb6515ed508
EvaluationElement = 0200ebc49df1e6fa61f412e6c391e6f074400ecdd2f56c4a
8c03fe0f91d9b551f40d4b5258fd891952e8c9b28003bcfa365122e54a5714c8949d
5d202767b31b4bf1f6
Proof = 0082162c71a7765005cae202d4bd14b84dae63c29067e886b82506992bd9
94a1c3aac0c1c5309222fe1af8287b6443ed6df5c2e0b0991faddd3564c73c7597ae
cd9a003b1f1e3c65f28e58ab4e767cfb4adbcaf512441645f4c2aed8bf67d132d966
006d35fa71a34145414bf3572c1de1a46c266a344dd9e22e7fb1e90ffba1caf556d9
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 27032e24b1a52a82ab7f4646f3c5df0f070f499db98b9c5df33972bd5af
5762c3638afae7912a6c1acdb1ae2ab2fa670bd5486c645a0e55412e08d33a4a0d6e
3
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-9">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364,015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e073a04aa5d92b3fb7
39f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b
1
BlindedElement = 020095cff9d7ecf65bdfee4ea92d6e748d60b02de34ad98094f
82e25d33a8bf50138ccc2cc633556f1a97d7ea9438cbb394df612f041c485a515849
d5ebb2238f2f0e2,0201a328cf9f3fdeb86b6db242dd4cbb436b3a488b70b72d2fbb
d1e5f50d7b0878b157d6f278c6a95c488f3ad52d6898a421658a82fe7ceb000b01ae
dea7967522d525
EvaluationElement = 0301408e9c5be3ffcc1c16e5ae8f8aa68446223b0804b119
62e856af5a6d1c65ebbb5db7278c21db4e8cc06d89a35b6804fb1738a295b691638a
f77aa1327253f26d01,020062ab51ac3aa829e0f5b7ae50688bcf5f63a18a83a6e0d
a538666b8d50c7ea2b4ef31f4ac669302318dbebe46660acdda695da30c22cee7ca2
1f6984a720504502e
Proof = 00731738844f739bca0cca9d1c8bea204bed4fd00285785738b985763741
de5cdfa275152d52b6a2fdf7792ef3779f39ba34581e56d62f78ecad5b7f8083f384
961501cd4b43713253c022692669cf076b1d382ecd8293c1de69ea569737f37a2477
2ab73517983c1e3db5818754ba1f008076267b8058b6481949ae346cdc17a8455fe2
ProofRandomScalar = 01ec21c7bb69b0734cb48dfd68433dd93b0fa097e722ed24
27de86966910acba9f5c350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = 808ae5b87662eaaf0b39151dd85991b94c96ef214cb14a68bf5c1439548
82d330da8953a80eea20788e552bc8bbbfff3100e89f9d6e341197b122c46a208733
b,27032e24b1a52a82ab7f4646f3c5df0f070f499db98b9c5df33972bd5af5762c36
38afae7912a6c1acdb1ae2ab2fa670bd5486c645a0e55412e08d33a4a0d6e3
]]></artwork>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y9aWPbRpYu/B2/Atf5EKmbZLAvTmfu2JbtuJPYGstxz3Qm
NyoABQljimQTpGW1O/Nb3t/y/rL7nFNVQAGk5L2TzI17kUQCtZw6y3OWqppO
p86m2czlbfdJMW9eNstt6x63clst12JRLS/cB9tFuWmWi9Y9eHL89EF76G7b
ZnHmHq+bCzl9sq7k2n24Xm5XrSOKYi1foiV6zqmW5UJcoOFqLerNtFlv6mlZ
r8+mL5erdT0NPKcSG3nbKfH/Z8v11W23WdRLx2lW69vuZr1tN4Hn5V7gvJBX
l8t1ddt9tNjI9UJupkfUouO0GwzxJzFfLtDLlWydVXPb/WGzLCduu1xv1rJu
8dvVBf3yo+OI7eZ8ub7tuFPHxb9m0d5278zcI/Gyqdrlgj9UI74zl6+Gny/X
Z7fdu2vxUrony3pzKdaSP5cXopnfdgVemFX6hTz41zP6eFYuL8adPRB/n36N
SWDg8u92j+sLIvee77nne/Pltqrn6HUCKpQz/qbFDOXmtut7vvtseblo5aJy
Tzb8XdlsQNATsXAfYB3Lpi2X6vPldrEhWn+/aDaSHgf1W3dZu3cu5LopxWBW
64ta/P38X8uu950pPZ65J9s5GEfY9HvclC+Gn/+Cs1hgMDdN4d6MFuYvy2Vl
zeDe+bppN8vVObjb/vYXnEcpLv/1XIoVhK9oNu0MguA4iyUYZ9O8hBy57tMH
9wLfz29DhiBJwy/SNMroV4jtS1FeHYu2vc2ta+nXn7v0hfpcrM9oPuebzaq9
/cUXZ83mfFsQ9b5YqWdXePSLjRQX/DwLs1uLeUuScfehFw3af3YueXpN6R41
dd1IsPl8DqZHz8tiLi/2dirR1WIza0S5noH0X0AjRF+EXrKnR9ft5Jv/TfVP
vcpHM4gvlqX7VK2kXGNE0HJPZSvFujzf//LTmftQzOdisXnz6/fOxfbiWEIt
ggPQ75NHM9/Df730i3AaR940yrzUn0Y/pfywXC68ZPiY76eJn6T5Tz6eeHDi
eXtbSdPAn6Y/+QEe+vM33/y7b7Xie/kX97fr5cnxLPD8ZBZ66iE/GjaVp9k0
nCZJMI3ixMum2U9+iCdP/vzNiZ/edj9zRVWBLbFKW0z/yi1kKbatpDbcl5gg
zIJ7Llp3c7VatjN7uW+dHH/96PG/Q7ExR5H+xvIv19LdnIuNeyzXtSw3aPLr
pgLHm2dat16DnI82rZzXt/ayRLVsmBXMPB/dO7p3QtNMZ0lk8cWftwuIJ32u
xBPyJFuSC8Mgtx4tbmGg9IT76P79+26Ybs61jRFk8cTcvbdc1HItF6V0MdUj
qIR1U2xJVO8tL1bbDRnCk6t2Iy9gHnkkh7d086ARKYPrBnkdsyr1852YN+fy
3D05b9ZQoY1YXPMgRGrRtHNx6f4Z6qh80Vzz3Nfbs6X7zVpcln+/enHNM4+h
g1r0KV7JBWmeZ/eenjz7S+Dv4xkv9Kde6mXxNPwpIJ45enjy7Lmf9c/GfvzF
armSmxam3s+mnheQ2J7cv+ffHnLK/Xsu+rgPa7Ei9XBvu4aVvbe+Wm2WZ2ux
Or/azwiXl5ezVpZnzA34xZ++DGarqn533UBErARz33Lt3od2Khu52AzGoDCO
e4DRPjzE648fnTzjkbbdlBMvyL6gz2cPHh2fzPwsmUaOM51OXVGAcUQJfX1n
8SacpWDWodu0rnA3l8vpSqw3V+5qvQSwWc4hg5tLKRdOOecx4mXibUgjD77s
2HIDhbvcbvAX2RNxXWfU18wh7axbQUcvWSapAXyLz8u13LhAYRPujT7XnY+f
hd1Bf7CnG/6ELCD6pl/N8Cf263PozEXfkR7tJQwNfnX4W5qJWFxtzvmXAp/f
OC49B93wQqIpuXbMGzw6FyZTd4WBLhiswrYugOHapdtC8tv6CvRaLJlAGP/n
aLKpG1E0c9jxzydArPM5VIBwn9PLaEX9gvm22zWooabXcqv87pXSetYIoUXR
gNOuZImmS5dN6kbSbNxquzYLKF/JcmvGYdOx79QM3SnwLVilIU09XRomm7jd
aI/NaPkXvDRfXvaD7RmpdTZLs7TuaouWSk06fG5oqRiN9eQMxh3cCry/vaBl
1ZOS1CaTd+LwUNUyqc4hdxA6DJZ0Ka14s3BbLYZEDLgWS3Ytzti1mOCFcr6t
QBdHGkVRsviNe2e5weirbbkxVFOC7D5Yrre9rVYS7Rzce/D0IcRtwU8+evrs
wUwJ7UVTVXPpOJ+RTVDtYbIQ4ZtEyX1w8GLivlLiu3Cl0SWwdJpiwDpObd7Z
iBfM2IP1f8F0Eu5LMd9K95ULA6vlimfavdzA4bFH0qjJognQtHvqm4P//OnQ
/UoNjH5tqLkKpgw9b5v2XI2IzK5wVUsYbCsuVnO7GWgvGulSkQlfS5AcwHTB
g8V7ZxIDdb45OFRS1Ss5rPbbqTR8qRjQUfNXnDlxLyHD0hae8+W8oqao6Z5g
lmLhB5x2iUEqxn01YwDa9ah5v1jC4rPQkA5bYolgsNa0DphXp0ods6btFlzT
SfJQiZlntPZyd7SXo7TXiy/HyqpaonNoG/XKWNu9AtI0jc/Ae8+1LppLpbkO
nve01cqM6aX5WffBuo1EWrJwW8Pn6XSDB6sp0cHSF1eGnUDgcrmGZlstFyyC
ugnV+OetURL0qNX0iwVozPqmU0sjtmBdcOgwX7wUa8AcbayeDyaya+oaQmlg
yX3rNHGvDidsDJkBqKEHvCz65alWbZWa2kQ3333saJZR6mqg/7Sl0eMB3pJw
sJhky9qxKElDYGKqsaErFTMZ0dHo0558zpi7ehoqitA06uYVWtQjci2NQCR2
5N+2UCVzXttlZ6Mch4MyQOvAVorYEiJIxF6t0DkrclvN3nZXGpMTYTYA67LS
JteBzmAL1Zbn8gLzf/1aOSA//zxxtW+IlySRmx4zDUHBL9f8uHIw6HGQ0+k6
IpCGcdNo9OrIV+U5qxas5vGdb+7j3f/95PjOv31//6tH06NZH1NarsTftvLn
n2fOSEDAWlAeCyxV24r1FTEMs4U9bSXYWK6BE4yujp8+en7n3n8c3zk5Uf1J
9Gd5v1OjUNDxWDINrUnyCtJubPLBls61hHXHhDXjYq7AWjGh/Yim6Vxnc5Wl
3TG4ZqRQettmvnG34EFn19AqPdk1C2xXwuNBs1JgKJ3+1MI6cSj4dqbY0qIo
2HzRQpbWhq20ymvWNFPAG6X9V5I1785k1pK5h1AJi8KSginttr3RnDsaoLM5
n8GFJMkgtQq1+Oj+swcdJqCxmK86zIExfPYZ+e7EbPPlmeP8oMKWgffjgfE4
NkvQj5mAfY7zzcX8i+uCm4e3gSLcO1WFmbSAFScPSRnQ9Gi+unE/f5/G/Vw1
/qB55cr1erm2Gszeq8FMjxYrCJmrGsgp9DXY7+xMtkpEGCAQbV1IJNZxLV82
8tLqOX2vnlPVsyb8+fISnZIbylILDoI2AFdXvGh1Aw3X/B1QAIMCsC4xTBDz
LcZNqO66cSfvNe7kLSnWC+i5pGBiZfUcv1fP8bus1dOH396zeozeq8dIrxGZ
LsgP5HfNM6JgJYkkhxqBqbA6V22jnGgS0+cDxWN0hjWc8L2GE6rh3O+m3lww
smHZcgtBahYqSCuJY7GQcyiJ0aoH79V1oLo+wXTnFu3JILd92/57te0PJOE+
gX+iL6Zwdw68bj5QulRUVf8I0ZvdT/UBOylmLO+lvXzvJhJ3jXvvpb08rb1O
YC3ARFeLjXjFU7jGcPXgplHGYup+J15IRZXeP6mxJA3ZXmqqWYAUTdV5VWMg
x62csMm8YpxxJhfaWNE3T+UFJsshQ1I4yqS1G7nSolVSHLPjazOEVr1aC9JL
/dfalKlGOEQzF2QAeQig65zG0FnFoeGkZ75fVTwFy7oy+kU/8vrHhyqyW7H3
Mg+eMQ/VcrXZF2PQAQG49OutXg0i0+vXJoJIgKUb2vE0zCKl5om7KZ588vUd
/pCiAlJw0Ig+iv3g2ikZDUhahYbQS6NCjPas38s0edo03SU2K4jZCJldSGq+
aS9o6BfLSroHkMWGEi28uC97EMjfEr513YvtfNPo9dMPkp7iRw5nCicA69IT
kAm26UqNVnLAhPTokbEo4+eJye8cP9rDE2rhQNFv7k+DONEtl6KOoswtG7JL
vBz07GNW5mRlvxbt+bPlSSnArwMpvOIGSAVa7w65n8aiZIqbOvr2/r8pL2nU
ED2nwwitBGcp7UWx3jNFAOIOfLmkOF6PYT8KV7yX4fcSo72U8sCMGDi7cs7a
UTmpimY7S6f1CiUhSIzEhdxQ2JZkxY7t8SpSO1s1xR0CuWfbphKLkhfswXJe
ud8viqE6hIoAQNaAiR57sto0F7QWKnEh6ceyZajFrrKK/LkH2lGF2zmX1Zns
445dfOrQVp4VTeGiWVA4qRypUgjL5nxZfZTFei+s5Gms9B1RHfSglC7crM0y
iGPFenuEgAd2by7hNmBZrS/wNBBo00nVMdZkd2nAuUNViH55dCZhNjMDGhFr
CbNEAVcQHO9v5KvNSKXaZub+DaR6L5DnaZBnQp3gkz7ocqKCLnpYrU400JOw
ueCWQXxcq7w1xSHWVgSRBZ5pu1wA10OuweaWVBRiU3Lci+WhiwUP9cWBik+Q
Q6Diq682aApfH2olyikZLK+fKwjB+s5eXaW7bOefnWtY6ZeS07ugOFza6dHX
7nItSuhxsdmI8oVach0U71TvjgPdyW4f4OboafWyKVnxowd2pUdq95iU4xT/
BV1LCW1NyIA1ijH5bivOpEUvHYYYqXvTEwcNyKeWK7moWgLE9qQtdnkvEO5p
EM4JcKgBKwCosxd9NMTWQt3YtaYjJHO2tmlkrCELQNW05bZljUSuIaUlAHxg
oXYFj03jerliGPnTFwwjf6JlBThXLCXmZxCZzfkFpzt7ILm7hqJttxcrHpRZ
6VkHzTlQ3LUFgpe0XjRE5mATmWtHbwxkGTJuHu5No2XVqiHLbiiCpBYa+Gih
UmSUeD+fbpZTToMYr0CS7DFu7lJLQ93Wrft7eUBe0MU1VNSKp2MtU9mnTNF1
B2vZKurqDyNYg/kaciiQ0JPXGvB7uVWedqtuoCvYCFpMMlFBvHfpY7AE0KGK
p6AgOMTYBx2B87aECKAPt7qY7oJ8iJ67KPr0VKlM7WQ907F3VRZx67vvT57d
mqif7uMn/PvT+//2/aOn94/od6C7b7/tfnH0EydfP/n+26P+t/7Ne0++++7+
4yP1Mj51Bx85t7678x+3lBt268nxs0dPHt/59pZKktmROorSGCoCCEDcNqyb
HRM4JGlw7947/v//Pz+CQ/C/dInSzz/rPzI/jfDH5blcqN6WCyAC9Sdwx5UD
rSUFeXQKcIpVsxFziii2bgudsHApRwD6EQEfL7W2pIaeMS5ZzpdnV4qY9ZKS
PmxhupJGenDRvYXJcJB2cw41cHZuks1mtjMOujG6BfAr/ouCIaevTifuJZhn
TQjhdC4XB68OT9noSzQMusBe4tMzCCzmUFxpgEHNbC6X/AE6XourltriAZ1e
UZuqwVfuP/7hXtkNchjVodqxBcXJF532exQ8OTk+eDVxX30rF4e3yc7CMFNm
F1NcTBfyTHkfrHOh66g7honCGgUahvyZaHJlhn5KbZ4S0QcLq9fQo1j+jMiv
ynsIwA8ylWCLLSXJ7J6YHM3ZFOapEYoyLithmgutV7cup8/c7394/OMpmqkJ
o9KQF7oRndz+nvEILAIt72MQnQpyCLperaj+45kKa9Nf7qlKFZwCnYoFGUZI
K96CoVdDqN3twmZm6A1B4WTVIk/NzIAY5u9yvZwCestXOkrJg1wrhHL6/Q//
hXH3eUPP/dNX7n+5f3Ifg5nuzOcDQ7Jg9VdCR1CWZEDoXambi6YizOiQZLjH
V0Dai+m8IXvGOeESruXMvU9Qw842U2QVapmzCcpOqX6NN9I6ehiEAa1ndW0G
p6TbGWX09PNUE0bKju0b5e/UIy7BGCKVM47/9blaC1rTjDitNVOyenqs/I1H
NMRTXgO1ej0L6NEzWel1clkWSn0MMpyOzoT2FSicVhQqt3B6zMjl7ftxVD+k
9Ch5vC81OSrUuEvPjSZEGHnYNU1BcabiQ6o0W5wxE4t10WzWZEe0NC6WWP41
yTBGtXCDP7Xb1b/4yZ++oJ/u1PWNnuG0in4JPIUmS41qACTarpxvNBJSQcPh
qjV1mO+4takCVrp2o9Nk1GS9VGp0rEU7gjjOCc/NcIpJct06AmR8Kb+RV8ei
WbPNkrKaGitkYOQtJtWdk3uPHmkiwXxTNnjezsaKnnzT9hq9bgkUK3Zgptv7
KzvYfeav31C6RQ8+V0/aycA3v3SsXury5G/zjvLPqHC3w9INuRvL9cz9VtUk
DKpDOi3Qh4nJULujQrHhUk2173fbhA2U1OxvWIUOBrUsZijoBup8VMSlZOdz
Xd3i9mVZVHNzvJbzBgacEtUaDfUpzB2NyKlW4kIC8yQpyu+RixJvMwA85fTg
KRWk7gL+ztkydVfkxfUKuJDgJ2XvVsszCma6oIvEnzacBIzhSIrB3coDLFU9
t86u0kAorsbjGGJlwpI9LS/Pl223LAY/wKA8Pj81wu3sdN8ngQcwV9UhFM1C
u4gYjqaGknUekIKgO5s63Nef0ZQd59GI5Ix62FGSXZLW9m/IQuvA6MSmuKMo
bgZAFNM+HTMHTOKFQHtUuw7b7qp6HHZZXQxhT2WYQ2jMRN8OVKCQ1SKNSmUQ
N1eHXCanoy1qwOpJ/aJJLavRzdzvWy54njA80M9QmYrSeSp0VMNpqFxtR9Ss
dAckgiek1dQQ2WwAVEC3z/uIWV9hU54vyWXvI20g6SlowyZH9cOdOGre+jk9
0oNnXB11ITBY4GEJYZ0o/Q63rObiZSuhrkjp2E2ogIjBQOh3tsvXczYXHWfr
aV2Cbc8dCowTEFX2UA1R4SC7z9mh1s3bRSU4rDHX3XcrzCVMzDKE+f54qkyL
WcFuFU4fYYQGhXfLd3pHM/Pd0wGBJvjG/aN71/0K//uji6ca2DGqyRAAgBfF
Dj3v4DtVPUTtU7PaoOvmNkxubUApAmWGNb1jAz3u9WB6hyrv+Af6xq80dh1R
t3MCS8K/7umaRzcs4KGuQUrJ3qudBBqsYU9E9n4cIw93NBG5nh4dTH2wFfir
nShp5ggRuRUKrq7/QIOkoc9mMybXzBmRmkgCoq7+cOcrmgytaUmpDHLZVFHY
3ulRraISc5Wd3SMz48EoOn2Hdh7Cq1ofYiwPoU0WrOe7hb/Dy35X1RVTIIJQ
O1VwCBXrWandJdQ4qAlZqqAwOh/ohbVkxCMv/nCH5kRlsy/4lf2Nwg+4qyhL
xVzkB+qV4qzOHVNPzQZV0aO1Kr94JKcPHxysDkFKoSUeenvOmS8lQiud6IXq
6CSpVzcdgudptJ02Ii567U1cf0IrCMU79X8+nY3Ka4CFeMsG7OrpfUVHLTyK
5La3OdKPJkBGAU7SCDwMR09xYqiBVZpfwaD8hZy4S9J4opmTG7o1AqdFr3fE
eQVIR3Mo4eXyhWITsVuixGCNLdQBnNwnbCEVUXbVo3vQzOAFQalx0uKR1iXj
F8c6Zm8bj1QbDw27jhvp+XhfK/SqSqix4Tt4hbeP7NwJw74LsSKo1Hm3FCdk
WE2+unJ7rca1DVVCiFchc9D6qgidCTpBW0aTiYryDwSNVNkiWdvTp2D54ajA
kA1VTnGAoavw5sGROWlKiCOnUsjQtMqSomvalLZbngy11JUlur2PCRDPnCqu
SZ8cHJ08O/wSn+4iLIW8dirIFKntzgnzdwDOcXWwYlgzOIjeqRS1nfP88DVC
pyzl70EZkOAaCtw0f1rvvRR48/wn1C6/6HuzWFHjKQN8TQ2KKJ0vl6Q7IKoa
+6vQEsVAdidNzgO/+mjBvHLQoomnOhLEYqc+70IRvf45bU9J+rWO1G4I51Kl
VlgHdw5pl9SKbXCvxWCcyKMh6w5lslwwhrRiTqfFtmaAoICciW49ltzJUZdt
77rB8+jozmYjL1YbVtwkaGK3zc1SMcVgLEqH19B+ranOVzPV9Yf0gapUGY6W
82eDwhGFqPdqlhFzkRJdiwZ0pT1c9pSoTICGMSoq0OPDd4x2rlWJ2lXkTvfz
Jisb/n5qeUE6btRUVh3NYEk1g7Xdig4ZYbiaGMVbrGc7Xk/dxzss52gYpHmu
JfTbk5kJh6Y+hHS7jp8Ofrba1PYleKMsolGTXQGRw6UgnZ+w614NN+osX7LL
NNp/82jhcFFQSTkOq/Je+TWsnEbvwEOZnc0Is5GXqwbNSgpT03uVqTicHQyT
SaZEG22X5gA+J6BVrQkaG9PD6cuWuzS0Kt/qUzJY4M5SEsJuCa+iaR0Q4Fiv
AmY6KE3u8ZGBgt92UPC+Qevw4DiJ28Jlrubybz/TTiGVzsJ/+4IKvfVEqO0Y
a50bhD0uuTCf40bKhd0wGR2uszRbm+BiA4w86uI0nJe3XVuh+zT7UMxOCaqr
UbE60jm6l4lphlQwqaRF9/jLvptuTGqri2MiOZavDfSv/5BuP95yLpqL3s/V
w9WzAF0d3p85GgQH1DtymdrwLtXYrawYDXf0oik3Yv5Wq+b0AF5aq3ZAKdhD
w23oi2OF2usbhzVUTSuFb7vddFZxUyUv+HmhAmW0lYNiUqJZMz8NKoX0/oB+
N9Wum2HWkMCWmOvYlLP7oI57WgMh03EBv0cpc96SPjV70iEugz3q0B/80sQ4
9CazphJ7I7JiLfVOYwjxBtw863cl6NJ6Z7QwoqYyJ/Jdr0x87QH0yfTkXFw0
4BlgiZaT+q9f0253wh4PtmviJ0qSTrqDOKwO9W5jinlR0KPq2L7lzdhcaNEV
lFgpdrUo5xwRU4pt2lJRlP52j0vn9E6Lyeuzc2eUtEV03XfvrKm4oQpH63qM
uYDtWTsDtupC6BfLitpUQZrb7oF/yMRiAoHrVxsdxl524u4oZ5D5lQtjdGLZ
VBB150AsdXr1IDjUMKSCD1BtVQXRnAwn3EGSFq5OscDcQDgrDtFXuqCCe+5T
AQZPKnfQITdOe/9r0auKQvIOF7O/sG8Ifx0/ffxQ0VfJ+crA5ZaLhSlb6RCh
2m0x1RoBdKIYHZtPXUylecxmah47PVdcdZtc9dysis0uwKx974XScF1d59U1
TTumabOXdpwDIuPxmTIPxoHkKu2H/YiFReSlrkZQGSr9kOTXTzv8MemdfmIz
ExzZExgBwQilE+S50qE8Nsn6wXv84BF9pvCTc3qhkasw0ZwXX478KytDqMat
ol4vKID0lXv3lNOI+PPeD82P9MkRfqpoL/PXacNxtdMfPB2ouKC01Y+navF1
2FtvC6RNsDqVq0horalwN1vwEX+PaSq85pgs5V9MIspOJvNwf/B+1CEP9Se6
7oMeLFQ1dLbJ60Gaqp5eJvnAPe/EPMbLpcqD2p7uJp8IgAlR3fB+FjY0LeN6
tZfQqkfnIsmuWI1sPaVxyZ+H9hKmQnOwC5BwOyRFr1EX3J0MlV5lmUisuNJk
anQTLbEOSyx9qRXknmcx5//+7/+2ss4OJw1vO+Sqa+7Br/dNRNL6/a71+70f
Ln60/jyiPx0VX+GmlPAo6jh9+pm/U5mKhw5wXydfiv60G/POhKTgHuwIndtw
8N3E/StFZXfqYB+IdkPPdw+TF4YHH86GfjD5QQE+X7t/4NlsQv3Hd/TG3Qt+
ZcdfvUvvCW//l9/xl/7+L//KXwb7v9wE/G14zbchz6LT8M96S/IVH4Ghakao
auXuBSAQjMM//kFT+Mc/Rl8Lr/sak9j92u+/9vd8HfRfB3u+DvuvQ/P1rXtm
1Ld4DjzDQXxmz7SIGC0vxxRv/AGcx640xRzcH+hYsB+JWRVcOpfzlRWD3M8Q
rGTaoaqdmC2EYuEsVVn1ICS/p8K626VilVq3jS6RuGIk6NxUc/2OQvYugmW+
+M76/a/XihgEsa8VMDBD5fOV+L1RrG6/SUgICxydPMMTugCA+GLYk3ro/blZ
d9E9o//W7eqg6MGwD5ak73jcfRxZB1gbMgp8BsLBxaE6ZOZes3+KZBAP+Ymj
a5446p4oDRF3ZjqezGAm9FN93eiPd96513RvYKB7HjjqHziyHrjVrSsLpQuv
ZY9c7g5bzYeohxf+4DIq+KNSmH+ltIvRnlpUlZJWovqXc7N3eoSqxtHNfi+2
9ii7HRanA+5RKcBepvnlZV1TESjvrO6xmqriKDVae95hwOvBmnrmTVBtGEhS
ZVnvDdycDri5FnBTE9DoSeEpxtojfMIbpZc6jSEcUwm3XPIGCPW6zvDSxI2f
D5438cuOEiqQqSNPzhmjURsnmPrAcQxNn5CjEcZyMYZKDqUW5UsdXdDRDayf
8YHUXoA9BdX9srCD/Wa48j4YZYRMLMXaEVGFT6qbYYvFOAc9YpmodlmnXI9c
Dix8Q3bSQFxtDA3EdQxyOThoCbtQUvqArOTdw0ODY9RX33Vf/fXw8HdU8+lQ
jXy14gMg7r01ujHcRGtlvf2VWx5aCrTjuQ7t9JuXOHW4w0Mc+VdCq5XUm+Xk
1wQzDv6n4ou//g45PirkoE//aj49Up/+9deDPfp6ztefda325Xc66sXVd6oR
XY2mhkMlrtIapq65bvuqdIo7qGqya/bb057kVleOK0eklX07FNSb61rLC0ql
nHHR73VHEhZbU4bmtvPm7JzOQSNScl2udnP2nAijsmRMVv2JzpBxcNMKalL8
/RztAgC9lPNB1FC3PoiKEFTi+BPvzdaB2Zmmrj5Qi76adKeP7T10ilM2rH/c
U42t6Hy19sXJRKGMw9OJo04tO21UBbVOq3Ylr8a3468n7ine7R7qj9XqHcCJ
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
/Pz+gpy6z60LFWhjq7H60SycBUQkW0H8/POX7mMJXgk1U157y+M1fR7JN/Xp
7/Y5Y3IND6EZpoe1KZTWTtP+FjoD+Kx7IlXil9lrZ2vPI3NOK2/vafXWpfEF
hGvNYOBd9hqed8ZY3VnI0c/Rmlh3M474RwlVt+9sKBthoA4YkrRejADUcVRs
MRVvKcvQgb3NcuWqU4wKc7Mw2Imi0Vi+dv/yDS51HA1PqDseeXhLixSy30en
NkXzuPaPXu9q3nPvI+f1Bzd6miC5cm7Nrry+M1uUrhWjUSmB2YisZG9EoaXd
O+8d05e1mXtsbxtd/CWhxq+g9yxUYEwjI4Jv7hPkuBYTmGffBg+opj4GIjC9
TrlVNDrAA9aYbLG7xs5HUUIkDjM/85Ik8/Isj30fZj7wvDTMkjSCvY+jIMky
LwyTJA8ifJQFfpol9HAUR2nshVkWf2qL/1tR2jcgE7M0vywqWdYjVKI481Ph
EnT3Oy55O1zy8ex9fKO9N4v9ce19/Lu932Pv4+Tt7L225XuW5lPZcjOyf7Yt
t42wUj37zDD7+sorv8kCq5DA69ePwXD3+Abla/3xj2R9j9EOWd6x3VUjgStc
rvDL2j8cjWqvAfZe1fqfp//Vo39FKZNaiEqkfprLLKrDIi9FGdRlEsLB9Wdv
tLv2IN7C8O4+/j/A8rJNNdE9WlRaxZ/+/buj25ozfjo5+cv3Pz198p8/vZ1x
5oqyt7XN+02rPT4OgSpRfVPXlu3+FkJDQHVfLEBNVs/unQ0wP68u+WaTuG3p
YmgxVyVBv3bjSJHINZWC0Gkg6nr1KbP09JiKeYmYT8qN3Ey7S21cc0Khirdr
ffr69cn9ez6ZTe0nh+9gN9+gncNQHeWhCKAPO9oseSzCOp9k/7Ts4dN09k3z
xikpjtCp5oW7kmuS25aPD2y6M4TpjC77fIrh/SxtZ/iTWQDjHxnbBhb+5v5/
3Hn49P797+4/fvbV0ZNHM9+bJV6QfUHqZXZyPMs8bxond9YhbQ7UJ+frSDqb
bjVpBQe40XLJsxD6ZKwhSuAibXWmr5UAKjdK40x6YKEe5LKrzgzrDIkixvi5
N5wdwo3800FHzxMPSHFMNReOGZsEmySt0ZO9hrk/aRDBhAx4AJrN1fDHPDyY
itGFaoxvACcawtsA5WOAEwuaEHUsaBJmkYIm+OUGaIJv3w6a0IMfA5qgHYIm
+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
RrEBAA==

-->

</rfc>
