<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.17 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-voprf-13" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.14.2 -->
  <front>
    <title abbrev="OPRFs">Oblivious Pseudorandom Functions (OPRFs) using Prime-Order Groups</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-voprf-13"/>
    <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="September" day="12"/>
    <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 OPRFs have also been used for
password-protected secret sharing schemes such as that of <xref target="JKK14"/>.</t>
      <t>This document specifies OPRF, VOPRF, and POPRF protocols built upon
prime-order groups. The document describes each protocol variant,
along with application considerations, and their security properties.</t>
      <section anchor="change-log">
        <name>Change log</name>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-13">draft-13</eref>:</t>
        <ul spacing="normal">
          <li>Editorial improvements based on Crypto Panel Review.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-12">draft-12</eref>:</t>
        <ul spacing="normal">
          <li>Small editorial fixes</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-11">draft-11</eref>:</t>
        <ul spacing="normal">
          <li>Change Evaluate to BlindEvaluate, and add Evaluate for PRF evaluation</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-10">draft-10</eref>:</t>
        <ul spacing="normal">
          <li>Editorial improvements</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-09">draft-09</eref>:</t>
        <ul spacing="normal">
          <li>Split syntax for OPRF, VOPRF, and POPRF functionalities.</li>
          <li>Make Blind function fallible for invalid private and public inputs.</li>
          <li>Specify key generation.</li>
          <li>Remove serialization steps from core protocol functions.</li>
          <li>Refactor protocol presentation for clarity.</li>
          <li>Simplify security considerations.</li>
          <li>Update application interface considerations.</li>
          <li>Update test vectors.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-08">draft-08</eref>:</t>
        <ul spacing="normal">
          <li>Adopt partially-oblivious PRF construction from <xref target="TCRSTW21"/>.</li>
          <li>Update P-384 suite to use SHA-384 instead of SHA-512.</li>
          <li>Update test vectors.</li>
          <li>Apply various editorial changes.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-07">draft-07</eref>:</t>
        <ul spacing="normal">
          <li>Bind blinding mechanism to mode (additive for verifiable mode and
multiplicative for base mode).</li>
          <li>Add explicit errors for deserialization.</li>
          <li>Document explicit errors and API considerations.</li>
          <li>Adopt SHAKE-256 for decaf448 ciphersuite.</li>
          <li>Normalize HashToScalar functionality for all ciphersuites.</li>
          <li>Refactor and generalize DLEQ proof functionality and domain separation
tags for use in other protocols.</li>
          <li>Update test vectors.</li>
          <li>Apply various editorial changes.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-06">draft-06</eref>:</t>
        <ul spacing="normal">
          <li>Specify of group element and scalar serialization.</li>
          <li>Remove info parameter from the protocol API and update domain separation guidance.</li>
          <li>Fold Unblind function into Finalize.</li>
          <li>Optimize ComputeComposites for servers (using knowledge of the private key).</li>
          <li>Specify deterministic key generation method.</li>
          <li>Update test vectors.</li>
          <li>Apply various editorial changes.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-05">draft-05</eref>:</t>
        <ul spacing="normal">
          <li>Move to ristretto255 and decaf448 ciphersuites.</li>
          <li>Clean up ciphersuite definitions.</li>
          <li>Pin domain separation tag construction to draft version.</li>
          <li>Move key generation outside of context construction functions.</li>
          <li>Editorial changes.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-04">draft-04</eref>:</t>
        <ul spacing="normal">
          <li>Introduce Client and Server contexts for controlling verifiability and
required functionality.</li>
          <li>Condense API.</li>
          <li>Remove batching from standard functionality (included as an extension)</li>
          <li>Add Curve25519 and P-256 ciphersuites for applications that prevent
strong-DH oracle attacks.</li>
          <li>Provide explicit prime-order group API and instantiation advice for
each ciphersuite.</li>
          <li>Proof-of-concept implementation in sage.</li>
          <li>Remove privacy considerations advice as this depends on applications.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-03">draft-03</eref>:</t>
        <ul spacing="normal">
          <li>Certify public key during VerifiableFinalize.</li>
          <li>Remove protocol integration advice.</li>
          <li>Add text discussing how to perform domain separation.</li>
          <li>Drop OPRF_/VOPRF_ prefix from algorithm names.</li>
          <li>Make prime-order group assumption explicit.</li>
          <li>Changes to algorithms accepting batched inputs.</li>
          <li>Changes to construction of batched DLEQ proofs.</li>
          <li>Updated ciphersuites to be consistent with hash-to-curve and added
OPRF specific ciphersuites.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-02">draft-02</eref>:</t>
        <ul spacing="normal">
          <li>Added section discussing cryptographic security and static DH oracles.</li>
          <li>Updated batched proof algorithms.</li>
        </ul>
        <t><eref target="https://tools.ietf.org/html/draft-irtf-cfrg-voprf-01">draft-01</eref>:</t>
        <ul spacing="normal">
          <li>Updated ciphersuites to be in line with
https://tools.ietf.org/html/draft-irtf-cfrg-hash-to-curve-04.</li>
          <li>Made some necessary modular reductions more explicit.</li>
        </ul>
      </section>
      <section anchor="requirements">
        <name>Requirements</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      </section>
      <section anchor="notation-and-terminology">
        <name>Notation and Terminology</name>
        <t>The following functions and notation are used throughout the document.</t>
        <ul spacing="normal">
          <li>For any object <tt>x</tt>, we write <tt>len(x)</tt> to denote its length in bytes.</li>
          <li>For two byte arrays <tt>x</tt> and <tt>y</tt>, write <tt>x || y</tt> to denote their
concatenation.</li>
          <li>I2OSP(x, xLen): Converts a non-negative integer <tt>x</tt> into a byte array
of specified length <tt>xLen</tt> as described in <xref target="RFC8017"/>. Note that
this function returns a byte array in big-endian byte order.</li>
          <li>The notation <tt>T U[N]</tt> refers to an array called U containing N items of type
T. The type <tt>opaque</tt> means one single byte of uninterpreted data. Items of
the array are zero-indexed and referred as <tt>U[j]</tt> such that 0 &lt;= j &lt; N.</li>
        </ul>
        <t>All algorithms and procedures described in this document are laid out
in a Python-like pseudocode. Each function takes a set of inputs and parameters
and produces a set of output values. Parameters become constant values once the
protocol variant and the ciphersuite are fixed.</t>
        <t>The <tt>PrivateInput</tt> data type refers to inputs that are known only to the client
in the protocol, whereas the <tt>PublicInput</tt> data type refers to inputs that are
known to both client and server in the protocol. Both <tt>PrivateInput</tt> and
<tt>PublicInput</tt> are opaque byte strings of arbitrary length no larger than 2^13 octets.</t>
        <t>String values such as "DeriveKeyPair", "Seed-", and "Finalize" are ASCII string literals.</t>
        <t>The following terms are used throughout this document.</t>
        <ul spacing="normal">
          <li>PRF: Pseudorandom Function.</li>
          <li>OPRF: Oblivious Pseudorandom Function.</li>
          <li>VOPRF: Verifiable Oblivious Pseudorandom Function.</li>
          <li>POPRF: Partially Oblivious Pseudorandom Function.</li>
          <li>Client: Protocol initiator. Learns pseudorandom function evaluation as
the output of the protocol.</li>
          <li>Server: Computes the pseudorandom function over a private key. Learns
nothing about the client's input or output.</li>
        </ul>
      </section>
    </section>
    <section anchor="preliminaries">
      <name>Preliminaries</name>
      <t>The protocols in this document have two primary dependencies:</t>
      <ul spacing="normal">
        <li>
          <tt>Group</tt>: A prime-order group implementing the API described below in <xref target="pog"/>.
See <xref target="ciphersuites"/> for specific instances of groups.</li>
        <li>
          <tt>Hash</tt>: A cryptographic hash function whose output length is <tt>Nh</tt> bytes.</li>
      </ul>
      <t><xref target="ciphersuites"/> specifies ciphersuites as combinations of <tt>Group</tt> and <tt>Hash</tt>.</t>
      <section anchor="pog">
        <name>Prime-Order Group</name>
        <t>In this document, we assume the construction of an additive, prime-order
group <tt>Group</tt> for performing all mathematical operations. In prime-order groups,
any element can generate the other elements of the group. Usually, one element
is fixed and defined as the group generator. Such groups are
uniquely determined by the choice of the prime <tt>p</tt> that defines the
order of the group. (There may, however, exist different representations
of the group for a single <tt>p</tt>. <xref target="ciphersuites"/> lists specific groups which
indicate both order and representation.)</t>
        <t>The fundamental group operation is addition <tt>+</tt> with identity element
<tt>I</tt>. For any elements <tt>A</tt> and <tt>B</tt> of the group, <tt>A + B = B + A</tt> is
also a member of the group. Also, for any <tt>A</tt> in the group, there exists an element
<tt>-A</tt> such that <tt>A + (-A) = (-A) + A = I</tt>. Scalar multiplication is
equivalent to the repeated application of the group operation on an
element A with itself <tt>r-1</tt> times, this is denoted as <tt>r*A = A + ... + A</tt>.
For any element <tt>A</tt>, <tt>p*A=I</tt>. The case when the scalar multiplication is
performed on the group generator is denoted as <tt>ScalarMultGen(r)</tt>.
Given two elements A and B, the discrete logarithm problem is to find
an integer k such that B = k*A. Thus, k is the discrete logarithm of
B with respect to the base A.
The set of scalars corresponds to <tt>GF(p)</tt>, a prime field of order p, and are
represented as the set of integers defined by <tt>{0, 1, ..., p-1}</tt>.
This document uses types
<tt>Element</tt> and <tt>Scalar</tt> to denote elements of the group and its set of
scalars, respectively.</t>
        <t>We now detail a number of member functions that can be invoked on a
