<?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-rfc2629 version 1.5.25 (Ruby 3.0.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-voprf-09" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.1 -->
  <front>
    <title abbrev="OPRFs">Oblivious Pseudorandom Functions (OPRFs) using Prime-Order Groups</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-voprf-09"/>
    <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="February" day="09"/>
    <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.</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 POPRFs are necessary in some applications such as Privacy Pass
<xref target="I-D.ietf-privacypass-protocol"/>. Verifiable POPRFs 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>
      <section anchor="change-log">
        <name>Change log</name>
        <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 and OS2IP: Convert a byte array to and from a non-negative
integer as described in <xref target="RFC8017"/>. Note that these functions
operate on byte arrays in big-endian byte order.</li>
        </ul>
        <t>All algorithms and procedures described in this document are laid out
in a Python-like pseudocode. The data types <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 "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"/>,
with base point defined in the corresponding reference for each group.
(See <xref target="ciphersuites"/> for these base points.)</li>
        <li>
          <tt>Hash</tt>: A cryptographic hash function whose output length is Nh bytes long.</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. 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.) We use <tt>GF(p)</tt> to represent the finite
field of order <tt>p</tt>. For the purpose of understanding and implementing this
document, we take <tt>GF(p)</tt> to be equal to the set of integers defined by
<tt>{0, 1, ..., p-1}</tt>.</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 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>. Scalar base multiplication is equivalent
to the repeated application of the group operation on the fixed group
generator with itself <tt>r-1</tt> times, and is denoted as <tt>ScalarBaseMult(r)</tt>.
The set of scalars corresponds to <tt>GF(p)</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>HashToGroup(x): A member function of <tt>Group</tt> that 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"/>.</li>
          <li>HashToScalar(x): A member function of <tt>Group</tt> that 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"/>.</li>
          <li>RandomScalar(): A member function of <tt>Group</tt> that chooses at random a
non-zero element in GF(p).</li>
          <li>ScalarInverse(s): Compute the multiplicative inverse of input Scalar <tt>s</tt>
modulo the prime order of the group <tt>p</tt>.</li>
          <li>SerializeElement(A): A member function of <tt>Group</tt> that maps a group element <tt>A</tt>
to a unique byte array <tt>buf</tt> of fixed length <tt>Ne</tt>. The output type of
this function is <tt>SerializedElement</tt>.</li>
          <li>DeserializeElement(buf): A member function of <tt>Group</tt> that maps a byte array
<tt>buf</tt> to a group element <tt>A</tt>, or fails if the input is not a valid
byte representation of an element. This function can raise a
DeserializeError if deserialization fails or <tt>A</tt> is the identity element
of the group; see <xref target="input-validation"/>.</li>
          <li>SerializeScalar(s): A member function of <tt>Group</tt> that maps a scalar element <tt>s</tt>
to a unique byte array <tt>buf</tt> of fixed length <tt>Ns</tt>. The output type of this
function is <tt>SerializedScalar</tt>.</li>
          <li>DeserializeScalar(buf): A member function of <tt>Group</tt> that maps a byte array
<tt>buf</tt> to a scalar <tt>s</tt>, or fails if the input is not a valid byte
representation of a scalar. This function can raise a
DeserializeError if deserialization fails; see <xref target="input-validation"/>.</li>
        </ul>
        <t>It is convenient in cryptographic applications to instantiate such
prime-order groups using elliptic curves, such as those detailed in
<xref target="SEC2"/>. For some choices of elliptic curves (e.g. those detailed in
<xref target="RFC7748"/>, which require accounting for cofactors) there are some
implementation issues that introduce inherent discrepancies between
standard prime-order groups and the elliptic curve instantiation. In
this document, all algorithms that we detail assume that the group is a
prime-order group, and this MUST be upheld by any implementation. That is,
any curve instantiation should be written such that any discrepancies
with a prime-order group instantiation are removed. See <xref target="ciphersuites"/>
for advice corresponding to the implementation of this interface for
specific definitions of elliptic curves.</t>
      </section>
      <section anchor="dleq">
        <name>Discrete Log Equivalence Proofs</name>
        <t>Another important piece of the OPRF protocols in this document is proving
that the discrete log of two values is identical in zero knowledge, i.e.,
without revealing the discrete logarithm. This is referred to as a discrete
log equivalence (DLEQ) proof. This section describes functions
for non-interactively proving and verifying this type of statement,
built on a Chaum-Pedersen <xref target="ChaumPedersen"/> proof. It 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.
This function takes four Elements, A, B, C, and D, and a single
group Scalar k, and produces a proof that <tt>k*A == B</tt> and <tt>k*C == D</tt>.
The output is a value of type Proof, which is a tuple of two Scalar
values.</t>
          <artwork><![CDATA[
Input:

  Scalar k
  Element A
  Element B
  Element C
  Element D

Output:

  Proof proof

Parameters:

  Group G

def GenerateProof(k, A, B, C, D)
  Cs = [C]
  Ds = [D]
  (M, Z) = ComputeCompositesFast(k, B, Cs, Ds)

  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) mod G.Order()

  return [c, s]
]]></artwork>
          <t>The helper function ComputeCompositesFast is as defined below.</t>
          <artwork><![CDATA[
Input:

  Scalar k
  Element B
  Element Cs[m]
  Element Ds[m]

Output:

  Element M
  Element Z

Parameters:

  Group G
  PublicInput contextString

def ComputeCompositesFast(k, B, Cs, Ds):
  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 = 0 to range(m):
    Ci = G.SerializeElement(Cs[i])
    Di = G.SerializeElement(Ds[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 * Cs[i] + M

  Z = k * M

 return (M, Z)
]]></artwork>
          <t>When used in the protocol described in <xref target="protocol"/>, the parameter <tt>contextString</tt> is
as defined in <xref target="configuration"/>.</t>
          <t><tt>ComputeCompositesFast</tt> takes lists of inputs, rather than a single input.
Applications can take advantage of this functionality by invoking <tt>GenerateProof</tt>
on batches of inputs to produce a combined, constant-size proof.
In particular, servers can produce a single, constant-sized proof for N DLEQ inputs,
rather than one proof per DLEQ input. This optimization benefits
clients and servers since it amortizes the cost of proof generation
and bandwidth across multiple requests.</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 four Elements, A, B, C, and D, along with 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.</t>
          <artwork><![CDATA[
Input:

  Element A
  Element B
  Element C
  Element D
  Proof proof

Output:

  boolean verified

Parameters:

  Group G

Errors: DeserializeError

def VerifyProof(A, B, C, D, proof):
  Cs = [C]
  Ds = [D]

  (M, Z) = ComputeComposites(B, Cs, Ds)
  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)

  return expectedC == c
]]></artwork>
          <t>The definition of <tt>ComputeComposites</tt> is given below.</t>
          <artwork><![CDATA[
Input:

  Element B
  Element Cs[m]
  Element Ds[m]

Output:

  Element M
  Element Z

Parameters:

  Group G
  PublicInput contextString

def ComputeComposites(B, Cs, Ds):
  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 = 0 to m-1:
    Ci = G.SerializeElement(Cs[i])
    Di = G.SerializeElement(Ds[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 * Cs[i] + M
    Z = di * Ds[i] + Z

 return (M, Z)
]]></artwork>
          <t>When used in the protocol described in <xref target="protocol"/>, the parameter <tt>contextString</tt> is
as defined in <xref target="configuration"/>.</t>
          <t>As with the proof generation case, proof verification can be batched. <tt>ComputeComposites</tt>
is defined in terms of a batch of inputs. Implementations can take advantage of this
behavior by also batching inputs to <tt>VerifyProof</tt>, respectively.</t>
        </section>
      </section>
    </section>
    <section anchor="protocol">
      <name>Protocol</name>
      <t>In this section, we define three OPRF protocol variants -- a base mode,
verifiable mode, and partially-oblivious mode -- with the following properties.</t>
      <t>In the base 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. 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 = Evaluate(blindedElement)

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

  output = Finalize(input, blind, evaluatedElement, blindedElement)
]]></artwork>
      </figure>
      <t>In the verifiable mode, the client additionally receives proof that the server used <tt>skS</tt> in
computing the function. To achieve verifiability, as in the original work of <xref target="JKK14"/>, the
server provides a zero-knowledge proof that the key provided as input by the server in
the <tt>Evaluate</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)
  -------------------------------------------------------------------
  blind, blindedElement = Blind(input)

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

                   evaluatedElement, proof = Evaluate(blindedElement)

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

  output = Finalize(input, blind, evaluatedElement,
                    blindedElement, proof)
]]></artwork>
      </figure>
      <t>The partially-oblivious 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>. To support additional public input, the client
