<?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.7.7 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-chen-cfrg-vdaf-pine-00" category="info" consensus="true" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.0 -->
  <front>
    <title>Private Inexpensive Norm Enforcement (PINE) VDAF</title>
    <seriesInfo name="Internet-Draft" value="draft-chen-cfrg-vdaf-pine-00"/>
    <author initials="J." surname="Chen" fullname="Junye Chen">
      <organization>Apple Inc.</organization>
      <address>
        <email>junyec@apple.com</email>
      </address>
    </author>
    <author initials="C." surname="Patton" fullname="Christopher Patton">
      <organization>Cloudflare</organization>
      <address>
        <email>chrispatton+ietf@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="March" day="04"/>
    <area>IRTF</area>
    <workgroup>Crypto Forum</workgroup>
    <keyword>next generation</keyword>
    <keyword>unicorn</keyword>
    <keyword>sparkling distributed ledger</keyword>
    <abstract>
      <?line 91?>

<t>This document describes PINE, a Verifiable Distributed Aggregation Function
(VDAF) for secure aggregation of high-dimensional, real-valued vectors with
bounded L2-norm. PINE is intended to facilitate private and robust federated
machine learning.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://junyechen1996.github.io/draft-chen-cfrg-vdaf-pine/draft-chen-cfrg-vdaf-pine.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-chen-cfrg-vdaf-pine/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Crypto Forum Research Group mailing list (<eref target="mailto:cfrg@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/search/?email_list=cfrg"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cfrg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/junyechen1996/draft-chen-cfrg-vdaf-pine"/>.</t>
    </note>
  </front>
  <middle>
    <?line 98?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The goal of federated machine learning <xref target="MR17"/> is to enable training of
machine learning models from data stored on users' devices. The bulk of the
computation is carried out on-device: each user trains the model on its data
locally, then sends a model update to a central server. These model updates are
commonly referred to as "gradients" <xref target="Lem12"/>. The server aggregates the
gradients, applies them to the central model, and sends the updated model to
the users to repeat the process.</t>
      <figure anchor="plain-fl">
        <name>Federated learning</name>
        <artwork><![CDATA[
   data
     |
     v
+---------+               gradients                   +--------+
| Clients |-+   ----------------------------------->  | Server |
+---------+ |-+                                       +--------+
  +---------+ |                                            |
    +---------+                                            |
     ^                                                     |
     |                  updated model                      |
     +-----------------------------------------------------+
]]></artwork>
      </figure>
      <t>Federated learning improves user privacy by ensuring the training data never
leaves users' devices. However, it requires computing an aggregate of the
gradients sent from devices, which may still reveal a significant amount of
information about the underlying data. One way to mitigate this risk is to
distribute the aggregation step across multiple servers such that no server
sees any gradient in the clear.</t>
      <t>With a Verifiable Distributed Aggregation Function
<xref target="VDAF"/>, this is achieved by having each user
shard their gradient into a number of secret shares, one for each aggregation
server. Each server aggregates their shares locally, then combines their share
of the aggregate with the other servers to get the aggregate result.</t>
      <figure anchor="distributed-fl">
        <name>Federated learning with a VDAF</name>
        <artwork><![CDATA[
   data
     |
     v        gradient                    aggregate
+---------+   shares    +-------------+   shares     +-----------+
| Clients |-+   ---->   | Aggregators |-+   ----->   | Collector |
+---------+ |-+         +-------------+ |            +-----------+
  +---------+ |           +-------------+                  |
    +---------+                                            |
     ^                                                     |
     |                  updated model                      |
     +-----------------------------------------------------+
]]></artwork>
      </figure>
      <t>Along with keeping the gradients private, it is desirable to ensure
robustness of the overall computation by preventing clients from "poisoning"
the aggregate and corrupting the trained machine learning model. A client's
gradient is typically expressed as a vector of real numbers. A common goal is
to ensure each gradient has a bounded "L2-norm" (sometimes called Euclidean
norm): the square root of the sum of the squares of each entry of the input
vector. Bounding the L2 norm is used in federated learning to limit the
contribution of each client to the aggregate, without over constraining the
distribution of inputs. [CP: Add a relevant reference.]</t>
      <t>In theory, Prio3 (<xref section="7" sectionFormat="of" target="VDAF"/>) could be adapted to support this
functionality, but for high-dimensional data, the concrete cost in terms of
runtime and communication would be prohibitively high. The basic idea is
simple. An FLP ("Fully Linear Proof", see <xref section="7.3" sectionFormat="of" target="VDAF"/>) could be
used to compute the L2 norm of the secret shared gradient and check that the
result is in the desired range, all without learning the gradient or its norm.
This computation, on its own, can be done efficiently: the challenge lies in
ensuring that the computation itself was carried out correctly, while properly
accounting for the relevant mathematical details of the proof system and the
range of possible inputs.</t>
      <t>This document describes PINE ("Private Inexpensive Norm Enforcement"), a VDAF