prime-order group.</t>
        <ul spacing="normal">
          <li>Order(): Outputs the order of the group (i.e. <tt>p</tt>).</li>
          <li>Identity(): Outputs the identity element of the group (i.e. <tt>I</tt>).</li>
          <li>Generator(): Outputs the generator element of the group.</li>
          <li>HashToGroup(x): 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): Returns the inverse of input Scalar <tt>s</tt> on <tt>GF(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> bytes.</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 raise a DeserializeError if the
input is not a valid byte representation of an element.
See <xref target="input-validation"/> for further requirements on 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> bytes.</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 raise a DeserializeError if the input
is not a valid byte representation of a scalar.
See <xref target="input-validation"/> for further requirements on 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 Logarithm Equivalence Proofs</name>
        <t>A proof of knowledge allows a prover to convince a verifier that some
statement is true. If the prover can generate a proof without interaction
with the verifier, the proof is noninteractive. If the verifier learns
nothing other than whether the statement claimed by the prover is true or
false, the proof is zero-knowledge.</t>
        <t>This section describes a noninteractive zero-knowledge proof for discrete
logarithm equivalence (DLEQ). A DLEQ proof demonstrates that two pairs of
group elements have the same discrete logarithm without revealing the
discrete logarithm.</t>
        <t>The DLEQ proof resembles the Chaum-Pedersen <xref target="ChaumPedersen"/> proof, which
is shown to be zero-knowledge by Jarecki, et al. <xref target="JKK14"/> and is
noninteractive after applying the Fiat-Shamir transform <xref target="FS00"/>.
Furthermore, Davidson, et al. <xref target="DGSTV18"/> showed a proof system for
batching DLEQ proofs that has constant-size proofs with respect to the
number of inputs.
The specific DLEQ proof system presented below follows this latter
construction with two modifications: (1) the transcript used to generate
the seed includes more context information, and (2) the individual challenges
for each element in the proof is derived from a seed-prefixed hash-to-scalar
invocation rather than being sampled from a seeded PRNG.
The description is split into
two sub-sections: one for generating the proof, which is done by servers
in the verifiable protocols, and another for verifying the proof, which is
done by clients in the protocol.</t>
        <section anchor="proof-generation">
          <name>Proof Generation</name>
          <t>Generating a proof is done with the <tt>GenerateProof</tt> function, defined below.
Given elements A and B, two non-empty lists of elements C and D of length
<tt>m</tt>, and a scalar k; this function produces a proof that <tt>k*A == B</tt>
and <tt>k*C[i] == D[i]</tt> for each <tt>i</tt> in <tt>[0, ..., m - 1]</tt>.
The output is a value of type Proof, which is a tuple of two Scalar
values.</t>
          <t><tt>GenerateProof</tt> accepts lists of inputs to amortize the cost of proof
generation. Applications can take advantage of this functionality to
produce a single, constant-sized proof for <tt>m</tt> DLEQ inputs, rather
than <tt>m</tt> proofs for <tt>m</tt> DLEQ inputs.</t>
          <artwork><![CDATA[
Input:

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

Output:

  Proof proof

Parameters:

  Group G

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

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

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

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

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

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

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

Output:

  Element M
  Element Z

Parameters:

  Group G
  PublicInput contextString

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

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

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

  Z = k * M

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

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

Output:

  boolean verified

Parameters:

  Group G

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

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

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

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

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

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

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

Output:

  Element M
  Element Z

Parameters:

  Group G
  PublicInput contextString

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

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

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

  return (M, Z)
]]></artwork>
          <t>When used in the protocol described in <xref target="protocol"/>, the parameter <tt>contextString</tt> is
as defined in <xref target="offline"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="protocol">
      <name>Protocol</name>
      <t>In this section, we define three protocol variants referred as the OPRF, VOPRF,
and POPRF modes with the following properties.</t>
      <t>In the OPRF mode, a client and server interact to compute <tt>output = F(skS, input)</tt>,
where <tt>input</tt> is the client's private input, <tt>skS</tt> is the server's private key,
and <tt>output</tt> is the OPRF output. After the execution of the protocol, the
client learns <tt>output</tt> and the server learns nothing.
This interaction is shown below.</t>
      <figure anchor="fig-oprf">
        <name>OPRF protocol overview</name>
        <artwork><![CDATA[
    Client                                                Server(skS)
  -------------------------------------------------------------------
  blind, blindedElement = Blind(input)

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

                evaluatedElement = BlindEvaluate(skS, blindedElement)

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

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

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

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

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

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

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

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

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

  output = Finalize(input, blind, evaluatedElement,
                    blindedElement, proof, info, tweakedKey)
]]></artwork>
      </figure>
      <t>Each protocol consists of an offline setup phase and an online phase,
described in <xref target="offline"/> and <xref target="online"/>, respectively. Configuration details
for the offline phase are described in <xref target="configuration"/>.</t>
      <section anchor="configuration">
        <name>Configuration</name>
        <t>Each of the three protocol variants are identified with a one-byte value (in hexadecimal):</t>
        <table anchor="tab-modes">
          <name>Identifiers for OPRF modes</name>
          <thead>
            <tr>
              <th align="left">Mode</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">modeOPRF</td>
              <td align="left">0x00</td>
            </tr>
            <tr>
              <td align="left">modeVOPRF</td>
              <td align="left">0x01</td>
            </tr>
            <tr>
              <td align="left">modePOPRF</td>
              <td align="left">0x02</td>
            </tr>
          </tbody>
        </table>
        <t>Additionally, each protocol variant is instantiated with a ciphersuite,
or suite. Each ciphersuite is identified with a two-byte value, referred
to as <tt>suiteID</tt>; see <xref target="ciphersuites"/> for the registry of initial values.</t>
        <t>The mode and ciphersuite ID values are combined to create a "context string"
used throughout the protocol with the following function:</t>
        <artwork><![CDATA[
def CreateContextString(mode, suiteID):
  return "VOPRF10-" || I2OSP(mode, 1) || I2OSP(suiteID, 2)
]]></artwork>
        <t>[[RFC editor: please change "VOPRF10" to "RFCXXXX", where XXXX is the final number, here and elsewhere before publication.]]</t>
      </section>
      <section anchor="offline">
        <name>Key Generation and Context Setup</name>
        <t>In the offline setup phase, the server key pair (<tt>skS</tt>, <tt>pkS</tt>) is generated
using the following function, which accepts a randomly generated seed of length
<tt>Ns</tt> bytes and an optional (and possible empty) public <tt>info</tt> string. The
constant <tt>Ns</tt> corresponds to the size in bytes of a serialized Scalar and is
defined in <xref target="pog"/>.</t>
        <artwork><![CDATA[
Input:

  opaque seed[Ns]
  PublicInput info

Output:

  Scalar skS
  Element pkS

Parameters:

  Group G
  PublicInput contextString

Errors: DeriveKeyPairError

def DeriveKeyPair(seed, info):
  deriveInput = seed || I2OSP(len(info), 2) || info
  counter = 0
  skS = 0
  while skS == 0:
    if counter > 255:
      raise DeriveKeyPairError
    skS = G.HashToScalar(deriveInput || I2OSP(counter, 1),
                          DST = "DeriveKeyPair" || contextString)
    counter = counter + 1
  pkS = G.ScalarMultGen(skS)
  return skS, pkS
]]></artwork>
        <t>Also during the offline setup phase, both the client and server create a
context used for executing the online phase of the protocol after agreeing on a
mode and ciphersuite value <tt>suiteID</tt>. The context, such as <tt>OPRFServerContext</tt>,
is an implementation-specific data structure that stores a context string and
the relevant key material for each party.</t>
        <t>The OPRF variant server and client contexts are created as follows:</t>
        <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. Elements and scalars are serialized to byte arrays, and values
of type Proof are serialized as the concatenation of two serialized scalars.
Deserializing these values can fail, in which case the application MUST abort
the protocol 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 after deserializing
Element values; 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()
  inputElement = G.HashToGroup(input)
  if inputElement == G.Identity():
    raise InvalidInputError
  blindedElement = blind * inputElement

  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>BlindEvaluate</tt> function described
below.</t>
          <artwork><![CDATA[
Input:

  Scalar skS
  Element blindedElement

Output:

  Element evaluatedElement

def BlindEvaluate(skS, blindedElement):
  evaluatedElement = skS * blindedElement
  return evaluatedElement
]]></artwork>
          <t>Servers send the output <tt>evaluatedElement</tt> to clients for processing.
Recall that servers may process multiple client inputs by applying the
<tt>BlindEvaluate</tt> function to each <tt>blindedElement</tt> received, and returning an
array with the corresponding <tt>evaluatedElement</tt> values.</t>
          <t>Upon receipt of <tt>evaluatedElement</tt>, clients process it to complete the
OPRF evaluation with the <tt>Finalize</tt> function described below.</t>
          <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>
          <t>Servers can compute the PRF result using a given input using the following
<tt>Evaluate</tt> function.</t>
          <artwork><![CDATA[
Input:

  Scalar skS
  PrivateInput input

Output:

  opaque output[Nh]

Parameters:

  Group G

Errors: InvalidInputError

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

  hashInput = I2OSP(len(input), 2) || input ||
              I2OSP(len(issuedElement), 2) || issuedElement ||
              "Finalize"
  return Hash(hashInput)
]]></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>BlindEvaluate</tt> function.</t>
          <artwork><![CDATA[
Input:

  Scalar skS
  Element pkS
  Element blindedElement

Output:

  Element evaluatedElement
  Proof proof

Parameters:

  Group G

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

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

Output:

  opaque output[Nh]

Parameters:

  Group G

Errors: VerifyError

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

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

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

  PrivateInput input
  PublicInput info
  Element pkS

Output:

  Scalar blind
  Element blindedElement
  Element tweakedKey

Parameters:

  Group G

Errors: InvalidInputError

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

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

  blindedElement = blind * inputElement

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

  Scalar skS
  Element blindedElement
  PublicInput info

Output:

  Element evaluatedElement
  Proof proof

Parameters:

  Group G

Errors: InverseError

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

  evaluatedElement = G.ScalarInverse(t) * blindedElement

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

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

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

Output:

  opaque output[Nh]

Parameters:

  Group G

Errors: VerifyError

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

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

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

  Scalar skS
  PrivateInput input
  PublicInput info

Output:

  opaque output[Nh]

Parameters:

  Group G

Errors: InvalidInputError, InverseError

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

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

  hashInput = I2OSP(len(input), 2) || input ||
              I2OSP(len(info), 2) || info ||
              I2OSP(len(issuedElement), 2) || issuedElement ||
              "Finalize"
  return Hash(hashInput)
]]></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 the
generator element defined in the corresponding reference for each group. Each
group also specifies HashToGroup, HashToScalar, and serialization
functionalities. For
HashToGroup, the domain separation tag (DST) is constructed in accordance
with the recommendations in <xref 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>Group.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>Group.Order()</tt>
and in little-endian order.</li>
              </ul>
            </li>
            <li>Hash: SHA-512, and Nh = 64 bytes.</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>Group.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>Group.Order()</tt>
and in little-endian order.</li>
              </ul>
            </li>
            <li>Hash: SHAKE-256, and Nh = 64 bytes.</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>Group.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>Group.Order()</tt> and
in big-endian order.</li>
              </ul>
            </li>
            <li>Hash: SHA-256, and Nh = 32 bytes.</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>Group.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>Group.Order()</tt> and
in big-endian order.</li>
              </ul>
            </li>
            <li>Hash: SHA-384, and Nh = 48 bytes.</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>Group.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>Group.Order()</tt> and
in big-endian order.</li>
              </ul>
            </li>
            <li>Hash: SHA-512, and Nh = 64 bytes.</li>
            <li>ID: 0x0005</li>
          </ul>
        </section>
      </section>
      <section anchor="input-validation">
        <name>Input Validation</name>
        <t>Since messages are serialized before transmission between client and server,
deserialization is followed by input validation to prevent malformed or
invalid inputs from being used in the protocol.
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 input validation
of elements and scalars is implemented for all prime-order groups included
in the above ciphersuite list.</t>
        <section anchor="element-validation">
          <name>Element Validation</name>
          <t>Recovering a group element from an arbitrary byte array must validate 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, it is required to perform 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 identity.
If these checks fail, validation returns an InputValidationError.</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
or if the decoded element is the identity, validation returns an
InputValidationError.</t>
        </section>
        <section anchor="scalar-validation">
          <name>Scalar 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>Group.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>Group.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>In <xref target="online"/>, the interface of the protocol functions allows that some inputs
(and outputs) to be group elements and scalars. However, implementations can
instead operate over group elements and scalars internally, and only expose
interfaces that operate with an application-specific format of messages.</t>
      </section>
      <section anchor="errors">
        <name>Error Considerations</name>
        <t>Some OPRF variants specified in this document have fallible operations. For example, <tt>Finalize</tt>
and <tt>BlindEvaluate</tt> can fail if any element received from the peer fails input validation.
The explicit errors generated throughout this specification, along with the
conditions that lead to each error, are as follows:</t>
        <ul spacing="normal">
          <li>
            <tt>VerifyError</tt>: Verifiable OPRF proof verification failed; <xref target="voprf"/> and <xref target="poprf"/>.</li>
          <li>
            <tt>DeserializeError</tt>: Group Element or Scalar deserialization failure; <xref target="pog"/> and <xref target="online"/>.</li>
          <li>
            <tt>InputValidationError</tt>: Validation of byte array inputs failed; <xref target="input-validation"/>.</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 VOPRF variants since it
admits an additional public input, but the same security considerations apply.</t>
      <section anchor="properties">
        <name>Security Properties</name>
        <t>The security properties of an OPRF protocol with functionality y = F(k, x)
include those of a standard PRF. Specifically:</t>
        <ul spacing="normal">
          <li>Pseudorandomness: For a random sampling of k, F is pseudorandom if the output
y = F(k, x) on any input x is indistinguishable from uniformly sampling any
element in F's range.</li>
        </ul>
        <t>In other words, consider an adversary that picks inputs x from the
domain of F and evaluates F on (k, x) (without knowledge of randomly
sampled k). Then the output distribution F(k, x) is indistinguishable
from the output distribution of a randomly chosen function with the same
domain and range.</t>
        <t>A consequence of showing that a function is pseudorandom, is that it is
necessarily non-malleable (i.e. we cannot compute a new evaluation of F
from an existing evaluation). A genuinely random function will be
non-malleable with high probability, and so a pseudorandom function must
be non-malleable to maintain indistinguishability.</t>
        <ul spacing="normal">
          <li>Unconditional input secrecy: The server does not learn anything about
the client input x, even with unbounded computation.</li>
        </ul>
        <t>In other words, an attacker with infinite computing power cannot recover any
information about the client's private input x from an invocation of the
protocol.</t>
        <t>Essentially, input secrecy is the property that, even if the server learns
the client's private input x at some point in the future, the server cannot
link any particular PRF evaluation to x. This property is
also known as unlinkability <xref target="DGSTV18"/>.</t>
        <t>For the VOPRF and POPRF protocol variants, there is an additional
security property:</t>
        <ul spacing="normal">
          <li>Verifiable: The client must only complete execution of the protocol if
it can successfully assert that the output it computes is
correct. This is taken with respect to the private key held by the
server.</li>
        </ul>
        <t>Any VOPRF or POPRF that satisfies the 'verifiable' security property is known
as 'verifiable'. In practice, the notion of verifiability requires that
the server commits to the key before the actual protocol execution takes
place. Then the client verifies that the server has used the key in the
protocol using this commitment. In the following, we may also refer to this
commitment as a public key.</t>
        <t>Finally, the POPRF variant also has the following security property:</t>
        <ul spacing="normal">
          <li>Partial obliviousness: The client and server must be able to perform the
PRF on client's private input and public input. The server must learn nothing
about the client's private input or the output of the function. In addition,
the client must learn nothing about the server's private key.</li>
        </ul>
        <t>This property becomes useful when dealing with key management operations such as
the rotation of server's keys.</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 DLEQ proof object. This is enabled using
an established batching technique <xref target="DGSTV18"/>.</t>
          <t>The pseudorandomness and input secrecy (and verifiability) of the OPRF (and
VOPRF) variant is based on an assumption with oracle access to the
Computational Diffie Hellman (CDH) assumption, known as the One-More Gap CDH,
that 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
(as in <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 DLEQ proof object.
This is enabled using an established batching technique <xref target="DGSTV18"/>.</t>
          <t>Pseudorandomness, input secrecy, verifiability, and partial obliviousness of the POPRF variant is
based on the assumption that the One-More Gap Strong Diffie-Hellman Inversion (SDHI)
assumption from <xref target="TCRSTW21"/> is computationally difficult to solve in the corresponding
prime-order group. Tyagi et al. <xref target="TCRSTW21"/> show that both the One-More Gap 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>BlindEvaluate</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>BlindEvaluate</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>BlindEvaluate</tt> or by
rotating private keys. In applications where such an oracle is not made available
this security loss does not apply.</t>
          <t>In most cases, it would require an informed and persistent attacker to
launch a highly expensive attack to reduce security to anything much
below 100 bits of security. Applications that admit the aforementioned
oracle functionality, and that cannot tolerate discrete logarithm security
of lower than 128 bits, are RECOMMENDED to choose groups that target a
higher security level, such as decaf448 (used by ciphersuite 0x0002),
P-384 (used by 0x0004), or P-521 (used by 0x0005).</t>
        </section>
      </section>
      <section anchor="domain-separation">
        <name>Domain Separation</name>
        <t>Applications SHOULD construct input to the protocol to provide domain
separation. Any system which has multiple OPRF applications should
distinguish client inputs to ensure the OPRF results are separate.
Guidance for constructing info can be found in <xref section="3.1" sectionFormat="comma" target="I-D.irtf-cfrg-hash-to-curve"/>.</t>
      </section>
      <section anchor="timing-leaks">
        <name>Timing Leaks</name>
        <t>To ensure no information is leaked during protocol execution, all
operations that use secret data MUST run in constant time. This includes
all prime-order group operations and proof-specific operations that
operate on secret data, including <tt>GenerateProof</tt> and <tt>BlindEvaluate</tt>.</t>
      </section>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This document resulted from the work of the Privacy Pass team
<xref target="PrivacyPass"/>. The authors would also like to acknowledge helpful
conversations with Hugo Krawczyk. Eli-Shaoul Khedouri provided
additional review and comments on key consistency. Daniel Bourdrez,
Tatiana Bradley, Sofia Celi, Frank Denis, 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, Inc.</organization>
            </author>
            <date day="6" month="July" year="2022"/>
            <abstract>
              <t>   This document describes the OPAQUE protocol, a secure asymmetric
   password-authenticated key exchange (aPAKE) that supports mutual
   authentication in a client-server setting without reliance on PKI and
   with security against pre-computation attacks upon server compromise.
   In addition, the protocol provides forward secrecy and the ability to
   hide the password from the server, even during password registration.
   This document specifies the core OPAQUE protocol and one
   instantiation based on 3DH.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-09"/>
        </reference>
        <reference anchor="I-D.ietf-privacypass-protocol">
          <front>
            <title>Privacy Pass Issuance Protocol</title>
            <author fullname="Sofía Celi">
              <organization>Brave Software</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="6" month="July" year="2022"/>
            <abstract>
              <t>   This document specifies two variants of the the two-message issuance
   protocol for Privacy Pass tokens: one that produces tokens that are
   privately verifiable, and another that produces tokens that are
   publicly verifiable.  The privately verifiable issuance protocol
   optionally supports public metadata during the issuance flow.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-protocol-06"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty">
              <organization/>
            </author>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski">
              <organization/>
            </author>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson">
              <organization/>
            </author>
            <author fullname="A. Rusch" initials="A." surname="Rusch">
              <organization/>
            </author>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
              <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series.  By publishing this RFC, change control is transferred to the IETF.</t>
              <t>This document also obsoletes RFC 3447.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8017"/>
          <seriesInfo name="DOI" value="10.17487/RFC8017"/>
        </reference>
        <reference anchor="I-D.irtf-cfrg-hash-to-curve">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="Armando Faz-Hernandez">
              <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="15" month="June" year="2022"/>
            <abstract>
              <t>   This document specifies a number of algorithms for encoding or
   hashing an arbitrary string to a point on an elliptic curve.  This
   document is a product of the Crypto Forum Research Group (CFRG) in
   the IRTF.

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-ristretto255-decaf448-03"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC7748">
          <front>
            <title>Elliptic Curves for Security</title>
            <author fullname="A. Langley" initials="A." surname="Langley">
              <organization/>
            </author>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg">
              <organization/>
            </author>
            <author fullname="S. Turner" initials="S." surname="Turner">
              <organization/>
            </author>
            <date month="January" year="2016"/>
            <abstract>
              <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS).  These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7748"/>
          <seriesInfo name="DOI" value="10.17487/RFC7748"/>
        </reference>
        <reference anchor="PrivacyPass" target="https://github.com/privacypass/team">
          <front>
            <title>Privacy Pass</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="BG04" target="https://eprint.iacr.org/2004/306">
          <front>
            <title>The Static Diffie-Hellman Problem</title>
            <author initials="D." surname="Brown">
              <organization>Certicom Research</organization>
            </author>
            <author initials="R." surname="Gallant">
              <organization>Certicom Research</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="ChaumPedersen">
          <front>
            <title>Wallet Databases with Observers</title>
            <author fullname="David Chaum" initials="D." surname="Chaum">
              <organization/>
            </author>
            <author fullname="Torben Pryds Pedersen" initials="T." surname="Pedersen">
              <organization/>
            </author>
            <date month="August" year="2007"/>
          </front>
          <seriesInfo name="Advances in Cryptology - CRYPTO' 92" value="pp. 89-105"/>
          <seriesInfo name="DOI" value="10.1007/3-540-48071-4_7"/>
        </reference>
        <reference anchor="Cheon06">
          <front>
            <title>Security Analysis of the Strong Diffie-Hellman Problem</title>
            <author fullname="Jung Hee Cheon" initials="J." surname="Cheon">
              <organization/>
            </author>
            <date year="2006"/>
          </front>
          <seriesInfo name="Advances in Cryptology - EUROCRYPT 2006" value="pp. 1-11"/>
          <seriesInfo name="DOI" value="10.1007/11761679_1"/>
        </reference>
        <reference anchor="FS00">
          <front>
            <title>How To Prove Yourself: Practical Solutions to Identification and Signature Problems</title>
            <author fullname="Amos Fiat" initials="A." surname="Fiat">
              <organization/>
            </author>
            <author fullname="Adi Shamir" initials="A." surname="Shamir">
              <organization/>
            </author>
            <date month="April" year="2007"/>
          </front>
          <seriesInfo name="Advances in Cryptology - CRYPTO' 86" value="pp. 186-194"/>
          <seriesInfo name="DOI" value="10.1007/3-540-47721-7_12"/>
        </reference>
        <reference anchor="JKKX16">
          <front>
            <title>Highly-Efficient and Composable Password-Protected Secret Sharing (Or: How to Protect Your Bitcoin Wallet Online)</title>
            <author fullname="Stanislaw Jarecki" initials="S." surname="Jarecki">
              <organization/>
            </author>
            <author fullname="Aggelos Kiayias" initials="A." surname="Kiayias">
              <organization/>
            </author>
            <author fullname="Hugo Krawczyk" initials="H." surname="Krawczyk">
              <organization/>
            </author>
            <author fullname="Jiayu Xu" initials="J." surname="Xu">
              <organization/>
            </author>
            <date month="March" year="2016"/>
          </front>
          <seriesInfo name="2016 IEEE European Symposium on Security and Privacy" value="(EuroS&amp;P)"/>
          <seriesInfo name="DOI" value="10.1109/eurosp.2016.30"/>
        </reference>
        <reference anchor="JKK14">
          <front>
            <title>Round-Optimal Password-Protected Secret Sharing and T-PAKE in the Password-Only Model</title>
            <author fullname="Stanislaw Jarecki" initials="S." surname="Jarecki">
              <organization/>
            </author>
            <author fullname="Aggelos Kiayias" initials="A." surname="Kiayias">
              <organization/>
            </author>
            <author fullname="Hugo Krawczyk" initials="H." surname="Krawczyk">
              <organization/>
            </author>
            <date year="2014"/>
          </front>
          <seriesInfo name="Lecture Notes in Computer Science" value="pp. 233-253"/>
          <seriesInfo name="DOI" value="10.1007/978-3-662-45608-8_13"/>
        </reference>
        <reference anchor="SJKS17" target="https://doi.org/10.1109/ICDCS.2017.64">
          <front>
            <title>SPHINX: A Password Store that Perfectly Hides Passwords from Itself</title>
            <author initials="M." surname="Shirvanian" fullname="Maliheh Shirvanian">
              <organization/>
            </author>
            <author initials="S." surname="Jarecki" fullname="Stanislaw Jarecki">
              <organization/>
            </author>
            <author initials="H." surname="Krawczyk" fullname="Hugo Krawczyk">
              <organization/>
            </author>
            <author initials="N." surname="Saxena" fullname="Nitesh Saxena">
              <organization/>
            </author>
            <date year="2017" month="June"/>
          </front>
          <seriesInfo name="In" value="2017 IEEE 37th International Conference on Distributed Computing Systems (ICDCS)"/>
          <seriesInfo name="DOI" value="10.1109/ICDCS.2017.64"/>
        </reference>
        <reference anchor="TCRSTW21">
          <front>
            <title>A Fast and Simple Partially Oblivious PRF, with Applications</title>
            <author fullname="Nirvan Tyagi" initials="N." surname="Tyagi">
              <organization/>
            </author>
            <author fullname="Sofía Celi" initials="S." surname="Celi">
              <organization/>
            </author>
            <author fullname="Thomas Ristenpart" initials="T." surname="Ristenpart">
              <organization/>
            </author>
            <author fullname="Nick Sullivan" initials="N." surname="Sullivan">
              <organization/>
            </author>
            <author fullname="Stefano Tessaro" initials="S." surname="Tessaro">
              <organization/>
            </author>
            <author fullname="Christopher A. Wood" initials="C." surname="Wood">
              <organization/>
            </author>
            <date year="2022"/>
          </front>
          <seriesInfo name="Advances in Cryptology - EUROCRYPT 2022" value="pp. 674-705"/>
          <seriesInfo name="DOI" value="10.1007/978-3-031-07085-3_23"/>
        </reference>
        <reference anchor="DGSTV18">
          <front>
            <title>Privacy Pass: Bypassing Internet Challenges Anonymously</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>Royal Holloway, University of London (work completed during an internship at Cloudflare), London , UK</organization>
            </author>
            <author fullname="Ian Goldberg" initials="I." surname="Goldberg">
              <organization>University of Waterloo, Waterloo , Belgium</organization>
            </author>
            <author fullname="Nick Sullivan" initials="N." surname="Sullivan">
              <organization>Cloudflare, San Francisco, California , USA</organization>
            </author>
            <author fullname="George Tankersley" initials="G." surname="Tankersley">
              <organization/>
            </author>
            <author fullname="Filippo Valsorda" initials="F." surname="Valsorda">
              <organization/>
            </author>
            <date month="April" year="2018"/>
          </front>
          <seriesInfo name="Proceedings on Privacy Enhancing Technologies" value="vol. 2018, no. 3, pp. 164-180"/>
          <seriesInfo name="DOI" value="10.1515/popets-2018-0026"/>
        </reference>
        <reference anchor="SEC1" target="https://www.secg.org/sec1-v2.pdf">
          <front>
            <title>SEC 1: Elliptic Curve Cryptography</title>
            <author initials="" surname="Standards for Efficient Cryptography Group (SECG)">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="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 fields of each test vector are described below.</t>
      <ul spacing="normal">
        <li>"Input": The private client input, an opaque byte string.</li>
        <li>"Info": The public info, an opaque byte string. Only present for POPRF test
 vectors.</li>
        <li>"Blind": The blind value output by <tt>Blind()</tt>, a serialized <tt>Scalar</tt>
of <tt>Ns</tt> bytes long.</li>
        <li>"BlindedElement": The blinded value output by <tt>Blind()</tt>, a serialized
<tt>Element</tt> of <tt>Ne</tt> bytes long.</li>
        <li>"EvaluatedElement": The evaluated element output by <tt>BlindEvaluate()</tt>,
a serialized <tt>Element</tt> of <tt>Ne</tt> bytes long.</li>
        <li>"Proof": The serialized <tt>Proof</tt> output from <tt>GenerateProof()</tt> composed of
two serialized <tt>Scalar</tt> values each of <tt>Ns</tt> bytes long. Only present for
VOPRF and POPRF test vectors.</li>
        <li>"ProofRandomScalar": The random scalar <tt>r</tt> computed in <tt>GenerateProof()</tt>, a
serialized <tt>Scalar</tt> of <tt>Ns</tt> bytes long. Only present for VOPRF and POPRF
test vectors.</li>
        <li>"Output": The protocol output, an opaque byte string of length <tt>Nh</tt> bytes.</li>
      </ul>
      <t>Test vectors with batch size B &gt; 1 have inputs separated by a comma
",". Applicable test vectors will have B different values for the
"Input", "Blind", "BlindedElement", "EvaluationElement", and
"Output" fields.</t>
      <t>The server key material, <tt>pkSm</tt> and <tt>skSm</tt>, are listed under the mode for
each ciphersuite. Both <tt>pkSm</tt> and <tt>skSm</tt> are the serialized values of
<tt>pkS</tt> and <tt>skS</tt>, respectively, as used in the protocol. Each key pair
is derived from a seed <tt>Seed</tt> and info string <tt>KeyInfo</tt>, which are
listed as well, using the <tt>DeriveKeyPair</tt> function from <xref target="offline"/>.</t>
      <section anchor="oprfristretto255-sha-512-1">
        <name>OPRF(ristretto255, SHA-512)</name>
        <section anchor="oprf-mode">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = e617ae6f2d10de61e16cab73023c5a2df74335d13f89470957214664468d2
e0b
]]></artwork>
          <section anchor="test-vector-1-batch-size-1">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = c83d0d8a3e80be2ced8bf35c5f3e24d42260ca8fa9a0403ca83
