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


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

]>

<?rfc docmapping="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-quic-load-balancers-21" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="QUIC-LB">QUIC-LB: Generating Routable QUIC Connection IDs</title>

    <author initials="M." surname="Duke" fullname="Martin Duke">
      <organization>Google</organization>
      <address>
        <email>martin.h.duke@gmail.com</email>
      </address>
    </author>
    <author initials="N." surname="Banks" fullname="Nick Banks">
      <organization>Microsoft</organization>
      <address>
        <email>nibanks@microsoft.com</email>
      </address>
    </author>
    <author initials="C." surname="Huitema" fullname="Christian Huitema">
      <organization>Private Octopus Inc.</organization>
      <address>
        <email>huitema@huitema.net</email>
      </address>
    </author>

    <date />

    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    

    <abstract>


<?line 53?>

<t>QUIC address migration allows clients to change their IP address while
maintaining connection state. To reduce the ability of an observer to link two
IP addresses, clients and servers use new connection IDs when they communicate
via different client addresses. This poses a problem for traditional "layer-4"
load balancers that route packets via the IP address and port 4-tuple. This
specification provides a standardized means of securely encoding routing
information in the server's connection IDs so that a properly configured load
balancer can route packets with migrated addresses correctly. As it proposes a
structured connection ID format, it also provides a means of connection IDs
self-encoding their length to aid some hardware offloads.</t>



    </abstract>



  </front>

  <middle>


<?line 66?>

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

<t>QUIC packets <xref target="RFC9000"/> usually contain a connection ID to allow endpoints to
associate packets with different address/port 4-tuples to the same connection
context. This feature makes connections robust in the event of NAT rebinding.
QUIC endpoints usually designate the connection ID which peers use to address
packets. Server-generated connection IDs create a potential need for out-of-band
communication to support QUIC.</t>

<t>QUIC allows servers (or load balancers) to encode useful routing information for
load balancers in connection IDs.  It also encourages servers, in packets
protected by cryptography, to provide additional connection IDs to the client.
This allows clients that know they are going to change IP address or port to use
a separate connection ID on the new path, thus reducing linkability as clients
move through the world.</t>

<t>There is a tension between the requirements to provide routing information and
mitigate linkability.  Ultimately, because new connection IDs are in protected
packets, they must be generated at the server if the load balancer does not have
access to the connection keys. However, it is the load balancer that has the
context necessary to generate a connection ID that encodes useful routing
information. In the absence of any shared state between load balancer and
server, the load balancer must maintain a relatively expensive table of
server-generated connection IDs, and will not route packets correctly if they
use a connection ID that was originally communicated in a protected
NEW_CONNECTION_ID frame.</t>

<t>This specification provides common algorithms for encoding the server mapping in
a connection ID given some shared parameters. The mapping is generally only
discoverable by observers that have the parameters, preserving unlinkability as
much as possible.</t>

<t>As this document proposes a structured QUIC Connection ID, it also proposes a
system for self-encoding connection ID length in all packets, so that crypto
offload can efficiently obtain key information.</t>

<t>While this document describes a small set of configuration parameters to make
the server mapping intelligible, the means of distributing these parameters
between load balancers, servers, and other trusted intermediaries is out of its
scope. There are numerous well-known infrastructures for distribution of
configuration.</t>

<section anchor="terminology"><name>Terminology</name>

<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
interpreted as described in RFC 2119 <xref target="RFC2119"/>.</t>

<t>In this document, these words will appear with that interpretation only when in
ALL CAPS.  Lower case uses of these words are not to be interpreted as carrying
significance described in RFC 2119.</t>

<t>In this document, "client" and "server" refer to the endpoints of a QUIC
connection unless otherwise indicated.  A "load balancer" is an intermediary for
that connection that does not possess QUIC connection keys, but it may rewrite
IP addresses or conduct other IP or UDP processing. A "configuration agent" is
the entity that determines the QUIC-LB configuration parameters for the network
and leverages some system to distribute that configuration.</t>

<t>Note that stateful load balancers that act as proxies, by terminating a QUIC
connection with the client and then retrieving data from the server using QUIC
or another protocol, are treated as a server with respect to this specification.</t>

<t>For brevity, "Connection ID" will often be abbreviated as "CID".</t>

</section>
<section anchor="notation"><name>Notation</name>

<t>All wire formats will be depicted using the notation defined in Section 1.3 of
<xref target="RFC9000"/>.</t>

</section>
</section>
<section anchor="overview"><name>Overview</name>

<t>In QUIC-LB, load balancers do not generate individual connection IDs for
servers.  Instead, they communicate the parameters of an algorithm to generate
routable connection IDs.</t>

<t>The algorithms differ in the complexity of configuration at both load balancer
and server. Increasing complexity improves obfuscation of the server mapping.</t>

<t>This specificationn describes three participants: the configuration agent, the
load balancer, and the server. For any given QUIC-LB configuration that enables
connection-ID-aware load balancing, there must be a choice of (1) routing
algorithm, (2) server ID allocation strategy, and (3) algorithm parameters.</t>

<t>Fundamentally, servers generate connection IDs that encode their server ID.
Load balancers decode the server ID from the CID in incoming packets to route
to the correct server.</t>

<t><xref target="RFC8999"/> specifies that endpoints generate their own connection IDs,
implying that all QUIC versions will have a mechanism to communicate their
connection IDs to the peer. In QUIC version 1 and 2, the server does so using
the Source Connection ID field of its long header packets for the first
connection ID, and NEW_CONNECTION_ID frames for subsequent CIDs.</t>

<t>There are situations where a server pool might be operating two or more routing
algorithms or parameter sets simultaneously.  The load balancer uses the first
three bits of the connection ID to multiplex incoming Destination Connection IDs
(DCIDs) over these schemes (see <xref target="config-rotation"/>).</t>

</section>
<section anchor="first-octet"><name>First CID octet</name>

<t>The Connection ID construction schemes defined in this document reserve the
first octet of a CID for two special purposes: one mandatory (config rotation)
and one optional (length self-description).</t>

<t>Subsequent sections of this document refer to the contents of this octet as the
"first octet."</t>

<section anchor="config-rotation"><name>Config Rotation</name>

<t>The first three bits of any connection ID MUST encode an identifier for the
configuration that the connection ID uses. This enables incremental deployment
of new QUIC-LB settings (e.g., keys). A configuration MUST NOT use the
reserved identifier 0b111 (see <xref target="config-failover"/> below).</t>

<t>When new configuration is distributed to servers, there will be a transition
period when connection IDs reflecting old and new configuration coexist in the
network.  The rotation bits allow load balancers to apply the correct routing
algorithm and parameters to incoming packets.</t>

<t>Configuration Agents SHOULD deliver new configurations to load balancers before
doing so to servers, so that load balancers are ready to process CIDs using the
new parameters when they arrive.</t>

<t>A Configuration Agent SHOULD NOT use a codepoint to represent a new
configuration until it takes precautions to make sure that all connections using
CIDs with an old configuration at that codepoint have closed or transitioned.</t>

<t>Servers MUST NOT generate new connection IDs using an old configuration after
receiving a new one from the configuration agent. Servers MUST use that QUIC
version's methods to update the client with CIDs (e.g., NEW_CONNECTION_ID
frames) using the new configuration and retire CIDs using the old configuration.</t>

<t>It also possible to use these bits for more long-lived distinction of different
configurations, but this has privacy implications (see <xref target="multiple-configs"/>).</t>

</section>
<section anchor="config-failover"><name>Configuration Failover</name>

<t>In some deployments, an infrastructure will not receive traffic unless all
servers have received a configuration, and load balancers have a superset of all
configurations that are active in the server pool, thus guaranteeing that any
CID generated by a server is decodable by any load balancer. Servers and load
balancers deployed under all of these assumptions can ignore the provisions in
this subsection.</t>

<t>Load balancers treat connection IDs for which they have no corresponding config
ID as unroutable (see <xref target="unroutable"/>). If they have no configuration at all,
then all connection IDs are unroutable.</t>

<t>Servers with no active configuration MUST issue connection IDs with the reserved
value of the three most significant bits set to 0b111 to signify the connection
ID is unroutable. These connection IDs MUST self-encode their length (see
<xref target="length-self-description"/>).</t>

<t>Servers with no active configuration SHOULD provide the client exactly one CID
over the life of the connection. In QUIC versions 1 and 2, therefore, servers
SHOULD NOT send any NEW_CONNECTION_ID frames, instead delivering a single CID
via the Source Connection ID of long headers it sends.</t>

<t>Servers with no active configuration SHOULD send the "disable_active_migration"
transport parameter, or a similar message in future QUIC versions.</t>

<t>When using codepoint 0b111, all bytes but the first SHOULD have no larger of a
chance of collision as random bytes. The connection ID SHOULD be of at least
length 8 to provide 7 bytes of entropy after the first octet with a low chance
of collision.</t>

</section>
<section anchor="length-self-description"><name>Length Self-Description</name>

<t>Local hardware cryptographic offload devices may accelerate QUIC servers by
receiving keys from the QUIC implementation indexed to the connection ID.
However, on physical devices operating multiple QUIC servers, it might be
impractical to efficiently lookup keys if the connection ID varies in length and
does not self-encode its own length.</t>

<t>Note that this is a function of particular server devices and is irrelevant to
load balancers. As such, load balancers MAY omit this from their configuration.
However, the remaining 5 bits in the first octet of the Connection ID are
reserved to express the length of the following connection ID, not including
the first octet.</t>

<t>A server not using this functionality SHOULD choose the five bits so as to have
no observable relationship to previous connection IDs issued for that
connection.</t>

</section>
<section anchor="format"><name>Format</name>

<figure title="First Octet Format" anchor="first-octet-format"><artwork><![CDATA[
First Octet {
  Config Rotation (3),
  CID Len or Random Bits (5),
}
]]></artwork></figure>

<t>The first octet has the following fields:</t>

<t>Config Rotation: Indicates the configuration used to interpret the CID.</t>

<t>CID Len or Random Bits: Length Self-Description (if applicable), or random bits
otherwise. Encodes the length of the Connection ID following the First Octet.</t>

</section>
</section>
<section anchor="unroutable"><name>Unroutable Connection IDs</name>

<section anchor="definition"><name>Definition</name>

<t>QUIC-LB servers with a valid configuration will generate Connection IDs that are
decodable to extract a server ID in accordance with a specified algorithm and
parameters.  However, QUIC often uses client-generated Connection IDs prior to
receiving a packet from the server.</t>

<t>Furthermore, servers without a valid configuration, or a configuration not
present at the load balancer, will also generate connection IDs that are not
decodable, and these CIDs are likely to persist for the duration of the
connection.</t>

<t>These CIDs might not conform to the expectations of the routing algorithm and
therefore not be routable by the load balancer. Those that are not routable are
"unroutable DCIDs" and receive similar treatment regardless of why they're
 unroutable:</t>

<t><list style="symbols">
  <t>The config rotation bits (<xref target="config-rotation"/>) do not correspond to an active
configuration. Note: a packet with a DCID with config ID codepoint 0b111 (see
<xref target="config-failover"/>) is always unroutable.</t>
  <t>If the packet header encodes the DCID length, the DCID is not long enough for
the decoder to process.</t>
  <t>The extracted server mapping does not correspond to an active server.</t>
</list></t>

<t>If the load balancer has knowledge that all servers in the pool are encoding
CID length in the first octet (see <xref target="length-self-description"/>), it MAY
perform additional checks based on that self-encoded length:</t>

