<?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.1 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mouris-cfrg-mastic-01" category="info" consensus="true" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="Mastic">The Mastic VDAF</title>
    <seriesInfo name="Internet-Draft" value="draft-mouris-cfrg-mastic-01"/>
    <author fullname="Hannah Davis">
      <organization>Seagate</organization>
      <address>
        <email>hannah.e.davis@seagate.com</email>
      </address>
    </author>
    <author fullname="Dimitris Mouris">
      <organization>University of Delaware</organization>
      <address>
        <email>jimouris@udel.edu</email>
      </address>
    </author>
    <author initials="C." surname="Patton" fullname="Christopher Patton">
      <organization>Cloudflare</organization>
      <address>
        <email>chrispatton+ietf@gmail.com</email>
      </address>
    </author>
    <author fullname="Pratik Sarkar">
      <organization>Supra Research</organization>
      <address>
        <email>pratik93@bu.edu</email>
      </address>
    </author>
    <author fullname="Nektarios G. Tsoutsos">
      <organization>University of Delaware</organization>
      <address>
        <email>tsoutsos@udel.edu</email>
      </address>
    </author>
    <date year="2023" month="October" day="23"/>
    <area>IRTF</area>
    <workgroup>Crypto Forum</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 77?>

<t>This document describes Mastic, a two-party VDAF for the following aggregation
task: each client holds a string, and the collector wishes to count how many of
these strings begin with a given prefix. Such a VDAF can be used to solve the
private heavy hitters problem, where the goal is to compute the subset of the
strings that occur most frequently without learning which client holds which
string. This document also describes different modes of operation for Mastic
that support additional use cases and admit various performance and security
trade-offs.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-mouris-cfrg-mastic/"/>.
      </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/jimouris/draft-mouris-cfrg-mastic"/>.</t>
    </note>
  </front>
  <middle>
    <?line 88?>

<section anchor="introduction">
      <name>Introduction</name>
      <ul empty="true">
        <li>
          <t>TO BE REMOVED BY RFC EDITOR: The source for this draft and the reference code
can be found at https://github.com/jimouris/draft-mouris-cfrg-mastic.</t>
        </li>
      </ul>
      <t>The "private heavy hitters" problem is to recover the most popular measurements
generated by clients without learning the measurements themselves. For
example, a browser vendor might want to know which websites are visited most
frequently without learning which clients visited which websites.</t>
      <t>For string measurements, this problem can be solved by combining a binary
search with a subroutine solving the "private prefix histogram" subproblem. The
goal of this subproblem is to compute a histogram over the fixed-length
prefixes of client measurement strings without revealing the prefixes. The
subproblem can be solved using a Verifiable Distributed Aggregation Function,
or VDAF <xref target="VDAF"/>. In particular, the Poplar1 VDAF
described in <xref section="8" sectionFormat="of" target="VDAF"/> describes how to distribute this
computation amongst a small set of aggregation servers such that, as long as
one server is honest, no individual measurement is observed in the clear. At
the same time, Poplar1 allows the servers to detect and remove any invalid
measurements that would otherwise corrupt the computation of the histogram.</t>
      <t>This document describes Mastic, a VDAF that can be used as a drop-in
