<?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.6 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-liu-vcpot-00" category="std" consensus="true" submissionType="IETF" xml:lang="en" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.0 -->
  <front>
    <title abbrev="vcpot">Vector Commitment-based Proof of Transit</title>
    <seriesInfo name="Internet-Draft" value="draft-liu-vcpot-00"/>
    <author initials="C." surname="Liu" fullname="Chunchi Liu">
      <organization>Huawei</organization>
      <address>
        <postal>
          <country>China</country>
        </postal>
        <email>liuchunchi@huawei.com</email>
      </address>
    </author>
    <date year="2024" month="March" day="03"/>
    <keyword>Proof of Transit</keyword>
    <keyword>Inclusion Proof</keyword>
    <abstract>
      <?line 53?>

<t>This document describes an ordered Proof of Transit mechanism.</t>
    </abstract>
  </front>
  <middle>
    <?line 57?>

<section anchor="intro">
      <name>Introduction</name>
      <t>Proof of Transit (POT) is a secure log or evidence that proves traffic transited certain elements of a network path, in a specified order. The "elements" could be either virtual network functions or physical network devices, per the definition of <xref target="RFC9473"/>.</t>
      <t>POT mechanism can be used to prove the actual forwarding of a packet follows a predetermined path, in order to satisfy certain compliance or performance requirements. As a result, POT is important for several technologies that explicitly appoints traffic path, such as Service Function Chaining (SFC), Segment Routing (SR), Traffic Engineering (TE), etc-- it can help prove a packet's forwarding compliance to a path, or at least, confirm its deviation. Other use cases are discussed in <xref target="I-D.liu-path-validation-problem-statement"/>.</t>
      <t>POT is a critical building block for routing security assurance, but a secure yet efficient POT mechanism is still under standardization. <xref target="I-D.ietf-sfc-proof-of-transit"/> presented a Shamir Secret Sharing-based POT solution, but has not become a proposed standard until now.</t>
      <t>This document describes a secure, efficient ordered Proof of Transit mechanism using a cryptographic primitive called Vector Commitment. We select efficient cryptographic constructions of Vector Commitment, which is KZG polynomial commitment, for high computation efficiency and succinct proof size. We also define the efficiency benchmark and security definitions of Proof of Transit mechanisms. Since we believe order-compliance is a must, we omit "ordered" from now.</t>
    </section>
    <section anchor="term">
      <name>Terminology</name>
      <t>The terminology and definition of key concepts in this document, such as path, node and link was defined in <xref target="RFC9473"/>. Others:</t>
      <ul spacing="normal">
        <li>
          <t>POT: Proof of Transit</t>
        </li>
        <li>
          <t>VC: Vector Commitment</t>
        </li>
        <li>
          <t>KZG: Kate, Zaverucha and Goldberg Polynomial Commitment</t>
        </li>
        <li>
          <t>SFC: Service Function Chaining</t>
        </li>
        <li>
          <t>SR: Segment Routing</t>
        </li>
      </ul>
    </section>
    <section anchor="back">
      <name>Background</name>
      <t>The absence of a secure POT mechanism (along with lack of control to Internet devices) causes a gap between routing integrity and forwarding integrity. This means the routing information could be propagated correctly (with efforts like BGPSEC), but it is each router who makes the actual forwarding decision, which can be negatively affected by faulty configurations or malicious attacks <xref target="RIvsFI"/>. POT mechanisms, if designed secure and efficient enough, can be a trustworthy mark or evidence reflecting the actual path a packet has taken in the forwarding plane.</t>
    </section>
    <section anchor="basics">
      <name>Basic Idea</name>
      <t>The proposed method uses Vector Commitment (VC). A regular cryptographic Commitment scheme allows Alice to commit to a single secret value and reveal it later; while a Vector Commitment scheme allows Alice to commit to a vector of secrets, and reveal it one-by-one or all at once. This allows our solutions to do the following:</t>
      <t>For a network controller, she can orchestrate a routing path, where each value represents a network element's identity (or attributes), and the vector represents the whole path. She can compute a ciphertext-like commitment C that reflects the full vector information, in this way committing to this path, and this path only. Also, no adversary can interpret any information about the values just by observing the commitment C. These are the binding and hiding properties provided by the original cryptographic VC primitive. Detailed security analysis are provided in the Security Considerations. Also the commitment C is always constant size regardless of the length of the path or information committed.</t>
      <t>For a network element, he can compute an opening proof for himself, functions as a proof-of-transit, which proves who he is, the path he is on, his index on this path, all at the same time. The opening proof p_i is also always constant size and is aggregateable with other opening proofs p_J.</t>
      <t>For any public verifier, he can verify the opening proof p_i against commitment C. Only when the three-tuple information of opening proof p_i aligns with controller's three-tuple information of commitment C, will the transit proof p_i pass verification against commitment C. The verifier does not need any pre-shared secrets or auxiliary data, meaning the verification is stateless. The verification time is also constant time.</t>
      <t>Vector Commitment has many low level constructions-- obviously Merkle Tree is one of many possible constructions. But the advantage of our proposed solution is the efficiency of the low-level construction we use-- KZG Polynomial Commitment. By comparison, when verifying an opening proof p_i, we only need constant O(1) size of p_i and commitment C as compared with O(logN) size of auxiliary data in Merkle Trees. The opening proof p_i can also be directly verified against commitment C, requiring O(1) constant verification time as compared with O(logN) computation in Merkle Trees. The number N is the total number of committed elements (and its information) in a vector. Such efficiency advantage is critical when assessing the usability to apply advanced crypto to the routing area.</t>
    </section>
    <section anchor="sol">
      <name>Solution</name>
      <section anchor="algo">
        <name>Algorithm</name>
        <t>We avoid cryptographic deep-dive. Consider VC as a blackbox with the following functions:</t>
        <ul spacing="normal">
          <li>
            <t>Setup: On input a security parameter k, generate a set of public parameters pp for following functions.</t>
          </li>
          <li>
            <t>Commit: On input parameter pp, a vector V=(v_1, v_2, ..., v_N), output a commitment value C to the vector V.</t>
          </li>
          <li>
            <t>Open: On input parameter pp, element i's identity information and auxiliary information, output an opening proof p_i.</t>
          </li>
          <li>
            <t>Verify: On input parameter pp, commitment C, opening proof p_i and i's identity information, output either pass or fail.</t>
          </li>
        </ul>
        <t>This abstraction is given in this <eref target="https://www.di.ens.fr/~nitulesc/files/vc-sok.pdf">SoK</eref> The function Commit is used by network controllers to orchestrate a network path. The function Open is used by a network element to compute a transit proof. The function Verify is used by a public verifier to verify a transit proof.</t>
      </section>
      <section anchor="approach">
        <name>Approach</name>
        <t>In our approach, there is one network controller (Alice) and many network elements. We use controller and elements from now on.</t>
        <section anchor="setup">
          <name>Setup</name>
          <ol spacing="normal" type="1"><li>
              <t>Controller chooses a pairing-friendly curve to use. She uses a unique ciphersuite identifier to represent the selection. Reference ciphersuite format of pairing-friendly curve is defined in Section 7.1 <xref target="I-D.irtf-cfrg-pairing-friendly-curves"/>.</t>
            </li>
            <li>
              <t>Controller chooses maximum number of element t in the vector. Here t is the maximum number of elements N on the path.</t>
            </li>
            <li>
              <t>Controller chooses a random positive integer secret a.</t>
            </li>
            <li>
              <t>Controller computes a t+1 tuple public parameter pp=(g, g^a, g^a+1, ..., g^a^t), where g is the group generator of the selected curve, part of public parameters of the curve.</t>
            </li>
          </ol>
        </section>
        <section anchor="commit-to-a-path">
          <name>Commit to a Path</name>
          <t>The Commit function introduced above is a high level abstraction. In KZG's actual construction, in the Commit step, there is another step of conversion from the vector V to an interpolated polynomial phi(x). The commitment, opening and verification all requires this polynomial phi(x).</t>
          <ol spacing="normal" type="1"><li>
              <t>Controller decides a routing path V=(v_1, v_2, ..., v_N), where v_i is the unique identifier (or the profile containing list of attributes) of the network element i.</t>
            </li>
            <li>
              <t>Controller transform the vector V into N number of two-dimensional points (x_i, y_i), where x_i equals integer 1,2,3... and y_i equals the hash of v_i, y_i=hash(v_i).</t>
            </li>
            <li>
              <t>Controller uses Lagrange interpolation to compute a polynomial phi(x) using above N two-dimensional points (x_i, y_i). The polynomial phi(x) is represented by the coefficients of it.</t>
            </li>
            <li>
              <t>Given polynomial phi(x) and public parameters pp, controller computes a commitment C using the Commit() from KZG mechanism.</t>
            </li>
          </ol>
          <t>Since the polynomial phi(x) is needed when computing any opening proof, if x_i is 1,2,3... then all participating network elements would have access to any (i, v_i) pair, hence trust among the network elements are required. To achieve transit proof unforgeability, the security-enhanced step 2 is:</t>
          <ol spacing="normal" type="1"><li>
              <t>[*] Controller randomly generates a secret s_i and share with the element i through a private secure channel. x_i=s_i, y_i=hash(v_i||s_i).</t>
            </li>
          </ol>
          <t>and the rest remains same.</t>
        </section>
        <section anchor="configure">
          <name>Configure</name>
          <ol spacing="normal" type="1"><li>
              <t>Controller sends the following data to each network element: ciphersuite (curve, hash function), public parameter pp, polynomial phi(x).</t>
            </li>
            <li>
              <t>Controller broadcasts public parameter pp and commitment C for any public verifier (could be an external verifier or also any participating network element).</t>
            </li>
          </ol>
          <t>For enhanced security option:
1. [*] Controller sends the following data to each network element i: ciphersuite (curve, hash function), public parameter pp, polynomial phi(x), <em>and secret s_i</em>.</t>
        </section>
        <section anchor="create-transit-proof">
          <name>Create Transit Proof</name>
          <ol spacing="normal" type="1"><li>
              <t>Upon receiving a request to compute a transit proof, the network element i compute an opening proof p_i using Open(), with input of his (x_i, y_i), polynomial phi(x) and public parameter pp.</t>
            </li>
            <li>
              <t>Network element i attaches p_i to the packet header, or send them out-of-band.</t>
            </li>
          </ol>
          <t>Because the verification of p_i requires also (x_i, y_i), for normal procedures, (x_i, y_i) is public information and does not require sending. For enhanced security option, since x_i and y_i is secret, do the following:</t>
          <ol spacing="normal" type="1"><li>
              <t>[*] Network element i attaches p_i and (x_i, y_i) to the packet header, or send them out-of-band.</t>
            </li>
          </ol>
        </section>
        <section anchor="verify-transit-proof">
          <name>Verify Transit Proof</name>
          <ol spacing="normal" type="1"><li>
              <t>The verifier takes public parameter pp, commitment C, index x_i, element's identity y_i, opening proof p_i, uses Verify() to accept or reject a transit proof. If the p_i is sent out-of-band, then the verifier is the external party. If p_i is attached to the packet payload or header, the following network element can also be verifiers.</t>
            </li>
          </ol>
        </section>
      </section>
    </section>
    <section anchor="sizing-the-data-for-vcpot">
      <name>Sizing the Data for VCPOT</name>
      <t>The major data in our proposed solution is the Commitment C and transit proof p_i, which represents path-level information and individual-level information. We compare the size of Commitment C and transit proof p_i. C and p_i is a group element of G1, where e: G1 x G1 -&gt; GT is a symmetric (type 1) bilinear pairing. As a result, it is relevant to different pairing-friendly curves we use:</t>
      <table anchor="size">
        <name>Data sizes in Bytes</name>
        <thead>
          <tr>
            <th align="left">Curve</th>
            <th align="left">Public Parameters pp</th>
            <th align="left">Commitment C</th>
            <th align="left">Transit Proof p_i</th>
            <th align="left">Has Implementation</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">BLS12-381</td>
            <td align="left">(N+1)*48</td>
            <td align="left">48</td>
            <td align="left">48</td>
            <td align="left">Y</td>
          </tr>
          <tr>
            <td align="left">BLS48</td>
            <td align="left">(N+1)*36</td>
            <td align="left">36</td>
            <td align="left">36</td>
            <td align="left">N</td>
          </tr>
          <tr>
            <td align="left">BW19-P286</td>
            <td align="left">(N+1)*36</td>
            <td align="left">36</td>
            <td align="left">36</td>
            <td align="left">N</td>
          </tr>
        </tbody>
      </table>
      <t>KZG polynomial commitment utilizes pairing-friendly curves. Common implementations <xref target="GOKZG"/><xref target="RUSTKZG"/> uses BLS12-381 elliptic curves defined in Section 4.2.1 of <xref target="I-D.irtf-cfrg-pairing-friendly-curves"/>. With a field modulus q of 381 bits in length, we receive 126-bits of security (close enough to 128 bits). To achieve same bits of security, BN-curves requires 462 bits and increases overhead so we don't use them.</t>
      <t>The reason why size of field modulus is important is because it is the exact size of a group element in G1, therefore both the size of a commitment and opening proof to be attached to the packet header and transmitted. Although BLS12-381 is the most popular curve, there are also curves with a smaller 286-bit G1-- BW19-P286 and BLS48 <xref target="PFC"/>. They decrease the packet overhead from 48B to 36B.</t>
      <t>A complete YANG model is TBD.</t>
    </section>
    <section anchor="running-implementation">
      <name>Running Implementation</name>
      <t>A working Proof-of-Concept demo implementation is published here:</t>
      <t><eref target="https://github.com/liuchunchi/vcpot-demo"/></t>
      <t>Runnable in MacOS environment.</t>
    </section>
    <section anchor="sec">
      <name>Security Considerations</name>
      <section anchor="biding-and-hiding">
        <name>Biding and Hiding</name>
        <t>The hiding and binding property is offered by the original KZG Polynomial Commitment cryptographic scheme, not by our design. Informally:</t>
        <t>The commitment C is cryptographically hiding, meaning without x_i and polynomial phi(x), simply by observing commitment C, no adversary can interpret y_i hence compute an opening proof p_i.