and server augment the <tt>pkS</tt> and <tt>skS</tt>, respectively, using the <tt>info</tt> value,
as in <xref target="TCRSTW21"/>.</t>
      <figure anchor="fig-poprf">
        <name>POPRF protocol overview with additional public input</name>
        <artwork><![CDATA[
    Client(pkS, info)        <---- pkS ------       Server(skS, info)
  -------------------------------------------------------------------
  blind, blindedElement, tweakedKey = Blind(input, info)

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

             evaluatedElement, proof = Evaluate(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:</t>
        <table>
          <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>
        <artwork><![CDATA[
def CreateContextString(mode, suiteID):
  return "VOPRF09-" || I2OSP(mode, 1) || I2OSP(suiteID, 2)
]]></artwork>
        <t>[[RFC editor: please change "VOPRF09" 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, 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 suiteID. The server key pair (<tt>skS</tt>, <tt>pkS</tt>) is generated
using the following function, which accepts a randomly generated seed of length
<tt>Ns</tt> and optional public info string. The constant <tt>Ns</tt> corresponds to the size
of a serialized Scalar and is defined in <xref target="pog"/>.</t>
        <artwork><![CDATA[
Input:

  opaque seed[Ns]
  PublicInput info

Output:

  Scalar skS
  Element pkS

Parameters:

  Group G
  PublicInput contextString

Errors: DeriveKeyPairError

def DeriveKeyPair(seed, info):
  contextString = CreateContextString(mode, suiteID)
  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.ScalarBaseMult(skS)
  return skS, pkS
]]></artwork>
        <t>The OPRF variant server and client contexts are created as follows:</t>
        <artwork><![CDATA[
def SetupOPRFServer(suiteID, skS):
  contextString = CreateContextString(modeOPRF, suiteID)
  return OPRFServerContext(contextString, skS)

def SetupOPRFClient(suiteID):
  contextString = CreateContextString(modeOPRF, suiteID)
  return OPRFClientContext(contextString)
]]></artwork>
        <t>The VOPRF variant server and client contexts are created as follows:</t>
        <artwork><![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)
]]></artwork>
        <t>The POPRF variant server and client contexts are created as follows:</t>
        <artwork><![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)
]]></artwork>
      </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.
Specifically, values of type Element are serialized to SerializedElement values,
and values of type Proof are serialized as the concatenation of two SerializedScalar
values. Deserializing these values can fail, in which case the application MUST abort
the protocol with 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 when deserializing Element values
using DeserializeElement; see <xref target="input-validation"/> for more information on input
validation.</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>
          <artwork><![CDATA[
Input:

  PrivateInput input

Output:

  Scalar blind
  Element blindedElement

Parameters:

  Group G

Errors: InvalidInputError

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

  return blind, blindedElement
]]></artwork>
          <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>Evaluate</tt> function described
below.</t>
          <artwork><![CDATA[
Input:

  Element blindedElement

Output:

  Element evaluatedElement

Parameters:

  Scalar skS

def Evaluate(blindedElement):
  evaluatedElement = skS * blindedElement
  return evaluatedElement
]]></artwork>
          <t>Servers send the output <tt>evaluatedElement</tt> to clients for processing.
Recall that servers may batch multiple client inputs to <tt>Evaluate</tt>.</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>
          <artwork><![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)
]]></artwork>
        </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>Evaluate</tt> function.</t>
          <artwork><![CDATA[
Input:

  Element blindedElement

Output:

  Element evaluatedElement
  Proof proof

Parameters:

  Group G
  Scalar skS
  Element pkS

def Evaluate(blindedElement):
  evaluatedElement = skS * blindedElement
  proof = GenerateProof(skS, G.Generator(), pkS,
                        blindedElement, evaluatedElement)
  return evaluatedElement, proof
]]></artwork>
          <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>
          <artwork><![CDATA[
Input:

  PrivateInput input
  Scalar blind
  Element evaluatedElement
  Element blindedElement
  Proof proof

Output:

  opaque output[Nh]

Parameters:

  Group G
  Element pkS

Errors: VerifyError

def Finalize(input, blind, evaluatedElement, blindedElement, proof):
  if VerifyProof(G.Generator(), pkS, blindedElement,
                 evaluatedElement, 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)
]]></artwork>
        </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. 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 map to invalid
