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

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

Output:

  Proof proof

Parameters:

  Group G

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

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

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

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

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

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

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

Output:

  Element M
  Element Z

Parameters:

  Group G
  PublicInput contextString

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

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

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

  Z = k * M

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

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

Output:

  boolean verified

Parameters:

  Group G

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

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

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

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

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

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

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

Output:

  Element M
  Element Z

Parameters:

  Group G
  PublicInput contextString

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

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

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

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

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

                evaluatedElement = BlindEvaluate(skS, blindedElement)

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

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

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

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

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

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

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

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

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

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

Output:

  Scalar skS
  Element pkS

Parameters:

  Group G

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

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

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

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

  opaque seed[Ns]
  PublicInput info

Output:

  Scalar skS
  Element pkS

Parameters:

  Group G
  PublicInput contextString

Errors: DeriveKeyPairError

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

  PrivateInput input

Output:

  Scalar blind
  Element blindedElement

Parameters:

  Group G

Errors: InvalidInputError

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

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

  Scalar skS
  Element blindedElement

Output:

  Element evaluatedElement

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

  PrivateInput input
  Scalar blind
  Element evaluatedElement

Output:

  opaque output[Nh]

Parameters:

  Group G

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

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

  Scalar skS
  PrivateInput input

Output:

  opaque output[Nh]

Parameters:

  Group G

Errors: InvalidInputError

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

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

  Scalar skS
  Element pkS
  Element blindedElement

Output:

  Element evaluatedElement
  Proof proof

Parameters:

  Group G

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

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

Output:

  opaque output[Nh]

Parameters:

  Group G

Errors: VerifyError

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

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

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

  PrivateInput input
  PublicInput info
  Element pkS

Output:

  Scalar blind
  Element blindedElement
  Element tweakedKey

Parameters:

  Group G

Errors: InvalidInputError

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

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

  blindedElement = blind * inputElement

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

  Scalar skS
  Element blindedElement
  PublicInput info

Output:

  Element evaluatedElement
  Proof proof

Parameters:

  Group G

Errors: InverseError

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

  evaluatedElement = G.ScalarInverse(t) * blindedElement

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

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

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

Output:

  opaque output[Nh]

Parameters:

  Group G

Errors: VerifyError

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

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

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

  Scalar skS
  PrivateInput input
  PublicInput info

Output:

  opaque output[Nh]

Parameters:

  Group G

Errors: InvalidInputError, InverseError

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

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

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

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

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-09"/>
        </reference>
        <reference anchor="PRIVACYPASS">
          <front>
            <title>Privacy Pass Issuance Protocol</title>
            <author fullname="Sofia Celi" initials="S." surname="Celi">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Armando Faz-Hernandez" initials="A." surname="Faz-Hernandez">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Steven Valdez" initials="S." surname="Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="8" month="December" 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 using the issuance private key, and another that
   produces tokens that are publicly verifiable using the issuance
   public key.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-protocol-07"/>
        </reference>
      </references>
    </references>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This section includes test vectors for the protocol variants specified
in this document. For each ciphersuite specified in <xref target="ciphersuites"/>,
there is a set of test vectors for the protocol when run the OPRF,
VOPRF, and POPRF modes. Each test vector lists the batch size for
the evaluation. Each test vector value is encoded as a hexadecimal
byte string. The fields of each test vector are described below.</t>
      <ul spacing="normal">
        <li>"Input": The private client input, an opaque byte string.</li>
        <li>"Info": The public info, an opaque byte string. Only present for POPRF test
 vectors.</li>
        <li>"Blind": The blind value output by <tt>Blind()</tt>, a serialized <tt>Scalar</tt>
of <tt>Ns</tt> bytes long.</li>
        <li>"BlindedElement": The blinded value output by <tt>Blind()</tt>, a serialized
<tt>Element</tt> of <tt>Ne</tt> bytes long.</li>
        <li>"EvaluatedElement": The evaluated element output by <tt>BlindEvaluate()</tt>,
a serialized <tt>Element</tt> of <tt>Ne</tt> bytes long.</li>
        <li>"Proof": The serialized <tt>Proof</tt> output from <tt>GenerateProof()</tt> composed of
two serialized <tt>Scalar</tt> values each of <tt>Ns</tt> bytes long. Only present for
VOPRF and POPRF test vectors.</li>
        <li>"ProofRandomScalar": The random scalar <tt>r</tt> computed in <tt>GenerateProof()</tt>, a
serialized <tt>Scalar</tt> of <tt>Ns</tt> bytes long. Only present for VOPRF and POPRF
test vectors.</li>
        <li>"Output": The protocol output, an opaque byte string of length <tt>Nh</tt> bytes.</li>
      </ul>
      <t>Test vectors with batch size B &gt; 1 have inputs separated by a comma
",". Applicable test vectors will have B different values for the
"Input", "Blind", "BlindedElement", "EvaluationElement", and
"Output" fields.</t>
      <t>The server key material, <tt>pkSm</tt> and <tt>skSm</tt>, are listed under the mode for
each ciphersuite. Both <tt>pkSm</tt> and <tt>skSm</tt> are the serialized values of
<tt>pkS</tt> and <tt>skS</tt>, respectively, as used in the protocol. Each key pair
is derived from a seed <tt>Seed</tt> and info string <tt>KeyInfo</tt>, which are
listed as well, using the <tt>DeriveKeyPair</tt> function from <xref target="offline"/>.</t>
      <section anchor="ristretto255-sha512">
        <name>ristretto255-SHA512</name>
        <section anchor="oprf-mode">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 5ebcea5ee37023ccb9fc2d2019f9d7737be85591ae8652ffa9ef0f4d37063
b0e
]]></artwork>
          <section anchor="test-vector-1-batch-size-1">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = 609a0ae68c15a3cf6903766461307e5c8bb2f95e7e6550e1ffa