for secure aggregation of gradients with bounded L2-norm <xref target="ROCT23"/>. Its design
is based largely on Prio3 in that the norm is computed and verified using
an FLP. However, PINE uses a new technique for verifying the correctness of
the norm computation that is incompatible with Prio3.</t>
      <t>We give an overview of this technique in <xref target="overview"/>. In <xref target="flp"/> we specify an
FLP circuit and accompanying encoding scheme for computing and verifying the L2
norm of each gradient. Finally, in <xref target="vdaf"/> we specify the complete
multi-party, 1-round VDAF.</t>
      <ul empty="true">
        <li>
          <t>NOTE As of this draft, the algorithms are not yet fully specified. We are
still working out some of the minor details. In the meantime, please refer to
the reference code on which the spec will be based:
https://github.com/junyechen1996/draft-chen-cfrg-vdaf-pine/tree/main/poc</t>
        </li>
      </ul>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
      <?line -18?>

<t>This document uses the same parameters and conventions specified for:</t>
      <ul spacing="normal">
        <li>
          <t>Clients, Aggregators, and Collectors from <xref section="5" sectionFormat="of" target="VDAF"/>.</t>
        </li>
        <li>
          <t>Finite fields from <xref section="6.1" sectionFormat="of" target="VDAF"/>. All fields in this document have
prime order.</t>
        </li>
        <li>
          <t>XOFs ("eXtendable Output Functions") from <xref section="6.2" sectionFormat="of" target="VDAF"/>.</t>
        </li>
      </ul>
      <t>A floating point number, denoted <tt>float</tt>, is a IEEE-754 compatible float64 value
<xref target="IEEE754-2019"/>.</t>
      <t>A "gradient" is a vector of floating point numbers. Each coordinate of this
vector is called an "entry". The "L2 norm", or simply "norm", of a gradient is
the square root of the sum of the squares of its entries.</t>
      <t>The "dot product" of two vectors is to compute the sum of element-wise
multiplications of the two vectors.</t>
      <t>The user-specified parameters to initialize PINE are defined in
<xref target="pine-user-param"/>.</t>
      <table anchor="pine-user-param">
        <name>User parameters for PINE.</name>
        <thead>
          <tr>
            <th align="left">Parameter</th>
            <th align="left">Type</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>l2_norm_bound</tt></td>
            <td align="left">
              <tt>float</tt></td>
            <td align="left">The L2 norm upper bound (inclusive).</td>
          </tr>
          <tr>
            <td align="left">
              <tt>dimension</tt></td>
            <td align="left">int</td>
            <td align="left">Dimension of each gradient.</td>
          </tr>
          <tr>
            <td align="left">
              <tt>num_frac_bits</tt></td>
            <td align="left">int</td>
            <td align="left">The number of bits of precision to use when encoding each gradient entry into the field.</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="overview">
      <name>PINE Overview</name>
      <t>This section provides an overview of the main technical contribution of
<xref target="ROCT23"/> that forms the basis of PINE. To motivate their idea, let us first
say how Prio3 from <xref section="7" sectionFormat="of" target="VDAF"/> would be used to aggregate vectors
with bounded L2 norm.</t>
      <t>Prio3 uses an FLP ("Fully Linear Proof"; see <xref section="7.3" sectionFormat="of" target="VDAF"/>) to
verify properties of a secret shared measurement without revealing the
measurement to the Aggregators. The property to be verified is expressed as an
arithmetic circuit over a finite field (<xref section="7.3.2" sectionFormat="of" target="VDAF"/>). Let <tt>q</tt>
denote the field modulus.</t>
      <t>In our case, the circuit would take (a share of) the gradient as input, compute
the squared L2-norm (the sum of the squares of the entries of the gradient),
and check that the result is in the desired range. Note that we do not compute
the exact norm: it is mathematically equivalent to compute the squared norm and
check that it is smaller than the square of the bound.</t>
      <t>Crucially, arithmetic in this computation is modulo <tt>q</tt>. This means that, for a
given gradient, the norm may have a different result when computed in our
finite field than in the ring of integers. For example, suppose our bound is
<tt>10</tt>: the gradient <tt>[99, 0, 7]</tt> has squared L2-norm of <tt>9850</tt> over the integers
(out of range), but only <tt>6</tt> modulo <tt>q = 23</tt> (in range). This circuit would
therefore deem the gradient valid, when in fact it is invalid.</t>
      <t>Thus the central challenge of adapting FLPs to this problem is to prevent the