public keys for server evaluation. Dealing with either failure is an
application-specific decision; see <xref target="errors"/>.</t>
          <artwork><![CDATA[
Input:

  PrivateInput input
  PublicInput info

Output:

  Scalar blind
  Element blindedElement
  Element tweakedKey

Parameters:

  Group G
  Element pkS

Errors: InvalidInputError

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

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

  blindedElement = blind * P

  return blind, blindedElement, tweakedKey
]]></artwork>
          <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>Evaluate</tt> function.</t>
          <artwork><![CDATA[
Input:

  Element blindedElement
  PublicInput info

Output:

  Element evaluatedElement
  Proof proof

Parameters:

  Group G
  Scalar skS
  Element pkS

Errors: InverseError

def Evaluate(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.ScalarBaseMult(t)
  proof = GenerateProof(t, G.Generator(), tweakedKey,
                        evaluatedElement, blindedElement)

  return evaluatedElement, proof
]]></artwork>
          <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>
          <artwork><![CDATA[
Input:

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

Output:

  opaque output[Nh]

Parameters:

  Group G
  Element pkS

Errors: VerifyError

def Finalize(input, blind, evaluatedElement, blindedElement,
             proof, info, tweakedKey):
  if VerifyProof(G.Generator(), tweakedKey, evaluatedElement,
                 blindedElement, 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)
]]></artwork>
        </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 base
point 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 target="I-D.irtf-cfrg-hash-to-curve"/>, Section 3.1.
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>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>Order()</tt>.</li>
                <li>Serialization: Both group elements and scalars are encoded in Ne = Ns = 32
bytes. For group elements, use the 'Encode' and 'Decode' functions from
<xref target="RISTRETTO"/>. For scalars, ensure they are fully reduced modulo <tt>Order()</tt>
and in little-endian order.</li>
              </ul>
            </li>
            <li>Hash: SHA-512, and 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>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>Order()</tt>.</li>
                <li>Serialization: Both group elements and scalars are encoded in Ne = Ns = 56
bytes. For group elements, use the 'Encode' and 'Decode' functions from
<xref target="RISTRETTO"/>. For scalars, ensure they are fully reduced modulo <tt>Order()</tt>
and in little-endian order.</li>
              </ul>
            </li>
            <li>Hash: SHAKE-256, and 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="x9.62"/>
              </t>
              <ul spacing="normal">
                <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>Order()</tt>.</li>
                <li>Serialization: Elements are serialized as Ne = 33 byte strings using
compressed point encoding for the curve <xref target="SEC1"/>. Scalars are serialized as
Ns = 32 byte strings by fully reducing the value modulo <tt>Order()</tt> and in big-endian
order.</li>
              </ul>
            </li>
            <li>Hash: SHA-256, and 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="x9.62"/>
              </t>
              <ul spacing="normal">
                <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>Order()</tt>.</li>
                <li>Serialization: Elements are serialized as Ne = 49 byte strings using
compressed point encoding for the curve <xref target="SEC1"/>. Scalars are serialized as
Ns = 48 byte strings by fully reducing the value modulo <tt>Order()</tt> and in big-endian
order.</li>
              </ul>
            </li>
            <li>Hash: SHA-384, and 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="x9.62"/>
              </t>
              <ul spacing="normal">
                <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>Order()</tt>.</li>
                <li>Serialization: Elements are serialized as Ne = 67 byte strings using
compressed point encoding for the curve <xref target="SEC1"/>. Scalars are serialized as
Ns = 66 byte strings by fully reducing the value modulo <tt>Order()</tt> and in big-endian
order.</li>
              </ul>
            </li>
            <li>Hash: SHA-512, and Nh = 64.</li>
            <li>ID: 0x0005</li>
          </ul>
        </section>
      </section>
      <section anchor="input-validation">
        <name>Input Validation</name>
        <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"/>. This section describes how both DeserializeElement
and DeserializeScalar are implemented for all prime-order groups included
in the above ciphersuite list.</t>
        <section anchor="deserializeelement-validation">
          <name>DeserializeElement Validation</name>
          <t>The DeserializeElement function attempts to recover a group element from an arbitrary
byte array. This function validates that the element is a proper member
of the group and is not the identity element, and returns an error if either
condition is not met.</t>
          <t>For P-256, P-384, and P-521 ciphersuites, this function performs partial
public-key validation as defined in Section 5.6.2.3.4 of <xref target="keyagreement"/>.
This includes checking that the coordinates are in the correct range, that
the point is on the curve, and that the point is not the point at infinity.
If these checks fail, deserialization returns an error.</t>
          <t>For ristretto255 and decaf448, elements are deserialized by invoking the Decode
function from <xref section="4.3.1" sectionFormat="comma" target="RISTRETTO"/> and <xref section="5.3.1" sectionFormat="comma" target="RISTRETTO"/>, respectively,
which returns false if the input is invalid. If this function returns false,
deserialization returns an error.</t>
        </section>
        <section anchor="deserializescalar-validation">
          <name>DeserializeScalar Validation</name>
          <t>The DeserializeScalar function attempts to recover a scalar field element from an arbitrary
byte array. Like DeserializeElement, this function validates that the element
is a member of the scalar field and returns an error if this condition is not met.</t>
          <t>For P-256, P-384, and P-521 ciphersuites, this function ensures that the input,
when treated as a big-endian integer, is a value between 0 and <tt>Order() - 1</tt>. For
ristretto255 and decaf448, this function ensures that the input, when treated as
a little-endian integer, is a value between 0 and <tt>Order() - 1</tt>.</t>
        </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 x (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>Additionally, future ciphersuites must take care when choosing the
security level of the group. See <xref target="limits"/> for additional details.</t>
      </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>The protocol functions in <xref target="online"/> are specified in terms of prime-order group
Elements and Scalars. However, applications can treat these as internal functions,
and instead expose interfaces that operate in terms of wire format 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>Evaluate</tt> can fail if any element received from the peer fails deserialization.
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>
        </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="sec">
      <name>Security Considerations</name>
      <t>This section discusses the cryptographic security of our protocol, along
with some suggestions and trade-offs that arise from the implementation
of the OPRF variants in this document. Note that the syntax of the POPRF
variant is different from that of the OPRF and POPRF 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: 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, for a random sampling of k.</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 compute cannot recover any information
about the client's private input x from an invocation of the protocol.</t>
        <t>Additionally, 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 POPRF output it computes is
correct. This is taken with respect to the POPRF 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 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. Both client and server learn
the public input (info).</li>
        </ul>
        <t>Essentially, partial obliviousness tells us that, even if the server learns
the client's private input x at some point in the future, then the server will
not be able to link any particular POPRF evaluation to x. This property is
also known as unlinkability <xref target="DGSTV18"/>.</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 fact, the VOPRF construction is identical to the <xref target="JKK14"/> construction, except
that this document supports batching so that multiple evaluations can happen
at once whilst only constructing one proof object. This is enabled using
an established batching technique.</t>
          <t>The pseudorandomness and input secrecy (and verifiability) of the OPRF (and VOPRF) variants
is based on the assumption that the One-More Gap Computational Diffie Hellman (CDH) is computationally
difficult to solve in the corresponding prime-order group. The original paper <xref target="JKK14"/>
gives a security proof that the construction satisfies the security guarantees of a
VOPRF protocol <xref target="properties"/> under the One-More Gap CDH assumption in the universal
composability (UC) security framework.</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 go, whilst only constructing one NIZK proof object.
This is enabled using an established batching technique.</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. <xref target="TCRSTW21"/> show that both the One-More Gap CDH 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>Evaluate</tt> queries.
(The One-More Gap CDH 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>Evalute()</tt> calls made by the attacker.</t>
          <t>As a result of this class of attack, 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>Evaluate()</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>Evaluate()</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, 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">
	 </author>
            <author fullname="Hugo Krawczyk">
              <organization>Algorand Foundation</organization>
            </author>
            <author fullname="Kevin Lewi">
              <organization>Novi Research</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="25" month="October" year="2021"/>
            <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-07"/>
        </reference>
        <reference anchor="I-D.ietf-privacypass-protocol">
          <front>
            <title>Privacy Pass Issuance Protocol</title>
            <author fullname="Sofía Celi">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Alex Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Armando Faz-Hernandez">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Steven Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="31" month="January" 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-02"/>
        </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">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Sam Scott">
              <organization>Cornell Tech</organization>
            </author>
            <author fullname="Nick Sullivan">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Riad S. Wahby">
              <organization>Stanford University</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="10" month="November" year="2021"/>
            <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-13"/>
        </reference>
        <reference anchor="RISTRETTO">
          <front>
            <title>The ristretto255 and decaf448 Groups</title>
            <author fullname="Henry de Valence">
	 </author>
            <author fullname="Jack Grigg">
	 </author>
            <author fullname="George Tankersley">
	 </author>
            <author fullname="Filippo Valsorda">
	 </author>
            <author fullname="Isis Lovecruft">
	 </author>
            <author fullname="Mike Hamburg">
	 </author>
            <date day="4" month="August" year="2021"/>
            <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-01"/>
        </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/challenge-bypass-server">
          <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>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="ChaumPedersen" target="https://chaum.com/publications/Wallet_Databases.pdf">
          <front>
            <title>Wallet Databases with Observers</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Cheon06" target="https://www.iacr.org/archive/eurocrypt2006/40040001/40040001.pdf">
          <front>
            <title>Security Analysis of the Strong Diffie-Hellman Problem</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="JKKX16" target="https://eprint.iacr.org/2016/144">
          <front>
            <title>Highly-Efficient and Composable Password-Protected Secret Sharing (Or, How to Protect Your Bitcoin Wallet Online)</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="JKK14" target="https://eprint.iacr.org/2014/650">
          <front>
            <title>Round-Optimal Password-Protected Secret Sharing and T-PAKE in the Password-Only model</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="SJKS17" target="https://eprint.iacr.org/2018/695">
          <front>
            <title>SPHINX, A Password Store that Perfectly Hides from Itself</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="TCRSTW21" target="https://eprint.iacr.org/2021/864">
          <front>
            <title>A Fast and Simple Partially Oblivious PRF, with Applications</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="DGSTV18" target="https://www.degruyter.com/view/j/popets.2018.2018.issue-3/popets-2018-0026/popets-2018-0026.xml">
          <front>
            <title>Privacy Pass, Bypassing Internet Challenges Anonymously</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </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="SEC2" target="http://www.secg.org/sec2-v2.pdf">
          <front>
            <title>SEC 2: Recommended Elliptic Curve Domain Parameters</title>
            <author initials="." surname="Standards for Efficient Cryptography Group (SECG)">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="x9.62">
          <front>
            <title>Public Key Cryptography for the Financial Services Industry: the Elliptic Curve Digital Signature Algorithm (ECDSA)</title>
            <author>
              <organization>ANSI</organization>
            </author>
            <date year="1998" month="September"/>
          </front>
          <seriesInfo name="ANSI" value="X9.62-1998"/>
        </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>
    <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 label for each test vector value is 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 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>Evaluate()</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> (only
listed for verifiable mode test vectors), composed of two serialized
<tt>Scalar</tt> values each of <tt>Ns</tt> bytes long. Only present for VOPRF and POPRF vectors.</li>
        <li>"ProofRandomScalar": The random scalar <tt>r</tt> computed in <tt>GenerateProof()</tt>
(only listed for verifiable mode test vectors), a serialized <tt>Scalar</tt> of
<tt>Ns</tt> bytes long. Only present for VOPRF and POPRF vectors.</li>
        <li>"Output": The OPRF output, a 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 = 8ce0798c296bdeb665d52312d81a596dbb4ef0d25adb10c7f2b58c72dd2e5
40a
]]></artwork>
          <section anchor="test-vector-1-batch-size-1">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = c604c785ada70d77a5256ae21767de8c3304115237d262134f5e46e512cf
8e03
BlindedElement = 8453ce4f98478a73faf24dd0c2e81d9a5e399171d2687cc258b
9e593623bde4d
EvaluationElement = 22bcfc0930ecddf4ada3f0cb421c8d6669576fc4fbbe24e1
8c94d0f36e767466
Output = 2765a7f9fa7e9d5440bbf1262dc1041277bed5f27fd27ee89662192a408
508bb8711559d5a5390560065b83b946ed7b433d0c1df09bd23871804ae78e4a4d21
5
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 5ed895206bfc53316d307b23e46ecc6623afb3086da74189a416012be037
e50b
BlindedElement = 86ef8baa01dd6cc34a067d2fc56cde51498a54cb0c30f63f083
53d912164d711
EvaluationElement = a27d5e498927ca96e493373a04e263115c31b918411df0ce
d382db4e66388766
Output = 3d6c9ec7dd6f51b987b46b79128d98323accd7c1561faa50d287c5285ec
da1e660f3ee2929aebd431a7a7d511767cbd1054735a6e19aee1b9423a1e6f479535
e
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 24d1aca670a768b99e888c19f9ee3252d17e32689507b2b9b803ae23b1997
f07
pkSm = 46919d396c12fbb7a02f4ce8f51a9941ddc1c4335682e1b03b0ca5b3524c6
619
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-1">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = ed8366feb6b1d05d1f46acb727061e43aadfafe9c10e5a64e7518d63e326
3503
BlindedElement = 444550ea064013c569fe63567eb93e7a9496902a573ea1e6654
76fd39d5edc40
EvaluationElement = 7af7a45e4f1e0c6d410d41704e16d980ebff051fd0975fce
cd17f79a6b57a473
Proof = 26982a26b2aa20f1e449be5a858c59d7992f7f4a13b007e3980f5c36e8ae
a7014268883db3094e08e3f493b3d23bae87ac098a33e775172c1027f1b5d025ca08
ProofRandomScalar = 019cbd1d7420292528f8cdd62f339fdabb602f04a95dac9d
bcec831b8c681a09
Output = 453a358544b4e92bbc4625d08ffdde64c0dbc4f9b1501d548e3a6d8094b
a70a993c13a6e65a46880bbd65272ba54cf199577760815098e5e10cb951b1fc5b02
7
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-1">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = e6d0f1d89ad552e383d6c6f4e8598cc3037d6e274d22da3089e7afbd4171
ea02
BlindedElement = 82d9fc20daf67106ae2d2c584c615d103dafda653ac5b2b2c6f
aafc06e3f1c0a
EvaluationElement = 60c468920f4f949be9aaaf9b4fb27dc7bc89daca4a3aaa31
e96efae56c02ac75
Proof = 4a7490fd0a9e13cc66bcdeded002899a3e206364d9bdbaf9998a73dd728c
8602a6967f81a4948e6de797d638ee02ca44d933d05f2715fa1618b6a3324f3b2608
ProofRandomScalar = 74ae06fd50d5f26c2519bd7b184f45dd3ef2cb50197d42df
9d013f7d6c312a0b
Output = a2bacfc82a4cac041edab1e1c0d0dc63f46631fb4886f8c395f0b184a9b
7cbbef2eee05bbd3f085552d8c80e77711b2ad9ba2b7574e2531591380e717d29c6f
5
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 80513e77795feeec6d2c450589b0e1b178febd5c193a9fcba0d27f0a06e0
d50f,533c2e6d91c934f919ac218973be55ba0d7b234160a0d4cf3bddafbda99e2e0
c
BlindedElement = 70a6ac589da4cfff4a1135c21e438a50935317ad6900810a59e
76c2c28d8e562,5ed4710468c94e6c0181aef8276204ec6aef509f5cf1d7d6184693
1481d23d76
EvaluationElement = 5ef7bc4c54aa5fccb4328fd725d3c20130ebe3ced54f28b6
e6c4591815158059,0ce1a236be8dba445cf57ddddec8f1c2d9be2c164add431fc18
e3279be968c2d
Proof = 53afba40c6c27636a0694def258728f192d25ec5f97ee1e87a408fd20615
6107d3b82b618242f10ff459d7d30d0a68d9e381254d2e5f6bc82671f093f47c0e01
ProofRandomScalar = 3af5aec325791592eee4a8860522f8444c8e71ac33af5186
a9706137886dce08
Output = 453a358544b4e92bbc4625d08ffdde64c0dbc4f9b1501d548e3a6d8094b
a70a993c13a6e65a46880bbd65272ba54cf199577760815098e5e10cb951b1fc5b02
7,a2bacfc82a4cac041edab1e1c0d0dc63f46631fb4886f8c395f0b184a9b7cbbef2
eee05bbd3f085552d8c80e77711b2ad9ba2b7574e2531591380e717d29c6f5
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 02c1b949c3d65f83b18890aa8d099f6063fa6a72add8d776bc15a291fd08f
f04
pkSm = 1a2fac6b919790c613e0fbed070471778fbb1c6950d40a4e059acb652dc57
161
]]></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 = 7e5bcbf82a46109ee0d24e9bcab41fc830a6ce8b82fc1e9213a043b743b9
5800
BlindedElement = da01485047605a666542d0599ef2fbeed0c2e45a97c6e3d420f
832918e09f535
EvaluationElement = 3015fc16fe179bdb9054da5297c77d1f249dabf32e4fdcc4
937d6ba5e99d7b53
Proof = f10470180fc884a2f51472eddde9ad9a4080b00e13f63c130cece83b93ca
500f956b08e35ed2670ca504c704e0b74687451f5985627c93e2290a5da0dffc1d0b
ProofRandomScalar = 080d0a4d352de92672ab709b1ae1888cb48dfabc2d6ca5b9
14b335512fe70508
Output = 4d04eccb77a29bd8a00fb1e3f391e0601340c3dc874fc7bb16cfd92d961
532d18b4edfffaec94457cb19111bca1ecd19e46124c6a5d29703d09df5e5ab521b2
8
]]></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 = de2e98f422bf7b99be19f7da7cac62f1599d35a225ec6340149a0aaff310
2003
BlindedElement = 909f8d2d517fa2235f8b35f91220636732541d9f3e309c6988d
6d8c987e5a357
EvaluationElement = 241786b8f9da3e8c28d75dc23b5f8b251ec150ccb453efa7
12f6e9b72e763a0a
Proof = a3748b980aec81add561bcd7ac4fe2b09a93bd8a127991788fd618bf7fb7
93034a6f7f59cdcab538ed3e50d74b31f82dff14e3c8d3a081f744a6bdf93526ed0e
ProofRandomScalar = c4d002aa4cfcf281657cf36fe562bc60d9133e0e72a74432
f685b2b6a4b42a0c
Output = a88ab2bceba2c9c5a0ee0ee45636e65042b5f274af864f8c1560d32ecee
4373c31907f237609d3f164beec32e3270588961c1d19cee467d2a3b0445ebdea215
9
]]></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 = e79a642b20f4c9118febffaf6b6a31471fe7794aa77ced123f07e56cb8cf
7c01,0bb106c0e1aac79e92dd2d051e90efe4e2e093bc1e82b80e8cce6afa4f51980
2
BlindedElement = 3206271954cce85425971fddfebe14acad819b9753ffc171815
7e54a5e56542f,847b21e32855892256a3eee10ea5c512d362b34de1ab278573cf91
edfcb14a03
EvaluationElement = 76d3282ac9aabc9b0133df89e680ab0d43f2946c224db25e
798abdf0ed1d255a,e8483fbacb3e62787a803dd6d688e4db26be5392f529f1dd6a7
f06e2b28dc52c
Proof = f5b8d39897f12dd1f8fc927e2f7f563629b7b45f1e6b5eeb469c043d2143
7907a0e9236beec240a04e0fb906a7d126a8cb40e22730106446c1fa3a40a5283406
ProofRandomScalar = 668b3aab5207735beb86c5379228da260159dc24f7c5c248
3a81aff8fbffcc0d
Output = 4d04eccb77a29bd8a00fb1e3f391e0601340c3dc874fc7bb16cfd92d961
532d18b4edfffaec94457cb19111bca1ecd19e46124c6a5d29703d09df5e5ab521b2
8,a88ab2bceba2c9c5a0ee0ee45636e65042b5f274af864f8c1560d32ecee4373c31
907f237609d3f164beec32e3270588961c1d19cee467d2a3b0445ebdea2159
]]></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 = 416f3b0f4d13ac19e6aacade4ecf8b7e9c55d808311be2bea0dae4f4c56d0
73e7229b8b72a8c7eb68bd2e98336baaec1ac47c82cf2c5e33b
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-3">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = d62851d4bc07947c858dc735e9e22aaf0576f161ab555182908dbd7947b1
c988956fa73b17b373b72fd4e3c0264a26aa4cab20fd6193b933
BlindedElement = d078a185d2d8a54b68d6df4e83640192d3659e18fec68d43e48
02998d3c9fd819b32070caa78083c909d68daeb7fd420a73f931452a2b70d
EvaluationElement = 3452e46b6277b032627a7e5d22aa1b25459f8de90dda3137
9ed490bb0078eeec05fc4265fafbb5252d4228f9f1f5453bbd391d6b8589f232
Output = b93d3ed18489c1236cc965d202254de35767ea673560d6c225cec0b30fe
3adc88fee63f8a78d127cd64c7077e1d3ac4a7cc761335c0bcdc12d6981ad8730285
8
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-3">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = ac345e8d755997956ddd1f267a2d86175aeae5e1168932285a6f602b4b20
a570a697452b3ddbb7d0e29363adebbcb5673294396b82931f37
BlindedElement = 283f0fab2be6ac3a3c8eacfd504f3ef63f518892f7b000f1dcc
1ca2e773aba0fbee48b100886b90d5a08377cbf5ccf69801ae2c23e1adbf2
EvaluationElement = ae30bab51a34c45a76d00034b29e1c5346fbe3718c386302
8e47226456880a85a2e5118f274a8c260dae62fcec3cde8624405fc7cddbc867
Output = aaf99e5a044bbce915bf3ba381e25da62e4b2cea4cee2f47f3662940284
579c0f8e1e011062ba010ca4f2c67a8157481c9ae7a458ea035a89e1948bfc5b8323
b
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-1">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = 167e36766c08353fbc8fc46d89619f0306603a8ed33f7eafcca998ed2e890
d15f64a22b0196aaa298e4a502275d4ced5c6131de64597c500
pkSm = f27f3a898855240ef102d7bd6795aab2fa3972db3d47005cbd33e721cbed5
a3fd37508d093ecc645fa80a7f928c4313cfbd4654e8ea7de8f
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-4">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 4bdfc97a75132d92a1da241baff84fada3e7b12d5b712efcac9ba734d54c
2b24bff0ef6310404b5c05d60d7c258cea6500229ee015149f0f
BlindedElement = 1ceb0a3432ac6b583c31fa70b7c17ac86e0aa425e0593d04b58
021670f725eee6664e6cd2041d90f157bc213a2aa4ed7929630b2d9898a76
EvaluationElement = 3afaa02425294a4810766c68e9e4c3c507b109b9064ed56a
148a419371d5fb158f6ab5f0da62a6ba915bbe431097f5c71854821c1f10889d
Proof = f02f7ab2722508e343b5692078556e7ca9b2d63bf83dff902150b867775b
f375693cc6a0adf33178ba7e72d6179b36ed051065c93619752958746f0d52e2e3a9
89d86df15f458847abdcc23976147b7b10c96452332aa03bfce1b89b7aeed080869d
7ce8c7acb7414e7dbfcda298b532
ProofRandomScalar = 54534ad9db9f6df6ce515d1b8017923b65cada199e936a62
3c8eb3bd08e9b3f6584a85e4ff26e9f869d30b6c7c6cc56fd94e306974fbcc3b
Output = b558e37f6435a12fefded196936a4c1d0882bf4a115002920744ecb3128
43678f396f7d36711cf551750388ddf7a53a3aea7fd0ac60568cd2d4ead16a1ee106
f
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-4">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = beda1edc786e5fd0033feac1992c53a607d516a46251614940e76a2763b8
0683e5b789398710bdbc774d9221dd33c509b4805fc26f0c8d0b
BlindedElement = 2e04b6883057a5b5ba020d077ae36dee76a07c2f3eb8cc55baf
dfb3da9c7405ffe50802f646ca3c3ef39d195c2d88ee56e73825c7cd2319a
EvaluationElement = 6270b2f73738aa846dca34d7b30b7c4f943e31d4d4fb35c5
98f5d608cf25648b44553d43b158dc2707eda170dc439740c10d7b4355bf0f83
Proof = f731f60aa18d508f07dd3b7851fe9f8cfe6f02c4ea2814cfe8af3203e493
44041e6acf0f09fdffdc02d22728544b9bda8d0604e727f27a1efa16526f169191de
db35a1338bf399d8737d6d1638f6d4b895c0869b4194e66fb0dbb4b3e0437a2af0d7
6dd8cfb0bf38c9de605dc5749603
ProofRandomScalar = 00cc800042a0cff31f865698f8858efa75a1f0faef934317
dd6a10bfbbb39f9f2d97dcd5ff4eae02980b08fc68da7b71d39399dc4eb0400a
Output = eb14608be2f14c25b2c9fdd23690d293d0c6aaac501a3405b626b8699cf
34bb9dd4c2d7987b6391519b9480da453611509ba98098b3e79a35acd00f5e9d8abc
e
]]></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 = 89ae863bc6f3e8b59bbd1354548220e81cd0ffb6f9e4ec2173870ae684f8
6b1c06e41ecdb9ef83429e58098b8f30a6b49d414ad5f941cf05,7b1f0b697d9efa2
b60c984df38632f1096f2bf292478118d78e9edabbe9ad22900ad84b1a2cdcb869c7
0c83260691e69ea7f473c3b478707
BlindedElement = c86795bcec21f2b337865406ecbb9495dcacfb0b0d7d2a857dd
31f0f70619a403d42bb57fc53c9182878baa7be06e337c885ba0023190d63,7eba6e
7672c0a7cb7c725ac98adf2b081e05fce49bd5cbc6c0b687aceac45ee0aab63cb13d
0f0493a265996a7aa94c9b30f4fc0c385a36af
EvaluationElement = 14553405aed5bd3b2672fc74f52aa1d9efb9cdd5ec668476
d74c60eca8930994aeaf61eba482173e5953988d702ce5175ab10c1585cbc4a2,727
5d01889988341f8c9c8d0adaedb54af2d166112ac01f2c053fc772cb09d69a33ee0f
fc6a92ca0d752e35f4a33ba0677c37a3618ae07dd
Proof = 820c0da6f0ceb390355da6fb002549f37031e92337bde432d3518541d2f3
e6e4f86fbaa2aa0aa53f15db278a0aa2d305226911e408c25f2bcb3a6774089d075d
3a92e273fbe5359a9c81f9e83082a2e8b02f34d248789f8da583296e7c531e9d8707
90042248e589809a40631feaa914
ProofRandomScalar = 7baaffc0af7cf69078ce1702514d93f32828684a1796b559
988623c12413cf511d13cb07ecb6d54be4962fe28eed7d4386c156301dc2db01
Output = b558e37f6435a12fefded196936a4c1d0882bf4a115002920744ecb3128
43678f396f7d36711cf551750388ddf7a53a3aea7fd0ac60568cd2d4ead16a1ee106
f,eb14608be2f14c25b2c9fdd23690d293d0c6aaac501a3405b626b8699cf34bb9dd
4c2d7987b6391519b9480da453611509ba98098b3e79a35acd00f5e9d8abce
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-1">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = f68691e40ba92bfdf37acfff161f5404f9ae0e53c7cedb0a790ab17c4c0a7
4a314c24974057464185e2d2e648f74ee6663443646db2c111a
pkSm = 2a742a63231b139ce19eab43e7a855f32e5dcbd16ef52a7f968456a814104
5d49e3e28a995cfaa22ee104e22f2239f624b3fa7d41bf15186
]]></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 = ee671e4c9b6783bd5e4a55d2e8474fe0ec811b4cca7c0e51a886c4343d83
c4e5228b87399f1dbf033ee131fe52bae62a0cb27eb7abfcab24
BlindedElement = 4c371528ab436b8a6a5bea333cc5702c70cdddb80d12dc2eafa
06b87c15bba8b0b5451bc09f3d07e57c12af4c0398b09ae91b678fdeaf2aa
EvaluationElement = d27f65d6c41880303989752e40748e940add1ad32e7f76cc
bb873b7fff424d348ec8e43c11402e02934c1fcdadeacbca2d2e5171daaeef90
Proof = bf2f61413c56c0351151c1995007ceb2e197c987056f20a54f0027e544a0
b20a7891b9aa882203f2e09e1a0ca9464e3cdf130eea9e1123023460d3f280dac87d
23b8d2258666d002f57810d8847832b775984819e457c7bbe703947e7aeccdf59d3e
520437edefc26b814f9fa7fa9917
ProofRandomScalar = c4b297c662a87631531aade91c0558d87224d92247bdfa41
9a53af4cbdb352b0a2016e5e5f6c0bee4a642526ef9910289315b71fdee5df1e
Output = 1ffbf9591b674e6a089279a8319c75e949cc277d7b5c757361412180307
90755e90af009768e1b9240c9734d8886c6121123384140b26c38c7a6c4217a1b3d9
4
]]></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 = 1abe4937f28f531b14ac96b844320e7a66810c2d9391cbb877348301ab59
a3a91b4a2129672886ae5da7839f2ac8cf1c5fa92703f5b3fd06
BlindedElement = dea615b00285247715173fc6db40cab1436607bc0eaed3d7a1a
1467b70c7ff2f2ce91c05bcaeda2b01952926f254f13e1a763a174caa693a
EvaluationElement = a692017b9e91efbe6641c3ef0cd3b352022ed08bb5ed0c1d
a0838589bebe53c2d2959818359cb0213b94cafa672673608b9a2280671d6c75
Proof = ede122b8ce87d22fa1bb9dd38dc76da1a9ff812a8d2cbf3d2a6e86a10331
a849d203bd925d6f130d80f333aa0443488731769e975b4c900d923d740fec13a61d
3175a0daf9a88d8f66704b36ca2b1b7fefd6cab4ffb50fe998e53ce4743ee9466a56
886f79fd6d5b924553f64130c60a
ProofRandomScalar = a3e896e126d371f6380ca41757f6458b93b049e1b0d73ab5
b8d914b08dff3e52e62ea8898d35b2862d28ff4c5f89353d25d6b5a8dc014d3b
Output = daeb206a0e1fc120ebe4ad885f851f456f7d8908166839b7dc541f71251
4203d9a3589025b4bfad6a79c6d40bfbf217f44a9aa17874a1ec271b23cced72a44e
f
]]></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 = 255d8adc40b8f39f14cd8bd4ade8abbb95166afdc9e922203abe7a853985
4c64b943b0b46e1e1b47cfb52e9a0867c8cde22bcbdd724d9f09,71bd897c56c86b3
1b096103b7e2d26d0f4d66be95299379b41668dbbc5ece26cc212d9f2cbfaf479efa
17b7f6b056dfcfbee5bd7365cea26
BlindedElement = 361b80bba04ff4b211e38e636a8530531213a44f44738992b18
eaf0d9759eedcb7e4034e9bda6f8829250aff72343b0d2d1e23d612d94674,c68d79
d1a614b90e6ab1dc14a982f9fdd423edc94a10d87d45e32935e363079967ad289482
8b1764cca8dec5e9f919def474b1d03b6c069d
EvaluationElement = 32629ccfd36787d8d80756f025f6c23c21145dd22c28d974
f34098e166a300731b691e1faa7e3959c1bb38312c43d1d693cbab4b90fe7d2e,eec
655a1a869b3f0f470f7a0f2cef69eb6539c6c1b9e49d9b380bccc7b510d466f45d88
fa690b687a8507d1e0b275028d095292fc4aadd2d
Proof = 2f3501925c81837232ae34e5351518ad35e24f1d32f7459da3c19cae7746
95e7dc1eca32133dd57cd0e2eb67c75c9edd9cd3ff9c5e1759314ea99a4eca322f6e
56f4b80795f67d1bf747834d2d7b3049351979ca876ecf28f87b81fba243269e3c09
ea1889abd968af67c7ca511d0c3d
ProofRandomScalar = bbbf1ebe98b192e93cedceb9c0164e95b891bd8bc81721b8
ea31835d6f9687a36c94592ab76579f42ce1be6961f0700496e71df8c17ab50c
Output = 1ffbf9591b674e6a089279a8319c75e949cc277d7b5c757361412180307
90755e90af009768e1b9240c9734d8886c6121123384140b26c38c7a6c4217a1b3d9
4,daeb206a0e1fc120ebe4ad885f851f456f7d8908166839b7dc541f712514203d9a
3589025b4bfad6a79c6d40bfbf217f44a9aa17874a1ec271b23cced72a44ef
]]></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 = 88a91851d93ab3e4f2636babc60d6ce9d1aee2b86dece13fa8590d955a08d
987
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-6">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = f70cf205f782fa11a0d61b2f5a8a2a1143368327f3077c68a1545e9aafbb
a6aa
BlindedElement = 0372ffe1ebd9273f17b09916d31e7884707e8902f7e3af2a1b3
ae1dfbfae9b5126
EvaluationElement = 02aa5b346b0375cd734014ffa9ed2135a1b07565c44fe64d
5accfe6ab6d8c37f77
Output = 413c5d45657ce515914232ef0bafdbc1bfa5c272d4b403f2cea0ccf7ca1
8f9be
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-6">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 482562df55c99bf9591cb0eab2a72d044c05ca2cc2ef9b609a38546f74b6
d689
BlindedElement = 02fefe6e044601a158175fb4bf90c06841ca7211dde4e56e5ca
c6dd45728cfa04a
EvaluationElement = 03167ed445f79ffa867268e30c0aa240ad1a863569016406
6d833e350802e57273
Output = 2a44e98a9df03b79dc27c178d96cfa69ba995159fe6a7b6013c7205f9ba
57038
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-2">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = c8a626b52be02b06e9cdb1a05490392938642a30b1451b0cd1be1d3612b33
6b5
pkSm = 0201d3da874a209120ac442081e9ef9ed8ee76fda919d0f386cb5a0143755
b10df
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-7">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = e74c5078a81806f74dd65065273c5bd886c7f87ff8c5f39f90320718eff7
47e3
BlindedElement = 029d750421c5c726658902c47d3675ebba01ba25d0bd127bf6e
338b801b166f1d2
EvaluationElement = 0291e9890c7418a2fc1ac635d2650bae3f1a25a9ffcd0bc0
1b3c39fcee4b095dca
Proof = 54ec2d8558f5c72ff32489556c3ba1f3087810c5f51cc025f07adc034df2
dcd6d706e7bdae3119b70748cbf76b66d520de87bf90287a091cf6f8d2a465cf2200
ProofRandomScalar = dfc19eb96faba6382ec845097904db87240b9dd47b1e487e
c625f11a7ba2cc3e
Output = a906579bce2c9123e5a105d4bdbcafb513d7d764e4f0937bee95b362527
78424
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-7">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = dfe89ac0cdd6b74684580de0f95f8e06aa6f6663d48b1a4b998a539380ed
73cb
BlindedElement = 02e6085d4017ae0bede4b261977b588349d323414eb5c409e55
2e2bd4c82df498b
EvaluationElement = 03a649c5ac48f33a6c6cd82120145e673e17395ca94ea824
c7d2dda7203ba4159a
Proof = 1a79f6a52579f7acb0100c916390989a1dca3c1b3078402e102b8dd037f0
b34d929d38239b34175f1328708ec197bfc532ef31dafdf1ee85db4ccf8769844fdb
ProofRandomScalar = 4f9a70536c175f11a827452672b60d4e9f89eba281046e28
39dd2c7a98309b07
Output = d13c62d285a71acb534dcebdf312bfec0e2a3fcb79f4ac32d2dfb0bc9aa
e3cc7
]]></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 = 9e68a597db2c14728fade716a6a82d600444b26de335ba38cf092d80c7cf
2cb6,d3d6e1e1006dc8984ad28a4c93ecfc36fc2171046b3c4284855cfa2434ed98d
c
BlindedElement = 03b2332e9dc41bd9b7997df58c1f432d13c4f018cb2095ef8eb
14ef3b323aceb86,03eea6961f7f16deaa8deb6f68a865ae04d8be760626cad589b2
2cb90262e30b0b
EvaluationElement = 021f7b60c7c53fd3a6867cb38bb7f6febdbd802a78d10111
00a779b67a801c3bbe,0266e83c8c525cd612669737496f0a736feb7d4209a520d2c
dc204971215db0262
Proof = 92c5c32bc18f3f5dbdd51473f4e3ecc9b07797c63d679be5399b223ae801
ddd1e469df512f907d317a0930dd0e644b26c96edc87d2f8e0a09e66bc73db8647c5
ProofRandomScalar = 6e953a630772f68b53baade9962d164565d8c0e3a1ba1a33
7759061965a423da
Output = a906579bce2c9123e5a105d4bdbcafb513d7d764e4f0937bee95b362527
78424,d13c62d285a71acb534dcebdf312bfec0e2a3fcb79f4ac32d2dfb0bc9aae3c
c7
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-2">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = b75567bfc40aaaf7735c35c6ad5d55a725c9d42ac66df2e1dbd2027bde289
264
pkSm = 02eca084e8d6ac9ed1c5962e004e95e7c68a81e04be93ceabf79c619de2bc
c3eb9
]]></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 = 4238835743037876080d2e3e27bc3ce7b5fb6a1107ffedeaedb371767432
b68c
BlindedElement = 02cb57f07ba100b93ce1bf8176963c8c7f73a76827f1c1401a9
23d7ca4083e15aa
EvaluationElement = 03059d58ec9a801e33f57525c03241d8ffb61b67a18edd35
222d864ffbb42b5d2f
Proof = 13889d6849850ccd0119981fc053a38a30a57d275091df2887943d1332f7
38204f8a6cf2fb6e57c9b118ec82b9b012f8864561e4cd8866245f9c762b9d45dbf9
ProofRandomScalar = 3d5c65b55a1b8960563b3420d7764097502850c445ccd86e
2d20d7e4ec77617b
Output = 15fce9922a2307349aac2eccc41941283e3c5e938aaf2506f99a6d8b6ee
34ef8
]]></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 = c262bf51dc970d63acb5ab74318e54223c759e9747f59c0d4ecbc0873026
67fb
BlindedElement = 02208809631cc08f553d7843db566c55746e760a77c63513d2b
22096f98452cf9d
EvaluationElement = 02301ee1cf1d01276649ac0f718ebbfa1c0d6a1b3e7ea82b
3085e9173910fcb0ef
Proof = cb69a1ec76643a2100cc9bfe6cf1ed1fa5ba3612ed3e3211036b5ed835a1
38be3eb92126694e3e925ab138d4df885be18ed80371847f80baab82ce70588eebaf
ProofRandomScalar = 6c6990f0fcd9a655f77ff0b2ebcfe21e1a1ca4a84361e9f1
b18e24c9a40ed5ef
Output = a06ed7380210856caaba173bcad06266186c6638d86e372c3c96b9bd2f3
53543
]]></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 = 3f95c9b1334d8af16ae1e69f5adc24e5aa89ebb63637c835fd39b17a1a44
53ec,9801a9d83b5d1c0fc0812c10e18f146b14d7eb94755a918bac1ef8d69d21a7c
2
BlindedElement = 0277b1e97f06cb0976bf196a30dc7b3f635a40ec1337d4bda00
f809eaf244f7133,0306823c1610cc81b08db444d7c23cd368e8b6fc1a7fa3d727f2
8bcc7d3afa9c41
EvaluationElement = 030f395a0e0328018c78de95ff498a0afb54fbcf34197226
49e211940852ad0171,0221335509649461a4d201d2887af62313466af660559c348
e8ac326fbc1c147af
Proof = 187aaa12108c49c1395001ccaa677519572ac4680b0f41b346b9879d3ea6
fdb9fced5c7f20b351d03786d031de79cd3c03723ce48053a13b640fe6051ee3584e
ProofRandomScalar = fa0ea4754fb56527be010296ea880e1c6a4dbbc9ede543a2
ad0f83fd60fdacb6
Output = 15fce9922a2307349aac2eccc41941283e3c5e938aaf2506f99a6d8b6ee
34ef8,a06ed7380210856caaba173bcad06266186c6638d86e372c3c96b9bd2f3535
43
]]></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 = 8b0972b97a0339dbcdb993113426ce1fe1b11efefe53e010bc0ea279dda2e
37ac7a5599acec1a77f43a3ac7a8252782f
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-9">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = cda63dff3137c959747ec1d27852fce42d79fc710159f349e7da18455479
e27473269d2926fec54d4567adabd7951ad6
BlindedElement = 020db1b05b22ddd8a851792dfb5b10b4f237d69522097cbb012
7ae537e3256f86e35a72554a6ebdb26c28342fee16473dd
EvaluationElement = 031e6e8c82d3284727a724a5854b3e2bf9958b4e5470601f
4ca37d33d26879eca817796cb7e98bbbb1d1739eeafb33c027
Output = b2e380ca96ea80f7550a6b663e5f7752d7d7772c46169d72308a8425903
1e804ba577ac34e632f535a9519a692734016
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-9">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = f9e066cf04a050c4fd762bff10c1b9bd5d37afc6f3644f8545b9a09a6d7a
3073b3c9b3d78588213957ea3a5dfd0f1fe4
BlindedElement = 023c36bf6352c93d27b118972d1040cf22f99d5a1c8134afb89
8d30b319f70a096973db23410881f84eea599c0c73220bd
EvaluationElement = 0240b6a002d0190793ea62a7499244027753d63b0a57cea1
98c8c6dc883cdeb273ab385699bb414f1040bb6819313cd675
Output = 1d155a7ba2ea75c4f1e76fb0a37231e9b0776eed3f24a6541a01907ca8a
fb984a74408e6d2de8e481cae5dd03bdae3ce
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-3">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = 70855cb96c961b39ea3ea5776d89c8b7623f5891a26e8437f86e2c713bdb0
da23415590a28184dc22088a215ebc7fe45
pkSm = 02d7bdae4b97ecf0fbb8c00cff3a3a9b6d0fb0cc34f8490a98a74dbb59a85
f43bda8ca7b3c0b05164f38d8efdef2c3426a
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-10">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 61247a74d0c62c98ddff1365bb9b82b279e775b7220c673c782e351691be
a8206a6b6856c044df390ab5683964fc7aac
BlindedElement = 026601d99c313b827a09aad832fcc814ac5257a57bb49d65c05
e247df9518315a66557fc8af56b4521c51900aaab1a2ea9
EvaluationElement = 020b478b9c9b1a5935e07fb532eac2e596b78170a0e755ec
c71829419e63a2119eae23be281e109de205cd85af7e42228a
Proof = 02d0946f1795048bc803171aea5b4a9a5f256bd5fa9414e5fa76dd17a4aa
a94307814d57c2cca239485e29bb76d4ac1b4d3d62dfbb8e43c7135b2ebe50fe923e
30bd99e1e6ec961db18fa6e67c63dd6652284c15860156c08d64d838efbeeb68
ProofRandomScalar = f5685928c72d9dab8ddfe45de734ce0d4ff5823d2e40c4fc
f880e9a8272b46eea593b1095e7d38ba6ff37c42b3c48598
Output = f18884ace2e342f849cea7f2f17de902b9884574fdaa8f507356f482c6b
67013f329e8c899b3c2c154af1defaa11d656
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-10">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = ef54a703503046d8272eaea47cfa963b696f07af04cbc6545ca16de56540
574e2bc92534ac475d6a3649f3e9cdf20a7f
BlindedElement = 0279e61686e698fdbac5cf484f54846db8cdf6f403fa88209c3
4c56c584fe4ca600ac81b61aad11c5e639ff1add3b30de4
EvaluationElement = 03900e8e3f5b8bf698e7aa0aacb8dbdfaedf80220b1f640d
e2049615985b19b913569cc2feb90725a3661146fb88ef3755
Proof = 343536346a1145b81336eafc239f225dc6a154752492707c0465f029aa9a
f0fe2bf0428285e43b596db633b50f0801b62b0e9c64c62f329b8a84324a415e4a58
6cbf9477b1285c9b74f614c352e06658a8997486b8177006491e84aa96a3de09
ProofRandomScalar = 0cdd9475ad6d9e630235ff21b634bc650bf837aaa273530d
c66aa53bb9adb4f0ed499871eb81ae8c1af769a56d4fc42b
Output = f91d172cdecdea4f8299c8b39426db4c47428b82f8872b8539ad9b019de
b48b8d3c928c572ed988d5591a4442c060438
]]></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 = 485cccf5018abbf875b8e81c5ade0def4fe6fa8dfc15388367a60f23616c
d1468dae601875f7dd570624d0ae9d7be2e7,b0d53a6f8da29c3cf4f8695135d6454
24c747bec642bc91375ff142da4687426b0b4f35c14eb2477c52e1ffe177f193b
BlindedElement = 03dbcb21b211e7b5d2cf0c36d782308af28458539423f67a293
36355e55035137eb768b1935b5a825c589a2913f0c2894e,036c8b2fa4dd9cd05756
1d377b4686cddc82317ad3e5eda08bece2a8616ca724937ff933e340a47fc09bfe9b
0fc1ef9ab6
EvaluationElement = 03a1cba477a408162aacdca43e059309fd61cc14687a107b
d492a1ec688a010ff49c60684e0f973412a7da2e627b1553a5,036fe6df8a99bb7b2
c4a5020ab4c6d7e71b5abca2d5d5a418f2314b614deb40c7b3acad982951b5f524e5
6f0e9ac7d8e95
Proof = 1e26bf1210717b88dfae585008100e9ccaebe93b8605ca168a608cbf1855
697b7b87d0b9c6bdca85e43143b3630e87f2fe9ce519dba3d477d2a869bcad0db9dc
6239cd11938213f9bfd63d39de090a6fc90cd1f33f164b2c54c38bc31ad98ddf
ProofRandomScalar = b36f4c2a140b7a3c53dd8efb6171d3bb4d73591be8483a1a
38e40c13a04b0f2180dda3c36e3d43c3a8f127158d010945
Output = f18884ace2e342f849cea7f2f17de902b9884574fdaa8f507356f482c6b
67013f329e8c899b3c2c154af1defaa11d656,f91d172cdecdea4f8299c8b39426db
4c47428b82f8872b8539ad9b019deb48b8d3c928c572ed988d5591a4442c060438
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-3">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = 2b65a799c107905abcc4f94bdc4756e8641112ae1fc21708cd9d62a952629
38ded6834e46bad252b4e533ee7eec7e26e
pkSm = 0286f37b6295bba7ebf35d2bfbb944d441fc416e51eb5ceeb63ac98afa6a6
27ccafe20bd600c728bc5b1300148ef2ba6e6
]]></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 = 9572d3a8a106f875023c9722b2de94efaa02c8e46a9e48f3e2ee00241f9a
75f3f7493200a8a605644334de4987fb60da
BlindedElement = 0252f98f04a956afa469c62ca2850f751b112dc019d4e713c66
2fc0735ef8573f1497cea55b750f27f0efc8330e394a3ab
EvaluationElement = 03fb20c33a7f6f01f2bb388318a6db84f7183bc3bd5e5840
302fe38b6b313649b523238b4c4c625614440dd6ddbbcc7272
Proof = d33c83c1840a48759659a4d417769ae3bb1adb86326a36fa1ff24f70066b
75d0200e5c1e7d9847e91f7d3d6843efc62101c401a7c952cde32ada6fec848450d8
564e2c778af47ece4f50a88c6d2281bdd858b90fdfad8b093c986bc1e59aaa2e
ProofRandomScalar = 7e82569cb56d97e9c20e59311bac3a50735d573abb787b25
1879b77de4df554c91e25e117919a9db2af19b32ce0d501d
Output = af52cf184180177970be0770e1c7920aa307b767556a13de38a64723d8d
cc7b344af9b6dd8f117ac2cef249ee3acc8fb
]]></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 = 01e6e57b7ec6752a45c74f3ed36a3eb8ad0dafb634f668e415357a04fab5
01c0f6764e854701129e38071b008286c5fc
BlindedElement = 0257c264a1016e7a1a8236e46cb3bc11a0f13178b03262e0153
1da14a05e75a811ba4669fc41cc9453298f71c23834f91c
EvaluationElement = 0295529cd99f4255be59966e430bef38c93a5261b0624612
091327c9aedaaaa40d22b03280ec15620bc91d48970f18c68f
Proof = b5dfd5fc5ddc61ad8234c544aacbf280193da985d9204d5a30ef9d1a5964
c1e70ffc3d9c986c93f561ab6f91f012c8ef9b9b6f2d1c178f01fe172c37c98fd4ef
05e5b15c15e810241ed6dda051500165d9f79d4e83580ea4c810a95dddcb593c
ProofRandomScalar = 6b61028c0ce57aa6729d935ef02e2dd607cb7efcf4ae3bba
c5ec43774e65a9980f648a5af772f5e7337fbeefbee276ca
Output = 8bc546462de3087cddafcf81435d5802c0c31f557c791b115a092d5b71e
a2b6e20986bb624ead85c7a63c976c05dcddd
]]></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 = ebd2fec41edafcba833ccaac567c14d2fa01f55b33a2fbbb37118f2f5603
b1298346e02cbdf55c95ef9b1aadda5ef281,be210603388cbcabb8cb630aa1ad04d
73e349009a438ce248380bd4b7e6758211fe9692922fb61f00f1a39bc735cefce
BlindedElement = 02b1938a7613e9567a67aac83c50529238e3323c212dd407491
1980c4d998479174ddb9c925d1b761b33da2ea0bd0ea057,031b9a47b7caf732ff32
db035d1d073fd925c17dbb6c83e00a49af674166bf264bdb00c303edb26af96fed6f
e9ce44dc36
EvaluationElement = 02c75f2d383c18692e0e11b08e9187c4c047d28116977c8e
5e1e872f1cf5eab457c04fd50274cd5cc4b1996a607470694e,02e72fbfff4c70479
23b967ee9a6b37d902b49a465242c12b2b910daa5f30c3f947899283ed0a6c758348
55a1ac0c64065
Proof = bded438b699d3bb8bab26954f9a7fb5bb402f043c3364dc4f2b68976748a
77868dec1fa2d0774d306043ee8abbad5ef8ceee6a331be2906124f53f37c96d7f5a
4aa543053ccca87b577a32d803c3ca4841e37b3c4b5cf20aad11c59dec72a350
ProofRandomScalar = c7a86f11c143a291e349b70b34e67b38fe9dc6f90b473750
87d72e891df74070810500dfd391282c15d87bacdc9867a5
Output = af52cf184180177970be0770e1c7920aa307b767556a13de38a64723d8d
cc7b344af9b6dd8f117ac2cef249ee3acc8fb,8bc546462de3087cddafcf81435d58
02c0c31f557c791b115a092d5b71ea2b6e20986bb624ead85c7a63c976c05dcddd
]]></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 = 00dc7a8db919a1076810a0c1503716d91668fa9edc60952317f26d47a090b
70dcfd3f530d07f48675cf8236d1daa81f3ff0f289942632e5cefd27a2190f0cefdc
302
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-12">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 00b638b3000884019316267eae9b424f812592e4dc9cd7f7aebfb1d3d2b8
c7fa7904503aef20c694a01d3e1154fe98e7232be9eaec5789a012a559367b1f9965
4ddf
BlindedElement = 02016f3fc7b3c84f673c75b3bb3e00ddd81e734cc84fe3bd4a7
671e0a971879b7678c048f40aae87179614abc2261522303257a92127a195298744c
54094b7b87499c0
EvaluationElement = 0301ddff1ac88acd812a2917cee4917f8a692eaabf9fd052
9981441b83e368175b566657729a8be5ba2573e33e7734c146ef4c8b7d41f4503842
80797318ff3a62d79c
Output = 383e3098d74b43f75d2e1136d7e7c08702d992e6f5f24f2bd438f98b86d
9d143ce87281b2daf7d67c94370903ba81495655d6e9626443a895b37bb74c0276f2
a
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-12">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 00219598d5f1544830f9d667b683234c68ef3db95227fe3ebdfd963d0307
0055fef107bfeb3c79c86b934061f894227b23a69eb0b53f168a4a2230ef6a7d703a
c4ce
BlindedElement = 0201e75b88d5de2b839f356a05c359ed610601450d83dcc9def
649fbd00a9790161e9333cb07978d1567ecab037c498ae2b00d9181abfd7bcee3fee
dc11de88c54190f
EvaluationElement = 0200b99d9694bbf9b9ea783e18e5fd049fb2fdf169cf386a
be304ccf8cdd633f7a1e25083ec6a6ca3a6e82367b38ee3c991e024097cf6fad928b
023817cdc5dea21751
Output = 5100f12a88477ba993cfe8eb5a82a835892b7fa3bdb47dc1db19725e4c1
138798e0f965df4f649e3a159aaca1fdd07034f7b91c0c9ac3d064b50953bb5c867c
3
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-4">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 00ef23ce13076b43a5a33e8fb8f94c940bbeabb762e5380d69cc9fa82c22a
8de39431c99e8b9d9fb75ea90446f895db04fe402b8be2c9df839f7d10ea6a23e7e0
eb4
pkSm = 020006090cc9a6f2eaef7e12759a8b5362e9972b4f36c4b3a3d71c4b67469
638593ed8f46291542e0f04fd462a8e8ab96047be087a9d3fb182f4c138c6fc95659
3b205
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-13">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 01dd6b45efbc57c5f087181c9f03d5b5e51b3a90cc9da17604b2e59a9375
9eb0985d2259c20e3783be009527adf47f8fb5b1437cba7731c34ac70bc6ab1b8c14
ff42
BlindedElement = 0201b93fc5997dc0e8acd5b3ffa3a6f1be1522986c17ed60e5b
ad7b057136b3b7e31b5a7073a744a1304bf9bce4a27b02d77f1caf73a5f72686fa9e
83dbe9f730b4304
EvaluationElement = 0301142205a8fb983efb6d76111db30e2a6e7c54724fe0ee
54f842a477cbf03adcb2cca8df2f165a65694e7a056948f8afd651b32ea8153cc26f
819cc5b1243f383910
Proof = 00fd70ea3e4b7b008de749adb7403ca66f7aa56ae06a587d7d74a06daf6d
5c4dcce8a81acdbee1fcd21ce55db4440383b9fcfc1d584db6fa022a5fd62595c7d9
39820116ad656f5ad470b5bdd208248a0a0b064960c80e180239691c5eb77b4a760e
eda8c27cf3cddc37d6329ad4997a37ffe9aba6f96d45e3e67fad86ec7b1d3a47487f
ProofRandomScalar = 01ce330164821b9b2a108e3ef8964622075015ac9ea0f838
0dcce04b4c70b85f82bd8d1806c3f85daa0e690689a7ed6faa65712283a076c4eaee
988dcf39d6775f40
Output = b3e837431aaafdfa8efbf486d70ca2d4364ef86afc7a8941d9bf1a6adb7
bfd8c5302f91ee5796d956b5d3ea95fd0138d55d3059b1f4febf8cfd552e31fa2cf9
7
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-13">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 001745a97be4680b39889979a8b4b4322450628389ff2d90c0799597e99c
926ae54b2fce5ca13daa8cabbd4da53324fbd20554f2c56460442edb7d6ee76b64ab
68d1
BlindedElement = 0300c2eed082810750dc327122ac1d9de647d1943f1767bd546
56835ef71dd68347436c121df49c997b0adb11cc421ec8abc5611b6d9e86468e4666
001e3db386ace9f
EvaluationElement = 02002ddf4ceaed6eefea8f12ca765c6d800e3f514f4fc75f
52f55a555cbecfb724f2bde39d5890f4b0dfcd3ea9029f663c7babddb30dd0692bfe
0f76190b7ee30bf68a
Proof = 018d1fbf1bc79cb4636d905f03bba48e0d872ac89c4c7e8bcc6884dc796d
22ceb648dd373b196d23335052a8d8013b154b38d233d68612213e3cea8f9024a1d0
1e160004438ef7171638b7799a987739064e2313f9a902413d1f11f0eb5c7e8ca00d
9c83d03aa12bef8059144bc169bec7f4258858438daaa3ebdacad658e5f3eb7c6d5b
ProofRandomScalar = 0013559a0599ff077b4ebcbe7f73e9fc1bc25fff3fc5fd6c
8bc664e27822fdece106def4a69460e9777347a314fbbe5035803d3aa65819e81997
c4d89909e25ce20e
Output = e8f92bac6c7ae89918d724697d8c45da339f55b61d527c50104e6658280
3a8e6dcceae31b0d499e471aca460194a011d6b8b94fe2886b8b5a0c242079bfbf09
c
]]></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 = 017b1679ed98960e4cee27f330d5d3dccebf40596dc7e8b057938841423f
8b336f12c6c4dfa3a822d8f670e5aa46e733baaec9f93d5e14ad9ab99dfcbcb2ad15
7a8b,00010fddc6356f1aa3fb05702631e213b4bbbe8fe5176fff25526ed5b1772ba
6164952c3c2da8017fdf337f81f5cbd0ec805923a335fa1bde3dbb840b3924c5ceba
6
BlindedElement = 03001658908fb353f15fd637ec5b9703cc1dfe5a8aab4f5fd51
9c0e41f69300769918d28963c07e5678ecb98c235c406f29dd1cd1dadadb4e23b98a
1cb290992b9aa46,030123068d8554e65999a6df1fde0bf10550ec5e223ef1d30c07
3dee509933502a59106aae80e67d33f93400e2c32b5d9bd49f4e8cb97f08f4181998
d330013b9e07a3
EvaluationElement = 03012d790d77da1675a8e4ca5d9ce622046e31ea4af9511f
a32ef80fbe60e9e04866feeb7f31818c1ff0ed263cecf07f787129450f9f7322fa9b
593edc5cb626d1abb8,020198f45b9988bf0ab56c37bbaed0df4099c9b7b7a89b5c7
030a451687cd9f8fd777f587dd7dcd717f529149d21c0763da4a03441d96e6fa2458
88a352d08ddda70db
Proof = 01d6f0f91660fc391573f819587ad310bf3da80a2dd4cda113c1fbbec9d1
cd88a0e4d783833c4c64bbcb6414688d925af2a4a5845b2e3b6634df5e5d901047d5
148f01a1ec61207132162fc851126b07397beeeae6814e8e135e4a03ca8bd346568d
23c85e0a64b9b83de207ff8d17674863bde02eaeb0fa16d05a9b44cb01654bd0806d
ProofRandomScalar = 001caeef2365ebf9c1edbdb24825e5735614aaf644f03458
a1f30c90229f8068bec0ae930eef110e98ea1cbc6d849b4c9ca5b7a970d0320ba5f4
f95f5cd4f501d720
Output = b3e837431aaafdfa8efbf486d70ca2d4364ef86afc7a8941d9bf1a6adb7
bfd8c5302f91ee5796d956b5d3ea95fd0138d55d3059b1f4febf8cfd552e31fa2cf9
7,e8f92bac6c7ae89918d724697d8c45da339f55b61d527c50104e66582803a8e6dc
ceae31b0d499e471aca460194a011d6b8b94fe2886b8b5a0c242079bfbf09c
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-4">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 01f8c6fb8fb3265b70e97870f942f7de645132f694c139446ab758871bdf0
058a2a83b4679fc9fc1c6a0936b2f2e8e079a75b20688d4fe828e74d16bfc6255289
92e
pkSm = 03013db33ba3e475e5696be39d99fd9ffd96452c4fe78df4eef5723097943
1f734aceefad464c4885b99313a775f5f4524db3c8404400169fd139ca053b75c6d7
e848e
]]></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 = 00dc9f04fb076cffe7d179d692a05b0c2210b6c008c1062c1e54514ef654
eefc0519dd1867571c9d518e305fdf463231b6ec8b7498e2122a7a6033b6261a1696
a773
BlindedElement = 03009a6b363627cbc6ba5f241493a724a69ca7a85f203fb5100
bde9f36ee57e3fe75a5b41d10c6d9a2799fcee9cd1f4bcd730cb8d9be7aa5e8a7a48
8b6ae3004afd2a8
EvaluationElement = 03009ae81470679a5c5733401488cc6648a522a208e698e9
879307e794158ce508e08a50556ec66a055f05f5d5276231258d95d004a49a308037
2f3e9d2075753c010f
Proof = 0122e18e5c3e2242617098cf1d6b5868d66fb4f4816ddd3769e5b7f326f0
ea3d79cd8b8b87be31c1acb9559a2ffdd13f4af7ee143e5081a2db996f3a7d2da839
73e100f559c9dbb7b16df3d5f609d2f8f2184e9e204e6444db72608e4816beee31c8
59dfabfe137bc3bae06947d767cd8cb6ad634134cf6faec24bc8341d51b584872ae1
ProofRandomScalar = 00c07a53a1c70f44466b3861be4f8ef48c2bb1aec2e478e3
41c467fd4a2638aeca63ed6c4bc48d008bca3f36f043e0eb73a44aba77e5e37d5ab1
389e09b80a34cfaa
Output = 70ad5e29de9f6e35f16afab3b97c1b26fdf6be0da60aff48a99980ddb8d
7c2d728a8a5d2837179bfddd612712e014c0c9b9596cbb5a6ee6761c564dbb8921b4
e
]]></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 = 0085ad3fc8c91caec3bd7699591b10d6da93877a470e128f38030627dffc
bbf1f576b38677841fc47af778f9d85ac9bce6279388ddf4607e295e64cea6f4f950
78b8
BlindedElement = 0201eeaedeb3692cc0ecfeacdf9cab61947eb0d23bbfe2e1fbf
8de0907f9410b6089d060d3af63411fd81b9d588fa2c48bf8ec63ec66c14b86d2371
24042ca83fc99e1
EvaluationElement = 0300886138e19945036ebe6f4195cf9f688d9e5a7c89597d
feea6e0e5fcf4b53a9dfa280c8409b6abe8051e3394279d0b669440af8a27aad169d
e10446eb88e09d6801
Proof = 01cb4d8a14eeb472ee3e2fbfe3f6d49f3654cfe6238254bea17ce30848ca
934e20e82c2a33d140de55b24fab047811e20b46f6dcaf3c0945c802e84891316186
17ef001e233aa2c3d674bce7465278faab6300d4f6b5463e1597d74e2a69865bb068
1604f9210edbf50bf341d836dc09af85e603b4b2b8b55c90c2efd979a4e312b653e1
ProofRandomScalar = 003a09eed29f2e7f8950d766270d390db7a53b8080b89cb9
e024e1e008d83bd90e94f501281b6b49c351c959348b3a65f24c6f74e77a62905a6d
3e4b0b10600a7cbc
Output = ee2d8e42030da6283ab59a11f41a171c65e208306e00c6f965a56c10f33
bf0942bb38b7e1a33c70bc3542d27220379cbcef8b91898c720be948e9db214a14bb
9
]]></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 = 019dd87ebabccec2627d4006b698d9ba57f6e207c989448d39fe0431e60c
9a9a4110596d5a16fa6cdf3f66467524f295b5dc8f3492c6da02dd7387bd1dc40065
b232,00adaeeed48a6f9a8fb57640c3bff88d3ab3cc52ef969f02beaba2c6e32c2f3
7baaf4ee9c691833dc081e2a0fb6ff636525457a21c1fc56bf3514635ac7fb8618f7
3
BlindedElement = 030170a994d40e8517aed3a7efae01b650dc131c1ae07158f02
ad70d211348a4b328add9d17e93d2e747dd8bc6960a5ab3bec6a9a29f793bf5663d0
ab108b5f84fa751,03011045c5ea9567626cf6d2baa158830b035e66c249df4967bb
bf917e64bf27e4ec49623704a7c621b32f05e1c7bf1b89960c82d4203c4efa6a1056
e083be789d017f
EvaluationElement = 0300fadd09cc84c7e91c2173be0e65ee3c1b6ef98cf0cdd7
57ec432f12f13b5d457edc0311d61ddd831f8becd5231bdc492e92c9d0c103e55ea5
16ee00fe64c10d0e8e,03005941fb7eabc6353a5c2e4a6b284b7b8ee8da6c4435af6
c4c472195bb0deb44e7dc215299c7fe38feafa2b0a1a1db7dd3090c5ce8171247f64
7da20e04acef8164d
Proof = 0186deebd9e2db71ca43bcb57311371390c2d04ac9c3189e155f10c9c548
f6f22c051d38203493176e8392ef405c783759c735cb6f7219636c140cb2dc070a11
58c001bfdb12f34e00a582e22e1eb2fbdebcffe4b6e0818de5c50451617213e1ab20
fa5392eb3b535206140a2619732c012d5f331a615755f5397feb9e1fb16d1320d20d
ProofRandomScalar = 010a82559ee5e4ba79c390c4033405e3f792bc49daa905c6
94707e7e0191104b34d68c7cc81c2e392da60b838eadf434b693d9b4f7c7beb31e37
008156656c19382b
Output = 70ad5e29de9f6e35f16afab3b97c1b26fdf6be0da60aff48a99980ddb8d
7c2d728a8a5d2837179bfddd612712e014c0c9b9596cbb5a6ee6761c564dbb8921b4
e,ee2d8e42030da6283ab59a11f41a171c65e208306e00c6f965a56c10f33bf0942b
b38b7e1a33c70bc3542d27220379cbcef8b91898c720be948e9db214a14bb9
]]></artwork>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
HX4BAA==

-->

</rfc>