The commitment C is cryptographically binding, meaning computing an opening proof using any (x_i, y'_i) different than (x_i, y_i) cannot pass verification against commitment C.</t>
        <t>For complete cryptographic details, please refer to the original paper <xref target="KZG"/>.</t>
      </section>
      <section anchor="unforgeability-of-transit-proof">
        <name>Unforgeability of Transit Proof</name>
        <t>A transit proof p_i should be unforgeable.</t>
        <t>With the cryptographic hiding property, for our normal option, no malicious adversary outside of participating network elements can forge a transit proof. But this requires a security assumption of trusting the network elements being benign.</t>
        <t>The enhanced security option eliminates this trust assumption. With (x_i, y_i) being secret plus the hiding property, no adversary can guess (x_i, y_i) and forge a p_i before element i's revelation. This means even a participating element j is malicious, it still cannot forge the transit proof of element i.</t>
      </section>
      <section anchor="need-trusted-setup-a-centralized-controller">
        <name>Need Trusted Setup (A Centralized Controller)</name>
        <t>The Setup step requires a centralized trusted authority to generate and distribute the public parameters. This is not very problematic since a network controller that orchestrates a path can (and also should) serve as a setup center.</t>
      </section>
      <section anchor="no-mods-no-sweat">
        <name>No-mods, No-sweat</name>
        <t>The POT approach described in this document did not make modifications to the KZG polynomial commitment itself-- we are merely using it. Therefore, the approach does not introduce additional potential security vulnerabilities compared to the original scheme.</t>
      </section>
      <section anchor="no-post-quantum-resistance">
        <name>No Post-Quantum Resistance</name>
        <t>The approach described in this document uses bilinear pairing, which assumes (Elliptic Curve) Discrete Log Problem (DL) is hard. This also means this approach is not quantum-resistant. We have two arguments for that:</t>
        <ol spacing="normal" type="1"><li>
            <t>If PQ-safe is a must, lattice-based or hash-based VC is also <eref target="https://www.di.ens.fr/~nitulesc/files/vc-sok.pdf">available</eref>. For instance, Fast Reed-Solomon Interactive Oracle Proof (FRI) is another alternative vector commitment construction to KZG. FRI commitment is constructed using merkle trees and is hence quantum resistant, but the proof size is much bigger, slower to verify, dependent to the number of elements in the vector (both O(log\^2N)).</t>
          </li>
          <li>
            <t>Considering general elliptic curve cryptography is still in wide use, it is fair to say forging a transit proof is less severe than forging an ECDSA signature to Bitcoin.</t>
          </li>
        </ol>
      </section>
      <section anchor="other-possible-constructions">
        <name>Other Possible Constructions</name>
        <t>Vector Commitment can be seen as a special type of Cryptographic Accumulators, which can prove the membership of one or many elements in a set, by computing an inclusion proof. What is special about VC is it can also prove the order/position of the element inside the set. In use cases where the order is not important, or cryptographic capability is limited, other simplified Cryptographic Accumulators can be used to construct POT mechanisms, such as simple Merkle Tree, aggregate signatures.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-informative-references">
      <name>Informative References</name>
      <reference anchor="RFC9473">
        <front>
          <title>A Vocabulary of Path Properties</title>
          <author fullname="R. Enghardt" initials="R." surname="Enghardt"/>
          <author fullname="C. Krähenbühl" initials="C." surname="Krähenbühl"/>
          <date month="September" year="2023"/>
          <abstract>
            <t>Path properties express information about paths across a network and the services provided via such paths. In a path-aware network, path properties may be fully or partially available to entities such as endpoints. This document defines and categorizes path properties. Furthermore, the document identifies several path properties that might be useful to endpoints or other entities, e.g., for selecting between paths or for invoking some of the provided services. This document is a product of the Path Aware Networking Research Group (PANRG).</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9473"/>
        <seriesInfo name="DOI" value="10.17487/RFC9473"/>
      </reference>
      <reference anchor="I-D.ietf-sfc-proof-of-transit">
        <front>
          <title>Proof of Transit</title>
          <author fullname="Frank Brockners" initials="F." surname="Brockners">
            <organization>Cisco Systems, Inc.</organization>
          </author>
          <author fullname="Shwetha Bhandari" initials="S." surname="Bhandari">
            <organization>Thoughtspot</organization>
          </author>
          <author fullname="Tal Mizrahi" initials="T." surname="Mizrahi">
            <organization>Huawei Network.IO Innovation Lab</organization>
          </author>
          <author fullname="Sashank Dara" initials="S." surname="Dara">
            <organization>Seconize</organization>
          </author>
          <author fullname="Stephen Youell" initials="S." surname="Youell">
            <organization>JP Morgan Chase</organization>
          </author>
          <date day="1" month="November" year="2020"/>
          <abstract>
            <t>   Several technologies such as Traffic Engineering (TE), Service
   Function Chaining (SFC), and policy based routing are used to steer
   traffic through a specific, user-defined path.  This document defines
   mechanisms to securely prove that traffic transited a defined path.
   These mechanisms allow to securely verify whether, within a given
   path, all packets traversed all the nodes that they are supposed to
   visit.  This document specifies a data model to enable these
   mechanisms using YANG.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-sfc-proof-of-transit-08"/>
      </reference>
      <reference anchor="I-D.liu-path-validation-problem-statement">
        <front>
          <title>Path Validation Problem Statement, History, Gap Analysis and Use Cases</title>
          <author fullname="Peter Chunchi Liu" initials="P. C." surname="Liu">
            <organization>Huawei</organization>
          </author>
          <author fullname="Qin Wu" initials="Q." surname="Wu">
            <organization>Huawei</organization>
          </author>
          <author fullname="Liang Xia" initials="L." surname="Xia">
            <organization>Huawei</organization>
          </author>
          <date day="23" month="October" year="2023"/>
          <abstract>
            <t>   This document provides a problem statement, history revisiting, gap
   analysis and use cases for path validation techniques.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-liu-path-validation-problem-statement-00"/>
      </reference>
      <reference anchor="I-D.irtf-cfrg-pairing-friendly-curves">
        <front>
          <title>Pairing-Friendly Curves</title>
          <author fullname="Yumi Sakemi" initials="Y." surname="Sakemi">
            <organization>GMO Cybersecurity by Ierae, Inc.</organization>
          </author>
          <author fullname="Tetsutaro Kobayashi" initials="T." surname="Kobayashi">
            <organization>NTT</organization>
          </author>
          <author fullname="Tsunekazu Saito" initials="T." surname="Saito">
            <organization>NTT</organization>
          </author>
          <author fullname="Riad S. Wahby" initials="R. S." surname="Wahby">
            <organization>Stanford University</organization>
          </author>
          <date day="6" month="November" year="2022"/>
          <abstract>
            <t>   Pairing-based cryptography, a subfield of elliptic curve
   cryptography, has received attention due to its flexible and
   practical functionality.  Pairings are special maps defined using
   elliptic curves and it can be applied to construct several
   cryptographic protocols such as identity-based encryption, attribute-
   based encryption, and so on.  At CRYPTO 2016, Kim and Barbulescu
   proposed an efficient number field sieve algorithm named exTNFS for
   the discrete logarithm problem in a finite field.  Several types of
   pairing-friendly curves such as Barreto-Naehrig curves are affected
   by the attack.  In particular, a Barreto-Naehrig curve with a 254-bit
   characteristic was adopted by a lot of cryptographic libraries as a
   parameter of 128-bit security, however, it ensures no more than the
   100-bit security level due to the effect of the attack.  In this
   memo, we list the security levels of certain pairing-friendly curves,
   and motivate our choices of curves.  First, we summarize the adoption
   status of pairing-friendly curves in standards, libraries and
   applications, and classify them in the 128-bit, 192-bit, and 256-bit
   security levels.  Then, from the viewpoints of "security" and "widely
   used", we select the recommended pairing-friendly curves considering
   exTNFS.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-pairing-friendly-curves-11"/>
      </reference>
      <reference anchor="RIvsFI" target="https://blog.apnic.net/2022/12/16/opinion-is-secured-routing-a-market-failure/">
        <front>
          <title>Opinion":" Is secured routing a market failure?</title>
          <author>
            <organization/>
          </author>
          <date year="2022" month="December"/>
        </front>
      </reference>
      <reference anchor="KZG" target="https://www.iacr.org/archive/asiacrypt2010/6477178/6477178.pdf">
        <front>
          <title>Constant-Size Commitments to Polynomials and Their Applications</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
      <reference anchor="GOKZG" target="https://github.com/protolambda/go-kzg">
        <front>
          <title>Go implementation of KZG proofs</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
      <reference anchor="RUSTKZG" target="https://github.com/ralexstokes/kzg">
        <front>
          <title>RUST implementation of KZG proofs</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
      <reference anchor="PFC" target="https://members.loria.fr/AGuillevic/pairing-friendly-curves/">
        <front>
          <title>PAIRING-FRIENDLY CURVES, Aurore Guillevic</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
    </references>
    <?line 239?>



  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
