<?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-thomson-ppm-l1-bound-sum-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="Prio L1 Bound Sum">A Prio Instantiation for Vector Sums with an L1 Norm Bound on Contributions</title>
    <seriesInfo name="Internet-Draft" value="draft-thomson-ppm-l1-bound-sum-00"/>
    <author fullname="Martin Thomson">
      <organization>Mozilla</organization>
      <address>
        <email>mt@lowentropy.net</email>
      </address>
    </author>
    <author fullname="David Cook">
      <organization>ISRG</organization>
      <address>
        <email>divergentdave@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="October" day="18"/>
    <area>Security</area>
    <workgroup>Privacy Preserving Measurement</workgroup>
    <keyword>vectors</keyword>
    <keyword>manhattan</keyword>
    <keyword>multi-dimensional</keyword>
    <abstract>
      <?line 41?>

<t>A Prio Verifiable Distributed Aggregation Function is defined
that supports vector or histogram addition,
where the sum of the values in the contribution is less than a chosen value.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://martinthomson.github.io/prio-l1-bound-sum/draft-thomson-ppm-l1-bound-sum.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-thomson-ppm-l1-bound-sum/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Privacy Preserving Measurement Working Group mailing list (<eref target="mailto:ppm@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ppm/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/ppm/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/martinthomson/prio-l1-bound-sum"/>.</t>
    </note>
  </front>
  <middle>
    <?line 48?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Existing Prio instantiations of a Verifiable Distributed Aggregation Function (VDAF)
<xref target="VDAF"/>
all support a simple summation of measurements.
From Prio3Count (<xref section="7.4.1" sectionFormat="of" target="VDAF"/>),
which adds measurements containing a single one or a zero value,
to Prio3SumVec (<xref section="7.4.3" sectionFormat="of" target="VDAF"/>),
which adds measurements containing an vector where each dimension is a limited number of bits,
all instantations take the same basic form.</t>
      <t>One case that is presently not included in the suite of instantiations
is the addition of vectors or histogram contributions,
where each measurement has an L1 bound.
The L1 norm of a vector is defined as the sum of its components.
An L1 bound limits that sum to some maximum.</t>
      <t>This document defines the Prio3L1BoundSum instantiation.
This instantiation limits the L1 norm of a vector or histogram
to a value that is one less than a chosen power of 2,
or 2<sup>n</sup>-1.
This choice significantly reduces the size of the encoding
relative to a more flexible limit.</t>
      <t>This instantiation has similarities with other instantiations.
Unlike Prio3Histogram (<xref section="7.4.4" sectionFormat="of" target="VDAF"/>),
in which measurements need to have an L1 norm of exactly 1,
a valid measurement for Prio3L1BoundSum can have an L1 norm equal to any value
between 0 and the chosen limit.
Unlike Prio3MultiHotCountVec (<xref section="7.4.5" sectionFormat="of" target="VDAF"/>),
in which each component can only be zero or one,
components in Prio3L1BoundSum can take any value up to the L1 bound
as long as their sum is within that bound.</t>
      <t><xref target="def"/> defines the Prio3L1BoundSum VDAF.</t>
    </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 terminology and functions defined in <xref section="2" sectionFormat="of" target="VDAF"/>.</t>
    </section>
    <section anchor="def">
      <name>Prio3L1BoundSum Definition</name>
      <t>The Prio3L1BoundSum instantiation of Prio <xref target="PRIO"/>
supports the addition of a vector of integers.
The instantiation is summarized in <xref target="_table-l1-bound-sum"/>.</t>
      <table anchor="_table-l1-bound-sum">
        <name>Prio3L1BoundSum Parameters</name>
        <thead>
          <tr>
            <th align="left">Parameter</th>
            <th align="left">Value</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">field</td>
            <td align="left">Field128 (<xref section="6.1.2" sectionFormat="of" target="VDAF"/>)</td>
          </tr>
          <tr>
            <td align="left">Valid</td>
            <td align="left">L1BoundSum(field, length, bits, chunk_length)</td>
          </tr>
          <tr>
            <td align="left">PROOFS</td>
            <td align="left">1</td>
          </tr>
          <tr>
            <td align="left">XOF</td>
            <td align="left">XofTurboShake128 (<xref section="6.2.1" sectionFormat="of" target="VDAF"/>)</td>
          </tr>
        </tbody>
      </table>
      <t>The function takes three parameters:
<tt>length</tt>, <tt>bits</tt>, and <tt>chunk_length</tt>.
The vector contains "<tt>length</tt>" components,
each of which is a non-negative integer less than 2<sup><tt>bits</tt></sup>.</t>
      <section anchor="chunk-length-selection">
        <name>Chunk Length Selection</name>
        <t>The <tt>chunk_length</tt> parameter can be chosen
in approximately the same way as for Prio3SumVec,
as detailed in <xref section="7.4.3.1" sectionFormat="of" target="VDAF"/>.
The difference is that Prio3L1BoundSum involves validation of
<tt>bits * (length + 1)</tt> values,
which might increase the most efficient value for <tt>chunk_length</tt>.</t>
      </section>
      <section anchor="encoding-and-decoding">
        <name>Encoding and Decoding</name>
        <t>The encoded form of each measurement appends a bitwise decomposition