033588c26614d
EvaluationElement = b29ca44d6dfafc77a50b72abc53cfb7abcbe9cf6714afc76
893ee8dcaf053b59
Output = 8a19c9b8f4459d541ebbfff4e29f36620e44e825a27b0f2e3a3c0d8e963
588ee04348312dc8b43a48c41d4e7d904f95c91813a6b4f624392433f0568409da62
8
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = 8673ffd2f26b2579922fc485c77e106def00982e0abb233b4c6
e54841d43ba29
EvaluationElement = 68ed7037846f48a1b4073a0d110f6e4de8f53ab845365c0f
3d7f1b67caa39126
Output = bcdbd421c0863495d63d81a868858f34f5215437c5777072a92703f36b3
6c4a2d3e7e54a5762e70b06223527c211e2d4364481270f72971a2db8b7ab8fad84e
e
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = a3b8dea4a99be2469da7f7d2d93fe5f2867317d6705350475d47739c7214d
a07
pkSm = c00fbee6832a8e5d6cc1d1a23315daf6a6018f19e29ba37b05499259da854
b48
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-1">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = 6cce2c7913f4c8c0ac44ec149a1544b0e711e1630753d4efc7c
5fe36a4d50638
EvaluationElement = 826f2f3e553a039bcd69c9df6cb166e7943fd207089ae704
1f6041322ce7033a
Proof = 2e541a6962e783d2f42d5f4fb1364e51c368e95e83a962614714e9dfe21a
720cd8c8eb8106131b4a758b5a0987d3870adb348f5eae7b4a2bc26735928cc4b90c
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = 4d5dd83db5bfd850e3e0c17519f1013aab904e7b131dc1ded31f7a76aac
f040f6b344b0e635cf6df30771a35157e0e3d9539f7a891b48cd8521692b15c51538
d
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-1">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = 6a4e632b76a2cfcb0295ee74098a15a3e858f6006fd9fa8576a
5813e051ac134
EvaluationElement = 2cb879d933a1af46c77e89f3f39a38f80347bf4716da3dc3
07c8aa1282179823
Proof = eabae3489c46b9e9a8da0cc921d2bc2960ef5fb0b38c8f067cc5c21f62f4
eb0ff5472009aec126f543b6051b5d62ccbf2625aab6684076c26cfdf0904257090c
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = 5c3fe06ef39905710a124df0727c6c938f48234b35ccc4548c0736d7f6f
36e6b7333a9aefc93d6b1ee20151a40bce453866b62cf5d41799982fee6100680915
9
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706,222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d9881aa6f61d645fc0
e
BlindedElement = 6cce2c7913f4c8c0ac44ec149a1544b0e711e1630753d4efc7c
5fe36a4d50638,aa9908e4c40b7fe5f091cf0f7fb8ec75ffdaaf2d19512b7b9939f0
ffaaa0654f
EvaluationElement = 826f2f3e553a039bcd69c9df6cb166e7943fd207089ae704
1f6041322ce7033a,902ef95488cc3c47fe569bc96c922a4ae3f9ebd8ccbc71bfefa
5f1e7da9ab953
Proof = d9bfee92cd7496cdf469947b534549ceb79ebd7b5695d20437b3e14758cf
de0998eaa13a480cc35b562cbfb1412b1677650cd901b5fb4d6805581a95b440320f
ProofRandomScalar = 419c4f4f5052c53c45f3da494d2b67b220d02118e0857cdb
cf037f9ea84bbe0c
Output = 4d5dd83db5bfd850e3e0c17519f1013aab904e7b131dc1ded31f7a76aac
f040f6b344b0e635cf6df30771a35157e0e3d9539f7a891b48cd8521692b15c51538
d,5c3fe06ef39905710a124df0727c6c938f48234b35ccc4548c0736d7f6f36e6b73
33a9aefc93d6b1ee20151a40bce453866b62cf5d41799982fee61006809159
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 024eaeb72e5b3729d7f19d90aa44e3d2f4c445fb29011ffd755655636f2b1
00a
pkSm = e001954ccd18ec5aa89bcbf26c03d84dc4d9c9b973d9f06b1e0ceb7b79f41
d65
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-2">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = 009ffa1ffc529e4f1d3d8de1c06d22fbb15e39920a72ad4efed
6c39af9438a2d
EvaluationElement = aa9af25bf4edead5e2e0a4b8f93db9b497017f93cf68c750
45f02172bfc5d304
Proof = bb893ccce54685a871185bb056cb5e0594d09d3b53f2f879de06a650b8ae
ff08371f2ff9f3d5cac7f393cc37b2c71c2a6fbb80f35fe36b8e5cbddf11469c8e03
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = e7ed59e3f808c369598961ebfd9af74272894e0904d1c11653a21b08204
dba1a5fb5c3dd6be6c419190a84b576d91eb3d8d920d450fee0427fd24524950d72d
6
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-2">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = 5e009e08e228f95ee3703cff60a1d54225bb282bdb6d7dc9a78
e287f8418315a
EvaluationElement = 2e528236481eb6d87b07ef5f8c17910323d04b3bf0cb2f2d
23d5a7ad9f069b22
Proof = 3796381ab287189839288bbaffc971eb87c3a28226fa99dc83b363adb2f4
b20e4ae81fb675ebcd43d13918f71846cb488d0ce7d473bfca68450a5a5472564500
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = 9a0d8c55e2fef4bada9fb5877a0e739496e539a0d835722911dab9ec112
397e763a605acbc072619e8b8acefb8ee704a357556edc802648089d684baa763ce1
4
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-1">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706,222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d9881aa6f61d645fc0
e
BlindedElement = 009ffa1ffc529e4f1d3d8de1c06d22fbb15e39920a72ad4efed
6c39af9438a2d,1ee64b9e5148987ca6647ccddc11ef506231e986d5ce08ef9b8230
871f840b3a
EvaluationElement = aa9af25bf4edead5e2e0a4b8f93db9b497017f93cf68c750
45f02172bfc5d304,3073794fd68f64432b4d1f24752c4398f0e81e00b5b5842e463
5dd381331091b
Proof = 7d59db67715a9030d46ab50a614fb55927961c8d9322cb6973ef36775309
810b9f4a670ba4b9321f5cf753be2a58dee0730cfabd12b8f25a8a342e158ae2b608
ProofRandomScalar = 419c4f4f5052c53c45f3da494d2b67b220d02118e0857cdb
cf037f9ea84bbe0c
Output = e7ed59e3f808c369598961ebfd9af74272894e0904d1c11653a21b08204
dba1a5fb5c3dd6be6c419190a84b576d91eb3d8d920d450fee0427fd24524950d72d
6,9a0d8c55e2fef4bada9fb5877a0e739496e539a0d835722911dab9ec112397e763
a605acbc072619e8b8acefb8ee704a357556edc802648089d684baa763ce14
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="oprfdecaf448-shake-256-1">
        <name>OPRF(decaf448, SHAKE-256)</name>
        <section anchor="oprf-mode-1">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = 30f71e5b5be9c91dd54c5a48e82be8d47eeb2cb2c45d7874a45dddc85af8d