norm computation from "wrapping around" the field modulus.</t>
      <t>One way to achieve this is to ensure that each gradient entry is in a range
that ensures the norm is sufficiently small. However, this approach has high
communication cost (roughly <tt>num_frac_bits * dimension</tt> field elements per
entry), which becomes prohibitive for high-dimensional data.</t>
      <t>PINE uses a different strategy: rather than prevent wraparounds, we can try to
detect whether a wraparound has occurred.</t>
      <t><xref target="ROCT23"/> devises a probabilistic test for this purpose. A random vector over
the field is generated (via a procedure described in <xref target="run-wr-check"/>) where
each entry is sampled independently from a particular probability distribution.
To test for wraparound, compute the dot product of this vector and the
gradient, and check if the result is in a specific range determined by
parameters in <xref target="pine-user-param"/>.</t>
      <t>If the norm wraps around the field modulus, then the dot product is likely to
be large. In fact, <xref target="ROCT23"/> show that this test correctly detects wraparounds
with probability <tt>1/2</tt>. To decrease the false negative probability (that is,
the probability of misclassifying an invalid gradient as valid), we simply
repeat this test a number of times, each time with a vector sampled from the
same distribution.</t>
      <t>However, <xref target="ROCT23"/> also show that each wraparound test has a non-zero false
positive probability (the probability of misclassifying a valid gradient as
invalid). We refer to this probability as the "zero-knowledge error", or in
short, "ZK error". This creates a problem for privacy, as the Aggregators learn
information about a valid gradient they were not meant to learn: whether its
dot product with a known vector is in a particular range. [CP: We need a more
intuitive explanation of the information that's leaked.] The parameters of PINE
are chosen carefully in order to ensure this leakage is negligible.</t>
    </section>
    <section anchor="flp">
      <name>The PINE Proof System</name>
      <t>This section specifies a randomized encoding of gradients and FLP circuit
(<xref section="7.3" sectionFormat="of" target="VDAF"/>) for checking that (1) the gradient's
squared L2-norm falls in the desired range and (2) the squared L2-norm does
not wrap around the field modulus. We specify the encoding and validity
circuit in a class <tt>PineValid</tt>.</t>
      <t>The encoding algorithm takes as input the gradient and an XOF seed used to
derive the random vectors for the wraparound tests. The seed must be known
both to the Client and the Aggregators: <xref target="vdaf"/> describes how the seed is
derived from shares of the gradient.</t>
      <t>Operational parameters for the proof system are summarized below in
<xref target="pine-flp-param"/>.</t>
      <table anchor="pine-flp-param">
        <name>Operational parameters of the PINE FLP.</name>
        <thead>
          <tr>
            <th align="left">Parameter</th>
            <th align="left">Type</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">alpha</td>
            <td align="left">
              <tt>float</tt></td>
            <td align="left">Parameter in wraparound check that determines the ZK error. The higher <tt>alpha</tt> is, the lower ZK error is.</td>
          </tr>
          <tr>
            <td align="left">num_wr_checks</td>
            <td align="left">int</td>
            <td align="left">Number of wraparound checks to run.</td>
          </tr>
          <tr>
            <td align="left">num_wr_successes</td>
            <td align="left">int</td>
            <td align="left">Minimum number of wraparound checks that a Client must pass.</td>
          </tr>
          <tr>
            <td align="left">encoded_sq_norm_bound</td>
            <td align="left">Field</td>
            <td align="left">The square of <tt>l2_norm_bound</tt> encoded into a field element.</td>
          </tr>
          <tr>
            <td align="left">wr_check_bound</td>
            <td align="left">Field</td>
            <td align="left">The bound of the range check for each wraparound check.</td>
          </tr>
          <tr>
            <td align="left">num_bits_for_sq_norm</td>
            <td align="left">int</td>
            <td align="left">Number of bits to encode the squared L2-norm.</td>
          </tr>
          <tr>
            <td align="left">num_bits_for_wr_check</td>
            <td align="left">int</td>
            <td align="left">Number of bits to encode the range check in each wraparound check.</td>
          </tr>
          <tr>
            <td align="left">bit_checked_len</td>
            <td align="left">int</td>
            <td align="left">Number of field elements in the encoded measurement that are expected to be bits.</td>
          </tr>
          <tr>
            <td align="left">chunk_length</td>
            <td align="left">int</td>
            <td align="left">Parameter of the FLP.</td>
          </tr>
        </tbody>
      </table>
      <section anchor="measurement-encoding">
        <name>Measurement Encoding</name>
        <t>The measurement encoding is done in two stages:
* <xref target="encode-gradient-and-norm"/> involves encoding floating point numbers in the
  Client gradient into field elements <xref target="float-to-field"/>, and encoding the
  results for L2-norm check <xref target="l2-norm-check"/>, by computing the bit
  representation of the squared L2-norm, modulo <tt>q</tt>, of the encoded gradient.
  The result of this step allows Aggregators to check the squared L2-norm of the
  Client's gradient, modulo <tt>q</tt>, falls in the desired range of
  <tt>[0, encoded_sq_norm_bound]</tt>.
* <xref target="encode-wr-check"/> involves encoding the results of running wraparound checks
  <xref target="run-wr-check"/>, based on the encoded gradient from the previous step, and
  the random vectors derived from a short, random seed using an XOF. The result
  of this step, along with the encoded gradient and the random vector that the
  Aggregators derive on their own, allow the Aggregators to run wraparound
  checks on their own.</t>
        <section anchor="encode-range-check">
          <name>Encoding Range-Checked Results</name>
          <t>Encoding range-checked results is a common subroutine during measurement
encoding. The goal is to allow the Client to prove a <tt>value</tt> is in the desired
range of <tt>[B1, B2]</tt>, over the field modulus <tt>q</tt> (see Figure 1 in <xref target="ROCT23"/>).
The Client computes the "<tt>v</tt> bits", the bit representation of <tt>value - B1</tt>
(modulo <tt>q</tt>), and the "<tt>u</tt> bits", the bit representation of <tt>B2 - value</tt>
(modulo <tt>q</tt>). The number of bits for the <tt>v</tt> and <tt>u</tt> bits is
<tt>ceil(log2(B2 - B1 + 1))</tt>.</t>
          <t>As an optimization for communication cost per Remark 3.2 in <xref target="ROCT23"/>, the
Client can skip sending the <tt>u</tt> bits if <tt>B2 - B1 + 1</tt> (modulo <tt>q</tt>) is a power of
<tt>2</tt>. This is because the available <tt>v</tt> bits can naturally bound <tt>value - B1</tt> to
be <tt>B2 - B1</tt>.</t>
        </section>
        <section anchor="encode-gradient-and-norm">
          <name>Encoding Gradient and L2-Norm Check</name>
          <t>We define a function <tt>PineValid.encode_gradient_and_norm(self,
measurement: list[float]) -&gt; list[Field]</tt> that implements this encoding step.</t>
          <section anchor="float-to-field">
            <name>Encoding of Floating Point Numbers into Field Elements</name>
            <ul empty="true">
              <li>
                <t>TODO Specify how floating point numbers are represented as field elements.</t>
              </li>
            </ul>
          </section>
          <section anchor="l2-norm-check">
            <name>Encoding the Range-Checked, Squared Norm</name>
            <ul empty="true">
              <li>
                <t>TODO Specify how the Client encodes the norm such that the Aggregators can
check that it is in the desired range.</t>
              </li>
            </ul>
            <ul empty="true">
              <li>
                <t>TODO Put full implementation of <tt>encode_gradient_and_norm()</tt> here.</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="run-wr-check">
          <name>Running the Wraparound Checks</name>
          <t>Given the encoded gradient from <xref target="encode-gradient-and-norm"/> and the XOF to
generate the random vectors, the Client needs to run the wraparound check
<tt>num_wr_checks</tt> times. Each wraparound check works as follows.</t>
          <t>The Client generates a random vector with the same dimension as the gradient's
dimension. Each entry of the random vector is a field element of <tt>1</tt> with
probability <tt>1/4</tt>, or <tt>0</tt> with probability <tt>1/2</tt>, or <tt>q-1</tt> with probability
<tt>1/4</tt>, over the field modulus <tt>q</tt>. The Client samples each entry by sampling
from the XOF output stream two bits at a time:
* If the bits are <tt>00</tt>, set the entry to be <tt>q-1</tt>.
* If the bits are <tt>01</tt> or <tt>10</tt>, set the entry to be <tt>0</tt>.
* If the bits are <tt>11</tt>, set the entry to be <tt>1</tt>.</t>
          <t>Finally, the Client computes the dot product of the encoded gradient and the
random vector, modulo <tt>q</tt>.</t>
          <t>Note the Client does not send this dot product to the Aggregators. The
Aggregators will compute the dot product themselves, based on the encoded
gradient and the random vector derived on their own.</t>
        </section>
        <section anchor="encode-wr-check">
          <name>Encoding the Range-Checked, Wraparound Check Results</name>
          <t>We define a function <tt>PineValid.encode_wr_checks(self,
encoded_gradient: list[Field], wr_joint_rand_xof: Xof) -&gt;
tuple[list[Field], list[Field]]</tt> that implements this encoding step. It returns
the tuple of range-checked, wraparound check results that will be sent to the
Aggregators, and the wraparound check results (i.e., the dot products from
<xref target="run-wr-check"/>) that will be passed as inputs to the FLP circuit.</t>
          <t>The Client obtains the wraparound check results, as described in
<xref target="run-wr-check"/>. For each check, the Client runs the range check on the result
to see if it is in the range of <tt>[-wr_check_bound + 1, wr_check_bound]</tt>. Note we
choose <tt>wr_check_bound</tt>, such that <tt>wr_check_bound</tt> is a power of 2, so the
Client does not have to send the <tt>u</tt> bits in range check. The Client also keeps
track of a success bit <tt>wr_check_g</tt>, which is a <tt>1</tt> if the wraparound check
result is in range, and <tt>0</tt> otherwise.</t>
          <t>The Client counts how many wraparound checks it has passed. If it has passed
fewer than <tt>num_wr_successes</tt> of them, it should retry, by using a new XOF
seed to re-generate the random vectors and re-run wraparound checks
<xref target="run-wr-check"/>.</t>
          <t>The range-checked results and the success bits are sent to the Aggregators, and
the wraparound check results are passed to the FLP circuit.</t>
        </section>
      </section>
      <section anchor="the-flp-circuit">
        <name>The FLP Circuit</name>
        <t>Evaluation of the validity circuit begins by unpacking the encoded measurement
into the following components:</t>
        <ul spacing="normal">
          <li>
            <t>The first <tt>dimension</tt> entries are the <tt>encoded_gradient</tt>, the field elements
encoded from the floating point numbers.</t>
          </li>
          <li>
            <t>The next <tt>bit_checked_len</tt> entries are expected to be bits, and should contain
the bits for the range-checked L2-norm, the bits for the range-checked
wraparound check results, and the success bits in wraparound checks.</t>
          </li>
          <li>
            <t>The last <tt>num_wr_checks</tt> are the wraparound check results, i.e., the dot
products of the encoded gradient and the random vectors.</t>
          </li>
        </ul>
        <t>It also unpacks the "joint randomness" that is shared between the Client and
Aggregators, to compute random linear combinations of all the checks:</t>
        <ul spacing="normal">
          <li>
            <t>The first joint randomness field element is to reduce over the bit checks at
all bit entries.</t>
          </li>
          <li>
            <t>The second joint randomness field element is to reduce over all the quadratic
checks in wraparound check.</t>
          </li>
          <li>
            <t>The last joint randomness field element is to reduce over all the checks,
which include the reduced bit check result, the L2 norm equality check, the
L2 norm range check, the reduced quadratic checks in wraparound check, and
the success count check for wraparound check.</t>
          </li>
        </ul>
        <t>In the subsections below, we outline the various checks computed by the validity
circuit, which includes the bit check on all the bit entries
<xref target="valid-bit-check"/>, the L2 norm check <xref target="valid-norm-check"/>, and the wraparound
check <xref target="valid-wr-check"/>. Some of the auxiliary functions in these checks are
defined in <xref target="pine-auxiliary"/>.</t>
        <section anchor="valid-range-check">
          <name>Range Check</name>
          <t>In order to verify the range-checked results reported by the Client as described
in <xref target="encode-range-check"/>, the Aggregators will verify (1) <tt>v</tt> bits and <tt>u</tt> bits
are indeed composed of bits, as described in <xref target="valid-bit-check"/>, and (2) the
verify the decoded value from the <tt>v</tt> bits, and the decoded value from the <tt>u</tt>
bits sum up to <tt>B2 - B1</tt> (modulo <tt>q</tt>).</t>
          <t>If the Client skips sending the <tt>u</tt> bits as an optimization mentioned in
<xref target="encode-wr-check"/>, then the Aggregators only need to verify the decoded value
from the <tt>v</tt> bits is equal to <tt>B2 - B1</tt> (modulo <tt>q</tt>).</t>
        </section>
        <section anchor="valid-bit-check">
          <name>Bit Check</name>
          <t>The purpose of bit check on a field element is to prevent any computation
involving the field element from going out of range. For example, if we were
to compute the squared L2-norm from the bit representation claimed by the
Client, bit check ensures the decoded value from the bit representation is
at most <tt>2^(num_bits_for_norm) - 1</tt>.</t>
          <t>To run bit check on an array of field elements <tt>bit_checked</tt>, we use a
similar approach as <xref section="7.3.1.1" sectionFormat="of" target="VDAF"/>, by constructing a polynomial
from a random linear combination of the polynomial <tt>x(x-1)</tt> evaluated at each
element of <tt>bit_checked</tt>. We then evaluate the polynomial at a random point
<tt>r_bit_check</tt>, i.e., the joint randomness for bit check:</t>
          <artwork><![CDATA[
f(r_bit_check) = bit_checked[0] * (bit_checked[0] - 1) + \
  r_bit_check * bit_checked[1] * (bit_checked[1] - 1) + \
  r_bit_check^2 * bit_checked[2] * (bit_checked[2] - 1) + ...
]]></artwork>
          <t>If one of the entries in <tt>bit_checked</tt> is not a bit, then <tt>f(r_bit_check)</tt> is
non-zero with high probability.</t>
          <ul empty="true">
            <li>
              <t>TODO Put <tt>PineValid.eval_bit_check()</tt> implementation here.</t>
            </li>
          </ul>
        </section>
        <section anchor="valid-norm-check">
          <name>L2 Norm Check</name>
          <t>The purpose of L2 norm check is to check the squared L2-norm of the encoded
gradient is in the range of <tt>[0, encoded_sq_norm_bound]</tt>.</t>
          <t>The validity circuit verifies two properties of the L2 norm reported by the
Client:</t>
          <ul spacing="normal">
            <li>
              <t>Equality check: The squared norm computed from the encoded gradient is equal
to the bit representation reported by the Client. For this, the Aggregators
compute their shares of the squared norm from their shares of the encoded
gradient, and also decode their shares of the bit representation of the
squared norm (as defined above in <xref target="valid-bit-check"/>), and check that the
values are equal.</t>
            </li>
            <li>
              <t>Range check: The squared norm reported by the Client is in the desired range
<tt>[0, encoded_sq_norm_bound]</tt>. For this, the Aggregators run the range check
described in <xref target="valid-range-check"/>.</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>TODO Put <tt>PineValid.eval_norm_check()</tt> implementation here.</t>
            </li>
          </ul>
        </section>
        <section anchor="valid-wr-check">
          <name>Wraparound Check</name>
          <t>The purpose of wraparound check is to check the squared L2-norm of the encoded
Client gradient hasn't overflown the field modulus <tt>q</tt>.</t>
          <t>The validity circuit verifies two properties for wraparound checks:</t>
          <ul spacing="normal">
            <li>
              <t>Quadratic check (See bullet point 3 in Figure 2 of <xref target="ROCT23"/>): Recall in
<xref target="encode-wr-check"/>, the Client keeps track of a success bit for each
wraparound check, i.e., whether it has passed that check. For each check, the
Aggregators then verify a quadratic constraint that, either the success bit is
a <tt>0</tt> (i.e., the Client has failed that check), or the success bit is a <tt>1</tt>,
and the range-checked result reported by the Client is correct, based on the
wraparound check result (i.e., the dot product) computed by the Aggregators
from the encoded gradient and the random vector. For this, the Aggregators
multiply their shares of the success bit, and the difference of the
range-checked result reported by the Client, and that computed by the
Aggregators. We then construct a polynomial from a random linear combination
of the quadratic check at each wraparound check, and evaluate it at a random
point <tt>r_wr_check</tt>, the joint randomness.</t>
            </li>
            <li>
              <t>Success count check: The number of successful wraparound checks, by summing
the success bits, is equal to the constant <tt>num_wr_successes</tt>. For this, the
Aggregators sum their shares of the success bits for all wraparound checks.</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>TODO Put <tt>PineValid.eval_wr_check()</tt> implementation here.</t>
            </li>
          </ul>
        </section>
        <section anchor="putting-all-checks-together">
          <name>Putting All Checks Together</name>
          <t>Finally, we will construct a polynomial from a random linear combination of all
the checks from <tt>PineValid.eval_bit_checks()</tt>, <tt>PineValid.eval_norm_check()</tt>,
and <tt>PineValid.eval_wr_check()</tt>, and evaluate it at the final joint randomness
<tt>r_final</tt>. The full implementation of <tt>PineValid.eval()</tt> is as follows:</t>
          <ul empty="true">
            <li>
              <t>TODO Specify the implementation of <tt>Valid</tt> from <xref section="7.3.2" sectionFormat="of" target="VDAF"/>.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="vdaf">
      <name>The PINE VDAF</name>
      <t>This section describes PINE VDAF for <xref target="ROCT23"/>, a one-round VDAF with no
aggregation parameter. It takes a set of Client gradients expressed as vectors
of floating point values, and computes an element-wise summation of valid
gradients with bounded L2-norm configured by the user parameters in
<xref target="pine-user-param"/>. The VDAF largely uses the encoding and validation schemes
in <xref target="flp"/>, and also specifies how the joint randomness shared between the
Client and Aggregators is derived. There are two kinds of joint randomness used:</t>
      <ul spacing="normal">
        <li>
          <t>"Verification joint randomness": These are the field elements used by the
Client and Aggregators to evaluate the FLP circuit. The verification joint
randomness is derived similar to the joint randomness in Prio3
<xref section="7.2.1.2" sectionFormat="of" target="VDAF"/>: the XOF is applied to each secret share of the
encoded measurement to derive the "part"; and the parts are hashed together,
using the XOF once more, to get the seed for deriving the joint randomness
itself.</t>
        </li>
        <li>
          <t>"Wraparound joint randomness": This is used to generate the random vectors in
the wraparound checks that both the Clients and Aggregators need to derive on
their own. It is generated in much the same way as the verification joint
randomness, except that only the gradient and the range-checked norm are used
to derive the parts.</t>
        </li>
      </ul>
      <t>In order for the Client to shard its gradient into input shares for the
Aggregators, the Client first encodes its gradient into field elements, and
encodes the range-checked L2-norm, according to <xref target="encode-gradient-and-norm"/>.
Next, it derives the wraparound joint randomness for the wraparound checks as
described above, and uses that to encode the range-checked, wraparound check
results as described in <xref target="encode-wr-check"/>}. The encoded gradient,
range-checked norm, and range-checked wraparound check results will be
secret-shared to (1) be sent as input shares for the Aggregators, and (2) derive
the verification joint randomness as described above. The Client then generates
the proof with the FLP and secret shares it. The secret-shared proof, along with
the input shares, and the joint randomness parts for both wraparound and
verification joint randomness, are sent to the Aggregators.</t>
      <t>Then the Aggregators carry out a multi-party computation to obtain the output
