RFC 5981

Authorization for NSIS Signaling Layer Protocols

๐Ÿ“… published February 2011, from ietf

RFC 5981 ๐Ÿฆ‹ Authorization for NSIS Signaling Layer Protocols

Okay bestie, this is RFC 5981, called "Authorization for NSIS Signaling Layer Protocols" ๐Ÿ’…. It's an Experimental document, not a Standards Track one, so it's published for examination, experimentation, and evaluation ๐Ÿงช. The ISSN is 2070-1721, and it's dated February 2011. The authors are J. Manner (Aalto University), M. Stiemerling (NEC), H. Tschofenig (Nokia Siemens Networks), and R. Bless, Ed. (KIT) ๐Ÿซถ. The header doesn't list any RFCs it obsoletes or updates, so there's nothing to report on that front ๐Ÿ™ˆ.

Abstract

Okay so, signaling layer protocols in the NSIS framework can lean on GIST to handle authorization โœจ. But the signaling layer protocol sitting above GIST might still need its own separate authorization step when a node gets a request for a certain kind of service or resources ๐Ÿ”. This doc gives a generic model and object formats for session authorization inside the NSIS signaling layer protocols ๐Ÿงฉ. The whole point is letting network elements swap info so they can authorize resource use for a service, and coordinate actions between the signaling plane and the transport plane. Iconic, honestly ๐Ÿ‘‘.

Status of This Memo

This document is not an Internet Standards Track specification ๐Ÿ’…. It's published for examination, experimental implementation, and evaluation ๐Ÿงช.

This document defines an Experimental Protocol for the Internet community ๐ŸŒˆ. It's a product of the Internet Engineering Task Force (IETF), and it represents the consensus of the IETF community ๐Ÿซถ. It got public review and was approved for publication by the Internet Engineering Steering Group (IESG) โœจ. Not every IESG-approved document is a candidate for any level of Internet Standard, so check Section 2 of RFC 5741 for the details ๐Ÿ“š.

For info on the current status of this document, any errata, and how to send feedback, head to http://www.rfc-editor.org/info/rfc5981 ๐Ÿ”—.

