<?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.17 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-voprf-16" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.2 -->
  <front>
    <title abbrev="OPRFs">Oblivious Pseudorandom Functions (OPRFs) using Prime-Order Groups</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-voprf-16"/>
    <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="2022" month="November" day="28"/>
    <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="I-D.irtf-cfrg-opaque"/>.
Verifiable OPRFs are necessary in some applications such as Privacy Pass
<xref target="I-D.ietf-privacypass-protocol"/>. 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).</t>
      <section anchor="change-log">
        <name>Change log</name>
        <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^13 octets.</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 over 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.</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)

  h2Input = 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(h2Input)
  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
  h1Input = I2OSP(len(Bm), 2) || Bm ||
            I2OSP(len(seedDST), 2) || seedDST
  seed = Hash(h1Input)

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

    di = G.HashToScalar(h2Input)
    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)

  h2Input = 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(h2Input)
  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
  h1Input = I2OSP(len(Bm), 2) || Bm ||
            I2OSP(len(seedDST), 2) || seedDST
  seed = Hash(h1Input)

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

    di = G.HashToScalar(h2Input)
    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 three protocol variants referred to as the OPRF,
VOPRF, and POPRF modes with the following properties.</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                                                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(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(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 a two-byte value, referred
to as <tt>suiteID</tt>; see <xref target="ciphersuites"/> for the registry of initial values.</t>
        <t>The mode and ciphersuite ID values are combined to create a "context string"
used throughout the protocol with the following function:</t>
        <sourcecode type="pseudocode"><![CDATA[
def CreateContextString(mode, suiteID):
  return "VOPRF10-" || I2OSP(mode, 1) || I2OSP(suiteID, 2)
]]></sourcecode>
        <t>[[RFC editor: please change "VOPRF10" to "RFCXXXX", where XXXX is the final number, here and elsewhere before publication.]]</t>
      </section>
      <section anchor="offline">
        <name>Key Generation and Context Setup</name>
        <t>In the offline setup phase, the server key pair (<tt>skS</tt>, <tt>pkS</tt>) is generated
using the following <tt>GenerateKeyPair</tt> function, which produces a randomly
generate private and public key pair. <xref target="derive-key-pair"/> lists a
deterministic key generation function <tt>DeriveKeyPair</tt> that can be used
to implement <tt>GenerateKeyPair</tt> as <tt>DeriveKeyPair(random(Ns), info)</tt>, with
optional (possibly empty) application-chosen public <tt>info</tt> string.</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>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 value <tt>suiteID</tt>. 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(suiteID, skS):
  contextString = CreateContextString(modeOPRF, suiteID)
  return OPRFServerContext(contextString, skS)

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

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

def SetupPOPRFClient(suiteID, pkS):
  contextString = CreateContextString(modePOPRF, suiteID)
  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 randomly generated seed of length
<tt>Ns</tt> bytes and an optional (possibly empty) public <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"/>.</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 specifies an initial registry of ciphersuites with supported groups
and hash functions. It also includes implementation details for each ciphersuite,
focusing on input validation, as well as requirements for future ciphersuites.</t>
      <section anchor="ciphersuite-registry">
        <name>Ciphersuite Registry</name>
        <t>For each ciphersuite, contextString 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>
          <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>
            <li>ID: 0x0001</li>
          </ul>
        </section>
        <section anchor="oprfdecaf448-shake-256">
          <name>OPRF(decaf448, SHAKE-256)</name>
          <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>
            <li>ID: 0x0002</li>
          </ul>
        </section>
        <section anchor="oprfp-256-sha-256">
          <name>OPRF(P-256, SHA-256)</name>
          <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>
            <li>ID: 0x0003</li>
          </ul>
        </section>
        <section anchor="oprfp-384-sha-384">
          <name>OPRF(P-384, SHA-384)</name>
          <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>
            <li>ID: 0x0004</li>
          </ul>
        </section>
        <section anchor="oprfp-521-sha-512">
          <name>OPRF(P-521, SHA-512)</name>
          <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>
            <li>ID: 0x0005</li>
          </ul>
        </section>
      </section>
      <section anchor="future-ciphersuites">
        <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 <tt>p - 2&lt;sup&gt;b&lt;/sup&gt;| &lt; 2&lt;sup&gt;(b/2)&lt;/sup&gt;</tt>, 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^13 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>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. The server must learn nothing
about the client's private input or the output of the function. In addition,
the client must learn 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>
      </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 0x0002),
P-384 (used by 0x0004), or P-521 (used by 0x0005).</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="I-D.irtf-cfrg-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="I-D.ietf-privacypass-protocol">
          <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="6" month="July" year="2022"/>
            <abstract>
              <t>   This document specifies two variants of the the two-message issuance
   protocol for Privacy Pass tokens: one that produces tokens that are
   privately verifiable, and another that produces tokens that are
   publicly verifiable.  The privately verifiable issuance protocol
   optionally supports public metadata during the issuance flow.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-protocol-06"/>
        </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="14" month="October" 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-04"/>
        </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>
      </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="oprfristretto255-sha-512-1">
        <name>OPRF(ristretto255, SHA-512)</name>
        <section anchor="oprf-mode">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = e617ae6f2d10de61e16cab73023c5a2df74335d13f89470957214664468d2
e0b
]]></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 = c83d0d8a3e80be2ced8bf35c5f3e24d42260ca8fa9a0403ca83
033588c26614d
EvaluationElement = b29ca44d6dfafc77a50b72abc53cfb7abcbe9cf6714afc76
893ee8dcaf053b59
Output = 8a19c9b8f4459d541ebbfff4e29f36620e44e825a27b0f2e3a3c0d8e963
588ee04348312dc8b43a48c41d4e7d904f95c91813a6b4f624392433f0568409da62
8
]]></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 = 8673ffd2f26b2579922fc485c77e106def00982e0abb233b4c6
e54841d43ba29
EvaluationElement = 68ed7037846f48a1b4073a0d110f6e4de8f53ab845365c0f
3d7f1b67caa39126
Output = bcdbd421c0863495d63d81a868858f34f5215437c5777072a92703f36b3
6c4a2d3e7e54a5762e70b06223527c211e2d4364481270f72971a2db8b7ab8fad84e
e
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = a3b8dea4a99be2469da7f7d2d93fe5f2867317d6705350475d47739c7214d
a07
pkSm = c00fbee6832a8e5d6cc1d1a23315daf6a6018f19e29ba37b05499259da854
b48
]]></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 = 6cce2c7913f4c8c0ac44ec149a1544b0e711e1630753d4efc7c
5fe36a4d50638
EvaluationElement = 826f2f3e553a039bcd69c9df6cb166e7943fd207089ae704
1f6041322ce7033a
Proof = 2e541a6962e783d2f42d5f4fb1364e51c368e95e83a962614714e9dfe21a
720cd8c8eb8106131b4a758b5a0987d3870adb348f5eae7b4a2bc26735928cc4b90c
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = 4d5dd83db5bfd850e3e0c17519f1013aab904e7b131dc1ded31f7a76aac
f040f6b344b0e635cf6df30771a35157e0e3d9539f7a891b48cd8521692b15c51538
d
]]></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 = 6a4e632b76a2cfcb0295ee74098a15a3e858f6006fd9fa8576a
5813e051ac134
EvaluationElement = 2cb879d933a1af46c77e89f3f39a38f80347bf4716da3dc3
07c8aa1282179823
Proof = eabae3489c46b9e9a8da0cc921d2bc2960ef5fb0b38c8f067cc5c21f62f4
eb0ff5472009aec126f543b6051b5d62ccbf2625aab6684076c26cfdf0904257090c
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = 5c3fe06ef39905710a124df0727c6c938f48234b35ccc4548c0736d7f6f
36e6b7333a9aefc93d6b1ee20151a40bce453866b62cf5d41799982fee6100680915
9
]]></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 = 6cce2c7913f4c8c0ac44ec149a1544b0e711e1630753d4efc7c
5fe36a4d50638,aa9908e4c40b7fe5f091cf0f7fb8ec75ffdaaf2d19512b7b9939f0
ffaaa0654f
EvaluationElement = 826f2f3e553a039bcd69c9df6cb166e7943fd207089ae704
1f6041322ce7033a,902ef95488cc3c47fe569bc96c922a4ae3f9ebd8ccbc71bfefa
5f1e7da9ab953
Proof = d9bfee92cd7496cdf469947b534549ceb79ebd7b5695d20437b3e14758cf
de0998eaa13a480cc35b562cbfb1412b1677650cd901b5fb4d6805581a95b440320f
ProofRandomScalar = 419c4f4f5052c53c45f3da494d2b67b220d02118e0857cdb
cf037f9ea84bbe0c
Output = 4d5dd83db5bfd850e3e0c17519f1013aab904e7b131dc1ded31f7a76aac
f040f6b344b0e635cf6df30771a35157e0e3d9539f7a891b48cd8521692b15c51538
d,5c3fe06ef39905710a124df0727c6c938f48234b35ccc4548c0736d7f6f36e6b73
33a9aefc93d6b1ee20151a40bce453866b62cf5d41799982fee61006809159
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 024eaeb72e5b3729d7f19d90aa44e3d2f4c445fb29011ffd755655636f2b1
00a
pkSm = e001954ccd18ec5aa89bcbf26c03d84dc4d9c9b973d9f06b1e0ceb7b79f41
d65
]]></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 = 009ffa1ffc529e4f1d3d8de1c06d22fbb15e39920a72ad4efed
6c39af9438a2d
EvaluationElement = aa9af25bf4edead5e2e0a4b8f93db9b497017f93cf68c750
45f02172bfc5d304
Proof = bb893ccce54685a871185bb056cb5e0594d09d3b53f2f879de06a650b8ae
ff08371f2ff9f3d5cac7f393cc37b2c71c2a6fbb80f35fe36b8e5cbddf11469c8e03
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = e7ed59e3f808c369598961ebfd9af74272894e0904d1c11653a21b08204
dba1a5fb5c3dd6be6c419190a84b576d91eb3d8d920d450fee0427fd24524950d72d
6
]]></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 = 5e009e08e228f95ee3703cff60a1d54225bb282bdb6d7dc9a78
e287f8418315a
EvaluationElement = 2e528236481eb6d87b07ef5f8c17910323d04b3bf0cb2f2d
23d5a7ad9f069b22
Proof = 3796381ab287189839288bbaffc971eb87c3a28226fa99dc83b363adb2f4
b20e4ae81fb675ebcd43d13918f71846cb488d0ce7d473bfca68450a5a5472564500
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = 9a0d8c55e2fef4bada9fb5877a0e739496e539a0d835722911dab9ec112
397e763a605acbc072619e8b8acefb8ee704a357556edc802648089d684baa763ce1
4
]]></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 = 009ffa1ffc529e4f1d3d8de1c06d22fbb15e39920a72ad4efed
6c39af9438a2d,1ee64b9e5148987ca6647ccddc11ef506231e986d5ce08ef9b8230
871f840b3a
EvaluationElement = aa9af25bf4edead5e2e0a4b8f93db9b497017f93cf68c750
45f02172bfc5d304,3073794fd68f64432b4d1f24752c4398f0e81e00b5b5842e463
5dd381331091b
Proof = 7d59db67715a9030d46ab50a614fb55927961c8d9322cb6973ef36775309
810b9f4a670ba4b9321f5cf753be2a58dee0730cfabd12b8f25a8a342e158ae2b608
ProofRandomScalar = 419c4f4f5052c53c45f3da494d2b67b220d02118e0857cdb
cf037f9ea84bbe0c
Output = e7ed59e3f808c369598961ebfd9af74272894e0904d1c11653a21b08204
dba1a5fb5c3dd6be6c419190a84b576d91eb3d8d920d450fee0427fd24524950d72d
6,9a0d8c55e2fef4bada9fb5877a0e739496e539a0d835722911dab9ec112397e763
a605acbc072619e8b8acefb8ee704a357556edc802648089d684baa763ce14
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="oprfdecaf448-shake-256-1">
        <name>OPRF(decaf448, SHAKE-256)</name>
        <section anchor="oprf-mode-1">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = 30f71e5b5be9c91dd54c5a48e82be8d47eeb2cb2c45d7874a45dddc85af8d
3f95b1ce73a99c47edc26ac9ddd936bd9b6b73728995bf1d213
]]></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 = a4205d2af0410dccbd4464629ba1b835456d04d994cf93988cf
2c3b9d45d3c4671c7625f52c66c760a069e2c3c367826debb13da089d735c
EvaluationElement = e8d78cf5212fddf940f9f6fe02250ed83cc0595e3f0e7481
1cdb9f62c0fa7fea94c45795637dc5c3ac31ee1cff18d0d675396ae09b302f76
Output = 1c1a9df7d0616e0f5fdfb6479acec73a4f5562da8f9488f3b6112ef11c6
7c5900e0abc3a169486ac7230a306c8796562a045c66305ed7cb2a3fae658e45eae4
c
]]></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 = ec5b609e5d3c0bb024c35256194694ea6e42aa24d13cf6b0597
49cb36911ccba0923cb73136acdf4bcecf23b6025f7b9b93d2eb0c09d964d
EvaluationElement = 524c3a644e381b4ae416724247f94b996f655167e0d4e1ba
d93cbc731c3beb36e3822e9dcbdc3600966226387a2306ba70eb68db5a64f92f
Output = 95f519e8ff2b54d8d596da2c54829ae3dd900f5c18eef48efa03ef6694c
505bea17b7982246c862d081b9fdcf295debc60abec8b0ddbfdf48bd302a3fe61b21
e
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-1">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = 44c46e78aa6386cee57a46c75d124b13ced3e5f055caa3baaad61501330a4
24463400453c97245a8f7b4c65f2c4c3dabd09a049c034f9e20
pkSm = 78f4233110896fd41531fce182094c3bc4cf65f97b23078476b3b68118736
617172d3735c5832081864e7c75cd3ddb449e93068b34ba863e
]]></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 = 38b758b69dfaaff8576eaaabfe70801813d95eb098f85516bcd
46a0f68d1ea8cc1dea3bc7c8d340ee77c5bbca6e7d723e51d77e0807acd0d
EvaluationElement = 7a8374bbae55dfc91e10a9d8042015419c505a6a8ac54e5b
93867747eb04252aba316d9f750fa0c54458aa8c90e963a60af5ae6f141af8d2
Proof = 2fd38cf9829c5f3fd294a5eb114356cd67cc5839cf797dc060273e07cf57
0dbabea029f0bf4675d84866865d1d146bfa38eff8195b59cf3c180bab30509061b9
d02e70f709f085dc8c98c0924259c9a3463ef5ceb97105989941155b98bd7b03b1e1
e538850139dc1a56beff1bb9401f
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = 3db64b6f803391e7c9803135457da250eb29778480c30f29d53e9ff46c3
ce5ba9555418fc28af347c18b77a990eb904d0043a3411837b6d316f749428a9a370
4
]]></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 = ea9b2d51579f5c07c5c511cf3bba888f5fc76d6ce29075a0b02
5adb3daf4b568045c28e6bd00442251597ba6264e59beaf46220d8405fff6
EvaluationElement = f6d23094a82e33e231003a1ecdd4659029d613932b767451
c607ec428315283fe0b121bf09d7c88cf2ed50910463e38383fb52e5562a87f0
Proof = 104e45c171bd7ca9119af1091e3175c8af4e9efdbd4704b3d5a8dfc99465
9842ea021da27a9c1e0fbac369627eb5e9cf9e82964b7412081f15f6bfc5c68425f6
4f1a4dae420a03d582a6cfffc0fc4da71a145bb5305ae28985e15e067d28523578ea
696205cea28cf5831abed3e40f37
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = 4dc9ec52b6aa7f1f38a320d10cb58e0d86b040f6376d2f178f42c99986f
e932aca7162cb72dd94056724617979c0f7ea652b1492bbad1d82748a38ff4daf129
8
]]></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 = 38b758b69dfaaff8576eaaabfe70801813d95eb098f85516bcd
46a0f68d1ea8cc1dea3bc7c8d340ee77c5bbca6e7d723e51d77e0807acd0d,5a788e
f7949021b22da4a4e89b2443458c96fcbec8b66b08df885eec8fb4070fefe8b50e08
5e043c368cc05a9339b5ae31eb6482efc0d933
EvaluationElement = 7a8374bbae55dfc91e10a9d8042015419c505a6a8ac54e5b
93867747eb04252aba316d9f750fa0c54458aa8c90e963a60af5ae6f141af8d2,0ac
81e0e5b9fa6d90be58a6fc3fb4fde57e0efacbe210cebc2c85a6e934114b5e0e5ba4
cc202bde7cd7708415cdcc2312a51fca6ad6f06bf
Proof = a221b134d99ba97cad98bf45341eeacd8a402a6e4c5ea5f93cee54ad0f2b
ee544f67d2859a5253cb9def403bfee9420a5224fad35e3f9a3fbb5f28f6b8abcb34
130beaa158a41d1497aacc2f073b2da5471067bb832ec8044f417f528e2e6ccb897f
992424220d608b5e7bbfd4257e1f
ProofRandomScalar = 63798726803c9451ba405f00ef3acb633ddf0c420574a2ec
6cbf28f840800e355c9fbaac10699686de2724ed22e797a00f3bd93d105a7f23
Output = 3db64b6f803391e7c9803135457da250eb29778480c30f29d53e9ff46c3
ce5ba9555418fc28af347c18b77a990eb904d0043a3411837b6d316f749428a9a370
4,4dc9ec52b6aa7f1f38a320d10cb58e0d86b040f6376d2f178f42c99986fe932aca
7162cb72dd94056724617979c0f7ea652b1492bbad1d82748a38ff4daf1298
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-1">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = fdd59cb218c7fbdcd48b18ef21ab647a6c210110c765bc3da6c11e563671a
48402c23129ce2ffd021d99da5a2d04158883c65d7f74a4901b
pkSm = 1223e0aec4ee5bc19181078be380cc745d1896e1369aed3cc8a45b40ba3f9
aa1f79e23d542d6529e17465d1954d75e336910c6417de99200
]]></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 = f86104fcefec6bdca7767bc3e6a2ac9de2b00546579fd50ff66
687df531f7a2dfa8689a6cfdf91efc32d6fff490e722990752b7bc4bda28f
EvaluationElement = 76f27e6fa79cd38638e35f5caa5d641e41526fbfd9272c19
be22dfc8cdd962e6d5d4e0c605c9bd6588eb9698a2bbf792a0827bb1116c8812
Proof = 3a1b3400ad16e1562e731c64520fa5a3664c1487ffe6537e85029842904d
3e01f9e7435b881ab9346847cc3470a2b37e6a10a4ef7bd36b2d06c602086a33252f
39c562aab5820a66c3bdf9d72583587e93ea893725be535cdeca1094d5b4dae119b4
9456162f60034a904f521f7cd818
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = 2a08f81bf204eb43a57dbc011946861ed715a2fd3d39a3b35e43c74d07d
4734149ba163389a02f6cd33fbb5b84e167d35dca7a7dc00b89418398c255c8293ac
6
]]></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 = e6f508abea28cbb0242f0dae1c0a92e017127edb7c8d8e0ec98
a5ea25c6bc9bb86bfc0bf9b8a086302e29a2a4b0a1d9d80f2d439cfba3ec1
EvaluationElement = 1ea637b039e0ab12c6959c74e275471e33655007a7fa23af
97ec578bcfc8c3381d4929ebf51433b76460d583f16b7cf1e75b9708f5d9d2f7
Proof = d53a1bfeafc5b47fc86406fba080e57434a7004a0739399ccb356f790b13
585da9d69a25c526e039fa06ad6a5781283ea7997eced063fd32e58bc95d57fd771c
ad4a7e23633ae2049eec5ad86ade6a5e98d44f78fd86b5f55ab3c7a03025d6aec1f4
f50a2bd7b9b554841f6b4cd23d14
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = 80ac73a09fbf8cbd329ff1b7f42d8d14e46ae5b732f776f3203f0680daf
265254360da0afcd9dc1d0cd3858ab21ce8e7a19f0426d7e701cfda34fb8238c9e43
4
]]></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 = f86104fcefec6bdca7767bc3e6a2ac9de2b00546579fd50ff66
687df531f7a2dfa8689a6cfdf91efc32d6fff490e722990752b7bc4bda28f,50c684
9c8f6355687bbc9d4675bcea953cb913c5447c9c8400062ae37f808ce8a75d592c56
f3393d4ea12ec72f9f84402002eb497201089a
EvaluationElement = 76f27e6fa79cd38638e35f5caa5d641e41526fbfd9272c19
be22dfc8cdd962e6d5d4e0c605c9bd6588eb9698a2bbf792a0827bb1116c8812,7ca
a4dd83ecae98fc3e282a0e7df1887393a3fc1e17935dfe355da394756fbfcad65386
eeedf1ba8498411645448c7027753cd9090198c02
Proof = b4f869bf5ec65e0152af5bd29f9fa32c3dfc00355e4e019feda07a281547
fb2f0c559c600bf6cb52a92753264d1c1367e0134b132880732ec70a8c741d60370e
5c22c4aca0e4564732b0157858f3c968bda06aab34c71386ec88afe76ec2c14bf56f
0adf7b05bab826e4aa034cc78837
ProofRandomScalar = 63798726803c9451ba405f00ef3acb633ddf0c420574a2ec
6cbf28f840800e355c9fbaac10699686de2724ed22e797a00f3bd93d105a7f23
Output = 2a08f81bf204eb43a57dbc011946861ed715a2fd3d39a3b35e43c74d07d
4734149ba163389a02f6cd33fbb5b84e167d35dca7a7dc00b89418398c255c8293ac
6,80ac73a09fbf8cbd329ff1b7f42d8d14e46ae5b732f776f3203f0680daf2652543
60da0afcd9dc1d0cd3858ab21ce8e7a19f0426d7e701cfda34fb8238c9e434
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="oprfp-256-sha-256-1">
        <name>OPRF(P-256, SHA-256)</name>
        <section anchor="oprf-mode-2">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 274d7747cf2e26352ecea6bd768c426087da3dfcd466b6841b441ada8412f
