summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc8967.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rfc/rfc8967.txt')
-rw-r--r--doc/rfc/rfc8967.txt882
1 files changed, 882 insertions, 0 deletions
diff --git a/doc/rfc/rfc8967.txt b/doc/rfc/rfc8967.txt
new file mode 100644
index 0000000..d3ca4fb
--- /dev/null
+++ b/doc/rfc/rfc8967.txt
@@ -0,0 +1,882 @@
+
+
+
+
+Internet Engineering Task Force (IETF) C. Dô
+Request for Comments: 8967 W. Kolodziejak
+Obsoletes: 7298 J. Chroboczek
+Category: Standards Track IRIF, University of Paris-Diderot
+ISSN: 2070-1721 January 2021
+
+
+ MAC Authentication for the Babel Routing Protocol
+
+Abstract
+
+ This document describes a cryptographic authentication mechanism for
+ the Babel routing protocol that has provisions for replay avoidance.
+ This document obsoletes RFC 7298.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 7841.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ https://www.rfc-editor.org/info/rfc8967.
+
+Copyright Notice
+
+ Copyright (c) 2021 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (https://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+Table of Contents
+
+ 1. Introduction
+ 1.1. Applicability
+ 1.2. Assumptions and Security Properties
+ 1.3. Specification of Requirements
+ 2. Conceptual Overview of the Protocol
+ 3. Data Structures
+ 3.1. The Interface Table
+ 3.2. The Neighbour Table
+ 4. Protocol Operation
+ 4.1. MAC Computation
+ 4.2. Packet Transmission
+ 4.3. Packet Reception
+ 4.4. Expiring Per-Neighbour State
+ 5. Incremental Deployment and Key Rotation
+ 6. Packet Format
+ 6.1. MAC TLV
+ 6.2. PC TLV
+ 6.3. Challenge Request TLV
+ 6.4. Challenge Reply TLV
+ 7. Security Considerations
+ 8. IANA Considerations
+ 9. References
+ 9.1. Normative References
+ 9.2. Informational References
+ Acknowledgments
+ Authors' Addresses
+
+1. Introduction
+
+ By default, the Babel routing protocol [RFC8966] trusts the
+ information contained 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 a variety of potential issues.
+ In particular, an attacker might:
+
+ * spoof a Babel packet and redirect traffic by announcing a route
+ with a smaller metric, a larger sequence number, or a longer
+ prefix;
+
+ * spoof a malformed packet, which could cause an insufficiently
+ robust implementation to crash or interfere with the rest of the
+ network;
+
+ * replay a previously captured Babel packet, which could cause
+ traffic to be redirected or otherwise interfere with the network.
+
+ Protecting a Babel network is challenging due to the fact that the
+ Babel protocol uses both unicast and multicast communication. One
+ possible approach, used notably by the Babel over Datagram Transport
+ Layer Security (DTLS) protocol [RFC8968], is to use unicast
+ communication for all semantically significant communication, and
+ then use a standard unicast security protocol to protect the Babel
+ traffic. In this document, we take the opposite approach: we define
+ a cryptographic extension to the Babel protocol that is able to
+ protect both unicast and multicast traffic and thus requires very few
+ changes to the core protocol. This document obsoletes [RFC7298].
+
+1.1. Applicability
+
+ 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 (usually just one, and two during key rotation). The protocol
+ is inapplicable in situations where asymmetric keying is required,
+ where the trust relationship is partial, or where large numbers of
+ trusted keys are provisioned on a single link at the same time.
+
+ This protocol supports incremental deployment (where an insecure
+ Babel network is made secure with no service interruption), and it
+ supports graceful key rotation (where the set of keys is changed with
+ no service interruption).
+
+ This protocol does not require synchronised clocks, it does not
+ require persistently monotonic clocks, and it does not require
+ persistent storage except for what might be required for storing
+ cryptographic keys.
+
+1.2. Assumptions and Security Properties
+
+ The correctness of the protocol relies on the following assumptions:
+
+ * that the Message Authentication Code (MAC) being used is
+ invulnerable to forgery, i.e., that an attacker is unable to
+ generate a packet with a correct MAC without access to the secret
+ key;
+
+ * that a node never generates the same index or nonce twice over the
+ lifetime of a key.
+
+ 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 [RFC4086] and sufficiently large indices and nonces, by
+ using a reliable hardware clock, or by rekeying often enough that
+ collisions are unlikely.
+
+ If the assumptions above are met, the protocol described in this
+ document has the following properties:
+
+ * it is invulnerable to spoofing: any Babel packet accepted as
+ authentic is the exact copy of a packet originally sent by an
+ authorised node;
+
+ * 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 of this packet or an earlier packet from the same
+ sender;
+
+ * 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 accept a copy of that packet if B has accepted an older
+ packet from C, and B has received no later packet from C.
+
+ While this protocol makes efforts to mitigate the effects of a denial
+ of service attack, it does not fully protect against such attacks.
+
+1.3. Specification of Requirements
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in BCP
+ 14 [RFC2119] [RFC8174] when, and only when, they appear in all
+ capitals, as shown here.
+
+2. Conceptual Overview of the Protocol
+
+ 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 (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 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.
+
+ 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 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 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 unless it is strictly greater, the packet
+ is discarded.
+
+ By itself, the PC mechanism is not sufficient to protect against
+ replay. Consider a peer A that has no information about a peer 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 about B, it has no way to determine whether the packet is
+ freshly generated or a replay of a previously sent packet.
+
+ In this situation, peer A discards the packet and challenges B to
+ prove that 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 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 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 freshness of the
+ PC.
+
+ By itself, this mechanism is safe against replay if B never resets
+ its PC. In practice, however, this is difficult to ensure, as
+ persistent 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 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 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.
+
+ Another mechanism is needed to protect against this attack. In this
+ 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 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 sending PCs with that index. Whenever A detects
+ that B has changed its index, it challenges B again.
+
+ With this additional mechanism, this protocol is invulnerable to
+ replay attacks (see Section 1.2).
+
+3. Data Structures
+
+ Every Babel node maintains a set of conceptual data structures
+ described in Section 3.2 of [RFC8966]. This protocol extends these
+ data structures as follows.
+
+3.1. The Interface Table
+
+ Every Babel node maintains an interface table, as described in
+ Section 3.2.3 of [RFC8966]. Implementations of this protocol MUST
+ allow each interface to be provisioned with a set of one or more MAC
+ keys and the associated MAC algorithms (see Section 4.1 for suggested
+ algorithms and Section 7 for suggested methods for key generation).
+ In order to allow incremental deployment of this protocol (see
+ Section 5), implementations SHOULD allow an interface to be
+ configured in a mode in which it participates in the MAC
+ authentication protocol but accepts packets that are not
+ authenticated.
+
+ This protocol extends each table entry associated with an interface
+ on which MAC authentication has been configured with two new pieces
+ of data:
+
+ * a set of one or more MAC keys, each associated with a given MAC
+ algorithm;
+
+ * a pair (Index, PC), where Index is an arbitrary string of 0 to 32
+ octets, and PC is a 32-bit (4-octet) integer.
+
+ 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 initialised to a fresh index, for example, by drawing a
+ random string of sufficient length (see Section 7 for suggested
+ sizes), and the PC is initialised to an arbitrary value (typically
+ 0).
+
+3.2. The Neighbour Table
+
+ Every Babel node maintains a neighbour table, as described in
+ Section 3.2.4 of [RFC8966]. This protocol extends each entry in this
+ table with two new pieces of data:
+
+ * a pair (Index, PC), where Index is a string of 0 to 32 octets, and
+ PC is a 32-bit (4-octet) integer;
+
+ * a Nonce, which is an arbitrary string of 0 to 192 octets, and an
+ associated challenge expiry timer.
+
+ The Index and PC are initially undefined, and they are managed as
+ described in Section 4.3. The Nonce and challenge expiry timer are
+ initially undefined, and they are used as described in
+ Section 4.3.1.1.
+
+4. Protocol Operation
+
+4.1. MAC Computation
+
+ A Babel node computes the MAC of a Babel packet as follows.
+
+ 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, the pseudo-header has the following format:
+
+ 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
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | |
+ + +
+ | |
+ + Src address +
+ | |
+ + +
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Src port | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
+ | |
+ + +
+ | Dest address |
+ + +
+ | |
+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | | Dest port |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ If the packet is carried over IPv4, the pseudo-header has the
+ following format:
+
+ 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
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Src address |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Src port | Dest address |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | | Dest port |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Fields:
+
+ Src address The source IP address of the packet.
+
+ Src port The source UDP port number of the packet.
+
+ Dest address The destination IP address of the packet.
+
+ Src port The destination UDP port number of the packet.
+
+ The node takes the concatenation of the pseudo-header and the Babel
+ packet including the packet header but excluding the packet trailer
+ (from octet 0 inclusive up to (Body Length + 4) exclusive) and
+ computes a MAC with one of the implemented algorithms. Every
+ implementation MUST implement HMAC-SHA256 as defined in [RFC6234] and
+ Section 2 of [RFC2104], SHOULD implement keyed BLAKE2s [RFC7693] with
+ 128-bit (16-octet) digests, and MAY implement other MAC algorithms.
+
+4.2. Packet Transmission
+
+ 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
+ interface MTU (Section 4 of [RFC8966]). For an interface on which
+ MAC protection is configured, the TLV aggregation logic MUST take
+ into account the overhead due to PC TLVs (one in each packet) and MAC
+ TLVs (one per configured key).
+
+ Before sending a packet, the following actions are performed:
+
+ * a PC TLV containing the PC and Index associated with the outgoing
+ interface MUST be appended to the packet body;
+
+ - the PC MUST be incremented by a strictly positive amount
+ (typically just 1);
+
+ - if the PC overflows, a fresh index MUST be generated (as
+ defined in Section 3.1);
+
+ a node MUST NOT include multiple PC TLVs in a single packet;
+
+ * for each key configured on the interface, a MAC is computed as
+ specified in Section 4.1 and stored in a MAC TLV that MUST be
+ appended to the packet trailer (see Section 4.2 of [RFC8966]).
+
+4.3. Packet Reception
+
+ When a packet is received on an interface that is configured for MAC
+ protection, the following steps are performed before the packet is
+ passed to normal processing:
+
+ * First, the receiver checks whether the trailer of the received
+ packet carries at least one MAC TLV; if not, the packet MUST be
+ immediately dropped and processing stops. Then, for each key
+ configured on the receiving interface, the receiver computes the
+ MAC of the packet. It then 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 is none, the packet MUST
+ be silently dropped and processing stops at this point. In order
+ to avoid memory exhaustion attacks, an entry in the neighbour
+ table MUST NOT be created before the MAC test has passed
+ successfully. The MAC of the packet MUST NOT be computed for each
+ MAC TLV contained in the packet, but only once for each configured
+ key.
+
+ * If an entry for the sender does not exist in the neighbour table,
+ it MAY be created at this point (or, alternatively, its creation
+ can be delayed until a challenge needs to be sent, see below).
+
+ * The packet body is then parsed a first time. During this
+ "preparse" phase, the packet body is traversed and all TLVs are
+ ignored except PC, Challenge Request, and Challenge Reply TLVs.
+ When a PC TLV is encountered, the enclosed PC and Index are saved
+ for later processing. If multiple PCs are found (which should not
+ happen, see Section 4.2), only the first one is processed, the
+ remaining ones MUST be silently ignored. If a Challenge Request
+ is encountered, a Challenge Reply MUST be scheduled, as described
+ in Section 4.3.1.2. If a Challenge Reply is encountered, it is
+ tested for validity as described in Section 4.3.1.3, and a note is
+ made of the result of the test.
+
+ * 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 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. 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 corresponding to the
+ sender (which already exists in this case), and the packet is
+ accepted.
+
+ * Otherwise, if there is no entry in the neighbour table
+ corresponding to 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, then a challenge MUST be sent
+ as described in Section 4.3.1.1, the packet MUST be dropped, and
+ processing stops at this stage.
+
+ * At this stage, the packet contains no successful Challenge Reply,
+ and the Index contained in the PC TLV is equal to the Index in the
+ neighbour table entry corresponding to the sender. The receiver
+ compares the 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 MUST be dropped and
+ processing stops (no challenge is sent in this case, since the
+ mismatch might be caused by harmless packet reordering on the
+ link). Otherwise, the PC contained in the neighbour table entry
+ is set to the received PC, and the packet is accepted.
+
+ In the algorithm described above, Challenge Requests are processed
+ and challenges are sent before the (Index, PC) pair is verified
+ against the neighbour table. This simplifies the implementation
+ somewhat (the node may simply schedule outgoing requests as it walks
+ the packet during the preparse phase) but relies on the rate limiting
+ described in Section 4.3.1.1 to avoid sending too many challenges in
+ response to replayed packets. As an optimisation, a node MAY ignore
+ all Challenge Requests contained in a packet except the last one, and
+ it MAY 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 rate limiting described in Section 4.3.1.1 is
+ required even if this optimisation is implemented.
+
+ The same is true of Challenge Replies. However, since validating a
+ Challenge Reply has minimal additional cost (it is just a bitwise
+ comparison of two strings of octets), a similar optimisation for
+ Challenge Replies is not worthwhile.
+
+ 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.
+
+4.3.1. Challenge Requests and Replies
+
+ During the preparse stage, the receiver might encounter a mismatched
+ 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 Reply TLV. Finally, it might encounter a Challenge Reply
+ TLV, which it will attempt to match with a previously sent Challenge
+ Request TLV in order to update the neighbour table entry
+ corresponding to the sender of the packet.
+
+4.3.1.1. Sending Challenges
+
+ When it encounters a mismatched Index during the preparse phase, a
+ node picks a nonce that it has never used with any of the keys
+ currently configured on the relevant interface, for example, by
+ drawing 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 the neighbour table associated to the neighbour (the
+ entry might need to be created at this stage), initialise the
+ neighbour's challenge expiry timer to 30 seconds, and send a
+ Challenge Request TLV to the unicast address corresponding to the
+ neighbour.
+
+ A node MAY aggregate a Challenge Request with other TLVs; in other
+ 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 Challenge Request. However, it MUST arrange for the
+ Challenge Request to be sent in a timely manner, as any packets
+ received from that neighbour will be silently ignored until the
+ challenge completes.
+
+ A node MUST impose a rate limitation to the challenges it sends; the
+ limit SHOULD default to one Challenge Request every 300 ms and MAY be
+ configurable. This rate limiting serves two purposes. First, since
+ 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 send. Second, it limits the number of challenges
+ sent when there are multiple packets in flight from a single
+ neighbour.
+
+4.3.1.2. Replying to Challenges
+
+ When it encounters a Challenge Request during the preparse phase, 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 Reply to the unicast address from which the Challenge
+ Request was sent. A challenge sent to a multicast address MUST be
+ silently ignored.
+
+ A node MAY 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 sender of the Challenge Request, it MAY send the
+ buffered TLVs in the same packet as the Challenge Reply. However, it
+ MUST arrange for the Challenge Reply to be sent in a timely manner
+ (within a few seconds) and SHOULD NOT send any other packets over the
+ same interface before sending the Challenge Reply, as those would be
+ dropped by the challenger.
+
+ Since a Challenge Reply might be caused by a replayed Challenge
+ Request, a node MUST impose a rate limitation to the Challenge
+ Replies it sends; the limit SHOULD default to one Challenge Reply for
+ each peer every 300 ms and MAY be configurable.
+
+4.3.1.3. Receiving Challenge Replies
+
+ When it encounters a Challenge Reply during the preparse phase, a
+ node consults the neighbour table entry corresponding to the
+ neighbour that 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 timer has expired, the Challenge Reply MUST be
+ silently ignored, and the challenge has failed.
+
+ Otherwise, the node compares the Nonce contained in the Challenge
+ Reply 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 succeeded and the nonce stored in the neighbour table
+ for this neighbour SHOULD be discarded; otherwise, the challenge has
+ failed (and the nonce is not discarded).
+
+4.4. Expiring Per-Neighbour State
+
+ The per-neighbour (Index, PC) pair is maintained in the neighbour
+ table, and is normally discarded when the neighbour table entry
+ expires. Implementations MUST ensure that an (Index, PC) pair is
+ discarded within a finite time since the last time a packet has been
+ accepted. In particular, unsuccessful challenges MUST NOT prevent an
+ (Index, PC) pair from being discarded for unbounded periods of time.
+
+ A possible implementation strategy for implementations that use a
+ Hello history (Appendix A of [RFC8966]) is to discard the (Index, PC)
+ pair whenever the Hello history becomes empty. Another
+ 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 expires. If the latter strategy is used, the timer SHOULD
+ default to a value of 5 minutes and MAY be configurable.
+
+5. Incremental Deployment and Key Rotation
+
+ In order to perform incremental deployment, the nodes in the network
+ 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 configured to send authenticated packets, nodes are
+ reconfigured to reject unauthenticated packets.
+
+ 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 packets, and packets are accepted if they are properly signed by
+ either of the keys. At that point, the old key is removed.
+
+ In order to support the procedures described above, implementations
+ of this protocol SHOULD support an interface configuration in which
+ packets are sent authenticated but received packets are accepted
+ without verification, and they SHOULD allow changing the set of keys
+ associated with an interface without a restart.
+
+6. Packet Format
+
+6.1. MAC TLV
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Type = 16 | Length | MAC...
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
+
+ Fields:
+
+ Type Set to 16 to indicate a MAC TLV.
+
+ Length The length of the body, in octets, exclusive of the Type
+ and Length fields. The length depends on the MAC algorithm
+ being used.
+
+ MAC The body contains the MAC of the packet, computed as
+ described in Section 4.1.
+
+ This TLV is allowed in the packet trailer (see Section 4.2 of
+ [RFC8966]) and MUST be ignored if it is found in the packet body.
+
+6.2. PC TLV
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Type = 17 | Length | PC |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | | Index...
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
+
+ Fields:
+
+ Type Set to 17 to indicate a PC TLV.
+
+ Length The length of the body, in octets, exclusive of the Type
+ and Length fields.
+
+ PC The Packet Counter (PC), a 32-bit (4-octet) unsigned
+ integer that is increased with every packet sent over this
+ interface. A fresh index (as defined in Section 3.1) MUST
+ be generated whenever the PC overflows.
+
+ Index The sender's Index, an opaque string of 0 to 32 octets.
+
+ Indices are limited to a size of 32 octets: a node MUST NOT send a
+ TLV with an index of size strictly larger than 32 octets, and a node
+ MAY 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 the packet counter never overflows, then only one index
+ is necessary, and the value of length 0 is the canonical choice.
+
+6.3. Challenge Request TLV
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Type = 18 | Length | Nonce...
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
+
+ Fields:
+
+ Type Set to 18 to indicate a Challenge Request TLV.
+
+ Length The length of the body, in octets, exclusive of the Type
+ and Length fields.
+
+ Nonce The nonce uniquely identifying the challenge, an opaque
+ string of 0 to 192 octets.
+
+ Nonces are limited to a size of 192 octets: a node MUST NOT send 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 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 that get encoded in the minimum number of octets
+ required; the value 0 is then encoded as the string of length 0.
+
+6.4. Challenge Reply TLV
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Type = 19 | Length | Nonce...
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
+
+ Fields:
+
+ Type Set to 19 to indicate a Challenge Reply TLV.
+
+ Length The length of the body, in octets, exclusive of the Type
+ and Length fields.
+
+ Nonce A copy of the nonce contained in the corresponding
+ Challenge Request.
+
+7. Security Considerations
+
+ This document defines a mechanism that provides basic security
+ properties for the Babel routing protocol. The scope of this
+ protocol is strictly limited: it only provides authentication (we
+ assume that routing 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 link. Deployments that need more
+ features, e.g., confidentiality or asymmetric keying, should use a
+ more feature-rich security mechanism such as the one described in
+ [RFC8968].
+
+ This mechanism relies on two assumptions, as described in
+ Section 1.2. First, it assumes that the MAC being used is
+ invulnerable to forgery (Section 1.1 of [RFC6039]); at the time of
+ writing, HMAC-SHA256, which is mandatory to implement (Section 4.1),
+ is believed to be safe against practical attacks.
+
+ Second, it assumes that indices and nonces are generated uniquely
+ over 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 for a given (key, source, destination) triple). This
+ property can be satisfied either by using a cryptographically secure
+ random number generator to generate indices and nonces that contain
+ enough entropy (64-bit values are believed to be large enough for all
+ practical applications) or by using a reliably monotonic hardware
+ clock. If uniqueness cannot be guaranteed (e.g., because a hardware
+ clock has been reset), then rekeying is necessary.
+
+ The expiry mechanism mandated in Section 4.4 is required to 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
+ (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 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 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 redirect or blackhole traffic to
+ destinations previously advertised by the sender.
+
+ This protocol exposes large numbers of packets and their MACs to an
+ 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 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 reason, it is necessary to derive keys from a human-
+ readable passphrase, it is recommended to use a key derivation
+ function that hampers dictionary attacks, such as PBKDF2 [RFC8018],
+ bcrypt [BCRYPT], or scrypt [RFC7914]. In that case, 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 generation
+ (e.g., an administrator's secure laptop computer).
+
+ While it is probably not possible to be immune against denial of
+ service (DoS) attacks in general, this protocol includes a number of
+ mechanisms designed to mitigate such attacks. In particular,
+ reception of a packet with no correct MAC creates no local Babel
+ state (Section 4.3). Reception of a replayed packet with correct
+ MAC, on the other hand, causes a challenge to be sent; this is
+ mitigated somewhat by requiring that challenges be rate limited
+ (Section 4.3.1.1).
+
+ Receiving a replayed packet with an obsolete index causes an entry to
+ be created in the neighbour table, which, at first sight, makes the
+ protocol susceptible to resource exhaustion attacks (similarly to the
+ familiar "TCP SYN Flooding" attack [RFC4987]). However, the MAC
+ computation includes the sender address (Section 4.1), and thus the
+ amount of storage that an 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 [RFC8966], which mandates that the
+ source address is a link-local IPv6 address or a local IPv4 address).
+
+ In order to make this kind of resource exhaustion attacks less
+ effective, implementations may use a separate table of uncompleted
+ challenges that is separate from the neighbour table used by the core
+ protocol (the data structures described in Section 3.2 of [RFC8966]
+ are conceptual, and any data structure that yields the same result
+ may be used). Implementers might also consider using the fact that
+ the nonces included in Challenge Requests and Replies can be fairly
+ large (up to 192 octets), which should in principle allow encoding
+ the per-challenge state as a secure "cookie" within the nonce itself;
+ note, however, that any such scheme will need to prevent cookie
+ replay.
+
+8. IANA Considerations
+
+ IANA has allocated the following values in the Babel TLV Types
+ registry:
+
+ +======+===================+===========+
+ | Type | Name | Reference |
+ +======+===================+===========+
+ | 16 | MAC | RFC 8967 |
+ +------+-------------------+-----------+
+ | 17 | PC | RFC 8967 |
+ +------+-------------------+-----------+
+ | 18 | Challenge Request | RFC 8967 |
+ +------+-------------------+-----------+
+ | 19 | Challenge Reply | RFC 8967 |
+ +------+-------------------+-----------+
+
+ Table 1
+
+9. References
+
+9.1. Normative References
+
+ [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed-
+ Hashing for Message Authentication", RFC 2104,
+ DOI 10.17487/RFC2104, February 1997,
+ <https://www.rfc-editor.org/info/rfc2104>.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119,
+ DOI 10.17487/RFC2119, March 1997,
+ <https://www.rfc-editor.org/info/rfc2119>.
+
+ [RFC6234] Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms
+ (SHA and SHA-based HMAC and HKDF)", RFC 6234,
+ DOI 10.17487/RFC6234, May 2011,
+ <https://www.rfc-editor.org/info/rfc6234>.
+
+ [RFC7693] Saarinen, M-J., Ed. and J-P. Aumasson, "The BLAKE2
+ Cryptographic Hash and Message Authentication Code (MAC)",
+ RFC 7693, DOI 10.17487/RFC7693, November 2015,
+ <https://www.rfc-editor.org/info/rfc7693>.
+
+ [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
+ 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
+ May 2017, <https://www.rfc-editor.org/info/rfc8174>.
+
+ [RFC8966] Chroboczek, J. and D. Schinazi, "The Babel Routing
+ Protocol", RFC 8966, DOI 10.17487/RFC8966, January 2021,
+ <https://www.rfc-editor.org/info/rfc8966>.
+
+9.2. Informational References
+
+ [BCRYPT] Niels, P. and D. Mazières, "A Future-Adaptable Password
+ Scheme", Proceedings of the FREENIX Track: 1999 USENIX
+ Annual Technical Conference, June 1999.
+
+ [RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker,
+ "Randomness Requirements for Security", BCP 106, RFC 4086,
+ DOI 10.17487/RFC4086, June 2005,
+ <https://www.rfc-editor.org/info/rfc4086>.
+
+ [RFC4987] Eddy, W., "TCP SYN Flooding Attacks and Common
+ Mitigations", RFC 4987, DOI 10.17487/RFC4987, August 2007,
+ <https://www.rfc-editor.org/info/rfc4987>.
+
+ [RFC6039] Manral, V., Bhatia, M., Jaeggli, J., and R. White, "Issues
+ with Existing Cryptographic Protection Methods for Routing
+ Protocols", RFC 6039, DOI 10.17487/RFC6039, October 2010,
+ <https://www.rfc-editor.org/info/rfc6039>.
+
+ [RFC7298] Ovsienko, D., "Babel Hashed Message Authentication Code
+ (HMAC) Cryptographic Authentication", RFC 7298,
+ DOI 10.17487/RFC7298, July 2014,
+ <https://www.rfc-editor.org/info/rfc7298>.
+
+ [RFC7914] Percival, C. and S. Josefsson, "The scrypt Password-Based
+ Key Derivation Function", RFC 7914, DOI 10.17487/RFC7914,
+ August 2016, <https://www.rfc-editor.org/info/rfc7914>.
+
+ [RFC8018] Moriarty, K., Ed., Kaliski, B., and A. Rusch, "PKCS #5:
+ Password-Based Cryptography Specification Version 2.1",
+ RFC 8018, DOI 10.17487/RFC8018, January 2017,
+ <https://www.rfc-editor.org/info/rfc8018>.
+
+ [RFC8968] Décimo, A., Schinazi, D., and J. Chroboczek, "Babel
+ Routing Protocol over Datagram Transport Layer Security",
+ RFC 8968, DOI 10.17487/RFC8968, January 2021,
+ <https://www.rfc-editor.org/info/rfc8968>.
+
+Acknowledgments
+
+ The protocol described in this document is based on the original HMAC
+ protocol defined by Denis Ovsienko [RFC7298]. The use of a pseudo-
+ header was suggested by David Schinazi. The use of an index to avoid
+ replay was suggested by Markus Stenberg. The authors are also
+ indebted to Antonin Décimo, Donald Eastlake, Toke Høiland-Jørgensen,
+ Florian Horn, Benjamin Kaduk, Dave Taht, and Martin Vigoureux.
+
+Authors' Addresses
+
+ Clara Dô
+ IRIF, University of Paris-Diderot
+ 75205 Paris CEDEX 13
+ France
+
+ Email: clarado_perso@yahoo.fr
+
+
+ Weronika Kolodziejak
+ IRIF, University of Paris-Diderot
+ 75205 Paris CEDEX 13
+ France
+
+ Email: weronika.kolodziejak@gmail.com
+
+
+ Juliusz Chroboczek
+ IRIF, University of Paris-Diderot
+ Case 7014
+ 75205 Paris CEDEX 13
+ France
+
+ Email: jch@irif.fr