shares (the secret shares of the encoded Client gradient), and also reject
Client gradients that have invalid L2-norm. Each Aggregator first needs to
derive wraparound and verification joint randomness. Similar to Prio3
preparation <xref section="7.2.2" sectionFormat="of" target="VDAF"/>, the Aggregator does not derive every
joint randomness part like the Client does. It only derives the joint
randomness part from its secret share via the XOF, and applies its part and
and other Aggregators' parts sent by the Client to the XOF to obtain the joint
randomness seed. Then each Aggregator runs the wraparound checks
<xref target="run-wr-check"/> with its share of encoded gradient and the wraparound joint
randomness, and queries the FLP with its input share, proof share, the
wraparound check results, and the verification joint randomness. All Aggregators
then exchange the results from the FLP and decide whether to accept that Client
gradient.</t>
      <t>Next, each Aggregator sums up their shares of the encoded gradients and sends
the aggregate share to the Collector. Finally, the Collector sums up the
aggregate shares to obtain the aggregate result, and decodes it into an array
of floating point values.</t>
      <t>Like Prio3 <xref section="7.1.2" sectionFormat="of" target="VDAF"/>, PINE supports generation and verification
of multiple FLPs. The goal is to improve robustness of PINE (Corollary 3.13 in
<xref target="ROCT23"/>) by generating multiple unique proofs from the Client, and
only accepting the Client gradient if all proofs have been verified by the
Aggregators. The benefit is that one can improve the communication cost between
Clients and Aggregators, by instantiating PINE FLP with a smaller field, but
repeating the proof generation (<tt>Flp.prove</tt>) and validation (<tt>Flp.query</tt>)
multiple times.</t>
      <t>The remainder of this section is structured as follows. We will specify the
exact algorithms for Client sharding <xref target="sharding"/>, Aggregator preparation
<xref target="preparation"/> and aggregation <xref target="aggregation"/>, and Collector unsharding
<xref target="unsharding"/>.</t>
      <section anchor="sharding">
        <name>Sharding</name>
        <ul empty="true">
          <li>
            <t>TODO Specify the implementation of <tt>Vdaf.shard()</tt>.</t>
          </li>
        </ul>
      </section>
      <section anchor="preparation">
        <name>Preparation</name>
        <ul empty="true">
          <li>
            <t>TODO Specify the implementations of <tt>Vdaf.prep_init()</tt>,
<tt>.prep_shares_to_prep()</tt>, and <tt>.prep_next()</tt>.</t>
          </li>
        </ul>
      </section>
      <section anchor="aggregation">
        <name>Aggregation</name>
        <ul empty="true">
          <li>
            <t>TODO Specify the implementation of <tt>Vdaf.aggregate()</tt>.</t>
          </li>
        </ul>
      </section>
      <section anchor="unsharding">
        <name>Unsharding</name>
        <ul empty="true">
          <li>
            <t>TODO Specify the implementation of <tt>Vdaf.unshard()</tt>.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="variants">
      <name>Variants</name>
      <ul empty="true">
        <li>
          <t>TODO Specify concrete parameterizations of VDAFs, including the choice of