of the L1 norm (the sum of the vector components) to the encoding:</t>
        <sourcecode type="python"><![CDATA[
def encode(self, measurement: list[int]) -> list[F]:
    encoded = []
    weight = self.field(0)
    for v in measurement:
        weight += v
        encoded += self.field.encode_into_bit_vector(v, self.bits)
    w_bits = self.field.encode_into_bit_vector(weight, self.bits)
    return encoded + w_bits
]]></sourcecode>
        <t>The encoded measurement has a total length of <tt>(length + 1) * bits</tt>.</t>
        <t>This extra information is not included in the measurement
that is submitted for aggregation.
That is, the <tt>truncate()</tt> function emits only the core measurements.</t>
        <sourcecode type="python"><![CDATA[
def truncate(self, meas: list[F]) -> list[F]:
    return [
       self.field.decode_from_bit_vector(m)
       for m in chunks(meas, self.bits)
    ]
]]></sourcecode>
        <t>This uses a <tt>chunks(v, c)</tt> function that takes a list of values, <tt>v</tt>,
and a chunk length, <tt>c</tt>,
to split <tt>v</tt> into multiple lists from <tt>v</tt>,
where each chunk has a length <tt>c</tt>.</t>
        <t>The <tt>decode()</tt> function is therefore identical to that in Prio3SumVec.</t>
        <sourcecode type="python"><![CDATA[
def decode(self, output: list[F], _count) -> list[int]:
    return [x.as_unsigned() for x in output)
]]></sourcecode>
      </section>
      <section anchor="validity-circuit">
        <name>Validity Circuit</name>
        <t>The validity circuit for Prio3L1BoundSum uses an extended version
of the validity circuit used by Prio3SumVec,
see <xref section="7.4.3" sectionFormat="of" target="VDAF"/>.</t>
        <t>The encoded measurement is checked
to ensure that every component of the vector –
plus the added L1 norm –
is encoded in the specified number of bits.
That is, the circuit checks that each component has a value between
0 (inclusive) and 2<sup><tt>bits</tt></sup> (exclusive)
by checking that each of the first "<tt>bits</tt>" bits of the value
are either zero or one.
This process is identical to the Prio3SumVec check,
except that one additional value is checked.</t>
        <t>The validity circuit then checks whether the added L1 norm value
is consistent with the encoded vector elements.
The L1 norm is checked by decoding the measurement values,
including the encoded L1 norm,
recomputing the L1 norm as the sum of the individual components, and
subtracting the reported and computed values
to confirm that they are identical.</t>
        <t>The complete circuit is specified in <xref target="fig-eval"/>.</t>
        <figure anchor="fig-eval">
          <name>Evaluation function for Prio3L1BoundSum</name>
          <sourcecode type="python"><![CDATA[
def eval(self, meas: list[F],
         joint_rand: list[F], num_shares: int) -> list[F]:
    assert len(meas) == (self.length + 1) * self.bits
    shares_inv = self.field(num_shares).inv()
    parallel_sum = ParallelSum(Mul(), chunk_length)

    num_chunks = ceil(len(meas) / self.chunk_length)
    pad_len = self.chunk_length * num_chunks - len(meas)
    meas += [self.field(0)] * pad_len

    range_check = self.field(0)
    for (r, m) in zip(joint_rand, chunks(meas, self.chunk_length)):
        inputs = []
        for i in range(self.chunk_length):
            inputs += [
                r**(i + 1) * m[i],
                m[i] - shares_inv,
            ]
        range_check += parallel_sum.eval(self.field, inputs)

    components = [
        self.field.decode_from_bit_vector(m)
        for m in chunks(meas, self.bits)
    ]
    observed_weight = sum(components[:self.length])
    claimed_weight = components[self.length]
    weight_check = observed_weight - claimed_weight

    return [range_check, weight_check]
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The Prio3L1BoundSum VDAF is subject to the same considerations
as other Prio-based VDAFs.
These considerations are detailed in <xref section="9" sectionFormat="of" target="VDAF"/>.</t>
      <t>In particular, this instantiation uses Field128 to ensure robustness
despite the use of joint randomness in proofs.
Joint randomness increases the risk of an attacker finding
a combination of invalid inputs that passes validation.
A larger field increases the computational cost
of finding such a combination.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document registers a codepoint for Prio3L1BoundSum
in the "Verifiable Distributed Aggregation Functions (VDAF)" registry
as defined by <xref section="10" sectionFormat="of" target="VDAF"/>.
This entry contains the following fields:</t>
      <dl spacing="compact">
        <dt>Value:</dt>
        <dd>
          <t>0xTBD</t>
        </dd>
        <dt>Scheme:</dt>
        <dd>
          <t>Prio3L1BoundSum</t>
        </dd>
        <dt>Type:</dt>
        <dd>
          <t>VDAF</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t>RFCXXXX (this document)</t>
        </dd>
      </dl>
    </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="4" month="October" 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-12"/>
        </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="PRIO">
          <front>
            <title>Prio: private, robust, and scalable computation of aggregate statistics</title>
            <author fullname="Henry Corrigan-Gibbs" initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author fullname="Dan Boneh" initials="D." surname="Boneh">
              <organization/>
            </author>
            <date month="March" year="2017"/>
          </front>
          <seriesInfo name="Proceedings of the 14th USENIX Conference on Networked Systems Design and Implementation" value="pp. 259–282"/>
          <seriesInfo name="ISBN" value="9781931971379"/>
          <refcontent>USENIX Association</refcontent>
        </reference>
      </references>
    </references>
    <?line 281?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>David Cook and Chris Patton provided extensive input
into the construction of this VDAF.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