3f95b1ce73a99c47edc26ac9ddd936bd9b6b73728995bf1d213
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-3">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = a4205d2af0410dccbd4464629ba1b835456d04d994cf93988cf
2c3b9d45d3c4671c7625f52c66c760a069e2c3c367826debb13da089d735c
EvaluationElement = e8d78cf5212fddf940f9f6fe02250ed83cc0595e3f0e7481
1cdb9f62c0fa7fea94c45795637dc5c3ac31ee1cff18d0d675396ae09b302f76
Output = 1c1a9df7d0616e0f5fdfb6479acec73a4f5562da8f9488f3b6112ef11c6
7c5900e0abc3a169486ac7230a306c8796562a045c66305ed7cb2a3fae658e45eae4
c
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-3">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = ec5b609e5d3c0bb024c35256194694ea6e42aa24d13cf6b0597
49cb36911ccba0923cb73136acdf4bcecf23b6025f7b9b93d2eb0c09d964d
EvaluationElement = 524c3a644e381b4ae416724247f94b996f655167e0d4e1ba
d93cbc731c3beb36e3822e9dcbdc3600966226387a2306ba70eb68db5a64f92f
Output = 95f519e8ff2b54d8d596da2c54829ae3dd900f5c18eef48efa03ef6694c
505bea17b7982246c862d081b9fdcf295debc60abec8b0ddbfdf48bd302a3fe61b21
e
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-1">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = 44c46e78aa6386cee57a46c75d124b13ced3e5f055caa3baaad61501330a4
24463400453c97245a8f7b4c65f2c4c3dabd09a049c034f9e20
pkSm = 78f4233110896fd41531fce182094c3bc4cf65f97b23078476b3b68118736
617172d3735c5832081864e7c75cd3ddb449e93068b34ba863e
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-4">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = 38b758b69dfaaff8576eaaabfe70801813d95eb098f85516bcd
46a0f68d1ea8cc1dea3bc7c8d340ee77c5bbca6e7d723e51d77e0807acd0d
EvaluationElement = 7a8374bbae55dfc91e10a9d8042015419c505a6a8ac54e5b
93867747eb04252aba316d9f750fa0c54458aa8c90e963a60af5ae6f141af8d2
Proof = 2fd38cf9829c5f3fd294a5eb114356cd67cc5839cf797dc060273e07cf57
0dbabea029f0bf4675d84866865d1d146bfa38eff8195b59cf3c180bab30509061b9
d02e70f709f085dc8c98c0924259c9a3463ef5ceb97105989941155b98bd7b03b1e1
e538850139dc1a56beff1bb9401f
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = 3db64b6f803391e7c9803135457da250eb29778480c30f29d53e9ff46c3
ce5ba9555418fc28af347c18b77a990eb904d0043a3411837b6d316f749428a9a370
4
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-4">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = ea9b2d51579f5c07c5c511cf3bba888f5fc76d6ce29075a0b02
5adb3daf4b568045c28e6bd00442251597ba6264e59beaf46220d8405fff6
EvaluationElement = f6d23094a82e33e231003a1ecdd4659029d613932b767451
c607ec428315283fe0b121bf09d7c88cf2ed50910463e38383fb52e5562a87f0
Proof = 104e45c171bd7ca9119af1091e3175c8af4e9efdbd4704b3d5a8dfc99465
9842ea021da27a9c1e0fbac369627eb5e9cf9e82964b7412081f15f6bfc5c68425f6
4f1a4dae420a03d582a6cfffc0fc4da71a145bb5305ae28985e15e067d28523578ea
696205cea28cf5831abed3e40f37
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = 4dc9ec52b6aa7f1f38a320d10cb58e0d86b040f6376d2f178f42c99986f
e932aca7162cb72dd94056724617979c0f7ea652b1492bbad1d82748a38ff4daf129
8
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-2">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112,b1b748135d405ce
48c6973401d9455bb8ccd18b01d0295c0627f67661200dbf9569f73fbb3925daa043
a070e5f953d80bb464ea369e5522b
BlindedElement = 38b758b69dfaaff8576eaaabfe70801813d95eb098f85516bcd
46a0f68d1ea8cc1dea3bc7c8d340ee77c5bbca6e7d723e51d77e0807acd0d,5a788e
f7949021b22da4a4e89b2443458c96fcbec8b66b08df885eec8fb4070fefe8b50e08
5e043c368cc05a9339b5ae31eb6482efc0d933
EvaluationElement = 7a8374bbae55dfc91e10a9d8042015419c505a6a8ac54e5b
93867747eb04252aba316d9f750fa0c54458aa8c90e963a60af5ae6f141af8d2,0ac
81e0e5b9fa6d90be58a6fc3fb4fde57e0efacbe210cebc2c85a6e934114b5e0e5ba4
cc202bde7cd7708415cdcc2312a51fca6ad6f06bf
Proof = a221b134d99ba97cad98bf45341eeacd8a402a6e4c5ea5f93cee54ad0f2b
ee544f67d2859a5253cb9def403bfee9420a5224fad35e3f9a3fbb5f28f6b8abcb34
130beaa158a41d1497aacc2f073b2da5471067bb832ec8044f417f528e2e6ccb897f
992424220d608b5e7bbfd4257e1f
ProofRandomScalar = 63798726803c9451ba405f00ef3acb633ddf0c420574a2ec
6cbf28f840800e355c9fbaac10699686de2724ed22e797a00f3bd93d105a7f23
Output = 3db64b6f803391e7c9803135457da250eb29778480c30f29d53e9ff46c3
ce5ba9555418fc28af347c18b77a990eb904d0043a3411837b6d316f749428a9a370
4,4dc9ec52b6aa7f1f38a320d10cb58e0d86b040f6376d2f178f42c99986fe932aca
7162cb72dd94056724617979c0f7ea652b1492bbad1d82748a38ff4daf1298
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-1">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = fdd59cb218c7fbdcd48b18ef21ab647a6c210110c765bc3da6c11e563671a
48402c23129ce2ffd021d99da5a2d04158883c65d7f74a4901b
pkSm = 1223e0aec4ee5bc19181078be380cc745d1896e1369aed3cc8a45b40ba3f9
aa1f79e23d542d6529e17465d1954d75e336910c6417de99200
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-5">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = f86104fcefec6bdca7767bc3e6a2ac9de2b00546579fd50ff66
687df531f7a2dfa8689a6cfdf91efc32d6fff490e722990752b7bc4bda28f
EvaluationElement = 76f27e6fa79cd38638e35f5caa5d641e41526fbfd9272c19
be22dfc8cdd962e6d5d4e0c605c9bd6588eb9698a2bbf792a0827bb1116c8812
Proof = 3a1b3400ad16e1562e731c64520fa5a3664c1487ffe6537e85029842904d
3e01f9e7435b881ab9346847cc3470a2b37e6a10a4ef7bd36b2d06c602086a33252f
39c562aab5820a66c3bdf9d72583587e93ea893725be535cdeca1094d5b4dae119b4
9456162f60034a904f521f7cd818
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = 2a08f81bf204eb43a57dbc011946861ed715a2fd3d39a3b35e43c74d07d
4734149ba163389a02f6cd33fbb5b84e167d35dca7a7dc00b89418398c255c8293ac
6
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-5">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = e6f508abea28cbb0242f0dae1c0a92e017127edb7c8d8e0ec98
a5ea25c6bc9bb86bfc0bf9b8a086302e29a2a4b0a1d9d80f2d439cfba3ec1
EvaluationElement = 1ea637b039e0ab12c6959c74e275471e33655007a7fa23af
97ec578bcfc8c3381d4929ebf51433b76460d583f16b7cf1e75b9708f5d9d2f7
Proof = d53a1bfeafc5b47fc86406fba080e57434a7004a0739399ccb356f790b13
585da9d69a25c526e039fa06ad6a5781283ea7997eced063fd32e58bc95d57fd771c
ad4a7e23633ae2049eec5ad86ade6a5e98d44f78fd86b5f55ab3c7a03025d6aec1f4
f50a2bd7b9b554841f6b4cd23d14
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = 80ac73a09fbf8cbd329ff1b7f42d8d14e46ae5b732f776f3203f0680daf
265254360da0afcd9dc1d0cd3858ab21ce8e7a19f0426d7e701cfda34fb8238c9e43
4
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-3">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112,b1b748135d405ce
48c6973401d9455bb8ccd18b01d0295c0627f67661200dbf9569f73fbb3925daa043
a070e5f953d80bb464ea369e5522b
BlindedElement = f86104fcefec6bdca7767bc3e6a2ac9de2b00546579fd50ff66
687df531f7a2dfa8689a6cfdf91efc32d6fff490e722990752b7bc4bda28f,50c684
9c8f6355687bbc9d4675bcea953cb913c5447c9c8400062ae37f808ce8a75d592c56
f3393d4ea12ec72f9f84402002eb497201089a
EvaluationElement = 76f27e6fa79cd38638e35f5caa5d641e41526fbfd9272c19
be22dfc8cdd962e6d5d4e0c605c9bd6588eb9698a2bbf792a0827bb1116c8812,7ca
a4dd83ecae98fc3e282a0e7df1887393a3fc1e17935dfe355da394756fbfcad65386
eeedf1ba8498411645448c7027753cd9090198c02
Proof = b4f869bf5ec65e0152af5bd29f9fa32c3dfc00355e4e019feda07a281547
fb2f0c559c600bf6cb52a92753264d1c1367e0134b132880732ec70a8c741d60370e
5c22c4aca0e4564732b0157858f3c968bda06aab34c71386ec88afe76ec2c14bf56f
0adf7b05bab826e4aa034cc78837
ProofRandomScalar = 63798726803c9451ba405f00ef3acb633ddf0c420574a2ec
6cbf28f840800e355c9fbaac10699686de2724ed22e797a00f3bd93d105a7f23
Output = 2a08f81bf204eb43a57dbc011946861ed715a2fd3d39a3b35e43c74d07d
4734149ba163389a02f6cd33fbb5b84e167d35dca7a7dc00b89418398c255c8293ac
6,80ac73a09fbf8cbd329ff1b7f42d8d14e46ae5b732f776f3203f0680daf2652543
60da0afcd9dc1d0cd3858ab21ce8e7a19f0426d7e701cfda34fb8238c9e434
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="oprfp-256-sha-256-1">
        <name>OPRF(P-256, SHA-256)</name>
        <section anchor="oprf-mode-2">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 274d7747cf2e26352ecea6bd768c426087da3dfcd466b6841b441ada8412f
