rfc8967xml2.original.xml | rfc8967.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="US-ASCII"?> | <?xml version='1.0' encoding='utf-8'?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" []> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" | |||
<?rfc toc="yes"?> | category="std" | |||
<?rfc tocdepth="2"?> | number="8967" | |||
<?rfc symrefs="yes"?> | docName="draft-ietf-babel-hmac-12" | |||
<?rfc sortrefs="yes" ?> | ||||
<?rfc compact="no" ?> | ||||
<rfc category="std" docName="draft-ietf-babel-hmac-12" | ||||
ipr="trust200902" | ipr="trust200902" | |||
obsoletes="7298"> | obsoletes="7298" | |||
<front> | updates="" | |||
<title abbrev="MAC authentication for Babel">MAC authentication for the | submissionType="IETF" | |||
Babel routing protocol</title> | consensus="true" | |||
<author fullname="Clara Do" initials="C." surname="Do"> | xml:lang="en" | |||
<organization>IRIF, University of Paris-Diderot</organization> | tocInclude="true" | |||
<address> | tocDepth="2" | |||
<postal> | symRefs="true" | |||
<street></street> | sortRefs="true" | |||
<city>75205 Paris Cedex 13</city> | version="3"> | |||
<region></region> | <!-- xml2rfc v2v3 conversion 3.0.0 --> | |||
<code></code> | <front> | |||
<country>France</country> | <title abbrev="MAC Authentication for Babel">MAC Authentication for the | |||
</postal> | Babel Routing Protocol</title> | |||
<email>clarado_perso@yahoo.fr</email> | <seriesInfo name="RFC" value="8967"/> | |||
</address> | <author fullname="Clara Dô" initials="C." surname="Dô"> | |||
</author> | <organization>IRIF, University of Paris-Diderot</organization> | |||
<author fullname="Weronika Kolodziejak" initials="W." surname="Kolodziejak"> | <address> | |||
<organization>IRIF, University of Paris-Diderot</organization> | <postal> | |||
<address> | <city>Paris CEDEX 13</city> | |||
<postal> | <code>75205</code> | |||
<street></street> | <country>France</country> | |||
<city>75205 Paris Cedex 13</city> | </postal> | |||
<region></region> | <email>clarado_perso@yahoo.fr</email> | |||
<code></code> | </address> | |||
<country>France</country> | </author> | |||
</postal> | <author fullname="Weronika Kolodziejak" initials="W." surname="Kolodziejak"> | |||
<email>weronika.kolodziejak@gmail.com</email> | <organization>IRIF, University of Paris-Diderot</organization> | |||
</address> | <address> | |||
</author> | <postal> | |||
<author fullname="Juliusz Chroboczek" initials="J." surname="Chroboczek"> | <city>Paris CEDEX 13</city> | |||
<organization>IRIF, University of Paris-Diderot</organization> | <code>75205</code> | |||
<address> | <country>France</country> | |||
<postal> | </postal> | |||
<street>Case 7014</street> | <email>weronika.kolodziejak@gmail.com</email> | |||
<city>75205 Paris Cedex 13</city> | </address> | |||
<region></region> | </author> | |||
<code></code> | <author fullname="Juliusz Chroboczek" initials="J." surname="Chroboczek"> | |||
<country>France</country> | <organization>IRIF, University of Paris-Diderot</organization> | |||
</postal> | <address> | |||
<email>jch@irif.fr</email> | <postal> | |||
</address> | <street>Case 7014</street> | |||
</author> | <city>Paris CEDEX 13</city> | |||
<code>75205</code> | ||||
<country>France</country> | ||||
</postal> | ||||
<email>jch@irif.fr</email> | ||||
</address> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
<date day="4" month="September" year="2020"/> | <keyword>routing protocol</keyword> | |||
<keyword>authentication</keyword> | ||||
<keyword>replay</keyword> | ||||
<keyword>replay protection</keyword> | ||||
<abstract> | <abstract> | |||
<t>This document describes a cryptographic authentication mechanism for | <t>This document describes a cryptographic authentication mechanism for | |||
the Babel routing protocol that has provisions for replay avoidance. This | the Babel routing protocol that has provisions for replay avoidance. This | |||
document obsoletes RFC 7298.</t> | document obsoletes RFC 7298.</t> | |||
</abstract> | </abstract> | |||
</front> | ||||
</front> | <middle> | |||
<section numbered="true" toc="default"> | ||||
<middle> | <name>Introduction</name> | |||
<t>By default, the Babel routing protocol <xref target="RFC8966" format="d | ||||
<section title="Introduction"> | efault"/> | |||
trusts the information contained | ||||
<t>By default, the Babel routing protocol trusts the information contained | ||||
in every UDP datagram that it receives on the Babel port. An attacker can | in every UDP datagram that it receives on the Babel port. An attacker can | |||
redirect traffic to itself or to a different node in the network, causing | redirect traffic to itself or to a different node in the network, causing | |||
a variety of potential issues. In particular, an attacker might: | a variety of potential issues. In particular, an attacker might: | |||
<list style="symbols"> | </t> | |||
<t>spoof a Babel packet, and redirect traffic by announcing a route with | ||||
a smaller metric, a larger sequence number, or a longer prefix;</t> | ||||
<t>spoof a malformed packet, which could cause an insufficiently robust | ||||
implementation to crash or interfere with the rest of the network;</t> | ||||
<t>replay a previously captured Babel packet, which could cause traffic to | ||||
be redirected or otherwise interfere with the network.</t> | ||||
</list></t> | ||||
<t>Protecting a Babel network is challenging due to the fact that the | <ul spacing="normal"> | |||
<li>spoof a Babel packet and redirect traffic by announcing a route with | ||||
a smaller metric, a larger sequence number, or a longer prefix;</li> | ||||
<li>spoof a malformed packet, which could cause an insufficiently robust | ||||
implementation to crash or interfere with the rest of the network;</li> | ||||
<li>replay a previously captured Babel packet, which could cause traffic | ||||
to | ||||
be redirected or otherwise interfere with the network.</li> | ||||
</ul> | ||||
<t>Protecting a Babel network is challenging due to the fact that the | ||||
Babel protocol uses both unicast and multicast communication. One | Babel protocol uses both unicast and multicast communication. One | |||
possible approach, used notably by the Babel over Datagram Transport Layer | possible approach, used notably by the Babel over Datagram Transport Layer | |||
Security (DTLS) protocol <xref target="I-D.ietf-babel-dtls"/>, is to use | Security (DTLS) protocol <xref target="RFC8968" format="default"/>, is to use | |||
unicast communication for all semantically significant communication, and | unicast communication for all semantically significant communication, and | |||
then use a standard unicast security protocol to protect the Babel | then use a standard unicast security protocol to protect the Babel | |||
traffic. In this document, we take the opposite approach: we define | traffic. In this document, we take the opposite approach: we define | |||
a cryptographic extension to the Babel protocol that is able to protect | a cryptographic extension to the Babel protocol that is able to protect | |||
both unicast and multicast traffic, and thus requires very few changes to | both unicast and multicast traffic and thus requires very few changes to | |||
the core protocol. This document obsoletes <xref target="RFC7298"/>.</t> | the core protocol. This document obsoletes <xref target="RFC7298" format="defau | |||
lt"/>.</t> | ||||
<section title="Applicability"> | <section numbered="true" toc="default"> | |||
<name>Applicability</name> | ||||
<t>The protocol defined in this document assumes that all interfaces on | <t>The protocol defined in this document assumes that all interfaces on | |||
a given link are equally trusted and share a small set of symmetric keys | a given link are equally trusted and share a small set of symmetric keys | |||
(usually just one, and two during key rotation). The protocol is inapplicable | (usually just one, and two during key rotation). The protocol is inapplicable | |||
in situations where asymmetric keying is required, where the trust | in situations where asymmetric keying is required, where the trust | |||
relationship is partial, or where large numbers of trusted keys are | relationship is partial, or where large numbers of trusted keys are | |||
provisioned on a single link at the same time.</t> | provisioned on a single link at the same time.</t> | |||
<t>This protocol supports incremental deployment (where an insecure Babe | ||||
<t>This protocol supports incremental deployment (where an insecure Babel | l | |||
network is made secure with no service interruption), and it supports | network is made secure with no service interruption), and it supports | |||
graceful key rotation (where the set of keys is changed with no service | graceful key rotation (where the set of keys is changed with no service | |||
interruption).</t> | interruption).</t> | |||
<t>This protocol does not require synchronised clocks, it does not require | <t>This protocol does not require synchronised clocks, it does not requi re | |||
persistently monotonic clocks, and it does not require persistent storage | persistently monotonic clocks, and it does not require persistent storage | |||
except for what might be required for storing cryptographic keys.</t> | except for what might be required for storing cryptographic keys.</t> | |||
</section> | ||||
</section> | <section anchor="security-properties" numbered="true" toc="default"> | |||
<name>Assumptions and Security Properties</name> | ||||
<section title="Assumptions and security properties" | <t>The correctness of the protocol relies on the following assumptions: | |||
anchor="security-properties"> | </t> | |||
<ul spacing="normal"> | ||||
<t>The correctness of the protocol relies on the following assumptions: | <li>that the Message Authentication Code (MAC) being used is invulnera | |||
<list style="symbols"> | ble | |||
<t>that the Message Authentication Code (MAC) being used is invulnerable | ||||
to forgery, i.e., that an attacker is unable to generate a packet with | to forgery, i.e., that an attacker is unable to generate a packet with | |||
a correct MAC without access to the secret key;</t> | a correct MAC without access to the secret key;</li> | |||
<t>that a node never generates the same index or nonce twice over the | <li>that a node never generates the same index or nonce twice over the | |||
lifetime of a key.</t> | lifetime of a key.</li> | |||
</list> | </ul> | |||
<t> | ||||
The first assumption is a property of the MAC being used. The second | The first assumption is a property of the MAC being used. The second | |||
assumption can be met either by using a robust random number generator | assumption can be met either by using a robust random number generator | |||
<xref target="RFC4086"/> and sufficiently large indices and nonces, by | <xref target="RFC4086" format="default"/> and sufficiently large indices and non ces, by | |||
using a reliable hardware clock, or by rekeying often enough that | using a reliable hardware clock, or by rekeying often enough that | |||
collisions are unlikely.</t> | collisions are unlikely.</t> | |||
<t>If the assumptions above are met, the protocol described in this | ||||
<t>If the assumptions above are met, the protocol described in this | ||||
document has the following properties: | document has the following properties: | |||
<list style="symbols"> | </t> | |||
<t>it is invulnerable to spoofing: any Babel packet accepted as authentic | <ul spacing="normal"> | |||
is the exact copy of a packet originally sent by an authorised node;</t> | <li>it is invulnerable to spoofing: any Babel packet accepted as authe | |||
<t>locally to a single node, it is invulnerable to replay: if a node has | ntic | |||
is the exact copy of a packet originally sent by an authorised node;</li> | ||||
<li>locally to a single node, it is invulnerable to replay: if a node | ||||
has | ||||
previously accepted a given packet, then it will never again accept a copy | previously accepted a given packet, then it will never again accept a copy | |||
of this packet or an earlier packet from the same sender;</t> | of this packet or an earlier packet from the same sender;</li> | |||
<t>among different nodes, it is only vulnerable to immediate replay: if | <li>among different nodes, it is only vulnerable to immediate replay: | |||
if | ||||
a node A has accepted an authentic packet from C, then a node B will only | a node A has accepted an authentic packet from C, then a node B will only | |||
accept a copy of that packet if B has accepted an older packet from C and | accept a copy of that packet if B has accepted an older packet from C, and | |||
B has received no later packet from C.</t> | B has received no later packet from C.</li> | |||
</list></t> | </ul> | |||
<t>While this protocol makes efforts to mitigate the effects of a denial | ||||
<t>While this protocol makes efforts to mitigate the effects of a denial | ||||
of service attack, it does not fully protect against such attacks.</t> | of service attack, it does not fully protect against such attacks.</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<name>Specification of Requirements</name> | ||||
<section title="Specification of Requirements"> | <t> | |||
The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | ||||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14 | |||
"OPTIONAL" in this document are to be interpreted as described in BCP 14 | >", | |||
<xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, | "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bc | |||
they appear in all capitals, as shown here.</t> | p14>" | |||
in this document are to be interpreted as described in BCP 14 <xref target="RFC2 | ||||
</section> | 119"/> <xref target="RFC8174"/> | |||
when, and only when, they appear in all capitals, as shown here. | ||||
</section> | </t> | |||
</section> | ||||
<section title="Conceptual overview of the protocol"> | </section> | |||
<section numbered="true" toc="default"> | ||||
<t>When a node B sends out a Babel packet through an interface that is | <name>Conceptual Overview of the Protocol</name> | |||
<t>When a node B sends out a Babel packet through an interface that is | ||||
configured for MAC cryptographic protection, it computes one or more MACs | configured for MAC cryptographic protection, it computes one or more MACs | |||
(one per key) which it appends to the packet. When a node A receives | (one per key) that it appends to the packet. When a node A receives | |||
a packet over an interface that requires MAC cryptographic protection, it | a packet over an interface that requires MAC cryptographic protection, it | |||
independently computes a set of MACs and compares them to the MACs | independently computes a set of MACs and compares them to the MACs | |||
appended to the packet; if there is no match, the packet is discarded.</t> | appended to the packet; if there is no match, the packet is discarded.</t> | |||
<t>In order to protect against replay, B maintains a per-interface 32-bit | <t>In order to protect against replay, B maintains a per-interface 32-bit | |||
integer known as the "packet counter" (PC). Whenever B sends a packet | integer known as the "packet counter" (PC). Whenever B sends a packet | |||
through the interface, it embeds the current value of the PC within the | through the interface, it embeds the current value of the PC within the | |||
region of the packet that is protected by the MACs and increases the PC | region of the packet that is protected by the MACs and increases the PC | |||
by at least one. When A receives the packet, it compares the value of the | by at least one. When A receives the packet, it compares the value of the | |||
PC with the one contained in the previous packet received from B, and | PC with the one contained in the previous packet received from B, and | |||
unless it is strictly greater, the packet is discarded.</t> | unless it is strictly greater, the packet is discarded.</t> | |||
<t>By itself, the PC mechanism is not sufficient to protect against | ||||
<t>By itself, the PC mechanism is not sufficient to protect against | ||||
replay. Consider a peer A that has no information about a peer | replay. Consider a peer A that has no information about a peer | |||
B (e.g., because it has recently rebooted). Suppose that A receives | B (e.g., because it has recently rebooted). Suppose that A receives | |||
a packet ostensibly from B carrying a given PC; since A has no information | a packet ostensibly from B carrying a given PC; since A has no information | |||
about B, it has no way to determine whether the packet is freshly | about B, it has no way to determine whether the packet is freshly | |||
generated or a replay of a previously sent packet.</t> | generated or a replay of a previously sent packet.</t> | |||
<t>In this situation, peer A discards the packet and challenges B to prove | ||||
<t>In this situation, A discards the packet and challenges B to prove that | that | |||
it knows the MAC key. It sends a "challenge request", a TLV containing | it knows the MAC key. It sends a "Challenge Request", a TLV containing | |||
a unique nonce, a value that has never been used before and will never be | a unique nonce, a value that has never been used before and will never be | |||
used again. B replies to the challenge request with a "challenge reply", | used again. Peer B replies to the Challenge Request with a "Challenge Reply", | |||
a TLV containing a copy of the nonce chosen by A, in a packet protected by | a TLV containing a copy of the nonce chosen by A, in a packet protected by | |||
MAC and containing the new value of B's PC. Since the nonce has never | MAC and containing the new value of B's PC. Since the nonce has never | |||
been used before, B's reply proves B's knowledge of the MAC key and the | been used before, B's reply proves B's knowledge of the MAC key and the | |||
freshness of the PC.</t> | freshness of the PC.</t> | |||
<t>By itself, this mechanism is safe against replay if B never resets its | ||||
<t>By itself, this mechanism is safe against replay if B never resets its | ||||
PC. In practice, however, this is difficult to ensure, as persistent | PC. In practice, however, this is difficult to ensure, as persistent | |||
storage is prone to failure, and hardware clocks, even when available, are | storage is prone to failure, and hardware clocks, even when available, are | |||
occasionally reset. Suppose that B resets its PC to an earlier value, and | occasionally reset. Suppose that B resets its PC to an earlier value and | |||
sends a packet with a previously used PC n. A challenges B, | sends a packet with a previously used PC n. Peer A challenges B, | |||
B successfully responds to the challenge, and A accepts the PC equal to | B successfully responds to the challenge, and A accepts the PC equal to | |||
n + 1. At this point, an attacker C may send a replayed packet | n + 1. At this point, an attacker C may send a replayed packet | |||
with PC equal to n + 2, which will be accepted by A.</t> | with PC equal to n + 2, which will be accepted by A.</t> | |||
<t>Another mechanism is needed to protect against this attack. In this | ||||
<t>Another mechanism is needed to protect against this attack. In this | ||||
protocol, every PC is tagged with an "index", an arbitrary string of | protocol, every PC is tagged with an "index", an arbitrary string of | |||
octets. Whenever B resets its PC, or whenever B doesn't know whether its | octets. Whenever B resets its PC, or whenever B doesn't know whether its | |||
PC has been reset, it picks an index that it has never used before (either | PC has been reset, it picks an index that it has never used before (either | |||
by drawing it randomly or by using a reliable hardware clock) and starts | by drawing it randomly or by using a reliable hardware clock) and starts | |||
sending PCs with that index. Whenever A detects that B has changed its | sending PCs with that index. Whenever A detects that B has changed its | |||
index, it challenges B again.</t> | index, it challenges B again.</t> | |||
<t>With this additional mechanism, this protocol is invulnerable to replay | ||||
<t>With this additional mechanism, this protocol is invulnerable to replay | attacks (see <xref target="security-properties" format="default"/>).</t> | |||
attacks (see <xref target="security-properties"/> above).</t> | </section> | |||
<section numbered="true" toc="default"> | ||||
</section> | <name>Data Structures</name> | |||
<t>Every Babel node maintains a set of conceptual data structures | ||||
<section title="Data Structures"> | described in <xref target="RFC8966" sectionFormat="of" section="3.2"/>. This pr | |||
otocol | ||||
<t>Every Babel node maintains a set of conceptual data structures | ||||
described in Section 3.2 of <xref target="RFC6126bis"/>. This protocol | ||||
extends these data structures as follows.</t> | extends these data structures as follows.</t> | |||
<section anchor="interface-table" numbered="true" toc="default"> | ||||
<section title="The Interface Table" anchor="interface-table"> | <name>The Interface Table</name> | |||
<t>Every Babel node maintains an interface table, as described in | ||||
<t>Every Babel node maintains an interface table, as described in Section | <xref target="RFC8966" sectionFormat="of" section="3.2.3"/>. Implementations of | |||
3.2.3 of <xref target="RFC6126bis"/>. Implementations of this protocol MUST | this protocol <bcp14>MUST</bcp14> | |||
allow each interface to be provisioned with a set of one or more MAC keys | allow each interface to be provisioned with a set of one or more MAC keys | |||
and the associated MAC algorithms (see <xref target="mac-computation"/> | and the associated MAC algorithms (see <xref target="mac-computation" format="de | |||
for suggested algorithms, and <xref target="security-considerations"/> for | fault"/> | |||
for suggested algorithms and <xref target="security-considerations" format="defa | ||||
ult"/> for | ||||
suggested methods for key generation). In order to allow incremental | suggested methods for key generation). In order to allow incremental | |||
deployment of this protocol (see <xref target="incremental-deployment"/>), | deployment of this protocol (see <xref target="incremental-deployment" format="d | |||
implementations SHOULD allow an interface to be configured in a mode in | efault"/>), | |||
implementations <bcp14>SHOULD</bcp14> allow an interface to be configured in a m | ||||
ode in | ||||
which it participates in the MAC authentication protocol but accepts | which it participates in the MAC authentication protocol but accepts | |||
packets that are not authenticated.</t> | packets that are not authenticated.</t> | |||
<t>This protocol extends each table entry associated with | ||||
<t>This protocol extends each entry in this table that is associated with | ||||
an interface on which MAC authentication has been configured with two new | an interface on which MAC authentication has been configured with two new | |||
pieces of data: | pieces of data: | |||
<list style="symbols"> | </t> | |||
<t> a set of one or more MAC keys, each associated with a given MAC | <ul spacing="normal"> | |||
algorithm;</t> | <li> a set of one or more MAC keys, each associated with a given MAC | |||
<t> a pair (Index, PC), where Index is an arbitrary string of 0 to 32 | algorithm;</li> | |||
octets, and PC is a 32-bit (4-octet) integer.</t> | <li> a pair (Index, PC), where Index is an arbitrary string of 0 to 32 | |||
</list> | octets, and PC is a 32-bit (4-octet) integer.</li> | |||
</ul> | ||||
<t> | ||||
We say that an index is fresh when it has never been used before with any | We say that an index is fresh when it has never been used before with any | |||
of the keys currently configured on the interface. The Index field is | of the keys currently configured on the interface. The Index field is | |||
initialised to a fresh index, for example by drawing a random string of | initialised to a fresh index, for example, by drawing a random string of | |||
sufficient length (see <xref target="security-considerations"/> for | sufficient length (see <xref target="security-considerations" format="default"/> | |||
for | ||||
suggested sizes), and the PC is initialised to an arbitrary value | suggested sizes), and the PC is initialised to an arbitrary value | |||
(typically 0).</t> | (typically 0).</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="The Neighbour table"> | <name>The Neighbour Table</name> | |||
<t>Every Babel node maintains a neighbour table, as described in | <t>Every Babel node maintains a neighbour table, as described in | |||
Section 3.2.4 of <xref target="RFC6126bis"/>. This protocol extends each | <xref target="RFC8966" sectionFormat="of" section="3.2.4"/>. This protocol exte | |||
nds each | ||||
entry in this table with two new pieces of data: | entry in this table with two new pieces of data: | |||
<list style="symbols"> | </t> | |||
<t> a pair (Index, PC), where Index is a string of 0 to 32 octets, and PC | <ul spacing="normal"> | |||
is a 32-bit (4-octet) integer;</t> | <li> a pair (Index, PC), where Index is a string of 0 to 32 octets, an | |||
<t> a Nonce, which is an arbitrary string of 0 to 192 octets, and an | d PC | |||
associated challenge expiry timer.</t> | is a 32-bit (4-octet) integer;</li> | |||
</list> | <li> a Nonce, which is an arbitrary string of 0 to 192 octets, and an | |||
The Index and PC are initially undefined, and are managed as described in | associated challenge expiry timer.</li> | |||
<xref target="packet-reception"/>. The Nonce and challenge expiry timer are | </ul> | |||
initially undefined, and used as described in | <t> | |||
<xref target="sending-challenges"/>.</t> | The Index and PC are initially undefined, and they are managed as described in | |||
<xref target="packet-reception" format="default"/>. The Nonce and challenge exp | ||||
</section> | iry timer are | |||
initially undefined, and they are used as described in | ||||
</section> | <xref target="sending-challenges" format="default"/>.</t> | |||
</section> | ||||
<section title="Protocol Operation"> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="MAC computation" anchor="mac-computation"> | <name>Protocol Operation</name> | |||
<section anchor="mac-computation" numbered="true" toc="default"> | ||||
<t>A Babel node computes the MAC of a Babel packet as follows.</t> | <name>MAC Computation</name> | |||
<t>A Babel node computes the MAC of a Babel packet as follows.</t> | ||||
<t>First, the node builds a pseudo-header that will participate in MAC | <t>First, the node builds a pseudo-header that will participate in MAC | |||
computation but will not be sent. If the packet is carried over IPv6, | computation but will not be sent. If the packet is carried over IPv6, | |||
the pseudo-header has the following format: | the pseudo-header has the following format: | |||
<figure><artwork><![CDATA[ | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
0 1 2 3 | 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 | 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 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
+ + | + + | |||
| | | | | | |||
+ Src address + | + Src address + | |||
| | | | | | |||
+ + | + + | |||
| | | | | | |||
skipping to change at line 302 ¶ | skipping to change at line 294 ¶ | |||
| Src port | | | | Src port | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | |||
| | | | | | |||
+ + | + + | |||
| Dest address | | | Dest address | | |||
+ + | + + | |||
| | | | | | |||
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Dest port | | | | Dest port | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
]]></artwork></figure> | ]]></artwork> | |||
<t> | ||||
If the packet is carried over IPv4, the pseudo-header has the following | If the packet is carried over IPv4, the pseudo-header has the following | |||
format: | format: | |||
<figure><artwork><![CDATA[ | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
0 1 2 3 | 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 | 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 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Src address | | | Src address | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Src port | Dest address | | | Src port | Dest address | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Dest port | | | | Dest port | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
]]></artwork></figure></t> | ]]></artwork> | |||
<t>Fields : | ||||
<list style="hanging" hangIndent="14"> | <t>Fields: | |||
<t hangText="Src address">The source IP address of the packet.</t> | </t> | |||
<t hangText="Src port">The source UDP port number of the packet.</t> | <dl newline="false" spacing="normal" indent="14"> | |||
<t hangText="Dest address">The destination IP address of the packet.</t> | <dt>Src address</dt> | |||
<t hangText="Src port">The destination UDP port number of the packet.</t> | <dd>The source IP address of the packet.</dd> | |||
</list></t> | <dt>Src port</dt> | |||
<t>The node takes the concatenation of the pseudo-header and the Babel | <dd>The source UDP port number of the packet.</dd> | |||
<dt>Dest address</dt> | ||||
<dd>The destination IP address of the packet.</dd> | ||||
<dt>Src port</dt> | ||||
<dd>The destination UDP port number of the packet.</dd> | ||||
</dl> | ||||
<t>The node takes the concatenation of the pseudo-header and the Babel | ||||
packet including the packet header but excluding the packet trailer (from | packet including the packet header but excluding the packet trailer (from | |||
octet 0 inclusive up to (Body Length + 4) exclusive) and | octet 0 inclusive up to (Body Length + 4) exclusive) and | |||
computes a MAC with one of the implemented algorithms. Every | computes a MAC with one of the implemented algorithms. Every | |||
implementation MUST implement HMAC-SHA256 as defined in | implementation <bcp14>MUST</bcp14> implement HMAC-SHA256 as defined in | |||
<xref target="RFC6234"/> and Section 2 of <xref target="RFC2104"/>, | <xref target="RFC6234" format="default"/> and <xref target="RFC2104" sectionForm | |||
SHOULD implement keyed BLAKE2s <xref target="RFC7693"/>, and MAY implement | at="of" section="2"/>, | |||
<bcp14>SHOULD</bcp14> implement keyed BLAKE2s <xref target="RFC7693" format="def | ||||
ault"/> with 128-bit (16-octet) digests, and <bcp14>MAY</bcp14> implement | ||||
other MAC algorithms.</t> | other MAC algorithms.</t> | |||
</section> | </section> | |||
<section anchor="packet-transmission" numbered="true" toc="default"> | ||||
<section title="Packet Transmission" anchor="packet-transmission"> | <name>Packet Transmission</name> | |||
<t>A Babel node might delay actually sending TLVs by a small amount, in | ||||
<t>A Babel node might delay actually sending TLVs by a small amount, in | ||||
order to aggregate multiple TLVs in a single packet up to the | order to aggregate multiple TLVs in a single packet up to the | |||
interface MTU (Section 4 of <xref target="RFC6126bis"/>). For an | interface MTU (<xref target="RFC8966" sectionFormat="of" section="4"/>). For an | |||
interface on which MAC protection is configured, the TLV aggregation | interface on which MAC protection is configured, the TLV aggregation | |||
logic MUST take into account the overhead due to PC TLVs (one in each | logic <bcp14>MUST</bcp14> take into account the overhead due to PC TLVs (one in each | |||
packet) and MAC TLVs (one per configured key).</t> | packet) and MAC TLVs (one per configured key).</t> | |||
<t>Before sending a packet, the following actions are performed: | ||||
<t>Before sending a packet, the following actions are performed: | </t> | |||
<list style="symbols"> | <ul spacing="normal"> | |||
<t>a PC TLV containing the PC and Index associated with the | <li> | |||
outgoing interface MUST be appended to the packet body; the PC MUST be | <t>a PC TLV containing the PC and Index associated with the | |||
incremented by a strictly positive amount (typically just 1); if the | outgoing interface <bcp14>MUST</bcp14> be appended to the packet body;</t> | |||
PC overflows, a fresh index MUST be generated (as defined in | <ul> | |||
<xref target="interface-table"/>); a node MUST NOT include multiple PC | <li>the PC <bcp14>MUST</bcp14> be | |||
TLVs in a single packet;</t> | incremented by a strictly positive amount (typically just 1);</li> | |||
<t>for each key configured on the interface, a MAC is computed as | <li>if the | |||
specified in <xref target="mac-computation"/> above, and stored in a | PC overflows, a fresh index <bcp14>MUST</bcp14> be generated (as defined in | |||
MAC TLV that MUST be appended to the packet trailer (see Section 4.2 of | <xref target="interface-table" format="default"/>); </li> | |||
<xref target="RFC6126bis"/>).</t> | </ul> | |||
</list></t> | <t>a node <bcp14>MUST NOT</bcp14> include multiple PC | |||
TLVs in a single packet;</t> | ||||
</section> | </li> | |||
<li>for each key configured on the interface, a MAC is computed as | ||||
<section title="Packet Reception" anchor="packet-reception"> | specified in <xref target="mac-computation" format="default"/> and stored in a | |||
MAC TLV that <bcp14>MUST</bcp14> be appended to the packet trailer (see | ||||
<t>When a packet is received on an interface that is configured for MAC | <xref target="RFC8966" sectionFormat="of" section="4.2"/>).</li> | |||
</ul> | ||||
</section> | ||||
<section anchor="packet-reception" numbered="true" toc="default"> | ||||
<name>Packet Reception</name> | ||||
<t>When a packet is received on an interface that is configured for MAC | ||||
protection, the following steps are performed before the packet is passed | protection, the following steps are performed before the packet is passed | |||
to normal processing: | to normal processing: | |||
</t> | </t> | |||
<t> | <ul spacing="normal"> | |||
<list style="symbols"> | <li>First, the receiver checks whether the trailer of the received pac | |||
<t>First, the receiver checks whether the trailer of the received packet | ket | |||
carries at least one MAC TLV; if not, the packet MUST be immediately dropped | carries at least one MAC TLV; if not, the packet <bcp14>MUST</bcp14> be immediat | |||
ely dropped | ||||
and processing stops. Then, for each key configured on the receiving | and processing stops. Then, for each key configured on the receiving | |||
interface, the receiver computes the MAC of the packet. It then | interface, the receiver computes the MAC of the packet. It then | |||
compares every generated MAC against every MAC included in the packet; | compares every generated MAC against every MAC included in the packet; | |||
if there is at least one match, the packet passes the MAC test; if there | if there is at least one match, the packet passes the MAC test; if there | |||
is none, the packet MUST be silently dropped and processing stops at this | is none, the packet <bcp14>MUST</bcp14> be silently dropped and processing stops at this | |||
point. In order to avoid memory exhaustion attacks, an entry in the | point. In order to avoid memory exhaustion attacks, an entry in the | |||
Neighbour Table MUST NOT be created before the MAC test has passed | neighbour table <bcp14>MUST NOT</bcp14> be created before the MAC test has passe | |||
successfully. The MAC of the packet MUST NOT be computed for each MAC | d | |||
TLV contained in the packet, but only once for each configured key.</t> | successfully. The MAC of the packet <bcp14>MUST NOT</bcp14> be computed for eac | |||
<t>If an entry for the sender does not exist in the Neighbour Table, it | h MAC | |||
MAY be created at this point (or, alternatively, its creation can be | TLV contained in the packet, but only once for each configured key.</li> | |||
delayed until a challenge needs to be sent, see below);</t> | <li>If an entry for the sender does not exist in the neighbour table, | |||
<t>The packet body is then parsed a first time. During this "preparse" | it | |||
<bcp14>MAY</bcp14> be created at this point (or, alternatively, its creation can | ||||
be | ||||
delayed until a challenge needs to be sent, see below).</li> | ||||
<li>The packet body is then parsed a first time. During this "prepars | ||||
e" | ||||
phase, the packet body is traversed and all TLVs are ignored except PC, | phase, the packet body is traversed and all TLVs are ignored except PC, | |||
Challenge Request and Challenge Reply TLVs. When a PC TLV is | Challenge Request, and Challenge Reply TLVs. When a PC TLV is | |||
encountered, the enclosed PC and Index are saved for later processing; if | encountered, the enclosed PC and Index are saved for later processing. If | |||
multiple PCs are found (which should not happen, see | multiple PCs are found (which should not happen, see | |||
<xref target="packet-transmission"/> above), only the first one is | <xref target="packet-transmission" format="default"/>), only the first one is | |||
processed, the remaining ones MUST be silently ignored. If a Challenge | processed, the remaining ones <bcp14>MUST</bcp14> be silently ignored. If a Cha | |||
Request is encountered, a Challenge Reply MUST be scheduled, as described | llenge | |||
in <xref target="replying-challenges"/>. If a Challenge Reply is | Request is encountered, a Challenge Reply <bcp14>MUST</bcp14> be scheduled, as d | |||
escribed | ||||
in <xref target="replying-challenges" format="default"/>. If a Challenge Reply | ||||
is | ||||
encountered, it is tested for validity as described in | encountered, it is tested for validity as described in | |||
<xref target="receiving-challenges"/> and a note is made of the result of | <xref target="receiving-challenges" format="default"/>, and a note is made of th | |||
the test.</t> | e result of | |||
<t>The preparse phase above has yielded two pieces of data: the PC and | the test.</li> | |||
<li>The preparse phase above yields two pieces of data: the PC and | ||||
Index from the first PC TLV, and a bit indicating whether the packet | Index from the first PC TLV, and a bit indicating whether the packet | |||
contains a successful Challenge Reply. If the packet does not contain | contains a successful Challenge Reply. If the packet does not contain | |||
a PC TLV, the packet MUST be dropped and processing stops at this point. | a PC TLV, the packet <bcp14>MUST</bcp14> be dropped, and processing stops at thi s point. | |||
If the packet contains a successful Challenge Reply, then the PC and Index | If the packet contains a successful Challenge Reply, then the PC and Index | |||
contained in the PC TLV MUST be stored in the Neighbour Table entry | contained in the PC TLV <bcp14>MUST</bcp14> be stored in the neighbour table ent ry | |||
corresponding to the sender (which already exists in this case), and the | corresponding to the sender (which already exists in this case), and the | |||
packet is accepted.</t> | packet is accepted.</li> | |||
<t>Otherwise, if there is no entry in the Neighbour Table corresponding to | ||||
<li>Otherwise, if there is no entry in the neighbour table correspondi | ||||
ng to | ||||
the sender, or if such an entry exists but contains no Index, or if the | the sender, or if such an entry exists but contains no Index, or if the | |||
Index it contains is different from the Index contained in the PC TLV, | Index it contains is different from the Index contained in the PC TLV, | |||
then a challenge MUST be sent as described in | then a challenge <bcp14>MUST</bcp14> be sent as described in | |||
<xref target="sending-challenges"/>, the packet MUST be dropped, and | <xref target="sending-challenges" format="default"/>, the packet <bcp14>MUST</bc | |||
processing stops at this stage.</t> | p14> be dropped, and | |||
<t>At this stage, the packet contains no successful challenge reply and | processing stops at this stage.</li> | |||
the Index contained in the PC TLV is equal to the Index in the Neighbour | <li>At this stage, the packet contains no successful Challenge Reply, | |||
Table entry corresponding to the sender. The receiver compares the | and | |||
received PC with the PC contained in the Neighbour Table; if the received | the Index contained in the PC TLV is equal to the Index in the neighbour | |||
PC is smaller or equal than the PC contained in the Neighbour Table, the | table entry corresponding to the sender. The receiver compares the | |||
packet MUST be dropped and processing stops (no challenge is sent in this | received PC with the PC contained in the neighbour table; if the received | |||
PC is smaller or equal than the PC contained in the neighbour table, the | ||||
packet <bcp14>MUST</bcp14> be dropped and processing stops (no challenge is sent | ||||
in this | ||||
case, since the mismatch might be caused by harmless packet reordering on | case, since the mismatch might be caused by harmless packet reordering on | |||
the link). Otherwise, the PC contained in the Neighbour Table entry is | the link). Otherwise, the PC contained in the neighbour table entry is | |||
set to the received PC, and the packet is accepted.</t> | set to the received PC, and the packet is accepted.</li> | |||
</list></t> | </ul> | |||
<t>In the algorithm described above, Challenge Requests are processed an | ||||
<t>In the algorithm described above, challenge requests are processed and | d | |||
challenges are sent before the PC/Index pair is verified against the | challenges are sent before the (Index, PC) pair is verified against the | |||
neighbour table. This simplifies the implementation somewhat (the node | neighbour table. This simplifies the implementation somewhat (the node | |||
may simply schedule outgoing requests as it walks the packet during the | may simply schedule outgoing requests as it walks the packet during the | |||
preparse phase), but relies on the rate-limiting described in | preparse phase) but relies on the rate limiting described in | |||
<xref target="sending-challenges"/> to avoid sending too many challenges | <xref target="sending-challenges" format="default"/> to avoid sending too many c | |||
in response to replayed packets. As an optimisation, a node MAY ignore | hallenges | |||
all challenge requests contained in a packet except the last one, and it | in response to replayed packets. As an optimisation, a node <bcp14>MAY</bcp14> | |||
MAY ignore a challenge request in the case where it is contained in | ignore | |||
a packet with an Index that matches the one in the Neighbour Table and | all Challenge Requests contained in a packet except the last one, and it | |||
a PC that is smaller or equal to the one contained in the Neighbour Table. | <bcp14>MAY</bcp14> ignore a Challenge Request in the case where it is contained | |||
in | ||||
a packet with an Index that matches the one in the neighbour table and | ||||
a PC that is smaller or equal to the one contained in the neighbour table. | ||||
Since it is still possible to replay a packet with an obsolete Index, the | Since it is still possible to replay a packet with an obsolete Index, the | |||
rate-limiting described in <xref target="sending-challenges"/> is | rate limiting described in <xref target="sending-challenges" format="default"/> is | |||
required even if this optimisation is implemented.</t> | required even if this optimisation is implemented.</t> | |||
<t>The same is true of Challenge Replies. However, since validating | ||||
<t>The same is true of challenge replies. However, since validating | a Challenge Reply has minimal additional cost (it is just a bitwise | |||
a challenge reply has minimal additional cost (it's just a bitwise | comparison of two strings of octets), a similar optimisation for Challenge | |||
comparison of two strings of octets), a similar optimisation for challenge | Replies is not worthwhile.</t> | |||
replies is not worthwhile.</t> | <t>After the packet has been accepted, it is processed as normal, except | |||
that any PC, Challenge Request, and Challenge Reply TLVs that it contains | ||||
<t>After the packet has been accepted, it is processed as normal, except | ||||
that any PC, Challenge Request and Challenge Reply TLVs that it contains | ||||
are silently ignored.</t> | are silently ignored.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Challenge requests and replies"> | <name>Challenge Requests and Replies</name> | |||
<t>During the preparse stage, the receiver might encounter a mismatche | ||||
<t>During the preparse stage, the receiver might encounter a mismatched | d | |||
Index, to which it will react by scheduling a Challenge Request. It might | Index, to which it will react by scheduling a Challenge Request. It might | |||
encounter a Challenge Request TLV, to which it will reply with a Challenge | encounter a Challenge Request TLV, to which it will reply with a Challenge | |||
Reply TLV. Finally, it might encounter a Challenge Reply TLV, which it | Reply TLV. Finally, it might encounter a Challenge Reply TLV, which it | |||
will attempt to match with a previously sent Challenge Request TLV in | will attempt to match with a previously sent Challenge Request TLV in | |||
order to update the Neighbour Table entry corresponding to the sender of | order to update the neighbour table entry corresponding to the sender of | |||
the packet.</t> | the packet.</t> | |||
<section anchor="sending-challenges" numbered="true" toc="default"> | ||||
<section title="Sending challenges" anchor="sending-challenges"> | <name>Sending Challenges</name> | |||
<t>When it encounters a mismatched Index during the preparse phase, | ||||
<t>When it encounters a mismatched Index during the preparse phase, a node | a node | |||
picks a nonce that it has never used with any of the keys currently | picks a nonce that it has never used with any of the keys currently | |||
configured on the relevant interface, for example by drawing | configured on the relevant interface, for example, by drawing | |||
a sufficiently large random string of bytes or by consulting a strictly | a sufficiently large random string of bytes or by consulting a strictly | |||
monotonic hardware clock. It MUST then store the nonce in the entry of | monotonic hardware clock. It <bcp14>MUST</bcp14> then store the nonce in the en | |||
the Neighbour Table associated to the neighbour (the entry might need to | try of | |||
the neighbour table associated to the neighbour (the entry might need to | ||||
be created at this stage), initialise the neighbour's challenge expiry | be created at this stage), initialise the neighbour's challenge expiry | |||
timer to 30 seconds, and send a Challenge Request TLV to the unicast | timer to 30 seconds, and send a Challenge Request TLV to the unicast | |||
address corresponding to the neighbour.</t> | address corresponding to the neighbour.</t> | |||
<t>A node <bcp14>MAY</bcp14> aggregate a Challenge Request with othe | ||||
<t>A node MAY aggregate a Challenge Request with other TLVs; in other | r TLVs; in other | |||
words, if it has already buffered TLVs to be sent to the unicast address | words, if it has already buffered TLVs to be sent to the unicast address | |||
of the neighbour, it MAY send the buffered TLVs in the same packet as the | of the neighbour, it <bcp14>MAY</bcp14> send the buffered TLVs in the same packe | |||
Challenge Request. However, it MUST arrange for the Challenge Request to | t as the | |||
Challenge Request. However, it <bcp14>MUST</bcp14> arrange for the Challenge Re | ||||
quest to | ||||
be sent in a timely manner, as any packets received from that neighbour | be sent in a timely manner, as any packets received from that neighbour | |||
will be silently ignored until the challenge completes.</t> | will be silently ignored until the challenge completes.</t> | |||
<t>A node <bcp14>MUST</bcp14> impose a rate limitation to the challe | ||||
<t>A node MUST impose a rate limitation to the challenges it sends; the | nges it sends; the | |||
limit SHOULD default to one challenge request every 300ms, and MAY be | limit <bcp14>SHOULD</bcp14> default to one Challenge Request every 300 ms and <b | |||
cp14>MAY</bcp14> be | ||||
configurable. This rate limiting serves two purposes. First, since | configurable. This rate limiting serves two purposes. First, since | |||
a challenge may be sent in response to a packet replayed by an attacker, | a challenge may be sent in response to a packet replayed by an attacker, | |||
it limits the number of challenges that an attacker can cause a node to | it limits the number of challenges that an attacker can cause a node to | |||
send. Second, it limits the number of challenges sent when there are | send. Second, it limits the number of challenges sent when there are | |||
multiple packets in flight from a single neighbour.</t> | multiple packets in flight from a single neighbour.</t> | |||
</section> | ||||
</section> | <section anchor="replying-challenges" numbered="true" toc="default"> | |||
<name>Replying to Challenges</name> | ||||
<section title="Replying to challenges" anchor="replying-challenges"> | <t>When it encounters a Challenge Request during the preparse phase, | |||
<t>When it encounters a Challenge Request during the preparse phase, | ||||
a node constructs a Challenge Reply TLV by copying the Nonce from the | a node constructs a Challenge Reply TLV by copying the Nonce from the | |||
Challenge Request into the Challenge Reply. It MUST then send the | Challenge Request into the Challenge Reply. It <bcp14>MUST</bcp14> then send th e | |||
Challenge Reply to the unicast address from which the Challenge Request | Challenge Reply to the unicast address from which the Challenge Request | |||
was sent. A challenge sent to a multicast address MUST be silently ignored.</t> | was sent. A challenge sent to a multicast address <bcp14>MUST</bcp14> be silent | |||
ly ignored.</t> | ||||
<t>A node MAY aggregate a Challenge Reply with other TLVs; in other words, | <t>A node <bcp14>MAY</bcp14> aggregate a Challenge Reply with other | |||
TLVs; in other words, | ||||
if it has already buffered TLVs to be sent to the unicast address of the | if it has already buffered TLVs to be sent to the unicast address of the | |||
sender of the Challenge Request, it MAY send the buffered TLVs in the same | sender of the Challenge Request, it <bcp14>MAY</bcp14> send the buffered TLVs in | |||
packet as the Challenge Reply. However, it MUST arrange for the Challenge | the same | |||
Reply to be sent in a timely manner (within a few seconds), and SHOULD NOT | packet as the Challenge Reply. However, it <bcp14>MUST</bcp14> arrange for the | |||
Challenge | ||||
Reply to be sent in a timely manner (within a few seconds) and <bcp14>SHOULD NOT | ||||
</bcp14> | ||||
send any other packets over the same interface before sending the | send any other packets over the same interface before sending the | |||
Challenge Reply, as those would be dropped by the challenger.</t> | Challenge Reply, as those would be dropped by the challenger.</t> | |||
<t>Since a Challenge Reply might be caused by a replayed Challenge R | ||||
<t>Since a challenge reply might be caused by a replayed challenge request, | equest, | |||
a node MUST impose a rate limitation to the challenge replies it sends; | a node <bcp14>MUST</bcp14> impose a rate limitation to the Challenge Replies it | |||
the limit SHOULD default to one challenge reply for each peer every | sends; | |||
300ms and MAY be configurable.</t> | the limit <bcp14>SHOULD</bcp14> default to one Challenge Reply for each peer eve | |||
ry | ||||
</section> | 300 ms and <bcp14>MAY</bcp14> be configurable.</t> | |||
</section> | ||||
<section title="Receiving challenge replies" anchor="receiving-challenges"> | <section anchor="receiving-challenges" numbered="true" toc="default"> | |||
<name>Receiving Challenge Replies</name> | ||||
<t>When it encounters a Challenge Reply during the preparse phase, a node | <t>When it encounters a Challenge Reply during the preparse phase, a | |||
consults the Neighbour Table entry corresponding to the neighbour that | node | |||
consults the neighbour table entry corresponding to the neighbour that | ||||
sent the Challenge Reply. If no challenge is in progress, i.e., if | sent the Challenge Reply. If no challenge is in progress, i.e., if | |||
there is no Nonce stored in the Neighbour Table entry or the challenge | there is no Nonce stored in the neighbour table entry or the challenge | |||
timer has expired, the Challenge Reply MUST be silently ignored and the | timer has expired, the Challenge Reply <bcp14>MUST</bcp14> be silently ignored, | |||
and the | ||||
challenge has failed.</t> | challenge has failed.</t> | |||
<t>Otherwise, the node compares the Nonce contained in the Challenge | ||||
<t>Otherwise, the node compares the Nonce contained in the Challenge Reply | Reply | |||
with the Nonce contained in the Neighbour Table entry. If the two are | with the Nonce contained in the neighbour table entry. If the two are | |||
equal (they have the same length and content), then the challenge has | equal (they have the same length and content), then the challenge has | |||
succeeded and the nonce stored in the Neighbour Table for this neighbour | succeeded and the nonce stored in the neighbour table for this neighbour | |||
SHOULD be discarded; otherwise, the challenge has failed (and the nonce is | <bcp14>SHOULD</bcp14> be discarded; otherwise, the challenge has failed (and the | |||
nonce is | ||||
not discarded).</t> | not discarded).</t> | |||
</section> | ||||
</section> | </section> | |||
</section> | ||||
</section> | <section anchor="expire" numbered="true" toc="default"> | |||
<name>Expiring Per-Neighbour State</name> | ||||
</section> | <t>The per-neighbour (Index, PC) pair is maintained in the neighbour | |||
<section title="Expiring per-neighbour state" anchor="expire"> | ||||
<t>The per-neighbour (Index, PC) pair is maintained in the neighbour | ||||
table, and is normally discarded when the neighbour table entry expires. | table, and is normally discarded when the neighbour table entry expires. | |||
Implementations MUST ensure that an (Index, PC) pair is discarded within | Implementations <bcp14>MUST</bcp14> ensure that an (Index, PC) pair is discarded within | |||
a finite time since the last time a packet has been accepted. In | a finite time since the last time a packet has been accepted. In | |||
particular, unsuccessful challenges MUST NOT prevent an (Index, PC) pair | particular, unsuccessful challenges <bcp14>MUST NOT</bcp14> prevent an (Index, P C) pair | |||
from being discarded for unbounded periods of time.</t> | from being discarded for unbounded periods of time.</t> | |||
<t>A possible implementation strategy for implementations that use a Hel | ||||
<t>A possible implementation strategy for implementations that use a Hello | lo | |||
history (Appendix A of <xref target="RFC6126bis"/>) is to discard the | history (Appendix A of <xref target="RFC8966" format="default"/>) is to discard | |||
the | ||||
(Index, PC) pair whenever the Hello history becomes empty. Another | (Index, PC) pair whenever the Hello history becomes empty. Another | |||
implementation strategy is to use a timer that is reset whenever a packet | implementation strategy is to use a timer that is reset whenever a packet | |||
is accepted, and to discard the (Index, PC) pair whenever the timer | is accepted and to discard the (Index, PC) pair whenever the timer | |||
expires. If the latter strategy is being used, the timer SHOULD default | expires. If the latter strategy is used, the timer <bcp14>SHOULD</bcp14> defaul | |||
to a value of 5 min, and MAY be configurable.</t> | t | |||
to a value of 5 minutes and <bcp14>MAY</bcp14> be configurable.</t> | ||||
</section> | </section> | |||
</section> | ||||
</section> | <section anchor="incremental-deployment" numbered="true" toc="default"> | |||
<name>Incremental Deployment and Key Rotation</name> | ||||
<section title="Incremental deployment and key rotation" | <t>In order to perform incremental deployment, the nodes in the network | |||
anchor="incremental-deployment"> | ||||
<t>In order to perform incremental deployment, the nodes in the network | ||||
are first configured in a mode where packets are sent with authentication | are first configured in a mode where packets are sent with authentication | |||
but not checked on reception. Once all the nodes in the network are | but not checked on reception. Once all the nodes in the network are | |||
configured to send authenticated packets, nodes are reconfigured to reject | configured to send authenticated packets, nodes are reconfigured to reject | |||
unauthenticated packets.</t> | unauthenticated packets.</t> | |||
<t>In order to perform key rotation, the new key is added to all the | ||||
<t>In order to perform key rotation, the new key is added to all the | nodes. Once this is done, both the old and the new key are sent in all | |||
nodes; once this is done, both the old and the new key are sent in all | ||||
packets, and packets are accepted if they are properly signed by either of | packets, and packets are accepted if they are properly signed by either of | |||
the keys. At that point, the old key is removed.</t> | the keys. At that point, the old key is removed.</t> | |||
<t>In order to support the procedures described above, implementations of | ||||
<t>In order to support the procedures described above, implementations of | this protocol <bcp14>SHOULD</bcp14> support an interface configuration in which | |||
this protocol SHOULD support an interface configuration in which packets | packets | |||
are sent authenticated but received packets are accepted without | are sent authenticated but received packets are accepted without | |||
verification, and they SHOULD allow changing the set of keys associated | verification, and they <bcp14>SHOULD</bcp14> allow changing the set of keys asso ciated | |||
with an interface without a restart.</t> | with an interface without a restart.</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<name>Packet Format</name> | ||||
<section title="Packet Format"> | <section numbered="true" toc="default"> | |||
<name>MAC TLV</name> | ||||
<section title="MAC TLV"> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<figure><artwork><![CDATA[ | ||||
0 1 2 3 | 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 | 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 = 16 | Length | MAC... | | Type = 16 | Length | MAC... | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- | |||
]]></artwork></figure> | ]]></artwork> | |||
<t>Fields: | ||||
<t>Fields : | </t> | |||
<list style="hanging" hangIndent="10"> | <dl newline="false" spacing="normal" indent="10"> | |||
<t hangText="Type">Set to 16 to indicate a MAC TLV.</t> | <dt>Type</dt> | |||
<t hangText="Length">The length of the body, in octets, exclusive of the | <dd>Set to 16 to indicate a MAC TLV.</dd> | |||
<dt>Length</dt> | ||||
<dd>The length of the body, in octets, exclusive of the | ||||
Type and Length fields. The length depends on the MAC algorithm being | Type and Length fields. The length depends on the MAC algorithm being | |||
used.</t> | used.</dd> | |||
<t hangText="MAC">The body contains the MAC of the packet, computed as | <dt>MAC</dt> | |||
described in <xref target="mac-computation"/>.</t> | <dd>The body contains the MAC of the packet, computed as | |||
</list></t> | described in <xref target="mac-computation" format="default"/>.</dd> | |||
</dl> | ||||
<t>This TLV is allowed in the packet trailer (see Section 4.2 of | <t>This TLV is allowed in the packet trailer (see | |||
<xref target="RFC6126bis"/>), and MUST be ignored if it is found in the | <xref target="RFC8966" sectionFormat="of" section="4.2"/>) and <bcp14>MUST</bcp1 | |||
4> be ignored if it is found in the | ||||
packet body.</t> | packet body.</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<name>PC TLV</name> | ||||
<section title="PC TLV"> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<figure><artwork><![CDATA[ | ||||
0 1 2 3 | 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 | 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 = 17 | Length | PC | | | Type = 17 | Length | PC | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Index... | | | Index... | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- | |||
]]></artwork></figure> | ]]></artwork> | |||
<t>Fields: | ||||
<t>Fields : | </t> | |||
<list style="hanging" hangIndent="10"> | <dl newline="false" spacing="normal" indent="10"> | |||
<t hangText="Type">Set to 17 to indicate a PC TLV.</t> | <dt>Type</dt> | |||
<t hangText="Length">The length of the body, in octets, exclusive of the | <dd>Set to 17 to indicate a PC TLV.</dd> | |||
Type and Length fields.</t> | <dt>Length</dt> | |||
<t hangText="PC">The Packet Counter (PC), a 32-bit (4-octet) unsigned | <dd>The length of the body, in octets, exclusive of the | |||
integer which is increased with every packet sent over this interface. | Type and Length fields.</dd> | |||
A fresh index (as defined in <xref target="interface-table"/>) MUST be | <dt>PC</dt> | |||
generated whenever the PC overflows.</t> | <dd>The Packet Counter (PC), a 32-bit (4-octet) unsigned | |||
<t hangText="Index">The sender's Index, an opaque string of 0 to 32 | integer that is increased with every packet sent over this interface. | |||
octets.</t> | A fresh index (as defined in <xref target="interface-table" format="default"/>) | |||
</list></t> | <bcp14>MUST</bcp14> be | |||
generated whenever the PC overflows.</dd> | ||||
<t>Indices are limited to a size of 32 octets: a node MUST NOT send a TLV | <dt>Index</dt> | |||
with an index of size strictly larger than 32 octets, and a node MAY | <dd>The sender's Index, an opaque string of 0 to 32 | |||
octets.</dd> | ||||
</dl> | ||||
<t>Indices are limited to a size of 32 octets: a node <bcp14>MUST NOT</b | ||||
cp14> send a TLV | ||||
with an index of size strictly larger than 32 octets, and a node <bcp14>MAY</bcp | ||||
14> | ||||
ignore a PC TLV with an index of length strictly larger than 32 octets. | ignore a PC TLV with an index of length strictly larger than 32 octets. | |||
Indices of length 0 are valid: if a node has reliable stable storage and | Indices of length 0 are valid: if a node has reliable stable storage and | |||
the packet counter never overflows, then only one index is necessary, and | the packet counter never overflows, then only one index is necessary, and | |||
the value of length 0 is the canonical choice.</t> | the value of length 0 is the canonical choice.</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<name>Challenge Request TLV</name> | ||||
<section title="Challenge Request TLV"> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<figure><artwork><![CDATA[ | ||||
0 1 2 3 | 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 | 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 = 18 | Length | Nonce... | | Type = 18 | Length | Nonce... | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- | |||
]]></artwork></figure> | ]]></artwork> | |||
<t>Fields: | ||||
<t>Fields : | </t> | |||
<list style="hanging" hangIndent="10"> | <dl newline="false" spacing="normal" indent="10"> | |||
<t hangText="Type">Set to 18 to indicate a Challenge Request TLV.</t> | <dt>Type</dt> | |||
<t hangText="Length">The length of the body, in octets, exclusive of the | <dd>Set to 18 to indicate a Challenge Request TLV.</dd> | |||
Type and Length fields.</t> | <dt>Length</dt> | |||
<t hangText="Nonce">The nonce uniquely identifying the challenge, an | <dd>The length of the body, in octets, exclusive of the | |||
opaque string of 0 to 192 octets.</t> | Type and Length fields.</dd> | |||
</list></t> | <dt>Nonce</dt> | |||
<dd>The nonce uniquely identifying the challenge, an | ||||
<t>Nonces are limited to a size of 192 octets: a node MUST NOT send | opaque string of 0 to 192 octets.</dd> | |||
</dl> | ||||
<t>Nonces are limited to a size of 192 octets: a node <bcp14>MUST NOT</b | ||||
cp14> send | ||||
a Challenge Request TLV with a nonce of size strictly larger than 192 | a Challenge Request TLV with a nonce of size strictly larger than 192 | |||
octets, and a node MAY ignore a nonce that is of size strictly larger than | octets, and a node <bcp14>MAY</bcp14> ignore a nonce that is of size strictly la rger than | |||
192 octets. Nonces of length 0 are valid: if a node has reliable stable | 192 octets. Nonces of length 0 are valid: if a node has reliable stable | |||
storage, then it may use a sequential counter for generating nonces which | storage, then it may use a sequential counter for generating nonces that | |||
get encoded in the minimum number of octets required; the value 0 is then | get encoded in the minimum number of octets required; the value 0 is then | |||
encoded as the string of length 0.</t> | encoded as the string of length 0.</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<name>Challenge Reply TLV</name> | ||||
<section title="Challenge Reply TLV"> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<figure><artwork><![CDATA[ | ||||
0 1 2 3 | 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 | 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 = 19 | Length | Nonce... | | Type = 19 | Length | Nonce... | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- | |||
]]></artwork></figure> | ]]></artwork> | |||
<t>Fields: | ||||
<t>Fields : | </t> | |||
<list style="hanging" hangIndent="10"> | <dl newline="false" spacing="normal" indent="10"> | |||
<t hangText="Type">Set to 19 to indicate a Challenge Reply TLV.</t> | <dt>Type</dt> | |||
<t hangText="Length">The length of the body, in octets, exclusive of the | <dd>Set to 19 to indicate a Challenge Reply TLV.</dd> | |||
Type and Length fields.</t> | <dt>Length</dt> | |||
<t hangText="Nonce">A copy of the nonce contained in the corresponding | <dd>The length of the body, in octets, exclusive of the | |||
challenge request.</t> | Type and Length fields.</dd> | |||
</list></t> | <dt>Nonce</dt> | |||
</section> | <dd>A copy of the nonce contained in the corresponding | |||
Challenge Request.</dd> | ||||
</section> | </dl> | |||
</section> | ||||
<section title="Security Considerations" anchor="security-considerations"> | </section> | |||
<section anchor="security-considerations" numbered="true" toc="default"> | ||||
<t>This document defines a mechanism that provides basic security | <name>Security Considerations</name> | |||
<t>This document defines a mechanism that provides basic security | ||||
properties for the Babel routing protocol. The scope of this protocol is | properties for the Babel routing protocol. The scope of this protocol is | |||
strictly limited: it only provides authentication (we assume that routing | strictly limited: it only provides authentication (we assume that routing | |||
information is not confidential), it only supports symmetric keying, and | information is not confidential), it only supports symmetric keying, and | |||
it only allows for the use of a small number of symmetric keys on every | it only allows for the use of a small number of symmetric keys on every | |||
link. Deployments that need more features, e.g., confidentiality or | link. Deployments that need more features, e.g., confidentiality or | |||
asymmetric keying, should use a more featureful security mechanism such as | asymmetric keying, should use a more feature-rich security mechanism such as | |||
the one described in <xref target="I-D.ietf-babel-dtls"/>.</t> | the one described in <xref target="RFC8968" format="default"/>.</t> | |||
<t>This mechanism relies on two assumptions, as described in | ||||
<t>This mechanism relies on two assumptions, as described in <xref | <xref target="security-properties" format="default"/>. First, it assumes that t | |||
target="security-properties"/>. First, it assumes that the MAC being used | he MAC being used | |||
is invulnerable to forgery (Section 1.1 of <xref target="RFC6039"/>); at | is invulnerable to forgery (<xref target="RFC6039" sectionFormat="of" section="1 | |||
.1"/>); at | ||||
the time of writing, HMAC-SHA256, which is mandatory to implement | the time of writing, HMAC-SHA256, which is mandatory to implement | |||
(<xref target="mac-computation"/>), is believed to be safe against | (<xref target="mac-computation" format="default"/>), is believed to be safe agai nst | |||
practical attacks.</t> | practical attacks.</t> | |||
<t>Second, it assumes that indices and nonces are generated uniquely over | ||||
<t>Second, it assumes that indices and nonces are generated uniquely over | ||||
the lifetime of a key used for MAC computation (more precisely, indices | the lifetime of a key used for MAC computation (more precisely, indices | |||
must be unique for a given (key, source) pair, and nonces must be unique | must be unique for a given (key, source) pair, and nonces must be unique | |||
for a given (key, source, destination) triple). This property can be | for a given (key, source, destination) triple). This property can be | |||
satisfied either by using a cryptographically secure random number | satisfied either by using a cryptographically secure random number | |||
generator to generate indices and nonces that contain enough entropy | generator to generate indices and nonces that contain enough entropy | |||
(64-bit values are believed to be large enough for all practical | (64-bit values are believed to be large enough for all practical | |||
applications), or by using a reliably monotonic hardware clock. If | applications) or by using a reliably monotonic hardware clock. If | |||
uniqueness cannot be guaranteed (e.g., because a hardware clock has been | uniqueness cannot be guaranteed (e.g., because a hardware clock has been | |||
reset), then rekeying is necessary.</t> | reset), then rekeying is necessary.</t> | |||
<t>The expiry mechanism mandated in <xref target="expire" format="default" | ||||
<t>The expiry mechanism mandated in <xref target="expire"/> is required to | /> is required to | |||
prevent an attacker from delaying an authentic packet by an unbounded | prevent an attacker from delaying an authentic packet by an unbounded | |||
amount of time. If an attacker is able to delay the delivery of a packet | amount of time. If an attacker is able to delay the delivery of a packet | |||
(e.g., because it is located at a layer 2 switch), then the packet will be | (e.g., because it is located at a Layer 2 switch), then the packet will be | |||
accepted as long as the corresponding (Index, PC) pair is present at the | accepted as long as the corresponding (Index, PC) pair is present at the | |||
receiver. If the attacker is able to cause the (Index, PC) pair to | receiver. If the attacker is able to cause the (Index, PC) pair to | |||
persist for arbitrary amounts of time (e.g., by repeatedly causing failed | persist for arbitrary amounts of time (e.g., by repeatedly causing failed | |||
challenges), then it is able to delay the packet by arbitrary amounts of | challenges), then it is able to delay the packet by arbitrary amounts of | |||
time, even after the sender has left the network, which could allow it to | time, even after the sender has left the network, which could allow it to | |||
redirect or blackhole traffic to destinations previously advertised by the | redirect or blackhole traffic to destinations previously advertised by the | |||
sender.</t> | sender.</t> | |||
<t>This protocol exposes large numbers of packets and their MACs to an | ||||
<t>This protocol exposes large numbers of packets and their MACs to an | ||||
attacker that is able to capture packets; it is therefore vulnerable to | attacker that is able to capture packets; it is therefore vulnerable to | |||
brute-force attacks. Keys must be chosen in a manner that makes them | brute-force attacks. Keys must be chosen in a manner that makes them | |||
difficult to guess. Ideally, they should have a length of 32 octets (both | difficult to guess. Ideally, they should have a length of 32 octets (both | |||
for HMAC-SHA256 and Blake2s), and be chosen randomly. If, for some | for HMAC-SHA256 and BLAKE2s), and be chosen randomly. If, for some | |||
reason, it is necessary to derive keys from a human-readable passphrase, | reason, it is necessary to derive keys from a human-readable passphrase, | |||
it is recommended to use a key derivation function that hampers dictionary | it is recommended to use a key derivation function that hampers dictionary | |||
attacks, such as PBKDF2 <xref target="RFC2898"/>, bcrypt | attacks, such as PBKDF2 <xref target="RFC8018" format="default"/>, bcrypt | |||
<xref target="BCRYPT"/> or scrypt <xref target="RFC7914"/>. In that case, | <xref target="BCRYPT" format="default"/>, or scrypt <xref target="RFC7914" forma | |||
t="default"/>. In that case, | ||||
only the derived keys should be communicated to the routers; the original | only the derived keys should be communicated to the routers; the original | |||
passphrase itself should be kept on the host used to perform the key | passphrase itself should be kept on the host used to perform the key | |||
generation (e.g., an administator's secure laptop computer).</t> | generation (e.g., an administrator's secure laptop computer).</t> | |||
<t>While it is probably not possible to be immune against denial of | ||||
<t>While it is probably not possible to be immune against denial of | ||||
service (DoS) attacks in general, this protocol includes a number of | service (DoS) attacks in general, this protocol includes a number of | |||
mechanisms designed to mitigate such attacks. In particular, reception of | mechanisms designed to mitigate such attacks. In particular, reception of | |||
a packet with no correct MAC creates no local Babel state | a packet with no correct MAC creates no local Babel state | |||
(<xref target="packet-reception"/>). Reception of a replayed packet with | (<xref target="packet-reception" format="default"/>). Reception of a replayed p acket with | |||
correct MAC, on the other hand, causes a challenge to be sent; this is | correct MAC, on the other hand, causes a challenge to be sent; this is | |||
mitigated somewhat by requiring that challenges be rate-limited | mitigated somewhat by requiring that challenges be rate limited | |||
(<xref target="sending-challenges"/>).</t> | (<xref target="sending-challenges" format="default"/>).</t> | |||
<t>Receiving a replayed packet with an obsolete index causes an entry to | ||||
<t>Receiving a replayed packet with an obsolete index causes an entry to | be created in the neighbour table, which, at first sight, makes the | |||
be created in the Neighbour Table, which, at first sight, makes the | ||||
protocol susceptible to resource exhaustion attacks (similarly to the | protocol susceptible to resource exhaustion attacks (similarly to the | |||
familiar "TCP SYN Flooding" attack <xref target="RFC4987"/>). However, | familiar "TCP SYN Flooding" attack <xref target="RFC4987" format="default"/>). | |||
the MAC computation includes the sender address (<xref | However, | |||
target="mac-computation"/>), and thus the amount of storage that an | the MAC computation includes the sender address (<xref target="mac-computation" | |||
format="default"/>), | ||||
and thus the amount of storage that an | ||||
attacker can force a node to consume is limited by the number of distinct | attacker can force a node to consume is limited by the number of distinct | |||
source addresses used with a single MAC key (see also Section 4 of | source addresses used with a single MAC key (see also | |||
<xref target="RFC6126bis"/>, which mandates that the source address is | <xref target="RFC8966" sectionFormat="of" section="4"/>, which mandates that the | |||
source address is | ||||
a link-local IPv6 address or a local IPv4 address).</t> | a link-local IPv6 address or a local IPv4 address).</t> | |||
<t>In order to make this kind of resource exhaustion attacks less | ||||
<t>In order to make this kind of resource exhaustion attacks less | ||||
effective, implementations may use a separate table of uncompleted | effective, implementations may use a separate table of uncompleted | |||
challenges that is separate from the Neighbour Table used by the core | challenges that is separate from the neighbour table used by the core | |||
protocol (the data structures described in Section 3.2 of <xref | protocol (the data structures described in <xref target="RFC8966" sectionFormat= | |||
target="RFC6126bis"/> are conceptual, and any data structure that yields the | "of" section="3.2"/> are conceptual, and any data structure that yields the | |||
same result may be used). Implementers might also consider using the fact | same result may be used). Implementers might also consider using the fact | |||
that the nonces included in challenge requests and replies can be fairly | that the nonces included in Challenge Requests and Replies can be fairly | |||
large (up to 192 octets), which should in principle allow encoding the | large (up to 192 octets), which should in principle allow encoding the | |||
per-challenge state as a secure "cookie" within the nonce itself; note | per-challenge state as a secure "cookie" within the nonce itself; note, | |||
however that any such scheme will need to prevent cookie replay.</t> | however, that any such scheme will need to prevent cookie replay.</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<name>IANA Considerations</name> | ||||
<section title="IANA Considerations"> | <t>IANA has allocated the following values in the Babel TLV Types | |||
<t>IANA has allocated the following values in the Babel TLV Types | ||||
registry:</t> | registry:</t> | |||
<texttable> | <table align="center"> | |||
<ttcol>Type</ttcol><ttcol>Name</ttcol><ttcol>Reference</ttcol> | <thead> | |||
<c>16</c><c>MAC</c><c>this document</c> | <tr> | |||
<c>17</c><c>PC</c><c>this document</c> | <th align="left">Type</th> | |||
<c>18</c><c>Challenge Request</c><c>this document</c> | <th align="left">Name</th> | |||
<c>19</c><c>Challenge Reply</c><c>this document</c> | <th align="left">Reference</th> | |||
</texttable> | </tr> | |||
</thead> | ||||
</section> | <tbody> | |||
<tr> | ||||
<section title="Acknowledgments"> | <td align="left">16</td> | |||
<td align="left">MAC</td> | ||||
<t>The protocol described in this document is based on the original HMAC | <td align="left">RFC 8967</td> | |||
protocol defined by Denis Ovsienko <xref target="RFC7298"/>. The use of | </tr> | |||
a pseudo-header was suggested by David Schinazi. The use of an index to | <tr> | |||
avoid replay was suggested by Markus Stenberg. The authors are also | <td align="left">17</td> | |||
indebted to Antonin Decimo, Donald Eastlake, Toke Hoiland-Jorgensen, | <td align="left">PC</td> | |||
Florian Horn, Benjamin Kaduk, Dave Taht and Martin Vigoureux.</t> | <td align="left">RFC 8967</td> | |||
</tr> | ||||
</section> | <tr> | |||
<td align="left">18</td> | ||||
</middle> | <td align="left">Challenge Request</td> | |||
<td align="left">RFC 8967</td> | ||||
<back> | </tr> | |||
<tr> | ||||
<references title="Normative References"> | <td align="left">19</td> | |||
<td align="left">Challenge Reply</td> | ||||
<reference anchor="RFC2119"><front> | <td align="left">RFC 8967</td> | |||
<title>Key words for use in RFCs to Indicate Requirement Levels</title> | </tr> | |||
<author initials="S." surname="Bradner" fullname="S. Bradner"/> | </tbody> | |||
<date year="1997" month="March"/> | </table> | |||
</front> | </section> | |||
<seriesInfo name="BCP" value="14"/> | </middle> | |||
<seriesInfo name="RFC" value="2119"/> | <back> | |||
<seriesInfo name="DOI" value="10.17487/RFC2119"/> | ||||
</reference> | ||||
<reference anchor="RFC8174"><front> | ||||
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title> | ||||
<author initials="B." surname="Leiba" fullname="B. Leiba"/> | ||||
<date year="2017" month="May"/> | ||||
</front> | ||||
<seriesInfo name="BCP" value="14"/> | ||||
<seriesInfo name="RFC" value="8174"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8174"/> | ||||
</reference> | ||||
<reference anchor='RFC6126bis'><front> | ||||
<title>The Babel Routing Protocol</title> | ||||
<author initials='J' surname='Chroboczek' fullname='Juliusz Chroboczek'/> | ||||
<author initials='D' surname='Schinazi' fullname='David Schinazi'/> | ||||
<date month='October' day='23' year='2018' /> | ||||
</front> | ||||
<seriesInfo name='Internet-Draft' value='draft-ietf-babel-rfc6126bis-06'/> | ||||
</reference> | ||||
<reference anchor="RFC2104" target="https://www.rfc-editor.org/info/rfc2104"> | ||||
<front> | ||||
<title>HMAC: Keyed-Hashing for Message Authentication</title> | ||||
<author initials="H." surname="Krawczyk" fullname="H. Krawczyk"></author> | ||||
<author initials="M." surname="Bellare" fullname="M. Bellare"></author> | ||||
<author initials="R." surname="Canetti" fullname="R. Canetti"></author> | ||||
<date year="1997" month="February"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="2104"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC2104"/> | ||||
</reference> | ||||
<reference anchor="RFC6234" target="https://www.rfc-editor.org/info/rfc6234"> | ||||
<front> | ||||
<title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title> | ||||
<author initials="D." surname="Eastlake 3rd" fullname="D. Eastlake 3rd"> | ||||
</author> | ||||
<author initials="T." surname="Hansen" fullname="T. Hansen"></author> | ||||
<date year="2011" month="May"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6234"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6234"/> | ||||
</reference> | ||||
<reference anchor="RFC7693" target="https://www.rfc-editor.org/info/rfc7693"> | ||||
<front> | ||||
<title>The BLAKE2 Cryptographic Hash and Message Authentication Code (MAC)</titl | ||||
e> | ||||
<author initials="M-J." surname="Saarinen" fullname="M-J. Saarinen" role="editor | ||||
"/> | ||||
<author initials="J-P." surname="Aumasson" fullname="J-P. Aumasson"/> | ||||
<date year="2015" month="November"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7693"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7693"/> | ||||
</reference> | ||||
</references> | ||||
<references title="Informational References"> | ||||
<reference anchor="RFC7298" | ||||
target="https://www.rfc-editor.org/info/rfc7298"><front> | ||||
<title>Babel Hashed Message Authentication Code (HMAC) Cryptographic | ||||
Authentication</title> | ||||
<author initials="D." surname="Ovsienko" fullname="D. Ovsienko"></author> | ||||
<date year="2014" month="July"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7298"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7298"/> | ||||
</reference> | ||||
<reference anchor="I-D.ietf-babel-dtls"><front> | ||||
<title>Babel Routing Protocol over Datagram Transport Layer Security</title> | ||||
<author initials="A" surname="Decimo" fullname="Antonin Decimo"/> | ||||
<author initials="D" surname="Schinazi" fullname="David Schinazi"/> | ||||
<author initials="J" surname="Chroboczek" fullname="Juliusz Chroboczek"/> | ||||
<date month="July" day="5" year="2019"/> | ||||
</front> | ||||
<seriesInfo name="Internet-Draft" value="draft-ietf-babel-dtls-07"/> | ||||
<format type="TXT" target="http://www.ietf.org/internet-drafts/draft-ietf-babel- | ||||
dtls-07.txt"/> | ||||
</reference> | ||||
<reference anchor="RFC6039" target="https://www.rfc-editor.org/info/rfc6039"> | ||||
<front> | ||||
<title> | ||||
Issues with Existing Cryptographic Protection Methods for Routing Protocols | ||||
</title> | ||||
<author initials="V." surname="Manral" fullname="V. Manral"/> | ||||
<author initials="M." surname="Bhatia" fullname="M. Bhatia"/> | ||||
<author initials="J." surname="Jaeggli" fullname="J. Jaeggli"/> | ||||
<author initials="R." surname="White" fullname="R. White"/> | ||||
<date year="2010" month="October"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6039"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6039"/> | ||||
</reference> | ||||
<reference anchor='RFC4086' target='http://www.rfc-editor.org/info/rfc4086'> | ||||
<front> | ||||
<title>Randomness Requirements for Security</title> | ||||
<author initials='D.' surname='Eastlake 3rd' fullname='D. Eastlake 3rd'/> | ||||
<author initials='J.' surname='Schiller' fullname='J. Schiller'/> | ||||
<author initials='S.' surname='Crocker' fullname='S. Crocker'/> | ||||
<date year='2005' month='June'/> | ||||
</front> | ||||
<seriesInfo name='BCP' value='106'/> | ||||
<seriesInfo name='RFC' value='4086'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC4086'/> | ||||
</reference> | ||||
<reference anchor="RFC4987" target="https://www.rfc-editor.org/info/rfc4987"> | ||||
<front> | ||||
<title>TCP SYN Flooding Attacks and Common Mitigations</title> | ||||
<author initials="W." surname="Eddy" fullname="W. Eddy"/> | ||||
<date year="2007" month="August"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="4987"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC4987"/> | ||||
</reference> | ||||
<reference anchor="BCRYPT"> | ||||
<front> | ||||
<title>A Future-Adaptable Password Scheme</title> | ||||
<author initials="P." surname="Niels" fullname="Niels Provos"/> | ||||
<author initials="D." surname="Mazieres" fullname="David Mazieres"/> | ||||
<date year="1999"/> | ||||
</front> | ||||
<annotation>In Proceedings of the 1999 USENIX Annual Technical | ||||
Conference.</annotation> | ||||
</reference> | ||||
<reference anchor="RFC2898" target="https://www.rfc-editor.org/info/rfc2898"> | ||||
<front> | ||||
<title>PKCS #5: Password-Based Cryptography Specification Version 2.0</title> | ||||
<author initials="B." surname="Kaliski" fullname="B. Kaliski"/> | ||||
<date year="2000" month="September"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="2898"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC2898"/> | ||||
</reference> | ||||
<reference anchor="RFC7914" target="https://www.rfc-editor.org/info/rfc7914"> | ||||
<front> | ||||
<title>The scrypt Password-Based Key Derivation Function</title> | ||||
<author initials="C." surname="Percival" fullname="C. Percival"/> | ||||
<author initials="S." surname="Josefsson" fullname="S. Josefsson"/> | ||||
<date year="2016" month="August"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7914"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7914"/> | ||||
</reference> | ||||
</references> | ||||
<section title="Changes from previous versions"> | ||||
<t>[RFC Editor: please remove this section before publication.]</t> | ||||
<section title="Changes since draft-ietf-babel-hmac-00"> | ||||
<t><list style="symbols"> | ||||
<t>Changed the title.</t> | ||||
<t>Removed the appendix about the packet trailer, this is now in | ||||
rfc6126bis.</t> | ||||
<t>Removed the appendix with implicit indices.</t> | ||||
<t>Clarified the definitions of acronyms.</t> | ||||
<t>Limited the size of nonces and indices.</t> | ||||
</list></t> | ||||
</section> | ||||
<section title="Changes since draft-ietf-babel-hmac-01"> | ||||
<t><list style="symbols"> | ||||
<t>Made BLAKE2s a recommended HMAC algorithm.</t> | ||||
<t>Added requirement to expire per-neighbour crypto state.</t> | ||||
</list></t> | ||||
</section> | ||||
<section title="Changes since draft-ietf-babel-hmac-02"> | ||||
<t><list style="symbols"> | ||||
<t>Clarified that PCs are 32-bit unsigned integers.</t> | ||||
<t>Clarified that indices and nonces are of arbitrary size.</t> | ||||
<t>Added reference to RFC 4086.</t> | ||||
</list></t> | ||||
</section> | ||||
<section title="Changes since draft-ietf-babel-hmac-03"> | ||||
<t><list style="symbols"> | ||||
<t>Use the TLV values allocated by IANA.</t> | ||||
<t>Fixed an issue with packets that contain a successful challenge | ||||
reply: they should be accepted before checking the PC value.</t> | ||||
<t>Clarified that keys are the exact value of the HMAC hash size, and not | ||||
subject to preprocessing; this makes management more deterministic.</t> | ||||
</list></t> | ||||
</section> | ||||
<section title="Changes since draft-ietf-babel-hmac-04"> | ||||
<t><list style="symbols"> | ||||
<t>Use normative language in more places.</t> | ||||
</list></t> | ||||
</section> | ||||
<section title="Changes since draft-ietf-babel-hmac-05"> | ||||
<t><list style="symbols"> | ||||
<t>Do not update RFC 6126bis.</t> | ||||
<t>Clarify that indices and nonces of length 0 are valid.</t> | ||||
<t>Clarify that multiple PC TLVs in a single packet are not allowed.</t> | ||||
<t>Allow discarding challenge requests when they carry an old PC.</t> | ||||
</list></t> | ||||
</section> | ||||
<section title="Changes since draft-ietf-babel-hmac-06"> | ||||
<t><list style="symbols"> | ||||
<t>Do not update RFC 6126bis, for real this time.</t> | ||||
</list></t> | ||||
</section> | ||||
<section title="Changes since draft-ietf-babel-hmac-07"> | ||||
<t><list style="symbols"> | ||||
<t>Clarify that a Neighbour Table entry may be created just after the HMAC | ||||
has been computed.</t> | ||||
<t>Clarify that a Neighbour Table entry already exists when a successful | ||||
Challenge Reply has been received.</t> | ||||
<t>Expand the Security Considerations section with information about | ||||
resource exhaustion attacks.</t> | ||||
</list></t> | ||||
<section title="Changes since draft-ietf-babel-hmac-08"> | ||||
<t><list style="symbols"> | ||||
<t>Fix the size of the key to be equal to the block size, not the hash size.</t> | ||||
<t>Moved the information about incremental deployment to the body.</t> | ||||
<t>Clarified the double purpose of rate limitation.</t> | ||||
<t>Editorial changes.</t> | ||||
</list></t> | ||||
</section> | ||||
<section title="Changes since draft-ietf-babel-hmac-09"> | ||||
<t><list style="symbols"> | ||||
<t>Renamed HMAC to MAC throughout, relevant rewording.</t> | ||||
<t>Made it mandatory to rate-limit challenge replies in addition to | ||||
requests.</t> | ||||
<t>Added discussion of key generation.</t> | ||||
<t>Added discussion of the consequences of delaying packets.</t> | ||||
</list></t> | ||||
</section> | <references> | |||
<name>References</name> | ||||
<references> | ||||
<name>Normative References</name> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.2119.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8174.xml"/> | ||||
<section title="Changes since draft-ietf-babel-hmac-10"> | <reference anchor="RFC8966" target="https://www.rfc-editor.org/info/rfc8 | |||
966"> | ||||
<front> | ||||
<title>The Babel Routing Protocol</title> | ||||
<author fullname="Juliusz Chroboczek" initials="J." surname="Chroboc | ||||
zek"/> | ||||
<author fullname="David Schinazi" initials="D." surname="Schinazi"/> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8966"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8966"/> | ||||
</reference> | ||||
<t><list style="symbols"> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<t>Fixed minor typos.</t> | FC.2104.xml"/> | |||
</list></t> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
FC.6234.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7693.xml"/> | ||||
</references> | ||||
<references> | ||||
<name>Informational References</name> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7298.xml"/> | ||||
</section> | <reference anchor="RFC8968" target="https://www.rfc-editor.org/info/rfc8968"> | |||
<front> | ||||
<title>Babel Routing Protocol over Datagram Transport Layer Security</tit | ||||
le> | ||||
<author initials="A" surname="Décimo" fullname="Antonin Décimo"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="D" surname="Schinazi" fullname="David Schinazi"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="J" surname="Chroboczek" fullname="Juliusz Chroboczek"> | ||||
<organization /> | ||||
</author> | ||||
<section title="Changes since draft-ietf-babel-hmac-11"> | <date month="January" year="2021" /> | |||
</front> | ||||
<seriesInfo name="RFC" value="8968" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8968"/> | ||||
<t><list style="symbols"> | </reference> | |||
<t>Clarified that the state SHOULD be discarded after a successful challenge.</t | ||||
> | ||||
<t>Replaced "pre-image attack" with "forgery", this is more accurate.</t> | ||||
<t>Minor editorial changes.</t> | ||||
</list></t> | ||||
</section> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
</section> | FC.6039.xml"/> | |||
</section> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
FC.4086.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.4987.xml"/> | ||||
</back> | <reference anchor="BCRYPT"> | |||
<front> | ||||
<title>A Future-Adaptable Password Scheme</title> | ||||
<author initials="P." surname="Niels" fullname="Niels Provos"/> | ||||
<author initials="D." surname="Mazières" fullname="David Mazières"/> | ||||
<date month="June" year="1999"/> | ||||
</front> | ||||
<refcontent>Proceedings of the FREENIX Track: 1999 USENIX Annual Techn | ||||
ical Conference</refcontent> | ||||
</reference> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8018.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7914.xml"/> | ||||
</references> | ||||
</references> | ||||
<section numbered="false" toc="default"> | ||||
<name>Acknowledgments</name> | ||||
<t>The protocol described in this document is based on the original HMAC | ||||
protocol defined by <contact fullname="Denis Ovsienko"/> <xref target="RFC7298" | ||||
format="default"/>. | ||||
The use of a pseudo-header was suggested by <contact fullname="David Schinazi"/> | ||||
. | ||||
The use of an index to avoid replay was suggested by <contact fullname="Markus S | ||||
tenberg"/>. | ||||
The authors are also indebted to <contact fullname="Antonin Décimo"/>, | ||||
<contact fullname="Donald Eastlake"/>, <contact fullname="Toke Høiland-Jørgensen | ||||
"/>, | ||||
<contact fullname="Florian Horn"/>, <contact fullname="Benjamin Kaduk"/>, | ||||
<contact fullname="Dave Taht"/>, and <contact fullname="Martin Vigoureux"/>.</t> | ||||
</section> | ||||
</back> | ||||
</rfc> | </rfc> | |||
End of changes. 123 change blocks. | ||||
831 lines changed or deleted | 687 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |