<?xml version="1.0" encoding="us-ascii"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.17 (Ruby 2.6.10) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC4303 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4303.xml">
<!ENTITY RFC8750 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8750.xml">
<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY I-D.pwouters-ipsecme-multi-sa-performance SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.pwouters-ipsecme-multi-sa-performance.xml">
<!ENTITY I-D.mrossberg-ipsecme-multiple-sequence-counters SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.mrossberg-ipsecme-multiple-sequence-counters.xml">
<!ENTITY SELF "[RFCXXXX]">
]>


<rfc ipr="trust200902" docName="draft-ponchon-ipsecme-anti-replay-subspaces-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="IPsec anti-replay subspaces">IPsec and IKE anti-replay sequence number subspaces for traffic-engineered paths and multi-core processing</title>

    <author initials="P." surname="Ponchon" fullname="Paul Ponchon">
      <organization>Cisco Meraki</organization>
      <address>
        <email>pponchon@cisco.com</email>
      </address>
    </author>
    <author initials="M." surname="Shaikh" fullname="Mohsin Shaikh">
      <organization>Cisco Meraki</organization>
      <address>
        <email>mohsisha@cisco.com</email>
      </address>
    </author>
    <author initials="H." surname="Dernaika" fullname="Hadi Dernaika">
      <organization>Cisco Meraki</organization>
      <address>
        <email>hbd05@mail.aub.edu</email>
      </address>
    </author>
    <author initials="P." surname="Pfister" fullname="Pierre Pfister">
      <organization>Cisco Meraki</organization>
      <address>
        <email>ppfister@cisco.com</email>
      </address>
    </author>
    <author initials="G." surname="Solignac" fullname="Guillaume Solignac">
      <organization>Cisco Meraki</organization>
      <address>
        <email>gsoligna@cisco.com</email>
      </address>
    </author>

    <date year="2023" month="July" day="10"/>

    <area>Applications</area>
    <workgroup>ipsecme</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This document discusses the challenges of running IPsec with anti-replay in multi-core environments where packets may be re-ordered (e.g., when sent over multiple IP paths, traffic-engineered paths and/or using different QoS classes). A new solution based on splitting the anti-replay sequence number space into multiple different sequencing subspaces is proposed. Since this solution requires support on both parties, an IKE extension is proposed in order to negotiate the use of the anti-replay sequence number subspaces.</t>



    </abstract>



  </front>

  <middle>


<section anchor="intro"><name>Introduction</name>

<t>The IPsec and IKE protocol suite is very commonly used in secure overlay networks, often interconnecting thousands or tens of thousands of sites. Leveraging the high core-counts and multiple uplinks (e.g., multiple fiber/cable, cellular or MPLS uplinks) capabilities of modern systems is important to bring greater throughput, availability and quality of service.</t>

<t>Such scale and multi-paths requirements conflict with how anti-replay is currently implemented in IPsec tunnels. This document first describes the problems related to running IPsec with anti-replay in conjunction with traffic-engineered paths or multi-core systems, and how existing solutions are not sufficient to address these challenges. An IPsec extension is then defined, which allows an IPsec security association (SA) to use multiple different sequence number spaces in parallel. Finally, an IKE extension is defined in order to enable this option only when both tunnel endpoints support it.</t>

</section>
<section anchor="problem"><name>Problem Statement</name>

<t>While the problem is explored in more detail in <xref target="I-D.mrossberg-ipsecme-multiple-sequence-counters"/>, this section will highlight the key issues associated with running IPsec with anti-replay in multi-core systems and environments where traffic-engineering is used, as well as the limitations of current solutions.</t>

<t>Scaling the current anti-replay mechanism to run on multiple cores concurrently shows performance limitations:
- When receiving a packet, preventing the same IPsec packet from being accepted by two different cores concurrently requires constant synchronization between the cores.
- When transmitting a packet, sequence numbers must be allocated efficiently, and packets must be transmitted without too much re-ordering, as to not exceed the receiver&#39;s anti-replay window size. This also ends-up requiring locks and synchronization between cores.</t>

<t>A commonly used alternative is to assign each Child SA to a given core, but that limits the throughput that is achievable by a single tunnel and adds a performance overhead associated with passing packets across cores.</t>