<t><list style="symbols">
  <t>In a long header, verify that the self-encoded length is consistent with the
CID length field in the header (i.e. the self-encoded length is one less)</t>
  <t>Verify that the self-encoded length is consistent with the QUIC version, if
known.</t>
  <t>Verify that the self-encoded length is large enough for the decoder to process
using the indicated config ID.</t>
</list></t>

<t>DCIDs that do not meet any of these criteria are routable.</t>

</section>
<section anchor="load-balancer-forwarding"><name>Load Balancer Forwarding</name>

<t>Load balancers execute the following steps in order until one results in a
routing decision. The steps refer to state that some load balancers will
maintain, depending on the deployment's underlying assumptions. See
<xref target="fallback-algorithm"/> for further discussion of this state.</t>

<t><list style="numbers" type="1">
  <t>If the packet contains a routable CID, route the packet accordingly.</t>
  <t>If the packet has a long header and matches an entry in a table of routing
decisions indexed by a concatenation of 4-tuple and Source CID, route the packet
accordingly.</t>
  <t>If the packet matches an entry in a table of routing decisions by destination
CID, route the packet accordingly.</t>
  <t>If packet matches an entry in a table of routing decisions by 4-tuple, route
the packet accordingly.</t>
  <t>Use the fallback algorithm to make a routing decision and, if applicable,
record the results in the tables indexed by 4-tuple and/or CID. In some cases,
described below, the load balancer might buffer the packet to defer a decision.</t>
</list></t>

</section>
<section anchor="fallback-algorithm"><name>Fallback Algorithms</name>

<t>There are conditions described above where a load balancer routes a packet using
a "fallback algorithm." A standardized algorithm design is not necessary for
interoperability, so load balancers can implement any algorithm that meets the
relevant requirements below.</t>

<t>There is a baseline case that has relatively simple requirements of the chosen
fallback algorithm, and an advanced case with more capabilities and more complex
requirements.</t>

<section anchor="baseline-fallback-algorithm"><name>Baseline Fallback Algorithm</name>

<t>All load balancers MUST implement a baseline fallback algorithm that takes only
the 4-tuple as an input and outputs a routing decision.</t>

<t>If it is impossible for the server to generate CIDs that the load balancer
cannot decode (see <xref target="config-failover"/>), there are no further requirements in
this subsection.</t>

<t>Otherwise, the load balancer SHOULD maintain a table of 4-tuples that carried
unroutable DCIDs and the resulting routing decision. Provided the table does
not overflow, and the load balancer does not lose state, this allows connections
to survive when the server pool changes, which would sometimes change the output
of the fallback algorithm.</t>

<t>The load balancer MAY maintain a table of observed unroutable DCIDs and the
resulting routing decision. Provided the table does not overflow, these
connections will be robust to NAT rebinding.</t>

<t>Load balancers SHOULD maintain per-flow timers to periodically purge state in
the tables described above.</t>

</section>
<section anchor="advanced-fallback-algorithm"><name>Advanced Fallback Algorithm</name>

<t>Some architectures might require a load balancer to choose a server pool based
on deep packet inspection of a client packet. For example, it may use the TLS
1.3 Server Name Indication (SNI) (<xref target="RFC6066"/>) field. The advanced fallback
algorithm enables this capability but levies several additional requirements to
make consistent routing decisions.</t>

<t>For packets not known to belong to a QUIC version the load balancer can parse,
load balancers MUST use the baseline fallback algorithm if the DCID is
unroutable.</t>

<t>For known QUIC versions, the fallback algorithm MAY parse packets and use that
information to make a routing decision.</t>

<t>If so, it MUST have the ability to buffer packets with unroutable DCIDs to await
further packets that allow it to make a routing decision, as the fields of
interest can be an arbitary number of packets into the connection.</t>

<t>4-tuple routing is not sufficient for this use case, because a client can use
the same 4-tuple for two connections that should be routed differently (e.g.
because they target different SNIs), as long as the packet contains a source
connection ID of nonzero length.</t>

<t>Therefore, the load balancer SHOULD maintain two tables that map different
values to a routing decision:</t>

<t><list style="symbols">
  <t>a table indexed by a concatenation of the 4-tuple and source CID, which might
be zero-length, to route subsequent long header packets that do not contain the
server-generated connection ID;</t>
  <t>a table indexed by destination CID, if and only if it is possible for the
server to generate unroutable CIDs. This table can be shared with the one in use
for the baseline fallback algorithm.</t>
</list></t>

<t>If either table overflows, or if the load balancer loses state, it is likely the
load balancer will misroute packets.</t>

<t>Load balancers SHOULD maintain per-flow timers to periodically purge state in
the tables described above.</t>

</section>
</section>
</section>
<section anchor="server-id-encoding-in-connection-ids"><name>Server ID Encoding in Connection IDs</name>

<section anchor="sid-allocation"><name>Server ID Allocation</name>

<t>Load Balancer configurations include a mapping of server IDs to forwarding
addresses. The corresponding server configurations contain one or
more unique server IDs.</t>

<t>The configuration agent chooses a server ID length for each configuration that
MUST be at least one octet.</t>

<t>A QUIC-LB configuration MAY significantly over-provision the server ID space
(i.e., provide far more codepoints than there are servers) to increase the
probability that a randomly generated Destination Connection ID is unroutable.</t>

<t>The configuration agent SHOULD provide a means for servers to express the
number of server IDs it can usefully employ, because a single routing address
actually corresponds to multiple server entities (see <xref target="lb-chains"/>).</t>

<t>Conceptually, each configuration has its own set of server ID allocations,
though two static configurations with identical server ID lengths MAY use a
common allocation between them.</t>

<t>A server encodes one of its assigned server IDs in any CID it generates using
the relevant configuration.</t>

</section>
<section anchor="cid-format"><name>CID format</name>

<t>All connection IDs use the following format:</t>

<figure title="CID Format" anchor="plaintext-cid-format"><artwork><![CDATA[
QUIC-LB Connection ID {
    First Octet (8),
    Plaintext Block (40..152),
}
Plaintext Block {
    Server ID (8..),
    Nonce (32..),
}
]]></artwork></figure>

<t>The First Octet field serves one or two purposes, as defined in <xref target="first-octet"/>.</t>

<t>The Server ID field encodes the information necessary for the load balancer to
route a packet with that connection ID. It is often encrypted.</t>

<t>The server uses the Nonce field to make sure that each connection ID it
generates is unique, even though they all use the same Server ID.</t>

</section>
<section anchor="configuration-agent-actions"><name>Configuration Agent Actions</name>

<t>The configuration agent assigns a server ID to every server in its pool in
accordance with <xref target="sid-allocation"/>, and determines a server ID length (in
octets) sufficiently large to encode all server IDs, including potential future
servers.</t>

<t>Each configuration specifies the length of the Server ID and Nonce fields, with
limits defined for each algorithm.</t>

<t>Optionally, it also defines a 16-octet key. Note that failure to define a key
means that observers can determine the assigned server of any connection,
significantly increasing the linkability of QUIC address migration.</t>

<t>The nonce length MUST be at least 4 octets. The server ID length MUST be at
least 1 octet.</t>

<t>As QUIC version 1 limits connection IDs to 20 octets, the server ID and nonce
lengths MUST sum to 19 octets or less.</t>

</section>
<section anchor="server-actions"><name>Server Actions</name>

<t>The server writes the first octet and its server ID into their respective
fields.</t>

<t>If there is no key in the configuration, the server MUST fill the Nonce field
with bytes that have no observable relationship to the field in previously
issued connection IDs. If there is a key, the server fills the nonce field with
a nonce of its choosing. See <xref target="cid-entropy"/> for details.</t>

<t>The server MAY append additional bytes to the connection ID, up to the limit
specified in that version of QUIC, for its own use. These bytes MUST NOT
provide observers with any information that could link two connection IDs to
the same connection, client, or server. In particular, all servers using a
configuration MUST consistently add the same length to each connection ID,
to preserve the linkability objectives of QUIC-LB. Any additional bytes SHOULD
NOT provide any observable correlation to previous connection IDs for that
connection (e.g., the bytes can be chosen at random).</t>

<t>If there is no key in the configuration, the Connection ID is complete.
Otherwise, there are further steps, as described in the two following
subsections.</t>

<t>Encryption below uses the AES-128-ECB cipher <xref target="NIST-AES-ECB"/>. Future standards
could add new algorithms that use other ciphers to provide cryptographic agility
in accordance with <xref target="RFC7696"/>. QUIC-LB implementations SHOULD be extensible to
support new algorithms.</t>

<section anchor="special-case-single-pass-encryption"><name>Special Case: Single Pass Encryption</name>

<t>When the nonce length and server ID length sum to exactly 16 octets, the server
MUST use a single-pass encryption algorithm. All connection ID octets except the
first form an AES-ECB block. This block is encrypted once, and the result forms
the second through seventeenth most significant bytes of the connection ID.</t>

</section>
<section anchor="general-case-four-pass-encryption"><name>General Case: Four-Pass Encryption</name>

<t>Any other field length requires four passes for encryption and at least three
for decryption. To understand this algorithm, it is useful to define four
functions that minimize the amount of bit-shifting necessary in the event that
there are an odd number of octets.</t>

<t>When configured with both a key, and a nonce length and server ID length that
sum to any number other than 16, the server MUST follow the algorith below to
encrypt the connection ID.</t>

<section anchor="overview-1"><name>Overview</name>

<t>The 4-pass algorithm is a four-round Feistel Network with the round function
being AES-ECB. Most modern applications of Feistel Networks have more than four
rounds. The implications of this choice, which is meant to limit the per-packet
compute overhead at load balancers, are discussed in
<xref target="distinguishing-attacks"/>.</t>

<t>The server concatenates the server ID and nonce into a single field, which is
then split into equal halves. In successive passes, one of these halves is
expanded into a 16B plaintext, encrypted with AES-ECB, and the result XORed with
the other half. The diagram below shows the conceptual processing of a plaintext
server ID and nonce into a connection ID. 'FO' stands for 'First Octet'.</t>

