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

<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://ietf-wg-ppm.github.io/draft-ietf-ppm-l1-bound-sum/draft-ietf-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/ietf-wg-ppm/draft-ietf-ppm-l1-bound-sum"/>.</t>
    </note>
  </front>
  <middle>
    <?line 57?>

<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 less than or equal to a predetermined maximum.</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, notation conventions, 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.
It also uses <tt>bit_length()</tt>,
which returns the minimum number of bits
needed to encode an integer value.</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, max, 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>max_value</tt>, and <tt>chunk_length</tt>.
The vector contains "<tt>length</tt>" components,
each of which is a non-negative integer less than or equal to <tt>max_value</tt>.</t>
      <t>The value of <tt>max_value</tt> can be any positive integer.
A value of 1 causes Prio3L1BoundSum
to be nearly identical to Prio3Histogram,
except that Prio3Histogram cannot encode an all-zero report.</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,
where <tt>bits = max_value.bit_length()</tt>.
This might increase the most efficient value for <tt>chunk_length</tt>
relative to a similar encoding of Prio3SumVec.</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 = []
    erci = encode_range_checked_int
    for v in measurement:
        encoded += erci(self.field, v, self.max_value)
    weight = erci(self.field, sum(measurement), self.max_value)
    return encoded + weight
]]></sourcecode>
        <t>The encoded measurement has a total length of <tt>(length + 1) * bits</tt>.</t>
        <t>The encoding function <tt>encode_range_checked_int</tt>
is described in <xref section="7.4.2" sectionFormat="of" target="VDAF"/>.</t>
        <t>The encoded 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 [
       decode_range_checked_int(self.field, m, self.max_value)
       for m in chunks(meas, self.max_value.bit_length())
    ]
]]></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 <tt>max_value</tt> (exclusive)
by first checking the value is correctly composed from bits,
where each bit is 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 L1 norm.
The decoded values are used to recompute the L1 norm
as the sum of the individual components.
The difference between reported and computed values
is checked to confirm that the values 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]:
    bits = self.max_value.bit_length()
    assert len(meas) == (self.length + 1) * 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)

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

    return [range_check, weight_check]
]]></sourcecode>
        </figure>
        <t>This evaluation uses the <tt>decode_range_checked_int()</tt> function
defined in <xref section="7.4.2" sectionFormat="of" target="VDAF"/>.</t>
      </section>
    </section>
    <section anchor="dap">
      <name>DAP Integration</name>
      <t>The integration of Prio3L1BoundSum in DAP <xref target="DAP"/>
requires the definition of an encoding
for the configuration of the VDAF.
<xref target="fig-config"/> defines the encoding of <tt>Prio3L1BoundSumConfig</tt>,
using the syntax definitions from <xref section="3" sectionFormat="of" target="RFC8446"/>.</t>
      <figure anchor="fig-config">
        <name>VDAF Configuration Encoding for Prio3L1BoundSum</name>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint32 length;
  uint64 max_value;
  uint32 chunk_length;
} Prio3L1BoundSumConfig;
]]></sourcecode>
      </figure>
      <t>This configuration is three integers,
each in network byte order,
with semantics described in <xref target="def"/>,
as follows:</t>
      <dl>
        <dt>length:</dt>
        <dd>
          <t>The total number of values in each measurement.</t>
        </dd>
        <dt>max_value:</dt>
        <dd>
          <t>The maximum value, inclusive,
for the sum of all measurement values.</t>
        </dd>
        <dt>chunk_length:</dt>
        <dd>
          <t>The size of each chunk used in the evaluation circuit;
see <xref target="fig-eval"/>.</t>
        </dd>
      </dl>
    </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="14" month="April" year="2026"/>
            <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-19"/>
        </reference>
        <reference anchor="DAP">
          <front>
            <title>Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
            <author fullname="Tim Geoghegan" initials="T." surname="Geoghegan">
              <organization>ISRG</organization>
            </author>
            <author fullname="Christopher Patton" initials="C." surname="Patton">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Brandon Pitman" initials="B." surname="Pitman">
              <organization>ISRG</organization>
            </author>
            <author fullname="Eric Rescorla" initials="E." surname="Rescorla">
              <organization>Independent</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="30" month="January" year="2026"/>
            <abstract>
              <t>   There are many situations in which it is desirable to take
   measurements of data which people consider sensitive.  In these
   cases, the entity taking the measurement is usually not interested in
   people's individual responses but rather in aggregated data.
   Conventional methods require collecting individual responses and then
   aggregating them on some server, thus representing a threat to user
   privacy and rendering many such measurements difficult and
   impractical.  This document describes a multi-party Distributed
   Aggregation Protocol (DAP) for privacy preserving measurement which
   can be used to collect aggregate data without revealing any
   individual contributor's data.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-17"/>
        </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>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </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 346?>

<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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
AAA=

-->

</rfc>
