<?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.17 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-savage-ppm-3phm-mpc-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title abbrev="3 Party MPC">Efficient Protocols for Binary Fields in the 3-Party Honest Majority MPC Setting</title>
    <seriesInfo name="Internet-Draft" value="draft-savage-ppm-3phm-mpc-01"/>
    <author initials="B." surname="Savage" fullname="Ben Savage">
      <organization>Meta</organization>
      <address>
        <email>btsavage@meta.com</email>
      </address>
    </author>
    <author initials="M." surname="Thomson" fullname="Martin Thomson">
      <organization>Mozilla</organization>
      <address>
        <email>mt@lowentropy.net</email>
      </address>
    </author>
    <date year="2024" month="July" day="08"/>
    <area>Security</area>
    <workgroup>Privacy Preserving Measurement</workgroup>
    <keyword>arithmetic</keyword>
    <keyword>polynomial</keyword>
    <keyword>vector</keyword>
    <abstract>
      <?line 50?>

<t>A three party, honest majority system provides the most efficient protocols for
Multiparty Computation (MPC).  This document describes a concrete instantiation
of addition and multiplication protocols that provide strong guarantees of
security.  The multiplication protocol provides low communication and
computation costs, with addition being almost free.  Any single dishonest party
is detected with high probability.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://private-attribution.github.io/i-d/draft-savage-ppm-3phm-mpc.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-savage-ppm-3phm-mpc/"/>.
      </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/private-attribution/i-d"/>.</t>
    </note>
  </front>
  <middle>
    <?line 59?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Multiparty Computation (MPC) can perform generic computations over inputs that
are never revealed to any single entity. MPC executes an agreed function,
revealing only the output of that function.</t>
      <t>This makes MPC well-suited to handling data that is sensitive or private. MPC in
a three-party honest majority setting, is broadly recognized as being extremely
efficient:</t>
      <ul spacing="normal">
        <li>
          <t>Addition and subtraction have zero communication cost and negligible
computation cost.</t>
        </li>
        <li>
          <t>Multiplication is possible with low communication and computation complexity.</t>
        </li>
        <li>
          <t>Strong guarantees can be made about correctness and confidentiality, relying
on only information-theoretic assumptions.</t>
        </li>
      </ul>
      <t>This document describes the basic elements required to compute basic MPC
circuits in this setting. This includes the basic elements of the replicated
secret sharing scheme that is used: generating shares, share addition, and
revealing shared values.</t>
      <t>The bulk of the document describes a protocol for multiplication over a binary
field. The basic multiplication protocol scales linearly and involves 1 bit of
communication per party.</t>
      <t>This basic multiplication protocol does not prevent an additive attack. To deal
with the additive attack, a batched validation protocol is used, which adds a
sub-linear overhead. This protocol comes with significant memory costs and
slightly increased computational costs, but adds negligible communication
overhead and latency when there are many multiplications to validate.</t>
      <section anchor="mpc-protocols-in-binary-fields">
        <name>MPC Protocols in Binary Fields</name>
        <t>This document describes a multiplication protocol that is specialized for use
with binary fields; see <xref target="fields"/>.</t>
        <t>Composing binary operations into a complete MPC system has proven to be more
efficient than alternatives using prime fields in a number of applications. Some
of the components in this document can be applied to rings or larger prime
fields, but the validation process used here has been specialized for use with
binary values.</t>
      </section>
    </section>
    <section anchor="three-party-honest-majority-mpc">
      <name>Three-Party Honest Majority MPC</name>
      <t>A three-party honest majority MPC system performs computations on secret-shared
values using a replicated scheme where each party receives two out of three
additive shares of input values. Strong guarantees are provided regarding the
confidentiality of inputs provided that no pair of parties reveals their shares
to either of the other parties.</t>
      <t>The protocols described in this document depend on having three MPC parties
execute them. The protocols described here are secure with abort, even when one
party is not honest.</t>
      <t>Concretely, this means that a single dishonest party cannot cause the value of
inputs to be revealed. Also, a single dishonest party cannot alter the output of
any operation without detection. The protocol is aborted if honest parties
detect an error that might indicate the actions of a dishonest party. This means
that a dishonest party can disrupt the protocol.</t>
      <section anchor="mpc-protocol-prerequisites">
        <name>MPC Protocol Prerequisites</name>
        <t>MPC parties require channels to each of the other parties that provide
confidentiality, integrity and peer authentication. Mutually-authenticated TLS
<xref target="RFC8446"/> provides the necessary capabilities, however, this document does
not define how to arrange communication between parties; protocols that use
these mechanisms need to define how communication between parties is
established.</t>
        <t>The multiplication protocol described depends on shared randomness for
efficiency. The protocol depends on having a way for parties to pairwise agree
on random values. MPC parties can execute a coin toss protocol using the
communication channel, however it is considerably more efficient to use
pseudorandom secret sharing <xref target="PRSS"/> when there are a large number of
multiplications.</t>
        <t>This section describes basic operations of secret sharing (<xref target="sharing"/>), reveal
protocol (<xref target="reveal"/>), and addition (<xref target="addition"/>). Multiplication is more
involved and is the subject of subsequent sections (<xref target="multiplication"/>,
<xref target="validation"/>).</t>
      </section>
      <section anchor="fields">
        <name>Fields and Rings</name>
        <t>The basic multiplication protocol described in <xref target="multiplication"/> operates in
any commutative ring, which will be referred to as simply a "ring". A ring is a
group that defines addition and multiplication operations that are both
associative and commutative. A ring has an additive inverse for every element,
which enables subtraction. A ring contains a "zero" element that is an additive
identity plus a "one" element that is a multiplicative identity.</t>
        <t>A simple realization of a ring is formed of integers modulo a chosen integer
that is greater than 1.</t>
        <t>The validation protocol described in this document (see <xref target="validation"/>) uses a
modulo 2 ring. This ring is referred to throughout as a binary field as it is
also a field and it contains two values: 0 and 1. Addition and multiplication in
a binary field correspond to Boolean operations. Addition in a binary field is
equivalent to the Boolean exclusive OR (XOR) operation. Multiplication in a
binary field is equivalent to the Boolean AND operation.</t>
        <t>The security properties of the validation protocol depend on the use of a prime
field of sufficient size. Fields support the same operations as rings, adding
multiplicative inversion of elements, which enables a division operation. A
prime field can be realized from integers modulo any prime. The validation
protocol integrates the projection of values in a binary field to a larger prime
field, rather than requiring a separate conversion step.</t>
      </section>
      <section anchor="sharing">
        <name>Secret Sharing</name>
        <t>Each input value (<tt>x</tt>) is split into three shares (<tt>x₁</tt>, <tt>x₂</tt>,
<tt>x₃</tt>), such that <tt>x = x₁ + x₂ + x₃</tt>. Any
method can be used, but the following process is typical:</t>
        <sourcecode type="pseudocode"><![CDATA[
x₁ = random()
x₂ = random()
x₃ = x - x₁ - x₂
]]></sourcecode>
        <t>Then, each party in the MPC receives a different set of two values. This
document adopts the convention that P<sub>1</sub> receives (<tt>x₁</tt>,
<tt>x₂</tt>), P<sub>2</sub> receives (<tt>x₂</tt>, <tt>x₃</tt>), and
P<sub>3</sub> receives (<tt>x₃</tt>, <tt>x₁</tt>). From this sharing, no
single party is able to construct the original value (<tt>x</tt>), but the values from
any two parties include all three shares and can be used to reconstruct the
original value.</t>
        <t>Some protocols might require that the parties construct a sharing of a value
which is known to all the parties. In that case, the value of <tt>x₁</tt> is
set to the known value, with <tt>x₂</tt> and <tt>x₃</tt> both set to zero.</t>
      </section>
      <section anchor="identifying-shares-and-parties">
        <name>Identifying Shares and Parties</name>
        <t>This document identifies shares and parties by number. Three parties are
identified as P<sub>1</sub>, P<sub>2</sub>, and P<sub>3</sub>. The first, or
left share, value held by each party is identified with the same subscript.  The
other share, or right share, held by each is the next highest-numbered share
(with <tt>x₁</tt> being the next highest after <tt>x₃</tt>). This is
illustrated in <xref target="fig-shares-parties"/>:</t>
        <figure anchor="fig-shares-parties">
          <name>Parties and Shares</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="112" width="360" viewBox="0 0 360 112" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 56,32 L 80,32" fill="none" stroke="black"/>
                <path d="M 168,32 L 192,32" fill="none" stroke="black"/>
                <path d="M 280,32 L 304,32" fill="none" stroke="black"/>
                <path d="M 8,48 L 40,48" fill="none" stroke="black"/>
                <path d="M 96,48 L 152,48" fill="none" stroke="black"/>
                <path d="M 208,48 L 264,48" fill="none" stroke="black"/>
                <path d="M 320,48 L 352,48" fill="none" stroke="black"/>
                <path d="M 56,64 L 80,64" fill="none" stroke="black"/>
                <path d="M 168,64 L 192,64" fill="none" stroke="black"/>
                <path d="M 280,64 L 304,64" fill="none" stroke="black"/>
                <path d="M 24,80 L 336,80" fill="none" stroke="black"/>
                <path d="M 8,48 L 24,80" fill="none" stroke="black"/>
                <path d="M 336,80 L 352,48" fill="none" stroke="black"/>
                <path d="M 56,32 C 47.16936,32 40,39.16936 40,48" fill="none" stroke="black"/>
                <path d="M 80,32 C 88.83064,32 96,39.16936 96,48" fill="none" stroke="black"/>
                <path d="M 168,32 C 159.16936,32 152,39.16936 152,48" fill="none" stroke="black"/>
                <path d="M 192,32 C 200.83064,32 208,39.16936 208,48" fill="none" stroke="black"/>
                <path d="M 280,32 C 271.16936,32 264,39.16936 264,48" fill="none" stroke="black"/>
                <path d="M 304,32 C 312.83064,32 320,39.16936 320,48" fill="none" stroke="black"/>
                <path d="M 56,64 C 47.16936,64 40,56.83064 40,48" fill="none" stroke="black"/>
                <path d="M 80,64 C 88.83064,64 96,56.83064 96,48" fill="none" stroke="black"/>
                <path d="M 168,64 C 159.16936,64 152,56.83064 152,48" fill="none" stroke="black"/>
                <path d="M 192,64 C 200.83064,64 208,56.83064 208,48" fill="none" stroke="black"/>
                <path d="M 280,64 C 271.16936,64 264,56.83064 264,48" fill="none" stroke="black"/>
                <path d="M 304,64 C 312.83064,64 320,56.83064 320,48" fill="none" stroke="black"/>
                <g class="text">
                  <text x="28" y="36">x₁</text>
                  <text x="108" y="36">x₂</text>
                  <text x="140" y="36">x₂</text>
                  <text x="220" y="36">x₃</text>
                  <text x="252" y="36">x₃</text>
                  <text x="332" y="36">x₁</text>
                  <text x="68" y="52">P₁</text>
                  <text x="180" y="52">P₂</text>
                  <text x="292" y="52">P₃</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
         x₁ .----. x₂  x₂ .----. x₃  x₃ .----. x₁
       .---+  P₁  +------+  P₂  +------+  P₃  +---.
        \   `----'        `----'        `----'   /
         '--------------------------------------'
]]></artwork>
          </artset>
        </figure>
        <t>Three parties are identified as P<sub>1</sub>, P<sub>2</sub>, and P<sub>3</sub>.</t>
        <t>The three parties are logically placed in a ring, with higher numbered parties
to the right of lower-numbered parties. P<sub>3</sub> is placed to the left of
P<sub>1</sub>. This means that if a protocol involves sending a value to the
left, P<sub>1</sub> sends the value to P<sub>3</sub>, P<sub>2</sub> sends to
P<sub>1</sub>, and P<sub>3</sub> sends to P<sub>2</sub>. The sending directions
are illustrated in <xref target="fig-send-direction"/>.</t>
        <figure anchor="fig-send-direction">
          <name>Parties and Sending Directions</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="376" viewBox="0 0 376 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 104,48 L 128,48" fill="none" stroke="black"/>
                <path d="M 200,48 L 224,48" fill="none" stroke="black"/>
                <path d="M 296,48 L 320,48" fill="none" stroke="black"/>
                <path d="M 64,64 L 88,64" fill="none" stroke="black"/>
                <path d="M 152,64 L 184,64" fill="none" stroke="black"/>
                <path d="M 248,64 L 280,64" fill="none" stroke="black"/>
                <path d="M 344,64 L 368,64" fill="none" stroke="black"/>
                <path d="M 104,80 L 128,80" fill="none" stroke="black"/>
                <path d="M 200,80 L 224,80" fill="none" stroke="black"/>
                <path d="M 296,80 L 320,80" fill="none" stroke="black"/>
                <path d="M 80,96 L 352,96" fill="none" stroke="black"/>
                <path d="M 112,144 L 136,144" fill="none" stroke="black"/>
                <path d="M 208,144 L 232,144" fill="none" stroke="black"/>
                <path d="M 304,144 L 328,144" fill="none" stroke="black"/>
                <path d="M 64,160 L 88,160" fill="none" stroke="black"/>
                <path d="M 152,160 L 184,160" fill="none" stroke="black"/>
                <path d="M 248,160 L 280,160" fill="none" stroke="black"/>
                <path d="M 344,160 L 368,160" fill="none" stroke="black"/>
                <path d="M 112,176 L 136,176" fill="none" stroke="black"/>
                <path d="M 208,176 L 232,176" fill="none" stroke="black"/>
                <path d="M 304,176 L 328,176" fill="none" stroke="black"/>
                <path d="M 80,192 L 352,192" fill="none" stroke="black"/>
                <path d="M 64,160 L 80,192" fill="none" stroke="black"/>
                <path d="M 64,64 L 80,96" fill="none" stroke="black"/>
                <path d="M 352,96 L 368,64" fill="none" stroke="black"/>
                <path d="M 352,192 L 368,160" fill="none" stroke="black"/>
                <path d="M 104,48 C 95.16936,48 88,55.16936 88,64" fill="none" stroke="black"/>
                <path d="M 128,48 C 136.83064,48 144,55.16936 144,64" fill="none" stroke="black"/>
                <path d="M 200,48 C 191.16936,48 184,55.16936 184,64" fill="none" stroke="black"/>
                <path d="M 224,48 C 232.83064,48 240,55.16936 240,64" fill="none" stroke="black"/>
                <path d="M 296,48 C 287.16936,48 280,55.16936 280,64" fill="none" stroke="black"/>
                <path d="M 320,48 C 328.83064,48 336,55.16936 336,64" fill="none" stroke="black"/>
                <path d="M 104,80 C 95.16936,80 88,72.83064 88,64" fill="none" stroke="black"/>
                <path d="M 128,80 C 136.83064,80 144,72.83064 144,64" fill="none" stroke="black"/>
                <path d="M 200,80 C 191.16936,80 184,72.83064 184,64" fill="none" stroke="black"/>
                <path d="M 224,80 C 232.83064,80 240,72.83064 240,64" fill="none" stroke="black"/>
                <path d="M 296,80 C 287.16936,80 280,72.83064 280,64" fill="none" stroke="black"/>
                <path d="M 320,80 C 328.83064,80 336,72.83064 336,64" fill="none" stroke="black"/>
                <path d="M 112,144 C 103.16936,144 96,151.16936 96,160" fill="none" stroke="black"/>
                <path d="M 136,144 C 144.83064,144 152,151.16936 152,160" fill="none" stroke="black"/>
                <path d="M 208,144 C 199.16936,144 192,151.16936 192,160" fill="none" stroke="black"/>
                <path d="M 232,144 C 240.83064,144 248,151.16936 248,160" fill="none" stroke="black"/>
                <path d="M 304,144 C 295.16936,144 288,151.16936 288,160" fill="none" stroke="black"/>
                <path d="M 328,144 C 336.83064,144 344,151.16936 344,160" fill="none" stroke="black"/>
                <path d="M 112,176 C 103.16936,176 96,168.83064 96,160" fill="none" stroke="black"/>
                <path d="M 136,176 C 144.83064,176 152,168.83064 152,160" fill="none" stroke="black"/>
                <path d="M 208,176 C 199.16936,176 192,168.83064 192,160" fill="none" stroke="black"/>
                <path d="M 232,176 C 240.83064,176 248,168.83064 248,160" fill="none" stroke="black"/>
                <path d="M 304,176 C 295.16936,176 288,168.83064 288,160" fill="none" stroke="black"/>
                <path d="M 328,176 C 336.83064,176 344,168.83064 344,160" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="352,64 340,58.4 340,69.6" fill="black" transform="rotate(180,344,64)"/>
                <polygon class="arrowhead" points="288,160 276,154.4 276,165.6" fill="black" transform="rotate(0,280,160)"/>
                <polygon class="arrowhead" points="256,64 244,58.4 244,69.6" fill="black" transform="rotate(180,248,64)"/>
                <polygon class="arrowhead" points="192,160 180,154.4 180,165.6" fill="black" transform="rotate(0,184,160)"/>
                <polygon class="arrowhead" points="160,64 148,58.4 148,69.6" fill="black" transform="rotate(180,152,64)"/>
                <polygon class="arrowhead" points="96,160 84,154.4 84,165.6" fill="black" transform="rotate(0,88,160)"/>
                <g class="text">
                  <text x="20" y="36">send</text>
                  <text x="24" y="52">left:</text>
                  <text x="116" y="68">P₁</text>
                  <text x="212" y="68">P₂</text>
                  <text x="308" y="68">P₃</text>
                  <text x="20" y="132">send</text>
                  <text x="28" y="148">right:</text>
                  <text x="124" y="164">P₁</text>
                  <text x="220" y="164">P₂</text>
                  <text x="316" y="164">P₃</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
send
left:      .----.      .----.      .----.
       .--+  P₁  |<---+  P₂  |<---+  P₃  |<--.
        \  `----'      `----'      `----'   /
         '---------------------------------'

send
right:      .----.      .----.      .----.
       .-->|  P₁  +--->+  P₂  +--->|  P₃  +--.
        \   `----'      `----'      `----'  /
         '---------------------------------'
]]></artwork>
          </artset>
        </figure>
        <t>Protocols are often described in terms of the actions of a single party. The
party to the left of that party is P<sub>-</sub> and the party to the right is
P<sub>+</sub>. Where necessary, the current party is identified as
P<sub>=</sub>.</t>
        <t>The two shares that each party holds are referred to as "left" and "right"
shares. The "left" share is identified with a subscript of "-" (e.g.,
x_-); the numeric identifier for the left share at each party matches
the identifier for that party, so the left share of x that P<sub>1</sub> holds
is named x<sub>1</sub>. The right share is designated with a subscript of "+"
(e.g., y_+); the numeric identifier for the right share is one higher
than the identifier for the party, so the right share at P<sub>3</sub> is (also)
x<sub>1</sub>.</t>
      </section>
      <section anchor="reveal">
        <name>Reveal Protocol</name>
        <t>The output of a protocol can be revealed by sending all share values to the
entity that will receive the final result. This entity can validate the
consistency of the values it receives by ensuring that the replicated values it
receives are identical. That is, the value of x<sub>1</sub> received from
P<sub>1</sub> is the same as the value of x<sub>1</sub> it receives from
P<sub>3</sub> and so forth. If the value of shares are inconsistent, the
protocol fails. After discarding these duplicated values, the revealed value is
the sum of the shares that it receives.</t>
        <t>A value can be revealed by sending adjacent parties the one share value they do
not have. That is, P<sub>1</sub> sends x<sub>1</sub> to P<sub>2</sub> and
x<sub>2</sub> to P<sub>3</sub>; P<sub>2</sub> sends x<sub>2</sub> to
P<sub>3</sub> and x<sub>3</sub> to P<sub>1;</sub> P<sub>3</sub> sends
x<sub>3</sub> to P<sub>1</sub> and x<sub>1</sub> to P<sub>2</sub>. Each party
verifies that they receive the same value twice, and aborts if they do not.</t>
        <t>If the protocol is executed correctly, each party learns the revealed value,
which is the sum of the two shares it holds, plus the share that was received.</t>
        <t>This basic reveal protocol requires that each party send and receive two
elements. More efficient protocols are possible, but these are not defined in
this document.</t>
      </section>
      <section anchor="addition">
        <name>Addition</name>
        <t>Addition of two values in this setting is trivial and requires no communication
between parties. To add x to y, each party adds their shares. That is, to
compute z = x + y, each party separately computes the sum of the shares they
hold:</t>
        <sourcecode type="pseudocode"><![CDATA[
z₋ = x₋ + y₋
z₊ = x₊ + y₊
]]></sourcecode>
        <t>This produces shares of the sum without requiring communication.</t>
        <t>A similar process can be used for multiplication with a value that is known to
all parties, negation, and subtraction.</t>
        <aside>
          <t>Note: Addition in a binary field is the same as subtraction and both are
equivalent to the XOR operation.</t>
        </aside>
      </section>
    </section>
    <section anchor="multiplication">
      <name>Multiplication Protocol</name>
      <t>The product of two shared values, x and y, is computed using the following process.</t>
      <t>Since <tt>x = x₁ + x₂ + x₃</tt> and <tt>y = y₁ +
y₂ + y₃</tt> the product <tt>z = x · y</tt> can be expanded as:</t>
      <sourcecode type="pseudocode"><![CDATA[
z = (x₁ + x₂ + x₃) · (y₁ + y₂ + y₃)
]]></sourcecode>
      <t>This can be illustrated with a 3 by 3 table (<xref target="tab-mul"/>):</t>
      <table anchor="tab-mul">
        <name>Multiplication by Parts</name>
        <thead>
          <tr>
            <th align="left"> </th>
            <th align="left">y₁</th>
            <th align="left">y₂</th>
            <th align="left">y₃</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">x<sub>1</sub></td>
            <td align="left">x<sub>1</sub>*y<sub>1</sub></td>
            <td align="left">x<sub>1</sub>*y<sub>2</sub></td>
            <td align="left">x<sub>1</sub>*y<sub>3</sub></td>
          </tr>
          <tr>
            <td align="left">x<sub>2</sub></td>
            <td align="left">x<sub>2</sub>*y<sub>1</sub></td>
            <td align="left">x<sub>2</sub>*y<sub>2</sub></td>
            <td align="left">x<sub>2</sub>*y<sub>3</sub></td>
          </tr>
          <tr>
            <td align="left">x<sub>3</sub></td>
            <td align="left">x<sub>3</sub>*y<sub>1</sub></td>
            <td align="left">x<sub>3</sub>*y<sub>2</sub></td>
            <td align="left">x<sub>3</sub>*y<sub>3</sub></td>
          </tr>
        </tbody>
      </table>
      <t>To compute the product, each party locally computes the sum of three products as follows:</t>
      <sourcecode type="pseudocode"><![CDATA[
z₋ = x₋·y₋ + x₋·y₊ + x₊·y₋
]]></sourcecode>
      <t>To visualize this, <xref target="fig-mul"/> shows cells labeled with the party responsible for computing that partial product:</t>
      <figure anchor="fig-mul">
        <name>Multiplication by Party</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="320" width="432" viewBox="0 0 432 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 32,48 L 32,144" fill="none" stroke="black"/>
              <path d="M 32,192 L 32,288" fill="none" stroke="black"/>
              <path d="M 88,80 L 88,112" fill="none" stroke="black"/>
              <path d="M 88,256 L 88,288" fill="none" stroke="black"/>
              <path d="M 144,48 L 144,80" fill="none" stroke="black"/>
              <path d="M 144,192 L 144,224" fill="none" stroke="black"/>
              <path d="M 144,256 L 144,288" fill="none" stroke="black"/>
              <path d="M 200,48 L 200,144" fill="none" stroke="black"/>
              <path d="M 200,192 L 200,288" fill="none" stroke="black"/>
              <path d="M 256,48 L 256,144" fill="none" stroke="black"/>
              <path d="M 312,80 L 312,144" fill="none" stroke="black"/>
              <path d="M 368,112 L 368,144" fill="none" stroke="black"/>
              <path d="M 424,48 L 424,144" fill="none" stroke="black"/>
              <path d="M 32,48 L 200,48" fill="none" stroke="black"/>
              <path d="M 256,48 L 424,48" fill="none" stroke="black"/>
              <path d="M 88,80 L 144,80" fill="none" stroke="black"/>
              <path d="M 312,80 L 424,80" fill="none" stroke="black"/>
              <path d="M 32,112 L 88,112" fill="none" stroke="black"/>
              <path d="M 368,112 L 424,112" fill="none" stroke="black"/>
              <path d="M 32,144 L 200,144" fill="none" stroke="black"/>
              <path d="M 256,144 L 424,144" fill="none" stroke="black"/>
              <path d="M 32,192 L 200,192" fill="none" stroke="black"/>
              <path d="M 144,224 L 200,224" fill="none" stroke="black"/>
              <path d="M 32,256 L 88,256" fill="none" stroke="black"/>
              <path d="M 144,256 L 200,256" fill="none" stroke="black"/>
              <path d="M 32,288 L 200,288" fill="none" stroke="black"/>
              <g class="text">
                <text x="60" y="36">y₁</text>
                <text x="116" y="36">y₂</text>
                <text x="172" y="36">y₃</text>
                <text x="284" y="36">y₁</text>
                <text x="340" y="36">y₂</text>
                <text x="396" y="36">y₃</text>
                <text x="12" y="68">x₁</text>
                <text x="60" y="68">P₁</text>
                <text x="236" y="68">x₁</text>
                <text x="12" y="100">x₂</text>
                <text x="236" y="100">x₂</text>
                <text x="340" y="100">P₂</text>
                <text x="12" y="132">x₃</text>
                <text x="236" y="132">x₃</text>
                <text x="44" y="180">y₁</text>
                <text x="100" y="180">y₂</text>
                <text x="156" y="180">y₃</text>
                <text x="12" y="212">x₁</text>
                <text x="172" y="212">P₃</text>
                <text x="12" y="244">x₂</text>
                <text x="12" y="276">x₃</text>
                <text x="60" y="276">P₃</text>
                <text x="172" y="276">P₃</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
        y₁     y₂     y₃            y₁     y₂     y₃
     +-------------+------+      +--------------------+
  x₁ |  P₁         |      |   x₁ |                    |
     |      +------+      |      |      +-------------+
  x₂ |      |             |   x₂ |      |  P₂         |
     +------+             |      |      |      +------+
  x₃ |                    |   x₃ |      |      |      |
     +--------------------+      +------+------+------+

      y₁     y₂     y₃
     +-------------+------+
  x₁ |             |  P₃  |
     |             +------+
  x₂ |                    |
     +------+      +------+
  x₃ |  P₃  |      |  P₃  |
     +------+------+------+
]]></artwork>
        </artset>
      </figure>
      <t>The result is a non-replicated sharing of the result <tt>z = z₁ + z₂ + z₃</tt>.</t>
      <t>To reach the desired state where parties each have replicated shares of <tt>z</tt>, each
party needs to send its share, <tt>z₋</tt>, to the party to its left.</t>
      <t>Unfortunately, each party cannot simply send this value to another party, as
this would allow the recipient to reconstruct the full input values, <tt>x</tt> and
<tt>y</tt>, using <tt>z₋</tt>. To prevent this, the value of <tt>z₋</tt> is masked with a uniformly
distributed random mask that is unknown to party P<sub>-</sub>.</t>
      <t>Using a source of shared randomness (such as <xref target="PRSS"/>), each pair of helpers
generates a uniformly distributed random value known only to the two of
them. Let <tt>r₋</tt> denote the left value (known to P<sub>-</sub>) and <tt>r₊</tt> be the
right value (known to P<sub>+</sub>).</t>
      <t>Each party uses <tt>r₋</tt> and <tt>r₊</tt> to create a masked value of <tt>z₋</tt> as follows:</t>
      <sourcecode type="pseudocode"><![CDATA[
z₋ = x₋·y₋ + x₋·y₊ + x₊·y₋ + r₋ - r₊
]]></sourcecode>
      <t>Each of these three mask values are added once and subtracted once, so this
masking does not alter the result. Importantly, the value of <tt>r₊</tt> is not
known to P<sub>-</sub>, which ensures that <tt>z₋</tt> cannot be used by P<sub>-</sub>
to recover <tt>x</tt> or <tt>y</tt>. Thus, <tt>z₋</tt> is safe to send to P<sub>-</sub>.</t>
      <t>Upon receiving a value from its right — which the recipient names <tt>z₊</tt> — each
helper is now in possession of two-of-three shares, (<tt>z₋</tt>, <tt>z₊</tt>), which is a
replicated secret sharing of the product of <tt>x</tt> and <tt>y</tt>.</t>
    </section>
    <section anchor="validation">
      <name>Validation Protocol</name>
      <t>The basic multiplication protocol in <xref target="multiplication"/> only offers semi-honest
security. It is secure up to an additive attack; see <xref target="additive-attack"/>. Validating multiplications
allows an additive attack to be detected, ensuring that a protocol is aborted
before any result is produced that might compromise the confidentiality of
inputs.</t>
      <section anchor="additive-attack">
        <name>Additive Attack</name>
        <t>By "additive attack", we mean that instead of sending the value <tt>z₋</tt>, a corrupted
party could instead send <tt>z₋ + a</tt>. In the context of boolean circuits, the only
possible additive attack is to add 1.</t>
        <t>The multiplication protocol described does not prevent this. Since the value
<tt>z₋</tt> is randomly distributed, the party (P<sub>-</sub>) that receives this
value cannot tell if an additive attack has been applied.</t>
        <t>While an additive attack does not result in information about the inputs being
revealed, it corrupts the results. If a protocol depends on revealing certain
values, this sort of corruption could be used to reveal information that might
not otherwise be revealed.</t>
        <t>For example, if the parties were computing a function that erases a value unless
it has reached some minimum such as:</t>
        <sourcecode type="python"><![CDATA[
if total_count > 1000:
    reveal(total_count)
else:
    reveal(0)
]]></sourcecode>
        <t>If a corrupted helper wanted to reveal a total_count that was less than 1000, it
could add 1 to the final multiplication used to compute the condition
<tt>total_count &gt; 1000</tt>. The result is that values below the minimum are revealed
(and values above the minimum are erased), violating the conditions on the
protocol.</t>
      </section>
      <section anchor="malicious-security">
        <name>Malicious Security</name>
        <t>Before any values are revealed, the parties perform a validation protocol. This
protocol confirms that all of the multiplications performed were performed
correctly. That is, that no additive attack was applied by any party.</t>
        <t>If this validation protocol fails, the parties abort the protocol and no values
are revealed. All parties destroy the shares they hold.</t>
      </section>
      <section anchor="overview-of-the-validation-protocol">
        <name>Overview of the Validation Protocol</name>
        <t>Each of the parties produces a "Zero Knowledge Proof" (ZKP) that proves to the
two other parties (P<sub>-</sub> and P<sub>+</sub>) that all of the
multiplications it performed were done correctly. The two other parties act as
"verifiers" and validate this zero knowledge proof.</t>
        <t>The validation protocol is therefore executed three times, with each party
acting as a prover.  Each validation can occur concurrently.</t>
        <t>When operating in a boolean field, if P<sub>=</sub> followed the protocol
correctly, this is how they would compute <tt>z₋</tt>:</t>
        <sourcecode type="pseudocode"><![CDATA[
z₋ = x₋·y₋ ⊕ x₋·y₊ ⊕ x₊·y₋ ⊕ r₋ ⊕ r₊
]]></sourcecode>
        <t>This can be restated as:</t>
        <sourcecode type="pseudocode"><![CDATA[
x₋·y₋ ⊕ x₋·y₊ ⊕ x₊·y₋ ⊕ r₋ ⊕ r₊ ⊕ z₋ = 0
]]></sourcecode>
        <t>The left hand side of this expression will equal zero if the protocol was followed
correctly, but it will equal one if there was an additive attack.</t>
        <t>Validation is made more efficient by validating multiple multiplications at the
same time.</t>
        <t>The above statement can be transformed to yield the result (either zero or one)
as a value in a large prime field <xref target="prime_field_transformation"/>. These values
can be summed across all the multiplications in a large batch. The total sum will
be the count of additive attacks applied, which will be zero if the prover correctly
followed the protocol. There will not be any wrapping around so long as the number
of multiplications in the batch is smaller than the prime used to define the field.</t>
        <t>For this protocol, the parties will use the field of integers mod <tt>p</tt>, where <tt>p</tt> is a large prime.</t>
      </section>
      <section anchor="distributed-zero-knowledge-proofs">
        <name>Distributed Zero-Knowledge Proofs</name>
        <t>The prover (P<sub>=</sub>) needs to prove that for each multiplication in a batch:</t>
        <sourcecode type="pseudocode"><![CDATA[
x₋·y₋ ⊕ x₋·y₊ ⊕ x₊·y₋ ⊕ r₋ ⊕ r₊ ⊕ z₋ = 0
]]></sourcecode>
        <t>The left verifier (P<sub>-</sub>) knows the values of <tt>y₋</tt>, <tt>x₋</tt>,
<tt>r₋</tt>, and <tt>z₋</tt>.</t>
        <t>The right verifier (P<sub>+</sub>) knows the values of <tt>x₊</tt>, <tt>y₊</tt>,
<tt>r₊</tt>.</t>
        <t>This means that the prover (P<sub>=</sub>) does not need to send any of these
values to the verifiers. Verifiers use information they already have to validate
the proof.</t>
        <t>Since the two verifiers possess all of this information distributed amongst
themselves, this approach is referred to as "Distributed Zero Knowledge Proofs".</t>
      </section>
      <section anchor="distributed-zero-knowledge-proofs-1">
        <name>Distributed Zero Knowledge Proofs</name>
        <t><xref target="FLPCP"/> describes a system of zero-knowledge
proofs that rely on linear operations. This is expanded in
<xref target="BOYLE"/> to apply to three-party
honest-majority MPC, requiring only O(logN) communication in total.  These
proofs are able to validate the computation of an inner product, or expressions
of the form:</t>
        <sourcecode type="pseudocode"><![CDATA[
sum(i=0..n, uᵢ · vᵢ) = t
]]></sourcecode>
        <t>This depends on the prover (P<sub>=</sub>) and left verifier (P<sub>-</sub>)
both possessing the n-vector <tt>u</tt>, the prover (P<sub>=</sub>) and the right
verifier (P<sub>+</sub>) possessing the n-vector <tt>v</tt>, and the verifiers
P<sub>-</sub> and P<sub>+</sub> jointly holding shares of the target value, <tt>t</tt>
(that is, P<sub>-</sub> holds <tt>t₋</tt> and P<sub>-</sub> holds <tt>t₊</tt> such that <tt>t₋
+ t₊ = t</tt>).</t>
        <t>However, the security of this protocol requires the vector elements <tt>u</tt> and <tt>v</tt>
to be members of a large field. So the first step of the validation protocol is
to take a batch of multiplications, and convert them into a dot product of
vectors with elements in a large field.</t>
      </section>
      <section anchor="prime_field_transformation">
        <name>Transforming into a Large Prime Field</name>
        <t><xref target="BINARY"/> describes how to apply <xref target="FLPCP"/>
efficiently for binary fields.  When binary values are directly lifted into a
large field, the XOR operation can be computed with the expression:</t>
        <sourcecode type="pseudocode"><![CDATA[
f(x, y) = x ⊕ y
        = x + y - 2·x·y
        = x·(1 - 2·y) + y
]]></sourcecode>
        <t>Using this relation, the expression that must be proven can be converted into a
dot-product of two vectors, one of which is known to both P<sub>=</sub> and
P<sub>-</sub>, the other being known to both P<sub>=</sub> and P<sub>+</sub>.</t>
        <t>Rearranging terms:</t>
        <sourcecode type="pseudocode"><![CDATA[
x₋·y₊ ⊕ (x₋·y₋ ⊕ z₋ ⊕ r₋ ) ⊕ x₊·y₋ ⊕ r₊ = 0
]]></sourcecode>
        <t>Define:</t>
        <sourcecode type="pseudocode"><![CDATA[
e₋ = x₋·y₋ ⊕ z₋ ⊕ r₋
]]></sourcecode>
        <t>Then:</t>
        <sourcecode type="pseudocode"><![CDATA[
(x₋·y₊ ⊕ e₋ ) ⊕ (x₊·y₋ ⊕ r₊) = 0
]]></sourcecode>
        <t>Using: <tt>x ⊕ y = x·(1 - 2·y) + y</tt></t>
        <sourcecode type="pseudocode"><![CDATA[
(x₋·y₊·(1 - 2e₋) + e₋) ⊕ (x₊·y₋·(1 - 2r₊) + r₊) = 0
]]></sourcecode>
        <t>Using: <tt>x ⊕ y = x + y - 2·x·y</tt></t>
        <sourcecode type="pseudocode"><![CDATA[
(x₋·y₊·(1 - 2e₋) + e₋)
+ (x₊·y₋·(1 - 2r₊) + r₊)
- 2(x₋·y₊·(1 - 2e₋) + e₋)(x₊·y₋·(1 - 2r₊) + r₊) = 0
]]></sourcecode>
        <t>Distributing and rearranging terms, plus subtracting 1/2 from both sides,
produces:</t>
        <sourcecode type="pseudocode"><![CDATA[
- 2x₋·y₋·(1 - 2e₋)·y₊·x₊·(1 - 2r₊)
+ y₋·x₊·(1 - 2r₊) - 2e₋·y₋·x₊·(1 - 2r₊)
+ x₋·(1 - 2e₋)·y₊ - 2x₋·(1 - 2e₋)·y₊·r₊
+ e₋ - 2e₋·r₊ + r₊ - ½ = - ½
]]></sourcecode>
        <t>Factoring allows this to be written as an expression with four terms, each with
a component taken from the left and a component from
the right.</t>
        <sourcecode type="pseudocode"><![CDATA[
[-2x₋·y₋·(1 - 2e₋)] · [y₊·x₊·(1 - 2r₊)]
+ [y₋(1 - 2e₋)] · [x₊·(1 - 2r₊)]
+ [x₋·(1 - 2e₋)] · [y₊(1 - 2r₊)]
+ [-½(1 - 2e₋)] · [(1 - 2r₊)] = -½
]]></sourcecode>
        <t>Components on the left form a vector that can be named <tt>g</tt>, and components on
the right form a vector, <tt>h</tt>. The result is the dot product of two four
dimensional vectors:</t>
        <sourcecode type="pseudocode"><![CDATA[
g₁·h₁ + g₂·h₂ + g₃·h₃ + g₄·h₄ = -½
]]></sourcecode>
        <t>Alternatively:</t>
        <sourcecode type="pseudocode"><![CDATA[
sum(i=1..4, gᵢ·hᵢ) = -½
]]></sourcecode>
        <t>From this point, each party can compute the vectors that they are able to.</t>
        <t>P<sub>=</sub> and P<sub>-</sub> both compute <tt>gᵢ</tt> as follows:</t>
        <sourcecode type="pseudocode"><![CDATA[
g₁ = -2·x₋·y₋·(1 - 2·e₋ )
g₂ = y₋·(1 - 2·e₋ )
g₃ = x₋·(1 - 2·e₋ )
g₄ = -½(1 - 2·e₋)
]]></sourcecode>
        <t>And where:</t>
        <sourcecode type="pseudocode"><![CDATA[
e₋ = x₋·y₋ ⊕ z₋ ⊕ r₋
]]></sourcecode>
        <t>P<sub>=</sub> and P<sub>+</sub> both compute <tt>hᵢ</tt> as follows:</t>
        <sourcecode type="pseudocode"><![CDATA[
h₁ = y₊·x₊·(1 - 2·r₊)
h₂ = x₊·(1 - 2·r₊)
h₃ = y₊·(1 - 2·r₊)
h₄ = 1 − 2·r₊
]]></sourcecode>
        <t>These vectors form the basis of later stages of the proof.</t>
        <aside>
          <t>In the prime field modulo 2<sup>61</sup>-1, the negative inverse of two
(-2<sup>-1</sup> or -½) is 1,152,921,504,606,846,975.</t>
        </aside>
      </section>
      <section anchor="initial-uv">
        <name>Validating a batch of multiplications</name>
        <t>Each multiplication therefore produces two vectors, with each vector being
length 4. To validate a batch of <tt>m</tt> multiplications, the prover
(P<sub>=</sub>), forms two vectors of length <tt>4m</tt>.</t>
        <t>The prover (P<sub>=</sub>), and left verifier (P<sub>-</sub>) both produce the
vector <tt>u</tt> by concatenating the vectors from all multiplications:</t>
        <sourcecode type="pseudocode"><![CDATA[
u = (g₁⁽¹⁾, g₂⁽¹⁾, g₃⁽¹⁾, g₄⁽¹⁾,
     g₁⁽²⁾, g₂⁽²⁾, g₃⁽²⁾, g₄⁽²⁾,
     …
     g₁⁽ᵐ⁾, g₂⁽ᵐ⁾, g₃⁽ᵐ⁾, g₄⁽ᵐ⁾)
]]></sourcecode>
        <t>The prover (P<sub>=</sub>) and right verifier (P<sub>+</sub>) both compute the vector <tt>v</tt> in the same way:</t>
        <sourcecode type="pseudocode"><![CDATA[
v = (h₁⁽¹⁾, h₂⁽¹⁾, h₃⁽¹⁾, h₄⁽¹⁾,
     h₁⁽²⁾, h₂⁽²⁾, h₃⁽²⁾, h₄⁽²⁾,
     … ,
     h₁⁽ᵐ⁾, h₂⁽ᵐ⁾, h₃⁽ᵐ⁾, h₄⁽ᵐ⁾)
]]></sourcecode>
        <t>If no additive attacks were applied by the prover, the dot product of these two vectors should be:</t>
        <sourcecode type="pseudocode"><![CDATA[
u·v = -m/2
]]></sourcecode>
      </section>
      <section anchor="overview-of-recursive-proof-compression">
        <name>Overview of Recursive Proof Compression</name>
        <t>Now that we have expressed the work of the prover as a simple dot product of two
vectors of large field elements, we can use a recursive approach to prove this
expression with O(logN) communication.</t>
        <t>The process is iterative, where at each stage there is a pair of vectors, <tt>u</tt>
and <tt>v</tt>, and a target, <tt>t</tt>, where the goal is to prove that <tt>u·v = t</tt>. The
values of <tt>u</tt> and <tt>v</tt> start as described in <xref target="initial-uv"/>; with <tt>t</tt> initially
set to a value of <tt>-m/2</tt>.</t>
        <t>At each iteration:</t>
        <ol spacing="normal" type="1"><li>
            <t>Select a compression factor <tt>L</tt>.</t>
          </li>
          <li>
            <t>Chunk the vectors <tt>u</tt> and <tt>v</tt> into <tt>s</tt> segments of length <tt>L</tt>.  </t>
            <ol spacing="normal" type="1"><li>
                <t>Each chunk of <tt>u</tt> uniquely defines a polynomial of degree <tt>L - 1</tt> which
are named <tt>pᵢ(x)</tt>, indexed by <tt>i ∊ [0..s)</tt>.</t>
              </li>
              <li>
                <t>Each chunk of <tt>v</tt> uniquely defines a polynomial of degree <tt>L - 1</tt> which
are named <tt>qᵢ(x)</tt>, indexed by <tt>i ∊ [0..s)</tt>.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>The polynomial <tt>G(x)</tt> is defined as: <tt>sum(i=0..s, pᵢ(x) · qᵢ(x))</tt>  </t>
            <t>
For <tt>x ∊ [0..L-1)</tt>, this polynomial <tt>G(x)</tt> computes the inner product of a
portion of <tt>u</tt> and <tt>v</tt>. So the goal becomes proving that <tt>sum(i=0..L-1, G(i)) = t</tt>.  </t>
            <t>
In the first iteration, the target value <tt>t</tt> is known by all parties to be
<tt>-m/2</tt>, so left verifier (<tt>P₋</tt>) sets their share <tt>t₋</tt> to <tt>-m/2</tt> and the right
verifier <tt>P₊</tt> sets their share <tt>t₊</tt> to zero. In subsequent iterations the
target value will not be known to both verifiers.  </t>
            <ol spacing="normal" type="1"><li>
                <t>The prover will compute the value of <tt>G(0)</tt>, <tt>G(1)</tt>, ... , <tt>G(2L - 2)</tt>,
the minimal number of points required to uniquely define it.</t>
              </li>
              <li>
                <t>These <tt>2L - 1</tt> points are split into two additive secret-shares
<tt>G(x)_-</tt> and <tt>G(x)_+</tt> and sent to the verifiers
<tt>P₋</tt> and <tt>P₊</tt>, respectively. These shares form the
distributed zero-knowledge proof.</t>
              </li>
              <li>
                <t>The verifiers each sum together the first <tt>L - 1</tt> points they were given:
<tt>P₋</tt> computes <tt>sum₋ = sum(i=0..L-1, G(i)_-)</tt>.
<tt>P₊</tt> computes <tt>sum₊ = sum(i=0..L-1, G(i)_+)</tt>.
where <tt>sum₋ + sum₊ = sum(0..L-1, G(i))</tt>.</t>
              </li>
              <li>
                <t>Now the verifiers verify the proposition <tt>sum(i=0..L-1, G(i)) = t</tt> by having
<tt>P₋</tt> compute <tt>b₋ = t₋ - sum₋</tt> and
<tt>P₊</tt> compute <tt>b₊ = t₊ - sum₊</tt>.
They send each other these values and confirm that
<tt>b₋ + b₊ = 0</tt>. If this test fails, the entire protocol is aborted.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>At this point, the prover could have produced values for <tt>G(0..L-1)</tt> that
pass this test even if they had performed an additive attack. The proof needs
to be validated by confirming that <tt>G(r) = sum(i=0..s, pᵢ(r) ·
qᵢ(r))</tt> for a randomly selected challenge point <tt>r</tt>. As long as
the prover cannot control the choice of <tt>r</tt>, the likelihood that a dishonest
prover can cheat without detection is inversely proportional to the field size.  </t>
            <ol spacing="normal" type="1"><li>
                <t>If we define two new vectors <tt>u′ = { p₀(r), …,
pₛ₋₁(r) }</tt>, and <tt>v′ = { &lt;q₀(r), …,
qₛ₋₁(r) }</tt>, then we can rewrite the statement that needs to be
proven as: <tt>u′ · v′ = G(r)</tt>. This is of the same form as the original
statement, but with the new vectors <tt>u′</tt> and <tt>v′</tt> having length <tt>L</tt> times
shorter than the original vectors.</t>
              </li>
              <li>
                <t><tt>u′</tt> and <tt>v′</tt> need not be communicated, since the prover and left verifier (<tt>P₋</tt>)
can both compute each value <tt>pᵢ(r)</tt> using Lagrange interpolation,
just as the prover and right verifier (<tt>P₊</tt>) can compute each value <tt>qᵢ(r)</tt>.</t>
              </li>
              <li>
                <t>Each of the verifiers can use the <tt>2L - 1</tt> points they received (their share
of <tt>G(x)</tt>) to compute a share of <tt>G(r)</tt> using Lagrange interpolation. These
shares become their share of a new value for <tt>t</tt>.</t>
              </li>
              <li>
                <t>The Fiat-Shamir heuristic can be used to generate <tt>r</tt> by hashing the
distributed zero knowledge proof. This transforms this protocol from a
multi-round interactive protocol into a constant round protocol.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>The vectors <tt>u</tt> and <tt>v</tt> are replaced by <tt>u′</tt> and <tt>v′</tt>, the value of <tt>t</tt> is
set to <tt>G(r)</tt>, and the next iteration is started.</t>
          </li>
        </ol>
        <t>The recursion ends when the vectors <tt>u</tt> and <tt>v</tt> have length less than <tt>L</tt>.  The
verifiers validate the soundness of the final iteration of the proof in a
simpler, more direct way; see <xref target="final-iteration"/>.</t>
      </section>
      <section anchor="detailed-validation-algorithm">
        <name>Detailed Validation Algorithm</name>
        <section anchor="selecting-the-compression-factor">
          <name>Selecting the Compression Factor</name>
          <t>For the first iteration, the parties will use a compression factor (<tt>L</tt>) of 32. In
all subsequent rounds they will use a compression factor of 8.</t>
          <t>Note: A larger value for <tt>L</tt> increases the compression factor, which reduces the
overall communication cost. However, because the computation of the proof
requires Lagrange interpolation (which is O(L<sup>2</sup>) computation), a
larger compression factor quickly becomes expensive. A slightly larger
compression factor on the first round is possible because there are only a small
number of possible input values, so the work can be reduced with the use of
lookup tables if necessary.</t>
        </section>
        <section anchor="producing-polynomials-px-and-qx">
          <name>Producing Polynomials <tt>p(x)</tt> and <tt>q(x)</tt></name>
          <t>The prover (P<sub>=</sub>) and the left verifier (P<sub>-</sub>), chunk the vector
<tt>u</tt> into <tt>s</tt> chunks of length <tt>L</tt>.</t>
          <ul spacing="normal">
            <li>
              <t>chunk 0: &lt;u<sub>0</sub>, u<sub>1</sub>, …, u<sub>L-1</sub>&gt;</t>
            </li>
            <li>
              <t>chunk 1: &lt;u<sub>L</sub>, u<sub>L+1</sub>, …, u<sub>2L-1</sub>&gt;</t>
            </li>
            <li>
              <t>…</t>
            </li>
            <li>
              <t>chunk s-1: &lt;u<sub>(s-1)L</sub>, u<sub>(s-1)L+1</sub>, …, u<sub>sL-1</sub>&gt;</t>
            </li>
          </ul>
          <t>If the length of <tt>u</tt> is not divisible by <tt>L</tt>, then the final chunk will be
padded with zeros.</t>
          <t>In the first iteration there will be <tt>s = ceil(4m / L)</tt> chunks, as the original
vectors <tt>u</tt> and <tt>v</tt> have length <tt>4m</tt>. In subsequent iterations there will be
fewer chunks.</t>
          <t>They will interpret each chunk as <tt>L</tt> points lying on a polynomial,
<tt>pᵢ(x)</tt> of degree <tt>L-1</tt>, corresponding to the <tt>x</tt> coordinates <tt>{ 0,
1, …, L-1 }</tt>, that is to say they will interpret them as <tt>{ pᵢ(0),
pᵢ(1), …, pᵢ(L-1) }</tt>.</t>
          <t>The prover (P<sub>=</sub>) and left verifier (P<sub>-</sub>) can find the value of
<tt>pᵢ(x)</tt> for any other value of <tt>x</tt> using Lagrange interpolation.</t>
          <t>The prover (P<sub>=</sub>) uses Lagrange interpolation to compute the values <tt>{
pᵢ(L), pᵢ(L+1), …, pᵢ(2L-2) }</tt>.</t>
          <t>The same process is applied for the vector <tt>v</tt> with the right verifier, (P<sub>+</sub>).</t>
          <t>The prover (P<sub>=</sub>) and the right verifier (P<sub>+</sub>), chunk the vector <tt>v</tt>
into <tt>s</tt> chunks of length <tt>L</tt>.</t>
          <ul spacing="normal">
            <li>
              <t>chunk 0: &lt;v<sub>0</sub>, v<sub>1</sub>, …, v<sub>L-1</sub>&gt;</t>
            </li>
            <li>
              <t>chunk 1: &lt;v<sub>L</sub>, v<sub>L+1</sub>, …, v<sub>2L-1</sub>&gt;</t>
            </li>
            <li>
              <t>…</t>
            </li>
            <li>
              <t>chunk s-1: &lt;v<sub>(s-1)L</sub>, v<sub>(s-1)L+1</sub>, …, v<sub>sL-1</sub>&gt;</t>
            </li>
          </ul>
          <t>As before, if the length of <tt>v</tt> is not a multiple of <tt>L</tt>, the final chunk will