2dc99e412803c
EvaluationElement = 7ec6578ae5120958eb2db1745758ff379e77cb64fe77b0b2
d8cc917ea0869c7e
Output = 527759c3d9366f277d8c6020418d96bb393ba2afb20ff90df23fb770826
4e2f3ab9135e3bd69955851de4b1f9fe8a0973396719b7912ba9ee8aa7d0b5e24bcf
6
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = da27ef466870f5f15296299850aa088629945a17d1f5b7f5ff0
43f76b3c06418
EvaluationElement = b4cbf5a4f1eeda5a63ce7b77c7d23f461db3fcab0dd28e4e
17cecb5c90d02c25
Output = f4a74c9c592497375e796aa837e907b1a045d34306a749db9f34221f7e7
50cb4f2a6413a6bf6fa5e19ba6348eb673934a722a7ede2e7621306d18951e7cf2c7
3
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = e6f73f344b79b379f1a0dd37e07ff62e38d9f71345ce62ae3a9bc60b04ccd
909
pkSm = c803e2cc6b05fc15064549b5920659ca4a77b2cca6f04f6b357009335476a
d4e
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-1">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = 863f330cc1a1259ed5a5998a23acfd37fb4351a793a5b3c090b
642ddc439b945
EvaluationElement = aa8fa048764d5623868679402ff6108d2521884fa138cd7f
9c7669a9a014267e
Proof = ddef93772692e535d1a53903db24367355cc2cc78de93b3be5a8ffcc6985
dd066d4346421d17bf5117a2a1ff0fcb2a759f58a539dfbe857a40bce4cf49ec600d
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = b58cfbe118e0cb94d79b5fd6a6dafb98764dff49c14e1770b566e42402d
a1a7da4d8527693914139caee5bd03903af43a491351d23b430948dd50cde10d32b3
c
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-1">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = cc0b2a350101881d8a4cba4c80241d74fb7dcbfde4a61fde2f9
1443c2bf9ef0c
EvaluationElement = 60a59a57208d48aca71e9e850d22674b611f752bed48b36f
7a91b372bd7ad468
Proof = 401a0da6264f8cf45bb2f5264bc31e109155600babb3cd4e5af7d181a2c9
dc0a67154fabf031fd936051dec80b0b6ae29c9503493dde7393b722eafdf5a50b02
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = 8a9a2f3c7f085b65933594309041fc1898d42d0858e59f90814ae90571a
6df60356f4610bf816f27afdd84f47719e480906d27ecd994985890e5f539e7ea74b
6
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706,222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d9881aa6f61d645fc0
e
BlindedElement = 863f330cc1a1259ed5a5998a23acfd37fb4351a793a5b3c090b
642ddc439b945,90a0145ea9da29254c3a56be4fe185465ebb3bf2a1801f7124bbba
dac751e654
EvaluationElement = aa8fa048764d5623868679402ff6108d2521884fa138cd7f
9c7669a9a014267e,cc5ac221950a49ceaa73c8db41b82c20372a4c8d63e5dded2db
920b7eee36a2a
Proof = cc203910175d786927eeb44ea847328047892ddf8590e723c37205cb7460
0b0a5ab5337c8eb4ceae0494c2cf89529dcf94572ed267473d567aeed6ab873dee08
ProofRandomScalar = 419c4f4f5052c53c45f3da494d2b67b220d02118e0857cdb
cf037f9ea84bbe0c
Output = b58cfbe118e0cb94d79b5fd6a6dafb98764dff49c14e1770b566e42402d
a1a7da4d8527693914139caee5bd03903af43a491351d23b430948dd50cde10d32b3
c,8a9a2f3c7f085b65933594309041fc1898d42d0858e59f90814ae90571a6df6035
6f4610bf816f27afdd84f47719e480906d27ecd994985890e5f539e7ea74b6
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 145c79c108538421ac164ecbe131942136d5570b16d8bf41a24d4337da981
e07
pkSm = c647bef38497bc6ec077c22af65b696efa43bff3b4a1975a3e8e0a1c5a79d
631
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-2">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = c8713aa89241d6989ac142f22dba30596db635c772cbf25021f
dd8f3d461f715
EvaluationElement = 1a4b860d808ff19624731e67b5eff20ceb2df3c3c03b906f
5693e2078450d874
Proof = 41ad1a291aa02c80b0915fbfbb0c0afa15a57e2970067a602ddb9e8fd6b7
100de32e1ecff943a36f0b10e3dae6bd266cdeb8adf825d86ef27dbc6c0e30c52206
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = ca688351e88afb1d841fde4401c79efebb2eb75e7998fa9737bd5a82a15
2406d38bd29f680504e54fd4587eddcf2f37a2617ac2fbd2993f7bdf45442ace7d22
1
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-2">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706
BlindedElement = f0f0b209dd4d5f1844dac679acc7761b91a2e704879656cb7c2
01e82a99ab07d
EvaluationElement = 8c3c9d064c334c6991e99f286ea2301d1bde170b54003fb9
c44c6d7bd6fc1540
Proof = 4c39992d55ffba38232cdac88fe583af8a85441fefd7d1d4a8d0394cd1de
77018bf135c174f20281b3341ab1f453fe72b0293a7398703384bed822bfdeec8908
ProofRandomScalar = 222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d98
81aa6f61d645fc0e
Output = 7c6557b276a137922a0bcfc2aa2b35dd78322bd500235eb6d6b6f91bc5b
56a52de2d65612d503236b321f5d0bebcbc52b64b92e426f29c9b8b69f52de98ae50
7
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-1">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f
6706,222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d9881aa6f61d645fc0
e
BlindedElement = c8713aa89241d6989ac142f22dba30596db635c772cbf25021f
dd8f3d461f715,423a01c072e06eb1cce96d23acce06e1ea64a609d7ec9e9023f304
9f2d64e50c
EvaluationElement = 1a4b860d808ff19624731e67b5eff20ceb2df3c3c03b906f
5693e2078450d874,aa1f16e903841036e38075da8a46655c94fc92341887eb5819f
46312adfc0504
Proof = 43fdb53be399cbd3561186ae480320caa2b9f36cca0e5b160c4a677b8bbf
4301b28f12c36aa8e11e5a7ef551da0781e863a6dc8c0b2bf5a149c9e00621f02006
ProofRandomScalar = 419c4f4f5052c53c45f3da494d2b67b220d02118e0857cdb
cf037f9ea84bbe0c
Output = ca688351e88afb1d841fde4401c79efebb2eb75e7998fa9737bd5a82a15
2406d38bd29f680504e54fd4587eddcf2f37a2617ac2fbd2993f7bdf45442ace7d22
1,7c6557b276a137922a0bcfc2aa2b35dd78322bd500235eb6d6b6f91bc5b56a52de
2d65612d503236b321f5d0bebcbc52b64b92e426f29c9b8b69f52de98ae507
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="decaf448-shake256">
        <name>decaf448-SHAKE256</name>
        <section anchor="oprf-mode-1">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = e8b1375371fd11ebeb224f832dcc16d371b4188951c438f751425699ed29e
