<?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.19 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-chen-cfrg-vdaf-pine-01" category="info" consensus="true" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.1 -->
  <front>
    <title>Private Inexpensive Norm Enforcement (PINE) VDAF</title>
    <seriesInfo name="Internet-Draft" value="draft-chen-cfrg-vdaf-pine-01"/>
    <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="September" day="25"/>
    <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:
H4sIAAAAAAAAA+Vd23rbRpK+76fopS8iJSRtyk4ccyaekeVDNPFpZCeTmaxH
BMEmiREIMDhI1iieZ9nbfY3dF9s6daMbAGl7btdfvi8SgD5VV/9V9Xd1azQa
qSqpUjPVg9dFchlVRp9m5v3WZGVyafTLvNjoJ9kyL2KzMVmlD16fvnxyqH96
fPx0oGL4fJUX11OdwCdKLfI4izZQ16KIltUoXptsFC+L1ehyES1H2yQzozsT
VdbzTVKWSZ5V11v4+PTs7VOtb+koLXPoRpItDDS/gNYGQz04PX4E/8sL+Am+
G6is3sxNMVULaHuq4jwroat1OdVVURt1OdV3VVSYaGq/v8qLi1WR11t4clJc
b6tcP82LejNQF+YaXi6mSo80DLnSK5OZIqqgY/iozpI4L+jHchsVF2mSrfQi
KasimdeVWejULFamUJcmq6EnWve3ojWPcnBmShMV8Vo/w+/wxSZKUniBEvpj
YqrlOC9W+By/gufrqtqW09u38TN8BPMxtp/dxge3ucLbfzD4yXkKffsOK8M6
Vkm1rudQyz/q7NrgTEwePPjm9s6JwTIpiLSsvJaDsmOucpzku2vZ/Wa8rjbp
QKmortZ5gTKHBulfksHk/WmsT6CQfcZa9CdsPngOI4+y5J80R1N9vN2mqK7x
2L43IlLu+B8j/GAc5zAN7QZPxvp1VFV5q8mTdQFSzLdrU7Teh02fpHm9WMK0
mFbTMVawpZJf4WT9cYXPsQ9KZbCYoPwlaIvCBdP8pvWjRyfPnp1OHkypPrsk
/2aKfPRDll+RrunXRZ4vS51n+o2JC1ON3qyhBwv9OKoifZlE+mmdptf6Ocg7
gv6fvC4HVJ0TOv0bsQQej/WjPDPr8OkTfHqdmvDp9zA9eVEkIILRs2Q+L8PX
L8f6WZLO8yh8/NexPi3XUUJPab3qozuTB/RraYrElCgFEObZX1+/fdW8q6Ji
ZUAPrRom0TgubuPr25Nvv0VpvTib3A8l9dQscO2CMJ7D2DNYq1BvnqbRPC9I
yvpFBEsoM+69vgJ9zutKnwDSFFGa/BMKvy2ihF6iSPcI79FYv4hfROso6wj1
LNpEKxOO+X7vuKJkvMrzVWrmab5CFcEx3r99597tpR3NKJXejmJ/MLSaUBDP
zWZyFEriJKrj9bWOsoWu1gZQKVokiNwbA+NY7BkTLAmoLir+97/jdZSGAzjq
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
+qFGHlX+8p33+UVFj7xP/w+A8QaCGHcAAA==

-->

</rfc>