<figure><artset><artwork  type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="560" width="392" viewBox="0 0 392 560" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
<path d="M 8,32 L 8,64" fill="none" stroke="black"/>
<path d="M 8,496 L 8,528" fill="none" stroke="black"/>
<path d="M 32,64 L 32,488" fill="none" stroke="black"/>
<path d="M 56,32 L 56,64" fill="none" stroke="black"/>
<path d="M 56,112 L 56,144" fill="none" stroke="black"/>
<path d="M 56,416 L 56,448" fill="none" stroke="black"/>
<path d="M 56,496 L 56,528" fill="none" stroke="black"/>
<path d="M 80,144 L 80,408" fill="none" stroke="black"/>
<path d="M 120,448 L 120,488" fill="none" stroke="black"/>
<path d="M 152,32 L 152,64" fill="none" stroke="black"/>
<path d="M 160,192 L 160,224" fill="none" stroke="black"/>
<path d="M 160,288 L 160,320" fill="none" stroke="black"/>
<path d="M 200,64 L 200,144" fill="none" stroke="black"/>
<path d="M 200,416 L 200,448" fill="none" stroke="black"/>
<path d="M 264,240 L 264,272" fill="none" stroke="black"/>
<path d="M 264,336 L 264,368" fill="none" stroke="black"/>
<path d="M 272,448 L 272,488" fill="none" stroke="black"/>
<path d="M 320,144 L 320,408" fill="none" stroke="black"/>
<path d="M 344,32 L 344,64" fill="none" stroke="black"/>
<path d="M 344,112 L 344,144" fill="none" stroke="black"/>
<path d="M 344,416 L 344,448" fill="none" stroke="black"/>
<path d="M 344,496 L 344,528" fill="none" stroke="black"/>
<path d="M 8,32 L 344,32" fill="none" stroke="black"/>
<path d="M 8,64 L 344,64" fill="none" stroke="black"/>
<path d="M 56,112 L 344,112" fill="none" stroke="black"/>
<path d="M 56,144 L 344,144" fill="none" stroke="black"/>
<path d="M 160,192 L 224,192" fill="none" stroke="black"/>
<path d="M 80,208 L 152,208" fill="none" stroke="black"/>
<path d="M 240,208 L 312,208" fill="none" stroke="black"/>
<path d="M 160,224 L 224,224" fill="none" stroke="black"/>
<path d="M 200,240 L 264,240" fill="none" stroke="black"/>
<path d="M 88,256 L 184,256" fill="none" stroke="black"/>
<path d="M 272,256 L 320,256" fill="none" stroke="black"/>
<path d="M 200,272 L 264,272" fill="none" stroke="black"/>
<path d="M 160,288 L 224,288" fill="none" stroke="black"/>
<path d="M 80,304 L 152,304" fill="none" stroke="black"/>
<path d="M 240,304 L 312,304" fill="none" stroke="black"/>
<path d="M 160,320 L 224,320" fill="none" stroke="black"/>
<path d="M 200,336 L 264,336" fill="none" stroke="black"/>
<path d="M 88,352 L 184,352" fill="none" stroke="black"/>
<path d="M 272,352 L 320,352" fill="none" stroke="black"/>
<path d="M 200,368 L 264,368" fill="none" stroke="black"/>
<path d="M 56,416 L 344,416" fill="none" stroke="black"/>
<path d="M 56,448 L 344,448" fill="none" stroke="black"/>
<path d="M 8,496 L 344,496" fill="none" stroke="black"/>
<path d="M 8,528 L 344,528" fill="none" stroke="black"/>
<path d="M 224,192 C 232.83064,192 240,199.16936 240,208" fill="none" stroke="black"/>
<path d="M 224,224 C 232.83064,224 240,216.83064 240,208" fill="none" stroke="black"/>
<path d="M 200,240 C 191.16936,240 184,247.16936 184,256" fill="none" stroke="black"/>
<path d="M 200,272 C 191.16936,272 184,264.83064 184,256" fill="none" stroke="black"/>
<path d="M 224,288 C 232.83064,288 240,295.16936 240,304" fill="none" stroke="black"/>
<path d="M 224,320 C 232.83064,320 240,312.83064 240,304" fill="none" stroke="black"/>
<path d="M 200,336 C 191.16936,336 184,343.16936 184,352" fill="none" stroke="black"/>
<path d="M 200,368 C 191.16936,368 184,360.83064 184,352" fill="none" stroke="black"/>
<polygon class="arrowhead" points="328,408 316,402.4 316,413.6" fill="black" transform="rotate(90,320,408)"/>
<polygon class="arrowhead" points="328,292 316,286.4 316,297.6" fill="black" transform="rotate(90,320,292)"/>
<polygon class="arrowhead" points="328,196 316,190.4 316,201.6" fill="black" transform="rotate(90,320,196)"/>
<polygon class="arrowhead" points="316,304 304,298.4 304,309.6" fill="black" transform="rotate(0,308,304)"/>
<polygon class="arrowhead" points="316,208 304,202.4 304,213.6" fill="black" transform="rotate(0,308,208)"/>
<polygon class="arrowhead" points="280,488 268,482.4 268,493.6" fill="black" transform="rotate(90,272,488)"/>
<polygon class="arrowhead" points="280,352 268,346.4 268,357.6" fill="black" transform="rotate(180,272,352)"/>
<polygon class="arrowhead" points="280,256 268,250.4 268,261.6" fill="black" transform="rotate(180,272,256)"/>
<polygon class="arrowhead" points="208,104 196,98.4 196,109.6" fill="black" transform="rotate(90,200,104)"/>
<polygon class="arrowhead" points="160,304 148,298.4 148,309.6" fill="black" transform="rotate(0,152,304)"/>
<polygon class="arrowhead" points="160,208 148,202.4 148,213.6" fill="black" transform="rotate(0,152,208)"/>
<polygon class="arrowhead" points="128,488 116,482.4 116,493.6" fill="black" transform="rotate(90,120,488)"/>
<polygon class="arrowhead" points="100,352 88,346.4 88,357.6" fill="black" transform="rotate(180,92,352)"/>
<polygon class="arrowhead" points="100,256 88,250.4 88,261.6" fill="black" transform="rotate(180,92,256)"/>
<polygon class="arrowhead" points="88,408 76,402.4 76,413.6" fill="black" transform="rotate(90,80,408)"/>
<polygon class="arrowhead" points="88,340 76,334.4 76,345.6" fill="black" transform="rotate(90,80,340)"/>
<polygon class="arrowhead" points="88,244 76,238.4 76,249.6" fill="black" transform="rotate(90,80,244)"/>
<polygon class="arrowhead" points="40,488 28,482.4 28,493.6" fill="black" transform="rotate(90,32,488)"/>
<circle cx="80" cy="256" r="6" class="xordot" fill="white" stroke="black"/>
<line x1="74" y1="256" x2="86" y2="256" stroke="black"/><line x1="80" y1="250" x2="80" y2="262" stroke="black"/><circle cx="80" cy="352" r="6" class="xordot" fill="white" stroke="black"/>
<line x1="74" y1="352" x2="86" y2="352" stroke="black"/><line x1="80" y1="346" x2="80" y2="358" stroke="black"/><circle cx="320" cy="208" r="6" class="xordot" fill="white" stroke="black"/>
<line x1="314" y1="208" x2="326" y2="208" stroke="black"/><line x1="320" y1="202" x2="320" y2="214" stroke="black"/><circle cx="320" cy="304" r="6" class="xordot" fill="white" stroke="black"/>
<line x1="314" y1="304" x2="326" y2="304" stroke="black"/><line x1="320" y1="298" x2="320" y2="310" stroke="black"/><g class="text">
<text x="28" y="52">FO</text>
<text x="92" y="52">Server</text>
<text x="132" y="52">ID</text>
<text x="248" y="52">Nonce</text>
<text x="132" y="132">left_0</text>
<text x="280" y="132">right_0</text>
<text x="200" y="212">AES-ECB</text>
<text x="360" y="244">right_1</text>
<text x="224" y="260">AES-ECB</text>
<text x="116" y="292">left_1</text>
<text x="200" y="308">AES-ECB</text>
<text x="224" y="356">AES-ECB</text>
<text x="132" y="436">left_2</text>
<text x="280" y="436">right_2</text>
<text x="28" y="516">FO</text>
<text x="196" y="516">Ciphertext</text>
</g>
</svg>
</artwork><artwork  type="ascii-art"><![CDATA[
   +-----+-----------+-----------------------+
   | FO  | Server ID |         Nonce         |
   +--+--+-----------+-----+-----------------+
      |                    |
      |                    V
      |  +-----------------+-----------------+
      |  |      left_0     |      right_0    |
      |  +--+--------------+--------------+--+
      |     |                             |
      |     |                             |
      |     |         .--------.          V
      |     +-------->| AES-ECB +-------->⊕
      |     |         '--------'          |
      |     V             .--------.      | right_1
      |     ⊕<-----------+ AES-ECB |<-----+
      |     |             '--------'      |
      |     | left_1  .--------.          V
      |     +-------->| AES-ECB +-------->⊕
      |     |         '--------'          |
      |     V             .--------.      |
      |     ⊕<-----------+ AES-ECB |<-----+
      |     |             '--------'      |
      |     |                             |
      |     V                             V
      |  +-----------------+-----------------+
      |  |      left_2     |      right_2    |
      |  +-------+---------+--------+--------+
      |          |                  |
      V          V                  V
   +-----+-----------------------------------+
   | FO  |            Ciphertext             |
   +-----+-----------------------------------+
]]></artwork></artset></figure>

</section>
<section anchor="useful-functions"><name>Useful functions</name>

<t>Two functions are useful to define:</t>

<t>The expand(length, pass, input_bytes) function concatenates three arguments and
outputs 16 zero-padded octets.</t>

<t>The output of expand is as follows:</t>

<figure><sourcecode type="pseudocode"><![CDATA[
ExpandResult {
     input_bytes(...),
     ZeroPad(...),
     length(8),
     pass(8)
}
]]></sourcecode></figure>

<t>in which:</t>

<t><list style="symbols">
  <t>'input_bytes' is drawn from one half of the plaintext. It forms the N most
significant octets of the output, where N is half the 'length' argument, rounded
up, and thus a number between 3 and 10, inclusive.</t>
  <t>'Zeropad' is a set of 14-N octets set to zero.</t>
  <t>'length' is an 8-bit integer that reports the sum of the configured nonce
length and server id length in octets, and forms the fifteenth octet of the
output. The 'length' argument MUST NOT exceed 19 and MUST NOT be less than 5.</t>
  <t>'pass' is an 8-bit integer that reports the 'pass' argument of the algorithm,
and forms the sixteenth (least significant) octet of the output. It guarantees
that the cryptographic input of every pass of the algorithm is unique.</t>
</list></t>

<t>For example,</t>

<figure><sourcecode type="pseudocode"><![CDATA[
expand(0x06, 0x02, 0xaaba3c) = 0xaaba3c00000000000000000000000602
]]></sourcecode></figure>

<t>Similarly, truncate(input, n) returns the first n octets of 'input'.</t>

<figure><sourcecode type="pseudocode"><![CDATA[
truncate(0x2094842ca49256198c2deaa0ba53caa0, 4) = 0x2094842c
]]></sourcecode></figure>

<t>Let 'half_len' be equal to 'plaintext_len' / 2, rounded up.</t>

</section>
<section anchor="algorithm-description"><name>Algorithm Description</name>

<t>The example at the end of this section helps to clarify the steps described
below.</t>

<t><list style="numbers" type="1">
  <t>The server concatenates the server ID and nonce to create plaintext_CID. The
length of the result in octets is plaintext_len.</t>
  <t>The server splits plaintext_CID into components left_0 and right_0 of equal
length half_len. If plaintext_len is odd, right_0 clears its first four bits,
and left_0 clears its last four bits. For example, 0x7040b81b55ccf3 would split
into a left_0 of 0x7040b810 and right_0 of 0x0b55ccf3.</t>
  <t>Encrypt the result of expand(plaintext_len, 1, left_0) using an AES-ECB-128
cipher to obtain a ciphertext.</t>
  <t>XOR the first half_len octets of the ciphertext with right_0 to form right_1.
Steps 3 and 4 can be summarized as</t>
</list></t>

<figure><sourcecode type="psuedocode"><![CDATA[
    result = AES_ECB(key, expand(plaintext_len, 1, left_0))
    right_1 = XOR(right_0, truncate(result, half_len))
]]></sourcecode></figure>

<t><list style="numbers" start="5" type="1">
  <t>If the plaintext_len is odd, clear the first four bits of right_1.</t>
  <t>Repeat steps 3 and 4, but use them to compute left_1 by expanding and
encrypting right_1 with pass = 2, and XOR the results with left_0.</t>
</list></t>