cc80c6c13e558ccd67634fd82eac94aa8d1f0d7fee990695d1e
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-3">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = e0ae01c4095f08e03b19baf47ffdc19cb7d98e583160522a3c7
d6a0b2111cd93a126a46b7b41b730cd7fc943d4e28e590ed33ae475885f6c
EvaluationElement = 50ce4e60eed006e22e7027454b5a4b8319eb2bc8ced609eb
19eb3ad42fb19e06ba12d382cbe7ae342a0cad6ead0ef8f91f00bb7f0cd9c0a2
Output = 37d3f7922d9388a15b561de5829bbf654c4089ede89c0ce0f3f85bcdba0
9e382ce0ab3507e021f9e79706a1798ffeac68ebd5cf62e5eb9838c7068351d97ae3
7
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-3">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = 86a88dc5c6331ecfcb1d9aacb50a68213803c462e377577cacc
00af28e15f0ddbc2e3d716f2f39ef95f3ec1314a2c64d940a9f295d8f13bb
EvaluationElement = 162e9fa6e9d527c3cd734a31bf122a34dbd5bcb7bb23651f
1768a7a9274cc116c03b58afa6f0dede3994a60066c76370e7328e7062fd5819
Output = a2a652290055cb0f6f8637a249ee45e32ef4667db0b4c80c0a70d2a6416
4d01525cfdad5d870a694ec77972b9b6ec5d2596a5223e5336913f945101f0137f55
e
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-1">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = e3c01519a076a326a0eb566343e9b21c115fa18e6e85577ddbe890b33104f
cc2835ddfb14a928dc3f5d79b936e17c76b99e0bf6a1680930e
pkSm = 945fc518c47695cf65217ace04b86ac5e4cbe26ca649d52854bb16c494ce0
9069d6add96b20d4b0ae311a87c9a73e3a146b525763ab2f955
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-4">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = 7261bbc335c664ba788f1b1a1a4cd5190cc30e787ef277665ac
1d314f8861e3ec11854ce3ddd42035d9e0f5cddde324c332d8c880abc00eb
EvaluationElement = ca1491a526c28d880806cf0fb0122222392cf495657be6e4
c9d203bceffa46c86406caf8217859d3fb259077af68e5d41b3699410781f467
Proof = f84bbeee47aedf43558dae4b95b3853635a9fc1a9ea7eac9b454c64c66c4
f49cd1c72711c7ac2e06c681e16ea693d5500bbd7b56455df52f69e00b76b4126961
e1562fdbaaac40b7701065cbeece3febbfe09e00160f81775d36daed99d8a2a10be0
759e01b7ee81217203416c9db208
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = e2ac40b634f36cccd8262b285adff7c9dcc19cd308564a5f4e581d1a853
5773b86fa4fc9f2203c370763695c5093aea4a7aedec4488b1340ba3bf663a23098c
1
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-4">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = 88287e553939090b888ddc15913e1807dc4757215555e1c3a79
488ef311594729c7fa74c772a732b78440b7d66d0aa35f3bb316f1d93e1b2
EvaluationElement = c00978c73e8e4ee1d447ab0d3ad1754055e72cc85c08e3a0
db170909a9c61cbff1f1e7015f289e3038b0f341faea5d7780c130106065c231
Proof = 7a2831a6b237e11ac1657d440df93bc5ce00f552e6020a99d5c956ffc4d0
7b5ade3e82ecdc257fd53d76239e733e0a1313e84ce16cc0d82734806092a693d7e8
d3c420c2cb6ccd5d0ca32514fb78e9ad0973ebdcb52eba438fc73948d76339ee7101
21d83e2fe6f001cfdf551aff9f36
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = 862952380e07ec840d9f6e6f909c5a25d16c3dacb586d89a181b4aa7380
c959baa8c480fe8e6c64e089d68ea7aeeb5817bd524d7577905b5bab487690048c94
1
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-2">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112,b1b748135d405ce
48c6973401d9455bb8ccd18b01d0295c0627f67661200dbf9569f73fbb3925daa043
a070e5f953d80bb464ea369e5522b
BlindedElement = 7261bbc335c664ba788f1b1a1a4cd5190cc30e787ef277665ac
1d314f8861e3ec11854ce3ddd42035d9e0f5cddde324c332d8c880abc00eb,2e15f3
93c035492a1573627a3606e528c6294c767c8d43b8c691ef70a52cc7dc7d1b53fe45
8350a270abb7c231b87ba58266f89164f714d9
EvaluationElement = ca1491a526c28d880806cf0fb0122222392cf495657be6e4
c9d203bceffa46c86406caf8217859d3fb259077af68e5d41b3699410781f467,8ec
68e9871b296e81c55647ce64a04fe75d19932f1400544cd601468c60f998408bbb54
6601d4a636e8be279e558d70b95c8d4a4f61892be
Proof = 167d922f0a6ffa845eed07f8aa97b6ac746d902ecbeb18f49c009adc0521
eab1e4d275b74a2dc266b7a194c854e85e7eb54a9a36376dfc04ec7f3bd55fc9618c
3970cb548e064f8a2f06183a5702933dbc3e4c25a73438f2108ee1981c306181003c
7ea92fce963ec7b4ba4f270e6d38
ProofRandomScalar = 63798726803c9451ba405f00ef3acb633ddf0c420574a2ec
6cbf28f840800e355c9fbaac10699686de2724ed22e797a00f3bd93d105a7f23
Output = e2ac40b634f36cccd8262b285adff7c9dcc19cd308564a5f4e581d1a853
5773b86fa4fc9f2203c370763695c5093aea4a7aedec4488b1340ba3bf663a23098c
1,862952380e07ec840d9f6e6f909c5a25d16c3dacb586d89a181b4aa7380c959baa
8c480fe8e6c64e089d68ea7aeeb5817bd524d7577905b5bab487690048c941
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-1">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 792a10dcbd3ba4a52a054f6f39186623208695301e7adb9634b74709ab22d
e402990eb143fd7c67ac66be75e0609705ecea800992aac8e19
pkSm = 6c9d12723a5bbcf305522cc04b4a34d9ced2e12831826018ea7b5dcf54526
47ad262113059bf0f6e4354319951b9d513c74f29cb0eec38c1
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-5">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = 161183c13c6cb33b0e4f9b7365f8c5c12d13c72f8b62d276ca0
9368d093dce9b42198276b9e9d870ac392dda53efd28d1b7e6e8c060cdc42
EvaluationElement = 06ec89dfde25bb2a6f0145ac84b91ac277b35de39ad1d6f4
02a8e46414952ce0d9ea1311a4ece283e2b01558c7078b040cfaa40dd63b3e6c
Proof = 66caee75bf2460429f620f6ad3e811d524cb8ddd848a435fc5d89af48877
abf6506ee341a0b6f67c2d76cd021e5f3d1c9abe5aa9f0dce016da746135fedba2af
41ed1d01659bfd6180d96bc1b7f320c0cb6926011ce392ecca748662564892bae665
16acaac6ca39aadf6fcca95af406
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = 4423f6dcc1740688ea201de57d76824d59cd6b859e1f9884b7eebc49b0b
971358cf9cb075df1536a8ea31bcf55c3e31c2ba9cfa8efe54448d17091daeb9924e
d
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-5">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112
BlindedElement = 12082b6a381c6c51e85d00f2a3d828cdeab3f5cb19a10b9c014
c33826764ab7e7cfb8b4ff6f411bddb2d64e62a472af1cd816e5b712790c6
EvaluationElement = f2919b7eedc05ab807c221fce2b12c4ae9e19e6909c47845
64b690d1972d2994ca623f273afc67444d84ea40cbc58fcdab7945f321a52848
Proof = a295677c54d1bc4286330907fc2490a7de163da26f9ce03a462a452fea42
2b19ade296ba031359b3b6841e48455d20519ad01b4ac4f0b92e76d3cf16fbef0a3f
72791a8401ef2d7081d361e502e96b2c60608b9fa566f43d4611c2f161d83aabef7f
8017332b26ed1daaf80440772022
ProofRandomScalar = b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0
627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b
Output = 8691905500510843902c44bdd9730ab9dc3925aa58ff9dd42765a2baf63
3126de0c3adb93bef5652f38e5827b6396e87643960163a560fc4ac9738c8de4e4a8
d
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-3">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa
3833a26e9388336361686ff1f83df55046504dfecad8549ba112,b1b748135d405ce
48c6973401d9455bb8ccd18b01d0295c0627f67661200dbf9569f73fbb3925daa043
a070e5f953d80bb464ea369e5522b
BlindedElement = 161183c13c6cb33b0e4f9b7365f8c5c12d13c72f8b62d276ca0
9368d093dce9b42198276b9e9d870ac392dda53efd28d1b7e6e8c060cdc42,fc8847
d43fb4cea4e408f585661a8f2867533fa91d22155d3127a22f18d3b007add480f7d3
00bca93fa47fe87ae06a57b7d0f0d4c30b12f0
EvaluationElement = 06ec89dfde25bb2a6f0145ac84b91ac277b35de39ad1d6f4
02a8e46414952ce0d9ea1311a4ece283e2b01558c7078b040cfaa40dd63b3e6c,2e7
4c626d07de49b1c8c21d87120fd78105f485e36816af9bde3e3efbeef76815326062
fd333925b66c5ce5a20f100bf01770c16609f990a
Proof = fd94db736f97ea4efe9d0d4ad2933072697a6bbeb32834057b23edf7c700
9f011dfa72157f05d2a507c2bbf0b54cad99ab99de05921c021fda7d70e65bcecdb0
5f9a30154127ace983c74d10fd910b554c5e95f6bd1565fd1f3dbbe3c523ece5c72d
57a559b7be1368c4786db4a3c910
ProofRandomScalar = 63798726803c9451ba405f00ef3acb633ddf0c420574a2ec
6cbf28f840800e355c9fbaac10699686de2724ed22e797a00f3bd93d105a7f23
Output = 4423f6dcc1740688ea201de57d76824d59cd6b859e1f9884b7eebc49b0b
971358cf9cb075df1536a8ea31bcf55c3e31c2ba9cfa8efe54448d17091daeb9924e
d,8691905500510843902c44bdd9730ab9dc3925aa58ff9dd42765a2baf633126de0
c3adb93bef5652f38e5827b6396e87643960163a560fc4ac9738c8de4e4a8d
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="p256-sha256">
        <name>P256-SHA256</name>
        <section anchor="oprf-mode-2">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 159749d750713afe245d2d39ccfaae8381c53ce92d098a9375ee70739c7ac
