<?xml version="1.0" encoding="utf-8"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
     which is available here: http://xml.resource.org. -->
<!DOCTYPE rfc [
<!-- One method to get references from the online citation libraries.
     There has to be one entity for each item to be referenced. 
     An alternate method (rfc include) is described in the references. -->
<!ENTITY RFC2119 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC7276 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7276.xml">
<!ENTITY RFC7384 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7384.xml">
<!ENTITY RFC8126 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml">
<!ENTITY RFC8174 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC9055 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9055.xml">
<!ENTITY RFC9197 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9197.xml">
<!ENTITY RFC9322 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9322.xml">
<!ENTITY RFC9326 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9326.xml">
<!ENTITY I-D.ietf-opsawg-oam-characterization SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.ietf-opsawg-oam-characterization.xml">
<!ENTITY I-D.ietf-ippm-ioam-integrity-yang SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.ietf-ippm-ioam-integrity-yang.xml">
<!ENTITY AFI SYSTEM "http://www.iana.org/assignments/address-family-numbers/address-family-numbers.xml">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<!-- For a complete list and description of processing instructions (PIs), 
     please see http://xml.resource.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds might want to use.
     (Here they are set differently than their defaults in xml2rfc v1.32) -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<!-- control the table of contents (ToC) -->
<?rfc toc="yes"?>
<!-- generate a ToC -->
<?rfc tocdepth="4"?>
<!-- the number of levels of subsections in ToC. default: 3 -->
<!-- control references -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space 
     (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->
<rfc category="std" docName="draft-ietf-ippm-ioam-data-integrity-19"
     ipr="trust200902" submissionType="IETF" consensus="true">
  <!-- ipr="full3978"-->

  <!-- category values: std, bcp, info, exp, and historic
     ipr values: full3667, noModification3667, noDerivatives3667
     you can add the attributes updates="NNNN" and obsoletes="NNNN" 
     they will automatically be output with "(if approved)" -->

  <!-- ***** FRONT MATTER ***** -->

  <front>
    <!-- The abbreviated title is used in the page header - it is only necessary if the 
         full title is longer than 39 characters -->

    <title abbrev="IOAM-Data-Fields Integrity Protection">Integrity Protection
    of In Situ Operations, Administration, and Maintenance (IOAM) Data
    Fields</title>

    <!-- add 'role="editor"' below for the editors if appropriate -->

    <!-- Another author who claims to be an editor -->

    <author fullname="Frank Brockners" initials="F." surname="Brockners">
      <organization abbrev="Cisco">Cisco Systems, Inc.</organization>

      <address>
        <postal>
          <street>Hansaallee 249, 3rd Floor</street>

          <!-- Reorder these if your country does things differently -->

          <city>DUESSELDORF</city>

          <code>40549</code>

          <country>Germany</country>
        </postal>

        <email>fbrockne@cisco.com</email>

        <!-- uri and facsimile elements may also be added -->
      </address>
    </author>

    <author fullname="Shwetha Bhandari" initials="S." surname="Bhandari">
      <organization abbrev="Databricks">Databricks</organization>

      <address>
        <postal>
          <street>Angkor West Building, Bagmane Capital Tech Park, Ferns City</street>

          <city>Doddanekkundi, Mahadevpura, Bengaluru, Karnataka 560048</city>

          <country>India</country>
        </postal>

        <email>shwetha.bhandari@databricks.com</email>
      </address>
    </author>

    <author fullname="Tal Mizrahi" initials="T." surname="Mizrahi">
      <organization abbrev="">Huawei</organization>

      <address>
        <postal>
          <street>8-2 Matam</street>

          <city>Haifa</city>

          <code>3190501</code>

          <country>Israel</country>
        </postal>

        <email>tal.mizrahi.phd@gmail.com</email>
      </address>
    </author>

    <author fullname="Justin Iurman" initials="J." surname="Iurman">
      <organization abbrev="">University of Liege</organization>

      <address>
        <postal>
          <street>10, Allee de la decouverte (B28)</street>

          <code>4000</code>

          <city>Sart-Tilman</city>

          <country>Belgium</country>
        </postal>

        <email>justin.iurman@uliege.be</email>
      </address>
    </author>

    <date day="11" month="May" year="2026"/>

    <!-- If the month and year are both specified and are the current ones, xml2rfc will fill 
         in the current day for you. If only the current year is specified, xml2rfc will fill 
	 in the current day and month for you. If the year is not the current one, it is 
	 necessary to specify at least a month (xml2rfc assumes day="1" if not specified for the 
	 purpose of calculating the expiry date).  With drafts it is normally sufficient to 
	 specify just the year. -->

    <!-- Meta-data Declarations -->

    <area>ops</area>

    <workgroup>ippm</workgroup>

    <!-- WG name at the upperleft corner of the doc,
         IETF is fine for individual submissions.  
	 If this element is not present, the default is "Network Working Group",
         which is used by the RFC Editor as a nod to the history of the IETF. -->

    <keyword>OAM</keyword>
    <keyword>In Situ</keyword>
    <keyword>IOAM</keyword>
    <keyword>Integrity</keyword>
    <keyword>Telemetry</keyword>
    <keyword>Tracing</keyword>

    <!-- Keywords will be incorporated into HTML output
         files in a meta tag but they have no effect on text or nroff
         output. If you submit your draft to the RFC Editor, the
         keywords will be used for the search engine. -->

    <abstract>
      <t>In Situ Operations, Administration, and Maintenance (IOAM) records
      operational (including telemetry) information in packets while they
      traverse a path in the network. RFC 9197 specifies data fields for IOAM
      (a.k.a IOAM-Data-Fields) and associated data types. This
      document specifies integrity protection of IOAM-Data-Fields for
      Intra-IOAM-Domain use cases.</t>
    </abstract>
  </front>

  <middle>
    <section title="Introduction" toc="default">
      <t>In Situ Operations, Administration, and Maintenance (IOAM)
      <xref target="RFC9197"/> records
      OAM information within packets while they traverse a
      network domain. The term "In Situ" refers to the fact that
      the OAM data is added to the data packets rather than being sent
      within packets specifically dedicated to OAM (a.k.a. In-Data-Packet OAM
      <xref target="I-D.ietf-opsawg-oam-characterization"/>).</t>

      <t>IOAM is deployed inside an IOAM-Domain, which consists of a set of
      nodes that use IOAM. The boundaries of the IOAM-Domain are formed by IOAM
      control points, as defined in <xref target="RFC9197"/>.
      It is expected that all nodes in an IOAM-Domain are managed by the
      same administrative entity, that has means to select, monitor, and
      control access to all the networking devices.
      Per <xref target="RFC9197"/>,
      IOAM-Data-Fields are carried in the clear within packets and there are no
      protections against any device tampering with the data.
      IOAM-Data-Fields collected in an untrusted environment require at least
      integrity protection to support critical operational decisions.
      Refer to <xref target="RFC9197"/> for more details on IOAM-Domains.
      </t>

      <t>Since arbitrary nodes can tamper with all
      packets data, including IOAM-Data-Fields, and the packets are (in general)
      processed by other intermediary nodes before they are delivered to a node
      that can verify the IOAM fields of the packet, there is little value in
      attempting to use cryptographic mechanisms to prevent such modifications
      to the IOAM fields in the packet. Instead, this document is limited to the
      "detectability
      problem", namely, to allow an endpoint to detect that such modification
      has occurred since the generation of the IOAM-Data-Fields. In addition,
      the following considerations and requirements
      are to be taken into account in constructing an IOAM integrity
      mechanism: <list style="numbers">
          <t>IOAM data is processed by the data plane, hence viability
          of any method to prove integrity of the IOAM-Data-Fields must be
          feasible at data plane processing/forwarding rates (IOAM may
          be applied to all traffic that a router forwards).</t>

          <t>IOAM data is carried within packets. The additional space required
          to provide integrity protection of the IOAM-Data-Fields must not cause
          packets to exceed the applicable Maximum Transmission Unit (MTU)
          within the IOAM-Domain and should minimize adverse effects on packet
          processing.</t>

          <t>Protection against replay of old IOAM data should be possible.
          Without replay protection, a rogue node can present the old IOAM
          data, masking any ongoing network issues/activity and making the
          IOAM-Data-Fields collection useless.</t>

      </list></t>

      <t>This document defines a method to protect the integrity of
      IOAM-Data-Fields for Intra-IOAM-Domain use cases, using the IOAM
      Option-Types specified in
      <xref target="RFC9197"/> as an example.</t>
    </section>

    <section anchor="Conventions" title="Conventions">
      <section title="Requirements Language">
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
        "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
        "OPTIONAL" in this document are to be interpreted as described in BCP
        14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only
        when, they appear in all capitals, as shown here.</t>
      </section>

      <section title="Terminology">
        <t>This document uses terms such as IOAM-Data-Fields, IOAM-Domain,
        IOAM-Namespace, IOAM-Option-Type (or Option-Type), encapsulating node,
        transit node, and decapsulating node. Refer to <xref target="RFC9197"/>
        for definitions.</t>

        <t>This document also introduces the term "Validator". Refer to
        <xref target="IPM-Validator"/> for the definition.</t>

        <t>The following abbreviations are used in this document:
        <list hangIndent="11" style="hanging">
          <t hangText="OAM:">Operations, Administration, and Maintenance</t>
          <t hangText="IOAM:">In Situ OAM</t>
          <t hangText="POT:">Proof of Transit</t>
          <t hangText="E2E:">Edge to Edge</t>
          <t hangText="MTU:">Maximum Transmission Unit</t>
          <t hangText="GCM:">Galois/Counter Mode</t>
          <t hangText="GMAC:">Galois Message Authentication Code</t>
          <t hangText="IV:">Initialization Vector</t>
          <t hangText="ICV:">Integrity Check Value</t>
          <t hangText="AAD:">Additional Authenticated Data</t>
        </list></t>

        <t>The following notation is used in this document:
        <list hangIndent="11" style="hanging">
          <t hangText="A || B">The concatenation of A and B, where the octets of
          B immediately follow the octets of A.</t>
        </list></t>
      </section>
    </section>

    <section anchor="ThreatAnalysis" title="Threat Analysis">
      <t>This section presents a threat analysis of integrity-related threats
      in the context of IOAM. The threats that are discussed are assumed to be
      independent of the lower layer protocols; it is assumed that threats at
      other layers are handled by security mechanisms that are deployed at
      those layers.</t>

      <t>This document is focused on integrity protection for IOAM-Data-Fields.
      Thus, the threat analysis includes threats that are related to or
      result from compromising the integrity of IOAM-Data-Fields. Other
      security aspects such as confidentiality are out of scope.</t>

      <t>Throughout the analysis there is a distinction between on-path and
      off-path attackers. As discussed in <xref
      target="RFC9055"/>, on-path attackers are located in a
      position that allows interception, modification, or dropping of in-flight
      protocol packets, whereas off-path attackers can only attack by generating
      protocol packets. Since IOAM operates within administratively controlled
      IOAM-Domains that define a trust boundary, this reduces potential attack
      vectors and should naturally mitigate off-path threats.</t>

      <t>The analysis also includes the impact of each of the threats.
      Generally speaking, the impact of a successful attack on an OAM protocol
      <xref target="RFC7276"/> is an illusion of nonexistent failures (or
      disruption) or
      preventing the detection of actual ones, as described in Section 9 of
      <xref target="RFC9197"/>; in both cases, the attack could
      result in Denial-of-Service (DoS). Furthermore, creating the
      illusion of a nonexistent issue could trigger unnecessary processing in
      some of the IOAM nodes along a forwarding path, and could cause more
      IOAM-related
      data to be exported to the management plane than is conventionally
      necessary. Beyond these general impacts, threat-specific impacts are
      discussed in each of the subsections below.</t>

      <section anchor="ModifDataSec" title="Modification: IOAM-Data-Fields">
        <t>Applicability <list hangIndent="10" style="empty">
            <t>On-path only.</t>
          </list></t>

        <t>Threat <list hangIndent="10" style="empty">
            <t>An attacker can modify the IOAM-Data-Fields of
            in-transit packets. The modification can either be applied to all
            packets or selectively applied to a subset.
	    Maliciously modified IOAM-Data-Fields can, for example,
            mislead network diagnostics, result in incorrect network
            performance metrics, or could misguide network optimization efforts.
            </t>
          </list></t>

        <t>Impact <list hangIndent="10" style="empty">
            <t>By systematically modifying the IOAM-Data-Fields of some or all
            of the in-transit packets, an attacker can create a fake picture of
            the network status. Potential consequences include an impact on
            network performance, a change in the recorded forwarding path of
            packets, either based on fake node positions or fake data provided
            by the attacker to fool the system that ingests IOAM-Data-Fields.
            </t>
          </list></t>
      </section>

      <section anchor="ModifHeaderSec"
               title="Modification: IOAM Option-Type header">
        <t>Applicability <list hangIndent="10" style="empty">
            <t>On-path only.</t>
          </list></t>

        <t>Threat <list hangIndent="10" style="empty">
            <t>An attacker can modify the fields of an IOAM Option-Type header
            to change or disrupt the
            behavior of nodes processing IOAM-Data-Fields along the path, or
            change the interpretation of IOAM-Data-Fields.
            The modification can either be applied to all packets or selectively
            applied to a subset.</t>
          </list></t>

        <t>Impact <list hangIndent="10" style="empty">
            <t>Modification of fields in an IOAM Option-Type header can have
            multiple impacts. The following examples are non-exhaustive.</t>

            <t>An attacker that modifies the Namespace-ID field
            (<xref target="RFC9197"/>, Section 4.3), common to all IOAM
            Option-Type headers, can alter the definition and interpretation
            of IOAM-Data-Fields. Without the correct Namespace-ID,
            IOAM-Data-Fields cannot be reliably interpreted.</t>

            <t>An attacker that modifies the Trace-Type field
            (<xref target="RFC9197"/>, Section 4.4.1) of the IOAM Trace
            Option-Type header can increase node processing overhead for
            IOAM-Data-Fields and increase on-the-wire overhead.</t>

            <t>An attacker that modifies the RemainingLen field
            (<xref target="RFC9197"/>, Section 4.4.1) of the IOAM Trace
            Option-Type header can prevent nodes from incorporating
            IOAM-Data-Fields.</t>

            <t>An attacker that sets the Loopback flag
            (<xref target="RFC9322"/>, Section 3) in the IOAM Trace Option-Type
            header can cause a Denial-of-Service by inducing each node to send
            packet copies to the encapsulating node.</t>

            <t>Modification of the header can result in impacts similar to those
            described in <xref target="ModifDataSec"/>.</t>
          </list></t>
      </section>

      <section title="Injection: IOAM-Data-Fields">
        <t>Applicability <list hangIndent="10" style="empty">
            <t>On-path only.</t>
          </list></t>

        <t>Threat <list hangIndent="10" style="empty">
            <t>An attacker can inject additional IOAM-Data-Fields into packets
            containing at least one IOAM Option-Type, thus falsifying the view
            of the actual network state. The injection can either be applied to
            all packets or selectively applied to a subset.</t>
          </list></t>

        <t>Impact <list hangIndent="10" style="empty">
            <t>This attack causes impacts similar to those described in
            <xref target="ModifDataSec"/>.</t>
          </list></t>
      </section>

      <section title="Injection: IOAM Option-Type header">
        <t>Applicability <list hangIndent="10" style="empty">
            <t>Both on-path and off-path.</t>
          </list></t>

        <t>Threat <list hangIndent="10" style="empty">
            <t>An attacker can inject packets with IOAM Option-Type headers,
            thus manipulating other nodes that process IOAM-Data-Fields in the
            network.</t>
          </list></t>

        <t>Impact <list hangIndent="10" style="empty">
            <t>This attack and its impacts are similar to those described in
            <xref target="ModifHeaderSec"/>.</t>
          </list></t>
      </section>

      <section title="Deletion: IOAM-Data-Fields">
        <t>Applicability <list hangIndent="10" style="empty">
            <t>On-path only.</t>
          </list></t>

        <t>Threat <list hangIndent="10" style="empty">
            <t>An attacker can remove IOAM-Data-Fields from packets containing
            at least one IOAM Option-Type, thus hiding the diagnosis of some
            nodes. The deletion can either be applied to all packets or
            selectively applied to a subset.</t>
          </list></t>

        <t>Impact <list hangIndent="10" style="empty">
            <t>This attack causes impacts similar to those described in
            <xref target="ModifDataSec"/>.</t>
          </list></t>
      </section>

      <section anchor="DelHeaderSec" title="Deletion: IOAM Option-Type header">
        <t>Applicability <list hangIndent="10" style="empty">
            <t>On-path only.</t>
          </list></t>

        <t>Threat <list hangIndent="10" style="empty">
            <t>An attacker can remove IOAM Option-Type headers from packets,
            thus preventing the use of IOAM to diagnose the network. The
            deletion can either be applied to all packets or selectively applied
            to a subset. The mechanisms in this document do not provide any
            mitigation against this threat.</t>
          </list></t>

        <t>Impact <list hangIndent="10" style="empty">
            <t>By systematically removing IOAM Option-Type headers from some or
            all of the in-transit packets, an attacker can make telemetry
            recording incomplete or even impossible. As a consequence, network
            diagnosis could be incomplete or non-existent.</t>
          </list></t>
      </section>

      <section title="Replay">
        <t>Applicability <list hangIndent="10" style="empty">
            <t>Both on-path and off-path.</t>
          </list></t>

        <t>Threat <list hangIndent="10" style="empty">
            <t>In addition to replaying old packets in general, an attacker can
            replay packets with IOAM-Data-Fields.
            Specifically, an attacker could replay a previously transmitted IOAM
            Option-Type header with a new data packet, therefore attaching old
            IOAM-Data-Fields to a fresh user packet.</t>
          </list></t>

        <t>Impact <list hangIndent="10" style="empty">
            <t>This attack causes impacts similar to those described in
            <xref target="ModifDataSec"/>.</t>

          </list></t>
      </section>

      <section title="Management and Exporting">
        <t>Applicability <list hangIndent="10" style="empty">
            <t>Both on-path and off-path.</t>
          </list></t>

        <t>Threat <list hangIndent="10" style="empty">
            <t>Attacks that compromise the integrity of IOAM-Data-Fields can
            be applied at the management plane, e.g., by manipulating network
            management packets. Furthermore, the integrity of IOAM-Data-Fields
            that are exported to a receiving entity can also be compromised.
            Management plane attacks are out of scope;
            the network management protocol is expected to include
            inherent security capabilities. The integrity of exported data is
            also out of scope. It is expected that
            the specification of the export format will discuss the relevant
            security aspects.</t>
          </list></t>

        <t>Impact <list hangIndent="10" style="empty">
            <t>Malicious manipulation of the management protocol can cause
            nodes that process IOAM-Data-Fields to malfunction, to be
            overloaded, or to incorporate unnecessary IOAM-Data-Fields into
            user packets. The impact of compromising the integrity of exported
            IOAM-Data-Fields is similar to the impacts of previous threats
            that were described in this section.</t>
          </list></t>
      </section>

      <section title="Delay">
        <t>Applicability <list hangIndent="10" style="empty">
            <t>On-path only.</t>
          </list></t>

        <t>Threat <list hangIndent="10" style="empty">
            <t>An attacker might delay some or all of the in-transit
            packets that include IOAM-Data-Fields to create an
            illusion of congestion. Delay attacks are well known in the
            context of deterministic networks <xref
            target="RFC9055"/> and time synchronization <xref
            target="RFC7384"/>, and could be somewhat mitigated in these
            environments by using redundant paths in a way that is resilient
            to an attack along one of the paths. This approach does not
            address the threat in the context of IOAM, as it does not meet the
            requirement to measure a specific path or to detect a problem
            along the path. Note that the mechanisms in this document do not
            attempt to provide any mitigation against this threat.</t>
          </list></t>

        <t>Impact <list hangIndent="10" style="empty">
            <t>Since IOAM can be applied to a fraction of the traffic, an
            attacker can detect and delay only the packets that include
            IOAM-Data-Fields, thus preventing the authenticity of delay and load
            measurements.</t>
          </list></t>
      </section>

      <section title="Threat Summary">
        <figure align="center" anchor="ThreatSummary"
                title="Threat Analysis Summary">
          <artwork align="left">
            
+===========================================+===========+
| Threat                                    | Document  |
|                                           |   Scope   |
|                                           +=====+=====+
|                                           | In  | Out |
+===========================================+=====+=====+
| Modification: IOAM-Data-Fields            |  X  |     |
+-------------------------------------------+-----+-----+
| Modification: IOAM Option-Type header     |  X  |     |
+-------------------------------------------+-----+-----+
| Injection: IOAM-Data-Fields               |  X  |     |
+-------------------------------------------+-----+-----+
| Injection: IOAM Option-Type header        |  X  |     |
+-------------------------------------------+-----+-----+
| Deletion: IOAM-Data-Fields                |  X  |     |
+-------------------------------------------+-----+-----+
| Deletion: IOAM Option-Type header         |     |  X  |
+-------------------------------------------+-----+-----+
| Replay                                    |  X  |     |
+-------------------------------------------+-----+-----+
| Management and Exporting                  |     |  X  |
+-------------------------------------------+-----+-----+
| Delay                                     |     |  X  |
+-------------------------------------------+-----+-----+
           </artwork>
        </figure>
      </section>
    </section>

    <section anchor="NewIOAMOptTypes" title="Integrity-Protected Option-Types">
    <t>This section defines new IOAM Option-Types to carry
    IOAM-Data-Fields with integrity protection. For each IOAM Option-Type
    defined in <xref target="RFC9197"/>, a corresponding Integrity-Protected
    Option-Type is defined as follows:</t>

        <t><list style="hanging">
            <t>IOAM Integrity-Protected Pre-allocated Trace
            Option-Type: corresponds to the IOAM Pre-allocated Trace Option-Type
            (<xref target="RFC9197"/>, Section 4.4) with integrity
            protection.</t>

            <t>IOAM Integrity-Protected Incremental Trace
            Option-Type: corresponds to the IOAM Incremental Trace Option-Type
            (<xref target="RFC9197"/>, Section 4.4) with integrity
            protection.</t>

            <t>IOAM Integrity-Protected POT Option-Type:
            corresponds to the IOAM POT Option-Type (<xref target="RFC9197"/>,
            Section 4.5) with integrity protection.</t>

            <t>IOAM Integrity-Protected E2E Option-Type:
            corresponds to the IOAM E2E Option-Type (<xref target="RFC9197"/>,
            Section 4.6) with integrity protection.</t>
          </list></t>

      <t>The Direct Export (DEX) Option-Type <xref target="RFC9326"/> is not
      covered by the Integrity Protection Method defined in
      <xref target="IPM"/>. This document focuses on the integrity protection of
      IOAM-Data-Fields, whereas DEX does not carry IOAM-Data-Fields by
      definition. As a consequence, DEX and similar (i.e., any IOAM Option-Type
      with no IOAM-Data-Fields) are considered out of scope and MUST NOT
      use the Integrity Protection Method defined in this document.</t>

      <t>The Integrity Protection header sits between an IOAM Option-Type
      header and its IOAM-Data-Fields, forming an equivalent Integrity-Protected
      Option-Type. This placement ensures that the Integrity Protection header
      is part of the header, rather than a trailer after the IOAM-Data-Fields.
      The Integrity Protection header is defined as shown in
      <xref target="Fig-IPH"/>.</t>

      <t><figure anchor="Fig-IPH" title="Integrity Protection header">
        <artwork>
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Method ID   |  Nonce Length |           Reserved            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                             Nonce                             ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                  Integrity Check Value (ICV)                  ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        </artwork>
      </figure></t>

      <t><list style="hanging">
        <t hangText="Method ID:">8-bit unsigned integer,
        see <xref target="IOAM-IP-registry"/>.
        It defines the Integrity Protection Method to compute the Integrity
        Check Value (ICV) field. If a node encounters an unknown value, it MUST
        NOT change the contents of the Integrity Protection header and MUST
        NOT change the contents of the IOAM-Data-Fields. In other words, the
        node must not process the IOAM Option-Type.</t>

        <t hangText="Nonce Length:">8-bit unsigned integer. It
        defines the length of the Nonce field, in octets.</t>

        <t hangText="Reserved:">16-bit Reserved field. It MUST be set to zero
        upon transmission and ignored upon receipt.</t>

        <t hangText="Nonce:"> Variable length field. Its size depends on the
        Nonce Length field.</t>

        <t hangText="Integrity Check Value (ICV):"> Variable length field. Its
        size depends on the Method ID field.
        </t>
      </list></t>

      <t>In order to keep IOAM-Data-Fields aligned (<xref target="RFC9197"/>,
      Section 4.4.2), the total length of the
      Integrity Protection header MUST be a multiple of 4 octets.</t>

      <section title="Integrity-Protected Trace Option-Types">
        <t>Both the IOAM Pre-allocated Trace Option-Type header and the IOAM
        Incremental Trace Option-Type header are identical, as defined in
        Section 4.4 of <xref target="RFC9197"/>. When followed by the Integrity
        Protection header, they respectively form the IOAM Integrity-Protected
        Pre-allocated Trace Option-Type and the IOAM Integrity-Protected
        Incremental Trace Option-Type (<xref target="Fig-IPTraces"/>). The
        definitions of fields that are not part of the Integrity Protection
        header are the same as in <xref target="RFC9197"/>.</t>

        <t><figure anchor="Fig-IPTraces"
                   title="Integrity-Protected Trace Option-Types header">
          <artwork>
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Namespace-ID          | NodeLen | Flags | RemainingLen|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                IOAM Trace-Type                |   Reserved    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Method ID   |  Nonce Length |           Reserved            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                             Nonce                             ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                  Integrity Check Value (ICV)                  ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                       IOAM-Data-Fields                        ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure></t>
      </section>

      <section title="Integrity-Protected POT Option-Type">
        <t>The IOAM POT Option-Type header is defined in Section 4.5 of
        <xref target="RFC9197"/>. When followed by the Integrity
        Protection header, it forms the IOAM Integrity-Protected POT
        Option-Type (<xref target="Fig-IPPOT"/>). The definitions of fields that
        are not part of the Integrity Protection header are the same as in
        <xref target="RFC9197"/>.</t>

        <t><figure anchor="Fig-IPPOT"
                   title="Integrity-Protected POT Option-Type header">
          <artwork>
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Namespace-ID          | IOAM-POT-Type | IOAM-POT-Flags| 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Method ID   |  Nonce Length |           Reserved            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                             Nonce                             ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                  Integrity Check Value (ICV)                  ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                       IOAM-Data-Fields                        ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure></t>
      </section>

      <section title="Integrity-Protected E2E Option-Type">
        <t>The IOAM E2E Option-Type header is defined in Section 4.6 of
        <xref target="RFC9197"/>. When followed by the Integrity
        Protection header, it forms the IOAM Integrity-Protected E2E
        Option-Type (<xref target="Fig-IPE2E"/>). The definitions of fields that
        are not part of the Integrity Protection header are the same as in
        <xref target="RFC9197"/>.</t>

        <t><figure anchor="Fig-IPE2E"
                   title="Integrity-Protected E2E Option-Type header">
          <artwork>
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Namespace-ID          |         IOAM-E2E-Type         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Method ID   |  Nonce Length |           Reserved            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                             Nonce                             ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                  Integrity Check Value (ICV)                  ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                       IOAM-Data-Fields                        ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure></t>
      </section>
    </section>

    <section anchor="IPM" title="Integrity Protection Method">
      <t>This document defines an Integrity Protection Method for
      IOAM-Data-Fields using symmetric keys.</t>

      <t>The method uses AES-GMAC <xref target="AES"/>
      <xref target="NIST.800-38D"/>, a mode of operation that provides data
      origin authentication and is a specialization of Galois/Counter Mode
      (GCM). GCM takes as input a secret key, an Initialization Vector (IV), a
      plaintext, and Additional Authenticated Data (AAD), and produces a
      ciphertext and an Authentication Tag. GMAC is the special case of GCM with
      zero-length plaintext; the ciphertext output is empty and ignored, and
      only the Authentication Tag is produced.</t>

      <t>For this method, the Authentication Tag MUST NOT be truncated and MUST
      be 16 octets in length.</t>

      <t>In this document, the GMAC Initialization Vector (IV) is referred to as
      the nonce, the GMAC Authentication Tag is referred to as the Integrity
      Check Value (ICV), and the GMAC Additional Authenticated Data (AAD) is
      referred to as AAD.</t>

      <t>Due to IOAM space constraints, maintaining a separate nonce and ICV for
      each IOAM node participating in integrity protection is not practical.
      This Integrity Protection Method uses a single Nonce field and a single
      ICV field in the packet. The nonce is generated by the encapsulating node
      according to the requirements defined in <xref target="IPM-KNM"/> and
      remains unchanged. The ICV is iteratively updated by participating nodes
      using the received ICV and their immutable IOAM-Data-Fields as inputs to
      the GMAC operation. This design enables reconstruction of the integrity
      chain by a Validator.</t>

      <section anchor="IPM-KNM" title="Key and Nonce Management">
        <t>In order to use this method and apply integrity protection, it is
        REQUIRED that each IOAM node that updates the ICV (in the Integrity
        Protection header) has its own unique symmetric key. Although GMAC
        supports all AES key sizes (i.e., 128, 192, and 256 bits), it is
        RECOMMENDED to use the longest key size when possible. Each key MUST be
        securely generated and fresh. Also, each key MUST be securely
        distributed to only the corresponding IOAM nodes and any Validator that
        needs to validate messages protected by that key. Except key rotation
        requirements, the details of key
        generation and distribution are out of scope.</t>

        <t>In addition to key management, per-message nonces used with GMAC MUST
        be managed to prevent reuse of a key-nonce pair. Since reuse of a nonce
        with a given key allows forgery of arbitrary ciphertexts with valid
        authentication tag, it is extremely important to have high confidence in
        nonce non-reuse.</t>

        <t>For this method, the size of the nonce MUST always be 12 octets. If a
        node receives a Nonce Length value other than 12, it MUST NOT change the
        contents of the Integrity Protection header and MUST NOT change the
        contents of the IOAM-Data-Fields. In other words, the node must not
        process the IOAM Option-Type. A nonce MUST NOT be reused with the same
        key. The nonce is based on the "Deterministic Construction"
        <xref target="NIST.800-38D"/> and has the format shown in
        <xref target="Fig-Nonce"/>.

          <figure anchor="Fig-Nonce"
                  title="Structure of the Nonce field (12 octets)">
            <artwork>
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Key ID     |             Encapsulating Node ID             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                       Counter (64 bits)                       |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            </artwork>
          </figure>
        </t>

        <t><list style="hanging">
          <t hangText="Key ID:">8-bit unsigned integer. It identifies the key
          used by the corresponding Encapsulating Node ID to compute the ICV
          with GMAC.</t>

          <t hangText="Encapsulating Node ID:">24-bit unsigned integer. It
          identifies an IOAM encapsulating node that generated the nonce. It
          MUST be unique for each IOAM node in the IOAM-Domain, which means a
          reasonable limit of 2^24 distinct IOAM nodes in total.</t>

          <t hangText="Counter:">64-bit unsigned integer. It
          is an incrementing counter managed by the corresponding encapsulating
          node (i.e., the one whose ID is the same as the Encapsulating Node ID
          field). The counter MUST start at 0 for each Key ID and MUST be
          unique for each packet, which means a limit of 2^64 packets per Key ID
          on the corresponding Encapsulating Node ID. Since GMAC does not
          require a nonce to be secret or unpredictable, it is secure to use a
          counter.</t>
        </list></t>

        <t>When the key-specific counter of an encapsulating node reaches the
        maximum value (i.e., 2^64), the encapsulating node MUST stop applying
        integrity protection with that key and start using a new one. Ideally,
        before that limit is reached, the key management system SHOULD rotate
        the key and notify any Validator that needs to validate messages
        protected by that key. The Key ID field provides an easy way to avoid
        conflicts during key rotations with other IOAM nodes that apply
        integrity protection. When an encapsulating node reaches its maximum use
        of 256 distinct keys (i.e., see the Key ID field) and is also about to
        reach the limit of its key-specific counter, the key management system
        MUST rotate the keys of all IOAM nodes in the IOAM-Domain and notify any
        Validator with the new keys. In addition, the internal integrity
        protection state of all IOAM nodes, which is useful to detect and
        prevent key-nonce reuse, MUST be reset. Overall, the key management
        system MUST NOT (ever) redistribute an old key to any of the IOAM nodes
        in the IOAM-Domain.</t>

        <t>An encapsulating node that participates in the integrity protection
        of IOAM-Data-Fields MAY retain on persistent storage the current key in
        use and the corresponding key-specific counter, such that a power
        interruption or system crash (or reboot in general) does not lead to
        nonce reuse. If it is not possible for some reason, the encapsulating
        node MUST NOT reuse the key and the key management system MUST rotate
        the key before the encapsulating node resumes integrity protection. In
        case of a power interruption or system crash (or reboot in general) on
        any transit node that participates in the integrity protection of
        IOAM-Data-Fields, the transit node MUST NOT reuse the key and the key
        management system MUST rotate the key before the transit node resumes
        integrity protection.</t>

        <t>To illustrate with an example, it would take 7 years for a single key
        of an encapsulating node to reach the limit of 2^64 1500-byte packets on
        a 1 Pbps (Petabits per second) link at line rate, while it would take
        approximately 143 days with 64-byte packets. For 256 distinct keys of an
        encapsulating node, it would take 1792 and 100 years respectively. This
        is a worst-case scenario, as such link capacity is not common and IOAM
        might not be applied to all packets.</t>
      </section>

      <section anchor="IPM-header-fields"
               title="Integrity Protection of Header Fields">
        <t>The main objective of the Integrity Protection Method defined in this
        document is to provide integrity protection of IOAM-Data-Fields.
        However, some Option-Type header fields are crucial for
        IOAM-Data-Fields (e.g., the IOAM Namespace-ID, which is common to all
        IOAM Option-Types). Without such fields, IOAM-Data-Fields cannot be
        reliably interpreted. As a consequence, the integrity of any immutable
        Option-Type header field MUST be protected. As for mutable Option-Type
        header fields, they do not benefit from any integrity protection since
        their values can change.</t>

        <t>With GMAC, the bit length of the AAD MUST be a multiple of 8. In
        other words, the AAD is made up of whole octets. Masking specific bits
        of Option-Type header fields allows this constraint to be respected,
        even for fields that are single bits (e.g., flags) or not aligned on
        natural boundaries. The list of Option-Type header fields and their
        corresponding integrity protection masks to be applied (i.e., a logical
        AND operation) are defined in <xref target="IOAM-IP-registry"/>.</t>

        <t>For interoperability, having a dynamic registry to specify which
        header fields participate in integrity protection might not seem optimal
        at first glance. However, from a vendor perspective, integrity
        protection is simply a feature built on top of IOAM. Therefore, if two
        different vendors providing IOAM integrity protection are not
        interoperable, it probably means that their core IOAM implementations
        are not interoperable in the first place. Since IOAM has no versions, it
        does not make sense to introduce versions in the integrity protection
        feature either. This is the reason why it is acceptable to have a
        dynamic registry for this purpose and to update it accordingly over
        time.</t>
      </section>

      <section anchor="IPM-Encap" title="Encapsulating Node">
        <t>The encapsulating node MUST follow the instructions in
        <xref target="IPM-KNM"/> to generate a new nonce, which is then stored
        in the Nonce field of the Integrity Protection header (the Nonce Length
        field is set accordingly). In particular, nonce generation MUST comply
        with the nonce uniqueness requirements defined in
        <xref target="IPM-KNM"/>. The Method ID field MUST be set to 0, as
        defined in <xref target="IOAM-IP-registry"/>.</t>

        <t>The initial ICV is the result of a GMAC operation, using the
        encapsulating node's key and the nonce generated by the encapsulating
        node. The AAD consists of a list of immutable header fields as defined
        in <xref target="IPM-header-fields"/> (depending on the
        Integrity-Protected Option-Type) and immutable IOAM-Data-Fields added by
        the encapsulating node. In the case where the Integrity-Protected
        Pre-allocated Trace Option-Type is used, the encapsulating node includes
        the IOAM-Data-Fields that correspond to itself, i.e.,
        "node data list [n]" (<xref target="RFC9197"/>, Section 4.4). The
        encapsulating node performs the following operations:
          <list style="bullets">
            <t>AAD = (Header Fields || IOAM-Data-Fields)</t>
            <t>ICV = GMAC(Key, Nonce, AAD)</t>
          </list>

        Fields in the AAD are encoded in network byte order and in the same
        sequence as they appear on the wire. The encapsulating node then stores
        the ICV in the corresponding field of the Integrity Protection
        header.</t>
      </section>

      <section anchor="IPM-Transit" title="Transit Node">
        <t>A transit node MUST NOT generate a new nonce, as this would break the
        integrity chain and prevent validation of IOAM-Data-Fields contributed
        by previous nodes. It MUST use the received Nonce field for its own GMAC
        operation. A transit node MUST NOT reuse a nonce with the same key, as
        this is critical for GMAC security. Therefore, it MUST be able to detect
        reuse of nonces with its current key.
        Details on how this detection is implemented are out of scope.
        If a transit node receives a Nonce field that has already
        been used with its current key, it MUST NOT change the contents of the
        Integrity Protection header and MUST NOT change the contents of the
        IOAM-Data-Fields. In other words, the transit node must not process the
        IOAM Integrity-Protected Option-Type.</t>

        <t>The ICV is the result of a GMAC operation, using the transit node's
        key and the received nonce. The AAD consists of the received ICV
        (ICV_rx) and immutable IOAM-Data-Fields added by the transit node. In
        the case where the Integrity-Protected Pre-allocated
        Trace Option-Type is used, the transit node includes the
        IOAM-Data-Fields that correspond to itself, i.e., "node data list [n-i]"
        (<xref target="RFC9197"/>, Section 4.4). The transit node performs the
        following operations:
          <list style="bullets">
            <t>AAD = (ICV_rx || IOAM-Data-Fields)</t>
            <t>ICV = GMAC(Key, Nonce, AAD)</t>
          </list>

        Fields in the AAD are encoded in network byte order and in the same
        sequence as they appear on the wire. The transit node then updates the
        ICV field accordingly in the Integrity Protection header.</t>

        <t>If the transit node does not add any immutable IOAM-Data-Fields
        (e.g., it only modifies mutable IOAM-Data-Fields or does nothing), and
        if the transit node, in case the Integrity-Protected Pre-allocated Trace
        Option-Type is used, does not update the "node data list" array, then
        the transit node MUST NOT update the ICV field in the Integrity
        Protection header.</t>

        <t>A transit node MUST NOT add or remove the Integrity Protection
        header. Also, a transit node MUST NOT modify the Method ID field, the
        Nonce Length field, or the Nonce field in the Integrity Protection
        header.</t>

        <t>A transit node does not validate the integrity of previously added
        IOAM-Data-Fields. Integrity validation is exclusively performed by a
        Validator as defined in <xref target="IPM-Validator"/>.</t>
      </section>

      <section anchor="IPM-Decap" title="Decapsulating Node">
        <t>The decapsulating node MAY perform the function of the Validator. If
        it does, ignore this section and refer directly to
        <xref target="IPM-Validator"/>.</t>

        <t>If the decapsulating node does not perform the function of the
        Validator, which is an alternative to put any Validator out of the
        forwarding path in case of performance concerns, the decapsulating node
        MUST send the entire IOAM Integrity-Protected Option-Type to a
        Validator. The method to send it to a Validator is out of scope.</t>

        <t>The decapsulating node MUST NOT generate a new nonce, as
        this would break the integrity chain and prevent validation of
        IOAM-Data-Fields contributed by previous nodes. It MUST use the received
        Nonce field for its own GMAC operation. A decapsulating node MUST NOT
        reuse a nonce with the same key, as this is critical for GMAC security.
        Therefore, it MUST be able to detect reuse of nonces with its current
        key. Details on how this detection is
        implemented are out of scope. If a decapsulating
        node receives a Nonce field that has already been used with its current
        key, it MUST NOT change the contents of the Integrity Protection header
        and MUST NOT change the contents of the IOAM-Data-Fields. In other
        words, the decapsulating node must not process the IOAM
        Integrity-Protected Option-Type.</t>

        <t>The decapsulating node updates the ICV field in
        the Integrity Protection header. The ICV is the
        result of a GMAC operation, using the decapsulating node's key and the
        received nonce. The AAD consists of the received ICV (ICV_rx) and
        immutable IOAM-Data-Fields added by the decapsulating node. In the case
        where the Integrity-Protected Pre-allocated Trace Option-Type is used,
        the decapsulating node includes the IOAM-Data-Fields that correspond to
        itself, i.e., "node data list [n-i]" (<xref target="RFC9197"/>,
        Section 4.4). The decapsulating node performs the
        following operations:
          <list style="bullets">
            <t>AAD = (ICV_rx || IOAM-Data-Fields)</t>
            <t>ICV = GMAC(Key, Nonce, AAD)</t>
          </list>

        Fields in the AAD are encoded in network byte order and in the same
        sequence as they appear on the wire.</t>

        <t>If the decapsulating node does not add any immutable IOAM-Data-Fields
        (e.g., it only modifies mutable IOAM-Data-Fields or does nothing), and
        if the decapsulating node, in case the Integrity-Protected Pre-allocated
        Trace Option-Type is used, does not update the "node data list" array,
        then the decapsulating node MUST NOT update the ICV field in the
        Integrity Protection header.</t>

        <t>The decapsulating node MUST NOT add the Integrity Protection
        header. Also, the decapsulating node MUST NOT modify the Method ID
        field, the Nonce Length field, or the Nonce field in the Integrity
        Protection header.</t>
      </section>

      <section anchor="IPM-Validator" title="Validator">
        <t>An IOAM node that performs the validation of the integrity protection
        is referred to as a Validator. Any Validator is a key trusted entity in
        this system, as it has access to all of the keying material in use and
        makes the final determination of whether an ICV is valid.</t>

        <t>A validator is not vulnerable to key-nonce reuse, since the computed
        ICV remains internal. However, a protection against replay attacks in
        general (more specifically, replay of old IOAM-Data-Fields) is still
        needed. To this end, a Validator MUST be able to detect nonces already
        used with specific keys during validation to prevent replays. Details on
        how this detection is implemented are out of scope.
        If a Validator receives a Nonce field that has already been
        used with a specific key during validation, it MUST consider the ICV as
        invalid and ignore the next steps.</t>

        <t>To validate an ICV, a Validator MUST recompute the cumulative ICV by
        replaying the sequence of GMAC operations in the same order as performed
        by the IOAM nodes, using the IOAM-Data-Fields contained in the packet
        and the correponding keys associated with each node. Since only the
        latest ICV is carried, each step uses the ICV produced by the previous
        step as input to the next computation. The recomputed ICV is then
        compared with the ICV field (ICV_rx) carried in the packet. The
        Validator performs the following operations:</t>

        <t>Step 0 (encapsulating node)
          <list style="bullets">
            <t>AAD_0 = (Header Fields || IOAM-Data-Fields_0)</t>
            <t>ICV_0 = GMAC(Key_0, Nonce, AAD_0)</t>
          </list></t>

        <t>Step i (i-th node)
          <list style="bullets">
            <t>AAD_i = (ICV_i-1 || IOAM-Data-Fields_i)</t>
            <t>ICV_i = GMAC(Key_i, Nonce, AAD_i)</t>
          </list></t>

        <t>Step n (n-th node, i.e., the Validator)
          <list style="bullets">
            <t>return (ICV_n-1 == ICV_rx)</t>
          </list></t>

        <t>As a result, a Validator can perform an integrity check on the
        IOAM-Data-Fields and report whether any modification is detected.
        The validation is one-step in
        some cases (e.g., with POT Type-0 or E2E), where only the encapsulating
        node updates the ICV according to the definition of this method. For
        other cases where transit nodes also update the ICV (e.g., with Trace
        Option-Types), a Validator MUST be able to identify these transit nodes
        to look up their respective keys. For that, a unique identifier of the
        node, such as the "node_id" (<xref target="RFC9197"/>, Section 4.4.2)
        for Trace Option-Types, MUST be included in
        IOAM-Data-Fields. Regardless of the Option-Type, the Nonce field allows
        the encapsulating node to be identified (<xref target="IPM-KNM"/>).
        Details on how the mapping between those identifiers and keys is
        implemented on a Validator are out of scope.</t>
      </section>
    </section>

    <section anchor="IANA" title="IANA Considerations">
      <section anchor="IOAM-type-registry" title="IOAM Option-Types">
        <t>IANA is requested to add the following new code points in the
        "IOAM Option-Type" registry available at <xref target="IANA-IOAM"/>:</t>

        <t><list style="hanging">
          <t hangText="Code Point:">(suggested) 64</t>
          <t hangText="Name:">IOAM Integrity-Protected Pre-allocated Trace
            Option-Type</t>
          <t hangText="Description:">Pre-allocated Trace with Integrity
            Protection</t>
          <t hangText="Reference:">This document,
            <xref target="NewIOAMOptTypes"/></t>
        </list></t>

        <t><list style="hanging">
          <t hangText="Code Point:">(suggested) 65</t>
          <t hangText="Name:">IOAM Integrity-Protected Incremental Trace
            Option-Type</t>
          <t hangText="Description:">Incremental Trace with Integrity
            Protection</t>
          <t hangText="Reference:">This document,
            <xref target="NewIOAMOptTypes"/></t>
        </list></t>

        <t><list style="hanging">
          <t hangText="Code Point:">(suggested) 66</t>
          <t hangText="Name:">IOAM Integrity-Protected POT Option-Type</t>
          <t hangText="Description:">POT with Integrity Protection</t>
          <t hangText="Reference:">This document,
            <xref target="NewIOAMOptTypes"/></t>
        </list></t>

        <t><list style="hanging">
          <t hangText="Code Point:">(suggested) 67</t>
          <t hangText="Name:">IOAM Integrity-Protected E2E Option-Type</t>
          <t hangText="Description:">E2E with Integrity Protection</t>
          <t hangText="Reference:">This document,
            <xref target="NewIOAMOptTypes"/></t>
        </list></t>

        <t>New IOAM Integrity-Protected Option-Types that intend to use the
        Integrity Protection Method defined in this document will update the
        "IOAM Integrity Protection Methods" registry
        (<xref target="IOAM-IP-registry"/>), more specifically the "Protected
        Header Fields" column of this Integrity Protection Method, to specify
        the list of corresponding Option-Type header fields that participate in
        the integrity protection of IOAM-Data-Fields.
        <xref target="IPM-header-fields"/> discusses the motivations and choices
        for protecting the integrity of Option-Type header fields in addition
        to IOAM-Data-Fields.</t>
      </section>

      <section anchor="IOAM-IP-registry"
               title="IOAM Integrity Protection Methods">
        <t>IANA is requested to define a new registry named "IOAM Integrity
        Protection Methods", under the "In Situ OAM (IOAM)" registry group
        <xref target="IANA-IOAM"/>.</t>

        <t>This new registry defines 256 code points to identify different IOAM
        Integrity Protection Methods. The following initial code points are
        defined:

        <figure title="IOAM Integrity Protection Methods">
          <artwork>
+======+==================+=========================+================+
| ID   | Description      | Protected Header Fields | Reference      |
+======+==================+=========================+================+
| 0x00 | AES-GMAC,        | Pre-allocated Trace and | This document, |
|      | 16-octet (full)  | Incremental Trace:      | Section 5      |
|      | Authentication   | - Namespace-ID          |                |
|      | Tag, 12-octet    |   (mask = 0xffff)       |                |
|      | Initialization   | - NodeLen + Flags +     |                |
|      | Vector.          |   RemainingLen          |                |
|      |                  |   (mask = 0xfb00)       |                |
|      |                  | - IOAM Trace-Type       |                |
|      |                  |   (mask = 0xffffff)     |                |
|      |                  | - Reserved              |                |
|      |                  |   (mask = 0x00)         |                |
|      |                  |                         |                |
|      |                  | POT:                    |                |
|      |                  | - Namespace-ID          |                |
|      |                  |   (mask = 0xffff)       |                |
|      |                  | - IOAM-POT-Type         |                |
|      |                  |   (mask = 0xff)         |                |
|      |                  |   IOAM-POT-Flags        |                |
|      |                  |   (mask = 0x00)         |                |
|      |                  |                         |                |
|      |                  | E2E:                    |                |
|      |                  | - Namespace-ID          |                |
|      |                  |   (mask = 0xffff)       |                |
|      |                  | - IOAM-E2E-Type         |                |
|      |                  |   (mask = 0xffff)       |                |
+------+------------------+-------------------------+----------------+
| 0x01 |                  |                         |                |
|  -   | Unassigned       |                         |                |
| 0xFE |                  |                         |                |
+------+------------------+-------------------------+----------------+
| 0xFF | Reserved         |                         | This document  |
+------+------------------+-------------------------+----------------+
          </artwork>
        </figure> Code points 1-254 are available for assignment via the "IETF
        Review" process, as per <xref target="RFC8126"/>.</t>

        <t>New registration requests must use the following template: the value
        of the requested code point, a description of the Integrity Protection
        Method, the list of header fields with integrity protection masks for
        all supported Option-Types, and a reference to the document (and,
        optionally, the section) that defines the new Integrity Protection
        Method.</t>
      </section>
    </section>

    <section anchor="Operational" title="Operational Considerations">
      <section title="Manageability">
        <t><xref target="I-D.ietf-ippm-ioam-integrity-yang"/> specifies a YANG
        module to manage IOAM profiles with integrity protection.</t>
      </section>

      <section title="Scalability and Performance">
        <t>Each node that applies the Integrity Protection Method defined in
        this document incurs additional per-packet processing. This overhead is
        increased for Validators with Integrity-Protected Option-Types that
        require transit node participation (e.g., Integrity-Protected Trace
        Option-Types).</t>

        <t>Improper use of this method can overload nodes and result in service
        degradation or failure. Implementations SHOULD monitor relevant metrics
        (e.g., CPU and memory utilization) to detect abnormal behavior.</t>

        <t>Operators deploying this method MUST ensure that overload conditions
        are avoided. This can be achieved by limiting IOAM insertion to a subset
        of traffic, noting that only such traffic is integrity-protected.
        Processing load MAY be distributed across multiple Validators to enable
        parallel validation and load sharing.</t>
      </section>

      <section title="Migration">
        <t>Option-Types defined in <xref target="RFC9197"/> and the
        Integrity-Protected Option-Types defined in this document are not
        mutually exclusive and could coexist within the same IOAM-Domain.
        Integrity protection is an extension to IOAM.</t>

        <t>An implementation could support multiple IOAM-Namespaces
        concurrently, for example, one IOAM-Namespace using the Pre-allocated
        Trace Option-Type and another using the Integrity-Protected
        Pre-allocated Trace Option-Type.</t>
      </section>

      <section title="MTU">
        <t><xref target="RFC9197"/> discusses MTU considerations, as IOAM data
        is carried within packets. Similarly, the additional space required to
        provide integrity protection of the IOAM-Data-Fields MUST NOT cause
        packets to exceed the applicable MTU within the IOAM-Domain and SHOULD
        minimize adverse effects on packet processing.</t>
      </section>
    </section>

    <section anchor="Security" title="Security Considerations">
      <t><xref target="ThreatAnalysis"/> provides a threat analysis
      of integrity-related threats in the context of IOAM.</t>

      <t>The Integrity Protection Method defined in this document
      (<xref target="IPM"/>) leverages symmetric keys and uses AES-GMAC
      <xref target="AES"/> <xref target="NIST.800-38D"/>. Security
      considerations regarding key and nonce management are discussed in
      <xref target="IPM-KNM"/>. In particular, a node MUST NOT reuse a nonce
      with the same key.</t>

      <t>Packet reordering or duplication does not compromise the Integrity
      Protection Method defined in this document, as key-nonce reuse is
      prohibited. Reordered or duplicated packets are not processed for
      integrity protection and no IOAM data is inserted. This behavior depends
      on the replay protection window implemented by a node. Such protection
      window determines the tolerance for packet reordering.</t>

      <t>A compromised transit node can remove the Integrity Protection header
      and replace an IOAM Integrity-Protected Option-Type with its unprotected
      equivalent to modify IOAM-Data-Fields and bypass validation. It can also
      reinitialize the Nonce and ICV to impersonate an encapsulating node. To
      mitigate these threats, a Validator MUST know all IOAM Namespace-IDs with
      integrity protection enabled, the corresponding encapsulating nodes, and
      the Option-Types they add. Integrity protection MUST be applied to the
      entire IOAM set for a given Namespace-ID. Implementation details are out
      of scope. As noted in <xref target="DelHeaderSec"/>, a compromised transit
      node can remove IOAM Option-Types; mitigation is out of scope and SHOULD
      be provided by the protocol that encapsulates IOAM.</t>

      <t>A compromised Validator can forge or modify IOAM-Data-Fields and
      produce incorrect validation results. As a trusted entity, such behavior
      cannot be prevented by this Integrity Protection Method. Compromised
      encapsulating or transit nodes can forge or drop packets but cannot
      impersonate other IOAM nodes or modify integrity-protected
      IOAM-Data-Fields without detection by a Validator. A transit node's
      ability to forge data is limited, as validation includes the encapsulating
      node's ICV.</t>

      <t>The Integrity Protection Method defined in this document is intended
      for Intra-IOAM-Domain use cases (i.e., no confidentiality, integrity
      protection only). For Inter-IOAM-Domain use cases, operators can use IPSec
      to securely transfer IOAM-Data-Fields between IOAM-Domains.</t>
    </section>

    <section title="Acknowledgements">
      <t>The authors would like to thank Santhosh N, Rakesh Kandula, Saiprasad
      Muchala, Al Morton, Greg Mirsky, Benjamin Kaduk, Mehmet Beyaz,
      Martin Duke, Tianran Zhou, Giuseppe Fioccola, Mohamed Boucadair, and
      Yoshifumi Nishida for their comments and advice.</t>
    </section>
  </middle>

  <!--  *****BACK MATTER ***** -->

  <back>
    <!-- References split into informative and normative -->

    <!-- There are 2 ways to insert reference entries from the citation libraries:
     1. define an ENTITY at the top, and use "ampersand character"RFC2629; here (as shown)
     2. simply use a PI "less than character"?rfc include="reference.RFC.2119.xml"?> here
        (for I-Ds: include="reference.I-D.narten-iana-considerations-rfc2434bis.xml")

     Both are cited textually in the same manner: by using xref elements.
     If you use the PI option, xml2rfc will, by default, try to find included files in the same
     directory as the including file. You can also define the XML_LIBRARY environment variable
     with a value containing a set of directories to search.  These can be either in the local
     filing system or remote ones accessed by http (http://domain/dir/... ).-->

    <references title="Normative References">
      &RFC2119;
      &RFC8126;
      &RFC8174;
      &RFC9197;

      <reference anchor="AES"
                 target="http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf">
        <front>
          <title>Advanced Encryption Standard (AES)</title>
          <author>
            <organization>National Institute of Standards and
            Technology</organization>
          </author>
          <date year="2001"/>
        </front>
        <seriesInfo name="" value="FIPS PUB 197"/>
      </reference>

      <reference anchor="NIST.800-38D"
                 target="http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf">
        <front>
          <title>Recommendation for Block Cipher Modes of Operation:
          Galois/Counter Mode (GCM) and GMAC</title>
          <author>
            <organization>National Institute of Standards and
            Technology</organization>
          </author>
          <date year="2007"/>
        </front>
        <seriesInfo name="" value="NIST Special Publication 800-38D"/>
      </reference>
    </references>

    <references title="Informative References">
      &RFC7276;
      &RFC7384;
      &RFC9055;
      &RFC9322;
      &RFC9326;
      &I-D.ietf-opsawg-oam-characterization;
      &I-D.ietf-ippm-ioam-integrity-yang;

      <reference anchor="IANA-IOAM"
                 target="https://www.iana.org/assignments/ioam/ioam.xhtml">
        <front>
          <title>In Situ OAM (IOAM)</title>
          <author>
            <organization>IANA</organization>
          </author>
        </front>
      </reference>
    </references>
  </back>
</rfc>