<figure><sourcecode type="psuedocode"><![CDATA[
    result = AES_ECB(key, expand(plaintext_len, 2, right_1))
    left_1 = XOR(left_0, truncate(result, half_len))
]]></sourcecode></figure>

<t><list style="numbers" start="7" type="1">
  <t>If the plaintext_len is odd, clear the last four bits of left_1.</t>
  <t>Repeat steps 3 and 4, but use them to compute right_2 by expanding and
encrypting left_1 with pass = 3, and XOR the results with right_1.</t>
</list></t>

<figure><sourcecode type="pseudocode"><![CDATA[
    result = AES_ECB(key, expand(plaintext_len, 3, left_1))
    right_2 = XOR(right_1, truncate(result, half_len))
]]></sourcecode></figure>

<t><list style="numbers" start="9" type="1">
  <t>If the plaintext_len is odd, clear the first four bits of right_2.</t>
  <t>Repeat steps 3 and 4, but use them to compute left_2 by expanding and
encrypting right_2 with pass = 4, and XOR the results with left_1.</t>
</list></t>

<figure><sourcecode type="psuedocode"><![CDATA[
    result = AES_ECB(key, expand(plaintext_len, 4, right_2))
    left_2 = XOR(left_1, truncate(result, half_len))
]]></sourcecode></figure>

<t><list style="numbers" start="11" type="1">
  <t>If the plaintext_len is odd, clear the last four bits of left_2.</t>
  <t>The server concatenates left_2 with right_2 to form the ciphertext CID,
which it appends to the first octet. If plaintext_len is odd, the four
least significant bits of left_2 and four most significant bits of right_2,
which are all zero, are stripped off before concatenation to make the
resulting ciphertext the same length as the original plaintext.</t>
</list></t>

</section>
<section anchor="encryption-example"><name>Encryption Example</name>

<t>The following example executes the steps for the provided inputs. Note that the
plaintext is of odd octet length, so the middle octet will be split evenly
left_0 and right_0.</t>

<figure><sourcecode type="pseudocode"><![CDATA[
server_id = 0x31441a
nonce = 0x9c69c275
key = 0xfdf726a9893ec05c0632d3956680baf0

// step 1
plaintext_CID = 0x31441a9c69c275
plaintext_len = 7

// step 2
hash_len = 4
left_0 = 0x31441a90
right_0 = 0x0c69c275

// step 3
aes_input = 0x31441a90000000000000000000000701
aes_output = 0xa255dd8cdacf01948d3a848c3c7fee23

// step 4
right_1 = 0x0c69c275 ^ 0xa255dd8c = 0xae3c1ff9

// step 5 (clear bits)
right_1 = 0x0e3c1ff9

// step 6
aes_input = 0x0e3c1ff9000000000000000000000702
aes_output = 0xe5e452cb9e1bedb0b2bf830506bf4c4e
left_1 = 0x31441a90 ^ 0xe5e452cb = 0xd4a0485b

// step 7 (clear bits)
left_1 = 0xd4a04850

// step 8
aes_input = 0xd4a04850000000000000000000000703
aes_output = 0xb7821ab3024fed0913b6a04d18e3216f
right_2 = 0x0e3c1ff9 ^ 0xb7821ab3 = 0xb9be054a

// step 9 (clear bits)
right_2 = 0x09be054a

// step 10
aes_input = 0x09be054a000000000000000000000704
aes_output = 0xb334357cfdf81e3fafe180154eaf7378
left_2 = 0xd4a04850 ^ 0xb3e4357c = 0x67947d2c

// step 11 (clear bits)
left_2 = 0x67947d20

// step 12
cid = first_octet || left_2 || right_2 = 0x0767947d29be054a
]]></sourcecode></figure>

</section>
</section>
</section>
<section anchor="load-balancer-actions"><name>Load Balancer Actions</name>

<t>On each incoming packet, the load balancer extracts consecutive octets,
beginning with the second octet. If there is no key, the first octets
correspond to the server ID.</t>

<t>If there is a key, the load balancer takes one of two actions:</t>

<section anchor="special-case-single-pass-encryption-1"><name>Special Case: Single Pass Encryption</name>

<t>If server ID length and nonce length sum to exactly 16 octets, they form a
ciphertext block. The load balancer decrypts the block using the AES-ECB key
and extracts the server ID from the most significant bytes of the resulting
plaintext.</t>

</section>
<section anchor="general-case-four-pass-encryption-1"><name>General Case: Four-Pass Encryption</name>

<t>First, split the ciphertext CID (excluding the first octet) into its equal-
length components left_2 and right_2. Then follow the process below:</t>

<figure><sourcecode type="pseudocode"><![CDATA[
    result = AES_ECB(key, expand(plaintext_len, 4, right_2))
    left_1 = XOR(left_2, truncate(result, half_len))
    if (plaintext_len_is_odd()) clear_last_bits(left_1, 4)

    result = AES_ECB(key, expand(plaintext_len, 3, left_1))
    right_1 = XOR(right_2, truncate(result, half_len))
    if (plaintext_len_is_odd()) clear_first_bits(left_1, 4)

    result = AES_ECB(key, expand(plaintext_len, 2, right_1))
    left_0 = XOR(left_1, truncate(result, half_len))
    if (plaintext_len_is_odd()) clear_last_bits(left_0, 4)
]]></sourcecode></figure>

<t>As the load balancer has no need for the nonce, it can conclude after 3 passes
as long as the server ID is entirely contained in left_0 (i.e., the nonce is at
least as large as the server ID). If the server ID is longer, a fourth pass
is necessary:</t>

<figure><sourcecode type="pseudocode"><![CDATA[
    result = AES_ECB(key, expand(plaintext_len, 1, left_0))
    right_0 = XOR(right_1, truncate(result, half_len))
    if (plaintext_len_is_odd()) clear_first_bits(right_0, 4)
]]></sourcecode></figure>

<t>and the load balancer has to concatenate left_0 and right_0 to obtain the
complete server ID.</t>

</section>
</section>
</section>
<section anchor="per-connection-state"><name>Per-connection state</name>

<t>The CID allocation methods QUIC-LB defines no per-connection state at
the load balancer, with a few conditional exceptions described in
<xref target="unroutable"/>. Otherwise, the load balancer can extract the server ID from
the connection ID of each incoming packet and route that packet accordingly.</t>

<t>However, once a routing decision has been made, the load balancer MAY
associate the 4-tuple or connection ID with the decision. This has two
advantages:</t>

<t><list style="symbols">
  <t>The load balancer only extracts the server ID once until the 4-tuple or
connection ID changes. When the CID is encrypted, this might reduce
computational load.</t>
  <t>Incoming Stateless Reset packets and ICMP messages are easily routed to the
correct origin server.</t>
</list></t>

<t>In addition to the increased state requirements, however, load balancers cannot
detect the packets that indicate the end of the connection, so they rely on a
timeout to delete connection state. There are numerous considerations around
setting such a timeout.</t>

<t>In the event a connection ends, freeing an IP and port, and a different
connection migrates to that IP and port before the timeout, the load balancer
will misroute the different connection's packets to the original server. A short
timeout limits the likelihood of such a misrouting.</t>

<t>Furthermore, if a short timeout causes premature deletion of state, the routing
is easily recoverable by decoding an incoming Connection ID. However, a short
timeout also reduces the chance that an incoming Stateless Reset is correctly
routed.</t>

<t>Note that some heuristics to purge state early can introduce Denial of Service
vulnerabilities. For example, one heuristic might delete flow state once the
load balancer observes a routable CID on that flow. An attacker that can observe
a target flow can store a routable CID from a previous connection and spoof the
target flow's 4-tuple with the routable CID, causing premature deletion of that
state.</t>

<t>Servers MAY implement the technique described in <xref section="14.4.1" sectionFormat="of" target="RFC9000"/>
in case the load balancer is stateless, to increase the likelihood a Source
Connection ID is included in ICMP responses to Path Maximum Transmission Unit
(PMTU) probes.  Load balancers MAY parse the echoed packet to extract the Source
Connection ID, if it contains a QUIC long header, and extract the Server ID as
if it were in a Destination CID.</t>

</section>
<section anchor="additional-use-cases"><name>Additional Use Cases</name>

<t>This section discusses considerations for some deployment scenarios not implied
by the specification above.</t>

<section anchor="lb-chains"><name>Load balancer chains</name>

<t>Some network architectures may have multiple tiers of low-state load balancers,
where a first tier of devices makes a routing decision to the next tier, and so
on, until packets reach the server. Although QUIC-LB is not explicitly designed
for this use case, it is possible to support it.</t>

<t>If each load balancer is assigned a range of server IDs that is a subset of the
range of IDs assigned to devices that are closer to the client, then the first
devices to process an incoming packet can extract the server ID and then map it
to the correct forwarding address. Note that this solution is extensible to
arbitrarily large numbers of load-balancing tiers, as the maximum server ID
space is quite large.</t>

<t>If the number of necessary server IDs per next hop is uniform, a simple
implementation would use successively longer server IDs at each tier of load
balancing, and the server configuration would match the last tier. Load
balancers closer to the client can then treat any parts of the server ID they
did not use as part of the nonce.</t>

</section>
<section anchor="server-process-demultiplexing"><name>Server Process Demultiplexing</name>

<t>QUIC servers might have QUIC running on multiple processes or threads listening
on the same address, and have a need to demultiplex between them. In principle,
this demultiplexer is a Layer 4 load balancer, and the guidance in <xref target="lb-chains"/>
applies. However, in many deployments the demultiplexer lacks the capability to
perform decryption operations. Internal server coordination is out of scope of
this specification, but this non-normative section proposes some approaches
that could work given certain server capabilities:</t>

<t><list style="symbols">
  <t>Some bytes of the server ID are reserved to encode the process ID. The
demultiplexer might operate based on the 4-tuple or other legacy indicator, but
the receiving server process extracts the server ID, and if it does not match
the one for that process, the process could "toss" the packet to the correct
destination process.</t>
  <t>Each process could register the connection IDs it generates with the
demultiplexer, which routes those connection IDs accordingly.</t>
  <t>In a combination of the two approaches above, the demultiplexer generally
routes by 4-tuple. After a migration, the process tosses the first flight of
packets and registers the new connection ID with the demultiplexer. This
alternative limits the bandwidth consumption of tossing and the memory footprint
of a full connection ID table.</t>
  <t>When generating a connection ID, the server writes the process ID to the
random field of the first octet, or if this is being used for length encoding,
in an octet it appends after the ciphertext. It then applies a keyed hash (with
a key locally generated for the sole use of that server). The hash result is
used as a bitmask to XOR with the bits encoding the process ID. On packet
receipt, the demultiplexer applies the same keyed hash to generate the same
mask and recoversthe process ID. (Note that this approach is conceptually
similar to QUIC header protection). It is important that the server also appends
the process ID to the server ID in the plaintext, so that different processes do
not generate the same ciphertext. The load balancer will consider this data to
be part of the nonce.</t>
</list></t>

</section>
<section anchor="moving-connections-between-servers"><name>Moving connections between servers</name>

<t>Some deployments may transparently move a connection from one server to another.
The means of transferring connection state between servers is out of scope of
this document.</t>

<t>To support a handover, a server involved in the transition could issue CIDs that
map to the new server via a NEW_CONNECTION_ID frame, and retire CIDs associated
with the old server using the "Retire Prior To" field in that frame.</t>

</section>
</section>
<section anchor="version-invariance"><name>Version Invariance of QUIC-LB</name>

