<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ppm-l1-bound-sum-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <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-ietf-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="2025" month="November" day="03"/>
    <area>Security</area>
    <workgroup>Privacy Preserving Measurement</workgroup>
    <keyword>vectors</keyword>
    <keyword>manhattan</keyword>
    <keyword>multi-dimensional</keyword>
    <abstract>
      <?line 48?>

<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-ietf-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 55?>

<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 a 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="CGB17"/>
supports the addition of a vector of integers.</t>
      <t>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_vec(v, self.bits)
    w_bits = self.field.encode_into_bit_vec(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 output share
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_vec(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.int() 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_vec(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>0x00000007</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="17" month="June" year="2025"/>
            <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 invalid
   measurement.  Two concrete VDAFs are specified, one for general-
   purpose aggregation (Prio3) and another for heavy hitters (Poplar1).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-vdaf-15"/>
        </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="CGB17" target="https://dl.acm.org/doi/10.5555/3154630.3154652">
          <front>
            <title>Prio: Private, Robust, and Scalable Computation of Aggregate Statistics</title>
            <author initials="D." surname="Boneh" fullname="Dan Boneh">
              <organization/>
            </author>
            <author initials="H." surname="Corrigan-Gibbs" fullname="Henry Corrigan-Gibbs">
              <organization/>
            </author>
            <date year="2017"/>
          </front>
          <refcontent>USENIX Symposium on Networked Systems Design and Implementation (NSDI)</refcontent>
        </reference>
      </references>
    </references>
    <?line 289?>

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

-->

</rfc>