be padded with zeros.</t>
          <t>Each chunk is interpreted as <tt>L</tt> points on a polynomial. From this the values <tt>{
qᵢ(L), qᵢ(L+1), …, qᵢ(2L-2) }</tt> are found using
using Lagrange interpolation.</t>
        </section>
      </section>
      <section anchor="producing-the-zero-knowledge-proof">
        <name>Producing the Zero Knowledge Proof</name>
        <t>In order to prove that <tt>u·v = t</tt>, the prover will compute the value of <tt>2L-1</tt>
points on the polynomial <tt>G(x)</tt>, which is defined as:</t>
        <sourcecode type="pseudocode"><![CDATA[
G(x) = sum(i=1..s, pᵢ(x) · qᵢ(x))
]]></sourcecode>
        <t>The prover computes the values of <tt>{ G(0), G(1), …, G(2L-2) }</tt> by incrementally
aggregating the products of <tt>{ pᵢ(0), pᵢ(1), …,
pᵢ(2L-21) }</tt> and <tt>{ qᵢ(L), qᵢ(L+1), …,
qᵢ(2L-2) }</tt>, for each chunk.</t>
        <t>These <tt>2L-1</tt> points on the polynomial <tt>G(x)</tt> constitute the zero-knowledge proof
that <tt>u·v = t</tt>.</t>
        <t>An equivalent method of proving <tt>u·v = t</tt>, is to show that <tt>sum(i=0..L-1, G(i))
= t</tt>.</t>
        <section anchor="masking-the-zero-knowledge-proof">
          <name>Masking the Zero-Knowledge Proof</name>
          <t>The prover (P<sub>=</sub>), cannot simply send this zero-knowledge proof to the
verifiers, as doing so would release private information. Instead, the prover
produces a two-part additive secret-sharing of these <tt>2L-1</tt> points, sending one
share to each verifier.</t>
          <t>The prover (P<sub>=</sub>) and the right verifier (P<sub>+</sub>) generate one
share using their shared randomness, which means that no communication is
needed.  This share is denoted <tt>G(x)_+</tt>.</t>
          <t>The prover (P<sub>=</sub>) computes the other share via subtraction.  That is,
<tt>G₋(x) = G(x) - G₊(x)</tt>.  This value is sent to the left verifier
(P<sub>-</sub>). Transmitting this share <tt>G(x)_-</tt> involves sending <tt>2L-1</tt> field
values.</t>
        </section>
        <section anchor="validating-the-proof-increment">
          <name>Validating the Proof Increment</name>
          <t>To check that <tt>sum(i=0..L-1, G(i)) = t</tt>, the left verifier (P<sub>-</sub>)
computes:</t>
          <sourcecode type="pseudocode"><![CDATA[
b₋ = t₋ - sum(i=0..L-1, G(i)_-)
]]></sourcecode>
          <t>Similarly, the right verifier (P<sub>+</sub>) computes:</t>
          <sourcecode type="pseudocode"><![CDATA[
b₊ = t₊ - sum(i=0..L-1, G(i)_+)
]]></sourcecode>
          <t>The two verifiers will reveal these values <tt>b₋</tt> and <tt>b₊</tt> to one another, so
that each can reconstruct the full sum, <tt>b = b₋ + b₊</tt>.</t>
          <t>Each confirms that <tt>b</tt> is zero. If it is not, the parties abort and destroy
their shares.</t>
        </section>
        <section anchor="challenge">
          <name>Random Challenge</name>
          <t>Now that the verifiers have confirmed that the proof says that there was no
additive attack, they need to validate that this was indeed a legitimate
zero-knowledge proof.  The prover knows the value of <tt>t</tt>, even if each verifier
only has shares of <tt>t</tt> after the first round.  Therefore, it is trivial for a
prover to falsify <tt>G(x)</tt>.</t>
          <t>To demonstrate that the prover has provided a valid <tt>G(x)</tt>, a random field
element, <tt>r</tt>, is chosen from the range <tt>[L, p)</tt> (that is, a value that is not
part of the proof).  The prover then has to show that the value of <tt>G(r)</tt>
matches what the verifiers hold.  The verifiers could jointly compute this value
using the values of <tt>pᵢ(x)</tt> and <tt>qᵢ(x)</tt>.</t>
          <t>The key requirement in choosing <tt>r</tt> is that the prover cannot influence the
choice.</t>
        </section>
        <section anchor="fiat-shamir-challenge-selection">
          <name>Fiat-Shamir Challenge Selection</name>
          <t>To minimize the rounds of communication, instead of having the verifiers select
this random point, we utilize the Fiat-Shamir transform to produce a
constant-round proof system.</t>
          <t>The prover (P<sub>=</sub>) hashes the zero-knowledge proof shares it has
generated onto a field element as follows:</t>
          <sourcecode type="pseudocode"><![CDATA[
commitment = SHA256(
  concat(
    SHA256([G(x)]_-),
    SHA256([G(x)]_+)
  )
)
r = (bytes2int(commitment[..16]) % (prime - L)) + L
]]></sourcecode>
          <t>This computation does not use the entire output of the hash function, just
enough to ensure that the value of r has minimal bias. For SHA-256 and a prime
field modulo 2<sup>61</sup>-1, the bias is in the order of 2<sup>-67</sup>,
which is negligible.</t>
          <t>The verifiers generate the same point <tt>r</tt> independently. Each verifier only has
access to one set of shares from <tt>G(x)</tt> so they each compute a hash of the shares
they have. They then send that hash to each other, after which they can concatenate
the two hash values and compute the challenge point.</t>
          <t>Note that one verifier does not need to receive their shares of <tt>G(x)</tt> from the
prover, so they are able to compute their hash before even starting any
computation.</t>
          <t>Consequently, though each round depends on communication, the total latency is two rounds. In the first, the prover sends shares of G(x) to the left verifier. Concurrently, the right verifier sends a hash of their shares to the left verifier. In the second round, the left verifier sends a hash of their shares to the right verifier.</t>
          <!-- TODO: this Fiat-Shamir seems worse than an explicit challenge… -->

</section>
        <section anchor="recursive-proof">
          <name>Recursive Proof</name>
          <t>At the end of each round, the prover is left with the task of proving that
<tt>G(r)</tt> is correct based on the random challenge. <tt>r</tt>.</t>
          <t>Recall the definition of <tt>G(x)</tt>:</t>
          <sourcecode type="pseudocode"><![CDATA[
G(x) = sum(i=0..s, pᵢ(x)·qᵢ(x))
]]></sourcecode>
          <t>This is equivalent to providing that <tt>u′ · v′ = G(r)</tt>, where:</t>
          <sourcecode type="pseudocode"><![CDATA[
u′ = <p₀(r), p₁(r), …>
v′ = <q₀(r), q₁(r), …>
]]></sourcecode>
          <t>This is a problem of exactly the same form as the original problem, except that
the length of <tt>u′</tt> and <tt>v′</tt> is now a factor of <tt>L</tt> shorter than the original
length of <tt>u</tt> and <tt>v</tt>.</t>
          <t>The prover (P<sub>=</sub>) and left verifier (P<sub>-</sub>) use Lagrange interpolation
to compute the value of <tt>pᵢ(r)</tt> for all chunks in the range <tt>0..s</tt>
and set this as the new vector <tt>u</tt>.</t>
          <t>Similarly, the prover (P<sub>=</sub>) and right verifier (P<sub>+</sub>) use Lagrange
interpolation to compute the value of <tt>qᵢ(r)</tt> and set this as the new
vector <tt>v</tt>.</t>
          <t>The target value <tt>t</tt> is set to <tt>G(r)</tt>.  The two verifiers do not learn <tt>G(r)</tt>.
Instead, each uses Lagrange interpolation to compute a share of <tt>G(r)</tt>.  That
is:</t>
          <sourcecode type="pseudocode"><![CDATA[
t₋ = lagrange_interpolate(r, [G₋(0), G₋(1), …, G₋(2L-2)])
t₊ = lagrange_interpolate(r, [G₊(0), G₊(1), …, G₊(2L-2)])
]]></sourcecode>
        </section>
        <section anchor="final-iteration">
          <name>The Final Iteration</name>
          <t>The proof proceeds recursively until the length of the vectors <tt>u</tt> and <tt>v</tt> are
strictly less than the compression factor <tt>L</tt>.</t>
          <t>Next, the prover (P<sub>=</sub>) and left verifier (P<sub>-</sub>) jointly
generate a random field value <tt>pₘ</tt> using shared secrets. Similarly, the prover
(P<sub>=</sub>) and right verifier (P<sub>+</sub>) generate a random field value
<tt>qₘ</tt> using shared secrets.</t>
          <t>The prover (P<sub>=</sub>) and left verifier (P<sub>-</sub>) move <tt>u₀</tt> to index
<tt>L-1</tt>. No data will be lost as this replaces a zero value; the length of <tt>u</tt> is
strictly less than <tt>L</tt>.  The value at index 0 is replaced with <tt>pₘ</tt>.</t>
          <t>The prover (P<sub>=</sub>) and right verifier (P<sub>+</sub>) move <tt>v₀</tt>