<t>The server ID encodings, and requirements for their handling, are designed to be
QUIC version independent (see <xref target="RFC8999"/>). A QUIC-LB load balancer will
generally not require changes as servers deploy new versions of QUIC. However,
there are several unlikely future design decisions that could impact the
operation of QUIC-LB.</t>

<t>A QUIC version might define limits on connection ID length that make some or all
of the mechanisms in this document unusable.  For example, a maximum connection
ID length could be below the minimum necessary to use all or part of this
specification; or, the minimum connection ID length could be larger than the
largest value in this specification. Similarly, the length self-encoding
specification cannot accommodate connection IDs longer than 32 bytes.</t>

<t>The advanced fallback implementation supports a requirement to inspect version-
specific elements of packets to make a routing decision, such as the Server Name
Indication (SNI) extension in the TLS Client Hello.  The format and
cryptographic protection of this information may change in future versions or
extensions of TLS or QUIC, and therefore this functionality is inherently
version-dependent. Such a load balancer, when it receives packets from an
unknown QUIC version, might misdirect initial packets to the wrong tenant. While
this can be inefficient, the design in this document preserves the ability for
tenants to deploy new versions provided they have an out-of-band means of
providing a connection ID for the client to use.</t>

<t><xref target="load-balancer-forwarding"/> provides guidance about how load balancers should
handle unroutable DCIDs. This guidance, and the implementation of an algorithm
to handle these DCIDs, rests on some assumptions about packets that contain
client-generated DCIDs that are not specified in RFC 8999:</t>

<t><list style="numbers" type="1">
  <t>they do not have short headers;</t>
  <t>the 4-tuple remains constant;</t>
  <t>if the load-balancer uses the Advanced Fallback Algorithm, the packets have
a constant Source Connection ID.</t>
</list></t>

<t>While this document does not update the commitments in <xref target="RFC8999"/>, the
additional assumptions are minimal and narrowly scoped, and provide a likely
set of constants that load balancers can use with minimal risk of version-
dependence.</t>

<t>If these assumptions are not valid, this specification is likely to lead to loss
of packets that contain unroutable DCIDs, and in extreme cases connection
failure.  A QUIC version that violates the assumptions in this section therefore
cannot be safely deployed with a load balancer that follows this specification.
An updated or alternative version of this specification might address these
shortcomings for such a QUIC version.</t>

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

<t>QUIC-LB is intended to prevent linkability.  Attacks would therefore attempt to
subvert this purpose.</t>

<t>Note that without a key for the encoding, QUIC-LB makes no attempt to obscure
the server mapping, and therefore does not address these concerns. Without a
key, QUIC-LB merely allows consistent CID encoding for compatibility across a
network infrastructure, which makes QUIC robust to NAT rebinding. Servers that
are encoding their server ID without a key algorithm SHOULD only use it to
generate new CIDs for the Server Initial Packet and SHOULD NOT send CIDs in QUIC
NEW_CONNECTION_ID frames, except that it sends one new Connection ID in the
event of config rotation <xref target="config-rotation"/>. Doing so might falsely suggest to
the client that said CIDs were generated in a secure fashion.</t>

<t>A linkability attack would find some means of determining that two connection
IDs route to the same server. Due to the limitations of measures at QUIC layer,
there is no scheme that strictly prevents linkability for all traffic patterns.</t>

<t>To see why, consider two limits. At one extreme, one client is connected to the
server pool and migrates its address. An observer can easily link the two
addresses, and there is no remedy at the QUIC layer.</t>

<t>At the other extreme, a very large number of clients are connected to each
server, and they all migrate address constantly. At this limit, even an
unencrypted server ID encoding is unlikely to definitively link two addresses.</t>

<t>Therefore, efforts to frustrate any analysis of server ID encoding have
diminishing returns. Nevertheless, this specification seeks to minimize the
probability two addresses can be linked.</t>

<section anchor="attackers-not-between-the-load-balancer-and-server"><name>Attackers not between the load balancer and server</name>

<t>Any attacker might open a connection to the server infrastructure and
aggressively simulate migration to obtain a large sample of IDs that map to the
same server. It could then apply analytical techniques to try to obtain the
server encoding.</t>

<t>An encrypted encoding provides robust protection against this. An unencrypted
one provides none.</t>

<t>Were this analysis to obtain the server encoding, then on-path observers might
apply this analysis to correlating different client IP addresses.</t>

</section>
<section anchor="attackers-between-the-load-balancer-and-server"><name>Attackers between the load balancer and server</name>

<t>Attackers in this privileged position are intrinsically able to map two
connection IDs to the same server. These algorithms ensure that two connection
IDs for the same connection cannot be identified as such as long as the server
chooses the first octet and any plaintext nonce correctly.</t>

</section>
<section anchor="multiple-configs"><name>Multiple Configuration IDs</name>

<t>During the period in which there are multiple deployed configuration IDs (see
<xref target="config-rotation"/>), there is a slight increase in linkability. The server
space is effectively divided into segments with CIDs that have different config
rotation bits. Entities that manage servers SHOULD strive to minimize these
periods by quickly deploying new configurations across the server pool.</t>

</section>
<section anchor="limited-configuration-scope"><name>Limited configuration scope</name>

<t>A simple deployment of QUIC-LB in a cloud provider might use the same global
QUIC-LB configuration across all its load balancers that route to customer
servers. An attacker could then simply become a customer, obtain the
configuration, and then extract server IDs of other customers' connections at
will.</t>

<t>To avoid this, the configuration agent SHOULD issue QUIC-LB configurations to
mutually distrustful servers that have different keys for encryption
algorithms. In many cases, the load balancers can distinguish these
configurations by external IP address.</t>

<t>However, assigning multiple entities to an IP address is complimentary with
concealing DNS requests (e.g., DoH <xref target="RFC8484"/>) and the TLS Server Name
Indicator (SNI) (<xref target="I-D.ietf-tls-esni"/>) to obscure the ultimate destination
of traffic. While the load balancer's fallback algorithm
(<xref target="fallback-algorithm"/>) can use the SNI to make a routing decision on the
first packet, there are three ways to route subsequent packets:</t>

<t><list style="symbols">
  <t>all co-tenants can use the same QUIC-LB configuration, leaking the server
mapping to each other as described above;</t>
  <t>co-tenants can be issued one of up to seven configurations distinguished by
the config rotation bits (<xref target="config-rotation"/>), exposing information about the
target domain to the entire network; or</t>
  <t>tenants can use the 0b111 codepoint in their CIDs (in which case they SHOULD
disable migration in their connections), which neutralizes the value of
QUIC-LB but preserves privacy.</t>
</list></t>

<t>When configuring QUIC-LB, administrators evaluate the privacy tradeoff by
considering the relative value of each of these properties, given the trust
model between tenants, the presence of methods to obscure the domain name, and
value of address migration in the tenant use cases.</t>

<t>In the case that the administrating entity also controls a reverse proxy between
the load balancer and the tenants, this entity generates the external CIDs, and
there is no tradeoff.</t>

<t>As the plaintext algorithm makes no attempt to conceal the server mapping,
these deployments MAY simply use a common configuration.</t>

</section>
<section anchor="stateless-reset-oracle"><name>Stateless Reset Oracle</name>

<t>Section 21.9 of <xref target="RFC9000"/> discusses the Stateless Reset Oracle attack.  For a
server deployment to be vulnerable, an attacking client must be able to cause
two packets with the same Destination CID to arrive at two different servers
that share the same cryptographic context for Stateless Reset tokens. As QUIC-LB
requires deterministic routing of DCIDs over the life of a connection, it is a
sufficient means of avoiding an Oracle without additional measures.</t>

<t>Note also that when a server starts using a new QUIC-LB config rotation
codepoint, new CIDs might not be unique with respect to previous configurations
that occupied that codepoint, and therefore different clients may have observed
the same CID and stateless reset token. A straightforward method of managing
stateless reset keys is to maintain a separate key for each config rotation
codepoint, and replace each key when the configuration for that codepoint
changes. Thus, a server transitions from one config to another, it will be able
to generate correct tokens for connections using either type of CID.</t>

</section>
<section anchor="cid-entropy"><name>Connection ID Entropy</name>

<t>If a server ever reuses a nonce in generating a CID for a given configuration,
it risks exposing sensitive information. Given the same server ID, the CID will
be identical (aside from a possible difference in the first octet).  This can
risk exposure of the QUIC-LB key. If two clients receive the same connection ID,
they also have each other's stateless reset token unless that key has changed in
the interim.</t>

<t>The encrypted mode needs to generate different cipher text for each generated
Connection ID instance to protect the Server ID. To do so, at least four octets
of the CID are reserved for a nonce that, if used only once, will result in
unique cipher text for each Connection ID.</t>

<t>If servers simply increment the nonce by one with each generated connection ID,
then it is safe to use the existing keys until any server's nonce counter
exhausts the allocated space and rolls over. To maximize entropy, servers SHOULD
start with a random nonce value, in which case the configuration is usable until
the nonce value wraps around to zero and then reaches the initial value again.</t>

<t>Whether or not it implements the counter method, the server MUST NOT reuse a
nonce until it switches to a configuration with new keys.</t>

<t>Servers are forbidden from generating linkable plaintext nonces, because
observable correlations between plaintext nonces would provide trivial
linkability between individual connections, rather than just to a common server.</t>

<t>For any algorithm, configuration agents SHOULD implement an out-of-band method
to discover when servers are in danger of exhausting their nonce space, and
SHOULD respond by issuing a new configuration. A server that has exhausted its
nonces MUST either switch to a different configuration, or if none exists, use
the 4-tuple routing config rotation codepoint.</t>

<t>When sizing a nonce that is to be randomly generated, the configuration agent
SHOULD consider that a server generating a N-bit nonce will create a duplicate
about every 2^(N/2) attempts, and therefore compare the expected rate at which
servers will generate CIDs with the lifetime of a configuration.</t>

</section>
<section anchor="distinguishing-attacks"><name>Distinguishing Attacks</name>

<t>The Four Pass Encryption algorithm is structured as a 4-round Feistel network
with non-bijective round function. As such, it does not offer a very high
security level against distinguishing attacks, as explained in <xref target="Patarin2008"></xref>.
Attackers can mount these attacks if they are in possession of O(SQRT(len/2))
pairs of ciphertext and known corresponding plain text, where "len" is the
sum of the lengths of the Server ID and the Nonce.</t>

<t>The authors considered increasing the number of passes from 4 to 12,
which would definitely block these attacks. However, this would require
12 round of AES decryption by load balancers accessing the CID, a cost deemed
prohibitive in the planned deployments.</t>

<t>The attacks described in <xref target="Patarin2008"></xref> rely on known plain text. In a normal
deployment, the plain text is only known by the server that generates the ID
and by the load balancer that decrypts the content of the CID. Attackers
would have to compensate by guesses about the allocation of server identifiers
or the generation of nonces. These attacks are thus mitigated by making nonces
hard to guess, as specified in <xref target="cid-entropy"/>, and by rules related to mixed
deployments that use both clear text CID and encrypted CID, for example when
transitioning from clear text to encryption. Such deployments MUST use different
server ID allocations for the clear text and the encrypted versions.</t>

<t>These attacks cannot be mounted against the Single Pass Encryption algorithm.</t>

</section>
<section anchor="early-deletion-of-load-balancer-connection-state"><name>Early deletion of load balancer connection state</name>