<t>These restrictions are discussed in <xref target="I-D.pwouters-ipsecme-multi-sa-performance"/>, which mainly focuses on high-throughput IPsec tunnels, but the problem also arises with small tunnels since multiple inner flows processed by multiple threads often need to be transmitted on the same tunnel (causing multiple threads to need to access shared resources).</t>

<t>A possible solution to leverage the multi-core capability of the IPsec peers for a given tunnel would be to allocate one Child SA per core. However, combined with QoS classes and multi-path capabilities, this approach shows scalability issues with both the IKE and IPsec implementations:</t>

<t><list style="symbols">
  <t>Increased number of IKE negotiations and re-key operations.</t>
  <t>Increased IKE memory usage.</t>
  <t>Data-plane performance degradation due to the use of a larger number of keys.</t>
  <t>Data-plane reduced number of connected peers, due to a hard limit to the number of supported Child SAs.</t>
  <t>When PFS is enabled, the overhead of each Child SA negotiation is increased due to additional Diffie-Hellman operations.</t>
</list></t>

<t>Finally, in situations where packet reordering is present, such as with QoS or multiple uplinks, slower or lower priority packets may fall outside of the anti-replay window and be dropped. Using an extraordinarily large window size causes both performance and scalability limitations.</t>

</section>
<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>

<t>The key words &quot;<bcp14>MUST</bcp14>&quot;, &quot;<bcp14>MUST NOT</bcp14>&quot;, &quot;<bcp14>REQUIRED</bcp14>&quot;, &quot;<bcp14>SHALL</bcp14>&quot;, &quot;<bcp14>SHALL
NOT</bcp14>&quot;, &quot;<bcp14>SHOULD</bcp14>&quot;, &quot;<bcp14>SHOULD NOT</bcp14>&quot;, &quot;<bcp14>RECOMMENDED</bcp14>&quot;, &quot;<bcp14>NOT RECOMMENDED</bcp14>&quot;,
&quot;<bcp14>MAY</bcp14>&quot;, and &quot;<bcp14>OPTIONAL</bcp14>&quot; in this document are to be interpreted as
described in BCP14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

</section>
<section anchor="solution"><name>Multiple sequence number subspaces</name>

<t>As discussed in <xref target="problem"/>, processing packets associated with a single Child SA on multiple cores and using a single Child SA on multiple paths or with multiple QoS classes suffers from limitations due to the anti-replay mechanism.</t>

<t>This specification provides an option to change the anti-replay mechanism defined in <xref target="RFC4303"/> by splitting the anti-replay sequence number space into multiple subspaces. Each core, path, or QoS class, or any combination of those, can then use their own unique anti-replay sequence number subspace. The changes needed to the ESP header and IPsec protocol are described in <xref target="SN-subspace"/>, <xref target="sender-spec"/> and <xref target="receiver-spec"/>.</t>

<t>To avoid potential issues with non-standard extensions of IPsec ESP, this solution modifies only the field related to the anti-replay mechanism (i.e., the sequence number) and not the SPI field, which is intended to identify the Child SA. An IKE extension is presented in <xref target="ike-negotiation"/> to coordinate the use, or not, of this extension, which requires both IPsec peers to implement it.</t>

<section anchor="SN-subspace"><name>Sequence number subspace encoding in IPSec</name>

<t>This document extends the 32-bit field of the sequence number in the ESP header to a 64-bit field, which is in turn divided into two sub-fields:</t>

<t><list style="symbols">
  <t>The higher order 16 bits contain the new sequence number subspace ID.</t>
  <t>The lower order 48 bits continue to serve as the sequence number.</t>
</list></t>

<figure><artwork><![CDATA[
  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
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |               Security Parameters Index (SPI)                 |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |          Subspace ID          |        Sequence Number        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        Sequence Number                        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                    Rest of the ESP payload

]]></artwork></figure>

<t>While the reduced usage of subspaces due to the restriction of the extended sequence number to 48 bits is a consideration, it is estimated that a 1 Tbps would exhaust a subspace in over 938 hours. This is for ethernet frames of 1500 bytes, T = 2^48 (pkts) * 1500 (B/pkt) * 8 / 10^12 (bps) = ~3.4 * 10^6 seconds = ~938 hours.</t>