b33
]]></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 = 02ff9dc7d4350ab6fe1f41299ec5fa8283b6ef37fc62682ea69
6142e13aad4ae9c
EvaluationElement = 023a5facf92477164f10cc6bf35b4d9272bfadf98dbabbe7
b7a137efa1af6546fb
Output = 488d693c0d43ab75703901fa1398907cf7dc7a90978d1c2f0def63c88e8
1b8b0
]]></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 = 03b3cd723330e42975e6e18a6157ecf9455894c18a0189e3e62
4a46d705f790fcc
EvaluationElement = 03f1ea590f2cc4afd45a841285c6be4d88825a9c6c04eb55
a1ca996583dd3e2e9f
Output = dacd8400f6fae62beabead9bc27869b5109fb5d87da338ae2488712ec25
f1be9
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-2">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = b3d12edba73e40401fdc27c0094a56337feb3646d1633345af7e7142a6b15
59d
pkSm = 03f9fc787c9a4dda44a4b811a961d1fd60f87be7465b8a1b9058dc534dae7
0624c
]]></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 = 02bf13d60f3e39e2018c7be9876d88b52e56c0fc2847c8550e3
cee152c51cf72ec
EvaluationElement = 0253e64b5251607348f2b46064805275a849e44db465f649
267c54bd7a774d670f
Proof = d0bff8c87ee38f2b2e9e28161fb0f3bc7e4c3bee7329276487d4fd98d4f4
74fff793a846ffcb44d48f9545e321d89e4e6bccea858089732abf10bf19a220a936
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 9df5d51a9149a86c3660396feabaf790b8c838fc96012adba5acbd913f2
a4016
]]></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 = 02a13e263fd9df5aa0078f8d5d6cbe8763e5bee69ee06841a66
dad0db8701480cf
EvaluationElement = 02d9f54fcb97bdab47e6664376a75911f1c3e447f5754550
89d926fbd032cb6e53
Proof = e3ccd78a2f2428d04599c90d4b45e3de49b38a3ba0c80a224b8125747648
718319238dd349cdeb533a6d24333b56aafbb202bec1831511717b231b89b8b36853
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = beef8ec835625f610d616d32b1d13f2f899f07c0b8089fa48a1f0ecbc5a
91b8b
]]></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 = 02bf13d60f3e39e2018c7be9876d88b52e56c0fc2847c8550e3
cee152c51cf72ec,0322b89e261428d77367cba2aa78fdfa2b21c2919150cafe802e
9020c7f95ec180
EvaluationElement = 0253e64b5251607348f2b46064805275a849e44db465f649
267c54bd7a774d670f,02182b225cfab1d2e25da200549d8b5e2c4581aa7b7bd85be
f9b61a14549f58230
Proof = 900fd64d21320b6059a2810f7046066c4c91a5f4e4f6063c7b51316a4862
2de8f3a28e5f1d0ebe8ae77fdaacbcb1ae92685243e9ceb813bb749dee6c7123270e
ProofRandomScalar = 350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = 9df5d51a9149a86c3660396feabaf790b8c838fc96012adba5acbd913f2
a4016,beef8ec835625f610d616d32b1d13f2f899f07c0b8089fa48a1f0ecbc5a91b
8b
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-2">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 59519f6c7da344f340ad35ad895a5b97437673cc3ac8b964b823cdb52c932
f86
pkSm = 0335065d006a3db4fb09154024dff38c3188a1027e19ce6932e6824c12764
47766
]]></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 = 02811b5218bd2bb8361f990efb6062f1201241bcd6f053a5c35
c34dcd7292e7730
EvaluationElement = 02555fc8577c4f88eeb13bc6ac53994f8fb287a33a704592
05ddff91bc19b6a2da
Proof = d87b112dfa11b77f226b85693ab1b5f63adfa491b6e051e570a12392a926
c4816778b527526ba6212c4b0597f13e05f5f9b2223429aab82cd2596625ab1cad0b
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = af6525716fe5dd844076bb5cb118ceda08c02c2d1a02368922ddad63f40
f8b44
]]></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 = 03e9ddbb1fa70461119afcf0ffbfe3fcd105690c14cf0e07872
e72d4f63aa0e197
EvaluationElement = 03156037ca1ab2166e924e6197344a9885256de2cd7d9432
ae36e3f94049e94bbb
Proof = d087b632e2aa4a67e0bc8b7cf012646217a2dfdbf49c60f236a43c66c72b
7f2767b85dc93b96a11e3286ef1ff1864b544a68c2c2d8c2bc35ef7cf7dd34189d3e
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 192f4e5d4f89ffe4b9cea5c1c9619ffe32443a5c04fc35f98c3821420cf
1890c
]]></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 = 02811b5218bd2bb8361f990efb6062f1201241bcd6f053a5c35
c34dcd7292e7730,0366ff91265bb4a9d24130b9e8cd3ecc523084b512b6b0722de4
4049616b8c374f
EvaluationElement = 02555fc8577c4f88eeb13bc6ac53994f8fb287a33a704592
05ddff91bc19b6a2da,032bdb191ef5604cf43d0c37faead30c4b2b21e3f61c0d47c
cc84850fc5656e500
Proof = 1bd5f64dffa2ab8d6532122887ed55ad17d114020901a7a01cf2412d568e
22b6d0536fd6dbefe9f417060468ee3cc451a8f3750f4d8d4acf1e98437248cc7fa2
ProofRandomScalar = 350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = af6525716fe5dd844076bb5cb118ceda08c02c2d1a02368922ddad63f40
f8b44,192f4e5d4f89ffe4b9cea5c1c9619ffe32443a5c04fc35f98c3821420cf189
0c
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="oprfp-384-sha-384-1">
        <name>OPRF(P-384, SHA-384)</name>
        <section anchor="oprf-mode-3">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = c0503759ddd1e31d8c7eae9304c9b1c16f83d1f6d962e3e7b789cd85fd581
800e96c5c4256131aafcff9a76919abbd55
]]></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 = 0396a1584fedc4d91ddb753a0c49e0aa2298c1936dbc935d60f
e793d82809f44ff05fbd1922a2cae789d700b5ef4310fb3
EvaluationElement = 0361804cebcb1873cee5e51efd5257cd8b095521cc0089cf
4c1100b1d749e212a044eae6d4f3d852e379eeb1bb54047823
Output = b7ccad41ed7f56be97621bbba8cc3a4f5e8a46a28d72b0fe089d12802f8
6f080b20726e01a99390aba3437ac50c640d6
]]></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 = 0370b0b4649c0880d44c421a3ca7c915b1b6ffa61f5a1290aa2
2258b006d148e5c105d47725e1ee1b2483b9c5666384038
EvaluationElement = 036d0aaf31ec411ef8e11c68551434883468e56cbd5d615a
c8c52b9dc7af326889d52d7466c5eed47f8c89707976aadc64
Output = ca7dc32dc6434101f35a790717dd591e5963acc86d20fda68011fe228fb
76be8da7f42c6a92284df88fb8e69480a3cb9
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-3">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = 514fb6fe2e66af1383840759d56f71730331280f062930ee2a2f7ea42f935
acf94087355699d788abfdf09d19a5c85ac
pkSm = 02f773b99e65ad26e8cd20614910ce7ad74c1baa5bdbfd9f124389dc8ef44
b5989f5bf036f6802dc2242fd7068b73da29f
]]></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 = 03022e23d8356d74d8f9a24ade759fb4e7cf050d1a770110878
83d4db52f16751d8d987fa49764c157c1039c4cdfa5ef7a
EvaluationElement = 0202bdefbc2d55a37aa848df5efc561055235d9190da9ec3
0ccfb84d93b033a29c4fb1968c55c63a0b90a205e1e9c4c19f
Proof = 929ee0254047350f580cdbd6fca706a9d110e4fc0aa1383af8d35a536795
69c038d90900e8810eca177b9cfd6a2d0f1fb5ed7a2e0f3107719cbd9c74ab7d9502
79869f67551b629c3706c8f9cee651d700453ca44e43b0a08c05502cd28f3960
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = 7eb3cc88d920431c3a5ea3fb6e36b515b6d82c5ef537e285918fe7c741e
97819ce029657d6cced0f8850f47ff281c444
]]></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 = 037ae30a62126a39ca791aadafb65769c812a559c7da92820e1
43350b6bb8cefb543af2e0179664f9cd0d1499c018a0b18
EvaluationElement = 0355f95a68e8c4f0d40910e9a85f09109e4e7fff84f75db1
a4aa8e21c451ac2d872113b497bea6c0be1b535241557032a2
Proof = f4ec262642fc9981fe5d1f0a3737f2d09ec9b056f577224013f5a3d09812
fb22c6b45e17150d8fe3a8c7e63094cdf40a60ae1e50fc2e1678954c1ecbaed2f7d0
7e6d597fffedc7aca450ed64164c46e62d1326ff1f6eaeba4b5dd151e953e060
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = fb538f84dae5f214c5adfcf529c6fe63bc46d6a4073d540cf0dabcc7c8e
0f3c1b43b606002a9aa52ae158a19d900c136
]]></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 = 03022e23d8356d74d8f9a24ade759fb4e7cf050d1a770110878
83d4db52f16751d8d987fa49764c157c1039c4cdfa5ef7a,031ee43111a2406b09eb
4fb2a3a5fd7c690c0aa51158af766c9df1428bb18195f054c5f68ae1863e6ab3dd42
98b3db712b
EvaluationElement = 0202bdefbc2d55a37aa848df5efc561055235d9190da9ec3
0ccfb84d93b033a29c4fb1968c55c63a0b90a205e1e9c4c19f,021fdbb3b92cf4f8e
04534bc1a9f62596667c3ea49a6e89f1610b9f7f89708e8730df159827ea92e26fcf
db2063920c89c
Proof = 9cc7fe5a120cec6ef0d877260cf1af1861f281aa0015f371c8830f93f286
8f5891ee6f32ec6fcbe130a50de24c93b131261eb4a242941c8d5ad9ad2f2be402d9
386ac4afcf5e5498f35cc3db0442a77e139eb56a7b3435177e7bf1a48cef184a
ProofRandomScalar = a097e722ed2427de86966910acba9f5c350e8040f828bf6c
eca27405420cdf3d63cb3aef005f40ba51943c8026877963
Output = 7eb3cc88d920431c3a5ea3fb6e36b515b6d82c5ef537e285918fe7c741e
97819ce029657d6cced0f8850f47ff281c444,fb538f84dae5f214c5adfcf529c6fe
63bc46d6a4073d540cf0dabcc7c8e0f3c1b43b606002a9aa52ae158a19d900c136
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-3">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = 0fcba4a204f67d6c13f780e613915f755319aaa3cb03cd20a5a4a6c403a48
12a4fff5d3223e2c309aa66b05cb7611fd4
pkSm = 03a571100213c4356177af14a7039cfee270ad1f9abde42ac3418c501209e
d7b2fc0d4aa3373c12ba956fb555b02843fc8
]]></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 = 03156aece0ce92e9eb8f7a9b7f6bd30230a048d41384f2fe49f
1f9f69e180c23390e3ba8d0ee66dde6d637f03c06385f76
EvaluationElement = 02352ec7586660cc4257a9e78366727341db0825e431fc82
4a70a91019b67be26d8b880b2d4d8e734207d4a21a23429d74
Proof = 77bb1ca3ba4013b93ccb302db838839098eca743de542d3c79d189f2adf0
01999583a01aead6c248a32ff13b7f1f3d6b2dd04f653a5beb0f0394ad83ce5e79ea
08ae029d669b918b6d62ed3b77b08a07f04bbc341fae06444d196746da4da884
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = fa15c0fe8706ac256dfd3c38d21ba0cd57b927cfcf3e4d6d5554ec1272e
670079b95cdbb2778e0df22baf50f33e12607
]]></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 = 02d46e0e2d27d8bb126e1201e881d0070b8807cb5635687b20d
d4a3a248e7a40c50a1ad3e905e43342771eb23bc8827a00
EvaluationElement = 030879805ff65cb536293a1449c00824e55c4c1b25379f2e
c17d97923055169a6d97b46ed7b11bb661cc8cb9535abc3d66
Proof = 9982a8501f45839213441d4ec501cf496d06fffab65f13ca3b3e66d21398
fe9e0e04aafdf50eae214fa9cccad3c53d524d0f8c185ed60b11fcf5c7e82e10a8d3
f3b2ce1e4a004d65e6ad596eeb5738453465d881f2770858cd46ac32f0e16121
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = 77cb533216c32cac017d706d5f0ee4630bcb0bfefbb980d95e98dc240ab
c70a944a44cde69b805aee3a39b2eb7d834be
]]></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 = 03156aece0ce92e9eb8f7a9b7f6bd30230a048d41384f2fe49f
1f9f69e180c23390e3ba8d0ee66dde6d637f03c06385f76,025663d73e3418039fdd
ea1a212d254ec0103f28904e588b73c7da8298347706b2f69902a98e8d01c7aaa69a
297b14c7dc
EvaluationElement = 02352ec7586660cc4257a9e78366727341db0825e431fc82
4a70a91019b67be26d8b880b2d4d8e734207d4a21a23429d74,02f8e532fabdd09bb
2a7391a2a80c14f265c0456009199b77eefac1013d4a4f449dfe46d5d6d2d4d74f8c
9fb1e2868b611
Proof = f8c938b5d2aff7d1a05ecdcf4178d682fe7b35c375be5db88dfa59f488c6
e4a68d4f99f16330a06f918e264ad68a78fdfad91446b72e1a3da2a65e531d520dd0
4fd91dd49b09037648e04a44e83d0dfd2aab7627e7389818924ad9bff591d646
ProofRandomScalar = a097e722ed2427de86966910acba9f5c350e8040f828bf6c
eca27405420cdf3d63cb3aef005f40ba51943c8026877963
Output = fa15c0fe8706ac256dfd3c38d21ba0cd57b927cfcf3e4d6d5554ec1272e
670079b95cdbb2778e0df22baf50f33e12607,77cb533216c32cac017d706d5f0ee4
630bcb0bfefbb980d95e98dc240abc70a944a44cde69b805aee3a39b2eb7d834be
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="oprfp-521-sha-512-1">
        <name>OPRF(P-521, SHA-512)</name>
        <section anchor="oprf-mode-4">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 0152e55f3a5d836ab6c2091a904ba4b4f92e51ba59ecc211b4fc771f7c6c8