0bf
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-6">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 03723a1e5c09b8b9c18d1dcbca29e8007e95f14f4732d9346d4
90ffc195110368d
EvaluationElement = 030de02ffec47a1fd53efcdd1c6faf5bdc270912b8749e78
3c7ca75bb412958832
Output = a0b34de5fa4c5b6da07e72af73cc507cceeb48981b97b7285fc375345fe
495dd
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-6">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 03cc1df781f1c2240a64d1c297b3f3d16262ef5d4cf10273488
2675c26231b0838
EvaluationElement = 03a0395fe3828f2476ffcd1f4fe540e5a8489322d398be3c
4e5a869db7fcb7c52c
Output = c748ca6dd327f0ce85f4ae3a8cd6d4d5390bbb804c9e12dcf94f853fece
3dcce
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-2">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = ca5d94c8807817669a51b196c34c1b7f8442fde4334a7121ae4736364312f
ca6
pkSm = 03e17e70604bcabe198882c0a1f27a92441e774224ed9c702e51dd17038b1
02462
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-7">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 02dd05901038bb31a6fae01828fd8d0e49e35a486b5c5d4b499
4013648c01277da
EvaluationElement = 0209f33cab60cf8fe69239b0afbcfcd261af4c1c5632624f
2e9ba29b90ae83e4a2
Proof = e7c2b3c5c954c035949f1f74e6bce2ed539a3be267d1481e9ddb178533df
4c2664f69d065c604a4fd953e100b856ad83804eb3845189babfa5a702090d6fc5fa
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 0412e8f78b02c415ab3a288e228978376f99927767ff37c5718d420010a
645a1
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-7">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 03cd0f033e791c4d79dfa9c6ed750f2ac009ec46cd4195ca6fd
3800d1e9b887dbd
EvaluationElement = 030d2985865c693bf7af47ba4d3a3813176576383d19aff0
03ef7b0784a0d83cf1
Proof = 2787d729c57e3d9512d3aa9e8708ad226bc48e0f1750b0767aaff73482c4
4b8d2873d74ec88aebd3504961acea16790a05c542d9fbff4fe269a77510db00abab
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 771e10dcd6bcd3664e23b8f2a710cfaaa8357747c4a8cbba03133967b5c
24f18
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-4">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364,f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b
1
BlindedElement = 02dd05901038bb31a6fae01828fd8d0e49e35a486b5c5d4b499
4013648c01277da,03462e9ae64cae5b83ba98a6b360d942266389ac369b923eb3d5
57213b1922f8ab
EvaluationElement = 0209f33cab60cf8fe69239b0afbcfcd261af4c1c5632624f
2e9ba29b90ae83e4a2,02bb24f4d838414aef052a8f044a6771230ca69c0a5677540
fff738dd31bb69771
Proof = bdcc351707d02a72ce49511c7db990566d29d6153ad6f8982fad2b435d6c
e4d60da1e6b3fa740811bde34dd4fe0aa1b5fe6600d0440c9ddee95ea7fad7a60cf2
ProofRandomScalar = 350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = 0412e8f78b02c415ab3a288e228978376f99927767ff37c5718d420010a
645a1,771e10dcd6bcd3664e23b8f2a710cfaaa8357747c4a8cbba03133967b5c24f
18
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-2">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 6ad2173efa689ef2c27772566ad7ff6e2d59b3b196f00219451fb2c89ee4d
ae2
pkSm = 030d7ff077fddeec965db14b794f0cc1ba9019b04a2f4fcc1fa525dedf72e
2a3e3
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-8">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Info = 7465737420696e666f
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 031563e127099a8f61ed51eeede05d747a8da2be329b40ba1f0
db0b2bd9dd4e2c0
EvaluationElement = 02c5e5300c2d9e6ba7f3f4ad60500ad93a0157e6288eb04b
67e125db024a2c74d2
Proof = f8a33690b87736c854eadfcaab58a59b8d9c03b569110b6f31f8bf7577f3
fbb85a8a0c38468ccde1ba942be501654adb106167c8eb178703ccb42bccffb9231a
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 193a92520bd8fd1f37accb918040a57108daa110dc4f659abe212636d24
5c592
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-8">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 021a440ace8ca667f261c10ac7686adc66a12be31e3520fca31
7643a1eee9dcd4d
EvaluationElement = 0208ca109cbae44f4774fc0bdd2783efdcb868cb4523d521
96f700210e777c5de3
Proof = 043a8fb7fc7fd31e35770cabda4753c5bf0ecc1e88c68d7d35a62bf2631e
875af4613641be2d1875c31d1319d191c4bbc0d04875f4fd03c31d3d17dd8e069b69
ProofRandomScalar = f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 1e6d164cfd835d88a31401623549bf6b9b306628ef03a7962921d62bc5f
fce8c
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-5">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364,f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b
1
BlindedElement = 031563e127099a8f61ed51eeede05d747a8da2be329b40ba1f0
db0b2bd9dd4e2c0,03ca4ff41c12fadd7a0bc92cf856732b21df652e01a3abdf0fa8
847da053db213c
EvaluationElement = 02c5e5300c2d9e6ba7f3f4ad60500ad93a0157e6288eb04b
67e125db024a2c74d2,02f0b6bcd467343a8d8555a99dc2eed0215c71898c5edb77a
3d97ddd0dbad478e8
Proof = 8fbd85a32c13aba79db4b42e762c00687d6dbf9c8cb97b2a225645ccb00d
9d7580b383c885cdfd07df448d55e06f50f6173405eee5506c0ed0851ff718d13e68
ProofRandomScalar = 350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = 193a92520bd8fd1f37accb918040a57108daa110dc4f659abe212636d24
5c592,1e6d164cfd835d88a31401623549bf6b9b306628ef03a7962921d62bc5ffce
8c
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="p384-sha384">
        <name>P384-SHA384</name>
        <section anchor="oprf-mode-3">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = dfe7ddc41a4646901184f2b432616c8ba6d452f9bcd0c4f75a5150ef2b2ed
