RFC 5448
Improved Extensible Authentication Protocol Method for 3rd Generation Authentication and Key Agreement (EAP-AKA')
RFC 5448: Improved EAP Method for 3rd Generation Authentication and Key Agreement (EAP-AKA') ๐ฆ
Okay bestie, this is RFC 5448 ๐, and it was written by J. Arkko (Ericsson), V. Lehtovirta (Ericsson), and P. Eronen (Nokia) for the Network Working Group ๐ธ. It came out in May 2009 and is Informational, so it's sharing info with the Internet community rather than setting an official standard โจ. It updates RFC 4187 (EAP-AKA), and that update is the whole reason this doc exists ๐. This is part 1 of 6 of the rewrite, so there's more to come ๐ง.
Status of This Memo ๐
This memo provides information for the Internet community. It does not specify an Internet standard of any kind. Distribution of this memo is unlimited.
Copyright Notice ยฉ๏ธ
Copyright (c) 2009 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 in effect on the date of publication of this document (http://trustee.ietf.org/license-info). Please review these documents carefully, as they describe your rights and restrictions with respect to this document.
Abstract ๐
Okay so this spec defines a brand new EAP method, EAP-AKA' ๐. It's a small glow-up of EAP-AKA (Extensible Authentication Protocol Method for 3rd Generation Authentication and Key Agreement). The big change is a new key derivation function that binds the keys to the name of the access network ๐. That new key derivation mechanism was defined by the 3rd Generation Partnership Project (3GPP), and this spec makes it usable in EAP in an interoperable way ๐ค. EAP-AKA' also swaps SHA-1 for SHA-256 ๐ .
This spec also updates RFC 4187, EAP-AKA, to stop bidding down attacks coming from EAP-AKA' ๐ก๏ธ.
Table of Contents ๐๏ธ
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2
2. Requirements Language . . . . . . . . . . . . . . . . . . . . 3
3. EAP-AKA' . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3.1. AT_KDF_INPUT . . . . . . . . . . . . . . . . . . . . . . . 6
3.2. AT_KDF . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.3. Key Generation . . . . . . . . . . . . . . . . . . . . . . 10
3.4. Hash Functions . . . . . . . . . . . . . . . . . . . . . . 12
3.4.1. PRF' . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.4.2. AT_MAC . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4.3. AT_CHECKCODE . . . . . . . . . . . . . . . . . . . . . 13
4. Bidding Down Prevention for EAP-AKA . . . . . . . . . . . . . 14
5. Security Considerations . . . . . . . . . . . . . . . . . . . 15
5.1. Security Properties of Binding Network Names . . . . . . . 18
6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 19
6.1. Type Value . . . . . . . . . . . . . . . . . . . . . . . . 19
6.2. Attribute Type Values . . . . . . . . . . . . . . . . . . 19
6.3. Key Derivation Function Namespace . . . . . . . . . . . . 19
7. Contributors . . . . . . . . . . . . . . . . . . . . . . . . . 20
8. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 20
9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 20
9.1. Normative References . . . . . . . . . . . . . . . . . . . 20
9.2. Informative References . . . . . . . . . . . . . . . . . . 21
Appendix A. Changes from RFC 4187 . . . . . . . . . . . . . . . . 23
Appendix B. Importance of Explicit Negotiation . . . . . . . . . 23
Appendix C. Test Vectors . . . . . . . . . . . . . . . . . . . . 24
1. Introduction โจ
Okay, so this spec defines a new Extensible Authentication Protocol (EAP) method [RFC3748] called EAP-AKA', which is a small revision of the EAP-AKA method originally defined in [RFC4187] ๐. What's new is the key derivation function, which is specified in [3GPP.33.402] ๐. This function binds the keys derived within the method to the name of the access network, which limits the damage from compromised access network nodes and keys ๐ก๏ธ. This spec also defines the EAP encapsulation for AKA when the new key derivation mechanism is in use ๐.
3GPP has defined a number of applications for the revised AKA mechanism. Some are based on native encapsulation of AKA over 3GPP radio access networks, and others are based on the use of EAP ๐.
To make the new key derivation mechanisms usable in EAP-AKA, some extra protocol mechanisms are needed ๐งฉ. RFC 4187 calls for the use of CK (the encryption key) and IK (the integrity key) from AKA, so existing implementations keep using these ๐. Any change to the key derivation must be unambiguous to both sides of the protocol. In other words, it must not be possible to accidentally connect old equipment to new equipment and get the key derivation wrong, or try to use the wrong keys without getting a proper error message ๐. The change also must be secure against bidding down attacks, where someone tries to force the participants into the least secure mechanism ๐.
So this spec introduces a variant of the EAP-AKA method called EAP-AKA' ๐ฆ. It can use the derived keys CK' and IK' from the 3GPP specification, and it updates the hash function to SHA-256 [FIPS.180-2.2002]. Otherwise, it's basically the same as RFC 4187 ๐ . Since EAP-AKA and EAP-AKA' use different EAP method type values, a mutually supported method can be negotiated using the standard mechanisms in EAP [RFC3748] ๐ค.
Note: Appendix B explains why it's so important to be explicit about the change of semantics for the keys, and why other approaches would lead to severe interoperability problems ๐จ.
The rest of this spec is structured like this ๐บ๏ธ. Section 3 defines the EAP-AKA' method. Section 4 adds support to EAP-AKA to prevent bidding down attacks from EAP-AKA'. Section 5 explains the security differences between EAP-AKA and EAP-AKA'. Section 6 covers the IANA considerations, and Appendix A explains what updates to RFC 4187 EAP-AKA were made in this spec. Appendix B explains some of the design rationale behind EAP-AKA', and Appendix C gives you test vectors ๐ง.
2. Requirements Language ๐
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119] ๐.
End of part 1 of 6. More coming up, bestie! ๐ซถ
3. EAP-AKA' โจ
okay so EAP-AKA' is a new EAP method, and it basically copies the whole EAP-AKA spec [RFC4187] in every way ๐ except for these changes:
- It uses Type code 50, not 23 (that's the one EAP-AKA uses) ๐ฆ
- It carries the AT_KDF_INPUT attribute, defined in Section 3.1, so that both the peer and the server know the name of the access network ๐ซถ
- It supports key derivation function negotiation through the AT_KDF attribute (Section 3.2), so future extensions can slide in ๐ฎ
- It calculates keys as defined in Section 3.3, not the way EAP-AKA does ๐งช
- It uses SHA-256 [FIPS.180-2.2002], not SHA-1 [FIPS.180-1.1995] (Section 3.4) ๐
Figure 1 shows what the authentication flow looks like. Each message named AKA'-Challenge and so on matches the EAP-AKA message with the same name, just with the EAP-AKA' Type code instead. The definitions of those messages, plus the AT_RAND, AT_AUTN, AT_MAC, and AT_RES attributes, all live in [RFC4187] ๐
Peer Server
| EAP-Request/Identity |
|<-------------------------------------------------------|
| |
| EAP-Response/Identity |
| (Includes user's Network Access Identifier, NAI) |
|------------------------------------------------------->|
| +--------------------------------------------------+
| | Server determines the network name and ensures |
| | that the given access network is authorized to |
| | use the claimed name. The server then runs the |
| | AKA' algorithms generating RAND and AUTN, and |
| | derives session keys from CK' and IK'. RAND and |
| | AUTN are sent as AT_RAND and AT_AUTN attributes, |
| | whereas the network name is transported in the |
| | AT_KDF_INPUT attribute. AT_KDF signals the used |
| | key derivation function. The session keys are |
| | used in creating the AT_MAC attribute. |
| +--------------------------------------------------+
| EAP-Request/AKA'-Challenge |
| (AT_RAND, AT_AUTN, AT_KDF, AT_KDF_INPUT, AT_MAC)|
|<-------------------------------------------------------|
+------------------------------------------------------+ |
| The peer determines what the network name should be, | |
| based on, e.g., what access technology it is using. | |
| The peer also retrieves the network name sent by | |
| the network from the AT_KDF_INPUT attribute. The | |
| two names are compared for discrepancies, and if | |
| necessary, the authentication is aborted. Otherwise,| |
| the network name from AT_KDF_INPUT attribute is | |
| used in running the AKA' algorithms, verifying AUTN | |
| from AT_AUTN and MAC from AT_MAC attributes. The | |
| peer then generates RES. The peer also derives | |
| session keys from CK'/IK'. The AT_RES and AT_MAC | |
| attributes are constructed. | |
+------------------------------------------------------+ |
| EAP-Response/AKA'-Challenge |
| (AT_RES, AT_MAC) |
|------------------------------------------------------->|
| +-------------------------------------------------+
| | Server checks the RES and MAC values received |
| | in AT_RES and AT_MAC, respectively. Success |
| | requires both to be found correct. |
| +-------------------------------------------------+
| EAP-Success |
|<-------------------------------------------------------|
Figure 1: EAP-AKA' Authentication Process
EAP-AKA' can run on the same credentials as EAP-AKA and use the same identities, which is iconic ๐ But EAP-AKA' uses different leading characters than EAP-AKA for the conventions in Section 4.1.1 of [RFC4187] for IMSI-based usernames (International Mobile Subscriber Identifier). Here's the key bit: EAP-AKA' MUST use the leading character "6" (ASCII 36 hexadecimal) instead of "0" for IMSI-based permanent usernames. Everything else about how leading characters, usernames, and identities are used and processed is the same as EAP-AKA [RFC4187] ๐ซง
For example, pseudonyms and fast re-authentication usernames have to be built so the server can recognize them. A pseudonym could start with a leading "7" (ASCII 37 hexadecimal), and a fast re-authentication username could start with "8" (ASCII 38 hexadecimal) ๐ง Heads up though: a server that only does EAP-AKA may not recognize these leading characters. According to Section 4.1.4 of [RFC4187], that server will ask for the identity again with an EAP-Request/AKA-Identity message, which makes it super clear to the peer that EAP-AKA and its identity are what the server expects ๐
3.1. AT_KDF_INPUT
Here's how the AT_KDF_INPUT attribute is laid out ๐
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| AT_KDF_INPUT | Length | Actual Network Name Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Network Name .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Here's what each field does:
AT_KDF_INPUT : This is set to 23. ๐
Length : The length of the attribute, calculated as defined in [RFC4187], Section 8.1. ๐
Actual Network Name Length : This is a 2 byte field. It's needed because the field before it has to be in multiples of 4 bytes, per the usual EAP-AKA rules. It gives the length of the network name in bytes ๐งฎ
Network Name : This is the network name of the access network the authentication is happening for. The name doesn't include any terminating null characters. Since the whole attribute has to be a multiple of 4 bytes, the sender pads the name with 1, 2, or 3 bytes of all zero bits when it's needed ๐ซง
Only the server sends the AT_KDF_INPUT attribute. Per [3GPP.33.402], the server always checks that the access network is authorized to use a given name before it sends that name to the peer over EAP-AKA' ๐ The value of AT_KDF_INPUT from the server MUST be non-empty. If it's empty, the peer acts as if AUTN was wrong, and the authentication fails ๐ See Section 3 and Figure 3 of [RFC4187] for an overview of how authentication failures are handled.
The peer MAY also check the value it gets against its own idea of the network name. If it finds a discrepancy, the peer either warns the user and keeps going, or it fails the authentication. More specifically, the peer SHOULD have a configurable policy it can follow in these situations ๐๏ธ If that policy says it can continue, the peer SHOULD log a warning message or show it to the user. If the peer does decide to continue, it MUST use the network name exactly as received in the AT_KDF_INPUT attribute. If the policy says the authentication should fail, the peer acts as if AUTN was wrong, and the authentication fails ๐ซ
The Network Name field holds a UTF-8 string. That string MUST be built as specified in [3GPP.24.302] for "Access Network Identity" ๐ It's made of fields separated by colons (:). How you construct the identity string depends on which access technology is being used ๐ก
On the network side, building the network name is a configuration issue in the access network, plus an authorization check in the authentication server. On the peer side, the peer builds the name from what it can observe locally. For example, the peer knows which access technology it's using on the link, and it can see info in a link-layer beacon, and so on ๐๏ธ The construction rules say how that info maps to an access network name. Usually the name is just the access technology's name, or that name followed by an operator identifier that was advertised in a link-layer beacon. In every case, [3GPP.24.302] is the normative spec for building the name on both the network and peer sides ๐ If the peer policy allows running EAP-AKA' over an access technology that spec doesn't give construction rules for, the peer SHOULD rely only on the information from the AT_KDF_INPUT attribute and not do a comparison ๐คทโโ๏ธ
If the peer does compare its locally determined network name with the one it got over EAP-AKA', it MUST do it like this. First, each name gets split into fields separated by colons. If one name has more colons and fields than the other, the extra fields get ignored. The remaining sequences of fields are compared, and they only match if they're equal character by character. This algorithm allows a prefix match, so the peer can match "", "FOO", and "FOO:BAR" against the value "FOO:BAR" received from the server ๐งฉ That matters because it lets the specs that define how network names get built get updated later on. For instance, if a peer knows it's running on access technology "FOO", it can use the string "FOO" even if the server sends a more accurate description like "FOO:BAR" with more info in it ๐
The allocation procedures in [3GPP.24.302] make sure that conflicts that could come up from using the same name in different types of networks are avoided. The spec also has detailed rules for how a client can work out these names from what it knows, like the protocol used to attach to the network, beacons the network sends out, and so on. Info the client can't see directly, like the type or version of the home network, isn't used by this algorithm ๐ โโ๏ธ
The AT_KDF_INPUT attribute MUST be sent and processed as explained above when the AT_KDF attribute has the value 1. Future definitions of new AT_KDF values MUST define how this attribute is sent and processed ๐
3.2. AT_KDF ๐
Okay bestie, AT_KDF is the attribute the server uses to point at one specific key derivation function ๐. It's giving negotiation energy, and that's honestly so useful for future evolution of KDFs โจ
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| AT_KDF | Length | Key Derivation Function |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
The fields go like this:
- AT_KDF: This is set to 24.
- Length: The length of the attribute, MUST be set to 1.
- Key Derivation Function: An enumerated value for the key derivation function that the server (or peer) wants to use. Value 1 is the default KDF for EAP-AKA', i.e., the one that uses CK' and IK' as defined in Section 3.3. ๐ซถ
Servers MUST send one or more AT_KDF attributes in the EAP-Request/AKA'-Challenge message. These attributes list the desired functions in order of preference, with the most preferred one first. ๐
Once the peer gets a set of these, if it supports and is willing to use the KDF indicated by the first attribute, that function gets taken into use with no further negotiation. ๐ But if the peer doesn't support that function or isn't willing to use it, it doesn't process the received EAP-Request/AKA'-Challenge in any way, except by responding with an EAP-Response/AKA'-Challenge message containing only one attribute, AT_KDF, with the value set to the selected alternative. If there's no suitable alternative, the peer behaves as if AUTN had been incorrect, and authentication fails (see Figure 3 of [RFC4187]). The peer also fails the authentication if there are any duplicate values within the list of AT_KDF attributes. The exception is when the duplication is due to a request to change the key derivation function (more on that below). ๐
When the server gets an EAP-Response/AKA'-Challenge with AT_KDF from the peer, it checks that the suggested AT_KDF value was one of the alternatives in its offer. The first AT_KDF value in the server's message is not a valid alternative. If the peer replied with that first AT_KDF value, the server behaves as if AT_MAC of the response had been incorrect, and fails the authentication. For an overview of the failed authentication process on the server side, see Section 3 and Figure 2 of [RFC4187]. Otherwise, the server re-sends the EAP-Response/AKA'-Challenge message, but adds the selected alternative to the beginning of the list of AT_KDF attributes and keeps the entire list that follows it. ๐ฆ Note that this means the selected alternative shows up twice in the set of AT_KDF values. Responding to the peer's request to change the key derivation function is the only legal situation where that duplication can happen. โจ
When the peer receives the new EAP-Request/AKA'-Challenge message, it MUST check that the requested change, and only the requested change, occurred in the list of AT_KDF attributes. If so, it continues processing the received EAP-Request/AKA'-Challenge as specified in [RFC4187] and Section 3.1 of this document. If not, it behaves as if AT_MAC had been incorrect, and fails the authentication. If the peer receives multiple EAP-Request/AKA'-Challenge messages with differing AT_KDF attributes without having requested negotiation, the peer MUST behave as if AT_MAC had been incorrect, and fail the authentication. ๐
Also, the peer may request sequence number resynchronization [RFC4187]. This happens after AT_KDF negotiation has already finished. An AKA'-Synchronization-Failure message is sent as the response to the newly received EAP-Request/AKA'-Challenge (the last message of the AT_KDF negotiation). The AKA'-Synchronization-Failure message MUST contain the AUTS parameter as specified in [RFC4187], and a copy the AT_KDF attributes as they appeared in the last message of the AT_KDF negotiation. If the AT_KDF attributes are found to differ from their earlier values, the peer and server MUST behave as if AT_MAC had been incorrect, and fail the authentication. ๐ญ
3.3. Key Generation ๐
Both the peer and server MUST derive the keys as follows. This part is so important, so pay attention ๐ง
AT_KDF set to 1
In this case, MK is derived and used as follows:
MK = PRF'(IK'|CK',"EAP-AKA'"|Identity)
K_encr = MK[0..127]
K_aut = MK[128..383]
K_re = MK[384..639]
MSK = MK[640..1151]
EMSK = MK[1152..1663]
Here, [n..m] denotes the substring from bit n to m. PRF' is a new pseudo-random function specified in Section 3.4. The first 1664 bits from its output are used for K_encr (encryption key, 128 bits), K_aut (authentication key, 256 bits), K_re (re-authentication key, 256 bits), MSK (Master Session Key, 512 bits), and EMSK (Extended Master Session Key, 512 bits). These keys are used by the subsequent EAP-AKA' process. K_encr is used by the AT_ENCR_DATA attribute, and K_aut by the AT_MAC attribute. K_re is used later in this section. MSK and EMSK are outputs from a successful EAP method run [RFC3748]. ๐
IK' and CK' are derived as specified in [3GPP.33.402]. The functions that derive IK' and CK' take the following parameters: CK and IK produced by the AKA algorithm, and the value of the Network Name field comes from the AT_KDF_INPUT attribute (without length or padding) .
The value "EAP-AKA'" is an eight-characters-long ASCII string. It's used as is, without any trailing NUL characters. ๐
Identity is the peer identity as specified in Section 7 of [RFC4187].
When the server creates an AKA challenge and the corresponding AUTN, CK, CK', IK, and IK' values, it MUST set the Authentication Management Field (AMF) separation bit to 1 in the AKA algorithm [3GPP.33.102]. Similarly, the peer MUST check that the AMF separation bit is set to 1. If the bit is not set to 1, the peer behaves as if the AUTN had been incorrect, and fails the authentication. ๐ซ
On fast re-authentication, the following keys are calculated:
MK = PRF'(K_re,"EAP-AKA' re-auth"|Identity|counter|NONCE_S)
MSK = MK[0..511]
EMSK = MK[512..1023]
MSK and EMSK are the resulting 512-bit keys, taking the first 1024 bits from the result of PRF'. Note that K_encr and K_aut are not re-derived on fast re-authentication. K_re is the re-authentication key from the preceding full authentication, and it stays unchanged over any fast re-authentication(s) that may happen based on it. The value "EAP-AKA' re-auth" is a sixteen- characters-long ASCII string, again represented without any trailing NUL characters. Identity is the fast re-authentication identity, counter is the value from the AT_COUNTER attribute, and NONCE_S is the nonce value from the AT_NONCE_S attribute, all as specified in Section 7 of [RFC4187].
To prevent the use of compromised keys in other places, it is forbidden to change the network name when going from the full to the fast re-authentication process. The peer SHOULD NOT attempt fast re-authentication when it knows that the network name in the current access network is different from the one in the initial, full authentication. Upon seeing a re-authentication request with a changed network name, the server SHOULD behave as if the re-authentication identifier had been unrecognized, and fall back to full authentication. The server observes the change in the name by comparing where the fast re-authentication and full authentication EAP transactions were received at the Authentication, Authorization, and Accounting (AAA) protocol level. ๐
AT_KDF has any other value
Future variations of key derivation functions may be defined, and they will be represented by new values of AT_KDF. If the peer does not recognize the value, it cannot calculate the keys, and it behaves as explained in Section 3.2. ๐ฆ
AT_KDF is missing
The peer behaves as if the AUTN had been incorrect, and MUST fail the authentication. ๐
If the peer supports a given key derivation function but is unwilling to perform it for policy reasons, it refuses to calculate the keys, and it behaves as explained in Section 3.2. ๐ โโ๏ธ
3.4. Hash Functions ๐
EAP-AKA' uses SHA-256 [FIPS.180-2.2002], not SHA-1 [FIPS.180-1.1995] as EAP-AKA does. This requires a change to the pseudo-random function (PRF), as well as to the AT_MAC and AT_CHECKCODE attributes. ๐ฅ
3.4.1. PRF'
The PRF' construction is the same one IKEv2 uses (see Section 2.13 of [RFC4306]). The function takes two arguments. K is a 256-bit value, and S is an octet string of arbitrary length. PRF' is defined as follows:
PRF'(K,S) = T1 | T2 | T3 | T4 | ...
where:
T1 = HMAC-SHA-256 (K, S | 0x01)
T2 = HMAC-SHA-256 (K, T1 | S | 0x02)
T3 = HMAC-SHA-256 (K, T2 | S | 0x03)
T4 = HMAC-SHA-256 (K, T3 | S | 0x04)
...
PRF' produces as many bits of output as is needed. HMAC-SHA-256 is the application of HMAC [RFC2104] to SHA-256. ๐ธ
3.4.2. AT_MAC
When used within EAP-AKA', the AT_MAC attribute is changed as follows. The MAC algorithm is HMAC-SHA-256-128, a keyed hash value. The HMAC-SHA-256-128 value is obtained from the 32-byte HMAC-SHA-256 value by truncating the output to the first 16 bytes. Hence, the length of the MAC is 16 bytes. ๐
Otherwise, the use of AT_MAC in EAP-AKA' follows Section 10.15 of [RFC4187]. โจ
3.4.3. AT_CHECKCODE
When used within EAP-AKA', the AT_CHECKCODE attribute is changed as follows. First, a 32-byte value is needed to accommodate a 256-bit hash output:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| AT_CHECKCODE | Length | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Checkcode (0 or 32 bytes) |
| |
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Second, the checkcode is a hash value, calculated with SHA-256 [FIPS.180-2.2002], over the data specified in Section 10.13 of [RFC4187]. ๐ซถ
4. Bidding Down Prevention for EAP-AKA โจ
okay so bestie, [RFC3748] tells us that negotiating methods inside EAP is kinda insecure ๐ฌ. A man-in-the-middle attacker can push the endpoints into a method that isn't the strongest one they both support, and that's a whole mess. It matters here because we expect EAP-AKA and EAP-AKA' to get negotiated through EAP ๐ .
So to stop that, this RFC adds a new mechanism to EAP-AKA that lets the endpoints securely check what each other can do ๐ฅ. It's the AT_BIDDING attribute. Both endpoints use it to say they want EAP-AKA' and that they support it while they're swapping EAP-AKA messages. This attribute is NOT included in EAP-AKA' messages as defined here. It only shows up in EAP-AKA messages ๐. The reason is that EAP-AKA' is always preferable (see Section 5). If, during an EAP-AKA run, the endpoints find out that both of them could have used EAP-AKA', the authentication process SHOULD be aborted, because a bidding down attack may have happened ๐ญ.
Here's what the AT_BIDDING attribute looks like:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| AT_BIDDING | Length |D| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Here's the breakdown of each field ๐ง:
AT_BIDDING: this is set to 136.Length: the length of the attribute. It MUST be set to 1.D: this bit is set to 1 if the sender supports EAP-AKA', is willing to use it, and prefers it over EAP-AKA. Otherwise, it should be set to zero. โจReserved: this field MUST be set to zero when sent and ignored on receipt. ๐ธ
The server sends this attribute in the EAP-Request/AKA-Challenge message ๐. If the peer supports EAP-AKA', it compares what it got with its own capabilities. If both the server and the peer could have used EAP-AKA' and preferred it over EAP-AKA, the peer acts like AUTN was wrong and fails the authentication (see Figure 3 of [RFC4187]) ๐. A peer that doesn't support EAP-AKA' just ignores this attribute. In every case, the attribute is protected by the integrity mechanisms of EAP-AKA, so a man-in-the-middle attacker can't remove it ๐ซถ.
Also, we're assuming (Section 5) that EAP-AKA' is always stronger than EAP-AKA. So there's no need to stop bidding "down" attacks in the other direction, meaning attackers forcing the endpoints to use EAP-AKA' ๐.
5. Security Considerations ๐
okay this part is SO important, so let's get into it ๐. Here's a summary of the security properties of EAP-AKA'. They're pretty much the same as EAP-AKA's. We assume that SHA-256 is at least as secure as SHA-1. This is called the SHA-256 assumption for the rest of this section. Under that assumption, EAP-AKA' is at least as secure as EAP-AKA โจ.
If the AT_KDF attribute has value 1, the security properties of EAP-AKA' are these:
Protected ciphersuite negotiation
EAP-AKA' has no ciphersuite negotiation mechanisms ๐
. It does have a negotiation mechanism for choosing the key derivation functions, and that mechanism is secure against bidding down attacks ๐ฅ. The negotiation mechanism lets the offered key derivation function change, but the change shows up in the final EAP-Request/AKA'-Challenge message that the server sends to the peer. That message is authenticated with the AT_MAC attribute, and it carries both the chosen alternative and the originally offered list. The peer refuses to accept a change it didn't start ๐
โโ๏ธ. So both parties know a change is happening and what the original offer was ๐.
Mutual authentication
Under the SHA-256 assumption, EAP-AKA' is at least as good as EAP-AKA here. Check [RFC4187], Section 12 for the details ๐.
Integrity protection
Under the SHA-256 assumption, EAP-AKA' is at least as good as EAP-AKA here (most likely better) ๐. Check [RFC4187], Section 12 for the details. The only difference is that a stronger hash algorithm, SHA-256, is used instead of SHA-1 ๐ฆ.
Replay protection
Under the SHA-256 assumption, EAP-AKA' is at least as good as EAP-AKA here. Check [RFC4187], Section 12 for the details ๐.
Confidentiality
EAP-AKA' is exactly the same as EAP-AKA here. Check [RFC4187], Section 12 for the details ๐ซง.
Key derivation
EAP-AKA' supports key derivation with an effective key strength against brute force attacks equal to the minimum of the length of the derived keys and the length of the AKA base key, which is 128 bits or more ๐ช. The key hierarchy is specified in Section 3.3.
The Transient EAP Keys used to protect EAP-AKA packets (K_encr, K_aut, K_re), the MSK, and the EMSK are cryptographically separate ๐. If we assume that SHA-256 behaves as a pseudo-random function, an attacker can't work out any non-trivial information about any of these keys from the others ๐. An attacker also can't calculate the pre-shared secret from IK, CK, IK', CK', K_encr, K_aut, K_re, MSK, or EMSK by any practically feasible means ๐ก๏ธ.
EAP-AKA' adds an extra layer of key derivation functions inside itself to protect against the use of compromised keys ๐ง. This is discussed further in Section 5.1.
EAP-AKA' uses a pseudo-random function modeled after the one used in IKEv2 [RFC4306], together with SHA-256 ๐.
Key strength
See above ๐.
Dictionary attack resistance
Under the SHA-256 assumption, EAP-AKA' is at least as good as EAP-AKA here. Check [RFC4187], Section 12 for the details ๐ธ.
Fast reconnect
Under the SHA-256 assumption, EAP-AKA' is at least as good as EAP-AKA here. Check [RFC4187], Section 12 for the details. Also, implementations MUST prevent performing a fast reconnect across method types ๐ซ. Non-negotiable, bestie ๐ .
Cryptographic binding
This term refers to a very specific kind of binding, something done between two layers of authentication ๐ง . It's NOT the same as binding to a particular network name. EAP-AKA' is exactly the same as EAP-AKA here. Since it isn't a tunnel method, this property doesn't apply to it. Check [RFC4187], Section 12 for the details ๐.
Session independence
EAP-AKA' is exactly the same as EAP-AKA here. Check [RFC4187], Section 12 for the details โจ.
Fragmentation
EAP-AKA' is exactly the same as EAP-AKA here. Check [RFC4187], Section 12 for the details ๐งฉ.
Channel binding
EAP-AKA', like EAP-AKA, does not provide channel bindings as they're defined in [RFC3748] and [RFC5247] ๐. New skippable attributes can be used to add channel binding support later, if it's needed ๐ฎ.
Still, including the Network Name field in the AKA' algorithms gives a form of cryptographic separation between different network names, which kinda resembles channel bindings ๐ฆ. (The AKA' algorithms get used for other things too, not just EAP-AKA'.) But the network name doesn't usually identify the EAP (pass-through) authenticator. The next section has more on this ๐.
5.1. Security Properties of Binding Network Names
okay, this is the spicy bit ๐ถ๏ธ. Binding the network name into the keys that EAP-AKA' uses gives some extra protection against key leakage to the wrong people ๐. The keys in the protocol are specific to one network name. If key leakage happens because of an accident, an access node compromise, or some other attack, the leaked keys only work for access under that name. For example, a malicious access point can't claim to be network Y if it stole keys from network X ๐ โโ๏ธ. Obviously, if an access point is compromised, the malicious node can still pretend to be that compromised node. So neither EAP-AKA' nor any other extension can stop those attacks ๐ญ. But binding to a particular name limits the attacker's choices, makes attacks easier to track, makes it possible to spot compromised networks, and follows good cryptographic hygiene ๐งผ.
The server gets the EAP transaction from a given access network and checks that the access network's claim matches the name that network is supposed to be using ๐ต๏ธโโ๏ธ. It becomes impossible for an access network to claim over AAA that it's some other access network ๐ซ. Plus, if the peer checks that what it learned locally over the network-access link layer matches what the server gave it through EAP-AKA', then the access network can't tell one story to the AAA network and a different one to the peer ๐. These checks stop some "lying NAS" (Network Access Server) attacks ๐. For example, a roaming partner, R, might claim to be the home network H to lure peers into connecting to it ๐ชค. That's great for the roaming partner if it gets more users, and it's bad for the users if their access costs in R are higher than in other options, like H ๐ธ.
Any attacker who gets hold of the keys CK and IK, which the AKA algorithm produces, can compute the keys CK' and IK' and, from those, the Master Key (MK), following the rules in Section 3.3 ๐ฑ. The attacker could then act as a lying NAS. In 3GPP systems in general, the keys CK and IK have been shared with things like nodes in a visited access network, where they might be vulnerable ๐ฅบ. To cut that risk, the AKA algorithm MUST be computed with the AMF separation bit set to 1, and the peer MUST check that this is actually the case whenever it runs EAP-AKA' ๐. On top of that, [3GPP.33.402] requires that no CK or IK keys computed this way ever leave the home subscriber system ๐ .
How much extra security the binding gives you depends on how names get assigned to different access networks. That's specified in [3GPP.24.302], and see also [3GPP.23.003] ๐. Ideally, the names let you separate each access technology, each access network, and each NAS inside a domain โจ. If that isn't possible, you might not get the full benefits ๐ฌ. For example, if names only identify an access technology, using compromised keys in a different technology can be prevented, but it's NOT possible to stop their use by other domains or devices that use the same technology ๐.
6. IANA Considerations ๐
6.1. Type Value
EAP-AKA' has the EAP Type value 50 in the Extensible Authentication Protocol (EAP) Registry under Method Types ๐งโโ๏ธ. Per Section 6.2 of [RFC3748], this allocation can be made with Designated Expert and Specification Required ๐.
6.2. Attribute Type Values โจ
okay so EAP-AKA' shares its whole attribute space and subtypes with EAP-SIM [RFC4186] and EAP-AKA [RFC4187] ๐ซถ no new registries needed, bestie. we're just adding to what already exists ๐
that said, there's a new Attribute Type value (23) in the non-skippable range for AT_KDF_INPUT (Section 3.1). it lives in the EAP-AKA and EAP-SIM Parameters registry under Attribute Types ๐
also, a new Attribute Type value (24) in the non-skippable range was assigned for AT_KDF (Section 3.2) ๐ฅ
and finally ๐ a new Attribute Type value (136) in the skippable range was assigned for AT_BIDDING (Section 4). the way this one got its own skippable slot is so iconic ๐ฆ
6.3. Key Derivation Function Namespace ๐
IANA also made a brand new namespace just for EAP-AKA' AT_KDF Key Derivation Function Values ๐ it sits under the EAP-AKA and EAP-SIM Parameters registry. here's the starter pack. new values can be created through the Specification Required policy [RFC5226], so the door's open โจ
Value Description Reference
--------- ---------------------- ---------------
0 Reserved [RFC5448]
1 EAP-AKA' with CK'/IK' [RFC5448]
2-65535 Unassigned
7. Contributors ๐ง
the test vectors in Appendix C came from Yogendra Pal and Jouni Malinen ๐ญ they built them from two independent implementations of this spec, which is literally the most convincing receipt you could ask for ๐
8. Acknowledgments ๐ซถ
the authors want to thank Guenther Horn, Joe Salowey, Mats Naslund, Adrian Escott, Brian Rosenberg, Laksminath Dondeti, Ahmad Muhanna, Stefan Rommer, Miguel Garcia, Jan Kall, Ankur Agarwal, Jouni Malinen, Brian Weis, Russ Housley, and Alfred Hoenes. they gave in-depth reviews and had super interesting discussions about this problem space, so this whole crew deserves a group hug ๐ฅน๐
9. References ๐
9.1. Normative References ๐
[3GPP.24.302] 3GPP, "3rd Generation Partnership Project;
Technical Specification Group Core Network and
Terminals; Access to the 3GPP Evolved Packet Core
(EPC) via non-3GPP access networks; Stage 3;
(Release 8)", 3GPP Technical Specification 24.302,
December 2008.
[3GPP.33.102] 3GPP, "3rd Generation Partnership Project;
Technical Specification Group Services and System
Aspects; 3G Security; Security architecture
(Release 8)", 3GPP Technical Specification 33.102,
December 2008.
[3GPP.33.402] 3GPP, "3GPP System Architecture Evolution (SAE);
Security aspects of non-3GPP accesses; Release 8",
3GPP Technical Specification 33.402,
December 2008.
[FIPS.180-2.2002] National Institute of Standards and Technology,
"Secure Hash Standard", FIPS PUB 180-2,
August 2002, <http://csrc.nist.gov/publications/
fips/fips180-2/fips180-2.pdf>.
[RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC:
Keyed-Hashing for Message Authentication",
RFC 2104, February 1997.
[RFC2119] Bradner, S., "Key words for use in RFCs to
Indicate Requirement Levels", BCP 14, RFC 2119,
March 1997.
[RFC3748] Aboba, B., Blunk, L., Vollbrecht, J., Carlson, J.,
and H. Levkowetz, "Extensible Authentication Protocol (EAP)", RFC 3748, June 2004.
[RFC4187] Arkko, J. and H. Haverinen, "Extensible
Authentication Protocol Method for 3rd Generation
Authentication and Key Agreement (EAP-AKA)",
RFC 4187, January 2006.
[RFC5226] Narten, T. and H. Alvestrand, "Guidelines for
Writing an IANA Considerations Section in RFCs",
BCP 26, RFC 5226, May 2008.
9.2. Informative References ๐ฆ
[3GPP.23.003] 3GPP, "3rd Generation Partnership Project;
Technical Specification Group Core Network and
Terminals; Numbering, addressing and
identification (Release 8)", 3GPP Draft Technical
Specification 23.003, December 2008.
[3GPP.35.208] 3GPP, "3rd Generation Partnership Project;
Technical Specification Group Services and System
Aspects; 3G Security; Specification of the
MILENAGE Algorithm Set: An example algorithm set
for the 3GPP authentication and key generation
functions f1, f1*, f2, f3, f4, f5 and f5*;
Document 4: Design Conformance Test Data (Release
8)", 3GPP Technical Specification 35.208,
December 2008.
[FIPS.180-1.1995] National Institute of Standards and Technology,
"Secure Hash Standard", FIPS PUB 180-1,
April 1995,
<http://www.itl.nist.gov/fipspubs/fip180-1.htm>.
[RFC4186] Haverinen, H. and J. Salowey, "Extensible
Authentication Protocol Method for Global System
for Mobile Communications (GSM) Subscriber
Identity Modules (EAP-SIM)", RFC 4186,
January 2006.
[RFC4284] Adrangi, F., Lortz, V., Bari, F., and P. Eronen,
"Identity Selection Hints for the Extensible
Authentication Protocol (EAP)", RFC 4284,
January 2006.
[RFC4306] Kaufman, C., "Internet Key Exchange (IKEv2)
Protocol", RFC 4306, December 2005.
[RFC5113] Arkko, J., Aboba, B., Korhonen, J., and F. Bari,
"Network Discovery and Selection Problem",
RFC 5113, January 2008.
[RFC5247] Aboba, B., Simon, D., and P. Eronen, "Extensible
Authentication Protocol (EAP) Key Management
Framework", RFC 5247, August 2008.
Appendix A. Changes from RFC 4187 ๐ฅ
okay the changes to RFC 4187 are only about the bidding down prevention support from Section 4 ๐ this document does NOT change how the Master Key (MK) is calculated in RFC 4187. it still uses CK and IK, not CK' and IK'. and no processing of the AMF bit got added to RFC 4187 either, so that part stays exactly the same โจ
Appendix B. Importance of Explicit Negotiation ๐
so choosing between the traditional and revised AKA key derivation functions is super easy when it's tied to one specific radio access network, like Long Term Evolution (LTE) as defined by 3GPP or evolved High Rate Packet Data (eHRPD) as defined by 3GPP2 ๐ธ if that network always uses new protocols that can't be mixed with the old ones, there's zero interoperability drama. clients always know if they're connecting to the old or new system.
but using the new key derivation functions over EAP adds several degrees of separation, and that makes picking the right one way harder ๐ญ tons of different networks use EAP, and most of them have no way to carry any info about what the authentication process expects. EAP itself is pretty limited at carrying extra info too, as noted in [RFC4284] and [RFC5113]. even if those networks or EAP got upgraded to carry more, it wouldn't magically fix the millions of deployed access networks and clients attaching to them.
changing the key derivation functions EAP-AKA [RFC4187] uses would cause interoperability problems with every existing implementation, so that's a no-go ๐ โโ๏ธ you could try strict separation into domain names for new clients and networks, so only the new devices use the new mechanism. it can work for specific cases, but it's extremely brittle and ripe for problems whenever client configuration, routing of authentication requests, or server configuration doesn't match expectations. relying on the EAP client and server running a particular release of 3GPP network specifications doesn't fix it either ๐ network vendors often ship features from future releases early or skip some features of the current release, and there are plenty of EAP and even some EAP-AKA implementations that aren't bundled with 3GPP network offerings. honestly, all these approaches are expected to lead to hard-to-diagnose problems and more support calls, and nobody wants that era ๐
Appendix C. Test Vectors ๐งชโจ
okay bestie, here are four test vector cases so you can check your implementation against known-good numbers ๐ The vectors may be useful for testing implementations. Cases 1 and 2 use the Milenage algorithm and its config values (the subscriber key K and the operator algorithm variant configuration value OP) from test set 19 in [3GPP.35.208] ๐ฅ
Cases 3 and 4 are a different vibe. They use made-up values as the AKA output, so they're only useful for testing how EAP-AKA' computes its values, NOT AKA itself ๐
Case 1
the AKA run parameters look like this ๐
Identity: "0555444333222111"
Network name: "WLAN"
RAND: 81e9 2b6c 0ee0 e12e bceb a8d9 2a99 dfa5
AUTN: bb52 e91c 747a c3ab 2a5c 23d1 5ee3 51d5
IK: 9744 871a d32b f9bb d1dd 5ce5 4e3e 2e5a
CK: 5349 fbe0 9864 9f94 8f5d 2e97 3a81 c00f
RES: 28d7 b0f2 a2ec 3de5
and then the derived keys come out as ๐
CK': 0093 962d 0dd8 4aa5 684b 045c 9edf fa04
IK': ccfc 230c a74f cc96 c0a5 d611 64f5 a76c
K_encr: 766f a0a6 c317 174b 812d 52fb cd11 a179
K_aut: 0842 ea72 2ff6 835b fa20 3249 9fc3 ec23
c2f0 e388 b4f0 7543 ffc6 77f1 696d 71ea
K_re: cf83 aa8b c7e0 aced 892a cc98 e76a 9b20
95b5 58c7 795c 7094 715c b339 3aa7 d17a
MSK: 67c4 2d9a a56c 1b79 e295 e345 9fc3 d187
d42b e0bf 818d 3070 e362 c5e9 67a4 d544
e8ec fe19 358a b303 9aff 03b7 c930 588c
055b abee 58a0 2650 b067 ec4e 9347 c75a
EMSK: f861 703c d775 590e 16c7 679e a387 4ada
8663 11de 2907 64d7 60cf 76df 647e a01c
313f 6992 4bdd 7650 ca9b ac14 1ea0 75c4
ef9e 8029 c0e2 90cd bad5 638b 63bc 23fb
Case 2
same identity and Milenage setup, but now the network name is "HRPD" ๐ธ the AKA run parameters:
Identity: "0555444333222111"
Network name: "HRPD"
RAND: 81e9 2b6c 0ee0 e12e bceb a8d9 2a99 dfa5
AUTN: bb52 e91c 747a c3ab 2a5c 23d1 5ee3 51d5
IK: 9744 871a d32b f9bb d1dd 5ce5 4e3e 2e5a
CK: 5349 fbe0 9864 9f94 8f5d 2e97 3a81 c00f
RES: 28d7 b0f2 a2ec 3de5
and the derived keys ๐ฆ
CK': 3820 f027 7fa5 f777 32b1 fb1d 90c1 a0da
IK': db94 a0ab 557e f6c9 ab48 619c a05b 9a9f
K_encr: 05ad 73ac 915f ce89 ac77 e152 0d82 187b
K_aut: 5b4a caef 62c6 ebb8 882b 2f3d 534c 4b35
2773 37a0 0184 f20f f25d 224c 04be 2afd
K_re: 3f90 bf5c 6e5e f325 ff04 eb5e f653 9fa8
cca8 3981 94fb d00b e425 b3f4 0dba 10ac
MSK: 87b3 2157 0117 cd6c 95ab 6c43 6fb5 073f
f15c f855 05d2 bc5b b735 5fc2 1ea8 a757
57e8 f86a 2b13 8002 e057 5291 3bb4 3b82
f868 a961 17e9 1a2d 95f5 2667 7d57 2900
EMSK: c891 d5f2 0f14 8a10 0755 3e2d ea55 5c9c
b672 e967 5f4a 66b4 bafa 0273 79f9 3aee
539a 5979 d0a0 042b 9d2a e28b ed3b 17a3
1dc8 ab75 072b 80bd 0c1d a612 466e 402c
Case 3
now the artificial-values era ๐ง (remember: only for EAP-AKA' value computation, not AKA itself). the AKA run parameters:
Identity: "0555444333222111"
Network name: "WLAN"
RAND: e0e0 e0e0 e0e0 e0e0 e0e0 e0e0 e0e0 e0e0
AUTN: a0a0 a0a0 a0a0 a0a0 a0a0 a0a0 a0a0 a0a0
IK: b0b0 b0b0 b0b0 b0b0 b0b0 b0b0 b0b0 b0b0
CK: c0c0 c0c0 c0c0 c0c0 c0c0 c0c0 c0c0 c0c0
RES: d0d0 d0d0 d0d0 d0d0 d0d0 d0d0 d0d0 d0d0
and the derived keys ๐
CK': cd4c 8e5c 68f5 7dd1 d7d7 dfd0 c538 e577
IK': 3ece 6b70 5dbb f7df c459 a112 80c6 5524
K_encr: 897d 302f a284 7416 488c 28e2 0dcb 7be4
K_aut: c407 00e7 7224 83ae 3dc7 139e b0b8 8bb5
58cb 3081 eccd 057f 9207 d128 6ee7 dd53
K_re: 0a59 1a22 dd8b 5b1c f29e 3d50 8c91 dbbd
b4ae e230 5189 2c42 b6a2 de66 ea50 4473
MSK: 9f7d ca9e 37bb 2202 9ed9 86e7 cd09 d4a7
0d1a c76d 9553 5c5c ac40 a750 4699 bb89
61a2 9ef6 f3e9 0f18 3de5 861a d1be dc81
ce99 1639 1b40 1aa0 06c9 8785 a575 6df7
EMSK: 724d e00b db9e 5681 87be 3fe7 4611 4557
d501 8779 537e e37f 4d3c 6c73 8cb9 7b9d
c651 bc19 bfad c344 ffe2 b52c a78b d831
6b51 dacc 5f2b 1440 cb95 1552 1cc7 ba23
Case 4
last one! same artificial values as Case 3, but the network name is "HRPD" ๐ the AKA run parameters:
Identity: "0555444333222111"
Network name: "HRPD"
RAND: e0e0 e0e0 e0e0 e0e0 e0e0 e0e0 e0e0 e0e0
AUTN: a0a0 a0a0 a0a0 a0a0 a0a0 a0a0 a0a0 a0a0
IK: b0b0 b0b0 b0b0 b0b0 b0b0 b0b0 b0b0 b0b0
CK: c0c0 c0c0 c0c0 c0c0 c0c0 c0c0 c0c0 c0c0
RES: d0d0 d0d0 d0d0 d0d0 d0d0 d0d0 d0d0 d0d0
and the derived keys โญ
CK': 8310 a71c e6f7 5488 9613 da8f 64d5 fb46
IK': 5adf 1436 0ae8 3819 2db2 3f6f cb7f 8c76
K_encr: 745e 7439 ba23 8f50 fcac 4d15 d47c d1d9
K_aut: 3e1d 2aa4 e677 025c fd86 2a4b e183 61a1
3a64 5765 5714 63df 833a 9759 e809 9879
K_re: 99da 835e 2ae8 2462 576f e651 6fad 1f80
2f0f a119 1655 dd0a 273d a96d 04e0 fcd3
MSK: c6d3 a6e0 ceea 951e b20d 74f3 2c30 61d0
680a 04b0 b086 ee87 00ac e3e0 b95f a026
83c2 87be ee44 4322 94ff 98af 26d2 cc78
3bac e75c 4b0a f7fd feb5 511b a8e4 cbd0
EMSK: 7fb5 6813 838a dafa 99d1 40c2 f198 f6da
cebf b6af ee44 4961 1054 02b5 08c7 f363
352c b291 9644 b504 63e6 a693 5415 0147
ae09 cbc5 4b8a 651d 8787 a689 3ed8 536d
Authors' Addresses ๐ซถ
these are the people who wrote it, so you know who to thank (or DM) ๐
Jari Arkko
Ericsson
Jorvas 02420
Finland
EMail: jari.arkko@piuha.net
Vesa Lehtovirta
Ericsson
Jorvas 02420
Finland
EMail: vesa.lehtovirta@ericsson.com
Pasi Eronen
Nokia Research Center
P.O. Box 407
FIN-00045 Nokia Group
Finland
EMail: pasi.eronen@nokia.com
and that's the whole spec, bestie!! ๐๐ you made it through all six parts ๐ญ๐
๐ฆ where this page comes from
- ietf: rfc5448 2009-05
- ๐ girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms