In general, all of the requirements in [
RFC 9190] apply to other EAP methods that wish to use TLS 1.3. Unless otherwise required herein, implementations of EAP methods that wish to use TLS 1.3
MUST follow the guidelines in [
RFC 9190].
There remain some differences between EAP-TLS and other TLS-based EAP methods that are addressed by this document. The main difference is that [
RFC 9190] uses the EAP-TLS Type (value 0x0D) in a number of calculations, whereas other method types will use their own Type value instead of the EAP-TLS Type value. This topic is discussed further in
Section 2.1.
An additional difference is that
RFC 9190,
Section 2.5 requires the EAP server to send a protected success result indication once the EAP-TLS handshake has completed. This indication is composed of one octet (0x00) of application data. Other TLS-based EAP methods also use this result indication, but only during resumption. When other TLS-based EAP methods use full authentication, the result indication is not needed or used. This topic is explained in more detail in Sections [
3] and [
4].
Finally, this document includes clarifications on how various TLS- based parameters are calculated when using TLS 1.3. These parameters are different for each EAP method, so they are discussed separately.
The key derivation for TLS-based EAP methods depends on the value of the EAP Type as defined by [
IANA] in the "Extensible Authentication Protocol (EAP) Registry". The most important definition is of the Type field, as first defined in
RFC 3748,
Section 2:
Type = value of the EAP Method type
For the purposes of this specification, when we refer to logical Type, we mean that the logical Type is defined as one octet for values smaller than 254 (the value for the Expanded Type). When Expanded EAP Types are used, the logical Type is defined as the concatenation of the fields required to define the Expanded Type, including the Type with value 0xfe, Vendor-Id (in network byte order), and Vendor-Type fields (in network byte order) defined in
RFC 3748,
Section 5.7, as given below:
Type = 0xFE || Vendor-Id || Vendor-Type
This definition does not alter the meaning of Type in [
RFC 3748] or change the structure of EAP packets. Instead, this definition allows us to simplify references to EAP Types by using a logical "Type" instead of referring to "the Type field or the Type field with value 0xfe, plus the Vendor-ID and Vendor-Type". For example, the value of Type for PEAP is simply 0x19.
Note that unlike TLS 1.2 and earlier, the calculation of the TLS-Exporter function depends on the length passed to it. Therefore, implementations
MUST pass the correct length instead of passing a large length and truncating the output. Any output calculated using a larger length value, which is then truncated, will be different from the output that was calculated using the correct length.
Unless otherwise discussed below, the key derivation functions for all TLS-based EAP Types are defined in
RFC 9190,
Section 2.3 and reproduced here for clarity. These definitions include ones for the Master Session Key (MSK) and the Extended Master Session Key (EMSK):
Key_Material = TLS-Exporter("EXPORTER_EAP_TLS_Key_Material",
Type, 128)
Method-Id = TLS-Exporter("EXPORTER_EAP_TLS_Method-Id",
Type, 64)
Session-Id = Type || Method-Id
MSK = Key_Material(0, 63)
EMSK = Key_Material(64, 127)
We note that these definitions reuse the EAP-TLS exporter labels and change the derivation only by adding a dependency on the logical Type. The reason for this change is simplicity. The inclusion of the EAP Type makes the derivation method specific. There is no need to use different labels for different EAP Types as was done earlier.
These definitions apply in their entirety to EAP-TTLS [
RFC 5281] and PEAP as defined in [
PEAP] and [
MSPEAP]. Some definitions apply to EAP-FAST and TEAP with exceptions as noted below.
It is
RECOMMENDED that vendor-defined and TLS-based EAP methods use the above definitions for TLS 1.3. There is no compelling reason to use different definitions.
TEAP previously used a Protected Access Credential (PAC), which is functionally equivalent to session tickets provided by TLS 1.3 that contain a pre-shared key (PSK) along with other data. As such, the use of a PAC is deprecated for TEAP in TLS 1.3. PAC provisioning, as defined in
RFC 7170,
Section 3.8.1, is also no longer part of TEAP when TLS 1.3 is used.
RFC 7170,
Section 5.2 gives a definition for the Inner Method Session Key (IMSK), which depends on the TLS Pseudorandom Function (PRF) (also known as TLS-PRF). When the j'th inner method generates an EMSK, we update that definition for TLS 1.3 as:
IMSK[j] = TLS-Exporter("TEAPbindkey@ietf.org", secret, 32)
The secret is the EMSK or MSK from the j'th inner method. When an inner method does not provide an EMSK or MSK, IMSK[j] is 32 octets of zero.
The other key derivations for TEAP are given here. All derivations not given here are the same as given above in the previous section. These derivations are also used for EAP-FAST, but using the EAP-FAST Type.
The derivation of the IMSKs, Inner Method Compound Keys (IMCKs), and Compound Session Keys (CMKs) is given below.
session_key_seed = TLS-Exporter("EXPORTER: teap session key seed",
Type, 40)
S-IMCK[0] = session_key_seed
For j = 1 to n-1 do
IMCK[j] = TLS-Exporter("EXPORTER: Inner Methods Compound Keys",
S-IMCK[j-1] || IMSK[j], 60)
S-IMCK[j] = first 40 octets of IMCK[j]
CMK[j] = last 20 octets of IMCK[j]
Note: In these definitions, || denotes concatenation.
In TLS 1.3, the derivation of IMCK[j] uses both a different label and a different order of concatenating fields than what was used by TEAP with TLS 1.2. Similarly, the session_key_seed in TLS 1.3 uses the Type as the context. In TLS 1.2, the context was a zero-length field.
The outer MSK and EMSK are then derived from the final ("n"th) inner method, as follows:
MSK = TLS-Exporter(
"EXPORTER: Session Key Generating Function",
S-IMCK[n], 64)
EMSK = TLS-Exporter(
"EXPORTER: Extended Session Key Generating Function",
S-IMCK[n], 64)
The TEAP Compound Message Authentication Code (MAC) defined in
RFC 7170,
Section 5.3 remains the same, but the MAC for TLS 1.3 is computed with the Hashed Message Authentication Code (HMAC) algorithm negotiated for the HMAC-based Key Derivation Function (HKDF) in the key schedule, as per
RFC 8446,
Section 7.1. That is, the MAC used is the MAC derived from the TLS handshake:
Compound-MAC = MAC( CMK[n], BUFFER )
where we define CMK[n] as the CMK taken from the final ("n"th) inner method.
For TLS 1.3, the MAC is computed with the HMAC algorithm negotiated for HKDF in the key schedule, as per
RFC 8446,
Section 7.1. That is, the MAC used is the MAC derived from the TLS handshake.
The definition of BUFFER is unchanged from
RFC 7170,
Section 5.3.
The use of client certificates is still permitted when using TEAP with TLS 1.3. However, if the client certificate is accepted, then the EAP peer
MUST proceed with additional authentication of Phase 2, as per
RFC 7170,
Section 7.6. If there is no Phase 2 data, then the EAP server
MUST reject the session.
While
RFC 5281,
Section 7.6 permits "authentication of the client via client certificate during phase 1, with no additional authentication or information exchange required," this practice is forbidden when TEAP is used with TLS 1.3. If there is a requirement to use client certificates with no inner tunnel methods, then EAP-TLS should be used instead of TEAP.
RFC 7170,
Section 7.4.1 suggests that client certificates should be sent in Phase 2 of the TEAP exchange "since TLS client certificates are sent in the clear". While TLS 1.3 no longer sends client certificates in the clear, TEAP implementations need to distinguish identities for both User and Machine using the Identity-Type TLV (with values 1 and 2, respectively). When a client certificate is sent outside of the TLS tunnel, it
MUST include Identity-Type as an outer TLV in order to signal the type of identity which that client certificate is for.
For EAP-FAST, the session_key_seed is also part of the key_block as defined in
RFC 4851,
Section 5.1.
The definitions of S-IMCK[n], MSK, and EMSK are the same as given above for TEAP. We reiterate that the EAP-FAST Type must be used when deriving the session_key_seed and not the TEAP Type.
Unlike
RFC 4851,
Section 5.2, the definition of IMCK[j] places the reference to S-IMCK after the textual label and then concatenates the IMSK instead of the MSK.
EAP-FAST previously used a PAC that is functionally equivalent to session tickets provided by TLS 1.3, which contain a PSK along with other data. As such, the use of a PAC is deprecated for EAP-FAST in TLS 1.3. PAC provisioning [
RFC 5422] is also no longer part of EAP-FAST when TLS 1.3 is used.
The T-PRF given in
RFC 4851,
Section 5.5 is not used for TLS 1.3. Instead, it is replaced with the TLS 1.3 TLS-Exporter function.
The use of client certificates is still permitted when using EAP-FAST with TLS 1.3. However, if the client certificate is accepted, then the EAP peer
MUST proceed with additional authentication of Phase 2, as per
RFC 4851,
Section 7.4.1. If there is no Phase 2 data, then the EAP server
MUST reject the session.
While [
RFC 4851] implicitly permits the use of client certificates without proceeding to Phase 2, this practice is forbidden when EAP-FAST is used with TLS 1.3. If there is a requirement to use client certificates with no inner tunnel methods, then EAP-TLS should be used instead of EAP-FAST.
RFC 5281,
Section 11.1 defines an implicit challenge when the inner methods of the Challenge Handshake Authentication Protocol (CHAP) [
RFC 1994], MS-CHAP [
RFC 2433], or MS-CHAPv2 [
RFC 2759] are used. The derivation for TLS 1.3 is instead given as:
EAP-TTLS_challenge = TLS-Exporter("ttls challenge",, n)
There is no "context_value" (
RFC 8446,
Section 7.5) passed to the TLS-Exporter function. The value "n" given here is the length of the data required; [
RFC 5281] requires it to be 17 octets for CHAP (
RFC 5281,
Section 11.2.2) and MS-CHAPv2 (
RFC 5281,
Section 11.2.4), and 9 octets for MS-CHAP (
RFC 5281,
Section 11.2.3).
When the Password Authentication Protocol (PAP), CHAP, or MS-CHAPv1 are used as inner authentication methods, there is no opportunity for the EAP server to send a protected success indication, as is done in
RFC 9190,
Section 2.5. Instead, when TLS session tickets are disabled, the response from the EAP server
MUST be either EAP-Success or EAP-Failure. These responses are unprotected and can be forged by a skilled attacker.
Where TLS session tickets are enabled, the response from the EAP server may also continue TLS negotiation with a TLS NewSessionTicket message. Since this message is protected by TLS, it can serve as the protected success indication.
Therefore, it is
RECOMMENDED that EAP servers always send a TLS NewSessionTicket message, even if resumption is not configured. When the EAP peer attempts to use the ticket, the EAP server can instead request a full authentication. As noted earlier, implementations
SHOULD NOT send TLS NewSessionTicket messages until the "inner tunnel" authentication has completed in order to take full advantage of the message as a protected success indication.
When resumption is not used, the TLS NewSessionTicket message is not available and some authentication methods will not have a protected success indication. While we would like to always have a protected success indication, limitations of the underlying protocols, implementations, and deployment requirements make that impossible.
EAP peers
MUST continue running their EAP state machine until they receive either an EAP-Success or an EAP-Failure. Receiving a TLS NewSessionTicket message in response to inner method PAP, CHAP, or MS-CHAP authentication is normal and
MUST NOT be treated as a failure.
RFC 5281,
Section 7.6 permits "authentication of the client via client certificate during phase 1, with no additional authentication or information exchange required." This practice is forbidden when EAP-TTLS is used with TLS 1.3. If there is a requirement to use client certificates with no inner tunnel methods, then EAP-TLS should be used instead of EAP-TTLS.
The use of client certificates is still permitted when using EAP-TTLS with TLS 1.3. However, if the client certificate is accepted, then the EAP peer
MUST proceed with additional authentication of Phase 2, as per
RFC 5281,
Section 7.2. If there is no Phase 2 data, then the EAP server
MUST reject the session.
When PEAP uses crypto binding, it uses a different key calculation defined in [
PEAP-MPPE] that consumes inner EAP method keying material. The PRF+ function used in [
PEAP-MPPE] is not taken from the TLS exporter but is instead calculated via a different method that is given in [
PEAP-PRF]. That derivation remains unchanged in this specification.
Note that the above derivation uses SHA-1, which may be formally deprecated in the near future.
However, the PRF+ calculation uses a PEAP Tunnel Key (TK), which is defined in [
PEAP-TK] as:
... the TK is the first 60 octets of the Key_Material, as specified in [
RFC 5216]: TLS-PRF-128 (master secret, "client EAP encryption", client.random || server.random).
We note that the text in [
PEAP-PRF] does not define Key_Material. Instead, it defines TK as the first octets of Key_Material and gives a definition of Key_Material that is appropriate for TLS versions before TLS 1.3.
For TLS 1.3, the TK should be derived from the Key_Material defined here in
Section 2.1 instead of using the TLS-PRF-128 derivation given in [
PEAP-PRF]. The method defined in [
PEAP-TK]
MUST NOT be used.
As with EAP-TTLS, [
PEAP] permits the use of client certificates in addition to inner tunnel methods. The practice of using client certificates with no "inner method" is forbidden when PEAP is used with TLS 1.3. If there is a requirement to use client certificates with no inner tunnel methods, then EAP-TLS should be used instead of PEAP.
The use of client certificates is still permitted when using PEAP with TLS 1.3. However, if the client certificate is accepted, then the EAP peer
MUST proceed with additional authentication of the inner tunnel. If there is no inner tunnel authentication data, then the EAP server
MUST reject the session.