b33
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-6">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 02ff9dc7d4350ab6fe1f41299ec5fa8283b6ef37fc62682ea69
6142e13aad4ae9c
EvaluationElement = 023a5facf92477164f10cc6bf35b4d9272bfadf98dbabbe7
b7a137efa1af6546fb
Output = 488d693c0d43ab75703901fa1398907cf7dc7a90978d1c2f0def63c88e8
1b8b0
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-6">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 03b3cd723330e42975e6e18a6157ecf9455894c18a0189e3e62
4a46d705f790fcc
EvaluationElement = 03f1ea590f2cc4afd45a841285c6be4d88825a9c6c04eb55
a1ca996583dd3e2e9f
Output = dacd8400f6fae62beabead9bc27869b5109fb5d87da338ae2488712ec25
f1be9
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-2">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = b3d12edba73e40401fdc27c0094a56337feb3646d1633345af7e7142a6b15
59d
pkSm = 03f9fc787c9a4dda44a4b811a961d1fd60f87be7465b8a1b9058dc534dae7
0624c
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-7">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 02bf13d60f3e39e2018c7be9876d88b52e56c0fc2847c8550e3
cee152c51cf72ec
EvaluationElement = 0253e64b5251607348f2b46064805275a849e44db465f649
267c54bd7a774d670f
Proof = d0bff8c87ee38f2b2e9e28161fb0f3bc7e4c3bee7329276487d4fd98d4f4
74fff793a846ffcb44d48f9545e321d89e4e6bccea858089732abf10bf19a220a936
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 9df5d51a9149a86c3660396feabaf790b8c838fc96012adba5acbd913f2
a4016
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-7">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 02a13e263fd9df5aa0078f8d5d6cbe8763e5bee69ee06841a66
dad0db8701480cf
EvaluationElement = 02d9f54fcb97bdab47e6664376a75911f1c3e447f5754550
89d926fbd032cb6e53
Proof = e3ccd78a2f2428d04599c90d4b45e3de49b38a3ba0c80a224b8125747648
718319238dd349cdeb533a6d24333b56aafbb202bec1831511717b231b89b8b36853
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = beef8ec835625f610d616d32b1d13f2f899f07c0b8089fa48a1f0ecbc5a
91b8b
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-4">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364,f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b
1
BlindedElement = 02bf13d60f3e39e2018c7be9876d88b52e56c0fc2847c8550e3
cee152c51cf72ec,0322b89e261428d77367cba2aa78fdfa2b21c2919150cafe802e
9020c7f95ec180
EvaluationElement = 0253e64b5251607348f2b46064805275a849e44db465f649
267c54bd7a774d670f,02182b225cfab1d2e25da200549d8b5e2c4581aa7b7bd85be
f9b61a14549f58230
Proof = 900fd64d21320b6059a2810f7046066c4c91a5f4e4f6063c7b51316a4862
2de8f3a28e5f1d0ebe8ae77fdaacbcb1ae92685243e9ceb813bb749dee6c7123270e
ProofRandomScalar = 350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = 9df5d51a9149a86c3660396feabaf790b8c838fc96012adba5acbd913f2
a4016,beef8ec835625f610d616d32b1d13f2f899f07c0b8089fa48a1f0ecbc5a91b
8b
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-2">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 59519f6c7da344f340ad35ad895a5b97437673cc3ac8b964b823cdb52c932
f86
pkSm = 0335065d006a3db4fb09154024dff38c3188a1027e19ce6932e6824c12764
47766
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-8">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Info = 7465737420696e666f
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 02811b5218bd2bb8361f990efb6062f1201241bcd6f053a5c35
c34dcd7292e7730
EvaluationElement = 02555fc8577c4f88eeb13bc6ac53994f8fb287a33a704592
05ddff91bc19b6a2da
Proof = d87b112dfa11b77f226b85693ab1b5f63adfa491b6e051e570a12392a926
c4816778b527526ba6212c4b0597f13e05f5f9b2223429aab82cd2596625ab1cad0b
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = af6525716fe5dd844076bb5cb118ceda08c02c2d1a02368922ddad63f40
f8b44
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-8">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 03e9ddbb1fa70461119afcf0ffbfe3fcd105690c14cf0e07872
e72d4f63aa0e197
EvaluationElement = 03156037ca1ab2166e924e6197344a9885256de2cd7d9432
ae36e3f94049e94bbb
Proof = d087b632e2aa4a67e0bc8b7cf012646217a2dfdbf49c60f236a43c66c72b
7f2767b85dc93b96a11e3286ef1ff1864b544a68c2c2d8c2bc35ef7cf7dd34189d3e
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 192f4e5d4f89ffe4b9cea5c1c9619ffe32443a5c04fc35f98c3821420cf
1890c
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-5">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364,f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b
1
BlindedElement = 02811b5218bd2bb8361f990efb6062f1201241bcd6f053a5c35
c34dcd7292e7730,0366ff91265bb4a9d24130b9e8cd3ecc523084b512b6b0722de4
4049616b8c374f
EvaluationElement = 02555fc8577c4f88eeb13bc6ac53994f8fb287a33a704592
05ddff91bc19b6a2da,032bdb191ef5604cf43d0c37faead30c4b2b21e3f61c0d47c
cc84850fc5656e500
Proof = 1bd5f64dffa2ab8d6532122887ed55ad17d114020901a7a01cf2412d568e
22b6d0536fd6dbefe9f417060468ee3cc451a8f3750f4d8d4acf1e98437248cc7fa2
ProofRandomScalar = 350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = af6525716fe5dd844076bb5cb118ceda08c02c2d1a02368922ddad63f40
f8b44,192f4e5d4f89ffe4b9cea5c1c9619ffe32443a5c04fc35f98c3821420cf189
0c
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="oprfp-384-sha-384-1">
        <name>OPRF(P-384, SHA-384)</name>
        <section anchor="oprf-mode-3">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = c0503759ddd1e31d8c7eae9304c9b1c16f83d1f6d962e3e7b789cd85fd581