<t>Potential vulnerabilities related to heuristics that delete per-connection state
are described in <xref target="per-connection-state"/>. Under certain assumptions about
server configuration and fallback algorithm, this state might be critical to
maintaining connectivity. Under other assumptions, the state provides robustness
to improbable network events.</t>

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

<t>There are no IANA requirements.</t>

</section>


  </middle>

  <back>


    <references title='Normative References' anchor="sec-normative-references">

<reference anchor="NIST-AES-ECB" target="https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf">
  <front>
    <title>Recommendation for Block Cipher Modes of Operation: Methods and Techniques</title>
    <author initials="M." surname="Dworkin">
      <organization></organization>
    </author>
    <date year="2021"/>
  </front>
<refcontent>NIST Special Publication 800-38A</refcontent></reference>


<reference anchor="RFC9000">
  <front>
    <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
    <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
    <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
    <date month="May" year="2021"/>
    <abstract>
      <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9000"/>
  <seriesInfo name="DOI" value="10.17487/RFC9000"/>
</reference>

<reference anchor="RFC8999">
  <front>
    <title>Version-Independent Properties of QUIC</title>
    <author fullname="M. Thomson" initials="M." surname="Thomson"/>
    <date month="May" year="2021"/>
    <abstract>
      <t>This document defines the properties of the QUIC transport protocol that are common to all versions of the protocol.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8999"/>
  <seriesInfo name="DOI" value="10.17487/RFC8999"/>
</reference>




    </references>

    <references title='Informative References' anchor="sec-informative-references">

<reference anchor="Patarin2008" target="https://eprint.iacr.org/2008/036.pdf">
  <front>
    <title>Generic Attacks on Feistel Schemes - Extended Version</title>
    <author initials="J." surname="Patarin" fullname="Jacques Patarin">
      <organization>PRiSM, University of Versailles</organization>
    </author>
    <date year="2008"/>
  </front>
</reference>


<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>

<reference anchor="RFC6066">
  <front>
    <title>Transport Layer Security (TLS) Extensions: Extension Definitions</title>
    <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
    <date month="January" year="2011"/>
    <abstract>
      <t>This document provides specifications for existing TLS extensions. It is a companion document for RFC 5246, "The Transport Layer Security (TLS) Protocol Version 1.2". The extensions specified are server_name, max_fragment_length, client_certificate_url, trusted_ca_keys, truncated_hmac, and status_request. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6066"/>
  <seriesInfo name="DOI" value="10.17487/RFC6066"/>
</reference>

<reference anchor="RFC7696">
  <front>
    <title>Guidelines for Cryptographic Algorithm Agility and Selecting Mandatory-to-Implement Algorithms</title>
    <author fullname="R. Housley" initials="R." surname="Housley"/>
    <date month="November" year="2015"/>
    <abstract>
      <t>Many IETF protocols use cryptographic algorithms to provide confidentiality, integrity, authentication, or digital signature. Communicating peers must support a common set of cryptographic algorithms for these mechanisms to work properly. This memo provides guidelines to ensure that protocols have the ability to migrate from one mandatory-to-implement algorithm suite to another over time.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="201"/>
  <seriesInfo name="RFC" value="7696"/>
  <seriesInfo name="DOI" value="10.17487/RFC7696"/>
</reference>

<reference anchor="RFC8484">
  <front>
    <title>DNS Queries over HTTPS (DoH)</title>
    <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
    <author fullname="P. McManus" initials="P." surname="McManus"/>
    <date month="October" year="2018"/>
    <abstract>
      <t>This document defines a protocol for sending DNS queries and getting DNS responses over HTTPS. Each DNS query-response pair is mapped into an HTTP exchange.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8484"/>
  <seriesInfo name="DOI" value="10.17487/RFC8484"/>
</reference>


<reference anchor="I-D.ietf-tls-esni">
   <front>
      <title>TLS Encrypted Client Hello</title>
      <author fullname="Eric Rescorla" initials="E." surname="Rescorla">
         <organization>Independent</organization>
      </author>
      <author fullname="Kazuho Oku" initials="K." surname="Oku">
         <organization>Fastly</organization>
      </author>
      <author fullname="Nick Sullivan" initials="N." surname="Sullivan">
         <organization>Cryptography Consulting LLC</organization>
      </author>
      <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
         <organization>Cloudflare</organization>
      </author>
      <date day="14" month="June" year="2025"/>
      <abstract>
	 <t>   This document describes a mechanism in Transport Layer Security (TLS)
   for encrypting a ClientHello message under a server public key.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Source for this draft and an issue tracker can be found at
   https://github.com/tlswg/draft-ietf-tls-esni
   (https://github.com/tlswg/draft-ietf-tls-esni).

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-tls-esni-25"/>
   
</reference>

<reference anchor="RFC6020">
  <front>
    <title>YANG - A Data Modeling Language for the Network Configuration Protocol (NETCONF)</title>
    <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
    <date month="October" year="2010"/>
    <abstract>
      <t>YANG is a data modeling language used to model configuration and state data manipulated by the Network Configuration Protocol (NETCONF), NETCONF remote procedure calls, and NETCONF notifications. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6020"/>
  <seriesInfo name="DOI" value="10.17487/RFC6020"/>
</reference>

<reference anchor="RFC8340">
  <front>
    <title>YANG Tree Diagrams</title>
    <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
    <author fullname="L. Berger" initials="L." role="editor" surname="Berger"/>
    <date month="March" year="2018"/>
    <abstract>
      <t>This document captures the current syntax used in YANG module tree diagrams. The purpose of this document is to provide a single location for this definition. This syntax may be updated from time to time based on the evolution of the YANG language.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="215"/>
  <seriesInfo name="RFC" value="8340"/>
  <seriesInfo name="DOI" value="10.17487/RFC8340"/>
</reference>

<reference anchor="RFC9146">
  <front>
    <title>Connection Identifier for DTLS 1.2</title>
    <author fullname="E. Rescorla" initials="E." role="editor" surname="Rescorla"/>
    <author fullname="H. Tschofenig" initials="H." role="editor" surname="Tschofenig"/>
    <author fullname="T. Fossati" initials="T." surname="Fossati"/>
    <author fullname="A. Kraus" initials="A." surname="Kraus"/>
    <date month="March" year="2022"/>
    <abstract>
      <t>This document specifies the Connection ID (CID) construct for the Datagram Transport Layer Security (DTLS) protocol version 1.2.</t>
      <t>A CID is an identifier carried in the record layer header that gives the recipient additional information for selecting the appropriate security association. In "classical" DTLS, selecting a security association of an incoming DTLS record is accomplished with the help of the 5-tuple. If the source IP address and/or source port changes during the lifetime of an ongoing DTLS session, then the receiver will be unable to locate the correct security context.</t>
      <t>The new ciphertext record format with the CID also provides content type encryption and record layer padding.</t>
      <t>This document updates RFC 6347.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9146"/>
  <seriesInfo name="DOI" value="10.17487/RFC9146"/>
</reference>

<reference anchor="RFC4347">
  <front>
    <title>Datagram Transport Layer Security</title>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <author fullname="N. Modadugu" initials="N." surname="Modadugu"/>
    <date month="April" year="2006"/>
    <abstract>
      <t>This document specifies Version 1.0 of the Datagram Transport Layer Security (DTLS) protocol. The DTLS protocol provides communications privacy for datagram protocols. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery. The DTLS protocol is based on the Transport Layer Security (TLS) protocol and provides equivalent security guarantees. Datagram semantics of the underlying transport are preserved by the DTLS protocol.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4347"/>
  <seriesInfo name="DOI" value="10.17487/RFC4347"/>
</reference>

<reference anchor="RFC6347">
  <front>
    <title>Datagram Transport Layer Security Version 1.2</title>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <author fullname="N. Modadugu" initials="N." surname="Modadugu"/>
    <date month="January" year="2012"/>
    <abstract>
      <t>This document specifies version 1.2 of the Datagram Transport Layer Security (DTLS) protocol. The DTLS protocol provides communications privacy for datagram protocols. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery. The DTLS protocol is based on the Transport Layer Security (TLS) protocol and provides equivalent security guarantees. Datagram semantics of the underlying transport are preserved by the DTLS protocol. This document updates DTLS 1.0 to work with TLS version 1.2. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6347"/>
  <seriesInfo name="DOI" value="10.17487/RFC6347"/>
</reference>

<reference anchor="RFC7983">
  <front>
    <title>Multiplexing Scheme Updates for Secure Real-time Transport Protocol (SRTP) Extension for Datagram Transport Layer Security (DTLS)</title>
    <author fullname="M. Petit-Huguenin" initials="M." surname="Petit-Huguenin"/>
    <author fullname="G. Salgueiro" initials="G." surname="Salgueiro"/>
    <date month="September" year="2016"/>
    <abstract>
      <t>This document defines how Datagram Transport Layer Security (DTLS), Real-time Transport Protocol (RTP), RTP Control Protocol (RTCP), Session Traversal Utilities for NAT (STUN), Traversal Using Relays around NAT (TURN), and ZRTP packets are multiplexed on a single receiving socket. It overrides the guidance from RFC 5764 ("SRTP Extension for DTLS"), which suffered from four issues described and fixed in this document.</t>
      <t>This document updates RFC 5764.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7983"/>
  <seriesInfo name="DOI" value="10.17487/RFC7983"/>
</reference>

<reference anchor="RFC9147">
  <front>
    <title>The Datagram Transport Layer Security (DTLS) Protocol Version 1.3</title>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
    <author fullname="N. Modadugu" initials="N." surname="Modadugu"/>
    <date month="April" year="2022"/>
    <abstract>
      <t>This document specifies version 1.3 of the Datagram Transport Layer Security (DTLS) protocol. DTLS 1.3 allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
      <t>The DTLS 1.3 protocol is based on the Transport Layer Security (TLS) 1.3 protocol and provides equivalent security guarantees with the exception of order protection / non-replayability. Datagram semantics of the underlying transport are preserved by the DTLS protocol.</t>
      <t>This document obsoletes RFC 6347.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9147"/>
  <seriesInfo name="DOI" value="10.17487/RFC9147"/>
</reference>




    </references>


<?line 1150?>

<section anchor="yang-model"><name>QUIC-LB YANG Model</name>

<t>These YANG models conform to <xref target="RFC6020"/> and express a complete QUIC-LB
configuration. There is one model for the server and one for the middlebox
(i.e the load balancer and/or Retry Service).</t>

<figure><artwork><![CDATA[
module ietf-quic-lb-server {
  yang-version "1.1";
  namespace "urn:ietf:params:xml:ns:yang:ietf-quic-lb";
  prefix "quic-lb";

  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991: Common YANG Data Types.";
  }

  import ietf-inet-types {
    prefix inet;
    reference
      "RFC 6991: Common YANG Data Types.";
  }

  organization
    "IETF QUIC Working Group";

  contact
    "WG Web:   <http://datatracker.ietf.org/wg/quic>
     WG List:  <quic@ietf.org>

     Authors: Martin Duke (martin.h.duke at gmail dot com)
              Nick Banks (nibanks at microsoft dot com)
              Christian Huitema (huitema at huitema.net)";

  description
    "This module enables the explicit cooperation of QUIC servers
     with trusted intermediaries without breaking important
     protocol features.

     Copyright (c) 2022 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Simplified BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
     for full legal notices.

     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 (RFC 2119) (RFC 8174) when, and only when,
     they appear in all capitals, as shown here.";

  revision "2023-07-14" {
    description
      "Updated to design in version 17 of the draft";
    reference
      "RFC XXXX, QUIC-LB: Generating Routable QUIC Connection IDs";
  }

  container quic-lb {
    presence "The container for QUIC-LB configuration.";

    description
      "QUIC-LB container.";

    typedef quic-lb-key {
      type yang:hex-string {
        length 47;
      }
      description
        "This is a 16-byte key, represented with 47 bytes";
    }

    leaf config-id {
      type uint8 {
        range "0..6";
      }
      mandatory true;
      description
        "Identifier for this CID configuration.";
    }

    leaf first-octet-encodes-cid-length {
      type boolean;
      default false;
      description
        "If true, the six least significant bits of the first
         CID octet encode the CID length minus one.";
    }

    leaf server-id-length {
      type uint8 {
        range "1..15";
      }
      must '. <= (19 - ../nonce-length)' {
        error-message
          "Server ID and nonce lengths must sum
           to no more than 19.";
      }
      mandatory true;
      description
        "Length (in octets) of a server ID. Further range-limited
         by nonce-length.";
    }

    leaf nonce-length {
      type uint8 {
        range "4..18";
      }
      mandatory true;
      description
        "Length, in octets, of the nonce. Short nonces mean there
         will be frequent configuration updates.";
    }

    leaf cid-key {
      type quic-lb-key;
      description
        "Key for encrypting the connection ID.";
    }

    leaf server-id {
      type yang:hex-string;
      must "string-length(.) = 3 * ../../server-id-length - 1";
      mandatory true;
      description
        "An allocated server ID";
    }
  }
}
]]></artwork></figure>

