<?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.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ppm-l1-bound-sum-01" 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-01"/>
    <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="February" day="19"/>
    <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;
  uint32 max_value;
  uint32 chunk_length;
} Prio3L1BoundSumConfig;
]]></sourcecode>
      </figure>
      <t>This configuration is three 32-bit 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="30" month="January" 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-18"/>
        </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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
KQAA

-->

</rfc>