</section>
<section anchor="sender-spec"><name>Sender Behavior</name>

<t>This section defines the IPsec sender&#39;s behavior when transmitting packets using an IPsec SA that has been previously configured or negotiated with IKE to use at most N different sequence number subspace IDs.</t>

<t>The sender <bcp14>MAY</bcp14> set the sequence number subspace ID to any value between 0 and N-1. How the different subspace IDs are used is up to the implementation, but as an example, the sender could use different subspace ID values per path or per processing core (or combination of both).</t>

<t>The sender <bcp14>MUST NOT</bcp14> use any subspace ID values greater or equal to N (since the IPsec SA has been configured to use at most N different values). This requirement was introduced to improve the implementation performance, as opposed to allowing the sender to use arbitrary subspace ID values.</t>

<t>The sender <bcp14>MUST</bcp14> maintain one sequence number counter per sequence number subspace that it makes use of. But the sender <bcp14>MAY</bcp14> use only some (and as few as a single one) of the available N subspace ID values between 0 and N-1.</t>

<t>When transmitting a packet, the sender <bcp14>MUST</bcp14> use the sequence number counter associated with the sequence number subspace in use for that packet.</t>

<t>The 48 bits sequence number counter associated with any subspace <bcp14>MUST NOT</bcp14> be allowed to cycle. The sender <bcp14>MUST</bcp14> establish a new SA prior to the transmission of the 2^48th packet on any of the SA&#39;s sequence number subspaces.</t>

</section>
<section anchor="receiver-spec"><name>Receiver Behavior</name>

<t>This section defines the IPsec receiver&#39;s behavior when receiving packets using an IPsec SA that has been previously configured or negotiated to use at most N different sequence number subspace IDs.</t>

<t>The receiver <bcp14>MUST</bcp14> maintain one anti-replay window and counter for each sequence number subspace being used.</t>

<t>When receiving a packet, the receiver <bcp14>MUST</bcp14> use the anti-replay window and counter associated with the sequence number subspace identified with the subspace ID field.</t>

<t>The receiver <bcp14>MUST</bcp14> drop any packet received with a subpace ID value greater or equal to N. Such packets <bcp14>SHOULD</bcp14> be counted for reporting.</t>

<t>Note: Since the sender may decide to only use a subset of the available N subspace values, the receiver <bcp14>MAY</bcp14> reactively allocate an anti-replay window when receiving the first packet for a given subspace. When doing so, the receiver <bcp14>SHOULD</bcp14> first check the authenticity of the packet before allocating the new anti-replay window.</t>

<t>The 48 bits sequence number counter associated with any subspace <bcp14>MUST NOT</bcp14> be allowed to cycle.</t>

</section>
<section anchor="ESN"><name>Extended Sequence Numbers (ESN) considerations</name>

<t>Since the sequence number, as well as the sequence number subspace IDs are explicit in the ESP header, most of the ESN related specifications (such as ESN&#39;s synchronization mechanism and appended trailer for ICV calculation) are not used by this standard.</t>

<t>However, all IPsec cryptographic algorithms <bcp14>MUST</bcp14> be used with the ESN value replaced with a 64 bits value constructed using the 16 sequence number subspace ID high-order bits and the 48 sequence number lower order bits.</t>

<t>Any IPsec cryptographic algorithm that does not support ESN <bcp14>MUST NOT</bcp14> be used in conjunction with this specification.</t>

</section>
<section anchor="ike-negotiation"><name>Negotiating sequence-number subspaces using IKE</name>

<t>To negotiate the use of sequence number subspaces for use with IPsec ESP, a new anti-replay subspaces transform (<xref target="transform-substruct"/>) is defined with two attributes:</t>

<t><list style="symbols">
  <t>The number of sequence number subspaces the sender is capable of using is indicated by the &#39;Sequence number subspaces supported&#39; attribute, which is 2 bytes long (<xref target="supported-attribute"/>).</t>
  <t>The &#39;Sequence number subspaces requested&#39; attribute indicates the number of sequence number subspaces the sender prefers to use, and is also 2 bytes long (<xref target="requested-attribute"/>).</t>
</list></t>

<t>If both attributes are set to 0, the sender does not support sequence number subspaces.
The requested value <bcp14>MUST</bcp14> be lower than the supported value.</t>

<t>During the CREATE_CHILD_SA exchange, the sender and receiver negotiate the use of this transform. The sender indicates the number of subspaces it supports and prefers to use, while the receiver decides on the number of subspaces to use based on the sender&#39;s capabilities. This negotiation mechanism allows for flexibility in the number of subspaces used and can help optimize the performance of IPsec in different environments.</t>

<t>With a single Child SA negotiated between the two IPsec peers, the failure model is clean, as all requested subspaces are either available or none of them.</t>

<section anchor="transform-substruct"><name>Anti-replay subspaces transform</name>

<figure><artwork><![CDATA[
                        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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | Last Substruc |   RESERVED    |        Transform Length       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Transform Type |   RESERVED    |          Transform ID         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   ~                      Transform Attributes                     ~
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<t><list style="symbols">
  <t>Transform Length (2 bytes), set to 16 bytes with the two attributes each taking 4 bytes</t>
  <t>Transform Type (1 byte) TBD</t>
  <t>Transform ID (2 bytes) TBD</t>
</list></t>

</section>
<section anchor="supported-attribute"><name>&#39;Sequence number subspaces supported&#39; attribute</name>

<figure><artwork><![CDATA[
                        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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |1|       Attribute Type        |     AF=1  Attribute Value     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<t><list style="symbols">
  <t>AF (1 bit), set to 1 for Type/Value (TV) format</t>
  <t>Attribute Type (15 bits) TBD</t>
  <t>Attribute Value (2 bytes), any value between 0 and 65,535</t>
</list></t>

</section>
<section anchor="requested-attribute"><name>&#39;Sequence number subspaces requested&#39; attribute</name>

<figure><artwork><![CDATA[
                        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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |1|       Attribute Type        |     AF=1  Attribute Value     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<t><list style="symbols">
  <t>AF (1 bit), set to 1 for Type/Value (TV) format</t>
  <t>Attribute Type (15 bits) TBD</t>
  <t>Attribute Value (2 bytes), any value between 0 and the supported number of subspaces</t>
</list></t>

</section>
</section>
<section anchor="solution-analysis"><name>Solution Analysis</name>

<t>As described in <xref target="problem"/>, anti-replay comes with implementation and scalability challenges when running in environments where IPsec peers may leverage multiple QoS policies to send packets or multiple cores to process them.</t>

<t>Since the anti-replay mechanism seems to be the source cause of these observed challenges, this document provides a solution which relies on a small and optional change at the anti-replay level.</t>

<t>By using sequence number subspaces, IPsec peers may:</t>

<t><list style="symbols">
  <t>use different subspaces for different cores, which allows distributing a Child SA between cores to increase performance</t>
  <t>use different subspaces for different QoS classes or different paths, which avoids unwanted drops due to potential reordering of packets, either at the egress or during its flight.</t>
  <t>combine the above per-QoS-queue, per-path and per-core approaches without multiplying the number of required Child SAs.</t>
</list></t>

<t>The effectiveness of the subspace mechanism can be further improved with smart NICs or multiple paths to efficiently steer packets to different cores on the receiver side. However, even without these capabilities, sequence number subspaces still provide benefits for IPsec tunnels. Without subspaces, IPsec tunnels are often restricted to a single core due to the need for locking mechanisms, which can cause significant overhead. With subspaces, it is still possible to distribute the subspaces between cores by resteering packets to increase performances.</t>

<t>In scenarios where NATs are used to modify IP addresses or ports, the use of multiple uplinks on a single IPsec tunnel may not be feasible without additional IKE negotiation to perform NAT traversal. As a result, using multiple uplinks is recommended only in scenarios where NATs are not present.</t>

</section>
</section>
<section anchor="security"><name>Security Considerations</name>

<t>The sequence number is used by the anti-replay mechanism to ensure a packet could not be accepted twice by the receiver. This prevents an attacker from trying to replay one or multiple packets from an IPsec tunnel.</t>

<t>In this proposal, a single Child SA is associated with multiple anti-replay windows and counters. If a packet is replayed, the sequence number subspace ID remains the same since the Subspace ID field is authenticated. As a result, the receiver will use the same anti-replay state when processing the replayed packet as the one used when the first packet was initially received. This ensures that a replayed packet will be detected and dropped by the receiver.</t>

<t>The use of a subspace ID as part of the 64-bit sequence number ensures that the usage limit of cryptographic materials is evenly distributed among the subspaces without the need for an additional mechanism. This means each of the 2^16 subspaces can encrypt 2^48 packets, fully utilizing the 2^64 usage limits of the cryptographic keys.</t>

</section>
<section anchor="implementation"><name>Implementation Considerations</name>

<t>When a single sequence number space is used within a given Child SA, encryption and decryption operations must always happen on the same core (locking anti-replay structures or using contended atomic operations has a dramatic performance hit).</t>

<t><list style="symbols">
  <t>On reception, this requires packets which are received (and load-balanced to cores) to be often resteered to a different thread for processing.</t>
  <t>On transmisson, multiple flows, processed by different cores, need to be transmitted using the same Child SA. This requires the packets to be resteered to the thread in charge of the given Child SA.</t>
</list></t>

<t>To avoid the performance degradation caused by packet resteering, each thread may use its own sequence number subspace:</t>

<t><list style="symbols">
  <t>On transmission, the core will always select the subspace it is assigned when generating the ESP header.</t>
  <t>On reception, the subspace ID could be used to load-balance the packets to their proper thread.</t>
</list></t>

<t>Similarly, when multiple paths are used:</t>

<t><list style="symbols">
  <t>On transmission, a different sequence number subspace is used for each packet path. Ensuring that out-of-order packets are not dropped by the anti-replay mechanism.</t>
  <t>On reception, the 5-tuple based packet steering would provide a decent level of load-balancing between threads, since different IP paths would use different 5-tuples.</t>
</list></t>

<t>If a combination of both multi-path and multi-core load-balancing is needed, the subspace field could be used partly to encode a path ID, partly to encode a core ID. But this is purely implementation specific and does not require coordination between the peers.</t>

<section anchor="initialization-vector-iv-considerations"><name>Initialization Vector (IV) Considerations</name>

<t>Depending on the cryptographic mode of operations, the Initialization Vector (IV) comes with specific requirements.</t>

<t>Some modes (e.g., CBC) make use of random IV values. When implementing this specification, each thread independently generates its independent stream of random values, ensuring the IV randomness property. Care must be taken as to limit the global number of transmitted packets using the same Child SA in order to avoid birthday paradox attacks. A lockless counter, or batched token bucket mechanism, may be used to efficiently implement this process without performance degradation.</t>

<t>Other cryptographic modes (e.g., GCM) do not have randomness requirements over the IV, but the IV values must only be used once. RFC4106 Section 3.1 states that &quot;The most natural way to implement this is with a counter, but anything that guarantees uniqueness can be used, such as a linear feedback shift register (LFSR).  Note that the encrypter can use any IV generation method that meets the uniqueness requirement, without coordinating with the decrypter.&quot; . One simple way to implement this specification is to divide the IV into a subspace field, which reuses the ESP sequence number subspace value, and a variable IV part, which is simply incremented for each encrypted packet.
To ensure compatibility with implicit IVs from <xref target="RFC8750"/>, only the 48-bit sequence number field must be initialized to zero, while the 16-bit subspace ID can be used for its intended purpose.</t>

<t>Author&#39;s note: Are there other cryptographic modes with different requirements over the IV ?</t>

</section>
<section anchor="implementation-status"><name>Implementation Status</name>
<t>An open-source implementation of this standard is in progress as part of the <eref target="https://fd.io">VPP open-source data-plane</eref>.</t>

</section>
</section>
<section anchor="operational"><name>Operational Considerations</name>

<t>TBD</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>TBD</t>

</section>


  </middle>

  <back>


    <references title='Normative References'>

&RFC4303;
&RFC8750;
&RFC2119;
&RFC8174;


    </references>

    <references title='Informative References'>

&I-D.pwouters-ipsecme-multi-sa-performance;
&I-D.mrossberg-ipsecme-multiple-sequence-counters;


    </references>



  </back>

<!-- ##markdown-source:
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
2WHfud72AFBXpNCD/wZN8NZo11QAAA==

-->

</rfc>