<figure><artwork><![CDATA[
module ietf-quic-lb-middlebox {
  yang-version "1.1";
  namespace "urn:ietf:params:xml:ns:yang:ietf-quic-lb";
  prefix "quic-lb";

  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991: Common YANG Data Types.";
  }

  import ietf-inet-types {
    prefix inet;
    reference
      "RFC 6991: Common YANG Data Types.";
  }

  organization
    "IETF QUIC Working Group";

  contact
    "WG Web:   <http://datatracker.ietf.org/wg/quic>
     WG List:  <quic@ietf.org>

     Authors: Martin Duke (martin.h.duke at gmail dot com)
              Nick Banks (nibanks at microsoft dot com)
              Christian Huitema (huitema at huitema.net)";

  description
    "This module enables the explicit cooperation of QUIC servers
     with trusted intermediaries without breaking important
     protocol features.

     Copyright (c) 2021 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Simplified BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
     for full legal notices.

     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 (RFC 2119) (RFC 8174) when, and only when,
     they appear in all capitals, as shown here.";

  revision "2021-02-11" {
    description
      "Updated to design in version 13 of the draft";
    reference
      "RFC XXXX, QUIC-LB: Generating Routable QUIC Connection IDs";
  }

  container quic-lb {
    presence "The container for QUIC-LB configuration.";

    description
      "QUIC-LB container.";

    typedef quic-lb-key {
      type yang:hex-string {
        length 47;
      }
      description
        "This is a 16-byte key, represented with 47 bytes";
    }

    list cid-configs {
      key "config-rotation-bits";
      description
        "List up to three load balancer configurations";

      leaf config-rotation-bits {
        type uint8 {
          range "0..2";
        }
        mandatory true;
        description
          "Identifier for this CID configuration.";
      }

      leaf server-id-length {
        type uint8 {
          range "1..15";
        }
        must '. <= (19 - ../nonce-length)' {
          error-message
            "Server ID and nonce lengths must sum to
             no more than 19.";
        }
        mandatory true;
        description
          "Length (in octets) of a server ID. Further range-limited
           by nonce-length.";
      }

      leaf cid-key {
        type quic-lb-key;
        description
          "Key for encrypting the connection ID.";
      }

      leaf nonce-length {
        type uint8 {
          range "4..18";
        }
        mandatory true;
        description
          "Length, in octets, of the nonce. Short nonces mean there
           will be frequent configuration updates.";
      }

      list server-id-mappings {
        key "server-id";
        description "Statically allocated Server IDs";

        leaf server-id {
          type yang:hex-string;
          must "string-length(.) = 3 * ../../server-id-length - 1";
          mandatory true;
          description
            "An allocated server ID";

        }

        leaf server-address {
          type inet:ip-address;
          mandatory true;
          description
            "Destination address corresponding to the server ID";
        }
      }
    }
  }
}
]]></artwork></figure>

<section anchor="tree-diagram"><name>Tree Diagram</name>

<t>This summary of the YANG models uses the notation in <xref target="RFC8340"/>.</t>

<figure><artwork><![CDATA[
module: ietf-quic-lb-server
  +--rw quic-lb!
     +--rw config-id                         uint8
     +--rw first-octet-encodes-cid-length?   boolean
     +--rw server-id-length                  uint8
     +--rw nonce-length                      uint8
     +--rw cid-key?                          quic-lb-key
     +--rw server-id                         yang:hex-string
]]></artwork></figure>

<figure><artwork><![CDATA[
module: ietf-quic-lb-middlebox
  +--rw quic-lb!
     +--rw cid-configs* [config-rotation-bits]
     |  +--rw config-rotation-bits    uint8
     |  +--rw server-id-length        uint8
     |  +--rw cid-key?                quic-lb-key
     |  +--rw nonce-length            uint8
     |  +--rw server-id-mappings* [server-id]
     |     +--rw server-id         yang:hex-string
     |     +--rw server-address    inet:ip-address
]]></artwork></figure>

</section>
</section>
<section anchor="test-vectors"><name>Load Balancer Test Vectors</name>

<t>This section uses the following abbreviations:</t>

<figure><artwork><![CDATA[
cid      Connection ID
cr_bits  Config Rotation Bits
LB       Load Balancer
sid      Server ID
]]></artwork></figure>

<t>In all cases, the server is configured to encode the CID length.</t>

<section anchor="unencrypted-cids"><name>Unencrypted CIDs</name>

<figure><sourcecode type="pseudocode"><![CDATA[
cr_bits sid nonce cid
0 c4605e 4504cc4f 07c4605e4504cc4f
1 350d28b420 3487d970b 20a350d28b4203487d970b
]]></sourcecode></figure>

</section>
<section anchor="encrypted-cids"><name>Encrypted CIDs</name>

<t>The key for all of these examples is 8f95f09245765f80256934e50c66207f. The
test vectors include an example that uses the 16-octet single-pass special
case, as well as an instance where the server ID length exceeds the nonce
length, requiring a fourth decryption pass.</t>

<figure><sourcecode type="pseudocode"><![CDATA[
cr_bits sid nonce cid
0 ed793a ee080dbf 0720b1d07b359d3c
1 ed793a51d49b8f5fab65 ee080dbf48
                         2fcc381bc74cb4fbad2823a3d1f8fed2
2 ed793a51d49b8f5f ee080dbf48c0d1e5
                         504dd2d05a7b0de9b2b9907afb5ecf8cc3
3 ed793a51d49b8f5fab ee080dbf48c0d1e55d
                         125779c9cc86beb3a3a4a3ca96fce4bfe0cdbc
]]></sourcecode></figure>

</section>
</section>
<section anchor="interoperability-with-dtls-over-udp"><name>Interoperability with DTLS over UDP</name>

<t>Some environments may contain DTLS traffic as well as QUIC operating over UDP,
which may be hard to distinguish.</t>

<t>In most cases, the packet parsing rules above will cause a QUIC-LB load
balancer to route DTLS traffic in an appropriate way. DTLS 1.3 implementations
that use the connection_id extension <xref target="RFC9146"/> might use the techniques in
this document to generate connection IDs and achieve robust routability for DTLS
associations if they meet a few additional requirements. This non-normative
appendix describes this interaction.</t>

<section anchor="dtls-10-and-12"><name>DTLS 1.0 and 1.2</name>

<t>DTLS 1.0 <xref target="RFC4347"/> and 1.2 <xref target="RFC6347"/> use packet formats that a QUIC-LB
router will interpret as short header packets with CIDs that request 4-tuple
routing.  As such, they will route such packets consistently as long as the
4-tuple does not change. Note that DTLS 1.0 has been deprecated by the IETF.</t>

<t>The first octet of every DTLS 1.0 or 1.2 datagram contains the content type.
A QUIC-LB load balancer will interpret any content type less than 128 as a short
header packet, meaning that the subsequent octets should contain a connection
ID.</t>

<t>Existing TLS content types comfortably fit in the range below 128. Assignment of
codepoints greater than 64 would require coordination in accordance with
<xref target="RFC7983"/>, and anyway would likely create problems demultiplexing DTLS and
version 1 of QUIC. Therefore, this document believes it is extremely unlikely
that TLS content types of 128 or greater will be assigned. Nevertheless, such
an assignment would cause a QUIC-LB load balancer to interpret the packet as a
QUIC long header with an essentially random connection ID, which is likely to be
routed irregularly.</t>

<t>The second octet of every DTLS 1.0 or 1.2 datagram is the bitwise complement
of the DTLS Major version (i.e. version 1.x = 0xfe). A QUIC-LB load balancer
will interpret this as a connection ID that requires 4-tuple based load
balancing, meaning that the routing will be consistent as long as the 4-tuple
remains the same.</t>

<t><xref target="RFC9146"/> defines an extension to add connection IDs to DTLS 1.2.
Unfortunately, a QUIC-LB load balancer will not correctly parse the connection
ID and will continue 4-tuple routing. An modified QUIC-LB load balancer that
correctly identifies DTLS and parses a DTLS 1.2 datagram for the connection ID
is outside the scope of this document.</t>

</section>
<section anchor="dtls-13"><name>DTLS 1.3</name>

<t>DTLS 1.3 <xref target="RFC9147"/> changes the structure of datagram headers in relevant
ways.</t>

<t>Handshake packets continue to have a TLS content type in the first octet and
0xfe in the second octet, so they will be 4-tuple routed, which should not
present problems for likely NAT rebinding or address change events.</t>

<t>Non-handshake packets always have zero in their most significant bit and will
therefore always be treated as QUIC short headers. If the connection ID is
present, it follows in the succeeding octets. Therefore, a DTLS 1.3 association
where the server utilizes Connection IDs and the encodings in this document
will be routed correctly in the presence of client address and port changes.</t>

<t>However, if the client does not include the connection_id extension in its
ClientHello, the server is unable to use connection IDs. In this case, non-
handshake packets will appear to contain random connection IDs and be routed
randomly. Thus, unmodified QUIC-LB load balancers will not work with DTLS 1.3
if the client does not advertise support for connection IDs, or the server does
not request the use of a compliant connection ID.</t>

<t>A QUIC-LB load balancer might be modified to identify DTLS 1.3 packets and
correctly parse the fields to identify when there is no connection ID and
revert to 4-tuple routing, removing the server requirement above. However, such
a modification is outside the scope of this document, and classifying some
packets as DTLS might be incompatible with future versions of QUIC.</t>

</section>
<section anchor="future-versions-of-dtls"><name>Future Versions of DTLS</name>

<t>As DTLS does not have an IETF consensus document that defines what parts of
DTLS will be invariant in future versions, it is difficult to speculate about
the applicability of this section to future versions of DTLS.</t>

</section>
</section>
<section anchor="acknowledgments"><name>Acknowledgments</name>