02ef40b8b92f60ae591bcabd72a6518f188
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-9">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 02a36bc90e6db34096346eaf8b7bc40ee1113582155ad379700
3ce614c835a874343701d3f2debbd80d97cbe45de6e5f1f
EvaluationElement = 03af2a4fc94770d7a7bf3187ca9cc4faf3732049eded2442
ee50fbddda58b70ae2999366f72498cdbc43e6f2fc184afe30
Output = ed84ad3f31a552f0456e58935fcc0a3039db42e7f356dcb32aa6d487b6b
815a07d5813641fb1398c03ddab5763874357
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-9">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 02def6f418e3484f67a124a2ce1bfb19de7a4af568ede6a1ebb
2733882510ddd43d05f2b1ab5187936a55e50a847a8b900
EvaluationElement = 034e9b9a2960b536f2ef47d8608b21597ba400d5abfa1825
fd21c36b75f927f396bf3716c96129d1fa4a77fa1d479c8d7b
Output = dd4f29da869ab9355d60617b60da0991e22aaab243a3460601e48b07585
9d1c526d36597326f1b985778f781a1682e75
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-3">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 051646b9e6e7a71ae27c1e1d0b87b4381db6d3595eeeb1adb41579adbf992
f4278f9016eafc944edaa2b43183581779d
pkSm = 031d689686c611991b55f1a1d8f4305ccd6cb719446f660a30db61b7aa87b
46acf59b7c0d4a9077b3da21c25dd482229a0
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-10">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 02d338c05cbecb82de13d6700f09cb61190543a7b7e2c6cd4fc
a56887e564ea82653b27fdad383995ea6d02cf26d0e24d9
EvaluationElement = 02a7bba589b3e8672aa19e8fd258de2e6aae20101c8d7612
46de97a6b5ee9cf105febce4327a326255a3c604f63f600ef6
Proof = bfc6cf3859127f5fe25548859856d6b7fa1c7459f0ba5712a806fc091a30
00c42d8ba34ff45f32a52e40533efd2a03bc87f3bf4f9f58028297ccb9ccb18ae718
2bcd1ef239df77e3be65ef147f3acf8bc9cbfc5524b702263414f043e3b7ca2e
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = 3333230886b562ffb8329a8be08fea8025755372817ec969d114d1203d0
26b4a622beab60220bf19078bca35a529b35c
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-10">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 02f27469e059886f221be5f2cca03d2bdc61e55221721c3b3e5
6fc012e36d31ae5f8dc058109591556a6dbd3a8c69c433b
EvaluationElement = 03f16f903947035400e96b7f531a38d4a07ac89a80f89d86
a1bf089c525a92c7f4733729ca30c56ce78b1ab4f7d92db8b4
Proof = d005d6daaad7571414c1e0c75f7e57f2113ca9f4604e84bc90f9be52da89
6fff3bee496dcde2a578ae9df315032585f801fb21c6080ac05672b291e575a40295
b306d967717b28e08fcc8ad1cab47845d16af73b3e643ddcc191208e71c64630
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = b91c70ea3d4d62ba922eb8a7d03809a441e1c3c7af915cbc2226f485213
e895942cd0f8580e6d99f82221e66c40d274f
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-6">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364,803d955f0e073a04aa5d92b3fb739f5
6f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
BlindedElement = 02d338c05cbecb82de13d6700f09cb61190543a7b7e2c6cd4fc
a56887e564ea82653b27fdad383995ea6d02cf26d0e24d9,02fa02470d7f151018b4
1e82223c32fad824de6ad4b5ce9f8e9f98083c9a726de9a1fc39d7a0cb6f4f188dd9
cea01474cd
EvaluationElement = 02a7bba589b3e8672aa19e8fd258de2e6aae20101c8d7612
46de97a6b5ee9cf105febce4327a326255a3c604f63f600ef6,028e9e115625ff4c2
f07bf87ce3fd73fc77994a7a0c1df03d2a630a3d845930e2e63a165b114d98fe34e6
1b68d23c0b50a
Proof = 6d8dcbd2fc95550a02211fb78afd013933f307d21e7d855b0b1ed0af7807
6d8137ad8b0a1bfa05676d325249c1dbb9a52bd81b1c2b7b0efc77cf7b278e1c947f
6283f1d4c513053fc0ad19e026fb0c30654b53d9cea4b87b037271b5d2e2d0ea
ProofRandomScalar = a097e722ed2427de86966910acba9f5c350e8040f828bf6c
eca27405420cdf3d63cb3aef005f40ba51943c8026877963
Output = 3333230886b562ffb8329a8be08fea8025755372817ec969d114d1203d0
26b4a622beab60220bf19078bca35a529b35c,b91c70ea3d4d62ba922eb8a7d03809
a441e1c3c7af915cbc2226f485213e895942cd0f8580e6d99f82221e66c40d274f
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-3">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 5b2690d6954b8fbb159f19935d64133f12770c00b68422559c65431942d72
1ff79d47d7a75906c30b7818ec0f38b7fb2
pkSm = 02f00f0f1de81e5d6cf18140d4926ffdc9b1898c48dc49657ae36eb1e45de
b8b951aaf1f10c82d2eaa6d02aafa3f10d2b6
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-11">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Info = 7465737420696e666f
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 03859b36b95e6564faa85cd3801175eda2949707f6aa0640ad0
93cbf8ad2f58e762f08b56b2a1b42a64953aaf49cbf1ae3
EvaluationElement = 0220710e2e00306453f5b4f574cb6a512453f35c45080d09
373e190c19ce5b185914fbf36582d7e0754bb7c8b683205b91
Proof = 82a17ef41c8b57f1e3122311b4d5cd39a63df0f67443ef18d961f9b659c1
601ced8d3c64b294f604319ca80230380d437a49c7af0d620e22116669c008ebb767
d90283d573b49cdb49e3725889620924c2c4b047a2a6225a3ba27e640ebddd33
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = 0188653cfec38119a6c7dd7948b0f0720460b4310e40824e048bf82a165
27303ed449a08caf84272c3bbc972ede797df
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-11">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364
BlindedElement = 03f7efcb4aaf000263369d8a0621cb96b81b3206e99876de2a0
0699ed4c45acf3969cd6e2319215395955d3f8d8cc1c712
EvaluationElement = 034993c818369927e74b77c400376fd1ae29b6ac6c6ddb77
6cf10e4fbc487826531b3cf0b7c8ca4d92c7af90c9def85ce6
Proof = 693471b5dff0cd6a5c00ea34d7bf127b2795164e3bdb5f39a1e5edfbd13e
443bc516061cd5b8449a473c2ceeccada9f3e5b57302e3d7bc5e28d38d6e3a3056e1
e73b6cc030f5180f8a1ffa45aa923ee66d2ad0a07b500f2acc7fb99b5506465c
ProofRandomScalar = 803d955f0e073a04aa5d92b3fb739f56f9db001266677f62
c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
Output = ff2a527a21cc43b251a567382677f078c6e356336aec069dea8ba369953
43ca3b33bb5d6cf15be4d31a7e6d75b30d3f5
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-7">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562
889d89dbfa691d1cde91517fa222ed7ad364,803d955f0e073a04aa5d92b3fb739f5
6f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1
BlindedElement = 03859b36b95e6564faa85cd3801175eda2949707f6aa0640ad0
93cbf8ad2f58e762f08b56b2a1b42a64953aaf49cbf1ae3,021a65d618d645f1a20b
c33b06deaa7e73d6d634c8a56a3d02b53a732b69a5c53c5a207ea33d5afdcde9a22d
59726bce51
EvaluationElement = 0220710e2e00306453f5b4f574cb6a512453f35c45080d09
373e190c19ce5b185914fbf36582d7e0754bb7c8b683205b91,02017657b315ec65e
f861505e596c8645d94685dd7602cdd092a8f1c1c0194a5d0485fe47d071d972ab51
4370174cc23f5
Proof = 4a0b2fe96d5b2a046a0447fe079b77859ef11a39a3520d6ff7c626aad9b4
73b724fb0cf188974ec961710a62162a83e97e0baa9eeada73397032d928b3e97b1e
a92ad9458208302be3681b8ba78bcc17745bac00f84e0fdc98a6a8cba009c080
ProofRandomScalar = a097e722ed2427de86966910acba9f5c350e8040f828bf6c
eca27405420cdf3d63cb3aef005f40ba51943c8026877963
Output = 0188653cfec38119a6c7dd7948b0f0720460b4310e40824e048bf82a165
27303ed449a08caf84272c3bbc972ede797df,ff2a527a21cc43b251a567382677f0
78c6e356336aec069dea8ba36995343ca3b33bb5d6cf15be4d31a7e6d75b30d3f5
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="p521-sha512">
        <name>P521-SHA512</name>
        <section anchor="oprf-mode-4">
          <name>OPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 0153441b8faedb0340439036d6aed06d1217b34c42f17f8db4c5cc610a4a9