800e96c5c4256131aafcff9a76919abbd55
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-9">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 0396a1584fedc4d91ddb753a0c49e0aa2298c1936dbc935d60f
e793d82809f44ff05fbd1922a2cae789d700b5ef4310fb3
EvaluationElement = 0361804cebcb1873cee5e51efd5257cd8b095521cc0089cf
4c1100b1d749e212a044eae6d4f3d852e379eeb1bb54047823
Output = b7ccad41ed7f56be97621bbba8cc3a4f5e8a46a28d72b0fe089d12802f8
6f080b20726e01a99390aba3437ac50c640d6
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-9">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 0370b0b4649c0880d44c421a3ca7c915b1b6ffa61f5a1290aa2
2258b006d148e5c105d47725e1ee1b2483b9c5666384038
EvaluationElement = 036d0aaf31ec411ef8e11c68551434883468e56cbd5d615a
c8c52b9dc7af326889d52d7466c5eed47f8c89707976aadc64
Output = ca7dc32dc6434101f35a790717dd591e5963acc86d20fda68011fe228fb
76be8da7f42c6a92284df88fb8e69480a3cb9
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-3">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = 514fb6fe2e66af1383840759d56f71730331280f062930ee2a2f7ea42f935
acf94087355699d788abfdf09d19a5c85ac
pkSm = 02f773b99e65ad26e8cd20614910ce7ad74c1baa5bdbfd9f124389dc8ef44
b5989f5bf036f6802dc2242fd7068b73da29f
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-10">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 03022e23d8356d74d8f9a24ade759fb4e7cf050d1a770110878
83d4db52f16751d8d987fa49764c157c1039c4cdfa5ef7a
EvaluationElement = 0202bdefbc2d55a37aa848df5efc561055235d9190da9ec3
0ccfb84d93b033a29c4fb1968c55c63a0b90a205e1e9c4c19f
Proof = 929ee0254047350f580cdbd6fca706a9d110e4fc0aa1383af8d35a536795
69c038d90900e8810eca177b9cfd6a2d0f1fb5ed7a2e0f3107719cbd9c74ab7d9502
79869f67551b629c3706c8f9cee651d700453ca44e43b0a08c05502cd28f3960
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = 7eb3cc88d920431c3a5ea3fb6e36b515b6d82c5ef537e285918fe7c741e
97819ce029657d6cced0f8850f47ff281c444
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-10">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 037ae30a62126a39ca791aadafb65769c812a559c7da92820e1
43350b6bb8cefb543af2e0179664f9cd0d1499c018a0b18
EvaluationElement = 0355f95a68e8c4f0d40910e9a85f09109e4e7fff84f75db1
a4aa8e21c451ac2d872113b497bea6c0be1b535241557032a2
Proof = f4ec262642fc9981fe5d1f0a3737f2d09ec9b056f577224013f5a3d09812
fb22c6b45e17150d8fe3a8c7e63094cdf40a60ae1e50fc2e1678954c1ecbaed2f7d0
7e6d597fffedc7aca450ed64164c46e62d1326ff1f6eaeba4b5dd151e953e060
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = fb538f84dae5f214c5adfcf529c6fe63bc46d6a4073d540cf0dabcc7c8e
0f3c1b43b606002a9aa52ae158a19d900c136
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-6">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364,803d955f0e073a04aa5d92b3fb739f5
6f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
BlindedElement = 03022e23d8356d74d8f9a24ade759fb4e7cf050d1a770110878
83d4db52f16751d8d987fa49764c157c1039c4cdfa5ef7a,031ee43111a2406b09eb
4fb2a3a5fd7c690c0aa51158af766c9df1428bb18195f054c5f68ae1863e6ab3dd42
98b3db712b
EvaluationElement = 0202bdefbc2d55a37aa848df5efc561055235d9190da9ec3
0ccfb84d93b033a29c4fb1968c55c63a0b90a205e1e9c4c19f,021fdbb3b92cf4f8e
04534bc1a9f62596667c3ea49a6e89f1610b9f7f89708e8730df159827ea92e26fcf
db2063920c89c
Proof = 9cc7fe5a120cec6ef0d877260cf1af1861f281aa0015f371c8830f93f286
8f5891ee6f32ec6fcbe130a50de24c93b131261eb4a242941c8d5ad9ad2f2be402d9
386ac4afcf5e5498f35cc3db0442a77e139eb56a7b3435177e7bf1a48cef184a
ProofRandomScalar = a097e722ed2427de86966910acba9f5c350e8040f828bf6c
eca27405420cdf3d63cb3aef005f40ba51943c8026877963
Output = 7eb3cc88d920431c3a5ea3fb6e36b515b6d82c5ef537e285918fe7c741e
97819ce029657d6cced0f8850f47ff281c444,fb538f84dae5f214c5adfcf529c6fe
63bc46d6a4073d540cf0dabcc7c8e0f3c1b43b606002a9aa52ae158a19d900c136
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-3">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
KeyInfo = 74657374206b6579
skSm = 0fcba4a204f67d6c13f780e613915f755319aaa3cb03cd20a5a4a6c403a48
12a4fff5d3223e2c309aa66b05cb7611fd4
pkSm = 03a571100213c4356177af14a7039cfee270ad1f9abde42ac3418c501209e
d7b2fc0d4aa3373c12ba956fb555b02843fc8
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-11">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Info = 7465737420696e666f
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 03156aece0ce92e9eb8f7a9b7f6bd30230a048d41384f2fe49f
1f9f69e180c23390e3ba8d0ee66dde6d637f03c06385f76
EvaluationElement = 02352ec7586660cc4257a9e78366727341db0825e431fc82
4a70a91019b67be26d8b880b2d4d8e734207d4a21a23429d74
Proof = 77bb1ca3ba4013b93ccb302db838839098eca743de542d3c79d189f2adf0
01999583a01aead6c248a32ff13b7f1f3d6b2dd04f653a5beb0f0394ad83ce5e79ea
08ae029d669b918b6d62ed3b77b08a07f04bbc341fae06444d196746da4da884
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = fa15c0fe8706ac256dfd3c38d21ba0cd57b927cfcf3e4d6d5554ec1272e
670079b95cdbb2778e0df22baf50f33e12607
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-11">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 02d46e0e2d27d8bb126e1201e881d0070b8807cb5635687b20d
d4a3a248e7a40c50a1ad3e905e43342771eb23bc8827a00
EvaluationElement = 030879805ff65cb536293a1449c00824e55c4c1b25379f2e
c17d97923055169a6d97b46ed7b11bb661cc8cb9535abc3d66
Proof = 9982a8501f45839213441d4ec501cf496d06fffab65f13ca3b3e66d21398
fe9e0e04aafdf50eae214fa9cccad3c53d524d0f8c185ed60b11fcf5c7e82e10a8d3
f3b2ce1e4a004d65e6ad596eeb5738453465d881f2770858cd46ac32f0e16121
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = 77cb533216c32cac017d706d5f0ee4630bcb0bfefbb980d95e98dc240ab
c70a944a44cde69b805aee3a39b2eb7d834be
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-7">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364,803d955f0e073a04aa5d92b3fb739f5
6f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
BlindedElement = 03156aece0ce92e9eb8f7a9b7f6bd30230a048d41384f2fe49f
1f9f69e180c23390e3ba8d0ee66dde6d637f03c06385f76,025663d73e3418039fdd
ea1a212d254ec0103f28904e588b73c7da8298347706b2f69902a98e8d01c7aaa69a
297b14c7dc
EvaluationElement = 02352ec7586660cc4257a9e78366727341db0825e431fc82
4a70a91019b67be26d8b880b2d4d8e734207d4a21a23429d74,02f8e532fabdd09bb
2a7391a2a80c14f265c0456009199b77eefac1013d4a4f449dfe46d5d6d2d4d74f8c
9fb1e2868b611
Proof = f8c938b5d2aff7d1a05ecdcf4178d682fe7b35c375be5db88dfa59f488c6
e4a68d4f99f16330a06f918e264ad68a78fdfad91446b72e1a3da2a65e531d520dd0
4fd91dd49b09037648e04a44e83d0dfd2aab7627e7389818924ad9bff591d646
ProofRandomScalar = a097e722ed2427de86966910acba9f5c350e8040f828bf6c
eca27405420cdf3d63cb3aef005f40ba51943c8026877963
Output = fa15c0fe8706ac256dfd3c38d21ba0cd57b927cfcf3e4d6d5554ec1272e
670079b95cdbb2778e0df22baf50f33e12607,77cb533216c32cac017d706d5f0ee4
630bcb0bfefbb980d95e98dc240abc70a944a44cde69b805aee3a39b2eb7d834be
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="oprfp-521-sha-512-1">
        <name>OPRF(P-521, SHA-512)</name>
        <section anchor="oprf-mode-4">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 0152e55f3a5d836ab6c2091a904ba4b4f92e51ba59ecc211b4fc771f7c6c8