<t>Manasi Deval, Erik Fuller, Toma Gavrichenkov, Greg Greenway, Jana Iyengar,
Subodh Iyengar, Stefan Kolbl, Ladislav Lhotka, Jan Lindblad, Ling Tao Nju,
Ilari Liusvaara, Kazuho Oku, Udip Pant, Zaheduzzaman Sarker, Ian Swett, Andy
Sykes, Martin Thomson, Dmitri Tikhonov, Victor Vasiliev, Xingcan Lan, Yu Zhu,
and William Zeng Ke all provided useful input to this document.</t>

</section>
<section anchor="change-log"><name>Change Log</name>

<ul empty="true"><li>
  <t><strong>RFC Editor's Note:</strong>  Please remove this section prior to
publication of a final version of this document.</t>
</li></ul>

<section anchor="since-draft-ietf-quic-load-balancers-20"><name>since draft-ietf-quic-load-balancers-20</name>

<t><list style="symbols">
  <t>Changed definition of Unroutable DCIDs, and rewrote sections on config
failover and fallback routing to avoid misrouted connections.</t>
  <t>Deleted text on dropping packets</t>
  <t>Rewrote version invariance section</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-19"><name>since draft-ietf-quic-load-balancers-19</name>

<t><list style="symbols">
  <t>Further guidance on multiple server processes/threads</t>
  <t>Fixed error in encryption example.</t>
  <t>Clarified fallback algorithms and known QUIC versions.</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-18"><name>since draft-ietf-quic-load-balancers-18</name>

<t><list style="symbols">
  <t>Rearranged the output of the expand function to reduce CPU load of decrypt</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-17"><name>since draft-ietf-quic-load-balancers-17</name>

<t><list style="symbols">
  <t>fixed regressions in draft-17 publication</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-16"><name>since draft-ietf-quic-load-balancers-16</name>

<t><list style="symbols">
  <t>added a config ID bit (now there are 3).</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-15"><name>since draft-ietf-quic-load-balancers-15</name>

<t><list style="symbols">
  <t>aasvg fixes.</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-14"><name>since draft-ietf-quic-load-balancers-14</name>

<t><list style="symbols">
  <t>Revised process demultiplexing text</t>
  <t>Restored lost text in Security Considerations</t>
  <t>Editorial comments from Martin Thomson.</t>
  <t>Tweaked 4-pass algorithm to avoid accidental plaintext similarities</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-13"><name>since draft-ietf-quic-load-balancers-13</name>

<t><list style="symbols">
  <t>Incorporated Connection ID length in argument of truncate function</t>
  <t>Added requirements for codepoint 0b11.</t>
  <t>Describe Distinguishing Attack in Security Considerations.</t>
  <t>Added non-normative language about server process demultiplexers</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-12"><name>since draft-ietf-quic-load-balancers-12</name>

<t><list style="symbols">
  <t>Separated Retry Service design into a separate draft</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-11"><name>since draft-ietf-quic-load-balancers-11</name>

<t><list style="symbols">
  <t>Fixed mistakes in test vectors</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-10"><name>since draft-ietf-quic-load-balancers-10</name>

<t><list style="symbols">
  <t>Refactored algorithm descriptions; made the 4-pass algorithm easier to
implement</t>
  <t>Revised test vectors</t>
  <t>Split YANG model into a server and middlebox version</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-09"><name>since draft-ietf-quic-load-balancers-09</name>
<t><list style="symbols">
  <t>Renamed "Stream Cipher" and "Block Cipher" to "Encrypted Short" and
"Encrypted Long"</t>
  <t>Added section on per-connection state</t>
  <t>Changed "Encrypted Short" to a 4-pass algorithm.</t>
  <t>Recommended a random initial nonce when incrementing.</t>
  <t>Clarified what SNI LBs should do with unknown QUIC versions.</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-08"><name>since draft-ietf-quic-load-balancers-08</name>
<t><list style="symbols">
  <t>Eliminate Dynamic SID allocation</t>
  <t>Eliminated server use bytes</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-07"><name>since draft-ietf-quic-load-balancers-07</name>
<t><list style="symbols">
  <t>Shortened SSCID nonce minimum length to 4 bytes</t>
  <t>Removed RSCID from Retry token body</t>
  <t>Simplified CID formats</t>
  <t>Shrunk size of SID table</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-06"><name>since draft-ietf-quic-load-balancers-06</name>
<t><list style="symbols">
  <t>Added interoperability with DTLS</t>
  <t>Changed "non-compliant" to "unroutable"</t>
  <t>Changed "arbitrary" algorithm to "fallback"</t>
  <t>Revised security considerations for mistrustful tenants</t>
  <t>Added retry service considerations for non-Initial packets</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-05"><name>since draft-ietf-quic-load-balancers-05</name>
<t><list style="symbols">
  <t>Added low-config CID for further discussion</t>
  <t>Complete revision of shared-state Retry Token</t>
  <t>Added YANG model</t>
  <t>Updated configuration limits to ensure CID entropy</t>
  <t>Switched to notation from quic-transport</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-04"><name>since draft-ietf-quic-load-balancers-04</name>
<t><list style="symbols">
  <t>Rearranged the shared-state retry token to simplify token processing</t>
  <t>More compact timestamp in shared-state retry token</t>
  <t>Revised server requirements for shared-state retries</t>
  <t>Eliminated zero padding from the test vectors</t>
  <t>Added server use bytes to the test vectors</t>
  <t>Additional compliant DCID criteria</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-03"><name>since-draft-ietf-quic-load-balancers-03</name>
<t><list style="symbols">
  <t>Improved Config Rotation text</t>
  <t>Added stream cipher test vectors</t>
  <t>Deleted the Obfuscated CID algorithm</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-02"><name>since-draft-ietf-quic-load-balancers-02</name>
<t><list style="symbols">
  <t>Replaced stream cipher algorithm with three-pass version</t>
  <t>Updated Retry format to encode info for required TPs</t>
  <t>Added discussion of version invariance</t>
  <t>Cleaned up text about config rotation</t>
  <t>Added Reset Oracle and limited configuration considerations</t>
  <t>Allow dropped long-header packets for known QUIC versions</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-01"><name>since-draft-ietf-quic-load-balancers-01</name>
<t><list style="symbols">
  <t>Test vectors for load balancer decoding</t>
  <t>Deleted remnants of in-band protocol</t>
  <t>Light edit of Retry Services section</t>
  <t>Discussed load balancer chains</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-00"><name>since-draft-ietf-quic-load-balancers-00</name>
<t><list style="symbols">
  <t>Removed in-band protocol from the document</t>
</list></t>

</section>
<section anchor="since-draft-duke-quic-load-balancers-06"><name>Since draft-duke-quic-load-balancers-06</name>
<t><list style="symbols">
  <t>Switch to IETF WG draft.</t>
</list></t>

</section>
<section anchor="since-draft-duke-quic-load-balancers-05"><name>Since draft-duke-quic-load-balancers-05</name>
<t><list style="symbols">
  <t>Editorial changes</t>
  <t>Made load balancer behavior independent of QUIC version</t>
  <t>Got rid of token in stream cipher encoding, because server might not have it</t>
  <t>Defined "non-compliant DCID" and specified rules for handling them.</t>
  <t>Added psuedocode for config schema</t>
</list></t>

</section>
<section anchor="since-draft-duke-quic-load-balancers-04"><name>Since draft-duke-quic-load-balancers-04</name>
<t><list style="symbols">
  <t>Added standard for retry services</t>
</list></t>

</section>
<section anchor="since-draft-duke-quic-load-balancers-03"><name>Since draft-duke-quic-load-balancers-03</name>
<t><list style="symbols">
  <t>Renamed Plaintext CID algorithm as Obfuscated CID</t>
  <t>Added new Plaintext CID algorithm</t>
  <t>Updated to allow 20B CIDs</t>
  <t>Added self-encoding of CID length</t>
</list></t>

</section>
<section anchor="since-draft-duke-quic-load-balancers-02"><name>Since draft-duke-quic-load-balancers-02</name>
<t><list style="symbols">
  <t>Added Config Rotation</t>
  <t>Added failover mode</t>
  <t>Tweaks to existing CID algorithms</t>
  <t>Added Block Cipher CID algorithm</t>
  <t>Reformatted QUIC-LB packets</t>
</list></t>

</section>
<section anchor="since-draft-duke-quic-load-balancers-01"><name>Since draft-duke-quic-load-balancers-01</name>
<t><list style="symbols">
  <t>Complete rewrite</t>
  <t>Supports multiple security levels</t>
  <t>Lightweight messages</t>
</list></t>

</section>
<section anchor="since-draft-duke-quic-load-balancers-00"><name>Since draft-duke-quic-load-balancers-00</name>
<t><list style="symbols">
  <t>Converted to markdown</t>
  <t>Added variable length connection IDs</t>
</list></t>

</section>
</section>


  </back>

<!-- ##markdown-source:
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
AO0qOD5puj9KsYkXBXaS0k5iqol9fiLFKIa5/f5LkG4Ki9UrXOuCvcqkQjry
ioC4ZJmazCROcZplJiingsUG8UogQksdr7+zXcOp/64ur4u7xrIvaS3JZWPF
ro30SJGAcZEOQ6uM6s6dsOilYGsN1k0h1QClu5uU+Xbl2z0xDG6+aGzGCol+
dQotLGe3ruYzSikX7la2evf6CdtSrgnvVkl9IrVWse15Xnf7UW+KTc19CUNL
XmzVNjefcfMlWslT8rspEqyg553SJn1LqWNl5dELYAiBlPttVEpnLx2jd492
Tml4p3XxDP0NfJN7N+oWgylGkZ97sXBhDrbdBdW8CIwvUoYbZarVqkx7WvqI
CkkLOZxKez2+EZ0iv+1+ckJRyILiLgmb6KgSj+LB0C4rypauCLtnKd9ZPZaN
4LVv9sJixaZTrFhUfbpv9PT7lzfRFWumf8yWy1LaPEvBNIyGDbNtHKez6R1+
nRmk71JK27VCdDetMnYBtDecHTCGC96IrFapo6HTTI3mWkgdWe3sO7RkA46e
fQFtzyQKQLntOOt8D2wdLsym6BYfHsitXOV1mpNRhbpvxcu25+K+oiLKWRHj
Cn5a5MvMSFFnyiWAO61lw1SW4Q4B7QuqNW74FFX5pPY+NHjNGnWXfq29IuFi
/EMBcdMMy/lwRoX3hWNKtaAeadZKe2Kl4BsNKA569a5+K1905tpp4qBgbNBg
02kKziWBDfGDrFNBWbyeOoxT8Vt3ieqGubQuQ83zaMSGShDQYAOUR5mEsrLs
9c7l9QVOPrEpm04/Mq+Fjfa5Cso2AXeKkD1dULISAV/q7dIZsMtJupN+K49Y
RZhbG7IZGaVEesCrTGsh7hXg2V1DfeAprlzNwsR26N72qVREJF9mLSS0GrTf
IhuoYt5omwHgy5Yt07TGK7QUgLoSMo+fY9RZXFXlPTabQPEr5TN2tUWZvxqx
ueraBf49TTI2tteEzFHlIOTDq5aaKmFInMmx1UlZj5W6ww16uIlfBhirSccp
t5ava+NTZg+NOqgt9gm25GbaKcVntlJbDyjvZbsOO9YFy8ulzXrzF2/Zn5yp
JZ3aVgLjs+N5tlSjl9bb6FTTJ9mQ04z7OKq5LAQdUpY3nCruFS3rAR5TUK3T
R+A3dCvYzC1OE6bZ/salvnGyqZACXoWOls9PavlmGLpgvri+iMQomoySF6WO
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

-->

</rfc>

