<?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.23 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-chen-cfrg-vdaf-pine-02" category="info" consensus="true" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.26.0 -->
  <front>
    <title>Private Inexpensive Norm Enforcement (PINE) VDAF</title>
    <seriesInfo name="Internet-Draft" value="draft-chen-cfrg-vdaf-pine-02"/>
    <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="2025" month="February" 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">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,
  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, 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, 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 anchor="sec-combined-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="22" month="August" year="2024"/>
            <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-11"/>
        </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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
9UONPKr85Tvv84uKHnmf/h+5hX8CGHcAAA==

-->

</rfc>