55d698a688831b16d0dc7713a1aa3611ec60703bffc7dc9c84e3ed673b3dbe1d5fcc
ea6
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-12">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 0300e78bf846b0e1e1a3c320e353d758583cd876df56100a3a1
e62bacba470fa6e0991be1be80b721c50c5fd0c672ba764457acc18c6200704e9294
fbf28859d916351
EvaluationElement = 030166371cf827cb2fb9b581f97907121a16e2dc5d8b10ce
9f0ede7f7d76a0d047657735e8ad07bcda824907b3e5479bd72cdef6b839b967ba5c
58b118b84d26f2ba07
Output = 26232de6fff83f812adadadb6cc05d7bbeee5dca043dbb16b03488abb99
81d0a1ef4351fad52dbd7e759649af393348f7b9717566c19a6b8856284d69375c80
9
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-12">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 0300c28e57e74361d87e0c1874e5f7cc1cc796d61f9cad50427
cf54655cdb455613368d42b27f94bf66f59f53c816db3e95e68e1b113443d66a99b3
693bab88afb556b
EvaluationElement = 0301ad453607e12d0cc11a3359332a40c3a254eaa1afc642
96528d55bed07ba322e72e22cf3bcb50570fd913cb54f7f09c17aff8787af75f6a7f
af5640cbb2d9620a6e
Output = ad1f76ef939042175e007738906ac0336bbd1d51e287ebaa66901abdd32
4ea3ffa40bfc5a68e7939c2845e0fd37a5a6e76dadb9907c6cc8579629757fd4d04b
a
]]></artwork>
          </section>
        </section>
        <section anchor="voprf-mode-4">
          <name>VOPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 015c7fc1b4a0b1390925bae915bd9f3d72009d44d9241b962428aad5d13f2