to index <tt>L-1</tt> and place the value <tt>qₘ</tt> at index 0.</t>
          <t>The prover generates a zero knowledge proof from these polynomials exactly as
before, sending each verifier <tt>2L-1</tt> shares of <tt>G(x)</tt>.  The process of
validation then proceeds differently.</t>
          <t>Firstly, when the verifiers compute their shares of <tt>b</tt>, they ignore the random
value at index 0 of <tt>G(x)</tt>.  That is:</t>
          <sourcecode type="pseudocode"><![CDATA[
b₋ = t₋ - sum(i=1..L-1, G₋(i))
b₊ = t₊ - sum(i=1..L-1, G₊(i))
]]></sourcecode>
          <t>Verifiers confirm that <tt>b₋ + b₊</tt> is zero by exchanging their shares of <tt>b</tt>.</t>
          <t>Finally, the left verifier (P<sub>-</sub>)
computes both <tt>p₀(r)</tt> and <tt>G₋(r)</tt>, right verifier (P<sub>+</sub>)
computes <tt>q₀(r)</tt> and <tt>G₊(r)</tt>, and then the verifiers reveal all of
these values to each other.  They then both verify that:</t>
          <sourcecode type="pseudocode"><![CDATA[
G₋(r) + G₊(r) = p₀(r) · q₀(r)
]]></sourcecode>
          <t>The addition of random masks (<tt>pₘ</tt> and <tt>qₘ</tt>) ensure that revealing <tt>G(r)</tt> in
this way does not reveal anything about the value of the polynomials held by the
other party.  Revealing <tt>q₀(r)</tt>, which was computed from the random values,
only confirms that the prover did not cheat.</t>
        </section>
      </section>
    </section>
    <section anchor="conditions-of-usage">
      <name>Conditions of Usage</name>
      <t>This protocol requires integration into a larger protocol, which will need to:</t>
      <ul spacing="normal">
        <li>
          <t>set or negotiate parameters,</t>
        </li>
        <li>
          <t>provide communication channels,</t>
        </li>
        <li>
          <t>agree on shared secrets, and</t>
        </li>
        <li>
          <t>arrange the multiplications that are to be validated into batches.</t>
        </li>
      </ul>
      <section anchor="recommended-parameters">
        <name>Recommended Parameters</name>
        <t>This document recommends several parameters, which are used in the security
analysis.  Alternative parameters can be used, provided that they meet the
stated requirements.</t>
        <t>For shared secrets, pseudorandom secret sharing <xref target="PRSS"/> is used.  For PRSS
parameters, HPKE <xref target="RFC9180"/> with DHKEM(X25519, HKDF-SHA256), HKDF-SHA256, and
AES-128-GCM is RECOMMENDED, with the same KDF being used for PRSS and AES-128 as
the PRP.</t>
        <t>For validation, the prime field used is modulo the Mersenne prime
2<sup>61</sup>-1 validation.  Any sufficiently large prime can be used, but this
value provides both good performance on 64-bit hardware and useful security
margins for typical batch sizes; see TODO/below for an analysis of the batch
size requirements and security properties that can be obtained by using this
particular prime.</t>
        <t>The Fiat-Shamir transform <xref target="challenge"/> used in the validation proofs can use
SHA-256.  However, any preimage and collision-resistant hash function can be
used provided that it has a enough output entropy to avoid bias in the selected
field value.</t>
      </section>
    </section>
    <section anchor="performance-characteristics">
      <name>Performance Characteristics</name>
      <t>TODO</t>
      <ul spacing="normal">
        <li>
          <t>Communication - number of bits sent/received</t>
        </li>
        <li>
          <t>Computation - how many times you invoke PRSS</t>
        </li>
        <li>
          <t>Vectorization - why it is useful and good</t>
        </li>
        <li>
          <t>How to multiply in parallel - sending and receiving, stalling, etc…</t>
        </li>
        <li>
          <t>Memory requirements
          </t>
          <ul spacing="normal">
            <li>
              <t>Compression factor and choice</t>
            </li>
            <li>
              <t>Trade-offs - time/memory (factor of 64 during generation of r, for Fiat-Shamir version)</t>
            </li>
          </ul>
        </li>
        <li>
          <t>Multiple rounds or Fiat-Shamir</t>
        </li>
      </ul>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO</t>
      <ul spacing="normal">
        <li>
          <t>Parameter choice and security margins
          </t>
          <ul spacing="normal">
            <li>
              <t>Talk about trade-off between attack success probability and prime size.</t>
            </li>
            <li>
              <t>Show equation for how many bits of security you get when validating N multiplications</t>
            </li>
          </ul>
        </li>
        <li>
          <t>You can't just use the multiplication protocol without the validation protocol due to the additive attack (explain why)</t>
        </li>
        <li>
          <t>Communication security (authentication)</t>
        </li>
        <li>
          <t>Constant time and implications thereof</t>
        </li>
        <li>
          <t>Fiat-Shamir vs more rounds</t>
        </li>
      </ul>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA considerations.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="PRSS">
          <front>
            <title>High Performance Pseudorandom Secret Sharing (PRSS)</title>
            <author initials="M." surname="Thomson" fullname="Martin Thomson">
              <organization/>
            </author>
            <author initials="B." surname="Savage" fullname="Ben Savage">
              <organization/>
            </author>
            <date year="2024" month="July"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-thomson-ppm-prss-00"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <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>
        <reference anchor="FLPCP">
          <front>
            <title>Zero-Knowledge Proofs on Secret-Shared Data via Fully Linear PCPs</title>
            <author fullname="Dan Boneh" initials="D." surname="Boneh">
              <organization/>
            </author>
            <author fullname="Elette Boyle" initials="E." surname="Boyle">
              <organization/>
            </author>
            <author fullname="Henry Corrigan-Gibbs" initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author fullname="Niv Gilboa" initials="N." surname="Gilboa">
              <organization/>
            </author>
            <author fullname="Yuval Ishai" initials="Y." surname="Ishai">
              <organization/>
            </author>
            <date year="2019"/>
          </front>
          <seriesInfo name="Advances in Cryptology – CRYPTO 2019" value="pp. 67-97"/>
          <seriesInfo name="DOI" value="10.1007/978-3-030-26954-8_3"/>
          <seriesInfo name="ISBN" value="[&quot;9783030269531&quot;, &quot;9783030269548&quot;]"/>
          <refcontent>Springer International Publishing</refcontent>
        </reference>
        <reference anchor="BOYLE">
          <front>
            <title>Efficient Fully Secure Computation via Distributed Zero-Knowledge Proofs</title>
            <author fullname="Elette Boyle" initials="E." surname="Boyle">
              <organization/>
            </author>
            <author fullname="Niv Gilboa" initials="N." surname="Gilboa">
              <organization/>
            </author>
            <author fullname="Yuval Ishai" initials="Y." surname="Ishai">
              <organization/>
            </author>
            <author fullname="Ariel Nof" initials="A." surname="Nof">
              <organization/>
            </author>
            <date year="2020"/>
          </front>
          <seriesInfo name="Advances in Cryptology – ASIACRYPT 2020" value="pp. 244-276"/>
          <seriesInfo name="DOI" value="10.1007/978-3-030-64840-4_9"/>
          <seriesInfo name="ISBN" value="[&quot;9783030648398&quot;, &quot;9783030648404&quot;]"/>
          <refcontent>Springer International Publishing</refcontent>
        </reference>
        <reference anchor="BINARY">
          <front>
            <title>Efficient 3PC for binary circuits with application to maliciously-secure DNN inference</title>
            <author fullname="Yun Li" initials="Y." surname="Li">
              <organization/>
            </author>
            <author fullname="Yufei Duan" initials="Y." surname="Duan">
              <organization/>
            </author>
            <author fullname="Zhicong Huang" initials="Z." surname="Huang">
              <organization/>
            </author>
            <author fullname="Cheng Hong" initials="C." surname="Hong">
              <organization/>
            </author>
            <author fullname="Chao Zhang" initials="C." surname="Zhang">
              <organization/>
            </author>
            <author fullname="Yifan Song" initials="Y." surname="Song">
              <organization/>
            </author>
            <date month="August" year="2023"/>
          </front>
          <seriesInfo name="Proceedings of the 32nd USENIX Conference on Security Symposium" value="pp. 5377–5394"/>
          <seriesInfo name="ISBN" value="978-1-939133-37-3"/>
          <refcontent>USENIX Association</refcontent>
        </reference>
        <reference anchor="RFC9180">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
      </references>
    </references>
    <?line 1065?>

<section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This work is a direct implementation of the protocols described in <xref target="BINARY"/>,
which builds on a lot of prior academic work on MPC.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
owAA

-->

</rfc>
