merged three documents and made experimental

This commit is contained in:
Randy Bush 2024-01-30 12:42:34 -08:00
parent bb3ed3aa5a
commit f5eb7c24b0

View file

@ -11,7 +11,7 @@
<?rfc tocindent="yes"?>
<?rfc tocompact="yes"?>
<rfc consensus="yes" submissionType="IETF" category="std" docName="draft-ietf-lsvr-l3dl-11" ipr="trust200902" version="2">
<rfc consensus="yes" submissionType="IETF" category="exp" docName="draft-ietf-lsvr-l3dl-12" ipr="trust200902" version="2">
<front>
@ -38,6 +38,20 @@
</address>
</author>
<author fullname="Russ Housley" initials="R" surname="Housley">
<organization abbrev="Vigil Security">Vigil Security, LLC</organization>
<address>
<postal>
<street>516 Dranesville Road</street>
<city>Herndon</city>
<region>VA</region>
<code>20170</code>
<country>USA</country>
</postal>
<email>housley@vigilsec.com</email>
</address>
</author>
<author fullname="Keyur Patel" initials="K." surname="Patel">
<organization>Arrcus</organization>
<address>
@ -114,17 +128,22 @@
<xref target="RFC7752"/> API, to BGP-SPF which computes the
topology and builds routing and forwarding tables,</t>
<t>Enable Layer-3 link liveness such as BFD,</t>
<t>Provide Layer-2 keep-alive messages for session continuity, and
finally</t>
<t>Provide for authenticity verification of protocol messages.</t>
<t>Provide Layer-2 keep-alive messages for session continuity,</t>
<t>Provide for authenticity verification of protocol messages, and
finally.</t>
<t>Communicate the parameters needed to exchange inter-device
Upper Layer Protocol Configuration for upper-layer protocols such
as BGP.</t>
</list></t>
<t>In this document, the use case for L3DL is for point to point
links in a datacenter Clos in order to exchange the data needed for
BGP-SPF <xref target="I-D.ietf-lsvr-bgp-spf"/> bootstrap and
continuity. Once layer-2 connectivity has been leveraged to get
layer-3 addressability and forwarding capabilities, normal layer-3
forwarding and routing can take over.</t>
layer-3 addressability and forwarding capabilities, parameters for
routing protocols such as BGP can be communicated, and normal
layer-3 forwarding and routing can take over.</t>
<t>L3DL might be found to be more widely applicable to a range of
routing and similar protocols which need layer-3 discovery and
@ -206,6 +225,10 @@
needed to run safely on a WAN need to be considered, and the
appropriate level of security options chosen.</t>
<t>Familiarity with the BGP4 Protocol <xref target="RFC4271"/> is
assumed. Familiarity with BGP-SPF, <xref
target="I-D.ietf-lsvr-bgp-spf"/>, might be useful. </t>
<t>L3DL assumes a new IEEE assigned EtherType (TBD).</t>
<t>The number of addresses of one Encapsulation type on an interface
@ -430,6 +453,13 @@
Transmission Sequence Number informs the receiver that it is the
same PDU.</t>
<t>The L3DL OPEN PDU contains an algorithm identifier, a key, and a
L3DL certificate, which can be used to verify signatures on
subsequent PDUs. This document describes two methods of key
generation and signing for use by L3DL, Trust On First Use (TOFU)
and a PKI-based mechanism to provide authentication as well as
session integrity. See <xref target="sigtypes"/>.</t>
<!--
protocol "Version:8,Transmission Sequence Number:16,L:1,Datagram Number:23,Datagram Length:16,Checksum:32,Payload...:32"
-->
@ -1339,6 +1369,290 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
</section>
</section>
<section anchor="ulpc" title="Upper-Layer Protocol Configuration PDU">
<t>To communicate parameters required to configure peering and
operation of Upper-Layer Protocols at IP layer-3 and above, e.g.,
BGP sessions on a link, a neutral sub-TLV based Upper-Layer Protocol
PDU is defined as follows:</t>
<!--
protocol "Type = 8:9,Payload Length:32,ULPC Type:8,AttrCount:8,Attribute List ...:24,Sig Type:8,Signature Len:16,Signature ...:24"
-->
<figure>
<artwork>
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 9 | Payload Length ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~ | ULPC Type | AttrCount | ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~ Attribute List ... | Sig Type | Signature Len ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~ | Signature ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
</figure>
<t>The Type and Payload Length are defined in <xref
target="tlv"/>.</t>
<?rfc subcompact="yes"?>
<t>ULPC Type: A one octet integer denoting the type of the
upper-layer protocol
<list style="hanging" hangIndent="6">
<t hangText="0 :">Reserved</t>
<t hangText="1 :">BGP</t>
<t hangText="2-255 :">Reserved</t>
<?rfc subcompact="no"?></list></t>
<t>The one octet AttrCount is the number of attribute sub-TLVs in
the Attribute List.</t>
<t>The Attribute List is a, possibly null, set of sub-TLVs
describing the configuration attributes of the specific upper-layer
protocol.</t>
<t>An Attribute consists of a one octet Attribute Type, a one octet
Attribute Length of the number of octets in the Attribute, and a
Payload of arbitrary length up to 253 octets.</t>
<!--
protocol "Attr Type = 1:8,Attr Len:8,Payload:16"
-->
<figure>
<artwork>
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attr Type = 1 | Attr Len | Payload |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
</figure>
<section anchor="bgp" title="ULPC BGP Attribute sub-TLVs">
<t>The parameters needed for BGP peering on a link are exchanged
in sub-TLVs within an Upper-Layer Protocol PDU. The following
describe the various sub-TLVs for BGP.</t>
<t>The goal is to provide the minimal set of configuration
parameters needed by BGP OPEN to successfully start a BGP peering.
The goal is specifically not to replace or conflict with data
exchanged during BGP OPEN. Multiple sources of truth are a recipe
for complexity and hence pain.</t>
<t>If there are multiple BGP sessions on a link, e.g., IPv4 and
IPv6, then separate BGP ULPC PDUs should be sent, one for each
address family.</t>
<t>A peer receiving BGP ULPC PDUs has only one active BGP ULPC PDU
for an particular address family on a specific link at any point
in time; receipt of a new BGP ULPC PDU for a particular address
family replaces the data any previous one; but does not actually
affect the session<!-- unless there is a BGP Restart Attribute
sub-TLV-->.</t>
<t>If there are one or more open BGP sessions, <!-- absent a BGP
Restart sub-TLV, --> receipt of a new BGP ULPC PDU SHOULD not
affect these sessions. The received data are stored for a future
session restart.</t>
<t>As a link may have multiple encapsulations and multiple
addresses for an IP encapsulation, which address of which
encapsulation is to be used for the BGP session MUST be
specified.</t>
<t>For each BGP peering on a link here MUST be one agreed
encapsulation, and the addresses used MUST be in the corresponding
L3DP IPv4/IPv6 Announcement PDUs. If the choice is ambiguous, an
Attribute may be used to signal preferences.</t>
<t>If a peering address has been announced as a loopback,
i.e. MUST BE flagged as such in the L3DL Encapsulation PDU (see
<xref target="eflags"/>), a two or three hop
BGP session will be established. Otherwise a direct one hop
session is used. The BGP session to a loopback will forward to
the peer's address which was marked as Primary in the L3DL
Encapsulation Flags, iff it is in a subnet which is shared with
both BGP speakers. If the primary is not in a common subnet, then
the BGP speaker MAY pick a forwarding next hop that is in a subnet
they share. If there are multiple choices, the BGP speaker SHOULD
have signaled which subnet to choose in an Upper-Layer Protocol
Configuration PDU Attribute.</t>
<t>Attributes MUST be unique in the Attribute List. I.e. a
particular Attr Type MUST NOT occur more than once in the
Attribute List. If a ULPC PDU is received with more than one
occurrence of a particular Attr Type, an Error ACK MUST be
returned.</t>
<t>As there are separate PDU Attr Types for IPv4 and IPv6 peering
addresses, separate sessions for the two AFIs MAY be created for
the same ASN in one ULPC PDU.</t>
<!--
protocol "Attr Type = 1:8,Attr Len = 6:8,My ASN:32"
-->
<section anchor="asn" title="BGP ASN">
<t>The four octet Autonomous System number MUST be specified.
If the AS Number is less than 32 bits, it is padded with high
order zeros.</t>
<figure>
<artwork>
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attr Type = 1 | Attr Len = 6 | My ASN ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~ |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
</figure>
</section>
<section anchor="bgpv4" title="BGP IPv4 Address">
<!--
protocol "Attr Type = 2:8,Attr Len = 7:8,My IPv4 Peering Address:32,Prefix Len:8"
-->
<t>The four octet BGP IPv4 Address sub-TLV announces the
sender's IPv4 BGP peering source address to be used by the
receiver. At least one of IPv4 or IPv6 BGP source addresses
MUST be announced.</t>
<t>As usual, the BGP OPEN capability negotiation will determine
the AFI/SAFIs to be transported over the peering, see <xref
target="RFC4760"/> .</t>
<figure>
<artwork>
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attr Type = 2 | Attr Len = 5 | My IPv4 Peering Address ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~ | Prefix Len |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
</figure>
</section>
<section anchor="bgpv6" title="BGP IPv6 Address">
<t>The BGP IPv6 Address sub-TLV announces the sender's 16 octet
IPv6 BGP peering source address and one octet Prefix Length to
be used by the receiver. At least one of IPv4 or IPv6 BGP
source addresses MUST be announced.</t>
<t>As usual, the BGP OPEN capability negotiation will determine
the AFI/SAFIs to be transported over the peering, see <xref
target="RFC4760"/>.</t>
<!--
protocol "Attr Type = 3:8,Attr Len = 19:8,My IPv6 Peering Address:128,Prefix Len:8"
-->
<figure>
<artwork>
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attr Type = 3 | Attr Len = 17 | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
| |
+ +
| My IPv6 Peering Address |
+ +
| |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | Prefix Len |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
</figure>
</section>
<section anchor="bgpmd5" title="BGP Authentication sub-TLV">
<t>The BGP Authentication sub-TLV provides any authentication
data needed to OPEN the BGP session. Depending on operator
configuration of the environment, it might be a simple MD5 key
(see <xref target="RFC2385"/>), the name of a key chain in a
KARP database (see <xref target="RFC7210"/>), or one of multiple
Authentication sub-TLVs to support hop<xref
target="RFC4808"/>.</t>
<!--
protocol "Attr Type = 4:8,Attr Len:8,BGP Authentication Data ...:48"
-->
<figure>
<artwork>
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attr Type = 4 | Attr Len | ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ~
~ BGP Authentication Data ... ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
</figure>
</section>
<section anchor="bgpflags" title="BGP Miscellaneous Flags">
<t>The BGP session OPEN has extensive, and a bit complex,
capability negotiation facilities. In case one or more extra
attributes might be needed, the two octet BGP Miscellaneous
Flags sub-TLV may be used. No flags are currently defined.</t>
<!--
protocol "Attr Type = 5:8,Attr Len = 4:8,Misc Flags:16"
-->
<figure>
<artwork>
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attr Type = 5 | Attr Len = 4 | Misc Flags |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
</figure>
<t>Misc Flags:
<list style="hanging">
<?rfc subcompact="yes"?>
<t hangText="Bit 0: ">GTSM</t>
<t hangText="Bit 1: ">BFD</t>
<t hangText="Bit 2-15:">Must be zero</t>
<?rfc subcompact="no"?></list></t>
<t>The GTSM flag, when 1, indicates that the sender wishes to
enable the <xref target="RFC5082"/> Generalized TTL Security
Mechanism for the session.</t>
<t>The BFD flag, when 1, indicates that the sender wishes to
enable the <xref target="RFC5880"/> Bidirectional Forwarding
Detection for the session.</t>
</section>
</section>
</section>
<section anchor="vendor" title="VENDOR - Vendor Extensions">
<!--
@ -1542,6 +1856,398 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
</section>
<section anchor="sigtypes" title="Signature Types">
<t>The L3DL OPEN PDU contains an algorithm identifier, a key, and
a L3DL certificate, which can be used to verify signatures on
subsequent PDUs. This document describes two methods of key
generation and signing for use by L3DL, Trust On First Use (TOFU)
and a PKI-based mechanism to provide authentication as well as
session integrity.</t>
<t>The Key in the OPEN PDU SHOULD be the public key of an asymmetric
key pair. The sender signs with the private key, of course. The
device sending the OPEN PDU may use one key for all links, a different
key for each link, or some mix(es) thereof.</t>
<t>In the TOFU method the key sent in the OPEN PDU is generated on
the sending device, is believed without question by the receiver,
and used to verify all subsequent PDUs from the same sender with the
same public key and algorithm.</t>
<t>With the PKI method, an enrollment step is performed. The public
key is signed by the the operational environment's trust anchor. In
this way, the relying party can be confident that the public key is
under control of the identified L3DL protocol entity.</t>
<t>As part of enrollment or before hand, all relying parties must
have received the trust anchor in an authentic manner.</t>
<t>To the receiver verifying signatures on PDUs, the two methods are
indistinguishable; the key provided in the OPEN PDU is used to
verify the signatures of subsequent PDUs. The difference that
PKI-based keys may be verified against the trust anchor when the
OPEN PDU is received.</t>
<t>In the PKI method the public key in the OPEN PDU MUST be verified
against the trust anchor for the operational domain. The OPEN PDU
public key is then used to verify all subsequent PDUs in the
session. A mechanism for 'rolling' from the current public key
to a fresh one is described in <xref target="roll"/>.</t>
<section anchor="algo" title="Signature Algorithm Identifiers">
<t>To avoid the creation of yet another IANA registry for
digital signature algorithm identifiers, this specification makes
use of the existing IANA registry for "DNS Security Algorithm Numbers"
<xref target="IANA"/>. In this registry, each signature algorithm is
identified by an 8-bit value. The entries in this registry with "Y"
in the "Zone Signing" column are appropriate for use with this
protocol.</t>
<t>For interoperability, all implementations of this protocol MUST
support the RSASHA256 algorithm (identified by the value 0x08).
Implementation MAY support any other registered "Zone Signing"
signature algorithms.</t>
</section>
<section anchor="tofu" title="Trust On First Use Method">
<t>There are three parts to using a key: signing PDUs, verifying
the OPEN PDU, and verifying subsequent PDUs.</t>
<section anchor="tofu-pdu-signing" title="Signing a PDU">
<t>All signed PDUs are generated in the same way:</t>
<t>
<list style="symbols">
<t>
Compose the PDU, with all fields including "Sig Algo" and
"Signature Length" set, but omitting the trailing
"Signature" field itself. The Certificate Length should
be zero and the Certificate field should be empty. This
is the "message to be signed" for purposes of the
signature algorithm.
</t>
<t>
Generate the signature as specified for the chosen algorithm,
using the private key of the asymmetric key pair. In general,
this will involve first hashing the "message to be signed" then
signing the hash, but the precise details may vary with the
specific signature algorithm. The result will be a sequence of
octets, the length of which MUST be equal to the value in the
"Signature Length" field.
</t>
<t>
Construct the complete message by appending the signature
octets to the otherwise complete message composed above.
</t>
</list>
</t>
<t>
In the case of the OPEN PDU, the message to be signed will
include the public member of the asymmetric keypair, but as
far as the signature algorithm is concerned that's just
payload, no different from any other PDU content.
</t>
</section>
<section anchor="tofu-open-verifying" title="Verifying the OPEN PDU">
<t>
The process for verifying an OPEN PDU is slightly different
from the process for verifying other PDU types, because the
OPEN PDU also establishes the session key.
</t>
<t>
<list style="symbols">
<t>
Verify that the PDU is syntactically correct, and extract
the Auth Type, Key, Sig Type, and Signature fields.
</t>
<t>
Verify that Auth Type and Sig Type refer to the same
algorithm suite, and that said algorithm suite is one that
the implementation understands.
</t>
<t>
Construct the "message to be verified" by truncating the PDU
to remove the Signature field (in practice this should not
require copying any data, just subtract the signature length
from the PDU length).
</t>
<t>
Verify the message constructed above against the public key
using the rules for the specific signature suite.
</t>
<t>
Record Auth Type and Key as this sessions's authentication
type and session key, for use in verifying subseuqent PDUs.
</t>
</list>
</t>
<t>
If any of the above verification steps fail, generate an error
using error code 2 ("Authorization failure in OPEN").
</t>
<!--
Why are we using a different error code for failures in OPEN
PDUs than we do in other PDUs? We don't want to provide an
oracle, so we want to return the same error code for any
verification failure for a particular PDU, so the only effect
would be to have all failures in OPEN PDUs return a different
single error code than all failures in any other PDU would
use, which doens't seem useful.
-->
</section>
<section anchor="tofu-other-verifying" title="Verifying Other PDUs">
<t>
The process for verifying non-OPEN PDUs is slightly simpler,
but follows the same basic pattern as for OPEN PDUs.
</t>
<t>
<list style="symbols">
<t>
Verify that the PDU is syntactically correct, and extract
the Sig Type and Signature fields.
</t>
<t>
Verify that Sig Type refers to the same algorithm suite as
the Auth Type recorded during verification of the OPEN PDU.
</t>
<t>
Construct the "message to be verified" by truncating the PDU
to remove the Signature field.
</t>
<t>
Verify the message constructed above against the recorded
session key using the rules for the specific signature
suite.
</t>
</list>
</t>
<t>
If any of the above verification steps fail, generate an error
using error code 3 ("Signature failure in PDU").
</t>
<!--
See note in previous section regarding error codes.
-->
</section>
</section>
<section anchor="pki" title="Public Key Infrastructure Method">
<t>
Using a PKI is almost the same as using TOFU, but with one
additional step: during verification of an OPEN PDU, after
extracting the Key field from the PDU but before attempting to use
it to verify the OPEN PDU signature, the receiver MUST verify the
received key against the PKI to confirm that it's an authorized
key.
</t>
<t>
Generating an OPEN PDU using the PKI method requires a
certificate, which must be supplied via out of band
configuration. The certificate is a signature of the public key
to be sent in the Key field of the OPEN PDU, signed by the trust
anchor private key.
</t>
<t>
Verifying an OPEN PDU using the PKI method requires the public
key of the trust anchor, which the receiver uses to verify the
certificate, thereby demonstrating that the supplied public key
represents an authorized L3DL speaker in this administrative
domain.
</t>
<t>
We use the term "certificate" here in the generic sense, not as
defined in <xref target="RFC5280"/>. X.509 certificates are not
used here; X.509 certificates are more complicated than needed
for L3DL. The L3DL certificates are just signatures of one key
(the public key supplied in the Key field of the OPEN PDU) that
can be verified by another trusted public key (the trust anchor).
</t>
<section anchor="pki-open-signing" title="Signing OPEN PDU with PKI">
<t>
Generating and signing the OPEN PDU with the PKI method is
almost the same as in <xref target="tofu-pdu-signing"/>. The
only difference is that the PKI method MUST supply the
appropriate certificate in the Certificate field.
</t>
<t>
Note that the Auth Type field applies to both the Key and
Certificate fields. That is: the certificate uses the same
certificate suite as the session keys, L3DL does not support
cross-algorithm-suite certification.
</t>
</section>
<section anchor="verify-pki-open" title="Verifying OPEN PDU with PKI">
<t>
Verifying the OPEN PDU with PKI is similar to verifying with
TOFU as described in <xref target="tofu-open-verifying"/>, but
includes one critical extra step:
</t>
<t>
After extracting the Key field from the PDU but before
verifying the Signature, extract the Certificate field and
verfiy that the Certificate is a valid signature of the Key
field, according to the rules for the signature suite
specified by Auth Type. If this step fails, handle as in
<xref target="tofu-open-verifying"/>.
</t>
</section>
</section>
<section anchor="local-policy" title="Local Policy">
<t>
Whether to use TOFU, PKI, or no signatures at all is a matter of
local policy, to be decided by the operator. The useful
policy combinations for Key and Certificate are probably:
</t>
<t>
<list style="symbols">
<t>
Not signing: sender need not sign, receiver does not check.
</t>
<t>
Require TOFU: sender MUST supply key and receiver MUST
check, but L3DL certificates not needed and ignored if sent.
</t>
<t>
Allow TOFU: sender MUST supply key and receiver MUST check,
receiver SHOULD check certificate if supplyed by sender.
</t>
<t>
Require PKI: sender MUST supply key and L3DL certificate,
receiver MUST check signature and verify the L3DL certificate.
</t>
</list>
</t>
</section>
<section anchor="roll" title="NEWKEY, Key Roll">
<t>Modern key management allows for agility in 'rolling' to a new
key or even algorithm in case of key expiry, key compromise, or
merely prudence. Declaring a new key with an L3DL OPEN PDU would
cause serious churn in topology as a new OPEN PDU may cause a
withdraw of previously announced encapsulations. Therefore, a
gentler rekeying is needed.</t>
<t>Prior to 'rolling' to a new key or new algorithm, a new public/private
key pair is generated. If PKI is being used, then the trust anchor
also signs the new public key to create a new L3DL certificate.</t>
<!--
protocol "Type = 8:8,Payload Length:16,New Key Algor:8,New Key Length:16,New Key ...:32,New Cert Length:16,New Certificate ...:32,Old Sig Type:8,Old Signature Length:16,Old Signature ...:40"
-->
<figure>
<artwork>
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 8 | Payload Length | New Key Type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| New Key Length | New Key ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | New Cert Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| New Certificate ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Old Key Type | Old Signature Length | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
| Old Signature ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
</figure>
<t>The New Key Type, New Key Length, New Key, New Cert Length, and
New Certificate fields declare the replacement algorithm, key, and
L3DL certificate.</t>
<t>The NEWKEY PDU is signed using the current (soon to be old)
algorithm and key.</t>
<t>The sender and the receiver should be cautious of signature
algorithm downgrade attacks.</t>
<t>To avoid possible race conditions, the receiver SHOULD accept
signatures using either the new or old key for a configurable time
(default 30 seconds). This is intended to accommodate situations
such as senders with high peer out-degree and a single per-device
asymmetric key.</t>
<t>If the sender does not receive an ACK in the normal window,
including retransmission, then the sender MAY choose to allow a
session reset by either issuing a new OPEN PDU or by letting the
receiver eventually have a signature failure (error code 3) on a
PDU.</t>
<t>
The rekeying operation changes the session key and the associated
algorithm described in <xref target="tofu-other-verifying"/>. The
NEWKEY PDU itself is verified using the old algorithm and session
key. After the NEWKEY PDU has been accepted, subsequent PDUs are
verified with the new algorithm and the new session key.
</t>
</section>
</section>
<section anchor="impl" title="Implementation Considerations">
<t>An implementation SHOULD provide the ability to configure each
@ -1604,6 +2310,39 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
target="tlv"/>) to save computation, then a MITM could fake a
session being alive.</t>
<t>As the ULPC PDU may contain keying material, see <xref
target="bgpmd5"/>, it SHOULD BE signed.</t>
<t>Any keying material in the PDU SHOULD BE salted and hashed.</t>
<t>The BGP Authentication sub-TLV provides for provisioning MD5,
which is a quite weak hash, horribly out of fashion, and kills
puppies. But, like it or not, it has been sufficient against the
kinds of attacks BGP TCP sessions have endured. So it is what BGP
deployments use.</t>
<t>The TOFU method requires a leap of faith to accept the key in the
OPEN PDU, as it can not be verified against any authority. Hence it
is jokingly referred to as Married On First Date. The assurance it
does provide is that subsequent signed PDUs are from the same peer.
And data integrity is a positive side effect of the signature
covering the payload.</t>
<t>The PKI method offers assurance that the L3DL certificate, and
hence the public key, provided in the OPEN PDU are authorized
by a central authority, e.g. the network's security team. The
onward assurance of talking to the same peer and data integrity are
the same as in the TOFU method.</t>
<t>With the PKI method, automated device provisioning could
restrict which L3DL certificates are allowed from which peers
on a per interface basis. This would complicate key rolls. Where
one draws the line between rigidity, flexibility, and security
varies.</t>
<t>The REKEY PDU is open to abuse to create a signature algorithm
downgrade attack.</t>
</section>
<section anchor="iana" title="IANA Considerations">
@ -1628,13 +2367,34 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
5 IPv6 Announcement
6 MPLS IPv4 Announcement
7 MPLS IPv6 Announcement
8-254 Reserved
8 NEWKEY
9 ULPC
10-254 Reserved
255 VENDOR
</artwork>
</figure>
</section>
<section anchor="iana-ulpc" title="ULPC Type">
<t>This document requests the IANA create a registry for L3DL ULPC
Type, which may range from 0 to 255. The name of the registry
should be L3DL-ULPC-Type. The policy for adding to the registry is
RFC Required per <xref target="RFC5226"/>, either standards track or
experimental. The initial entries should be the following:</t>
<figure>
<artwork>
Value Name
----- -------------------
0 Reserved
1 BGP
2-255 Reserved
</artwork>
</figure>
</section>
<section anchor="iana-sigtype" title="Signature Type">
<t>This document requests the IANA create a registry for L3DL
@ -1648,7 +2408,9 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
Number Name
------ -------------------
0 Null
1-255 Reserved
1 TOFU - Trust On First Use
2 PKI
3-255 Reserved
</artwork>
</figure>
@ -1732,7 +2494,9 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
<?rfc include="reference.RFC.2119.xml"?>
<?rfc include="reference.RFC.3032.xml"?>
<?rfc include="reference.RFC.4271.xml"?>
<?rfc include="reference.RFC.4760.xml"?>
<?rfc include="reference.I-D.ietf-lsvr-bgp-spf.xml"?>
<?rfc include="reference.RFC.5082.xml"?>
<?rfc include="reference.RFC.5226.xml"?>
<?rfc include="reference.RFC.5880.xml"?>
<?rfc include="reference.RFC.6286.xml"?>
@ -1741,6 +2505,13 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
<?rfc include="reference.I-D.ietf-idr-bgpls-segment-routing-epe.xml"?>
<?rfc include="reference.I-D.ietf-idr-bgp-ls-segment-routing-ext.xml"?>
<?rfc include="reference.I-D.ymbk-lsvr-l3dl-signing.xml"?>
<reference anchor="IANA" target="https://www.iana.org/assignments/dns-sec-alg-numbers/dns-sec-alg-numbers.xhtml">
<front>
<title>DNS Security Algorithm Numbers</title>
<author/>
<date/>
</front>
</reference>
<reference anchor="IANA-PEN" target="https://www.iana.org/assignments/enterprise-numbers/enterprise-numbers">
<front>
<title>IANA Private Enterprise Numbers</title>
@ -1778,6 +2549,10 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
<?rfc include="reference.RFC.0791.xml"?>
<?rfc include="reference.RFC.1122.xml"?>
<?rfc include="reference.RFC.1982.xml"?>
<?rfc include="reference.RFC.2385.xml"?>
<?rfc include="reference.RFC.4808.xml"?>
<?rfc include="reference.RFC.5280.xml"?>
<?rfc include="reference.RFC.7210.xml"?>
<?rfc include="reference.I-D.malhotra-bess-evpn-lsoe.xml"?>
<!--
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml-doi/reference.DOI.10.1145/2975159.xml?anchor=JUPITER"?>