replacement for Poplar1, while offering improved performance and communication
cost. [CP: We'll need numbers to back this up.] Based on the PLASMA protocol
<xref target="MST23"/>, the scheme's design also improves communication complexity, requiring
just one round for report preparation compared to Poplar1's two rounds. Mastic
is specified in <xref target="vdaf"/>.</t>
      <t>Mastic is also highly extensible. Like Poplar1, Mastic's core functionality is
to compute prefix histograms. Mastic allows this basic counter data type to be
generalized to support a wide variety of secure aggregation tasks. In
particular, Mastic supports any data type that can be expressed as a type for
the Prio3 VDAF <xref section="7" sectionFormat="of" target="VDAF"/>. For example, the counter could be
replaced with a bounded weight (say, representing a dollar amount) such that
the heaviest "weight" measurements are recovered. We describe this mode of
operation in <xref target="weighted-heavy-hitters"/>.</t>
      <t>This generalization also allows Mastic to support another important use case. A
desirable feature for a secure aggregation systems is the ability to "drill
down" on the data by splitting up the aggregate based on specific properties of
the clients. For example, a browser vendor may wish to partition aggregates by
version (different versions of the browser may have different performance
profiles) or geographic location. We will call these properties "labels". [CP:
See https://github.com/ietf-wg-ppm/draft-ietf-ppm-dap/issues/489 for the
discussion that originally motivated this idea.]</t>
      <t>Aggregating by labels requires representing the information in such a way that
that measurements submitted by clients with the same label are aggregated
together. Prio3 can be adapted for this purpose, but the communication cost
would be linear in the number of possible distinct labels, which quickly
becomes prohibitive if the label space is large or subject to change over time.
For example, the label might encode the client's user agent (<xref section="10.1.5" sectionFormat="of" target="RFC9110"/>), a value can vary widely and that changes over time.</t>
      <t>Mastic encodes the label and measurement with constant communication overhead
such that, for an arbitrary sequence of labels, the reports can be "queried" to
reveal the aggregate for each label without learning the label or measurement
of any client. We describe this mode of operation in <xref target="aggregation-by-labels"/>.</t>
      <t>Finally, we describe two modes of operation for Mastic that admit useful
performance and security trade-offs.</t>
      <t>First, we describe an optimization for plain (i.e., non-weighted) heavy hitters
that, in the best case, reduces the communication cost of preparation from
linear in the number of reports to constant, leading to a dramatic improvement
in performance compared to Poplar1. This best-case behavior is observed when
all clients behave honestly: if a fraction of the clients submit invalid
reports, then additional rounds of communication are required in order to
isolate the invalid reports and remove them. We describe this idea in detail in
<xref target="plain-heavy-hitters-with-proof-aggregation"/>.</t>
      <t>Second, in <xref target="malicious-security-with-three-aggregators"/> we describe an
enhancement that allows Mastic to achieve robustness in the presence of a
malicious Aggregator. Rather than two aggregation servers as in the previous
modes, this mode of operation involves three Aggregators, where every pair of
Aggregators communicate over a different channel. Using a third Aggregator, we
can lift the security of Mastic from the semi-honest setting to malicious
security. While more complex to implement than 2-party Mastic, this mode allows
achieves "full security", where both privacy and robustness hold in the honest
majority setting.</t>
    </section>
    <section anchor="conventions">
      <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 following terms as defined in <xref target="VDAF"/>:
"Aggregator",
"Client",
"Collector",
"aggregate result",
"aggregate share",
"aggregation parameter",
"batch",
"input share",
"measurement",
"output share",
"prep message",
"prep share", and
"report".</t>
      <t>In Mastic, a Client's VDAF measurement comprises two components, which we denote
<tt>alpha</tt> and <tt>beta</tt>. The function that each component serves depends on the use
case: for weighted (<xref target="weighted-heavy-hitters"/>) and plain
(<xref target="plain-heavy-hitters-with-proof-aggregation"/>) heavy-hitters, we shall refer
to <tt>alpha</tt> as the "payload" and <tt>beta</tt> as the payload's "weight"; for
aggregation-by-labels (<xref target="aggregation-by-labels"/>), we shall refer to <tt>alpha</tt> as
the "label" and to <tt>beta</tt> as the "payload". When doing so is unambiguous, we may
also refer to the payload as the "measurement".</t>
      <t>The DPF tree always has as a root the "empty string", which in turn has strings
"0" and "1" as the left and right children, respectively.</t>
    </section>
    <section anchor="preliminaries">
      <name>Preliminaries</name>
      <t>Mastic makes use of three primitives described in the base VDAF specification
<xref target="VDAF"/>: finite fields, eXtendable Output Functions (XOFs), and Fully Linear
Proofs (FLPs). It also makes use of a fourth primitive, which extends the
security properties of Incremental Distributed Point Functions (IDPFs), also
described in the base specification. All four primitives are described below.</t>
      <section anchor="field">
        <name>Finite fields</name>
        <t>An implementation of the <tt>Field</tt> interface in <xref section="6.1" sectionFormat="of" target="VDAF"/> is
required. This object implements arithmetic in a prime field with a modulus
suitable for use with the Number Theoretic Transform (called "FFT-friendly" in
<xref target="VDAF"/>).</t>
      </section>
      <section anchor="xof">
        <name>XOF</name>
        <t>An implementation of the <tt>Xof</tt> interface in <xref section="6.2" sectionFormat="of" target="VDAF"/> is
required. This object implements an XOF that takes a short seed and some
auxiliary data as input and outputs a string of any length required for the
application.</t>
      </section>
      <section anchor="flp">
        <name>FLP</name>
        <t>An implementation of the <tt>Flp</tt> interface in <xref section="7.1" sectionFormat="of" target="VDAF"/> is
required. This object implements a zero-knowledge proof system used to verify
that the measurement conforms to the data type required by the application: for
weighted heavy hitters (<xref target="weighted-heavy-hitters"/>), FLPs are used to check the
weight; in aggregation-by-labels (<xref target="aggregation-by-labels"/>), they are used
to check the measurement itself.</t>
        <t>The Client generates a proof and sends secret shares of this proof to each
Aggregator. Verification is split into two phases. In the first phase, each
Aggregator "queries" its share of the value and proof to obtain its "verifier
share". In the second phase, the Aggregators sum up the verifier shares and use
the sum to decide if the input is valid.</t>
      </section>
      <section anchor="vidpf">
        <name>Verifiable IDPF (VIDPF)</name>
        <t>Function secret sharing <xref target="GI14"/> allows secret sharing of the output of a
function <tt>f()</tt> into additive shares, where each function share is represented by
a separate key. These keys enable the Aggregators to efficiently generate an
additive share of the function’s output <tt>f(x)</tt> for a given input <tt>x</tt>.
Distributed Point Functions (DPF) are a particular case of function secret
sharing where <tt>f()</tt> is a "point function" for which <tt>f(x) = beta</tt> if <tt>x</tt> equals
<tt>alpha</tt> and <tt>0</tt> otherwise for some <tt>alpha</tt>, <tt>beta</tt>. The computation is
distributed in such a way that no one party knows either the point or what it
evaluates to.</t>
        <t>An IDPF (<xref section="8.1" sectionFormat="of" target="VDAF"/>) generalizes DPF by secret-sharing an
"incremental point function", i.e., the "point" in DPF is now a path on a full
binary tree from the root to one of the leaves. Here we take <tt>alpha</tt> to be a bit
string of fixed length, and we have that <tt>f(x) = beta</tt> if <tt>x</tt> is a prefix of
<tt>alpha</tt> and <tt>0</tt> otherwise.</t>
        <t>An IDPF has two main operations. The first is the key-generation algorithm,
which is run by the Client. It takes as input <tt>alpha</tt> and <tt>beta</tt> and returns
two values: a list of "key shares", one for each Aggregator; and the "public
share", to be distributed to both Aggregators. The second is the key-evaluation
algorithm, run by each Aggregator. It takes as input a candidate prefix string
<tt>x</tt>, the public share, and the Aggregator's key share and returns the
Aggregator's share of <tt>f(x)</tt>.</t>
        <t>Shares of the IDPF outputs can be aggregated together across multiple reports.
This is used in Poplar1 (<xref section="8" sectionFormat="of" target="VDAF"/>) to solve the private prefix
histogram problem. IDPFs are private in the sense that each Aggregator learns
nothing about the underlying inputs beyond the value of this sum. However,
IDPFs on their own do not provide robustness. For example, it is possible for a
malicious Client to fool the Aggregators into accepting malformed counter
(i.e., a value other than <tt>0</tt> or <tt>1</tt>). It is also possible for a Client to
"vote twice" by constructing key shares for which <tt>f(x) = f(x') = beta</tt>, where
<tt>x</tt> and <tt>x'</tt> are distinct, equal-length candidate prefixes.</t>
        <t>To mitigate these issues, IDPF must be composed with some interactive mechanism
for ensuring the IDPF outputs are well-formed. Mastic uses the VIDPF of
<xref target="MST23"/> for this purpose, which endows IDPF with the following properties:</t>
        <ol spacing="normal" type="1"><li>
            <t>One-hot Verifiability: There is at most one prefix of each length whose
value under f is non-zero. In particular, the output shares at each level
are additive shares of a one-hot vector.</t>
          </li>
          <li>
            <t>Path Verifiability: The One-hot Verifiability property alone is not
sufficient to guarantee that the keys are well-formed. The Aggregators still
need to verify that: a) the non-zero output values are across a single path
in the tree, and b) the value of the root node is consistently propagated
down the VIDPF tree. For example, if the root value is <tt>beta</tt>, then there is
only a single path from root to the leaves with non-zero values, and all
such values equal <tt>beta</tt>.</t>
          </li>
        </ol>
        <t>Below we describe the syntax of VIDPF; in <xref target="vidpf-construction"/> we specify the
concrete construction of <xref target="MST23"/>.</t>
        <t>A concrete <tt>Vidpf</tt> defines the types and constants enumerated in
<xref target="vidpf-param"/>. In addition, it implements the following methods:</t>
        <ul spacing="normal">
          <li>
            <t><tt>Vidpf.gen(alpha: Unsigned, beta: list[Vidpf.Field], binder: bytes, rand:
bytes) -&gt; tuple[PublicShare, list[bytes]]</tt> is the randomized key generation
algorithm. (<tt>rand</tt> denotes the random bytes consumed by the algorithm.) Its
inputs are the VIDPF index <tt>alpha</tt> (defined the same way as "IDPF index" in
<xref section="8" sectionFormat="of" target="VDAF"/>), the output value <tt>beta</tt>, and a binder string.  The
value of <tt>alpha</tt> <bcp14>MUST</bcp14> be in range <tt>[0, 2^Vidpf.BITS)</tt>; and <tt>len(rand)</tt> <bcp14>MUST</bcp14>
be <tt>Vidpf.RAND_SIZE</tt>. The outputs are the public share and the list of key
shares, one for each Aggregator. The length of each key share <bcp14>MUST</bcp14> be
<tt>Vidpf.KEY_SIZE</tt>.</t>
          </li>
          <li>
            <t><tt>Vidpf.eval(agg_id: Unsigned, public_share: Vidpf.PublicShare, key_share:
bytes, level: Unsigned, prefixes: tuple[Unsigned, ...], binder: bytes) -&gt;
tuple[list[Vidpf.Field], bytes]</tt> is the deterministic key evaluation
algorithm. It takes as input the Aggregator ID (which <bcp14>MUST</bcp14> be in range <tt>[0,
Vidpf.SHARES)</tt>, the public share, the Aggregator's key share, the VIDPF level
(defined the same way as "IDPF level" in <xref section="8" sectionFormat="of" target="VDAF"/>), the list of
prefixes to evaluate, and a binder string. Its outputs are the VIDPF output
share and the VIDPF proof.</t>
          </li>
        </ul>
        <t>The verifiability properties are guaranteed as long as each Aggregator computes
the same VIDFP proof. Note that One-hot Verifiability and Path Verifiability
are not sufficient to ensure robustness of Mastic; we will also need to ensure
that the <tt>beta</tt> chosen by the Client is "in range". We will rely on FLPs
(<xref target="flp"/>) for this purpose. (<xref target="MST23"/> describe a simple <tt>range(2)</tt> check, but
we would like more sophisticated range checks for Mastic.)</t>
        <t>Note that <tt>Vidpf</tt> is less general than <tt>Idpf</tt> as defined <xref section="8" sectionFormat="of" target="VDAF"/>
in that <tt>beta</tt> value is the same for each level of the tree. This constraint is
necessary for Path Verifiability.</t>
        <table anchor="vidpf-param">
          <name>Constants and types defined by a concrete VIDPF.</name>
          <thead>
            <tr>
              <th align="left">Parameter</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">SHARES</td>
              <td align="left">Number of VIDPF keys output by VIDPF-key generator</td>
            </tr>
            <tr>
              <td align="left">BITS</td>
              <td align="left">Length in bits of each input string</td>
            </tr>
            <tr>
              <td align="left">VALUE_LEN</td>
              <td align="left">Number of field elements of each output value</td>
            </tr>
            <tr>
              <td align="left">RAND_SIZE</td>
              <td align="left">Size of the random string consumed by the VIDPF-key generator. Equal to twice the XOF's seed size.</td>
            </tr>
            <tr>
              <td align="left">KEY_SIZE</td>
              <td align="left">Size in bytes of each VIDPF key</td>
            </tr>
            <tr>
              <td align="left">Field</td>
              <td align="left">Implementation of <tt>Field</tt> (<xref target="field"/>) used for each value</td>
            </tr>
            <tr>
              <td align="left">PublicShare</td>
              <td align="left">Type of the VIDPF public share</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="vdaf">
      <name>Definition of <tt>Mastic</tt></name>
      <ul empty="true">
        <li>
          <t>NOTE We are pretty confident about the overall structure of the VDAF, but
there are some details to work out and security analysis to do. In the
meantime, check out the current reference implementation at
https://github.com/jimouris/draft-mouris-cfrg-mastic/tree/main/poc.</t>
        </li>
      </ul>
      <t>This section describes Mastic, a VDAF suitable for a plethora of aggregation
functions such sum, mean, histograms, heavy hitters, weighted heavy-hitters (see
<xref target="weighted-heavy-hitters"/>), aggregation by labels (see
<xref target="aggregation-by-labels"/>), linear regression and more. Mastic allows computing
functions <em>à la</em> Prio3 VDAF <xref section="7" sectionFormat="of" target="VDAF"/>.</t>
      <t>The core component of Mastic is a VIDPF as defined in <xref target="vidpf"/>. VIDPFs
inherently have the "one-hot verifiability" property, meaning that in each
level of the tree there exists at most one non-zero value. To guarantee that
the Client's input is well-formed, Mastic first verifies that the Client
measurement is valid at the root level using an FLP, and then, it ensures
that this valid measurement is propagated correctly down the tree using the
one-hot verifiability and the path verifiability properties. Note that Mastic
allows the measurement to be of any type that can be verified by an arithmetic
circuit, not just a counter. For instance, the measurement can be a tuple of
values, a string, a secret number within a public range, etc.</t>
      <t>As described in <xref target="conventions"/>, each Client input consists of two components,
which we denote <tt>alpha</tt> and <tt>beta</tt>. At a high level, the Client generates VIDPF
keys that encodes <tt>alpha</tt> and <tt>beta</tt>. Then the Client sends one share to each
Aggregator and also publishes the public share.</t>
      <t>The Aggregators agree on an initial set of <tt>level</tt>-bit strings, where <tt>level &lt;
 BITS</tt>. We refer to these strings as "candidate prefixes". They evaluate their
 VIDPF key shares at each prefix in this set, to obtain an additive share of
 the VIDPF output.</t>
      <t>Mastic uses a combination of techniques to certify the validity of this output.</t>
      <ol spacing="normal" type="1"><li>
          <t>First, the Aggregators exchange VIDPF proofs. If they are equal, then
this implies One-hot Verifiability and Path Verifiability as described in
<xref target="vidpf"/>. One-hotness ensures that the VIDPF output contains <tt>beta</tt> at
most once (and every other output is <tt>0</tt>). Path Verifiability implies
that, if the previous level contained a non-zero value, then it is the
same value as the current level.</t>
        </li>
        <li>
          <t>Second, the Aggregators interactively verify the FLP (<xref target="flp"/>) to assert
that <tt>beta</tt> is valid. We instantiate the FLP with <tt>FlpGeneric</tt> from
<xref section="7.3" sectionFormat="of" target="VDAF"/>, which defines validity via an arithmetic
circuit (<xref section="7.3.2" sectionFormat="of" target="VDAF"/>) evaluated over (shares of) <tt>beta</tt>:
if the output of the circuit is <tt>0</tt>, then the value is said to be "valid";
otherwise it is "invalid".  </t>
          <t>
If none of the candidate prefixes are a prefix of <tt>alpha</tt>, then the VIDPF
output shares will not contain any shares of <tt>beta</tt>. Moreover, VIDPF
as specified in <xref target="vidpf-construction"/> does not as specified permit
evaluation at the root of the VIDPF tree. Instead, each Aggregator
computes a share of <tt>beta</tt> by evaluating the VIDPF tree at prefixes <tt>0</tt>
and <tt>1</tt> and <tt>level == 0</tt> and adding them up. One-hot Verifiability and
Path Verifiability imply that the sum is equal to the Aggregator's share
of <tt>beta</tt>.  </t>
          <ul empty="true">
            <li>
              <t>CP: An alternative way to spell this is to say that VIDPF evaluation
outputs a share of <tt>beta</tt>, which is what our current API does in the
reference code.</t>
            </li>
          </ul>
        </li>
      </ol>
      <t>The aggregate result is obtained by summing up the encoded measurement shares
for each prefix and computing some function of the sum. The aggregation
parameter contains the level and the set of candidate prefixes.</t>
      <t>The Aggregators send their aggregate shares to the Collector, who combines them
to recover the counts of each candidate prefix.</t>
      <section anchor="sharding">
        <name>Sharding</name>
        <ul empty="true">
          <li>
            <t>NOTE to be specified in full detail.</t>
          </li>
        </ul>
      </section>
      <section anchor="preparation">
        <name>Preparation</name>
        <ul empty="true">
          <li>
            <t>NOTE to be specified in full detail.</t>
          </li>
        </ul>
      </section>
      <section anchor="validity-of-aggregation-parameters">
        <name>Validity of Aggregation Parameters</name>
        <ul empty="true">
          <li>
            <t>NOTE to be specified in full detail.</t>
          </li>
        </ul>
      </section>
      <section anchor="aggregation">
        <name>Aggregation</name>
        <ul empty="true">
          <li>
            <t>NOTE to be specified in full detail.</t>
          </li>
        </ul>
      </section>
      <section anchor="unsharding">
        <name>Unsharding</name>
        <ul empty="true">
          <li>
            <t>NOTE to be specified in full detail.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="modes-of-operation-for-mastic">
      <name>Modes of Operation for <tt>Mastic</tt></name>
      <section anchor="weighted-heavy-hitters">
        <name>Weighted Heavy-Hitters</name>
        <ul empty="true">
          <li>
            <t>NOTE to be specified in full detail. For an end-to-end example, see
<tt>example_weighted_heavy_hitters_mode()</tt> in the reference implementation.</t>
          </li>
        </ul>
        <t>The primary use case for Mastic is a variant of the heavy-hitters problem, in
which the prefix counts are replaced with a notion of weight that is specific to
some application. For example, when measuring the performance of an ad campaign,
it is useful to learn not only which ads led to purchases, but how much money
was spent.</t>
        <t>To support this use case, we view the Client's <tt>alpha</tt> value as its measurement
and the <tt>beta</tt> value as the measurement's "weight". The range of valid values
for <tt>beta</tt> are therefore determined by the FLP with which Mastic is
instantiated. Concretely, validity of <tt>beta</tt> is expressed by a validity circuit
(<xref section="7.3.2" sectionFormat="of" target="VDAF"/>).</t>
        <t>To compute the weighted heavy-hitters, the Collector and Aggregators proceed as
described in <xref section="8" sectionFormat="of" target="VDAF"/>, except that the threshold represents a
minimum weight rather than a minimum count. In addition:</t>
        <ol spacing="normal" type="1"><li>
            <t>The Aggregators <bcp14>MUST</bcp14> perform the range check (i.e., verify the FLP) at the
first round of aggregation and remove any invalid reports before proceeding.</t>
          </li>
          <li>
            <t>The level at which the reports are Aggregated <bcp14>MUST</bcp14> be strictly increasing.</t>
          </li>
        </ol>
      </section>
      <section anchor="aggregation-by-labels">
        <name>Aggregation by Labels</name>
        <ul empty="true">
          <li>
            <t>NOTE to be specified in full detail. For an end-to-end example, see
<tt>example_aggregation_by_labels_mode()</tt> in the reference implementation.</t>
          </li>
        </ul>
        <t>In this mode of operation, we take the <tt>beta</tt> value to be the Client's
measurement and <tt>alpha</tt> to be an arbitrary "label". For a given sequence of
labels, the goal of the Collector is to aggregate the measurements that share
the same label. This provides functionality similar to Prio3 <xref target="VDAF"/>, except
that the aggregate is partitioned by Clients who share some property. For
example, the label might encode the Client's user agent <xref target="RFC9110"/>.</t>
        <t>Mastic requires each <tt>alpha</tt> to have the same length (<tt>Vidpf.BITS</tt>). Thus, it is
necessary for each application to choose a scheme for encoding labels as
fixed-length strings. The following scheme is <bcp14>RECOMMENDED</bcp14>. Choose a
cryptographically secure hash function, such as SHA256
<xref target="SHS"/>, compute the hash of the Client's input
string, and interpret each bit of the hash as a bit of the VIDPF index. [CP: Are
we comfortable recommending truncating the hash? Collisions aren't so bad since
the Client can just lie about <tt>alpha</tt> anyway. The main thing is to pick a value
for <tt>BITS</tt> that is large enough to avoid accidental collisions.]</t>
        <t>The Aggregators <bcp14>MAY</bcp14> aggregate a report any number times, but:</t>
        <ol spacing="normal" type="1"><li>
            <t>They <bcp14>MUST</bcp14> perform the range check (i.e., verify the FLP) the first time the
reports are aggregated and remove any invalid reports before aggregating
again.</t>
          </li>
          <li>
            <t>The aggregation parameter <bcp14>MUST</bcp14> specify the last level of the VIDPF tree
(i.e., <tt>level</tt> <bcp14>MUST</bcp14> be <tt>Vidpf.BITS-1</tt>).</t>
          </li>
        </ol>
        <ul empty="true">
          <li>
            <t>OPEN ISSUE Figure out if these requirements are strict enough. We may need to
tighten aggregation parameter validity if we find out that aggregating at the
same level more than once is not safe.</t>
          </li>
        </ul>
      </section>
      <section anchor="plain-heavy-hitters-with-proof-aggregation">
        <name>Plain Heavy-Hitters with VIDPF-Proof Aggregation</name>
        <ul empty="true">
          <li>
            <t>NOTE to be specified in full detail. Proof aggregation is not yet implemented
by the reference code.</t>
          </li>
        </ul>
        <t>The total communication cost of using Mastic (or Poplar1 <xref target="VDAF"/>) for heavy
hitters is <tt>O(num_measurements * Vidpf.BITS)</tt> bits exchanged between the
Aggregators, where <tt>num_measurements</tt> is the number of reports being
aggregated. For plain heavy-hitters, this can be reduced to <tt>O(Vidpf.BITS)</tt> in
the best case.</t>
        <t>The idea is to take advantage of the feature of VIDPF evaluation whereby the
Aggregators compute identical VIDPF proofs if and only if the report is valid.
This allows the proofs themselves to be aggregated: if each report in a batch of
reports is valid, then the hash of their proofs will be equal as well; on the
other hand, if one report is invalid, then the hash of the proofs will not be
equal.</t>
        <t>To facilitate isolation of the invalid report(s), the proof strings are arranged
into a Merkle tree. During aggregation, the Aggregators interactively traverse
the tree to detect the subtree(s) containing invalid reports and remove them
from the batch.</t>
        <ul empty="true">
          <li>
            <t>OPEN ISSUE Decide if we should spell this out in greater detail. This feature
is not compatible with <xref target="DAP"/>; if we wanted to
extend DAP to support this, then we'd need to specify the wire format of the
messages exchanged between the Aggregators.</t>
          </li>
        </ul>
        <t>In the worst case, isolating invalid reports requires <tt>O(num_measurements *
Vidpf.BITS)</tt> bits of communication and many <tt>Vidpf.BITS</tt> rounds of communication
between the Aggregators. However, this behavior would only be observed under
attack conditions in which the vast majority of Clients are malicious.</t>
        <t>In the simple case where the <tt>beta</tt> value is a constant (e.g., 1) we can replace
the FLP check with a simpler check. FLPs are not compatible with proof
aggregation the way VIDPFs are. In order to perform the range check without
FLPs, we use an extension of VIDPF described by <xref target="MST23"/>. The high-level idea
here is that the Aggregators can evaluate the empty string and verify that they
have shares of the constant <tt>beta</tt>. Next, as described in <xref target="vdaf"/>, we use the
"one-hot verifiability" and "path verifiability" checks to verify that each
level is non-zero at only a single point and that the same constant <tt>beta</tt> is
propagated down the tree correctly. Note that this trick is not suitable for
weighted heavy-hitters, since it expects that each <tt>beta</tt> value is constant
(e.g., 1).</t>
        <ul empty="true">
          <li>
            <t>OPEN ISSUE Proof aggregation could work with plain Mastic, but we would need
to check the FLPs at the first round of aggregation, leading to best-case
communication cost would be <tt>O(num_measurements + Vidpf.BITS)</tt>. This would be
OK, but we would still want to support a mode for plain heavy-hitters that is
as good as we can get.</t>
            <t>One idea is to always do the PLASMA <tt>0</tt>/<tt>1</tt> check alongside the FLP. This
would be useful for another reason: Usually FLP decoding requires
<tt>num_measurements</tt> as a parameter. We currently don't support this because we
currently don't have a pure counter as part of the VIDPF output.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="malicious-security-with-three-aggregators">
      <name>Robustness Against a Malicious Aggregator</name>
      <t>Next, we describe an enhancement that allows Mastic to achieve robustness in the
presence of a malicious Aggregator. The two-party Mastic (as well as Poplar1) is
susceptible to additive attacks by a malicious Aggregator. In more detail, if
one of the Aggregators starts acting maliciously, they can arbitrarily add to
the aggregation result (simply by adding to their own aggregation shares)
without the honest Aggregator noticing.</t>
      <t>We can solve this problem in Mastic by using a technique from <xref target="MST23"/> that
lifts the two-party semi-honest secure PLASMA to the three-party maliciously secure
setting. Rather than having two Aggregators as in the previous setting, this
flavor involves three Aggregators, where every pair of Aggregators communicate
over a different channel. In essence, each pair of Aggregators will run one
session of the VDAF with unique randomness but on the same Client measurement.
The following changes are necessary:</t>
      <ol spacing="normal" type="1"><li>
          <t>The Client needs to generate three pairs of VIDPF keys all corresponding to
the same <tt>alpha</tt> and <tt>beta</tt> values. We represent the keys based on the
session as follows:
          </t>
          <ol spacing="normal" type="1"><li>
              <t>Session 0 (between Aggregators 0 and 1): <tt>key_01, key_10</tt></t>
            </li>
            <li>
              <t>Session 1 (between Aggregators 1 and 2): <tt>key_12, key_21</tt></t>
            </li>
            <li>
              <t>Session 2 (between Aggregators 2 and 0): <tt>key_20, key_02</tt></t>
            </li>
          </ol>
          <t>
Each pair of Aggregators cannot check that the Client input is consistent
across two sessions without the involvement of the third Aggregator. To
address this, we let two Aggregators (i.e., Aggregators 0 and 1) to run all
three sessions so that they can check that the Client input is consistent
across three sessions. The third Aggregator (i.e., Aggregator 2) is involved
as an attestator in two of the sessions. The check involves field addition
and subtraction and then hash comparisons.</t>
        </li>
        <li>
          <t>The Client sends the following keys to the Aggregators:
          </t>
          <ol spacing="normal" type="1"><li>
              <t>Aggregator 0 receives: <tt>key_01</tt>, <tt>key_02</tt>, and <tt>key_21</tt></t>
            </li>
            <li>
              <t>Aggregator 1 receives: <tt>key_10</tt>, <tt>key_12</tt>, and <tt>key_20</tt></t>
            </li>
            <li>
              <t>Aggregator 2 receives: <tt>key_21</tt> and <tt>key_20</tt></t>
            </li>
          </ol>
        </li>
        <li>
          <t>The Aggregators need to verify that the Client's input is consistent across
the different sessions (i.e., that all the keys correspond to the same
<tt>alpha</tt> and <tt>beta</tt> values). Aggregators 0 and 1 check that:
          </t>
          <ol spacing="normal" type="1"><li>
              <t>Their output shares of Session 0 minus their output shares of Session 1
 are shares of zero</t>
            </li>
            <li>
              <t>Their output shares of Session 1 minus their output shares of Session 2
are shares of zero.</t>
            </li>
          </ol>
          <t>
The subtraction is a local operation and verifying that two Aggregators possess
a sharing of zero requires exchanging one hash.</t>
        </li>
      </ol>
      <t>Using a third Aggregator, we can lift the security of Mastic from the
semi-honest setting to malicious security. While more complex to implement than
2-party Mastic, this mode allows achieves both privacy and robustness against a
malicious Aggregator.</t>
      <ul empty="true">
        <li>
          <t>NOTE to be specified in full detail.</t>
        </li>
      </ul>
    </section>
    <section anchor="vidpf-construction">
      <name>Definition of <tt>Vidpf</tt></name>
      <t>The construction of <xref target="MST23"/> builds on techniques from <xref target="CP22"/> to lift an IDPF
to a VIDPF with the properties described in <xref target="vidpf"/>. Instead of a 2-round
"secure sketch" MPC like that of Poplar1, the scheme relies on hashing.</t>
      <t>TODO(jimouris) Add an overview.</t>
      <ul empty="true">
        <li>
          <t>NOTE To be specified. The design is based on VIDPF from <xref target="MST23"/>.
https://github.com/jimouris/draft-mouris-cfrg-mastic/tree/main/poc for the
reference implementation.</t>
        </li>
      </ul>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <ul empty="true">
        <li>
          <t>NOTE to be specified.</t>
        </li>
      </ul>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <ul empty="true">
        <li>
          <t>NOTE to be specified.</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <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="31" month="August" year="2023"/>
            <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-07"/>
        </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="CP22" target="https://iacr.org/cryptodb/data/paper.php?pubkey=31935">
          <front>
            <title>Lightweight, Maliciously Secure Verifiable Function Secret Sharing</title>
            <author initials="" surname="Leo de Castro">
              <organization/>
            </author>
            <author initials="" surname="Antigoni Polychroniadou">
              <organization/>
            </author>
            <date year="2022"/>
          </front>
          <seriesInfo name="EUROCRYPT 2022" value=""/>
        </reference>
        <reference anchor="GI14" target="https://link.springer.com/chapter/10.1007/978-3-642-55220-5_35">
          <front>
            <title>Distributed Point Functions and Their Applications</title>
            <author initials="N." surname="Gilboa">
              <organization/>
            </author>
            <author initials="Y." surname="Ishai">
              <organization/>
            </author>
            <date year="2014"/>
          </front>
          <seriesInfo name="EUROCRYPT 2014" value=""/>
        </reference>
        <reference anchor="MST23" target="https://ia.cr/2023/080">
          <front>
            <title>PLASMA: Private, Lightweight Aggregated Statistics against Malicious Adversaries</title>
            <author initials="" surname="Dimitris Mouris">
              <organization/>
            </author>
            <author initials="" surname="Pratik Sarkar">
              <organization/>
            </author>
            <author initials="" surname="Nektarios Georgios Tsoutsos">
              <organization/>
            </author>
            <date year="2023"/>
          </front>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="SHS">
          <front>
            <title>Secure Hash Standard</title>
            <author fullname="Quynh H. Dang" initials="Q." surname="Dang">
              <organization/>
            </author>
            <date month="July" year="2015"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.180-4"/>
          <refcontent>National Institute of Standards and Technology</refcontent>
        </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="Eric Rescorla" initials="E." surname="Rescorla">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="14" month="September" year="2023"/>
            <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, 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 (PPM) which can be used to
   collect aggregate data without revealing any individual user's data.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-07"/>
        </reference>
      </references>
    </references>
    <?line 645?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <ul empty="true">
        <li>
          <t>NOTE to be specified.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA7V963YbR5Lm/3yKHOiHyR4CIim7bdNt2bQotXlGEjkirW5v
H69YQCWIagFVmMoCKbZa5+xr7L95lt03mSfZ+CIiLwWAsuXd1Q+bBKryEhmX
Ly4ZHA6Hpqu6uTuyg8uZsy8K31UT+/rk+NnAFONx627oG/l0YCZF566b9u7I
VvW0MaZsJnWxoHfLtph2w0Wzais/nEzb6+GCXxnuHxi/Gi8q76um7u6W9Ozp
q8tnpl4txq49MiWNeGQmTe1d7Vf+yHbtyhma85EpWlfQ3Hh8YG6b9u1126yW
9MmT9m7ZNfZZ064WA/PW3dGX5ZGxdmhP6861teuGJ1iQuXH1yuGb7a9aKysa
vHLeFe1kZv+M5/DFoqjm9AW28n3luumoaa/xOZ6iz2ddt/RHDx/iMXxU3bhR
eOwhPngoAz78zuGRN/PKd99iMIxxXXWz1ZhG+XslFHt4H/kG5k//Mhxaa+dE
Jt8d2TCve1cslnM3mjSLh8+PL59eXNrh8LExxaqbNURWO6R5rJ2u5nM5oB+L
ui5m9qS4qTx/RQst6uofRUfncmQvXHFNU/A3TvY+4zdGblTine+9PIEZN0c/
qRZVR2u3L3gLWyb4qSYStb7q7mwztSduXtzS+ebzBWJ8vyrdfOTKVZhGpngy
o++6ZjlzrT0vuq6pt8zyZN6syul8beQJXl3yO/+KQ/r+Gp9v38l5S0O9tRdF
+7ZotxFqtWwLG/gln2XJb3796PvxKl99Gvqle9sVbdV4++eRvfTNqvPN7yNV
py8nUpm6aRf0/g1xu4Fspt+sfXJ+eHjE7wdJf15dz7pbh//ukcjPq0nVrPz8
jvhgsmqdfe3aaloV47mzz1b1BOvCV63r7MWM9lAzH5M0BHbjf0PSCiTBz11j
S2efEAe3Tf+r47qrrpu6sufN/I6OhX4symbFD0ET2CN7uH94yL97WoPz2MuR
ffrTq7Mnr34+v0xfEymvXSYRVTFpWfomLOLl+CENWDxcFkvXjpaz5XfL1ZhU
xbePDr5+9AWo8ufTg8/7VDkhBmur8apzJS2wqru4eW+LurSkH6vWHi+XRC8+
K/8RKrwc2T9X83FT9D/+eWRP/ayo4pax44PPP7pj/Xp9x/OqfjvyS5wGbRGa
YDIrlqT/Hh7sjw729798+PWXXw0fDf/4+eHwiy8OD/eHX7yRrb+4uDx81N/7
+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

-->

</rfc>