b17fcbbb2bed8a65afd7811ceeec3eac83df6a58515b6d3c71ee0ffc349e28c3fb78
d83
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-12">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 03016480f33f005c8a8eb1003e48ebc22e082d0b86678f8460e
df21cc1518a13bfc0001fa143d474b18214188d93a7b3124b1b385db4cd4e356ad24
923ae55d70ce8a7
EvaluationElement = 03005fdb56bf49fcd073b1c4cfb42ceef5666c709785ae82
d659e4d75c0f5591cbf812ca9ffd992ac67c1877b63978f417687a2a6c17697e858c
f715843f9e4235566a
Output = ddcaaceceec790f4858a09f3e06e74e8b0841681a3d45ab1393d0948379
43f782d9ed22ae716a642d4ee428ddf1dae9ff631047864b99a305412aceb7efafa3
2
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-12">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 02000e860d3b8205e0cb4f289771c8e6189b47c60cbff24459e
12a60317ac242e9cb36ab033a620cdee5628ecae4a81303e7464d52194d801756911
fd7ddfa5430e69c
EvaluationElement = 0300e2663f17144682b25de378531abd6d065b770eec073a
42494719f27748f75b4ab11aecb06bf8815bcc9eeb3ce54978605bd8a54c22a1dea6
2da1ae5f9f5e5e90f4
Output = 287712c6dbed773f39925fec0ad686dfda4a679cc7e88fa60ba9d3a7d71
2a11d4a0445995391ba56cfb018922e0d4bb4b25ec0965a33170c9b00f45c361b021
5
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-4">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 00fb5507f94782c5b72acc16b9eb21064f86b4aa525b9865258d157b0431a
b5c3515fc975fa19ddb28129c969992b31d8946c4e354bc49458bb25fae58f10ac3f
678
pkSm = 0301322c63ad53e079791739169e011f362f4396a8e93fceeee9cd814d471
80e75ffd717820fe9e9c763fa595340cd80989c31fbd0200572080752c73b80b7532
2f300
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-13">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 02016dafe8eee47b591592705ce4d5231563b637e5a51b425b8
81f1cc576c53caae4ec59fd6e3a918d5c35e6db77cf3a5862b71a8b6c7eaded3ebdf
0c6e14778c03a8c
EvaluationElement = 020124a0ee09ade261bbf67e1e3d296655c97e6c5c14c71a
386e636d8f55d29f5f6dcec954ff28bfc7e6e63240a52bf278ae94b312be3d8bf850
55d2a1dbab687905b0
Proof = 00156561564a9128de6e2fb92d0ee065bb19192ff86549c37fab777f2d57
a951ff94b3832162cf02ad73287a0f0906045878105d8ab54a7cc9a1a0039d0cb241
ebd10197e5cef77e8fbe0414f86b86fe2e823e0d8dbdcf2ccac54d273e814da062ba
941a27d1e7e28c44cdbdaffe392cc915bf8b9add15d51b68afd6e88a52d07ff8b3d1
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 16a9387153bf7fa2c733d42f299877324cfce3b39093e72067c3d59948b
f745d77b2fe9180ffb442ec45b575eb4108d2b6f207cbfabd7bc540ad2a087cfabca
2
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-13">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 02008f585341e32244d67033ddcf4c1cc30f7661c4cfc177f09
82c69bf9c90e1da02d86a26ece60b8c42b278a1dc85afcc9cbc6aedff15cc092af03
5100b915c2bb4df
EvaluationElement = 03006cfeb22e141859e6a2050a714bde8ab8109abb2b42bc
8f18ace67121c1811c9e95e7cf8ffd4f13f8cee80fc3c69318b0eb30ecdf6e7d7e84
faefa6f0b8299217fe
Proof = 01db7070ab756e8c2b12cb81c40daac6ef1d5137be3626a10ee867b0b736
ae5ab05aadbc3ee3d1d0202b7687e1614765893cba67b307c67a8a4ce7b3eaf3ba64
204901ce6f8dc9234d27373b1027982d7e3bb196d157403f50c2f1bf0fa701753ef6
3d7265c0b1016e662456d4bdea55b3d983350b2c2ce80e192897161a1b780046b952
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 0163635204be5347419796f3564b36d6e89c9170e4fcca5b6df79d3f676
f641b2ae3ae1a64cc49f3d788e276abe14e3c38bb2f92fdba0b45ed122a6930e7d96
1
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-8">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364,015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e073a04aa5d92b3fb7
39f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b
1
BlindedElement = 02016dafe8eee47b591592705ce4d5231563b637e5a51b425b8
81f1cc576c53caae4ec59fd6e3a918d5c35e6db77cf3a5862b71a8b6c7eaded3ebdf
0c6e14778c03a8c,03005467c05309dd2b9ef584dd33ae30e93ae5508f2ceda71497
63b4b44fe797f7d0f4c7441298a0ed821ede9ebdc8c0215f96db57c64feb734a145f
00d00f0f222db1
EvaluationElement = 020124a0ee09ade261bbf67e1e3d296655c97e6c5c14c71a
386e636d8f55d29f5f6dcec954ff28bfc7e6e63240a52bf278ae94b312be3d8bf850
55d2a1dbab687905b0,0300fdf99a9eb28097074daf75ba9fe16868690b16165f58f
9c4fa266d5fffa5a87026a98ac3b0ca6dc7e42f49140a004c325646aec5ddc778db7
08748cc2f632ed937
Proof = 01935896f4c03ea5257d6471677f191ea7dfc777cc1e15f82e423cf1948c
440ee56a1c5a8627aad8da8e507a7f382b45255e55a1f1afc99c6b14237ce7cf0855
40fa000fe413be351bd11ac910b1d4af34d2c97c7b7a53438340dd659272f3d86470
35b13cd8072903b9a3adf8e89bfb1f77d732fa224f32674506e3e88e29ce182186e3
ProofRandomScalar = 01ec21c7bb69b0734cb48dfd68433dd93b0fa097e722ed24
27de86966910acba9f5c350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = 16a9387153bf7fa2c733d42f299877324cfce3b39093e72067c3d59948b
f745d77b2fe9180ffb442ec45b575eb4108d2b6f207cbfabd7bc540ad2a087cfabca
2,0163635204be5347419796f3564b36d6e89c9170e4fcca5b6df79d3f676f641b2a
e3ae1a64cc49f3d788e276abe14e3c38bb2f92fdba0b45ed122a6930e7d961
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-4">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 01e0993daeb97f8fc8176089e4e6adb4c03dc9b18daf7e976ed7fa6f3cb89
c40c6a84156f20371ef23bfe6e049423244d7d746c79ad380ac7fe285aba162419e9
012
pkSm = 0301264d23f5d1d615f9747d2a7177a419dabde6ca0f5a047979dbe9bce33
7241b7d2959025476f354c4f57017363d667b83b691fad8c172959963e6000de9533
f187a
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-14">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Info = 7465737420696e666f
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 0200e36b187060fef4f4cfef21cdb4ef8b5793a1bf44da95229
062303688d4cf6a50c16b7c943c79d91357223b56866351a17a9c7f49730fd28add9
301d399c0cf206c
EvaluationElement = 03014e216c05cf1d108829946891cc44693b0a411851a03f
c439130054d920eb8ad596a4dfa5314f68d298a094777855aa55c98480575a3816cf
ac52f838693e0e7fe5
Proof = 00c5a46ff1e7d8cd2711daf8ec8752451c4c7ed815f3e8d51db64f1eed83
a7cc33f0f99ce067676c478bd616a9ef6377994e4bd69051424a576a4e26f0ec7ed8
1fd000b7ae1eaee9e5b6991afdbb2c9c29a04e2ab3a2066df89308410a59267a60a2
2a47666de009646c78e9094c9f4de177a620e97f63e35ada0c8b438b4605248c9087
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 3be90ca19fbe2fc250de62792c7cf4b6b5555c8655fce1694fc7563d5d4
c5001efd1e91fbbaea31d75e33dbdefe57420c395f1ac805cc0095c4d81a0beddcb0
1
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-14">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 0300357933cc17cdcce862b794a4161d8eb10d23009695639e3
fdc8dffc235e19e92e0a3d3c7c6249dd9dcd02da0a8f061d89b6809d3292951ee0e9
ead21a62d1335fe
EvaluationElement = 0300a5132ae9c429dd33b25c051f45451c6e54e154d698c3
f3d8820bd9607e7a65762911c647b3460be166f37ba443bf000b23552298f14e0555
b3f0ddf0e900e1d38c
Proof = 0004f0791cbe6ac6f4074834e172beedea19ecd3a2c504a71fd870b42314
d3b072633a8265c774668274dcbcaebf1726768fab4edec69a33a7d37095ebef3e1b
b44900f0a175b56ceeae8a87bc5553405e0b030ebcf8303befc5890c8afa1e61fd41
66480ff428eae4193f12bbf1fc31d5d7196ce8692e37bc9a63cdf4c9fafe10a2dc9a
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 1d90446522e3c131e90be2e4f372959ae5ab4f25ca98e83e5e62d6336c4
8b5ec22fc6083d2b050cad2bbc22ae7115c2b934d965ffe74aaa43c905cd2af76728
d
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-9">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364,015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e073a04aa5d92b3fb7
39f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b
1
BlindedElement = 0200e36b187060fef4f4cfef21cdb4ef8b5793a1bf44da95229
062303688d4cf6a50c16b7c943c79d91357223b56866351a17a9c7f49730fd28add9
301d399c0cf206c,03007530916e8ec76199429667a82ca4df65b913d8b1fb157319
e73706f118b4f46047c01b7da024bdf5a06f2f4e879b1a1cd3fcb1ca2c37ce158cc8
625e76b3bb1cc4
EvaluationElement = 03014e216c05cf1d108829946891cc44693b0a411851a03f
c439130054d920eb8ad596a4dfa5314f68d298a094777855aa55c98480575a3816cf
ac52f838693e0e7fe5,0200005cf5e719b3066dcf0fbd6228bc921cebccc49feb1ac
be9d9c4c88f4169e1d0d5408f92ad9f599c2f5f6d7d4c6e575e86f64c4eead2bb9b3
e8e04d141a90b7382
Proof = 00d846f4a2a7722fe6a24e7257e43d88c3e01977282fba352c08fd38b69b
f1df64f90660b03b73abba50cb389af3d602da66411401d3c9f87bcb6363d6406e0a
cad3018a44bcda83524d4a48f0ed96ebca96d7626b634ba28fcba0c21956fc90c516
859df8ba6edeb7a44daeeec51c3a56b79c1f9e211e9974e5f293ade221523953d12f
ProofRandomScalar = 01ec21c7bb69b0734cb48dfd68433dd93b0fa097e722ed24
27de86966910acba9f5c350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = 3be90ca19fbe2fc250de62792c7cf4b6b5555c8655fce1694fc7563d5d4
c5001efd1e91fbbaea31d75e33dbdefe57420c395f1ac805cc0095c4d81a0beddcb0
1,1d90446522e3c131e90be2e4f372959ae5ab4f25ca98e83e5e62d6336c48b5ec22
fc6083d2b050cad2bbc22ae7115c2b934d965ffe74aaa43c905cd2af76728d
]]></artwork>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y963rcRnY2+r+uAlv+YXKmm8b5oInzRBIlW7EtM6asyTeO
YxaAAomo2c1pNCVxPM617GvZV/a9a1UVUEB3U2fbkx3HGTe7gTqsWod3Hapq
Pp+LTbtZqLvet+WifdGurjvvpFPX9Wotl/Xq0nt0vaw27WrZeQffnnz3qDv0
rrt2ee6drNtLNf92Xau198V6dX3VCVmWa/UCLdFzol5VS3mJhuu1bDbzdr1p
5lWzPp+/WF2tm3kQiVpu1F1R4X/PV+ubu167bFZCtFfru95mfd1tQt8v/FA8
VzcvV+v6rvd4uVHrpdrMj6lFIboNhviTXKyW6OVGdeKqvev9sFlVM69brTdr
1XT4dHNJH34UQl5vLlbru8KbCw//tMvurnfvyDuWL9q6Wy35Sz3iewv1avz9
an1+17u/li+Ud7pqNi/lWvH36lK2i7uexAtHtXmhCP/lnL4+qlaX084eyb/N
v8QkMHD1N7fH9SWRe8fv3PODxeq6bhbodQYqVEf8S4cZqs1dL/AD7+nq5bJT
y9o73fBvVbsBQU/l0nuEdazarlrp71fXyw3R+vtlu1H0OKjfeavGu3ep1m0l
R7NaXzbybxf/UvW9b03pyZF3er0A40iXfk/a6vn4+99wFksM5rYpPDiihfnz
alU7M3hwsW67zerqAtzt/vobzqOSL//lQskrCF/ZbrojCIIQyxUYZ9O+gBx5
3nePHoRBUNyFDEGSxj9kWZzTR4jtC1ndnMiuu8utG+k333v0g/5ers9pPheb
zVV397PPztvNxXVJ1PvsSj97hUc/2yh5yc+zMHuNXHQkGfe/8ONR+08vFE+v
rbzjtmlaBTZfLMD06HlVLtTlzk4VulpujlpZrY9A+s+gEeLPIj/d0aPn9fLN
/8zNf80qHx9BfLEs/bd6JdUaI4KW+051Sq6ri90vf3fkfSEXC7ncvP71Bxfy
+vJEQS2CA9Dvt4+PAh//+tln0TyJ/Xmc+1kwj3/K+GG1Wvrp+LEgyNIgzYqf
Ajzx6NT3d7aSZWEwz34KQjz0r1999e+B00rgF589vF6vTk+OQj9IjyJfPxTE
46aKLJ9H8zQN53GS+vk8/wla2fNO//Wr0yAbLd+d05MvHz/5dygq5hDSx1jO
1Vp5mwu58U7UulHVZnHjfdnW4GD7TOc1a5Dn8aZTi+bOziWuVy0vrR334wfH
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
oR0OMNrDLcb08K2RoeGXQTHM6Pf/mdphKmjGF9qtIkCF2ev6eqMB3za9PSP6
yApm97zGo9YEMM7iSCG9cDXSs90qyRzo1Ksd3Q4pKvIWBtSgt9fX3UR57T4W
j7Y0GTGv+g0KRqnZkyDl+HS1M0oLmtKktutx2HC+297tMENZx2QItwAVsRuo
zDg5ecibG99AYs3jw0JPBXYiq+b5jyuxFDBS8rmq6aTckfTq7o3W+PiC/FYy
PJnD24uzpuw/qPzqDKJenWH1xsJ85QrzyZsKsyNiJNMPR0e7mVMEOlMsaVwT
KkeHH351QUX4OudMWynpF/5uJib+UO/S8NP4e6n/nBSy8zHm7fm1KUDW9V46
v88YxPRu+l2rqdtVua+bCO2kzZ8/GT9kJmxg/z7fifrStescUDFVXaulmnP5
oo5+YqG9C/VK1qpqL+WCThL4u/cNacDhn797z/jZv4u/3/18/I/9Aj+x3uT1
s2/5r3zf8+xPz4bf+Kdg+Olk8lNIPxGDbGQ5176dYZDHdj7m8KjB+yM2uOco
5Nnu8/70SbGTU3XJDxwq12aCclV8aoneXOzu4qXXt2hKx78ONJ31XiudKUp7
VfjVx8dnu2u5+6O+1+qcTu+50cFh2oy58Pr8Otfom+O2RiN6fGw3wkquRqGd
ehpMVmulC87u2BoVvd/1jth1BEBPqR1utLVJd7W54GAVN/7ADQwcaNhvZsuh
HBOP0FY68HVcSodK9MPB4fCNeZGCJzp08cMP3z16YM5MuutdwVftlDkNqG/y
Ds30Dp77d/xzxx6sS39YqN2QTjO7S2aeLiYFDdWiU/rhUjV82h0rFV188OOP
LIZka4YiEn7NzBg2cMPbG62W6D2gHepm5joI7ETIdu0dsI9jID0fdtvH/IWu
z929CLYmw1ZYOCccD0kDDm45ZSZ9dXWv+szWA++Ad8Ovuo6PFuRszKFVsAa9
aLbhfSKi3wTPTU62LfE0qbLDngNhqqJtlK626VtTvTYKIZm9sZO4rNkwTvP5
4Un34ySKqi8pckKypn1Q1onJgsDvFpXlWnC6r8TdWc5f6ojt6HuOLhosRLyv
C7hsEHIcbaQ4IT9oI4U8EXMHjaJCDLokBLMwn7DiWBz+G1/oIGnb9I//sxcm
iT2NX9e07xgy/aibnEQb3ZH2QzRtk4jehltM1Hm8934r+qwDmcPs7Kc/enSt
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
hHdH3fBV049Pn3738OnTbz8fy4773LxWlWxiukQFvD6+OOzwrvc9eJG44qfN
6if3NbZUrxNKzWm8p4+fv+M0vuNQOa14zqAu8d+fTPn9GUz05KufXl3WZ9yg
Jr+hxJEz/uEeqwf20K3rZUtl3D+xFNmi0zfsTLs6ZnOi28PeWYzlN41nXn9F
Nrc1HQ4fy4lJzEt9XD4rmpbO99xsFmpu7vxmFWUrLe3RPtyefeUSiHyxMvbo
yFxdd6ZJc+qq9Lv6muXJzRbTXQuwKqtay8gThck/IfcyCrlLfb0SK9pxK5SF
07D+04f8/qfc7qfHSv8x3MRHp6xaTuqZtb8WyN70198hp/QN4s21PvdJ+x56
xpqo41nzd7w3eCcd7e1tdy0DacJC0X6OBRtuj3p8fJcPH/ADRxat1LAcfvWQ
JN2VRPvzZGKvkzD72m8rXfAWx9Kl5/ex5Avd/a98ufKVpP/z5Euz0OskLHQk
7ES/QLI5ES5tVw8Afq7wYR0cYnqviqM0fL2A6eusDAAiEHGCFn7692+O75p+
fjo9/fP3P3337X/89GYyyNmzNxXB3RLkjk9fzMqHT7+ua0dEvwY9SRXtMl16
smZ2by1n/Ly+M5b54Lqju5TkQmdCXi8DfVByeysb83sU6a1wele5uUmOOyV4
tqboda1LC7So2AvdGGzzWvJVcgHx9Onu3XZ8q7xnLde4u/LGZXbroukN9rsl
vScKnUnRnt9iUMbsbnoes3s0YvcojzW748OY3fGFZnd8eE92Rws9u9Pnf1R2
z8LXsTuR8/fG7nHxq7I78Mevxu7MvT27m57H7B6P2D0Jg51ODP+i2R0f3pPd
0ULP7ujnH5bdi9dqd8Kvvzd2T7Nfld3T9Ndj9zdwFxKOWOgw87M+8OH9/MnW
XmMhTvkSm37H+WSS5kgpd6f5/k3pfPKcu04U7NDRS3034zQUo0+KVS+omUu5
INRMW7D5Hji+psJkgphv9SVwuw4A1zeAbV+GrIVoegOvA1JHB6jxJZ+Cjo2h
y73lese9oVuXf47OWzNb1muqOhAmUz66k24492DfcQ4Xq5dbRBLuZSIuim+d
oJgd/2Kx6ypYE0SrbQEol5aMhk5ZORPwscQbGEfQHk/aGG/SY6O7ofVtfHSL
KvybNd2r7lyRzBexm6noQlMuL7PvtuYuOLrFaRzONHFjfUuT3YG/VTkqho2f
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
Z14G5qaDVHVYBv7U2HHG4KucBabYeZTNr9Ls2g4wBx3GDqcOFsQW9dopV0ee
e8YmL7EOiRWdV01erkvImOdiXRQENZPF1LK7YD1JbVray+Ggf7rmKQdd92Dy
bguimHBw5Zgk9ZBUZlY7PV2FuaNEtJABZyWinafDn0ERo5dK7ctYtwRP5KSa
pfre+oIAz60tVyzK57HEBfJCfWV54OJNf9lq7B+AM2rvCSVk4NQzUL3moj1G
NGCD9FEietgpenAkxFRnoks8LFbVL2WAJ2dBs3eFqsGotxYAOoj9v8RhZKFi
YUDllUKo5nxn7uv8qupBaG15XaW+d/lDOB3AiO/8ZWSvQYDtBPWagyTLrMGO
8gwlg4JMWVCtCd1CNJTXRbl1E716yTrcJ3Tz22qkmuX3OEGjNpR3TtCefCS/
0Ip3+lMgZ0K8GkGvzJe0WV3K1FL5V+ZVCWN8XLxwZuk/YZ7Sc3u87BB1XlRu
LsOg++VibvQSrroCpCZ+HNdF06ELlfjr1cy0IpQaZA3J2sYsyDEwEcyDnfSt
tlc5OMZOAo35WOeqX+udSJDw7Mn2ZCY1efDttqeM/NeS+eeWK7i2BKIHwu4Q
ySiIHY7uR5bo9mQJ3JM6f6CMtdsmA86u3koCaUOT20Bj3tN4OZVcvyllGJ6j
1klJHkpTBZcG+yG0K+Ym2U+oEdyLzHe/ciLzkST7OlCM8Btom7YCuxqiEm/s
nYDBOkDqoN91oEw4jGpMmzZRgM+BFqmhiy4X2ElNxRGZqLpymUWNwXLwTS2C
btTBn/SvTYaagCMfEFNl3Rr/r+mLLisff1bgOz+Vh3JfQa4v0ENddXQaqRkI
TLNaPMlrbF6V4B7IoY8y3ooV8llVZJchGezX8LO1Dut0KX/+7HvRtLKkH9cn
V5T5yiOuSNDe7yTjA+cEeKIZMh/qDnequhL2AzYzEeBD7bOVp8wwxLkcw6Ym
SBWKEeDTqKmuFtxMciO25BvSbUQeFslKvEOSgxNUxh/k+WMifFp2BDgG8fIq
rL7IEJ4XWGFxm0f9Em+U6hfluzZ1GelVCam6FTZiMkCqRtkW8l2VgDvVGIK4
CcsrY2yZOAFj8o7yMi1vpnPRbLWov+OEAPFMcEYbbeSlw5IzbuLn2cnszCMS
60WMI1UeyJD48FEdQniDJGyrCvTZJyT/ilfW5yohgjqqsYhL257jHv4q6PQw
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

-->

</rfc>