Copyright (c) 2011 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 (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please read these carefully, because they spell out your rights and restrictions for 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 they're provided without warranty as described in the Simplified BSD License ๐Ÿ’œ.

Table of Contents

1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  3
2.  Conventions Used in This Document  . . . . . . . . . . . . . .  4
3.  Session Authorization Object . . . . . . . . . . . . . . . . .  4
  3.1.  Session Authorization Object format  . . . . . . . . . . .  5
  3.2.  Session Authorization Attributes . . . . . . . . . . . . .  6
    3.2.1.  Authorizing Entity Identifier  . . . . . . . . . . . .  7
    3.2.2.  Session Identifier . . . . . . . . . . . . . . . . . .  9
    3.2.3.  Source Address . . . . . . . . . . . . . . . . . . . .  9
    3.2.4.  Destination Address  . . . . . . . . . . . . . . . . . 11
    3.2.5.  Start Time . . . . . . . . . . . . . . . . . . . . . . 12
    3.2.6.  End Time . . . . . . . . . . . . . . . . . . . . . . . 13
    3.2.7.  NSLP Object List . . . . . . . . . . . . . . . . . . . 13
    3.2.8.  Authentication Data  . . . . . . . . . . . . . . . . . 15
4.  Integrity of the SESSION_AUTH Object . . . . . . . . . . . . . 15
  4.1.  Shared Symmetric Keys  . . . . . . . . . . . . . . . . . . 15
    4.1.1.  Operational Setting Using Shared Symmetric Keys  . . . 16
  4.2.  Kerberos . . . . . . . . . . . . . . . . . . . . . . . . . 17
  4.3.  Public Key . . . . . . . . . . . . . . . . . . . . . . . . 18
    4.3.1.  Operational Setting for Public-Key-Based
            Authentication . . . . . . . . . . . . . . . . . . . . 19
  4.4.  HMAC Signed  . . . . . . . . . . . . . . . . . . . . . . . 21
5.  Framework  . . . . . . . . . . . . . . . . . . . . . . . . . . 23
  5.1.  The Coupled Model  . . . . . . . . . . . . . . . . . . . . 23
  5.2.  The Associated Model with One Policy Server  . . . . . . . 23
  5.3.  The Associated Model with Two Policy Servers . . . . . . . 24
  5.4.  The Non-Associated Model . . . . . . . . . . . . . . . . . 24
6.  Message Processing Rules . . . . . . . . . . . . . . . . . . . 25
  6.1.  Generation of the SESSION_AUTH by an Authorizing Entity  . 25
  6.2.  Processing within the QoS NSLP . . . . . . . . . . . . . . 25
    6.2.1.  Message Generation . . . . . . . . . . . . . . . . . . 25
    6.2.2.  Message Reception  . . . . . . . . . . . . . . . . . . 26
    6.2.3.  Authorization (QNE or PDP) . . . . . . . . . . . . . . 26
    6.2.4.  Error Signaling  . . . . . . . . . . . . . . . . . . . 27
  6.3.  Processing with the NATFW NSLP . . . . . . . . . . . . . . 27
    6.3.1.  Message Generation . . . . . . . . . . . . . . . . . . 28
    6.3.2.  Message Reception  . . . . . . . . . . . . . . . . . . 28
    6.3.3.  Authorization (Router/PDP) . . . . . . . . . . . . . . 28
    6.3.4.  Error Signaling  . . . . . . . . . . . . . . . . . . . 29
  6.4.  Integrity Protection of NSLP Messages  . . . . . . . . . . 29
7.  Security Considerations  . . . . . . . . . . . . . . . . . . . 30
8.  IANA Considerations  . . . . . . . . . . . . . . . . . . . . . 31
9.  Acknowledgments  . . . . . . . . . . . . . . . . . . . . . . . 34
10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 34
  10.1. Normative References . . . . . . . . . . . . . . . . . . . 34
  10.2. Informative References . . . . . . . . . . . . . . . . . . 35

1. Introduction โœจ

Okay so the Next Steps in Signaling (NSIS) framework [RFC4080] is a whole suite of protocols for the next generation of Internet signaling ๐Ÿš€. It's built on a generalized transport protocol for signaling apps, the General Internet Signaling Transport (GIST) [RFC5971], plus a bunch of different signaling applications ๐ŸŽ€. Two signaling applications and their NSIS Signaling Layer Protocol (NSLP) have been designed so far: a Quality of Service application (QoS NSLP) [RFC5974] and a NAT/firewall application (NATFW NSLP) [RFC5973] ๐Ÿ’–.

The basic security architecture for NSIS is a chain-of-trust model ๐Ÿ”—. Each GIST hop may pick the appropriate security protocol, depending on what the signaling application needs ๐Ÿ”’. For example, two directly adjacent GIST peers may secure their communication with TCP/TLS ๐Ÿงš. This is giving flexibility ๐Ÿ’…: it works for a lot of different use cases, and it lets the signaling applications hand off security to GIST entirely โœจ. The catch is that several sessions from different signaling applications then get multiplexed onto the same GIST TLS connection ๐Ÿ‘€.

Yet, if you want finer-grained per-session or per-user admission control, you need a way to make sure a host's use of resources has been properly authorized before the signaling application commits the resource request ๐Ÿซฃ. Think a QoS reservation or NAT traversal mappings ๐ŸŒธ. To pull that off, there has to be info inside the NSLP message that can be used to verify the request is valid ๐Ÿ”. The fix is to give the host a Session Authorization Object, which gets inserted into the message and then verified by the respective network elements ๐Ÿ›ก๏ธ.

This document describes a generic NSLP-layer Session Authorization Object (SESSION_AUTH) that carries authorization info for the request ๐ŸŽŸ๏ธ. "Generic" here means every NSLP can use it ๐ŸŒˆ. The scheme is built on third-party tokens: a trusted third party hands out authentication tokens to clients and lets network elements verify the info ๐Ÿค. The requesting host puts the authorization info (for example, a policy object) it got from that trusted third party into the NSLP message, so the network resource request can be verified ๐Ÿ“‹. Then the network elements check the request and process it based on admission policy. For example, they might do a resource reservation, change bindings, or set a firewall filter ๐Ÿงฑ. This work builds on RFC 3520 [RFC3520] and RFC 3521 [RFC3521] ๐Ÿ’œ.

By default, using NSLP-layer session authorization means adding one authorization policy object ๐ŸŽ€. But to support end-to-end signaling and request authorization across different networks, a host starting an NSLP signaling session can add more than one SESSION_AUTH object to the message ๐ŸŒŸ. The identifier of the authorizing entity lets network elements use whichever third party they trust to verify the request ๐Ÿซถ.

2. Conventions Used in This Document

Okay, the key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be read as described in BCP 14, RFC 2119 [RFC2119] ๐Ÿ“–. Read them carefully, bestie ๐Ÿง.

The term "NSLP node" (NN) refers to an NSIS node running an NSLP that can use the authorization object covered in this document ๐Ÿ’…. Right now, that node would run either the QoS NSLP [RFC5974] or the NAT/Firewall NSLP [RFC5973] service ๐Ÿฆ‹.

3. Session Authorization Object ๐ŸŒธ

This section introduces a new NSLP-layer object called session authorization (SESSION_AUTH) ๐Ÿ’–. The SESSION_AUTH object can be used in the NSLP protocols that are currently specified, and in future ones too ๐Ÿ”ฎ.

The authorization attributes follow the format and specification given in RFC3520 [RFC3520] ๐Ÿ“š. Slay ๐Ÿ‘‘.

3.1. Session Authorization Object format ๐Ÿ“ฆ

Okay so the SESSION_AUTH object is basically a bundle of fields that describe the session, plus some other attributes ๐Ÿ’… Its header follows the generic NSLP object header, which means it can be used with any NSLP. Iconic, right? ๐ŸŽ€

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |A|B|r|r|         Type          |r|r|r|r|        Length         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   +                                                               +
   //         Session Authorization Attribute List                //
   +                                                               +
   +---------------------------------------------------------------+

The value for the Type field comes from the shared NSLP object type space ๐Ÿงš The Length field is measured in 32-bit words and counts the Value part of the TLV object. So it does not include the standard header, bestie.

The bits marked A and B are extensibility flags ๐Ÿฆ‹ They decide what happens to objects whose treatment hasn't been defined in the protocol spec, meaning objects whose Type the receiver doesn't recognise. There are four categories. They're here just for your information, and the real normative behaviour lives in the particular NSLP documents, like [RFC5974] [RFC5973].

  • AB=00 ("Mandatory"): If the object isn't understood, the entire message containing it MUST be rejected, and an error message MUST be sent back (usually with class/code "Protocol Error/Unknown object present") ๐Ÿ˜ญ
  • AB=01 ("Ignore"): If the object isn't understood, it MUST be deleted, and the rest of the message gets processed as usual ๐ŸŒธ
  • AB=10 ("Forward"): If the object isn't understood, it MUST be retained unchanged in any message forwarded as a result of message processing, but it MUST NOT be stored locally ๐Ÿงบ
  • AB=11 ("Refresh"): If the object isn't understood, it should be incorporated into the locally stored signaling application state for this flow/session, forwarded in any resulting message, and also used in any refresh or repair message generated locally. This flag combo isn't used by every NSLP. For example, it isn't used in the NATFW NSLP ๐Ÿ™ˆ

The remaining r bits are reserved ๐Ÿ”’ The extensibility flags follow the definition in the GIST spec. The SESSION_AUTH object defined here MUST have the AB bits set to "10" โœจ An NSLP Node (NN) may use the authorization information if it's configured to, but it may also just skip the object. Totally valid, no judgement ๐Ÿซถ

Here are the key details:

Type: SESSION_AUTH_OBJECT (0x016)

Length: Variable, contains length of session authorization object list in units of 32-bit words.

Session Authorization Attribute List: variable length

The session authorization attribute list is a collection of objects that describes the session and gives any other info needed to verify a resource request (like a resource reservation, binding, or firewall filter change request) ๐Ÿ’– An initial set of valid objects is described in Section 3.2.

3.2. Session Authorization Attributes ๐ŸŽ€

A session authorization attribute can hold all kinds of info, and it has both an attribute type and a sub-type ๐ŸŒˆ The attribute itself MUST be a multiple of 4 octets long. Any attribute that isn't a multiple of 4 octets MUST be padded out to a 4-octet boundary, and all padding bytes MUST have a value of zero ๐Ÿ’œ

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |    X-Type     |   SubType     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                           Value ...                         //
   +---------------------------------------------------------------+

Length: 16 bits ๐Ÿ“

The Length field is two octets and tells you the actual length of the attribute in octets, counting the Length, X-Type, and SubType fields too. The length does not include any padding added to the value field to make the attribute a multiple of 4 octets. Padding is not your friend here, sis ๐Ÿ™ˆ

X-Type: 8 bits ๐Ÿ”‘

The X-Type field (the session authorization attribute type) is one octet. IANA acts as a registry for X-Types, as described in Section 8, IANA Considerations ๐Ÿ“‹ This spec uses the following X-Types:

  1. AUTH_ENT_ID: The unique identifier of the entity that authorized the session ๐Ÿ‘‘
  2. SESSION_ID: The unique identifier for this session, usually created locally at the authorizing entity. See also RFC 3520 [RFC3520]. Don't mix it up with the SESSION-ID of GIST/NSIS, that's a different thing ๐Ÿ™ƒ
  3. SOURCE_ADDR: The address specification for the signaling session initiator, i.e., the source address of the signaling message originator ๐Ÿงญ
  4. DEST_ADDR: The address specification for the signaling session endpoint ๐ŸŽฏ
  5. START_TIME: The starting time for the session โฐ
  6. END_TIME: The end time for the session โŒ›
  7. AUTHENTICATION_DATA: The authentication data of the Session Authorization Object ๐Ÿ”

SubType: 8 bits ๐Ÿงฉ

The session authorization attribute sub-type is one octet long. Its value depends on the X-Type ๐Ÿ’…

Value: variable length ๐ŸŒธ

This is the attribute-specific information ๐Ÿ’–

3.2.1. Authorizing Entity Identifier ๐Ÿชช

The AUTH_ENT_ID identifies the entity that authorized the initial service request and generated the Session Authorization Object โœจ It can be represented in various formats, and the SubType is what defines the format of the ID. Here's the layout:

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |    X-Type     |   SubType     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                        OctetString ...                      //
   +---------------------------------------------------------------+

Length: Length of the attribute, which MUST be > 4.

X-Type: AUTH_ENT_ID

SubType: here's the list of defined sub-types for AUTH_ENT_ID. IANA acts as a registry for AUTH_ENT_ID SubTypes too, as described in Section 8, IANA Considerations. To start, the registry holds these SubTypes of AUTH_ENT_ID:

  1. IPV4_ADDRESS: IPv4 address represented in 32 bits ๐ŸŒ
  2. IPV6_ADDRESS: IPv6 address represented in 128 bits ๐ŸŒ
  3. FQDN: Fully Qualified Domain Name as defined in [RFC1034], as an ASCII string ๐Ÿท๏ธ
  4. ASCII_DN: X.500 Distinguished name as defined in [RFC4514], as an ASCII string ๐Ÿ“‡
  5. UNICODE_DN: X.500 Distinguished name as defined in [RFC4514], as a UTF-8 string ๐Ÿช„
  6. URI: Universal Resource Identifier, as defined in [RFC3986] ๐Ÿ”—
  7. KRB_PRINCIPAL: Fully Qualified Kerberos Principal name, represented by the ASCII string of a principal followed by the @ realm name as defined in [RFC4120] (e.g., johndoe@nowhere) ๐ŸŽซ
  8. X509_V3_CERT: The Distinguished Name of the subject of the certificate, as defined in [RFC4514] as a UTF-8 string ๐Ÿ“œ
  9. PGP_CERT: The OpenPGP certificate of the authorizing entity, as defined as Public-Key Packet in [RFC4880] ๐Ÿ”
  10. HMAC_SIGNED: Indicates that the AUTHENTICATION_DATA attribute contains a self-signed HMAC signature [RFC2104] that ensures the integrity of the NSLP message. The HMAC is calculated over all NSLP objects given in the NSLP_OBJECT_LIST attribute, which MUST also be present. The object specifies the hash algorithm used for the HMAC calculation as a Transform ID from Transform Type 3 of the IKEv2 registry [RFC5996] ๐Ÿ›ก๏ธ

OctetString: Contains the authorizing entity identifier.

3.2.2. Session Identifier ๐Ÿ†”

SESSION_ID is a unique identifier that the authorizing entity uses to identify the request ๐Ÿ’œ It can be used for a bunch of things, including replay detection, or to link this request to a policy decision entry the authorizing entity made. For example, the SESSION_ID can be based on simple sequence numbers or on a standard NTP timestamp โฑ๏ธ

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |    X-Type     |   SubType     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                        OctetString ...                      //
   +---------------------------------------------------------------+

Length: Length of the attribute, which MUST be > 4.

X-Type: SESSION_ID

SubType: no sub-types for SESSION_ID are defined yet, so this field MUST be set to zero ๐Ÿ“ The authorizing entity is the only network entity that needs to interpret the contents of the SESSION_ID. That means the contents and format are implementation dependent, so the sky's the limit ๐ŸŒˆ

OctetString: The OctetString contains the session identifier.

3.2.3. Source Address ๐Ÿฆ‹

okay so SOURCE_ADDR is the attribute that says which source address (and port) the authorized session is actually for ๐Ÿ’… This X-Type can be super useful when you need to make sure the resource request was authorized for that exact source address and/or port ๐Ÿ‘€ Usually it lines up with the signaling source, like the IP source address of the GIST packet, or the flow source or flow destination address. Those last two live in the GIST MRI (Message Routing Information) object ๐ŸŒธ

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |    X-Type     |   SubType     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                        OctetString ...                      //
   +---------------------------------------------------------------+

Length: the length of the attribute, which MUST be > 4 โœจ

X-Type: SOURCE_ADDR

SubType: the following sub-types for SOURCE_ADDR are defined ๐Ÿงš IANA acts as a registry for SOURCE_ADDR SubTypes, as described in Section 8, IANA Considerations. Initially, the registry contains these SubTypes for SOURCE_ADDR:

  1. IPV4_ADDRESS: IPv4 address represented in 32 bits.
  2. IPV6_ADDRESS: IPv6 address represented in 128 bits.
  3. UDP_PORT_LIST: list of UDP port specifications, represented as 16 bits per list entry.
  4. TCP_PORT_LIST: list of TCP port specifications, represented as 16 bits per list entry.
  5. SPI: Security Parameter Index, represented in 32 bits.

OctetString: the OctetString holds the source address information ๐Ÿซถ

In scenarios where a source address is required (see Section 5), at least one of the sub-types 1 or 2 MUST be included in every Session Authorization Object ๐Ÿ”ฅ Multiple SOURCE_ADDR attributes MAY be included if multiple addresses have been authorized, so you can be a whole main character with several addresses ๐Ÿ‘‘ The source address of the request (e.g., a QoS NSLP RESERVE) MUST match one of the SOURCE_ADDR attributes contained in this Session Authorization Object. No mismatches, bestie ๐Ÿ’€

At most, one instance of sub-type 3 MAY be included in every Session Authorization Object ๐ŸŒˆ At most, one instance of sub-type 4 MAY be included in every Session Authorization Object too. Including a sub-type 3 attribute doesn't stop you from including a sub-type 4 attribute, so both UDP and TCP ports can be authorized at the same time ๐Ÿฆ‹

If no PORT attributes are specified, then all ports are considered valid. Otherwise, only the specified ports are authorized for use ๐ŸŒธ Every source address and port list must be included in a separate SOURCE_ADDR attribute ๐Ÿ’œ

3.2.4. Destination Address ๐ŸŒท

DEST_ADDR is how we identify the destination address of the authorized session ๐Ÿ’– It's giving the same energy as SOURCE_ADDR, just on the other end. This X-Type can help make sure the resource request was authorized for that particular destination address and/or port ๐ŸŽ€

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |    X-Type     |   SubType     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                        OctetString ...                      //
   +---------------------------------------------------------------+

Length: the length of the attribute in number of octets, which MUST be > 4 โœจ

X-Type: DEST_ADDR

SubType: the following sub-types for DEST_ADDR are defined ๐Ÿ“ IANA acts as a registry for DEST_ADDR SubTypes, as described in Section 8, IANA Considerations. Initially, the registry contains these SubTypes for DEST_ADDR:

  1. IPV4_ADDRESS: IPv4 address represented in 32 bits.
  2. IPV6_ADDRESS: IPv6 address represented in 128 bits.
  3. UDP_PORT_LIST: list of UDP port specifications, represented as 16 bits per list entry.
  4. TCP_PORT_LIST: list of TCP port specifications, represented as 16 bits per list entry.
  5. SPI: Security Parameter Index, represented in 32 bits.

OctetString: the OctetString holds the destination address specification ๐Ÿซถ

In scenarios where a destination address is required (see Section 5), at least one of the sub-types 1 or 2 MUST be included in every Session Authorization Object ๐Ÿ˜ญ Multiple DEST_ADDR attributes MAY be included if multiple addresses have been authorized. The destination address field of the resource reservation datagram (e.g., QoS NSLP Reserve) MUST match one of the DEST_ADDR attributes contained in this Session Authorization Object. Same rule, other side of the call ๐Ÿ“ž

At most, one instance of sub-type 3 MAY be included in every Session Authorization Object ๐ŸŒธ At most, one instance of sub-type 4 MAY be included in every Session Authorization Object. Including a sub-type 3 attribute doesn't prevent a sub-type 4 attribute, so both UDP and TCP ports may be authorized (iconic, honestly) ๐Ÿฆ‹

If no PORT attributes are specified, then all ports are considered valid. Otherwise, only the specified ports are authorized for use โœจ

Every destination address and port list must be included in a separate DEST_ADDR attribute ๐Ÿ’…

3.2.5. Start Time โฐ

START_TIME identifies when the authorized session starts, and it can be used to prevent replay attacks ๐Ÿ”ฅ If the SESSION_AUTH object shows up in a resource request, the network SHOULD reject the request if it isn't received within a few seconds of the start time specified. Late is not the vibe here ๐Ÿ’€

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |    X-Type     |   SubType     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                        OctetString ...                      //
   +---------------------------------------------------------------+

Length: the length of the attribute, which MUST be > 4 โœจ

X-Type: START_TIME

SubType: the following sub-type for START_TIME is defined ๐ŸŒˆ IANA acts as a registry for START_TIME SubTypes, as described in Section 8, IANA Considerations. Initially, the registry contains this SubType for START_TIME:

OctetString: the OctetString holds the start time ๐Ÿซถ

3.2.6. End Time ๐Ÿ•ฐ๏ธ

END_TIME identifies when the authorized session ends. It can be used to limit how long resources are authorized for use, like in prepaid session scenarios ๐Ÿ’ธ Time's up, babe ๐Ÿงš

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |    X-Type     |   SubType     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                        OctetString ...                      //
   +---------------------------------------------------------------+

Length: the length of the attribute, which MUST be > 4 โœจ

X-Type: END_TIME

SubType: the following sub-type for END_TIME is defined ๐Ÿ’œ IANA acts as a registry for END_TIME SubTypes, as described in Section 8, IANA Considerations. Initially, the registry contains this SubType for END_TIME:

OctetString: the OctetString holds the end time ๐ŸŒธ

3.2.7. NSLP Object List ๐Ÿ“œ

The NSLP_OBJECT_LIST attribute holds a list of NSLP object types that go into the keyed-hash computation, and the result of that computation is given in the AUTHENTICATION_DATA attribute ๐Ÿ” This is how you get integrity protection for NSLP PDUs, which is so iconic of it ๐Ÿ‘‘ If an NSLP_OBJECT_LIST attribute has been included in the SESSION_AUTH object, then an AUTHENTICATION_DATA attribute MUST also be present. No solo NSLP_OBJECT_LISTs allowed ๐Ÿ™ˆ

The creator of this attribute lists every NSLP object type whose NSLP PDU object was included in the hash computation. The hash computation has to follow the order of the NSLP object types exactly as the list gives them ๐ŸŽ€ The receiver can verify the integrity of the NSLP PDU by hashing all NSLP objects listed in this attribute (in the given order), including all the attributes of the authorization object. Since all NSLP object types are unique across every NSLP, this works for any NSLP โœจ

Basic NSIS Transport Layer Protocol (NTLP) and NSLP objects, like the session ID, the NSLPID, and the MRI, MUST always be included in the HMAC ๐Ÿฆ‹ They aren't carried within the NSLP itself, only within GIST, so they have to be provided for the HMAC calculation, e.g., they can be delivered via the GIST API. They MUST be normalized to their network representation from [RFC5971] again before the hash is calculated. These values MUST be hashed first (in the order session ID, NSLPID, MRI), before any other NSLP object values that are included in the hash computation. Order matters, periodt ๐Ÿ’…

A summary of the NSLP_OBJECT_LIST attribute format is below ๐ŸŒท

    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
   +---------------+---------------+---------------+---------------+
   | Length                        | NSLP_OBJ_LIST |     zero      |
   +---------------+---------------+-------+-------+---------------+
   | # of signed NSLP objects = n  |  rsv  |  NSLP object type (1) |
   +-------+-------+---------------+-------+-------+---------------+
   |  rsv  | NSLP object type (2)  |             .....            //
   +-------+-------+---------------+---------------+---------------+
   |  rsv  | NSLP object type (n)  |     (padding if required)     |
   +--------------+----------------+---------------+---------------+

Length: the length of the attribute, which MUST be > 4 โœจ

X-Type: NSLP_OBJECT_LIST

SubType: no sub-types for NSLP_OBJECT_LIST are currently defined. This field MUST be set to 0 and ignored upon reception ๐Ÿงš

# of signed NSLP objects: the number n of NSLP object types that follow. n=0 is allowed. In that case, only a padding field is contained ๐Ÿ“

rsv: reserved bits; MUST be set to 0 and ignored upon reception ๐Ÿซถ

NSLP object type: the NSLP 12-bit object type identifier of the object that was included in the hash calculation. The NSLP object type values comprise only 12 bits, so four bits per type value are currently not used within the list. Depending on the number of signed objects, a corresponding padding word of 16 bits must be supplied ๐ŸŒˆ

padding: padding MUST be added if the number of NSLP objects is even, and MUST NOT be added if the number of NSLP objects is odd. If padding has to be applied, the padding field MUST be 16 bits set to 0, and its contents MUST be ignored upon reception ๐ŸŒธ

3.2.8. Authentication Data ๐Ÿ”

okay so the AUTHENTICATION_DATA attribute holds the authentication data for the SESSION_AUTH object, and it signs everything in the object up to the AUTHENTICATION_DATA itself ๐Ÿซถ. if it's included, it MUST be the last attribute in the list, no exceptions bestie ๐Ÿ’…. the algorithm used to compute the authentication data depends on the AUTH_ENT_ID SubType field, so peep Section 4 entitled "Integrity of the SESSION_AUTH Object" for the full tea ๐Ÿต.

here's a quick glow-up of the AUTHENTICATION_DATA attribute 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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |    X-Type     |   SubType     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                        OctetString ...                      //
   +---------------------------------------------------------------+

Length: the length of the attribute, which MUST be > 4. ๐Ÿ“

X-Type: AUTHENTICATION_DATA ๐Ÿท๏ธ

SubType: no sub-types for AUTHENTICATION_DATA are currently defined. this field MUST be set to 0 and ignored upon reception ๐Ÿ™ˆ

OctetString: the OctetString holds the authentication data of the SESSION_AUTH. ๐Ÿ”


4. Integrity of the SESSION_AUTH Object โœจ

this section is all about making sure the SESSION_AUTH object's integrity stays intact, so nobody can sneak in and mess with it ๐Ÿ›ก๏ธ

4.1. Shared Symmetric Keys ๐Ÿ—๏ธ

in shared symmetric key environments, the AUTH_ENT_ID MUST be of sub-types: IPV4_ADDRESS, IPV6_ADDRESS, FQDN, ASCII_DN, UNICODE_DN, or URI. here's an example SESSION_AUTH object ๐Ÿง:

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |1|0|0|0| Type = SESSION_AUTH   |0|0|0|0|    Object Length      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |   AUTH_ENT_ID | IPV4_ADDRESS  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   OctetString ...   (The authorizing entity's Identifier)     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |   AUTH_DATA   |     zero      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                            Key-ID                             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   OctetString ...   (Authentication data)                     |
   +---------------------------------------------------------------+

                Figure 1: Example of a SESSION_AUTH Object

4.1.1. Operational Setting Using Shared Symmetric Keys ๐Ÿ”‘

this assumes both the Authorizing Entity and the network router/PDP (Policy Decision Point) are provisioned with shared symmetric keys, policies detailing which algorithm to be used for computing the authentication data, and the expected length of the authentication data for that particular algorithm ๐Ÿ“‹

key maintenance is outside the scope of this document, but SESSION_AUTH implementations MUST at least provide the ability to manually configure keys and their parameters ๐Ÿ› ๏ธ the key used to produce the authentication data is identified by the AUTH_ENT_ID field. since multiple keys may be configured for a particular AUTH_ENT_ID value, the first 32 bits of the AUTHENTICATION_DATA field MUST be a Key-ID to be used to identify the appropriate key ๐Ÿ†” each key must also be configured with lifetime parameters for the time period within which it is valid, as well as an associated cryptographic algorithm parameter specifying the algorithm to be used with the key โณ at a minimum, all SESSION_AUTH implementations MUST support the HMAC-SHA2-256 [RFC4868] [RFC2104] cryptographic algorithm for computing the authentication data ๐Ÿ’œ

it is good practice to regularly change keys ๐Ÿ”„ Keys MUST be configurable such that their lifetimes overlap, thereby allowing smooth transitions between keys ๐ŸŒˆ at the midpoint of the lifetime overlap between two keys, senders should transition from using the current key to the next/longer-lived key. meanwhile, receivers simply accept any identified key received within its configured lifetime and reject those that are not ๐Ÿฆ‹

4.2. Kerberos ๐ŸŽซ

since Kerberos [RFC4120] is widely used for end-user authorization, e.g., in Windows domains, it is well suited for being used in the context of user-based authorization for NSIS sessions ๐Ÿ‘‘ for instance, a user may request a ticket for authorization to install rules in an NATFW-capable router ๐Ÿงš

in a Kerberos environment, it is assumed that the user of the NSLP requesting host requests a ticket from the Kerberos Key Distribution Center (KDC) for using the NSLP node (router) as a resource (target service) ๐ŸŽŸ๏ธ the NSLP requesting host (client) can present the ticket to the NSLP node via Kerberos by sending a KRB_CRED message to the NSLP node independently but prior to the NSLP exchange. so the principal name of the service must be known at the client in advance, though the exact IP address may not be known in advance ๐Ÿ“‡ how the name is assigned and made available to the client is implementation specific. the extracted common session key can subsequently be used to employ the HMAC_SIGNED variant of the SESSION_AUTH object ๐Ÿ”

another option is to encapsulate the credentials in the AUTHENTICATION_DATA portion of the SESSION_AUTH object. in this case, the AUTH_ENT_ID MUST be of the sub-type KRB_PRINCIPAL. the KRB_PRINCIPAL field is defined as the Fully Qualified Kerberos Principal name of the authorizing entity ๐Ÿงพ the AUTHENTICATION_DATA portion of the SESSION_AUTH object contains the KRB_CRED message that the receiving NSLP node has to extract and verify. a second SESSION_AUTH object of type HMAC_SIGNED SHOULD protect the integrity of the NSLP message, including the prior SESSION_AUTH object. the session key included in the first SESSION_AUTH object has to be used for HMAC calculation ๐Ÿซถ

an example of the Kerberos AUTHENTICATION_DATA object is shown below in Figure 2 โœจ

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |1|0|0|0| Type = SESSION_AUTH   |0|0|0|0|    Object Length      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |   AUTH_ENT_ID |  KERB_P.      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   OctetString ...   (The principal@realm name)                |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |   AUTH_DATA   |     zero      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   OctetString ...   (KRB_CRED Data)                           |
   +---------------------------------------------------------------+

        Figure 2: Example of a Kerberos AUTHENTICATION_DATA Object

4.3. Public Key ๐Ÿ—๏ธ๐Ÿ’–

in a public key environment, the AUTH_ENT_ID MUST be of the sub-types: X509_V3_CERT or PGP_CERT. the authentication data is used for authenticating the authorizing entity ๐Ÿชช two examples of the public key SESSION_AUTH object are shown in Figures 3 and 4 ๐Ÿ‘€

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |1|0|0|0| Type = SESSION_AUTH   |0|0|0|0|    Object Length      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |   AUTH_ENT_ID |   PGP_CERT    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   OctetString ...   (Authorizing entity Digital Certificate)  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |   AUTH_DATA   |     zero      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   OctetString ...   (Authentication data)                     |
   +---------------------------------------------------------------+

    Figure 3: Example of a SESSION_AUTH_OBJECT Using a PGP Certificate
    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |1|0|0|0| Type = SESSION_AUTH   |0|0|0|0|    Object   Length    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |   AUTH_ENT_ID | X509_V3_CERT  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   OctetString ...   (Authorizing entity Digital Certificate)  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |   AUTH_DATA   |     zero      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   OctetString ...   (Authentication data)                     |
   +---------------------------------------------------------------+

     Figure 4: Example of a SESSION_AUTH_OBJECT Using an X509_V3_CERT
                                Certificate

4.3.1. Operational Setting for Public-Key-Based Authentication ๐Ÿ”๐ŸŒธ

public-key-based authentication assumes the following ๐Ÿง 

  • authorizing entities have a pair of keys (private key and public key) ๐Ÿ”‘
  • the private key is secured with the authorizing entity ๐Ÿ”’
  • public keys are stored in digital certificates; a trusted party, the certificate authority (CA), issues these digital certificates ๐Ÿ“œ
  • the verifier (PDP or router) has the ability to verify the digital certificate โœ…

the authorizing entity uses its private key to generate AUTHENTICATION_DATA. authenticators (router, PDP) use the authorizing entity's public key (stored in the digital certificate) to verify and authenticate the object. it's giving trust chain, bestie ๐Ÿซถ๐Ÿ’…

4.3.1.1. X.509 V3 Digital Certificates โœจ

okay bestie, so when the AUTH_ENT_ID is of type X509_V3_CERT, the AUTHENTICATION_DATA MUST be generated by the authorizing entity like this ๐Ÿ’…

  • First, a signed-data gets built the way [RFC5652] says. A digest is then computed on the content (as specified in Section 6.1) using a signer-specific message-digest algorithm. The certificates field holds the chain of X.509 V3 digital certificates from each authorizing entity, and the certificate revocation list goes in the crls field. Last step: the digest output gets digitally signed following Section 8 of RFC 3447 [RFC3447], using the signer's private key ๐Ÿ”

now the other side of the coin: when it's X509_V3_CERT, the verification at the verifying network element (PDP or router) MUST be done following these steps ๐Ÿ‘€

  • Parse the X.509 V3 certificate to pull out the distinguished name of the issuer of the certificate.
  • Certification Path Validation is performed as defined in Section 6 of RFC 5280 [RFC5280].
  • Parse through the Certificate Revocation list to check that the received certificate is not listed.
  • Once the X.509 V3 certificate is validated, the public key of the authorizing entity can be extracted from the certificate.
  • Extract the digest algorithm and the length of the digested data by parsing the CMS (Cryptographic Message Syntax) signed-data.
  • The recipient independently computes the message digest. This message digest and the signer's public key are used to verify the signature value.

and that whole check gives you integrity, non-repudiation, and data origin. iconic, honestly ๐Ÿซถ

4.3.1.2. PGP Digital Certificates ๐ŸŒธ

when the AUTH_ENT_ID is of type PGP_CERT, the AUTHENTICATION_DATA MUST be generated by the authorizing entity following these steps:

AUTHENTICATION_DATA holds a Signature Packet as defined in Section 5.2.3 of [RFC4880]. the short version:

  • Compute the hash of all data in the SESSION_AUTH object up to the AUTHENTICATION_DATA.
  • The hash output is digitally signed following Section 8 of RFC 3447, using the signer's private key.

and for PGP_CERT, the verification MUST be done by the verifying network element (PDP or router) like so ๐Ÿงš

  • Validate the certificate.
  • Once the PGP certificate is validated, the public key of the authorizing entity can be extracted from the certificate.
  • Extract the hash algorithm and the length of the hashed data by parsing the PGP signature packet.
  • The recipient independently computes the message digest. This message digest and the signer's public key are used to verify the signature value.

same energy as before: integrity, non-repudiation, and data origin, all in one check ๐Ÿ’–


4.4. HMAC Signed ๐Ÿ”ฅ

a SESSION_AUTH object that carries an AUTH_ENT_ID of HMAC_SIGNED is used as integrity protection for NSLP messages. the SESSION_AUTH object MUST contain these attributes:

  • SOURCE_ADDR: the source address of the entity that created the HMAC
  • START_TIME: the timestamp when the HMAC signature was calculated. This MUST be different for any two messages in sequence, so replay attacks don't get a free pass. The NTP timestamp currently gives you a resolution of 200 picoseconds, which should be sufficient.
  • NSLP_OBJECT_LIST: lists all NSLP objects that are included in the HMAC calculation.
  • AUTHENTICATION_DATA: contains the Key-ID that's used for the HMAC calculation, plus the HMAC data itself [RFC2104].

the key for the HMAC calculation must be exchanged securely by some other means, e.g., a Kerberos Ticket or pre-shared manual installation, etc. the Key-ID in the AUTHENTICATION_DATA points you to the right key, and it also lets you periodically change signing keys within a session ๐Ÿ”‘

the key length MUST be at least 64 bits, but ideally it's longer so it holds up against brute-force attacks during the key validity period ๐Ÿ’ช for scalability reasons, it's suggested to use a per-user key for signing NSLP messages. a per-session key is possible too, but that costs a per-session key exchange. a per-user key lets you verify the authenticity of the message, which gives you a basis for session-based per-user authorization โœจ

it is RECOMMENDED to periodically change the shared key so eavesdroppers can't go off-line brute-forcing it ๐Ÿ™ˆ the actual hash algorithm used in the HMAC computation is specified by the "Transform ID" field (given as Transform Type 3 of the IKEv2 registry [RFC5996]). the hash algorithm MUST be chosen consistently between the object creator and the NN verifying the HMAC. this can be sorted out with out-of-band mechanisms when the shared key is exchanged.

Figure 5 shows an example of an object that's used for integrity protection of NSLP messages ๐Ÿฆ‹

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |1|0|0|0| Type = SESSION_AUTH   |0|0|0|0|    Object   Length    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |   AUTH_ENT_ID | HMAC_SIGNED   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                   reserved                    | Transform ID  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             | SOURCE_ADDR   |  IPV4_ADDRESS |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                IPv4 Source Address of NSLP sender             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             |  START_TIME   | NTP_TIME_STAMP|
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        NTP Time Stamp (1)                     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        NTP Time Stamp (2)                     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Length             | NSLP_OBJ_LIST |     zero      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |No. of signed NSLP objects = n |  rsv  |  NSLP object type (1) |
   +-------+-------+---------------+-------+-------+---------------+
   |  rsv  | NSLP object type (2)  |             .....            //
   +-------+-------+---------------+---------------+---------------+
   |  rsv  | NSLP object type (n)  |     (padding if required)     |
   +--------------+----------------+---------------+---------------+
   |            Length             |   AUTH_DATA   |     zero      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                            Key-ID                             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Message Authentication Code HMAC Data                |
   +---------------------------------------------------------------+
    Figure 5: Example of a SESSION_AUTH_OBJECT That Provides Integrity
                       Protection for NSLP Messages

5. Framework ๐ŸŒˆ

[RFC3521] describes a framework in which the SESSION_AUTH object may be utilized to carry the info needed for authorizing resource reservation for data flows (e.g., media flows). [RFC3521] introduces four different models:

  1. The coupled model
  2. The associated model with one policy server
  3. The associated model with two policy servers
  4. The non-associated model

which fields are REQUIRED in a SESSION_AUTH object depends on which of these models you're using. (okay that one's in caps for real, it's a keyword, so I'm keeping it exact.)

5.1. The Coupled Model ๐Ÿฆ‹

in the coupled model, the only thing the SESSION_AUTH object MUST include is the SESSION_ID. the Authorizing Entity uses it to match the resource reservation request with the media that got authorized during session setup. since the End Host is assumed to be untrusted, the Policy Server SHOULD take measures to keep the integrity of the SESSION_ID intact in transit. the exact mechanisms and the format of the SESSION_ID are implementation dependent ๐Ÿคทโ€โ™€๏ธ

5.2. The Associated Model with One Policy Server ๐Ÿ’œ

in this model, the contents of the SESSION_AUTH object MUST include:

  • A session identifier, SESSION_ID. This is the info the authorizing entity uses to correlate the resource request with the data flows authorized during session setup.
  • The identity of the authorizing entity, AUTH_ENT_ID. An NN uses this to figure out which authorizing entity (Policy Server) it should ask for resource policy decisions.

in some environments, an NN might have no way to tell whether the identity points to a legit Policy Server inside its domain. to guard against authorization requests getting redirected to a bogus authorizing entity, the SESSION_AUTH MUST also include:

  • AUTHENTICATION_DATA. This authentication data is calculated over all other fields of the SESSION_AUTH object.

5.3. The Associated Model with Two Policy Servers ๐ŸŽ€

the content of the SESSION_AUTH object is identical to the associated model with one policy server. same vibes, no notes ๐Ÿซถ

5.4. The Non-Associated Model ๐Ÿ‘‘

in this model, the SESSION_AUTH object MUST contain enough info for the Policy Server to make resource policy decisions on its own, without the authorizing entity. the object gets created by the authorizing entity using info about the session. the information in the SESSION_AUTH object MUST include:

  • Initiating party's IP address or Identity (e.g., FQDN): SOURCE_ADDR X-Type
  • Responding party's IP address or Identity (e.g., FQDN): DEST_ADDR X-Type
  • The authorization lifetime: START_TIME X-Type
  • The identity of the authorizing entity, so the token can be validated in shared symmetric key and Kerberos schemes: AUTH_ENT_ID X-Type
  • The credentials of the authorizing entity in a public-key scheme: AUTH_ENT_ID X-Type
  • Authentication data used to prevent tampering with the SESSION_AUTH object: AUTHENTICATION_DATA X-Type

and then there's the stuff the SESSION_AUTH object MAY contain:

  • The lifetime of (each of) the media stream(s): END_TIME X-Type
  • Initiating party's port number: SOURCE_ADDR X-Type
  • Responding party's port number: DEST_ADDR X-Type

all SESSION_AUTH fields MUST match with the resource request. if a field doesn't match, the request SHOULD be denied ๐Ÿšซ


6. Message Processing Rules ๐Ÿ’…

this section is all about the message processing related to the SESSION_AUTH object. the details of how the SESSION_AUTH object gets processed within QoS NSLP and NATFW NSLP are spelled out. new NSLP protocols should use the same logic when they make use of the SESSION_AUTH object โœจ

6.1. Generation of the SESSION_AUTH by an Authorizing Entity ๐Ÿงš

  1. Generate the SESSION_AUTH object with the appropriate contents as specified in Section 3.
  2. If authentication is needed, the entire SESSION_AUTH object is constructed, excluding the length, type, and SubType fields of the SESSION_AUTH field. Note that the message MUST include a START_TIME to prevent replay attacks. The output of the authentication algorithm, plus appropriate header information, is appended as the AUTHENTICATION_DATA attribute to the SESSION_AUTH object.

6.2. Processing within the QoS NSLP โœจ

okay so the SESSION_AUTH object can tag along with QoS NSLP QUERY and RESERVE messages ๐ŸŽ€ for authorizing a query on network resources and for authorizing a resource reservation request, respectively ๐Ÿ’…

it can also show up in RESPONSE messages ๐Ÿฆ‹ to say the authorizing entity changed the original request ๐Ÿ™ˆ like the session start or end times got moved, or the client asked for all ports and the authorizing entity was like "nah, just these ports" ๐Ÿ’€

if the QoS NSIS Initiator (QNI) gets a RESPONSE message with a SESSION_AUTH object, the QNI MUST inspect that object to see which authentication attribute got changed by an authorizing entity ๐Ÿ‘€ and the QNI SHOULD also quietly accept any SESSION_AUTH objects in a RESPONSE message that don't show any change to the original authorization request โœจ

6.2.1. Message Generation

a QoS NSLP message gets made the way [RFC5974] says ๐Ÿงš

  1. the policy element that came from the authorizing entity MUST be copied without modification into the SESSION_AUTH object ๐Ÿ’–
  2. the SESSION_AUTH object (with the policy element inside it) gets inserted into the NSLP message in the appropriate place ๐ŸŒธ

6.2.2. Message Reception

the QoS NSLP message gets processed as [RFC5974] describes, with the following tweaks ๐Ÿซถ

  1. if the QoS NSIS Entity (QNE) is policy aware, then it SHOULD use the Diameter QoS application or the RADIUS QoS protocol to talk to the PDP ๐Ÿ’… to build the AAA message, you have to pull out the SESSION_AUTH object and the QoS-related objects from the QoS NSLP message and then craft the matching RADIUS or Diameter message ๐Ÿ”ฅ the message processing and object format live in the respective RADIUS or Diameter QoS protocol docs ๐Ÿ“š if the QNE is policy unaware, it just ignores the policy data objects and keeps on processing the NSLP message ๐ŸŒˆ
  2. if the response from the PDP is negative, the request must be rejected ๐Ÿ’€ a negative response in RADIUS is an Access-Reject, and in Diameter it's based on the DIAMETER_SUCCESS value in the Result-Code AVP of the QoS-Authz-Answer (QAA) message ๐Ÿ˜ญ the QNE must construct and send a RESPONSE message with the status of the authorization failure, as [RFC5974] specifies ๐Ÿ™…โ€โ™€๏ธ
  3. continue processing the NSIS message ๐Ÿฆ‹

6.2.3. Authorization (QNE or PDP)

  1. retrieve the policy element from the SESSION_AUTH object ๐Ÿ” check the AUTH_ENT_ID type and SubType fields, and return an error if the identity type isn't supported ๐Ÿšซ
  2. verify the message integrity ๐Ÿ”
    • Shared symmetric key authentication: the QNE or PDP uses the AUTH_ENT_ID field to look up a table keyed by that field ๐Ÿ—๏ธ the table should identify the cryptographic authentication algorithm to be used, plus the expected length of the authentication data and the shared symmetric key for the authorizing entity ๐Ÿ’œ verify that the indicated length of the authentication data matches the configured table entry, and then validate the authentication data โœจ
    • Public Key: validate the certificate chain against the trusted Certificate Authority (CA), and validate the message signature using the public key ๐ŸŽ€
    • HMAC signed: the QNE or PDP uses the Key-ID field of the AUTHENTICATION_DATA attribute to look up a table keyed by that field ๐Ÿ—‚๏ธ the table should identify the cryptographic authentication algorithm to be used, plus the expected length of the authentication data and the shared symmetric key for the authorizing entity ๐Ÿ’– verify that the indicated length of the authentication data matches the configured table entry, and validate the integrity of the parts of the NSLP message, i.e., session ID, MRI, NSLPID, and all the other NSLP elements listed in the NSLP_OBJECT_LIST authentication data, plus the SESSION_AUTH object contents (cf. Section 6.4) ๐Ÿง 
    • Kerberos: if AUTHENTICATION_DATA contains an encapsulated KRB_CRED message (cf. Section 4.2), the integrity of the KRB_CRED message can be verified within Kerberos itself ๐Ÿ›ก๏ธ and if the same NSLP message also has another SESSION_AUTH object using HMAC_SIGNED, that one can be used to verify message integrity as described above ๐ŸŒธ
  3. once the identity of the authorizing entity and the validity of the service request are established, the authorizing router/PDP MUST then consult its authorization policy to figure out whether or not the specific request is finally authorized (e.g., based on available credits and on info in the subscriber's database) ๐Ÿ’… to whatever extent these access control decisions need supplementary information, routers/PDPs MUST ensure that the supplementary information is obtained securely ๐Ÿ”’
  4. verify that the requested resources don't exceed the authorized QoS ๐Ÿ“

6.2.4. Error Signaling

when the PDP (e.g., a RADIUS or Diameter server) fails to verify the policy element, the appropriate actions described in the respective AAA document need to be taken ๐Ÿงฏ

the QNE node MUST return a RESPONSE message with the INFO_SPEC error code 'Authorization failure', as defined in the QoS NSLP specification [RFC5974] ๐Ÿšจ the QNE MAY include an INFO_SPEC Object Value Info to indicate which SESSION_AUTH attribute caused the error ๐Ÿ”

6.3. Processing with the NATFW NSLP ๐ŸŒ

this section lays out the processing rules for the NATFW NSLP [RFC5973] ๐Ÿฆ‹

6.3.1. Message Generation

a NATFW NSLP message gets made the way [RFC5973] says ๐Ÿงš

  1. the policy element that came from the authorizing entity MUST be copied without modification into the SESSION_AUTH object ๐Ÿ’–
  2. the SESSION_AUTH object (with the policy element inside it) gets inserted into the NATFW NSLP message in the appropriate place ๐ŸŒธ

6.3.2. Message Reception

the NATFW NSLP message gets processed as [RFC5973] describes, with the following tweaks ๐Ÿซถ

  1. if the router is policy aware, then it SHOULD use the Diameter application or the RADIUS protocol to talk to the PDP ๐Ÿ’… to build the AAA message, you have to pull out the SESSION_AUTH object and the objects related to NATFW policy rules from the NSLP message, then craft the matching RADIUS or Diameter message ๐Ÿ”ฅ the message processing and object format are described in the respective RADIUS or Diameter protocols ๐Ÿ“š if the router is policy unaware, it ignores the policy data objects and keeps processing the NSLP message ๐ŸŒˆ
  2. reject the message if the response from the PDP is negative ๐Ÿ’€ a negative response in RADIUS is an Access-Reject, and in Diameter it's based on the DIAMETER_SUCCESS value in the Result-Code AVP ๐Ÿ˜ญ
  3. continue processing the NSIS message ๐Ÿฆ‹

6.3.3. Authorization (Router/PDP)

  1. retrieve the policy element from the SESSION_AUTH object ๐Ÿ” check the AUTH_ENT_ID type and SubType fields, and return an error if the identity type isn't supported ๐Ÿšซ
  2. verify the message integrity ๐Ÿ”
    • Shared symmetric key authentication: the network router/PDP uses the AUTH_ENT_ID field to look up a table keyed by that field ๐Ÿ—๏ธ the table should identify the cryptographic authentication algorithm to be used, along with the expected length of the authentication data and the shared symmetric key for the authorizing entity ๐Ÿ’œ verify that the indicated length of the authentication data matches the configured table entry, and then validate the authentication data โœจ
    • Public Key: validate the certificate chain against the trusted Certificate Authority (CA), and validate the message signature using the public key ๐ŸŽ€
    • HMAC signed: the QNE or PDP uses the Key-ID field of the AUTHENTICATION_DATA attribute to look up a table keyed by that field ๐Ÿ—‚๏ธ the table should identify the cryptographic authentication algorithm to be used, plus the expected length of the authentication data and the shared symmetric key for the authorizing entity ๐Ÿ’– verify that the indicated length of the authentication data matches the configured table entry, and validate the integrity of parts of the NSLP message, i.e., session ID, MRI, NSLPID, and all the other NSLP elements listed in the NSLP_OBJECT_LIST authentication data, plus the SESSION_AUTH object contents (cf. Section 6.4) ๐Ÿง 
    • Kerberos: if AUTHENTICATION_DATA contains an encapsulated KRB_CRED message (cf. Section 4.2), the integrity of the KRB_CRED message can be verified within Kerberos itself ๐Ÿ›ก๏ธ and if the same NSLP message also has another SESSION_AUTH object using HMAC_SIGNED, that one can be used to verify message integrity as described above ๐ŸŒธ
  3. once the identity of the authorizing entity and the validity of the service request are established, the authorizing router/PDP MUST then consult its authorization policy to figure out whether or not the specific request is authorized ๐Ÿ’… to whatever extent these access control decisions need supplementary information, routers/PDPs MUST ensure that the supplementary information is obtained securely ๐Ÿ”’

6.3.4. Error Signaling

when the PDP (e.g., a RADIUS or Diameter server) fails to verify the SESSION_AUTH object, the appropriate actions described in the respective AAA document need to be taken ๐Ÿงฏ the NATFW NSLP node MUST return an error message of class 'Permanent failure' (0x5) with error code 'Authorization failed' (0x02) ๐Ÿšจ

6.4. Integrity Protection of NSLP Messages โœจ

okay so the SESSION_AUTH object can also be used to give every NSLP signaling message integrity protection ๐Ÿ”, which also means requests and responses get authenticated. Picture this: a user has dropped a shared key off at some NN. That NN can then check the integrity of every NSLP message the user sends to it ๐Ÿ’…. Once the NN knows who's talking, it can apply authorization policies to things like resource reservations or opening firewall pinholes. main character energy for security ๐Ÿ‘‘

The sender of an NSLP message builds a SESSION_AUTH object with the AUTH_ENT_ID attribute set to HMAC_SIGNED (cf. Section 4.4). It hashes with the shared key over all the NSLP objects that need protecting, and it lists them in the NSLP_OBJECT_LIST ๐Ÿงš. The SESSION_AUTH object is protected by the HMAC too. When that object rides along in the NSLP message, the receiver can verify its integrity, but only if it has the right shared key for the HMAC ๐Ÿ”‘. Any response back to the sender should also include a SESSION_AUTH object, so attackers can't slide in fake responses pretending to be the real NN ๐Ÿ™ˆ.

If a SESSION_AUTH object shows up with an AUTH_ENT_ID attribute set to HMAC_SIGNED, then the integrity of every NSLP element listed in the NSLP_OBJECT_LIST has to be checked ๐Ÿ”. That includes the contents of the SESSION_AUTH object itself. On top of that, the session ID, MRI, and NSLPID also have to be included in the HMAC calculation, as specified in Section 3.2.7 ๐ŸŽ€. The key used for the HMAC is identified by the Key-ID inside the AUTHENTICATION_DATA attribute. And if the timestamp in START_TIME isn't recent enough, or the calculated HMAC doesn't match the one in AUTHENTICATION_DATA, the message must be discarded silently and an error should be logged locally ๐Ÿ’€.


7. Security Considerations ๐Ÿ”

okay bestie, this section is the serious one ๐Ÿ˜ญ. This document describes a mechanism for session authorization whose whole job is to prevent theft of service. There are three kinds of security issues to think about: protection against replay attacks, integrity of the SESSION_AUTH object, and choosing the authentication algorithms and keys ๐Ÿง.

Issue number one is replay attacks, and they MUST be prevented ๐Ÿšจ. In the non-associated model, the SESSION_AUTH object MUST include a START_TIME field, and the NNs as well as Policy Servers MUST support NTP so their clocks stay synchronized. If clock synchronization fails, replay attacks become possible, because the clocks of the different network entities may not agree ๐Ÿ•ฐ๏ธ. The start time is what lets the system check that a request isn't being replayed at some later time. In all other models, the Policy Server uses the SESSION_ID to make sure a resource request actually lines up with the records of an authorized session. If a SESSION_AUTH object gets replayed, the policy server MUST detect it (using internal algorithms), and the request MUST be rejected ๐Ÿšซ.

Issue number two is the integrity of the SESSION_AUTH object. In untrusted environments, it stays protected by including the AUTHENTICATION_DATA attribute ๐Ÿ›ก๏ธ.

In environments where shared symmetric keys are possible, they should be used, which keeps the SESSION_AUTH object size to a strict minimum. This matters a lot when wireless links are involved ๐Ÿ“ถ. A secondary option is Public Key Infrastructure (PKI) authentication, which gives a high level of security and good scalability โœจ. The catch is that PKI authentication needs credentials in the SESSION_AUTH object, and that makes the object bigger.

The SESSION_AUTH object can also protect the integrity of NSLP message parts by using the HMAC_SIGNED Authentication Data, as described in Section 6.4 ๐Ÿ”’.

When shared keys are in play, for example in AUTHENTICATION_DATA (cf. Section 4.1) or together with HMAC_SIGNED (cf. Section 4.4), the keys have to stay secret ๐Ÿคซ. That means they must be exchanged, stored, and managed in a secure and confidential way, so no unauthorized party ever gets their hands on the key material. If key material leaks to an unauthorized party, authentication and integrity protection stop working entirely ๐Ÿ’”.

Security considerations for public-key mechanisms using the X.509 certificate mechanisms described in [RFC5280] apply too. Likewise, the security considerations for PGP (Pretty Good Privacy) described in [RFC4880] apply ๐Ÿ“œ.

Further security issues are outlined in RFC 4081 [RFC4081] ๐Ÿ‘€.


8. IANA Considerations ๐Ÿ—‚๏ธ

okay registry time ๐Ÿ“. The SESSION_AUTH_OBJECT NSLP Message Object type is specified as 0x016.

This document specifies an 8-bit Session authorization attribute type (X-Type) field, plus 8-bit SubType fields for each X-Type. IANA has created and will maintain corresponding sub-registries for the NSLP Session Authorization Object ๐Ÿ’….

The initial values for the X-Type registry, and the registration procedures according to [RFC5226], are as follows:

Registration Procedure: Specification Required

X-Type    Description
--------  -------------------
0         Reserved
1         AUTH_ENT_ID
2         SESSION_ID
3         SOURCE_ADDR
4         DEST_ADDR
5         START_TIME
6         END_TIME
7         NSLP_OBJECT_LIST
8         AUTHENTICATION_DATA
9-127     Unassigned
128-255   Reserved for Private or Experimental Use

Next up are the registration procedures and initial values for the SubType registries ๐Ÿง.

Sub-registry: AUTH_ENT_ID (X-Type 1) SubType values

Registration Procedure: Specification Required

Registry:

SubType   Description
--------  -------------
0         Reserved
1         IPV4_ADDRESS
2         IPV6_ADDRESS
3         FQDN
4         ASCII_DN
5         UNICODE_DN
6         URI
7         KRB_PRINCIPAL
8         X509_V3_CERT
9         PGP_CERT
10        HMAC_SIGNED
11-127    Unassigned
128-255   Reserved for Private or Experimental Use

Sub-registry: SOURCE_ADDR (X-Type 3) SubType values

Registration Procedure: Specification Required

Registry:

SubType   Description
--------  -------------
0         Reserved
1         IPV4_ADDRESS
2         IPV6_ADDRESS
3         UDP_PORT_LIST
4         TCP_PORT_LIST
5         SPI
6-127     Unassigned
128-255   Reserved for Private or Experimental Use

Sub-registry: DEST_ADDR (X-Type 4) SubType values

Registration Procedure: Specification Required

Registry:

0         Reserved
1         IPV4_ADDRESS
2         IPV6_ADDRESS
3         UDP_PORT_LIST
4         TCP_PORT_LIST
5         SPI
6-127     Unassigned
128-255   Reserved for Private or Experimental Use

Sub-registry: START_TIME (X-Type 5) SubType values

Registration Procedure: Specification Required

Registry:

SubType   Description
--------  -------------
0         Reserved
1         NTP_TIMESTAMP
2-127     Unassigned
128-255   Reserved for Private or Experimental Use

Sub-registry: END_TIME (X-Type 6) SubType values

Registration Procedure: Specification Required

Registry:

SubType   Description
--------  -------------
0         Reserved
1         NTP_TIMESTAMP
2-127     Unassigned
128-255   Reserved for Private or Experimental Use

9. Acknowledgments ๐Ÿซถ

shoutout time ๐Ÿ“ฃ. We would like to thank Xioaming Fu and Lars Eggert for providing reviews and comments. Helpful comments also came from Gen-ART reviewer Ben Campbell, along with Sean Turner and Tim Polk from the Security Area ๐Ÿ’œ. This document is largely based on RFC 3520 [RFC3520], and credit for that goes to the authors of RFC 3520, namely Louis-Nicolas Hamer, Brett Kosinski, Bill Gage, and Hugh Shieh ๐ŸŒธ. Part of this work was funded by Deutsche Telekom Laboratories within the context of the BMBF-funded ScaleNet project ๐ŸŒˆ.


10. References ๐Ÿ“š

10.1. Normative References

[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.

[RFC3447] Jonsson, J. and B. Kaliski, "Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1", RFC 3447, February 2003.

[RFC5905] Mills, D., Martin, J., Burbank, J., and W. Kasch, "Network Time Protocol Version 4: Protocol and Algorithms Specification", RFC 5905, June 2010.

[RFC5971] Schulzrinne, H. and R. Hancock, "GIST: General Internet Signalling Transport", RFC 5971, October 2010.

[RFC5973] Stiemerling, M., Tschofenig, H., Aoun, C., and E. Davies, "NAT/Firewall NSIS Signaling Layer Protocol (NSLP)", RFC 5973, October 2010.

[RFC5974] Manner, J., Karagiannis, G., and A. McDonald, "NSIS Signaling Layer Protocol (NSLP) for Quality-of-Service Signaling", RFC 5974, October 2010.

[RFC5996] Kaufman, C., Hoffman, P., Nir, Y., and P. Eronen, "Internet Key Exchange Protocol Version 2 (IKEv2)", RFC 5996, September 2010.

10.2. Informative References

[RFC1034] Mockapetris, P., "Domain names - concepts and facilities", STD 13, RFC 1034, November 1987.

[RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed-Hashing for Message Authentication", RFC 2104, February 1997.

[RFC3520] Hamer, L-N., Gage, B., Kosinski, B., and H. Shieh, "Session Authorization Policy Element", RFC 3520, April 2003.

[RFC3521] Hamer, L-N., Gage, B., and H. Shieh, "Framework for Session Set-up with Media Authorization", RFC 3521, April 2003.

[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): Generic Syntax", STD 66, RFC 3986, January 2005.

[RFC4080] Hancock, R., Karagiannis, G., Loughney, J., and S. Van den Bosch, "Next Steps in Signaling (NSIS): Framework", RFC 4080, June 2005.

[RFC4081] Tschofenig, H. and D. Kroeselberg, "Security Threats for Next Steps in Signaling (NSIS)", RFC 4081, June 2005.

[RFC4120] Neuman, C., Yu, T., Hartman, S., and K. Raeburn, "The Kerberos Network Authentication Service (V5)", RFC 4120, July 2005.

[RFC4514] Zeilenga, K., "Lightweight Directory Access Protocol (LDAP): String Representation of Distinguished Names", RFC 4514, June 2006.

[RFC4868] Kelly, S. and S. Frankel, "Using HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512 with IPsec", RFC 4868, May 2007.

[RFC4880] Callas, J., Donnerhacke, L., Finney, H., Shaw, D., and R. Thayer, "OpenPGP Message Format", RFC 4880, November 2007.

[RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an IANA Considerations Section in RFCs", BCP 26, RFC 5226, May 2008.

[RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., Housley, R., and W. Polk, "Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile", RFC 5280, May 2008.

[RFC5652] Housley, R., "Cryptographic Message Syntax (CMS)", STD 70, RFC 5652, September 2009.

Okay bestie, last stop! ๐Ÿงš These are the four people who wrote this RFC, so here's where to find them. Their details are exactly as written, so you can actually reach out ๐Ÿ’Œ

Jukka Manner ๐Ÿฆ‹

Jukka Manner
Aalto University
Department of Communications and Networking (Comnet)
P.O. Box 13000
Aalto  FI-00076
Finland

Phone: +358 9 470 22481
EMail: jukka.manner@tkk.fi

Martin Stiemerling ๐ŸŒธ

Martin Stiemerling
Network Laboratories, NEC Europe Ltd.
Kurfuersten-Anlage 36
Heidelberg  69115
Germany

Phone: +49 (0) 6221 4342 113
EMail: martin.stiemerling@neclab.eu
URI:   http://www.stiemerling.org

Hannes Tschofenig ๐Ÿ’œ

Hannes Tschofenig
Nokia Siemens Networks
Linnoitustie 6
Espoo  02600
Finland

Phone: +358 (50) 4871445
EMail: Hannes.Tschofenig@gmx.net
URI:   http://www.tschofenig.priv.at

Roland Bless (editor) ๐Ÿ‘‘

Roland Bless (editor)
Karlsruhe Institute of Technology
Institute of Telematics
Zirkel 2, Building 20.20
P.O. Box 6980
Karlsruhe  76049
Germany

Phone: +49 721 608 46413
EMail: roland.bless@kit.edu
URI:   http://tm.kit.edu/~bless

And that's the whole RFC, babes! ๐ŸŽ€ Four legends, one super detailed NAT/firewall signaling spec, and we made it through together. Slay โœจ๐Ÿซถ

๐Ÿ“ฆ where this page comes from