field, number of proofs, and valid ranges for the parameters in
<xref target="pine-user-param"/>.</t>
        </li>
      </ul>
    </section>
    <section anchor="pine-auxiliary">
      <name>PINE Auxiliary Functions</name>
      <ul empty="true">
        <li>
          <t>TODO Put all auxiliary functions here, including <tt>range_check()</tt>,
<tt>parallel_sum()</tt>.</t>
        </li>
      </ul>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Our security considerations for PINE are the same as those for Prio3 described
in <xref section="9" sectionFormat="of" target="VDAF"/>.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <ul empty="true">
        <li>
          <t>TODO Ask IANA to allocate an algorithm ID from the VDAF algorithm ID registry.</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="VDAF">
          <front>
            <title>Verifiable Distributed Aggregation Functions</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="David Cook" initials="D." surname="Cook">
              <organization>ISRG</organization>
            </author>
            <author fullname="Christopher Patton" initials="C." surname="Patton">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Phillipp Schoppmann" initials="P." surname="Schoppmann">
              <organization>Google</organization>
            </author>
            <date day="20" month="November" year="2023"/>
            <abstract>
              <t>   This document describes Verifiable Distributed Aggregation Functions
   (VDAFs), a family of multi-party protocols for computing aggregate
   statistics over user measurements.  These protocols are designed to
   ensure that, as long as at least one aggregation server executes the
   protocol honestly, individual measurements are never seen by any
   server in the clear.  At the same time, VDAFs allow the servers to
   detect if a malicious or misconfigured client submitted an
   measurement that would result in an invalid aggregate result.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-vdaf-08"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <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"/>
            <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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="BBCGGI19" target="https://ia.cr/2019/188">
          <front>
            <title>Zero-Knowledge Proofs on Secret-Shared Data via Fully Linear PCPs</title>
            <author initials="D." surname="Boneh">
              <organization/>
            </author>
            <author initials="E." surname="Boyle">
              <organization/>
            </author>
            <author initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author initials="N." surname="Gilboa">
              <organization/>
            </author>
            <author initials="Y." surname="Ishai">
              <organization/>
            </author>
            <date year="2019"/>
          </front>
          <seriesInfo name="CRYPTO 2019" value=""/>
        </reference>
        <reference anchor="MR17" target="https://ai.googleblog.com/2017/04/federated-learning-collaborative.html">
          <front>
            <title>Federated Learning: Collaborative Machine Learning without Centralized Training Data</title>
            <author initials="B." surname="McMahan">
              <organization/>
            </author>
            <author initials="D." surname="Ramage">
              <organization/>
            </author>
            <date year="2017"/>
          </front>
        </reference>
        <reference anchor="Lem12" target="https://www.elibm.org/article/10011456">
          <front>
            <title>Cauchy and the gradient method</title>
            <author initials="C." surname="Lemaréchal">
              <organization/>
            </author>
            <date year="2012"/>
          </front>
        </reference>
        <reference anchor="ROCT23" target="https://arxiv.org/abs/2311.10237">
          <front>
            <title>PINE: Efficient Norm-Bound Verification for Secret-Shared Vectors</title>
            <author initials="G. N." surname="Rothblum">
              <organization/>
            </author>
            <author initials="E." surname="Omri">
              <organization/>
            </author>
            <author initials="J." surname="Chen">
              <organization/>
            </author>
            <author initials="K." surname="Talwar">
              <organization/>
            </author>
            <date year="2023"/>
          </front>
        </reference>
        <reference anchor="Tal22" target="https://arxiv.org/abs/2202.10618">
          <front>
            <title>Differential Secrecy for Distributed Data and Applications to Robust Differentially Secure Vector Summation</title>
            <author initials="K." surname="Talwar">
              <organization/>
            </author>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="IEEE754-2019" target="https://ieeexplore.ieee.org/document/8766229">
          <front>
            <title>IEEE Standard for Floating-Point Arithmetic</title>
            <author>
              <organization/>
            </author>
            <date year="2019"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 655?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Guy Rothblum
Apple Inc.
gn_rothblum@apple.com</t>
      <t>Kunal Talwar
Apple Inc.
ktalwar@apple.com</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
gyr1Q408qvxFPO/zi4oeeZ/+H14uoO4wdwAA

-->

</rfc>