2803311e7102632a39addc61ea440810222715c9d2f61f03ea424ec9ab1fe5e31cf9
238
pkSm = 0301505d646f6e4c9102451eb39730c4ba1c4087618641edbdba4a60896b0
7fd0c9414ce553cbf25b81dfcca50a8f6724ab7a2bc4d0cf736967a287bb6084cc06
78ac0
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-13">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 0301d6e4fb545e043ddb6aee5d5ceeee1b44102615ab04430c2
7dd0f56988dedcb1df32ef384f160e0e76e718605f14f3f582f9357553d153b99679
5b4b3628a4f6380
EvaluationElement = 03013fdeaf887f3d3d283a79e696a54b66ff0edcb559265e
204a958acf840e0930cc147e2a6835148d8199eebc26c03e9394c9762a1c991dde40
bca0f8ca003eefb045
Proof = 0077fcc8ec6d059d7759b0a61f871e7c1dadc65333502e09a51994328f79
e5bda3357b9a4f410a1760a3612c2f8f27cb7cb032951c047cc66da60da583df7b24
7edd0188e5eb99c71799af1d80d643af16ffa1545acd9e9233fbb370455b10eb257e
a12a1667c1b4ee5b0ab7c93d50ae89602006960f083ca9adc4f6276c0ad60440393c
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 5e003d9b2fb540b3d4bab5fedd154912246da1ee5e557afd8f56415faa1
a0fadff6517da802ee254437e4f60907b4cda146e7ba19e249eef7be405549f62954
b
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-13">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 03005b05e656cb609ce5ff5faf063bb746d662d67bbd07c0626
38396f52f0392180cf2365cabb0ece8e19048961d35eeae5d5fa872328dce98df076
ee154dd191c615e
EvaluationElement = 0301b19fcf482b1fff04754e282292ed736c5f0aa080d4f4
2663cd3a416c6596f03129e8e096d8671fe5b0d19838312c511d2ce08d431e43e3ef
06199d8cab7426238d
Proof = 01ec9fece444caa6a57032e8963df0e945286f88fbdf233fb5101f0924f7
ea89c47023f5f72f240e61991fd33a299b5b38c45a5e2dd1a67b072e59dfe86708a3
59c701e38d383c60cf6969463bcf13251bedad47b7941f52e409a3591398e2792441
0b18a301c0e19f527cad504fa08388050ac634e1b05c5216d337742f2754e1fc502f
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = fa15eebba81ecf40954f7135cb76f69ef22c6bae394d1a4362f9b03066b
54b6604d39f2e53369ca6762a3d9787e230e832aa85955af40ecb8deebb009a8cf47
4
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-8">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364,015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e073a04aa5d92b3fb7
39f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b
1
BlindedElement = 0301d6e4fb545e043ddb6aee5d5ceeee1b44102615ab04430c2
7dd0f56988dedcb1df32ef384f160e0e76e718605f14f3f582f9357553d153b99679
5b4b3628a4f6380,0301403b597538b939b450c93586ba275f9711ba07e42364bac1
d5769c6824a8b55be6f9a536df46d952b11ab2188363b3d6737635d9543d4dba14a6
e19421b9245bf5
EvaluationElement = 03013fdeaf887f3d3d283a79e696a54b66ff0edcb559265e
204a958acf840e0930cc147e2a6835148d8199eebc26c03e9394c9762a1c991dde40
bca0f8ca003eefb045,03001f96424497e38c46c904978c2fa1636c5c3dd2e634a85
d8a7265977c5dce1f02c7e6c118479f0751767b91a39cce6561998258591b5d7c1bb
02445a9e08e4f3e8d
Proof = 00b4d215c8405e57c7a4b53398caf55f1f1623aaeb22408ddb9ea2913090
9b3f95dbb1ff366e81e86e918f9f2fd8b80dbb344cd498c9499d112905e585417e00
68c600fe5dea18b389ef6c4cc062935607b8ccbbb9a84fba3143868a3e8a58efa0bf
6ca642804d09dc06e980f64837811227c4267b217f1099a4e28b0854f4e5ee659796
ProofRandomScalar = 01ec21c7bb69b0734cb48dfd68433dd93b0fa097e722ed24
27de86966910acba9f5c350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = 5e003d9b2fb540b3d4bab5fedd154912246da1ee5e557afd8f56415faa1
a0fadff6517da802ee254437e4f60907b4cda146e7ba19e249eef7be405549f62954
b,fa15eebba81ecf40954f7135cb76f69ef22c6bae394d1a4362f9b03066b54b6604
d39f2e53369ca6762a3d9787e230e832aa85955af40ecb8deebb009a8cf474
]]></artwork>
          </section>
        </section>
        <section anchor="poprf-mode-4">
          <name>POPRF Mode</name>
          <artwork><![CDATA[
Seed = a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
3a3
KeyInfo = 74657374206b6579
skSm = 014893130030ce69cf714f536498a02ff6b396888f9bb507985c32928c442
7d6d39de10ef509aca4240e8569e3a88debc0d392e3361bcd934cb9bdd59e339dff7
b27
pkSm = 0301de8ceb9ffe9237b1bba87c320ea0bebcfc3447fe6f278065c6c69886d
692d1126b79b6844f829940ace9b52a5e26882cf7cbc9e57503d4cca3cd834584729
f812a
]]></artwork>
          <section anchor="test-vector-1-batch-size-1-14">
            <name>Test Vector 1, Batch Size 1</name>
            <artwork><![CDATA[
Input = 00
Info = 7465737420696e666f
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 020095cff9d7ecf65bdfee4ea92d6e748d60b02de34ad98094f
82e25d33a8bf50138ccc2cc633556f1a97d7ea9438cbb394df612f041c485a515849
d5ebb2238f2f0e2
EvaluationElement = 0301408e9c5be3ffcc1c16e5ae8f8aa68446223b0804b119
62e856af5a6d1c65ebbb5db7278c21db4e8cc06d89a35b6804fb1738a295b691638a
f77aa1327253f26d01
Proof = 0106a89a61eee9dd2417d2849a8e2167bc5f56e3aed5a3ff23e22511fa1b
37a29ed44d1bbfd6907d99cfbc558a56aec709282415a864a281e49dc53792a4a638
a0660034306d64be12a94dcea5a6d664cf76681911c8b9a84d49bf12d4893307ec14
436bd05f791f82446c0de4be6c582d373627b51886f76c4788256e3da7ec8fa18a86
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 808ae5b87662eaaf0b39151dd85991b94c96ef214cb14a68bf5c1439548
82d330da8953a80eea20788e552bc8bbbfff3100e89f9d6e341197b122c46a208733
b
]]></artwork>
          </section>
          <section anchor="test-vector-2-batch-size-1-14">
            <name>Test Vector 2, Batch Size 1</name>
            <artwork><![CDATA[
Input = 5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364
BlindedElement = 030112ea89cf9cf589496189eafc5f9eb13c9f9e170d6ecde7c
5b940541cb1a9c5cfeec908b67efe16b81ca00d0ce216e34b3d5f46a658d3fd8573d
671bdb6515ed508
EvaluationElement = 0200ebc49df1e6fa61f412e6c391e6f074400ecdd2f56c4a
8c03fe0f91d9b551f40d4b5258fd891952e8c9b28003bcfa365122e54a5714c8949d
5d202767b31b4bf1f6
Proof = 0082162c71a7765005cae202d4bd14b84dae63c29067e886b82506992bd9
94a1c3aac0c1c5309222fe1af8287b6443ed6df5c2e0b0991faddd3564c73c7597ae
cd9a003b1f1e3c65f28e58ab4e767cfb4adbcaf512441645f4c2aed8bf67d132d966
006d35fa71a34145414bf3572c1de1a46c266a344dd9e22e7fb1e90ffba1caf556d9
ProofRandomScalar = 015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e07
3a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698c
e45c405d1348b7b1
Output = 27032e24b1a52a82ab7f4646f3c5df0f070f499db98b9c5df33972bd5af
5762c3638afae7912a6c1acdb1ae2ab2fa670bd5486c645a0e55412e08d33a4a0d6e
3
]]></artwork>
          </section>
          <section anchor="test-vector-3-batch-size-2-9">
            <name>Test Vector 3, Batch Size 2</name>
            <artwork><![CDATA[
Input = 00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
Info = 7465737420696e666f
Blind = 00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f68616333
88936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7a
d364,015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e073a04aa5d92b3fb7
39f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b
1
BlindedElement = 020095cff9d7ecf65bdfee4ea92d6e748d60b02de34ad98094f
82e25d33a8bf50138ccc2cc633556f1a97d7ea9438cbb394df612f041c485a515849
d5ebb2238f2f0e2,0201a328cf9f3fdeb86b6db242dd4cbb436b3a488b70b72d2fbb
d1e5f50d7b0878b157d6f278c6a95c488f3ad52d6898a421658a82fe7ceb000b01ae
dea7967522d525
EvaluationElement = 0301408e9c5be3ffcc1c16e5ae8f8aa68446223b0804b119
62e856af5a6d1c65ebbb5db7278c21db4e8cc06d89a35b6804fb1738a295b691638a
f77aa1327253f26d01,020062ab51ac3aa829e0f5b7ae50688bcf5f63a18a83a6e0d
a538666b8d50c7ea2b4ef31f4ac669302318dbebe46660acdda695da30c22cee7ca2
1f6984a720504502e
Proof = 00731738844f739bca0cca9d1c8bea204bed4fd00285785738b985763741
de5cdfa275152d52b6a2fdf7792ef3779f39ba34581e56d62f78ecad5b7f8083f384
961501cd4b43713253c022692669cf076b1d382ecd8293c1de69ea569737f37a2477
2ab73517983c1e3db5818754ba1f008076267b8058b6481949ae346cdc17a8455fe2
ProofRandomScalar = 01ec21c7bb69b0734cb48dfd68433dd93b0fa097e722ed24
27de86966910acba9f5c350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba
51943c8026877963
Output = 808ae5b87662eaaf0b39151dd85991b94c96ef214cb14a68bf5c1439548
82d330da8953a80eea20788e552bc8bbbfff3100e89f9d6e341197b122c46a208733
b,27032e24b1a52a82ab7f4646f3c5df0f070f499db98b9c5df33972bd5af5762c36
38afae7912a6c1acdb1ae2ab2fa670bd5486c645a0e55412e08d33a4a0d6e3
]]></artwork>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
1+7R6+3IO64W5IT84NJIE91WXqnZTtd3ZovSXjEa1QCYHcRK9kYUWtq986Yv
fR+YuSr1ttHFXxLc+wp6z0IFxjQyIvjmPkGOvZjAPPs2eEA19TEQgel1yq2i
0QEesMZki90eOx9FCZE4zPzMS5LMy7M89n2Y+cDz0jBL0gj2Po6CJMu8MEyS
PIjwURb4aZbQw1EcpbEXZln8qS3+b0Vp34BMzNL8sqhkWY9QieLMT4VL0N3v
uOTtcMnHs/fxjfbeLPbHtffx7/Z+h72Pk7ez99qW71iaT2XLzcj+2bbcNsJK
9ewyw+zrK6/8JgusQgKvXz8Gw93jS3r3+uMfyfoeox2yvGO7q0YCV7hc4Ze1
fzga1U4D7L2q9Y+nf+rRT1HKpBaiEqmf5jKL6rDIS1EGdZmEcHD92Rvtrj2I
tzC824//L7C8bFNNQI4WlVbxp3//7ui25oyfTk7+8v1PT5/8509vZ5y5FOxt
bfNu02qPj2OXSlTf1LVlu7+F0BBQ3RULUJPVs3tnA8zPq3uk2SRetnT3sJir
Wp5fu3GkSOSaajjoGA91g/eUWXp6TFW4RMwn5UZupt0VLa45WlAFyrU+ff36
5P49n8ym9pPDd7Cbb9DOYajO4FAE0KcUbZY8FmEdLLJ7WvbwaTq7pnnjlBRH
6Bzxwl3JNclty+f+Nd3hv3S4ln2wxPD2kbYz/MksgPGPjG0DC39z/z/uPHx6
//539x8/++royaOZ780SL8i+IPUyOzmeZZ43jZM765B29ekj73Xwm023mrSC
A9xoueRZCH2k1RAlcHW1OozXytyUG6VxJj2wUA9yvVRnhnVqQxFj/NwbDv3g
Rv7poKPniQekOKaaC8eMzTe0Q9IaPdk9zP1JgwgmZMAD0Gyuhj/m4cFUjC5U
Y3wDONEQ3gYoHwOcWNCEqGNBkzCLFDTBLzdAE3z7dtCEHvwY0ATtEDTBPyNo
Qh0wNMEv7wxN3vanTJMwqjK/jsI0qKo6znzhVUUQZYUn0lTIUpZ+noALyzjI
0/B36PJ+0AVr2EEX+v23Cl3S4E3QheTsd+jyYdCFkUuUfzzkEuXT/vQw93fM
8uvFLLoHrrWjaoXr2U1xGG77vWIx/4thUZR9IlgUZb9ZWAStrGERUceCRXHg
v7mOgh97O1j0kSoojtHhrsoJNRKGRfjlrWGR578rMNr6EbGfJVmahUUd1HmS
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
+YF89HM6cj+Uj35OR/8HWnPAiKyuAQA=

-->

</rfc>