b17fcbbb2bed8a65afd7811ceeec3eac83df6a58515b6d3c71ee0ffc349e28c3fb78
d83
]]></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 = 03016480f33f005c8a8eb1003e48ebc22e082d0b86678f8460e
df21cc1518a13bfc0001fa143d474b18214188d93a7b3124b1b385db4cd4e356ad24
923ae55d70ce8a7
EvaluationElement = 03005fdb56bf49fcd073b1c4cfb42ceef5666c709785ae82
d659e4d75c0f5591cbf812ca9ffd992ac67c1877b63978f417687a2a6c17697e858c
f715843f9e4235566a
Output = ddcaaceceec790f4858a09f3e06e74e8b0841681a3d45ab1393d0948379
43f782d9ed22ae716a642d4ee428ddf1dae9ff631047864b99a305412aceb7efafa3
2
]]></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 = 02000e860d3b8205e0cb4f289771c8e6189b47c60cbff24459e
12a60317ac242e9cb36ab033a620cdee5628ecae4a81303e7464d52194d801756911
fd7ddfa5430e69c
EvaluationElement = 0300e2663f17144682b25de378531abd6d065b770eec073a
42494719f27748f75b4ab11aecb06bf8815bcc9eeb3ce54978605bd8a54c22a1dea6
2da1ae5f9f5e5e90f4
Output = 287712c6dbed773f39925fec0ad686dfda4a679cc7e88fa60ba9d3a7d71
2a11d4a0445995391ba56cfb018922e0d4bb4b25ec0965a33170c9b00f45c361b021
5
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-4">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 00fb5507f94782c5b72acc16b9eb21064f86b4aa525b9865258d157b0431a
b5c3515fc975fa19ddb28129c969992b31d8946c4e354bc49458bb25fae58f10ac3f
678
pkSm = 0301322c63ad53e079791739169e011f362f4396a8e93fceeee9cd814d471
80e75ffd717820fe9e9c763fa595340cd80989c31fbd0200572080752c73b80b7532
2f300
]]></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 = 02016dafe8eee47b591592705ce4d5231563b637e5a51b425b8
81f1cc576c53caae4ec59fd6e3a918d5c35e6db77cf3a5862b71a8b6c7eaded3ebdf
0c6e14778c03a8c
EvaluationElement = 020124a0ee09ade261bbf67e1e3d296655c97e6c5c14c71a
386e636d8f55d29f5f6dcec954ff28bfc7e6e63240a52bf278ae94b312be3d8bf850
55d2a1dbab687905b0
Proof = 00156561564a9128de6e2fb92d0ee065bb19192ff86549c37fab777f2d57
a951ff94b3832162cf02ad73287a0f0906045878105d8ab54a7cc9a1a0039d0cb241
ebd10197e5cef77e8fbe0414f86b86fe2e823e0d8dbdcf2ccac54d273e814da062ba
941a27d1e7e28c44cdbdaffe392cc915bf8b9add15d51b68afd6e88a52d07ff8b3d1
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 16a9387153bf7fa2c733d42f299877324cfce3b39093e72067c3d59948b
f745d77b2fe9180ffb442ec45b575eb4108d2b6f207cbfabd7bc540ad2a087cfabca
2
]]></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 = 02008f585341e32244d67033ddcf4c1cc30f7661c4cfc177f09
82c69bf9c90e1da02d86a26ece60b8c42b278a1dc85afcc9cbc6aedff15cc092af03
5100b915c2bb4df
EvaluationElement = 03006cfeb22e141859e6a2050a714bde8ab8109abb2b42bc
8f18ace67121c1811c9e95e7cf8ffd4f13f8cee80fc3c69318b0eb30ecdf6e7d7e84
faefa6f0b8299217fe
Proof = 01db7070ab756e8c2b12cb81c40daac6ef1d5137be3626a10ee867b0b736
ae5ab05aadbc3ee3d1d0202b7687e1614765893cba67b307c67a8a4ce7b3eaf3ba64
204901ce6f8dc9234d27373b1027982d7e3bb196d157403f50c2f1bf0fa701753ef6
3d7265c0b1016e662456d4bdea55b3d983350b2c2ce80e192897161a1b780046b952
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 0163635204be5347419796f3564b36d6e89c9170e4fcca5b6df79d3f676
f641b2ae3ae1a64cc49f3d788e276abe14e3c38bb2f92fdba0b45ed122a6930e7d96
1
]]></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 = 02016dafe8eee47b591592705ce4d5231563b637e5a51b425b8
81f1cc576c53caae4ec59fd6e3a918d5c35e6db77cf3a5862b71a8b6c7eaded3ebdf
0c6e14778c03a8c,03005467c05309dd2b9ef584dd33ae30e93ae5508f2ceda71497
63b4b44fe797f7d0f4c7441298a0ed821ede9ebdc8c0215f96db57c64feb734a145f
00d00f0f222db1
EvaluationElement = 020124a0ee09ade261bbf67e1e3d296655c97e6c5c14c71a
386e636d8f55d29f5f6dcec954ff28bfc7e6e63240a52bf278ae94b312be3d8bf850
55d2a1dbab687905b0,0300fdf99a9eb28097074daf75ba9fe16868690b16165f58f
9c4fa266d5fffa5a87026a98ac3b0ca6dc7e42f49140a004c325646aec5ddc778db7
08748cc2f632ed937
Proof = 01935896f4c03ea5257d6471677f191ea7dfc777cc1e15f82e423cf1948c
440ee56a1c5a8627aad8da8e507a7f382b45255e55a1f1afc99c6b14237ce7cf0855
40fa000fe413be351bd11ac910b1d4af34d2c97c7b7a53438340dd659272f3d86470
35b13cd8072903b9a3adf8e89bfb1f77d732fa224f32674506e3e88e29ce182186e3
ProofRandomScalar = 01ec21c7bb69b0734cb48dfd68433dd93b0fa097e722ed24
27de86966910acba9f5c350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = 16a9387153bf7fa2c733d42f299877324cfce3b39093e72067c3d59948b
f745d77b2fe9180ffb442ec45b575eb4108d2b6f207cbfabd7bc540ad2a087cfabca
2,0163635204be5347419796f3564b36d6e89c9170e4fcca5b6df79d3f676f641b2a
e3ae1a64cc49f3d788e276abe14e3c38bb2f92fdba0b45ed122a6930e7d961
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-4">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 01e0993daeb97f8fc8176089e4e6adb4c03dc9b18daf7e976ed7fa6f3cb89
c40c6a84156f20371ef23bfe6e049423244d7d746c79ad380ac7fe285aba162419e9
012
pkSm = 0301264d23f5d1d615f9747d2a7177a419dabde6ca0f5a047979dbe9bce33
7241b7d2959025476f354c4f57017363d667b83b691fad8c172959963e6000de9533
f187a
]]></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 = 0200e36b187060fef4f4cfef21cdb4ef8b5793a1bf44da95229
062303688d4cf6a50c16b7c943c79d91357223b56866351a17a9c7f49730fd28add9
301d399c0cf206c
EvaluationElement = 03014e216c05cf1d108829946891cc44693b0a411851a03f
c439130054d920eb8ad596a4dfa5314f68d298a094777855aa55c98480575a3816cf
ac52f838693e0e7fe5
Proof = 00c5a46ff1e7d8cd2711daf8ec8752451c4c7ed815f3e8d51db64f1eed83
a7cc33f0f99ce067676c478bd616a9ef6377994e4bd69051424a576a4e26f0ec7ed8
1fd000b7ae1eaee9e5b6991afdbb2c9c29a04e2ab3a2066df89308410a59267a60a2
2a47666de009646c78e9094c9f4de177a620e97f63e35ada0c8b438b4605248c9087
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 3be90ca19fbe2fc250de62792c7cf4b6b5555c8655fce1694fc7563d5d4
c5001efd1e91fbbaea31d75e33dbdefe57420c395f1ac805cc0095c4d81a0beddcb0
1
]]></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 = 0300357933cc17cdcce862b794a4161d8eb10d23009695639e3
fdc8dffc235e19e92e0a3d3c7c6249dd9dcd02da0a8f061d89b6809d3292951ee0e9
ead21a62d1335fe
EvaluationElement = 0300a5132ae9c429dd33b25c051f45451c6e54e154d698c3
f3d8820bd9607e7a65762911c647b3460be166f37ba443bf000b23552298f14e0555
b3f0ddf0e900e1d38c
Proof = 0004f0791cbe6ac6f4074834e172beedea19ecd3a2c504a71fd870b42314
d3b072633a8265c774668274dcbcaebf1726768fab4edec69a33a7d37095ebef3e1b
b44900f0a175b56ceeae8a87bc5553405e0b030ebcf8303befc5890c8afa1e61fd41
66480ff428eae4193f12bbf1fc31d5d7196ce8692e37bc9a63cdf4c9fafe10a2dc9a
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 1d90446522e3c131e90be2e4f372959ae5ab4f25ca98e83e5e62d6336c4
8b5ec22fc6083d2b050cad2bbc22ae7115c2b934d965ffe74aaa43c905cd2af76728
d
]]></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 = 0200e36b187060fef4f4cfef21cdb4ef8b5793a1bf44da95229
062303688d4cf6a50c16b7c943c79d91357223b56866351a17a9c7f49730fd28add9
301d399c0cf206c,03007530916e8ec76199429667a82ca4df65b913d8b1fb157319
e73706f118b4f46047c01b7da024bdf5a06f2f4e879b1a1cd3fcb1ca2c37ce158cc8
625e76b3bb1cc4
EvaluationElement = 03014e216c05cf1d108829946891cc44693b0a411851a03f
c439130054d920eb8ad596a4dfa5314f68d298a094777855aa55c98480575a3816cf
ac52f838693e0e7fe5,0200005cf5e719b3066dcf0fbd6228bc921cebccc49feb1ac
be9d9c4c88f4169e1d0d5408f92ad9f599c2f5f6d7d4c6e575e86f64c4eead2bb9b3
e8e04d141a90b7382
Proof = 00d846f4a2a7722fe6a24e7257e43d88c3e01977282fba352c08fd38b69b
f1df64f90660b03b73abba50cb389af3d602da66411401d3c9f87bcb6363d6406e0a
cad3018a44bcda83524d4a48f0ed96ebca96d7626b634ba28fcba0c21956fc90c516
859df8ba6edeb7a44daeeec51c3a56b79c1f9e211e9974e5f293ade221523953d12f
ProofRandomScalar = 01ec21c7bb69b0734cb48dfd68433dd93b0fa097e722ed24
27de86966910acba9f5c350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = 3be90ca19fbe2fc250de62792c7cf4b6b5555c8655fce1694fc7563d5d4
c5001efd1e91fbbaea31d75e33dbdefe57420c395f1ac805cc0095c4d81a0beddcb0
1,1d90446522e3c131e90be2e4f372959ae5ab4f25ca98e83e5e62d6336c48b5ec22
fc6083d2b050cad2bbc22ae7115c2b934d965ffe74aaa43c905cd2af76728d
]]></artwork>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y9+X7bRpY2/D+uAp/zR6RuksG+OJ35jW3ZjjuxrbEc97yd
yUQFoCBhTJFsgrKtdjLX8l3Ld2Xfc05VAQWQlPcs/cZZLJFALafO8pylqqbT
qbNpNnN5031czJsXzfKydY9beVkt12JRLS/ce5eLctMsF6178Pj4yb320L1s
m8WZe7xuLuT08bqSa/f+enm5ah1RFGv5Ai3Rc061LBfiAg1Xa1Fvps16U0/L
en02fbFcreupnziV2MibTon/ny3XVzfdZlEvHadZrW+6m/Vluwk8L/cC57m8
erlcVzfdB4uNXC/kZnpELTpOu8EQfxTz5QK9XMnWWTU33e83y3Litsv1Zi3r
Fj9dXdAPPziOuNycL9c3HXfquPjTLNqb7q2ZeyReNFW7XPCHasS35vLV8PPl
+uyme3stXkj3ZFlvXoq15M/lhWjmN12BF2aVfiEP/v2MPp6Vy4txZ/fEP6df
YxIYuPyn3eP6gsi943vu+c58eVnVc/Q6ARXKGX/TYoZyc9P1Pd99uny5aOWi
ck82/F3ZbEDQE7Fw72Edy6Ytl+rz5eViQ7T+btFsJD0O6rfusnZvXch1U4rB
rNYXtfjn+b+XXe9bU3o0c08u52AcYdPvUVM+H37+K85igcFcN4U7M1qYvy2X
lTWDO+frpt0sV+fgbvvbX3EepXj57+dSrCB8RbNpZxAEx1kswTib5gXkyHWf
3LsT+H5+EzIESRp+kaZRRj9CbF+I8upYtO1Nbl1Lv/7cpS/U52J9RvM532xW
7c0vvjhrNueXBVHvi5V6doVHv9hIccHPszC7tZi3JBm373vRoP2n55Kn15Tu
UVPXjQSbz+dgevS8LObyYmenEl0tNrNGlOsZSP8FNEL0ReglO3p03U6++c9U
/61X+WgG8cWydJ+qlZRrjAha7olspViX57tffjJz74v5XCw2b379zrm4vDiW
UIvgAPT7+MHM9/Cvl34RTuPIm0aZl/rT6MeUH5bLhZcMH/P9NPGTNP/RxxP3
TjxvZytpGvjT9Ec/wEN//eab//StVnwv/+Lu5Xp5cjwLPD+ZhZ56yI+GTeVp
Ng2nSRJMozjxsmn2ox/iyZO/fnPipzfdz1xRVWBLrNIlpn/lFrIUl62kNtwX
mCDMgnsuWndztVq2M3u5b5wcf/3g0X9CsTFHkf7G8i/X0t2ci417LNe1LDdo
8uumAsebZ1q3XoOcDzatnNc3drJEtWyYFcw8H9w5unNC00xnSWTxxV8vFxBP
+lyJJ+RJtiQXhkFuPFjcwEDpCffB3bt33TDdnGsbI8jiibl7Z7mo5VouSuli
qkdQCeumuCRRvbO8WF1uyBCeXLUbeQHzyCM5vKGbB41IGewb5D5mVernoZg3
5/LcPTlv1lChjVjseRAitWjauXjp/hXqqHze7Hnu68uzpfvNWrws/3n1fM8z
j6CDWvQpXskFaZ6nd56cPP1b4O/iGS/0p17qZfE0/DEgnjm6f/L0mZ/1z8Z+
/MVquZKbdop5Z1PPC0hsT+7e8W8OOeXuHRd93IW1WJF6uHO5hpW9s75abZZn
a7E6v9rNCC9fvpy1sjxjbsAP/vRFMFtV9bvrBiJiJZj7lmv3LrRT2cjFZjAG
hXHcA4z2/iFef/Tg5CmPtO2mnHhB9gV9Prv34Phk5mfJNHKc6XTqigKMI0ro
61uLN+EsBbMO3aZ1hbt5uZyuxHpz5a7WSwCb5RwyuHkp5cIp5zxGvEy8DWnk
wZcdW26gcJeXG/xG9kTs64z6mjmknXUr6OgFyyQ1gG/xebmWGxcobMK90ee6
8/GzsDvoD/Z0w5+QBUTf9KMZ/sR+fQ6dueg70qN9CUODHx3+lmYiFlebc/6h
wOfXjkvPQTe8kGhKrh3zBo/OhcnUXWGgCwarsK0LYLh26baQ/La+Ar0WSyYQ
xv85mmzqRhTNHHb88wkQ63wOFSDcZ/QyWlE/YL7t5RrUUNNruVV+90ppPWuE
0KJowGlXskTTpcsmdSNpNm51uTYLKF/J8tKMw6Zj36kZulPgW7BKQ5p6ujRM
NnG70R6b0fIPeGm+fNkPtmek1tkszdK6q0u0VGrS4XNDS8VorCdnMO7gVuD9
ywtaVj0pSW0yeScOD1Utk+occgehw2BJl9KKNwu31WJIxIBrsWTX4oxdiwle
KOeXFejiSKMoSha/ce8sNxh9dVluDNWUILv3luvL3lYriXYO7tx7ch/ituAn
Hzx5em+mhPaiqaq5dJzPyCao9jBZiPB1ouTeO3g+cV8p8V240ugSWDpNMWAd
pzbvbMRzZuzB+j9nOgn3hZhfSveVCwOr5Ypn2r3cwOGxR9KoyaIJ0LR76puD
//rx0P1KDYx+bKi5CqYMPV827bkaEZld4aqWMNhWXKzmdjPQXjTSpSITvpYg
OYDpggeL984kBup8c3CopKpXcljtt1Np+FIxoKPmrzhz4r6EDEtbeM6X84qa
oqZ7glmKhR9w2iUGqRj31YwBaNej5v1iCYvPQkM6bIklgsFa0zpgXp0qdcya
tpfgmk6Sh0rMPKO1l7ulvRylvZ5/OVZW1RKdQ9uoV8ba7hWQpml8Bt57pnXR
XCrNdfCsp61WZkwvzc+6D9ZtJNKShdsaPk+nGzxYTYkOlr64MuwEApfLNTTb
arlgEdRNqMY/b42SoEetpp8vQGPWN51aGrEF64JDh/nihVgD5mhj9WwwkW1T
1xBKA0vuWqeJe3U4YWPIDEAN3eNl0S9PtWqr1NQmuvnuY0ezjFJXA/2nLY0e
D/CWhIPFJFvWjkVJGgITU40NXamYyYiORp/25HPG3NXTUFGEplE3r9CiHpFr
aQQisSP/cQlVMue1XXY2ynE4KAO0DmyliC0hgkTs1QqdsyK31exNd6UxORFm
A7AuK21yHegMtlBteS4vMP/Xr5UD8vPPE1f7hnhJErnpMdMQFPxyzY8rB4Me
BzmdriMCaRg3jUavjnxVnrNqwWoe3/rmLt79fx5Mj2Z9MGm5Ev+4lD//PHNG
kgGegtZYYI3aVqyviFOYH+z5KonGOg28X9OHRB+Wqzs12gOdjcXQEJbErCBV
xvYdPOjspaI7pqIZC7MAFoap6kc0NWefgVVmdcu6mpFCw1028417CYZztq2q
UopdswByJdwbNCsFhtIpSy2ZE4cibWeKBy0qgqcXLQRnbXhI67dmTTMFllGq
fiVZzW5NZi2ZVQiCMN8vKXLSXrbX2m5Ho3G23Wjys8/I7yZGmS/PHOd7FXL0
kx8OjLewWYIcvKbsL5xvLuZf7AtMHt4EAnBvYYrgwKoB10J7YX3OzmSr+IbN
Zb8e55ICRdWs7zl+r57jt+yZpu0+uf/tHavH6L16jFSPd0gtQZ1iudY8IwpE
0QpwGAn2Errlqm2Ug0Sr8mzAZ4ZFrOGE7zWcUA3nbjf15oKt1gXzRyFIqsBx
mieOxULOwRMvGvnS6jp4r64D1fUJpju3aE/Ktu3b9t+rbV9TWbHoXQJ2RF9M
4fYcWMx8oERHVFX/CNGbXQv1AQNQMxbvvcbiXUfirnEvf5/GvVwTEcoBTHS1
2IhXPIU9eqo3XI3SDVP3oXguFVV67Ak3ft6QqqWmmgVI0VQdYh4baW7lhDXk
FduQM7nQuom+eSIvMFkOB6GZfyoN1m7kSotWSTGqjq/NEFr1ag3IsVz3X2vN
pRph93suSN/xEEDXOY2hU4JDPUnPfLeqeAqWMmVkg37k/sc30AXwK2kobc/2
XvZeK5ZplVMtV5td/qN29uCurS/1ahCZXr820SGyT93QjqdhFkFfNYq7KVZ4
8vUt/pA8Pik4IEAfxX6wd0pGA5JWoSH00qjQgD3r9L1mnapZ3yY2K4jZyBBf
SGq+aS9o6BdLOL8HkMWGgui8uC96m8/fEnZx3YvL+abR66cfJD3FjxzyXCDP
8hU9AZmQ6zWmyE9VcsCE9OiRsSjj54nJbx0/2METauFA0W/uToM40S2Xoo6i
zC0bsku8HPTsI1bmzT+l+7Voz58uT0oBfh1I4RU3QCrQenfI/TQWJVPc1NG3
d/9DIeBRQ/ScdhFbCc5S2ovieGeKAMQd+HJJMZoesnwUrngvw+8lRnsp5YEZ
MU5y5Zy1o3JAFM22lk7rFQowkxjBP95QSI5kxY7b8CpSO5dqilsEcuGTV2JR
8oLdgx/rfrcohuoQKgJ4qFkw/emxx6tNc0FroYLSkv5atrRwyg1SUR33QDsh
cCng2p/JPqbUxR4ObeVZ0RQumgWFCsqRKoWwwM+tPspivRdW8jRWekhUBz0o
XQdUvVkGcaxYb4cQ8MDuwM8GQF/ZX+DpGhPtpOoYa7K9NODcoSpEvzw6kwyZ
mQGNiAVHnsSWCI73N/LVZqRSbTNz9xpSvRfI8zTIM2Es8EnvUJ8oh1oPq9VB
ZHoSNhfcMoh9apW3Jh9zbUWHWOCZtnBsgd4lsbklFYXYlBzTYHno4nxDfXGg
fE8KVarY2asNmsLXh1qJcrgdy+vnCkKwvrNXV+ku279jXwpW+oXk1B0oDg9m
evQ1/ElRQo+LzUaUz9WS64Bnp3q3/KVOdvvgJUfGqhdNyYofPbDnNFK7x6Qc
p/gXdC0ltDUhA9YoxuS7rTiTFr201zlS96Yn9hHJhZIruahaAsT2pC12eS8Q
7mkQzslNqAEruKMj073za2uhbuxa0xGSOVvbNDLWkAWgatrysmWNdL58SaIE
D5HcjW3BY9MID5Jh5I9fMIz8kZYV4FyxlJifQWQ25xecyuqB5PYawh2/vFjx
oMxKzzpozkHAri0QvKT1oiEyB5uoSzt6YyDLkHHzcG8aLatWDVl2QwEDtdDA
RwuV/qCk6vl0s5xyiNt4BZJkj3FzlzYY6rZu3d/LA/ICAwUrFaTg6VjLVPbp
MHTdwVq2ijqzbwRrMF9DDgUSevJaA34vt8rTbtU1dAUbQYtJJiqI9y59DJYA
OlTxFBQER5H6uBJw3iUhAujDS10odUE+RM9dFJ14olSmdrKe6riqSnnfePjd
ydMbE/W3++gx//zk7n989+DJ3SP6Geju22+7Hxz9xMnXj7/79qj/qX/zzuOH
D+8+OlIv41N38JFz4+Gt/3NDuWE3Hh8/ffD40a1vb6gEiB2YofCZoSKAAMRt
w7rZMXEikgb39p3j/+//9SMKzOnyk59/1r9kfhrhl5fncqF6Wy6ACNSvwB1X
DrSWFOTRKcApVs1GzCmA1LotdMLCpfgv6EcEfLTU2pIaesq4ZDlfnl0pYtZL
CuizhenK1ejBRfcWJsMxuc051MDZuUkkmtlSzodiTBR+d5fF/1Aw5PTV6cR9
CeZZE0I4ncvFwavDUzb6Eg2DLrCX+PQMAos5FFcaYFAzm5dL/gAdr8VVS23x
gE6vqE3V4Cv3p5/cK7tBjpo5VBe0oBjootN+D4LHJ8cHrybuq2/l4vAm2VkY
ZsraYYqL6UKeKe+DdS50HXXHMFFYo0DDkD8TPKzM0E+pzVMi+mBh9Rp6FKed
EflV6QYB+EEWCmxxSQkQuycmR3M2hXlqhKKMy0qY5kLr1a3L6VP3u+8f/XCK
ZmrCqDTkhW5EJy6/YzwCi0DL+whEp2ILgq5XK8rtP1VRTPrNPVXR4FOgU7Eg
wwhpxVsw9GoItXu5sJkZekPM3Ae6RZ6amQExzD/lejkF9JYUb+c0Fw1yrRDK
6Xff/w/G3eeEPPcvX7n/4/7FfQRmujWfDwzJgtVfCR1BEfABobelbi6aijCj
Q5LhHl8BaS+m84bsGef7SriWM/cuQQ07k0gJV6hlDh4rO6X6Nd5I6+hhEAa0
ntV5d043tjPK1ujnqd6HlB3bN8rNqEdcgjFEKmcc/+vzcBa0phlxymKmZPX0
WPkbD2iIp7wGavV6FtCjZ7LS6+SyLJT6GGSvHJ3l6qsLOGUkVCj59JiRy9v3
46h+SOlRYnBX2mmUhL9Nz40mRBh52DVNQXGm4kOqIlqcMROLddFs1mRHtDQu
llj+NckwRrVwg//2Q3dZbiSBDueEXzTLYBIGN46Ax17Ib+TVsWjWbBCkrKZG
xRuMdoPHcevkzoMHegSwjZRGm7ezsRYlx6/dozQtbmWtCUByc3dKnH1T/voN
NS/04DP1pJ1YefNLx+qlLsH4Nu8o54cqHjug2hCWX65n7rcqmTtIq3ci1sdg
yQq6owqbAWOQF80sc9P45Ioldze85BSt7YebkaAXqMpR8Yviy891VYDbl7NQ
rcLxWs4bGEdK8Gmk0WeDtrQNZ63IVhFQJi5UPoVclHibwdUpZ1pOqZBvG0x3
joypVyEPqVduhQQ7KVuyWp5RoNAFWSR+taEaIAJHKQymVd5VqepgdaKKBkIx
Kx7HEIcSTutJ+fJ82XarYmwzlPWj81NjoJ2t7vt82gBCqvxt0Sy0+4XhaGoo
U84DUvBuqxjeff0ZTdlxHoxIzoiCnRDZ5bts34Gsnw46TmyKO4riZgBEMe0v
MXPA3FwItEc1v7CbrqpjYHcQfv+uihqHkI6JbB2oIByrHBoVnE4s6ubqkMuL
dCRDDVg9qV80WTo1upn7XcuFohM2vfoZSu+rlLUKy9QA5JWrdbSale6AJPCE
lJoaIqtkGGzozXkfjeorE8rzJbnDfRQLJD0FbVidq364E0fNWz+nR3rwlKtK
LgQGC6wpIYITYHY4YXB5ai76tHKTipSO3YQKNhh8gX5n23w9R3Ntz9l6Wi/B
tucOBZ0J5Clbo4aoMIbd5+xQq+bLRSU4ZDDX3XcrzKUfzDKEp/58qjxIs4Ld
Kpw+wAgNwu2W7/SWZubbpwMCTfCN+2f3tvsV/vuzi6cawAdKbwuAq4tii563
8J2quqD2qVltLHVzGyY3E1hFd8ywprdsEMW9HkxvUcUS/4W+8SONXUer7Xj7
krCle7rm0Q0LH6hrkFKyZ2gnWAZr2BORPQvHyMMtTUSuQ0YHUx9sBf5qJ0qa
OfpCkF1BwfWfaJA09NlsxuSaOSNSE0lA1NWfbn1Fk6E1LSlNQO6QKqbZOT2q
8VJirjKfO2RmPBhFp4do5z48lvUhxnIf2mTBer5b+Fu87LdVPSY5+YSIKXsu
VBxlparyqXFQE7JUQWF0/sVza8mIR57/6RbNicoNn/MruxsFxr6tKEtFMORj
6ZXijMktU4fK9lTRo7UqZngkp/fvHawOQUqhJR56e85ZJSVCK51EheroJKlX
Nx065mm0nTYiLnrtTVx/QisIxTv1fz6djSoVAIW41B129fSuoqMWHkVy25Mb
6UcTfKLgIWkEHoajpzgx1MAqza9gUP5GDtJL0niimZOLd2kETote7+TyCpCO
Zjf9xfK5YhOxXe3BWI0t1AEcyMdsIRVRttWje9DM4GFAqXFC4IHWJeMXxzpm
ZxsPVBv3DbuOG+n5eFcr9KpKVrHhgwN+0z2y8xKM+i7EiqBS5zlSDI6MPfvB
yqW0Gtc2VAkhXoXMQeur4l0m6ARtGU0mKortEzRS5V5kbU+fgOWHowJDNlR7
ys57VxnLgyNz0pQQR05TkKFplSVF17SZZ7usE2qpK+dye/8NGJ45VexJTRwc
nTw9/BKfbiMshby2inEUqe3OCfJ3AM5xdSBgWHI1iIyp9K+dT/zwNUKnLOXv
QRmQYA8Frps/rfdOCrx5/hNql1/0vVmsqPGE8b2mBkVrzpdL0h0QVQ39VdiG
4gvbkybfgV99sGBeOWjRxBMdZWGxU593bn6vf07bU5J+rSO1F8J5SqkV1sGt
Q9pdsmIb3GsxGCdyaMi6Q5ksF4whrXjOaXFZM0BQQM5Ejh5J7uSoy2R33eB5
dHRrs5EXqw0rbhI0sd3mZqmYYjAWpcNraL/WVDWrmTaqUpY+UFUgw9FybmpQ
lKEQ9U7NMmIuUqJr0YCutPfFnhKl4GkYo4S9Hh++Y7SzVyVqT5E73c2brGz4
+6nlBemYTFNZNSqDJdUM1nYrOmSE4WpiFG+xnu14PXUf77Cco2GQ5tlL6Lcn
MxMOTX0I6bYdPx1YbLWp7cvbRhk6oya74hyHyyw6P2HbvRpucGAHf2vfwoOF
wwU3JeUPrIpl5dewchq9Aw9ldjYjzEZerho0KylMTe/xpKJadjBMlpaSWLTN
lIPjnNxVdRxobEwPp68A7VK8qjSqT3dggTtLSQi7JbyKpnVAgOOoCpjpgC+5
x0cGCn7bQcG7Bq3Dg+MEaQuXuZrLf/xMOyxUqgj/9sUKumRfqDL2tc67wR6X
XNDMYSPlwm6YjA7XMJotIXCxAUYedGEaznnbrq3QfZr6fVNhTjUrjFhZ5+he
JqYZUsGkkhbd4y/6broxqS0CjonkWL420L/+Rbr9eMu5aC56P1cPV88CdHV4
X9toEBys7shlymy7NF63smI03NGLppSH+VutmtMDeGmt2gGlNw8Nt6EvDhVq
r28c1lD1ohQa7XYhWYVDlbzg54WKk1EJPMWkRLNmfhpU4ehS634XyrabYdaQ
wJaY69iUs/2gDntaAyHTcQG/Rylz3so7NXt5IS6Dvb3QH/zSxDj0JmulkmYj
smIt9Q5NCPEG3DzrC7yVX0AMMlgYUVMJEfmuVya+dg/6ZHpyLi4a8AywRMsJ
89evaZcwYY97l2viJ0pATroDDKwO9S5NinlR0KPq2L7lTaxcxNAVa1jpa7Uo
5xwRU4pt2lLBkf52h0vn9E6LyZmzc2eUtEV03XfvrKm4oYpG61qHuYDtWTsD
tlJi+ZJr9ahNFaS56R74h0wsJhC4frXRUexlJ+6OcgaZX7noRCdtTXVOt39+
qVOXB8GhhiEVfIDqUlXnzMlwwh0kaeHKDwvMDYSz4gh9pYsVuOepql/AhwZP
KnfQITdOe/9r0auKQvJmAbMvq28Ivx0/eXRf0VfJ+crA5ZYLcSkT6BCh2sti
qjUC6EQxOjafulBJ85jN1Dx2eq646jYH6rlZ1ZBdgFn73gul4bqayas9TTum
abMHcZxfIePxmTIPxoHkCuj7/YiFReSlzvSr7I9+SPLrpx3+mPROP7GZCY7s
CIyAYITSCfJc6VAem2T94B1+8Ig+U/jJOb3QyFWYaM7zL0f+lZV9U+NWUa/n
FED6yr19yik6/Hrn++YH+uQIf6toL/PXacNxtdPvPR2ouHCnrv/DqVp8HfbW
26lo86BOkyoSWmsq3M0l+Ii/xzQVXnN0BtBxxrRTdTBtTwSTOAPag9xsSBUo
rd8yyFYboqzCa64G7KqyyPBSvpKca6gSYUoRB1uZCESDbTXBukjrZKiBKste
gfxKrajRTbT4OCw+9KXWVjuexZz/93//10qvOpy6u+mQ36yXEj/eNeFB6+fb
1s93vr/4wfr1iH51VLCDm1KcrKjj9HlW/k6lDe47AGEdsyv605ayWxNiyTtQ
6rT5/ODhxP07hUi3Cj7viXZDz3cPk0uEB+/Phk4pOSUBPl+7f+LZbEL9y0N6
4/YFv7LlPN6m94S3+8uH/KW/+8u/85fB7i83AX8b7vk25FmcB7wkFAzmYggq
x7h9AfwBzfzTTzTkn37qtvXTn/4x4XWPYfD7H/P7x/xrHgv6x4JrHgv7x8Lx
YzfuGONxg+ZW8swHQRQ9XSJMy0szxVN/Aheyj0vBAPd7OufoB2JchWPO5Xxl
BQd3MwdLfzvUgRMNQCgCvlS1xINY+Y6y4m5rhlVf3Da6LuCKIZpzXaHxOwrc
uwiZ+eKh9fPf94obhLJP1Rv7r/LsShTfKGI33yQwZKSPTp7iCZ2YJ54Y9gT2
9t+bvXX73bP6d92zDlUe6A5Ylh7yaPuwro53NmRbeCv3wcWhOivjTrN7YmSf
DvmJoz1PHHVP7JJcGtlgwPS3+rrRHw9ma8/3TtO9ieFd8+BR/+DRjgdvdGvK
QujClbhWDhXd8NCfXDbPf1bK8u+U/zCaU4umUtBKNP92bvaDjuDNOMzY7y/V
rl23jeB0wC0qF9fLML+8rGuqdOTdoj1oUtUUpYZNzzowth81qWfehJmGER1V
e/TeCMrpEJRrISg1AQ1jFLBh0DvCJlS+pb9v6UANXe61XHKVv3pdp1pp4sbh
BrebQGJHCRVR1CEg54xhoY0RTBHcOJilj/jQ6GK5GMMkh3J88oV283WYAetn
nBFV8L6jarhfFvZ03wxV3gefjFCJpUg7Iqo4RnU9ZLEY56BHKxPVLmuT/ajl
wMI2ZAv5ne+9H7TxU7/6PzgGtRwctIRbKDt8QFbx9uGhwTDqq4fdV38/PPwD
0fzyiEa+WvFm9zvXalTDWbRu1htfueWhpUw7/uuQTr9bh/N5W/zE4XglwFph
vVlmfksQ4+BfC1v8/Q+48ZHgBn36d/Ppkfr0778d3NHXVL7+rGu1r4HToScu
gVONUGWptEam64jbvtKaQgwqGrvnJCnaZ9v2lrKvYR2cOfFg0bXBb0y684V2
HivDyQUWSvdUgw86Qal9fjJRZvjwdOKoc4lOG1XkqxOAXXGmcXb464l7ine7
h/qDc3qPaKJCP6q37snH/cFoM/cWB4Q3150LxivoDI8m6trcc0qaSktoUGfl
Pdwuom0pUSWmqv13/KMqYomIxN7TD/9DGIW2xk7UX7IyuvgrdYLAQdNppWv+
DN+9/ll72P+23a6uEN4aiDnOQTHQsMM3DW/c5psG+BeLPni2515dBn6gGVJT
bty8Uh6vb7qf1Q2drrOu1UGNX90YnvhBKSk6d+PGz51wPbOkqxeFrjaRq0CG
Zya5u47Fc7SoWCc7Kck2NdzuU+iE8rwBpB5uT52oo9L6xIqShvHBhmJ3yqsb
C+3M6s6IMoevmWRcpyk4hXA6WN7TQalKh9upPWqmT0OYoOZQF3T7LKlOECQg
DdOU5zYtO/J1wzJHSHVbEliKdVrNnCymEmGD7hz7xLnBpgrdxDsoggOM9nCL
B118qsWl/6bXARP6/l9TEYxlSjtBu7UBqDB5U19vNeDrprdnRJ9Yl+ye13DU
igDaSxzonhe28nm2W/vow6g6DaPaIZ1EbkIPENRm8qod6andJ/pRllqLedmV
42v9ZY7FFMOD4U4pYagrz61MeH803d7NHyRt/NJkNIRrMImzG5NMOG15yFv5
3kJi9eP9Qo8FdiSr+vlPK7EUNJLiuay+gVoaSK/qXmuNTy/I7yTDozm8uzgr
yv5O5VflFtXq9Ks3FOaVLczHbyvMloiRTN8dHEun98y3usZPOyJUWw2ve3VO
FeUqG00bB+kb/mzijLyfzoHhp/H7Qv06qsrmo8Cbs0tdb6sLxhxTMGZ61/1u
15CW9us6Sjtq8/Vnw4f0hDXC3+cpUV+q6pAjKYqGlNufcnGeioBiod1z+UpU
smwuxJz2zf/kPiQN2P/5yX3Gz/7k/HTzq+Ef8wG+Yr3J62fe8l55nuuar571
3/FXfv/V8eirgL4iBtmIYqrcOM0gD8x89FFJW7OeETvcshTzZPeZheqw29FR
w+T69XVvE4dSWHxWh9pSa+9dpde3aEsn2Pa0nXS+qqN81VN+9cHR6TXFnqp2
7ozOrLlSgWLagjh3uww8l6brQ6YGI3pwZLZ/Cq5Xof1pClSWa6kK2W6YKha1
y/OGs2vje0epHZ6zsU03t8JmHK3ifu7YkYEDBfr1xDmWowMSynD7ngpMqViJ
etg/7D/RL1L0RMUuvv/+yb07+tCgm+4Knmor9XE4XZM3aNI38Nx/4s8Nc0ww
/WLQd01qTu+emPBhAkxOOW+leriQNR/3xnpGVSr88ANLJpmfvuKEX9Mzhlnc
8P4+ozg6/2eHBprYPgP7FaJZuwfs4WiUz0f3dqkAR53RNFyPLuWht/jaiRnl
IlhlJeYIZ6crbdxxUp4ZCtWEqdqkKT6a0kfdtjXhXHsAVOfqnA62H58OtqSw
P0cbrU097Y65kMgMmjhQUzh41B4aSDNRJ3iY6n/3YLVs26agUzIpt3Ro7/Ca
llQduzBT1dBMycK+QLD7CApzEOLVSWgslBXjxXq9Xd2GmQmLAtrYXYGx0l8M
d2zp+IgWIIO+lFzQLjv7fPidLMcbCneDSaMjHKMizDm1JqJk2rUs5jjEZOoS
z2CP9JHgwtmpq5Tt6fSh3vWmep5029dPSZwV1tQiBs9XHWc9LMPuK7x5L78q
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
ny+fiEf/HY7cp+LRj3D0X91CwhqzqAEA

-->

</rfc>
