<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ace-wg-coap-eap-15" number="9820" updates="" obsoletes="" category="std" consensus="true" submissionType="IETF" tocDepth="3" tocInclude="true" sortRefs="true" symRefs="true" version="3" xml:lang="en">

  <front>
    <title abbrev="CoAP-EAP">Authentication Service Based on the Extensible Authentication Protocol (EAP) for Use with the Constrained Application Protocol (CoAP)</title>
    <seriesInfo name="RFC" value="9820"/>
    <author initials="R." surname="Marin-Lopez" fullname="Rafa Marin-Lopez">
      <organization abbrev="University of Murcia">University of Murcia</organization>
      <address>
        <postal>
          <street>Campus de Espinardo S/N, Faculty of Computer Science</street>
          <city>Murcia</city>
          <code>30100</code>
          <country>Spain</country>
        </postal>
        <email>rafa@um.es</email>
      </address>
    </author>
    <author initials="D." surname="Garcia-Carrillo" fullname="Dan Garcia-Carrillo">
      <organization abbrev="University of Oviedo">University of Oviedo</organization>
      <address>
        <postal>
          <street>Calle Luis Ortiz Berrocal S/N, Edificio Polivalente</street>
          <city>Gijon</city>
          <region>Asturias</region>
          <code>33203</code>
          <country>Spain</country>
        </postal>
        <email>garciadan@uniovi.es</email>
      </address>
    </author>
    <date year="2025" month="September"/>
    <area>SEC</area>
    <workgroup>ace</workgroup>

<keyword>CoAP</keyword>
<keyword>EAP</keyword>
<keyword>EAP lower layer</keyword>
<keyword>Internet of Things</keyword>
<keyword>IoT</keyword>
<keyword>Constrained Node</keyword>
<keyword>Smart Object</keyword>

    <abstract>
<t>This document specifies an authentication service that uses the Constrained Application Protocol (CoAP) as a transport method to carry the Extensible Authentication Protocol (EAP). As such, it defines an EAP lower layer based on CoAP called "CoAP-EAP". One of the main goals is to authenticate a CoAP-enabled Internet of Things (IoT) device (EAP peer) that intends to join a security domain managed by a Controller (EAP authenticator). Secondly, it allows deriving key material to protect CoAP messages exchanged between them based on Object Security for Constrained RESTful Environments (OSCORE), enabling the establishment of a security association between them.</t>
    </abstract>
  </front>
  <middle>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies an authentication service (application) that uses the Extensible Authentication Protocol (EAP) <xref target="RFC3748"/> and is built on top of the Constrained Application Protocol (CoAP) <xref target="RFC7252"/>; it is called "CoAP-EAP". CoAP-EAP is an application that allows authenticating two CoAP endpoints by using EAP and establishing an Object Security for Constrained RESTful Environments (OSCORE) security association between them.
More specifically, this document specifies how CoAP can be used as a constrained, link-layer-independent, reliable EAP lower layer <xref target="RFC3748"/> to transport EAP messages between a CoAP server (acting as an EAP peer) and a CoAP client (acting as an EAP authenticator) using CoAP messages. The CoAP client has the option of contacting a backend Authentication, Authorization, and Accounting (AAA) infrastructure to complete the EAP negotiation, as described in the EAP specification <xref target="RFC3748"/>.</t>
      <t>In the case of this specification, the EAP methods that can be transported with CoAP-EAP <bcp14>MUST</bcp14> export cryptographic material <xref target="RFC5247"/>. Examples of such methods are the EAP Generalized Pre-Shared Key (EAP-GPSK) <xref target="RFC5433"/>, the EAP Method for Global System for Mobile Communications (GSM)
Subscriber Identity Modules (EAP-SIM) <xref target="RFC4186"/>, the EAP Method for 3rd Generation Authentication and Key Agreement (EAP-AKA') <xref target="RFC5448"/>,
EAP-TLS 1.3 <xref target="RFC9190"/>, EAP with Ephemeral Diffie-Hellman over
CBOR Object Signing and Encryption (EAP-EDHOC) <xref target="I-D.ietf-emu-eap-edhoc"/>, etc. ("CBOR" stands for "Concise Binary Object Representation".) In general, any EAP method
designed in the EAP Method Update (EMU) Working Group that exports the Master Session Key (MSK) can be used with CoAP-EAP. The MSK is used as the basis for further cryptographic derivations. This way, CoAP messages are protected after authentication. After the CoAP-EAP operation, an OSCORE security association is established between the endpoints of the service. Using the keying material from the authentication, other security associations could be generated. <xref target="flow-of-operation-dtls"/> shows how to establish a (D)TLS security association using the keying material from the EAP authentication.</t>
      <t>One of the main applications of CoAP-EAP involves Internet of Things (IoT) networks, where we can find very constrained links (e.g., limited bandwidth) and devices with limited capabilities. In these IoT scenarios, we identify the IoT device as the entity that wants to be authenticated by using EAP to join a domain that is managed by a Controller. In these cases, the IoT device is the EAP peer and the Controller is the entity steering the authentication (i.e., the EAP authenticator); from now on, the IoT device will be referred to as the EAP peer and the Controller will be referred to as the EAP authenticator. In these cases, EAP methods with fewer exchanges, shorter messages, and cryptographic algorithms suitable for constrained devices are preferable. The benefits of the EAP framework in IoT networks are highlighted in <xref target="EAP-Framework-IoT"/>.</t>
      <section anchor="requirements-language">
        <name>Requirements Language</name>
       <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
       "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>",
       "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>",
       "<bcp14>SHOULD NOT</bcp14>",
       "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
       "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document
       are to be interpreted as described in BCP&nbsp;14
       <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only
       when, they appear in all capitals, as shown here.</t>


<t>Readers are expected to be familiar with the terms and concepts described in CoAP <xref target="RFC7252"/>, EAP <xref target="RFC3748"/> <xref target="RFC5247"/>, and OSCORE <xref target="RFC8613"/>.</t>
      </section>
    </section>
    <section anchor="general-architecture">
      <name>General Architecture</name>
      <t><xref target="arch"/> illustrates the architecture defined in this document.  In this architecture, the EAP peer will act as a CoAP server for this
service and the domain EAP authenticator will act as a CoAP client. The rationale behind this decision is that EAP Requests will always travel from the EAP server to the EAP peer. Accordingly, EAP Responses will always travel from the EAP peer to the EAP server.</t>
      <t>It is worth noting that the EAP authenticator <bcp14>MAY</bcp14> interact with a backend AAA infrastructure when EAP pass-through mode is used, which will place the EAP server in the AAA server that contains the information required to authenticate the EAP peer.</t>
      <t>The protocol stack is described in <xref target="stack"/>. CoAP-EAP is an application built on top of CoAP. On top of the application, there is an EAP state machine that can run any EAP method. In the case of this specification, the EAP method <bcp14>MUST</bcp14> support key derivation and export as specified in <xref target="RFC5247"/>: an MSK of at least 64 octets and an Extended Master Session Key (EMSK) of at least 64 octets. CoAP-EAP also relies on CoAP reliability mechanisms to transport EAP: CoAP over UDP with Confirmable messages <xref target="RFC7252"/> or CoAP over TCP, TLS, or WebSockets <xref target="RFC8323"/>.</t>
      <figure anchor="arch">
        <name>CoAP-EAP Architecture</name>
        <artset>
          <artwork type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="144" width="480" viewBox="0 0 480 144" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 8,32 L 8,80" fill="none" stroke="black"/>
            <path d="M 80,32 L 80,80" fill="none" stroke="black"/>
            <path d="M 152,32 L 152,80" fill="none" stroke="black"/>
            <path d="M 272,32 L 272,80" fill="none" stroke="black"/>
            <path d="M 384,32 L 384,80" fill="none" stroke="black"/>
            <path d="M 472,32 L 472,80" fill="none" stroke="black"/>
            <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
            <path d="M 152,32 L 272,32" fill="none" stroke="black"/>
            <path d="M 384,32 L 472,32" fill="none" stroke="black"/>
            <path d="M 88,64 L 144,64" fill="none" stroke="black"/>
            <path d="M 280,64 L 376,64" fill="none" stroke="black"/>
            <path d="M 8,80 L 80,80" fill="none" stroke="black"/>
            <path d="M 152,80 L 272,80" fill="none" stroke="black"/>
            <path d="M 384,80 L 472,80" fill="none" stroke="black"/>
            <path d="M 8,112 L 40,112" fill="none" stroke="black"/>
            <path d="M 240,112 L 272,112" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="384,64 372,58.4 372,69.6" fill="black" transform="rotate(0,376,64)"/>
            <polygon class="arrowhead" points="288,64 276,58.4 276,69.6" fill="black" transform="rotate(180,280,64)"/>
            <polygon class="arrowhead" points="280,112 268,106.4 268,117.6" fill="black" transform="rotate(0,272,112)"/>
            <polygon class="arrowhead" points="152,64 140,58.4 140,69.6" fill="black" transform="rotate(0,144,64)"/>
            <polygon class="arrowhead" points="96,64 84,58.4 84,69.6" fill="black" transform="rotate(180,88,64)"/>
            <polygon class="arrowhead" points="16,112 4,106.4 4,117.6" fill="black" transform="rotate(180,8,112)"/>
            <g class="text">
              <text x="40" y="52">EAP</text>
              <text x="192" y="52">EAP</text>
              <text x="428" y="52">AAA/</text>
              <text x="44" y="68">peer</text>
              <text x="216" y="68">authenticator</text>
              <text x="400" y="68">EAP</text>
              <text x="444" y="68">server</text>
              <text x="116" y="84">CoAP</text>
              <text x="328" y="84">AAA</text>
              <text x="332" y="100">(optional)</text>
              <text x="72" y="116">SCOPE</text>
              <text x="108" y="116">OF</text>
              <text x="140" y="116">THIS</text>
              <text x="196" y="116">DOCUMENT</text>
            </g>
          </svg>
          </artwork>
          <artwork type="ascii-art" align="center"><![CDATA[
  +--------+        +--------------+             +----------+
  |  EAP   |        |   EAP        |             |   AAA/   |
  |  peer  |<------>| authenticator|<----------->|EAP server|
  +--------+  CoAP  +--------------+     AAA     +----------+
                                      (optional)
  <---- SCOPE OF THIS DOCUMENT ---->
]]></artwork>
        </artset>
      </figure>
      <figure anchor="stack">
        <name>CoAP-EAP Stack</name>
        <artset>
          <artwork type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="224" width="464" viewBox="0 0 464 224" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 8,32 L 8,192" fill="none" stroke="black"/>
            <path d="M 296,32 L 296,192" fill="none" stroke="black"/>
            <path d="M 8,32 L 296,32" fill="none" stroke="black"/>
            <path d="M 8,64 L 296,64" fill="none" stroke="black"/>
            <path d="M 312,80 L 328,80" fill="none" stroke="black"/>
            <path d="M 8,96 L 296,96" fill="none" stroke="black"/>
            <path d="M 8,128 L 296,128" fill="none" stroke="black"/>
            <path d="M 8,160 L 296,160" fill="none" stroke="black"/>
            <path d="M 8,192 L 296,192" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="320,80 308,74.4 308,85.6" fill="black" transform="rotate(180,312,80)"/>
            <g class="text">
              <text x="96" y="52">EAP</text>
              <text x="136" y="52">State</text>
              <text x="192" y="52">Machine</text>
              <text x="112" y="84">Application</text>
              <text x="204" y="84">(CoAP-EAP)</text>
              <text x="356" y="84">This</text>
              <text x="412" y="84">Document</text>
              <text x="52" y="116">Requests</text>
              <text x="96" y="116">/</text>
              <text x="144" y="116">Responses</text>
              <text x="192" y="116">/</text>
              <text x="240" y="116">Signaling</text>
              <text x="320" y="116">RFC</text>
              <text x="356" y="116">7252</text>
              <text x="384" y="116">/</text>
              <text x="408" y="116">RFC</text>
              <text x="444" y="116">8323</text>
              <text x="80" y="148">Message</text>
              <text x="120" y="148">/</text>
              <text x="160" y="148">Message</text>
              <text x="224" y="148">Framing</text>
              <text x="320" y="148">RFC</text>
              <text x="356" y="148">7252</text>
              <text x="384" y="148">/</text>
              <text x="408" y="148">RFC</text>
              <text x="444" y="148">8323</text>
              <text x="68" y="180">Unreliable</text>
              <text x="120" y="180">/</text>
              <text x="164" y="180">Reliable</text>
              <text x="240" y="180">Transport</text>
              <text x="320" y="180">RFC</text>
              <text x="356" y="180">7252</text>
              <text x="384" y="180">/</text>
              <text x="408" y="180">RFC</text>
              <text x="444" y="180">8323</text>
            </g>
          </svg>
          </artwork>
          <artwork type="ascii-art" align="center"><![CDATA[
  +-----------------------------------+
  |         EAP State Machine         |
  +-----------------------------------+
  |       Application (CoAP-EAP)      | <-- This Document
  +-----------------------------------+
  | Requests / Responses / Signaling  | RFC 7252 / RFC 8323
  +-----------------------------------+
  |     Message / Message Framing     | RFC 7252 / RFC 8323
  +-----------------------------------+
  |  Unreliable / Reliable Transport  | RFC 7252 / RFC 8323
  +-----------------------------------+
]]></artwork>        </artset>
      </figure>
    </section>
    <section anchor="sec_coap-eap-operation">
      <name>CoAP-EAP Operation</name>
      <t>Because CoAP-EAP uses reliable delivery as defined in CoAP <xref target="RFC7252"/> <xref target="RFC8323"/>, EAP retransmission time is set to an infinite value, as mentioned in <xref target="RFC3748"/>. To maintain ordering guarantees, CoAP-EAP uses Hypermedia as the Engine of Application State (HATEOAS). Each step during the EAP authentication accesses a new resource in the CoAP server (EAP peer). The previous resource is removed once the new resource is created, indicating the resource that will process the next step of the EAP authentication.</t>
      <t>One of the benefits of using EAP is that we can choose from a large variety of authentication methods.</t>
      <t>In CoAP-EAP, the EAP peer will only have one authentication session with a specific EAP authenticator, and it will not process any other EAP authentication in parallel (with the same EAP authenticator). That is, a single ongoing EAP authentication is permitted for the same EAP peer and the same EAP authenticator. It may be worth noting that the EAP authenticator may have parallel EAP sessions with multiple EAP peers.</t>

      <t>To access the authentication service, this document defines the well-known URI "coap-eap" (see <xref target="wellknown"/>).  The /.well-known/coap-eap URI is used with "coap", "coap+tcp", or "coap+ws".</t>
      <section anchor="discovery-section">
        <name>Discovery</name>
        <t>Before the CoAP-EAP exchange takes place, the EAP peer needs to discover the EAP authenticator or the entity that will enable the CoAP-EAP exchange (i.e., an intermediary). The discovery process is outside the scope of this document.</t>
        <t>The CoAP-EAP application can be accessed through the URI "coap-eap" for the trigger message (see <xref target="flow-of-operation"/>, Step 0). The CoAP-EAP service can be discovered by asking directly about the services offered. This information can also be available in the resource directory <xref target="RFC9176"/>.</t>
        <t>Implementation notes: There are different methods for discovering the IPv6 address of the EAP authenticator or intermediary entity. For example, in a 6LoWPAN network, the Border Router will typically act as the EAP authenticator. Hence, after receiving the Router Advertisement (RA) messages from the Border Router, the EAP peer may engage in the CoAP-EAP exchange.</t>
      </section>
      <section anchor="flow-of-operation">
        <name>Flow of Operation (OSCORE Establishment)</name>
        <t><xref target="figure3"/> shows the general flow of operation for CoAP-EAP to authenticate using EAP and establish an OSCORE Security Context. The flow does not show a specific EAP method. Instead, the chosen EAP method is represented by using a generic name (EAP-X).  The flow assumes that the EAP peer knows the EAP authenticator implements the CoAP-EAP service. A CoAP-EAP message has the media type "application/coap-eap". See <xref target="mediatypes"/>.</t>
        <t>The steps for this flow of operation are as follows:</t>

        <ul spacing="normal">
          <li><t>Step 0. The EAP peer <bcp14>MUST</bcp14> start the CoAP-EAP
          process by sending a "POST /.well-known/coap-eap" request (trigger
          message). This message carries the 'No-Response' CoAP option <xref
          target="RFC7967"/> to avoid waiting for a response that
          is not needed. This is the only message where the EAP authenticator
          acts as a CoAP server and the EAP peer acts as a CoAP client. The message
          also includes a URI in the payload of the message to indicate the
          resource where the EAP authenticator <bcp14>MUST</bcp14> send the
          next message. The name of the resource is selected by the CoAP
          server.</t></li>
	</ul>
          <t>Implementation notes: When generating the URI for a resource during a
          step of the authentication, the resource could have the following
          format as an example "path/eap/counter", where:</t>
          <ul spacing="normal">
            <li>"path" is some local path on the device to make the path unique.  This could be omitted if desired.</li>
            <li>"eap" is the name that indicates that the URI is for the EAP peer.
            This has no meaning for the protocol but helps with
            debugging.</li>
            <li>"counter" is an incrementing unique number for every new EAP Request.</li>
          </ul>
          <t>So, per <xref target="figure3"/>, the URI for the first resource would be "/a/eap/1".</t>
<ul spacing="normal">
          <li>Step 1. The EAP authenticator sends a POST message to the
          resource indicated in Step 0 (e.g., "/a/eap/1"). The payload in this
          message contains the first EAP message (EAP-Request/Identity, or EAP-Req/Id) and the
          Recipient ID of the EAP authenticator (RID-C) for OSCORE, and
          <bcp14>MAY</bcp14> contain a CBOR array with a list of proposed
          cipher suites (CS-C) for OSCORE. If the cipher suite list is not
          included, the default cipher suite for OSCORE is used. The details
          of the cipher suite negotiation are discussed in <xref
          target="crypto-negotiation"/>.</li>
          <li>Step 2. The EAP peer processes the POST message sending the EAP
          Request (EAP-Req/Id) to the EAP peer state machine, which returns an
          EAP Response (EAP-Response/Identity, or EAP-Resp/Id). Then, the CoAP-EAP application assigns a new resource to the
          ongoing authentication process (e.g., "/a/eap/2") and deletes the
          previous one ("/a/eap/1"). Finally, the CoAP-EAP application sends a '2.01 Created' response
          with the new resource identifier in the Location-Path (and/or
          Location-Query) Options for the next step. The EAP Response, the
          Recipient ID of the EAP peer (RID-I), and the selected cipher suite
          for OSCORE (CS-I) are included in the payload. In this step, the EAP
          peer may create an OSCORE Security Context (see <xref
          target="OSCORE"/>). The required MSK will be
          available once the EAP authentication is successful (Step 7).</li>
          <li>Steps 3-6. From now on, the EAP authenticator and the EAP peer
          will exchange EAP packets related to the EAP method (EAP-X),
          transported in the CoAP message payload. The EAP authenticator will
          use the POST method to send EAP Requests to the EAP peer. The EAP
          peer will use a CoAP response to carry the EAP Response in the
          payload. EAP Requests and responses are represented in <xref
          target="figure3"/> using the nomenclature "EAP-X-Req" and "EAP-X-Resp",
          respectively.  When a POST message arrives (e.g., "/a/eap/1")
          carrying an EAP Request message, if processed correctly by the EAP
          peer state machine, it returns an EAP Response. Along with each EAP
          Response, a new resource is created (e.g., "/a/eap/3") for
          processing the next EAP Request and the ongoing resource (e.g.,
          "/a/eap/2") is erased. This way, ordering guarantees are
          achieved. Finally, an EAP Response is sent in the payload of a CoAP
          response that will also indicate the new resource in the
          Location-Path (and/or Location-Query) Options. If an
          error occurs while processing a legitimate message, the server will return a
          '4.00 Bad Request'. Error handling is discussed in
          <xref target="error-handling"/>.</li>
          <li>Step 7. When the EAP authentication ends successfully, the EAP
          authenticator obtains the MSK exported by the
          EAP method, an EAP Success message, and some authorization
          information <xref target="RFC5247"/> (e.g., Session-Lifetime). The
          EAP authenticator creates the OSCORE Security Context using the MSK
          and Recipient ID of both entities exchanged in Steps 1 and 2. The
          establishment of the OSCORE Security Context is defined in <xref
          target="OSCORE"/>. Then, the EAP authenticator sends the POST
          message protected with OSCORE for key confirmation, including the EAP
          Success. The EAP authenticator <bcp14>MAY</bcp14> also send a
          Session-Lifetime, in seconds, which is represented by an unsigned
          integer in a CBOR Object (see <xref target="cbor-coap-eap"/>). If
          this Session-Lifetime is not sent, the EAP peer assumes a default
          value of 8 hours, as <bcp14>RECOMMENDED</bcp14> in <xref
          target="RFC5247"/>. The reception of the OSCORE-protected POST
          message is considered by the EAP peer as an alternate indication of
          success <xref target="RFC3748"/>. The EAP peer state machine in
          the EAP peer interprets the alternate indication of success
          (similarly to the arrival of an EAP Success) and returns the MSK,
          which is used to create the OSCORE Security Context in the EAP peer
          to process the protected POST message received from the EAP
          authenticator.</li>
          <li>Step 8. If the EAP authentication and the verification of the
          OSCORE-protected POST (Step 7) are successful, then the EAP peer
          answers with an OSCORE-protected '2.04 Changed'.  From this point
          on, communication with the last resource (e.g., "/a/eap/(n)")
          <bcp14>MUST</bcp14> be protected with OSCORE.  If allowed by
          application policy, the same OSCORE Security Context
          <bcp14>MAY</bcp14> be used to protect communication to other
          resources between the same endpoints.</li>
        </ul>
        <figure anchor="figure3">
          <name>CoAP-EAP Flow of Operation with OSCORE</name>
          <artset>
            <artwork type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="592" width="464" viewBox="0 0 464 592" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 16,512 L 16,528" fill="none" stroke="black"/>
              <path d="M 64,56 L 64,304" fill="none" stroke="black"/>
              <path d="M 64,336 L 64,560" fill="none" stroke="black"/>
              <path d="M 400,56 L 400,304" fill="none" stroke="black"/>
              <path d="M 400,336 L 400,560" fill="none" stroke="black"/>
              <path d="M 432,448 L 432,464" fill="none" stroke="black"/>
              <path d="M 24,48 L 120,48" fill="none" stroke="black"/>
              <path d="M 344,48 L 432,48" fill="none" stroke="black"/>
              <path d="M 72,112 L 392,112" fill="none" stroke="black"/>
              <path d="M 72,160 L 392,160" fill="none" stroke="black"/>
              <path d="M 72,208 L 392,208" fill="none" stroke="black"/>
              <path d="M 72,256 L 392,256" fill="none" stroke="black"/>
              <path d="M 72,304 L 392,304" fill="none" stroke="black"/>
              <path d="M 72,368 L 392,368" fill="none" stroke="black"/>
              <path d="M 72,416 L 392,416" fill="none" stroke="black"/>
              <path d="M 72,496 L 392,496" fill="none" stroke="black"/>
              <path d="M 72,560 L 392,560" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="440,464 428,458.4 428,469.6" fill="black" transform="rotate(90,432,464)"/>
              <polygon class="arrowhead" points="400,560 388,554.4 388,565.6" fill="black" transform="rotate(0,392,560)"/>
              <polygon class="arrowhead" points="400,416 388,410.4 388,421.6" fill="black" transform="rotate(0,392,416)"/>
              <polygon class="arrowhead" points="400,304 388,298.4 388,309.6" fill="black" transform="rotate(0,392,304)"/>
              <polygon class="arrowhead" points="400,208 388,202.4 388,213.6" fill="black" transform="rotate(0,392,208)"/>
              <polygon class="arrowhead" points="400,112 388,106.4 388,117.6" fill="black" transform="rotate(0,392,112)"/>
              <polygon class="arrowhead" points="80,496 68,490.4 68,501.6" fill="black" transform="rotate(180,72,496)"/>
              <polygon class="arrowhead" points="80,368 68,362.4 68,373.6" fill="black" transform="rotate(180,72,368)"/>
              <polygon class="arrowhead" points="80,256 68,250.4 68,261.6" fill="black" transform="rotate(180,72,256)"/>
              <polygon class="arrowhead" points="80,160 68,154.4 68,165.6" fill="black" transform="rotate(180,72,160)"/>
              <polygon class="arrowhead" points="24,528 12,522.4 12,533.6" fill="black" transform="rotate(90,16,528)"/>
              <g class="text">
                <text x="48" y="36">EAP</text>
                <text x="84" y="36">peer</text>
                <text x="336" y="36">EAP</text>
                <text x="408" y="36">authenticator</text>
                <text x="100" y="68">POST</text>
                <text x="208" y="68">/.well-known/coap-eap</text>
                <text x="52" y="84">0)</text>
                <text x="128" y="84">No-Response</text>
                <text x="160" y="100">Payload("/a/eap/1")</text>
                <text x="300" y="132">POST</text>
                <text x="356" y="132">/a/eap/1</text>
                <text x="260" y="148">Payload(EAP-Req/Id||CS-C||RID-C)</text>
                <text x="52" y="164">1)</text>
                <text x="92" y="180">2.01</text>
                <text x="144" y="180">Created</text>
                <text x="232" y="180">Location-Path</text>
                <text x="332" y="180">[/a/eap/2]</text>
                <text x="208" y="196">Payload(EAP-Resp/Id||CS-I||RID-I)</text>
                <text x="52" y="212">2)</text>
                <text x="300" y="228">POST</text>
                <text x="356" y="228">/a/eap/2</text>
                <text x="308" y="244">Payload(EAP-X-Req)</text>
                <text x="52" y="260">3)</text>
                <text x="92" y="276">2.01</text>
                <text x="144" y="276">Created</text>
                <text x="232" y="276">Location-Path</text>
                <text x="332" y="276">[/a/eap/3]</text>
                <text x="152" y="292">Payload(EAP-X-Resp)</text>
                <text x="52" y="308">4)</text>
                <text x="236" y="324">....</text>
                <text x="252" y="340">POST</text>
                <text x="324" y="340">/a/eap/(n-1)</text>
                <text x="308" y="356">Payload(EAP-X-Req)</text>
                <text x="52" y="372">5)</text>
                <text x="92" y="388">2.01</text>
                <text x="144" y="388">Created</text>
                <text x="232" y="388">Location-Path</text>
                <text x="340" y="388">[/a/eap/(n)]</text>
                <text x="152" y="404">Payload(EAP-X-Resp)</text>
                <text x="52" y="420">6)</text>
                <text x="432" y="436">MSK</text>
                <text x="284" y="452">POST</text>
                <text x="348" y="452">/a/eap/(n)</text>
                <text x="364" y="468">OSCORE</text>
                <text x="128" y="484">Payload(EAP</text>
                <text x="288" y="484">Success||*Session-Lifetime)</text>
                <text x="436" y="484">OSCORE</text>
                <text x="16" y="500">MSK</text>
                <text x="52" y="500">7)</text>
                <text x="432" y="500">CTX</text>
                <text x="92" y="532">2.04</text>
                <text x="144" y="532">Changed</text>
                <text x="28" y="548">OSCORE</text>
                <text x="100" y="548">OSCORE</text>
                <text x="16" y="564">CTX</text>
                <text x="52" y="564">8)</text>
                <text x="168" y="580">*Session-Lifetime</text>
                <text x="252" y="580">is</text>
                <text x="300" y="580">optional</text>
              </g>
            </svg>
            </artwork>
            <artwork type="ascii-art" align="center"><![CDATA[
    EAP peer                            EAP authenticator
  -------------                           ------------
        |  POST /.well-known/coap-eap             |
      0)|  No-Response                            |
        |  Payload("/a/eap/1")                    |
        |---------------------------------------->|
        |                           POST /a/eap/1 |
        |        Payload(EAP-Req/Id||CS-C||RID-C) |
      1)|<----------------------------------------|
        | 2.01 Created Location-Path [/a/eap/2]   |
        | Payload(EAP-Resp/Id||CS-I||RID-I)       |
      2)|---------------------------------------->|
        |                           POST /a/eap/2 |
        |                     Payload(EAP-X-Req)  |
      3)|<----------------------------------------|
        | 2.01 Created Location-Path [/a/eap/3]   |
        | Payload(EAP-X-Resp)                     |
      4)|---------------------------------------->|
                            ....
        |                     POST /a/eap/(n-1)   |
        |                     Payload(EAP-X-Req)  |
      5)|<----------------------------------------|
        | 2.01 Created Location-Path [/a/eap/(n)] |
        | Payload(EAP-X-Resp)                     |
      6)|---------------------------------------->|
        |                                         |  MSK
        |                         POST /a/eap/(n) |   |
        |                                  OSCORE |   v
        |  Payload(EAP Success||*Session-Lifetime)| OSCORE
 MSK  7)|<----------------------------------------|  CTX
  |     |                                         |
  v     | 2.04 Changed                            |
OSCORE  | OSCORE                                  |
 CTX  8)|---------------------------------------->|
            *Session-Lifetime is optional
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="re-authentication">
        <name>Re-Authentication</name>
        <t>When the CoAP-EAP state is close to expiring, the EAP peer may want to start a new authentication process (re-authentication) to renew the state. The main goal is to obtain new and fresh keying material (MSK/EMSK) that, in turn, allows deriving a new OSCORE Security Context, increasing the protection against key leakage. The keying material <bcp14>MUST</bcp14> be renewed before the expiration of the Session-Lifetime. By default, the EAP key management framework <xref target="RFC5247"/> establishes a default value of 8 hours to refresh the keying material. Certain EAP methods such as
Nimble Out-of-Band Authentication for EAP (EAP-NOOB) <xref target="RFC9140"/> or EAP-AKA' <xref target="RFC5448"/> provide fast reconnect for quicker re-authentication. The EAP Re-authentication Protocol (ERP) <xref target="RFC6696"/> <bcp14>MAY</bcp14> also be used to avoid the repetition of the entire EAP exchange.</t>
        <t>The re-authentication message flow will be the same as that shown in <xref target="figure3"/>. Nevertheless, two different CoAP-EAP states will be active during the re-authentication: the current CoAP-EAP state and the new CoAP-EAP state, which will be created once the re-authentication has finished successfully. Once the re-authentication is completed successfully, the current CoAP-EAP state is deleted and replaced by the new CoAP-EAP state. If for any reason the re-authentication fails, the current CoAP-EAP state will be available until it expires, or it will be renewed during a subsequent re-authentication attempt.</t>
        <t>If the re-authentication fails, it is up to the EAP peer to decide when to start a new re-authentication before the current EAP state expires.</t>
      </section>
      <section anchor="managing_boot_state">
        <name>Managing the State of the Service</name>
        <t>The EAP peer and the EAP authenticator keep state during the CoAP-EAP negotiation. The CoAP-EAP state includes several important parts:</t>
        <ul spacing="normal">
          <li>
            <t>A reference to an instance of the EAP (peer or authenticator/server) state machine.</t>
          </li>
          <li>
            <t>The resource for the next message in the negotiation (e.g., "/a/eap/2").</t>
          </li>
          <li>
            <t>The MSK, which is exported when the EAP authentication is successful. CoAP-EAP can access the different variables via the EAP state machine (see <xref target="RFC4137"/>).</t>
          </li>
          <li>
            <t>A reference to the OSCORE context.</t>
          </li>
        </ul>
        <t>Once created, the EAP authenticator <bcp14>MAY</bcp14> choose to delete the state as described in <xref target="figure4"/>. Conversely, the EAP peer may need to renew the CoAP-EAP state because the key material is close to expiring, as mentioned in <xref target="re-authentication"/>.</t>
        <t>There are situations where the current CoAP-EAP state might need to be removed. For instance, due to its expiration or forced removal, the EAP peer has to be expelled from the security domain. Such an exchange is illustrated in <xref target="figure4"/>.</t>
        <t>If the EAP authenticator deems it necessary to remove the CoAP-EAP state from the EAP peer before it expires, it can send a DELETE command in a request to the EAP peer, referencing the last CoAP-EAP state resource given by the CoAP server, whose identifier will be the last one received (e.g., "/a/eap/(n)" in <xref target="figure3"/>). This message is protected by the OSCORE security association to prevent forgery. Upon reception of this message, the CoAP server sends a response to the EAP authenticator with the code '2.02 Deleted', which is also protected by the OSCORE security association. If a response from the EAP peer does not arrive after EXCHANGE_LIFETIME, the EAP authenticator will remove the state.</t>
        <figure anchor="figure4">
          <name>Deleting State</name>
          <artset>
            <artwork type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="432" viewBox="0 0 432 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 56,56 L 56,176" fill="none" stroke="black"/>
                <path d="M 376,56 L 376,176" fill="none" stroke="black"/>
                <path d="M 8,48 L 104,48" fill="none" stroke="black"/>
                <path d="M 312,48 L 408,48" fill="none" stroke="black"/>
                <path d="M 64,112 L 368,112" fill="none" stroke="black"/>
                <path d="M 64,176 L 368,176" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="376,176 364,170.4 364,181.6" fill="black" transform="rotate(0,368,176)"/>
                <polygon class="arrowhead" points="72,112 60,106.4 60,117.6" fill="black" transform="rotate(180,64,112)"/>
                <g class="text">
                  <text x="32" y="36">EAP</text>
                  <text x="68" y="36">peer</text>
                  <text x="304" y="36">EAP</text>
                  <text x="376" y="36">authenticator</text>
                  <text x="252" y="84">DELETE</text>
                  <text x="324" y="84">/a/eap/(n)</text>
                  <text x="340" y="100">OSCORE</text>
                  <text x="84" y="148">2.02</text>
                  <text x="136" y="148">Deleted</text>
                  <text x="92" y="164">OSCORE</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art" align="center"><![CDATA[
  EAP peer                          EAP authenticator
-------------                         -------------
      |                                       |
      |                     DELETE /a/eap/(n) |
      |                                OSCORE |
      |<--------------------------------------|
      |                                       |
      | 2.02 Deleted                          |
      | OSCORE                                |
      |-------------------------------------->|
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="error-handling">
        <name>Error Handling</name>
        <t>This section elaborates on how different errors are handled: EAP authentication failure (<xref target="eap-authentication-failure"/>), a non-responsive endpoint (<xref target="non-responsive-endpoint"/>), and duplicated messages (<xref target="duplicated-message-with-well-knowncoap-eap"/>).</t>
        <section anchor="eap-authentication-failure">
          <name>EAP Authentication Failure</name>
          <t>The EAP authentication may fail in different situations (e.g., wrong credentials). The result is that the EAP authenticator will send an EAP Failure message because of a failed EAP authentication (Step 7 in <xref target="figure3"/>). In this case, the EAP peer <bcp14>MUST</bcp14> send a response '4.01 Unauthorized' in Step 8. Therefore, Steps 7 and 8 are not protected in this case because no MSK is exported and the OSCORE Security Context is not yet generated.</t>
          <t>If the EAP authentication fails during the re-authentication and the EAP authenticator sends an EAP Failure, the current CoAP-EAP state will still be usable until it expires.</t>
        </section>
        <section anchor="non-responsive-endpoint">
          <name>Non-Responsive Endpoint</name>
          <t>If for any reason one of the entities becomes non-responsive, the CoAP-EAP state <bcp14>SHOULD</bcp14> be removed after a stipulated amount of time. The amount of time can be adjusted according to the policies established by the application or use case where CoAP-EAP is used. As a default value, the CoAP EXCHANGE_LIFETIME parameter, as defined in CoAP <xref target="RFC7252"/>, will be used.</t>
          <t>The removal of the CoAP-EAP state in the EAP authenticator assumes that the EAP peer will need to authenticate again.</t>
          <t>According to CoAP, EXCHANGE_LIFETIME considers the time it takes until a client stops expecting a response to a request. A timer is reset every time a message is sent.
By default, CoAP-EAP adopts the value of EXCHANGE_LIFETIME as a timer in the EAP peer and authenticator to remove the CoAP-EAP state if the authentication process has not progressed to completion during that time.</t>
          <t>The EAP peer will remove the CoAP-EAP state if either the EXCHANGE_LIFETIME is triggered or the EAP peer state machine returns an eapFail.</t>
          <t>The EAP authenticator will remove the CoAP-EAP state if either the EXCHANGE_LIFETIME is triggered or, when the EAP authenticator is operating in pass-through mode (i.e., the EAP authentication is performed against a AAA server), the EAP authenticator state machine returns "aaaTimeout" <xref target="RFC4137"/>.</t>
        </section>
        <section anchor="duplicated-message-with-well-knowncoap-eap">
          <name>Duplicated Message with /.well-known/coap-eap</name>
          <t>The reception of the trigger message (Step 0 in <xref target="figure3"/>) containing the URI /coap-eap needs some additional considerations, as the resource is always available in the EAP authenticator.</t>
          <t>If a trigger message arrives at the EAP authenticator during an ongoing authentication with the same EAP peer, the EAP authenticator <bcp14>MUST</bcp14> silently discard this trigger message.</t>
          <t>If an old "POST /.well-known/coap-eap" (Step 0 in <xref target="figure5"/>) arrives at the EAP authenticator and there is no authentication ongoing, the EAP authenticator may understand that a new authentication process is requested. Consequently, the EAP authenticator will start a new EAP authentication. However, if the EAP peer did not start any authentication, it will send a '4.04 Not Found' in the response (<xref target="figure5"/>).</t>
          <figure anchor="figure5">
            <name>/.well-known/coap-eap with No Ongoing Authentication from the EAP Authenticator</name>
            <artset>
              <artwork type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="432" viewBox="0 0 432 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 32,56 L 32,208" fill="none" stroke="black"/>
                <path d="M 368,56 L 368,208" fill="none" stroke="black"/>
                <path d="M 8,48 L 80,48" fill="none" stroke="black"/>
                <path d="M 328,48 L 400,48" fill="none" stroke="black"/>
                <path d="M 160,112 L 360,112" fill="none" stroke="black"/>
                <path d="M 40,160 L 360,160" fill="none" stroke="black"/>
                <path d="M 40,208 L 360,208" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="368,208 356,202.4 356,213.6" fill="black" transform="rotate(0,360,208)"/>
                <polygon class="arrowhead" points="368,112 356,106.4 356,117.6" fill="black" transform="rotate(0,360,112)"/>
                <polygon class="arrowhead" points="48,160 36,154.4 36,165.6" fill="black" transform="rotate(180,40,160)"/>
                <g class="text">
                  <text x="16" y="36">EAP</text>
                  <text x="52" y="36">peer</text>
                  <text x="304" y="36">EAP</text>
                  <text x="376" y="36">authenticator</text>
                  <text x="72" y="68">*POST</text>
                  <text x="184" y="68">/.well-known/coap-eap</text>
                  <text x="20" y="84">0)</text>
                  <text x="96" y="84">No-Response</text>
                  <text x="128" y="100">Payload("/a/eap/1")</text>
                  <text x="260" y="132">POST</text>
                  <text x="316" y="132">/a/eap/1</text>
                  <text x="248" y="148">Payload(EAP-Req/Id||CS-C)</text>
                  <text x="20" y="164">1)</text>
                  <text x="60" y="196">4.04</text>
                  <text x="96" y="196">Not</text>
                  <text x="136" y="196">found</text>
                  <text x="196" y="228">*Old</text>
                </g>
              </svg>
              </artwork>
              <artwork type="ascii-art" align="center"><![CDATA[
  EAP peer                            EAP authenticator
  ----------                              ----------
    |  *POST /.well-known/coap-eap            |
  0)|  No-Response                            |
    |  Payload("/a/eap/1")                    |
    |               ------------------------->|
    |                          POST /a/eap/1  |
    |              Payload(EAP-Req/Id||CS-C)  |
  1)|<----------------------------------------|
    |                                         |
    | 4.04 Not Found                          |
    |---------------------------------------->|
                        *Old
]]></artwork>
            </artset>
          </figure>
        </section>
      </section>
      <section anchor="proxy">
        <name>Proxy Operation in CoAP-EAP</name>
        <t>The CoAP-EAP operation is intended to be compatible with the use of intermediary entities between the EAP peer and the EAP authenticator when direct communication is not possible. In this context, CoAP proxies can be used as enablers of the CoAP-EAP exchange.</t>
        <t>This specification is limited to using standard CoAP <xref target="RFC7252"/> as well as standardized CoAP options <xref target="RFC8613"/>. It does not specify any addition in the form of CoAP options. This is expected to ease the integration of CoAP intermediaries in the CoAP-EAP exchange.</t>
        <t>When using proxies in the CoAP-EAP exchange, it should be considered that the exchange contains a role-reversal process at the beginning of the exchange. In the first message, the EAP peer acts as a CoAP client and the EAP authenticator acts as the CoAP server. In the remaining exchanges, the roles are reversed (i.e., the EAP
peer acts as the CoAP server, and the EAP authenticator acts as the CoAP client).
When using a proxy in the exchange, for message 0 it will act as a forward proxy, and as a reverse proxy for the rest. Additionally, in the first exchange, the EAP peer, as a CoAP client, sends the URI for the next CoAP message in the payload of a request. This is not the typical behavior, as URIs referring to new services/resources appear in Location-Path and/or Location-Query Options in CoAP responses. Hence, the proxy will have to treat the payload of Message 0 as if it were a Location-Path Option of a CoAP response.</t>
      </section>
    </section>
    <section anchor="coap-eap-media-type">
      <name>CoAP-EAP Media Type Format</name>
      <t>In the CoAP-EAP exchange, the format specified by the "application/coap-eap" media type will be used. See <xref target="mediatypes"/>.</t>
      <t>In CoAP-EAP, there are two different elements that can be sent over the payload. The first one is a relative URI. This payload will be present for the first message (0) in <xref target="figure3"/>.</t>
      <t>In all the other cases, an EAP message will be followed by the CBOR Object specified in <xref target="cbor-coap-eap"/>. A visual example of the second case can be found in <xref target="figure7"/> (<xref target="crypto-negotiation"/>).</t>
    </section>
    <section anchor="cbor-coap-eap">
      <name>CBOR Objects in CoAP-EAP</name>
      <t>In the CoAP-EAP exchange, information needs to be exchanged between the two entities -- for example, the cipher suites that need to be negotiated, or authorization information (Session-Lifetime). There may also be a need to extend the information that has to be exchanged in the future. This section specifies the CBOR data structure <xref target="RFC8949"/> to exchange information between the EAP peer and the EAP authenticator in the CoAP payload.</t>
      <t><xref target="figure6"/> shows the specification of the CBOR Object to exchange information in CoAP-EAP.</t>
      <figure anchor="figure6">
        <name>CBOR Data Structure for CoAP-EAP</name>
        <artwork align="center"><![CDATA[
   CoAP-EAP_Info = {
      ?  1 : [+ int],     ; Cipher Suite (CS-C or CS-I)
      ?  2 : bstr,        ; RID-C
      ?  3 : bstr,        ; RID-I
      ?  4 : uint         ; Session-Lifetime
  }
]]></artwork>
      </figure>
      <t>The parameters contain the following information:</t>
      <ol spacing="normal">
        <li>Cipher Suite: An array with the list of proposed, or selected,
        CBOR Object Signing and Encryption (COSE) algorithms for OSCORE. If the
field is carried over a request,
        a proposed cipher suite is indicated; if it is carried over a
        response, it corresponds to the agreed-upon cipher suite.</li>
        <li>RID-C: The Recipient ID of the EAP authenticator. The EAP peer
        uses this value as the Sender ID for its OSCORE Sender Context. The EAP
        authenticator uses this value as the Recipient ID for its Recipient
        Context.</li>
        <li>RID-I: The Recipient ID of the EAP peer. The EAP authenticator
        uses this value as the Sender ID for its OSCORE Sender Context. The EAP
        peer uses this value as the Recipient ID for its Recipient Context.</li>
        <li>Session-Lifetime: The time that the session is valid, in seconds.</li>
      </ol>
      <t>Other indexes can be used to carry additional values as needed, like specific authorization parameters.</t>
      <t>The indexes from 65001 to 65535 are reserved for experimentation.</t>
    </section>
    <section anchor="key_deriv">
      <name>Cipher Suite Negotiation and Key Derivation</name>
      <section anchor="crypto-negotiation">
        <name>Cipher Suite Negotiation</name>
        <t>OSCORE runs after the EAP authentication, using the cipher suite selected in the cipher suite negotiation (Steps 1 and 2 in <xref target="figure3"/>). To negotiate the cipher suite, CoAP-EAP follows a simple approach: The EAP authenticator sends a list, in decreasing order of preference, with the identifiers of the supported cipher suites (Step 1 in <xref target="figure8"/>). In the response to that message (Step 2 in <xref target="figure8"/>), the EAP peer sends its choice.</t>
        <t>This list is included in the payload after the EAP message through a CBOR array. An example of how the fields are arranged in the CoAP payload can be seen in <xref target="figure7"/>. An example exchange for the cipher suite negotiation is shown in <xref target="figure8"/>. The EAP Request (EAP-Req/Id) and EAP Response (EAP-Resp/Id) are sent; both messages include the CBOR Object (<xref target="cbor-coap-eap"/>) containing the cipher suite field for the cipher suite negotiation.</t>
        <figure anchor="figure7">
          <name>Cipher Suites in the CoAP Payload</name>
          <artset>
            <artwork type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="128" width="448" viewBox="0 0 448 128" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
              <path d="M 64,32 L 64,64" fill="none" stroke="black"/>
              <path d="M 168,32 L 168,64" fill="none" stroke="black"/>
              <path d="M 240,32 L 240,64" fill="none" stroke="black"/>
              <path d="M 296,32 L 296,64" fill="none" stroke="black"/>
              <path d="M 440,32 L 440,64" fill="none" stroke="black"/>
              <path d="M 8,32 L 440,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 440,64" fill="none" stroke="black"/>
              <path d="M 8,96 L 88,96" fill="none" stroke="black"/>
              <path d="M 208,96 L 288,96" fill="none" stroke="black"/>
              <path d="M 304,96 L 320,96" fill="none" stroke="black"/>
              <path d="M 424,96 L 440,96" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="448,96 436,90.4 436,101.6" fill="black" transform="rotate(0,440,96)"/>
              <polygon class="arrowhead" points="312,96 300,90.4 300,101.6" fill="black" transform="rotate(180,304,96)"/>
              <polygon class="arrowhead" points="296,96 284,90.4 284,101.6" fill="black" transform="rotate(0,288,96)"/>
              <polygon class="arrowhead" points="16,96 4,90.4 4,101.6" fill="black" transform="rotate(180,8,96)"/>
              <g class="text">
                <text x="36" y="52">Code</text>
                <text x="116" y="52">Identifier</text>
                <text x="204" y="52">Length</text>
                <text x="268" y="52">Data</text>
                <text x="340" y="52">cipher</text>
                <text x="404" y="52">suites</text>
                <text x="120" y="100">EAP</text>
                <text x="164" y="100">Packet</text>
                <text x="348" y="100">CBOR</text>
                <text x="392" y="100">array</text>
              </g>
            </svg>
            </artwork>
            <artwork type="ascii-art" align="center"><![CDATA[
+------+------------+--------+------+-----------------+
| Code | Identifier | Length | Data |  cipher  suites |
+------+------------+--------+------+-----------------+

<----------  EAP Packet  ----------> <-- CBOR array -->
]]></artwork>
          </artset>
        </figure>
        <figure anchor="figure8">
          <name>Cipher Suite Negotiation</name>
          <artset>
            <artwork type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="424" viewBox="0 0 424 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 32,72 L 32,208" fill="none" stroke="black"/>
              <path d="M 368,72 L 368,208" fill="none" stroke="black"/>
              <path d="M 8,64 L 104,64" fill="none" stroke="black"/>
              <path d="M 320,64 L 416,64" fill="none" stroke="black"/>
              <path d="M 40,112 L 360,112" fill="none" stroke="black"/>
              <path d="M 40,160 L 360,160" fill="none" stroke="black"/>
              <path d="M 40,208 L 360,208" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="368,208 356,202.4 356,213.6" fill="black" transform="rotate(0,360,208)"/>
              <polygon class="arrowhead" points="368,112 356,106.4 356,117.6" fill="black" transform="rotate(0,360,112)"/>
              <polygon class="arrowhead" points="48,160 36,154.4 36,165.6" fill="black" transform="rotate(180,40,160)"/>
              <g class="text">
                <text x="24" y="36">EAP</text>
                <text x="60" y="36">peer</text>
                <text x="328" y="36">EAP</text>
                <text x="368" y="36">Auth.</text>
                <text x="24" y="52">(CoAP</text>
                <text x="80" y="52">server)</text>
                <text x="336" y="52">(CoAP</text>
                <text x="392" y="52">client)</text>
                <text x="168" y="100">...</text>
                <text x="260" y="132">POST</text>
                <text x="316" y="132">/a/eap/1</text>
                <text x="128" y="148">Payload(EAP-Req/Id,</text>
                <text x="280" y="148">CBORArray[0,1,2])</text>
                <text x="20" y="164">1)</text>
                <text x="60" y="180">2.01</text>
                <text x="112" y="180">Created</text>
                <text x="200" y="180">Location-Path</text>
                <text x="300" y="180">[/a/eap/2]</text>
                <text x="124" y="196">Payload(EAP-Resp/Id,</text>
                <text x="264" y="196">CBORArray[0])</text>
                <text x="20" y="212">2)</text>
                <text x="200" y="228">...</text>
              </g>
            </svg>
            </artwork>
            <artwork type="ascii-art" align="center"><![CDATA[
  EAP peer                              EAP Auth.
  (CoAP server)                          (CoAP client)
  -------------                          -------------
    |                                         |
    |               ...                       |
    |---------------------------------------->|
    |                          POST /a/eap/1  |
    |  Payload(EAP-Req/Id, CBORArray[0,1,2])  |
  1)|<----------------------------------------|
    | 2.01 Created Location-Path [/a/eap/2]   |
    | Payload(EAP-Resp/Id, CBORArray[0])      |
  2)|---------------------------------------->|
                        ...
]]></artwork>
          </artset>
        </figure>
        <t>If there is no CBOR array specifying the cipher suites, the default cipher suites are applied. If the EAP authenticator sends a restricted list of cipher suites that can be accepted, it <bcp14>MUST</bcp14> include the default value 0, since it is mandatory to implement. The EAP peer will have at least that option available.</t>
        <t>The cipher suite requirements are inherited from those established by OSCORE <xref target="RFC8613"/>, which are COSE algorithms <xref target="RFC9053"/>. By default, the HMAC-based Extract-and-Expand Key Derivation Function (HKDF) algorithm is SHA-256 and the Authenticated Encryption with Associated Data (AEAD) algorithm is AES-CCM-16-64-128 <xref target="RFC9053"/>. ("HMAC" stands for "Hashed Message Authentication Code".) Both are mandatory to implement. The other supported and negotiated cipher suites are listed below; these hash algorithms are considered in cases where the specification includes DTLS support in the future (TLS_SHA256, TLS_SHA384, TLS_SHA512; see <xref target="flow-of-operation-dtls"/>):</t>

        <ul spacing="normal">
          <li>
            <t>0) AES-CCM-16-64-128, SHA-256 (default)</t>
          </li>
          <li>
            <t>1) A128GCM, SHA-256</t>
          </li>
          <li>
            <t>2) A256GCM, SHA-384</t>
          </li>
          <li>
            <t>3) ChaCha20/Poly1305, SHA-256</t>
          </li>
          <li>
            <t>4) ChaCha20/Poly1305, SHAKE256</t>
          </li>
        </ul>
        <t>This specification uses the HKDF as defined in <xref target="RFC5869"/> to derive the necessary key material. Since the key derivation process uses the MSK, which is considered fresh key material, the HKDF-Expand function (shortened here as "KDF") will be used. See <xref target="limit_eap_medhods"/> regarding why the use of this function is enough and it is not necessary to use KDF-Extract.</t>
      </section>
      <section anchor="OSCORE">
        <name>Deriving the OSCORE Security Context</name>
        <t>The derivation of the OSCORE Security Context allows securing the communication between the EAP peer and the EAP authenticator once the MSK has been exported, providing confidentiality, integrity, key confirmation (Steps 7 and 8 in <xref target="figure3"/>), and detection of downgrading attacks.</t>
        <t>Once the Master Secret and Master Salt are derived, they can be used to derive the rest of the OSCORE Security Context (see <xref target="RFC8613" sectionFormat="of" section="3.2.1"/>). It should be noted that the ID Context is not provided for the OSCORE Security Context derivation.</t>
        <t>The Master Secret can be derived by using the chosen cipher suite and the KDF as follows:</t>
        <artwork align="center"><![CDATA[
Master Secret = KDF(MSK, CS | "COAP-EAP OSCORE MASTER SECRET", length)
]]></artwork>

        <t>where:</t>
        <ul spacing="normal">
          <li>
            <t>The MSK is exported by the EAP method. The use of the MSK for key derivation is discussed in <xref target="security_considerations"/>.</t>
          </li>
          <li>
            <t>CS is the concatenation of the content of the cipher suite negotiation -- that is, the concatenation of two CBOR arrays CS-C and CS-I (with CBOR ints as elements), as defined in <xref target="cbor-coap-eap"/>. If neither CS-C nor CS-I was sent (i.e., default algorithms are used), the value used to generate CS will be the same as if the default algorithms were explicitly sent in CS-C or CS-I (i.e., a CBOR array with the cipher suite value of 0).</t>
          </li>
          <li>
            <t>"COAP-EAP OSCORE MASTER SECRET" is the ASCII code representation of the non-NULL-terminated string (excluding the double quotes around it).</t>
          </li>
          <li>
            <t>CS and "COAP-EAP OSCORE MASTER SECRET" are concatenated.</t>
          </li>
          <li>
            <t>length is the size of the output key material.</t>
          </li>
        </ul>

        <t>Similarly to the Master Secret, the Master Salt can be derived as follows:</t>
        <artwork align="center"><![CDATA[
Master Salt = KDF(MSK, CS | "COAP-EAP OSCORE MASTER SALT", length)
]]></artwork>

        <t>where:</t>
        <ul spacing="normal">
          <li>
            <t>The MSK is exported by the EAP method. The use of the MSK for key derivation is discussed in <xref target="security_considerations"/>.</t>
          </li>
          <li>
            <t>CS is the concatenation of the content of the cipher suite negotiation -- that is, the concatenation of two CBOR arrays CS-C and CS-I (with CBOR ints as elements), as defined in <xref target="cbor-coap-eap"/>. If neither CS-C nor CS-I was sent (i.e., default algorithms are used), the value used to generate CS will be the same as if the default algorithms were explicitly sent in CS-C or CS-I (i.e., a CBOR array with the cipher suite value of 0).</t>
          </li>
          <li>
            <t>"COAP-EAP OSCORE MASTER SALT" is the ASCII code representation of the non-NULL-terminated string (excluding the double quotes around it).</t>
          </li>
          <li>
            <t>CS and "COAP-EAP OSCORE MASTER SALT" are concatenated.</t>
          </li>
          <li>
            <t>length is the size of the output key material.</t>
          </li>
        </ul>

        <t>Since the MSK is used to derive the Master Key, the correct verification of the OSCORE-protected request (Step 7) and response (Step 8) confirms that the EAP authenticator and the EAP peer have the same Master Secret, achieving key confirmation.</t>
        <t>To prevent a downgrading attack, the content of the cipher suite
(referred to here as "CS") negotiation is embedded in the Master Secret derivation. If an attacker changes the value of the cipher suite negotiation, the result will be different OSCORE Security Contexts, which in turn will result in failure in Steps 7 and 8.</t>
        <t>The EAP authenticator will use the Recipient ID of the EAP peer (RID-I) as the Sender ID for its OSCORE Sender Context. The EAP peer will use this value as the Recipient ID for its Recipient Context.</t>
        <t>The EAP peer will use the Recipient ID of the EAP authenticator (RID-C) as the Sender ID for its OSCORE Sender Context. The EAP authenticator will use this value as the Recipient ID for its Recipient Context.</t>
      </section>
    </section>
    <section anchor="implementation_considerations">
      <name>Discussion</name>
      <section anchor="coap-as-eap-lower-layer">
        <name>CoAP as the EAP Lower Layer</name>
        <t>This section discusses the suitability of CoAP as the EAP lower layer and reviews the requisites imposed by EAP on any protocol transporting EAP. What EAP expects from its lower layers can be found in <xref target="RFC3748" sectionFormat="of" section="3.1"/>, which is elaborated next:</t>
  <dl spacing="normal" newline="false">
        <dt>Unreliable transport:</dt><dd>EAP does not assume that lower layers are reliable, but it can benefit from a reliable lower layer. In this sense, CoAP provides a reliability mechanism (e.g., using Confirmable messages).</dd>
        <dt>Lower-layer error detection:</dt><dd>EAP relies on lower-layer error detection (e.g., CRC, checksum, Message Integrity Check (MIC), etc.). For simplicity, CoAP-EAP delegates error detection to the lower layers, such as the link layer or transport layer (e.g., UDP over IPv6 or TCP).</dd>
        <dt>Lower-layer security:</dt><dd>EAP does not require security services from the lower layers.</dd>
        <dt>Minimum MTU:</dt><dd>Lower layers need to provide an EAP MTU size of 1020 octets or greater. CoAP assumes an upper bound of 1024 octets for its payload, which covers the EAP requirements when only the EAP message is sent in the CoAP payload. In the case of Messages 1 and 2 in <xref target="figure3"/>, those messages have extra information apart from EAP. Nevertheless, the EAP-Req/Id has a fixed length of 5 bytes. Message 2, with the EAP-Resp/Id, would limit the length of the identity being used to the CoAP payload maximum size (1024) - len( CS-I || RID-I ) - EAP Response header (5 bytes), which leaves enough space for sending even lengthy identities. Nevertheless, this limitation can be overcome by using CoAP block-wise transfers <xref target="RFC7959"/>.
Note: When EAP is proxied over a AAA framework, the Access-Request packets in RADIUS <bcp14>MUST</bcp14> contain a Framed-MTU attribute with a value of 1024 and, in
Diameter, the Framed-MTU Attribute-Value Pair (AVP) with a value of 1024. This information signals the AAA server that it should limit its responses to 1024 octets.</dd>
        <dt>Ordering guarantees:</dt><dd>EAP relies on lower-layer ordering guarantees for correct operation. Regarding message ordering, every time a new message arrives at the authentication service hosted by the EAP peer, a new resource is created, and this is indicated in a '2.01 Created' response code along with the name of the new resource via Location-Path or Location-Query Options. This way, the application shows that its state has advanced.</dd>
  </dl>
        <t>Although <xref target="RFC3748"/> states that "EAP provides its own support for duplicate elimination and retransmission," EAP is also reliant on
lower-layer ordering guarantees. In this regard, <xref target="RFC3748"/> talks about possible duplication and says, "Where the lower layer is reliable, it will provide the EAP layer with a non-duplicated stream of packets. However, while it is desirable that lower layers provide for non-duplication, this is not a requirement." CoAP provides a non-duplicated stream of packets and accomplishes the desirable non-duplication. In addition, <xref target="RFC3748"/> says that when EAP runs over a reliable lower layer "the authenticator retransmission timer <bcp14>SHOULD</bcp14> be set to an infinite value, so that retransmissions do not occur at the EAP layer."</t>
      </section>
      <section anchor="size-of-the-eap-lower-layer-vs-eap-method-size">
        <name>Size of the EAP Lower Layer vs. EAP Method Size</name>
        <t>Regarding the impact that an EAP lower layer will have on the number of bytes of the whole authentication exchange, <xref target="CoAP-EAP"/> provides a comparison with another network-layer-based EAP lower layer, the Protocol for Carrying Authentication for Network Access (PANA) as defined in <xref target="RFC5191"/>.</t>
        <t>The EAP method being transported will take most of the exchange. However, the impact of the EAP lower layer cannot be ignored, especially in very constrained communication technologies such as those with limited capabilities (e.g., as can be found in IoT networks).</t>
        <t>Note: To improve efficiency in environments with constrained devices and networks, the latest versions of EAP methods (e.g., EAP-AKA' <xref target="RFC5448"/>, EAP-TLS 1.3 <xref target="RFC9190"/>) are recommended over older versions. EAP methods more adapted for IoT networks (e.g., EAP-NOOB <xref target="RFC9140"/>, EAP-EDHOC <xref target="I-D.ietf-emu-eap-edhoc"/>, etc.) are also recommended.</t>
      </section>
    </section>
    <section anchor="security_considerations">
      <name>Security Considerations</name>
      <t>Security aspects to be considered include how authorization is managed, the use of the MSK as key material, and how trust in the EAP authenticator is established. Additional considerations such as EAP channel binding as per <xref target="RFC6677"/> are also discussed here.</t>
      <section anchor="limit_eap_medhods">
        <name>Use of EAP Methods</name>
        <t>This document limits the use of EAP methods to those compliant with <xref target="RFC4017"/>, yielding strong and fresh session keys such as the MSK. By this assumption, the HKDF-Expand function is used directly, as clarified in <xref target="RFC5869"/>.</t>
      </section>
      <section anchor="authorization">
        <name>Authorization</name>
        <t>Authorization is part of bootstrapping. It serves to establish whether the EAP peer can join and the set of conditions it must adhere to. The authorization data will be gathered from the organization that is responsible for the EAP peer and sent to the EAP authenticator if a AAA infrastructure is deployed.</t>
        <t>In standalone mode, the authorization information will be in the EAP authenticator. If pass-through mode is used, authorization data received from the AAA server can be delivered by the AAA protocol (e.g., RADIUS or Diameter).  Providing more fine-grained authorization data can be done by transporting the data using the Security Assertion Markup Language (SAML) in RADIUS <xref target="RFC7833"/>.
After bootstrapping, additional authorization information may be needed to operate in the security domain. This can be taken care of by the solutions proposed in the Authentication and Authorization for Constrained Environments (ACE) WG, such as the use of OAuth <xref target="RFC9200"/>, among other solutions, to provide ACE.</t>
      </section>
      <section anchor="allowing-coap-eap-traffic-to-perform-authentication">
        <name>Allowing CoAP-EAP Traffic to Perform Authentication</name>
        <t>Since CoAP is an application protocol, CoAP-EAP assumes certain IP connectivity in the link between the EAP peer and the EAP authenticator to run. This link <bcp14>MUST</bcp14> only authorize unprotected IP traffic to be sent between the EAP peer and the EAP authenticator during the authentication with CoAP-EAP. Once the authentication is successful, the key material generated by the EAP authentication (MSK) and any other traffic can be authorized if it is protected. It is worth noting that if the EAP authenticator is not in the same link as the EAP peer and an intermediate entity (e.g., a CoAP proxy) helps with this process, this
concept also applies to the communication between the EAP peer and the intermediary.</t>
        <t>Alternatively, the link layer <bcp14>MAY</bcp14> provide support to transport CoAP-EAP without an IP address by using link-layer frames (e.g., by defining a new Key Management Protocol ID per IEEE 802.15.9 <xref target="IEEE802159"/>).</t>
      </section>
      <section anchor="freshness-of-the-key-material">
        <name>Freshness of the Key Material</name>
        <t>In CoAP-EAP, there is no nonce exchange to provide freshness to the keys derived from the MSK. The MSKs and EMSKs are fresh key material per <xref target="RFC5247"/>. Since only one authentication is established per EAP authenticator, there is no need to generate additional key material. If a new MSK is required, a re-authentication can be done by running the process again or using a more lightweight EAP method to derive additional key material as elaborated in <xref target="re-authentication"/>.</t>
      </section>
      <section anchor="channel-binding-support">
        <name>Channel-Binding Support</name>
        <t>According to <xref target="RFC6677"/>, channel binding, as related to EAP, is sent through the EAP method supporting it.</t>


        <t>To satisfy the requirements of this document, the EAP lower-layer identifier for CoAP-EAP (10, as assigned by IANA; see <xref target="lowerlayer"/>) needs to be sent, in the EAP Lower-Layer Attribute if RADIUS is used.</t>
      </section>
      <section anchor="additional-security-considerations">
        <name>Additional Security Considerations</name>
        <t>In the authentication process, it is possible for an entity to forge messages to generate denial-of-service (DoS) attacks on any of the entities involved. For instance, an attacker can forge multiple initial messages to start an authentication (Step 0 in <xref target="figure3"/>) with the EAP authenticator as if they were sent by different EAP peers. Consequently, the EAP authenticator will start an authentication process for each message received in Step 0, sending the
EAP-Req/Id (Step 1).


</t>
        <t>To minimize the effects of this DoS attack, it is <bcp14>RECOMMENDED</bcp14> that the EAP authenticator limit the rate at which it processes incoming messages in Step 0 to provide robustness against DoS attacks. The details of rate limiting are outside the scope of this specification. Nevertheless, the rate of these messages is also limited by the bandwidth available between the EAP peer and the EAP authenticator. This bandwidth will be especially limited in constrained links (e.g., Low-Power WANs (LPWANs)). Lastly, it is also <bcp14>RECOMMENDED</bcp14> to reduce at a minimum the state in the EAP authenticator at least until the EAP-Resp/Id is received by the EAP authenticator.</t>
        <t>Another security-related concern is how to ensure that the EAP peer joining the security domain can trust the EAP authenticator. This issue is elaborated in <xref target="RFC5247"/>. In particular, the EAP peer knows it can trust the EAP authenticator because the key that is used to establish the security association is derived from the MSK. If the EAP authenticator has the MSK, it is because the AAA server of the EAP peer trusted the EAP authenticator.</t>
      </section>
    </section>
    <section anchor="IANA">
      <name>IANA Considerations</name>
      <section anchor="ciphersuite">
        <name>CoAP-EAP Cipher Suites</name>
        <t>IANA has created a new registry titled "CoAP-EAP Cipher Suites" under a new registry group named "CoAP-EAP".  The registration procedures are "Specification
Required", "Private Use", and "Standards Action with Expert Review" (see <xref target="RFC8126"/>), as shown in <xref target="ciphersute-registration-ranges"/>.</t>
        <table anchor="ciphersute-registration-ranges">
          <name>Registration Procedures for CoAP-EAP Cipher Suites</name>
          <thead>
            <tr>
              <th>Range</th>
              <th>Registration Procedures</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>-65536 to -25</td>
              <td>Specification Required</td>
            </tr>
            <tr>
              <td>-24 to -21</td>
              <td>Private Use</td>
            </tr>
            <tr>
              <td>-20 to 23</td>
              <td>Standards Action with Expert Review</td>
            </tr>
            <tr>
              <td>24 to 65535</td>
              <td>Specification Required</td>
            </tr>
          </tbody>
        </table>
        <t>The columns of the registry are Value, Algorithms, Description, and Reference, where Value is an integer and the other columns are text strings.  The initial registrations are shown in <xref target="ciphersute-initial-value"/>.</t>
        <table anchor="ciphersute-initial-value">
          <name>CoAP-EAP Cipher Suites: Initial Registrations</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Algorithms</th>
              <th align="left">Description</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">10, -16</td>
              <td align="left">AES-CCM-16-64-128, SHA-256</td>
              <td align="left">RFC 9820</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">1, -16</td>
              <td align="left">A128GCM, SHA-256</td>
              <td align="left">RFC 9820</td>
            </tr>
            <tr>
              <td align="left">2</td>
              <td align="left">3, -43</td>
              <td align="left">A256GCM, SHA-384</td>
              <td align="left">RFC 9820</td>
            </tr>
            <tr>
              <td align="left">3</td>
              <td align="left">24, -16</td>
              <td align="left">ChaCha20/Poly1305, SHA-256</td>
              <td align="left">RFC 9820</td>
            </tr>
            <tr>
              <td align="left">4</td>
              <td align="left">24, -45</td>
              <td align="left">ChaCha20/Poly1305, SHAKE256</td>
              <td align="left">RFC 9820</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="llid">
        <name>CDDL in CoAP-EAP Information Elements</name>
        <t>IANA has created a new registry titled "CoAP-EAP Information Elements" under a new registry group named "CoAP-EAP".  The registration procedures are "Standards Action with Expert Review", "Private Use", "Specification Required", and "Experimental Use" (see <xref target="RFC8126"/>),
as shown in <xref target="coap-eap-ie-registration-ranges"/>.
</t>
        <table anchor="coap-eap-ie-registration-ranges">
          <name>Registration Procedures for CoAP-EAP Information Elements</name>
          <thead>
            <tr>
              <th>Range</th>
              <th>Registration Procedures</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>0 to 23</td>
              <td>Standards Action with Expert Review</td>
            </tr>
            <tr>
              <td>24 to 49</td>
              <td>Private Use</td>
            </tr>
            <tr>
              <td>50 to 65000</td>
              <td>Specification Required</td>
            </tr>
            <tr>
              <td>65001 to 65535</td>
              <td>Experimental Use</td>
            </tr>
          </tbody>
        </table>
        <t>The columns of the registry are Name, Label, CBOR Type, Description, and Reference, where Label is an integer and the other columns are text strings.  The initial registrations are shown in <xref target="coap-eap-ie-values"/>.</t>
        <table anchor="coap-eap-ie-values">
          <name>CoAP-EAP Information Elements: Initial Registrations</name>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Label</th>
              <th align="left">CBOR Type</th>
              <th align="left">Description</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Cipher Suite</td>
              <td align="left">1</td>
              <td align="left">CBOR Array</td>
              <td align="left">List of the proposed or selected COSE algorithms for OSCORE</td>
              <td align="left">RFC 9820</td>
            </tr>
            <tr>
              <td align="left">RID-C</td>
              <td align="left">2</td>
              <td align="left">Byte String</td>
              <td align="left">Contains the Recipient ID of the EAP authenticator</td>
              <td align="left">RFC 9820</td>
            </tr>
            <tr>
              <td align="left">RID-I</td>
              <td align="left">3</td>
              <td align="left">Byte String</td>
              <td align="left">Contains the Recipient ID of the EAP peer</td>
              <td align="left">RFC 9820</td>
            </tr>
            <tr>
              <td align="left">Session-Lifetime</td>
              <td align="left">4</td>
              <td align="left">uint</td>
              <td align="left">Contains the time that the session is valid, in seconds</td>
              <td align="left">RFC 9820</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="wellknown">
        <name>The Well-Known URIs Registry</name>
        <t>IANA has added the well-known URI "coap-eap" to the "Well-Known URIs" registry under the "Well-Known URIs" registry group defined by <xref target="RFC8615"/>.</t>
	<dl spacing="compact" newline="false">
          <dt>URI Suffix:</dt><dd>coap-eap</dd>
          <dt>Reference:</dt><dd>RFC 9820</dd>
	  <dt>Status:</dt><dd>permanent</dd>
          <dt>Change Controller:</dt><dd>IETF</dd>
	</dl>
      </section>
      <section anchor="lowerlayer">
        <name>The EAP Lower Layers Registry</name>
        <t>IANA has added the identifier "CoAP-EAP" to the "EAP Lower Layers" registry (defined by <xref target="RFC6677"/>) under the "Extensible Authentication Protocol (EAP) Registry".</t>
	<dl spacing="compact" newline="false">
          <dt>Value:</dt><dd>10</dd>
          <dt>Lower Layer:</dt><dd>CoAP-EAP</dd>
          <dt>Reference:</dt><dd>RFC 9820</dd>
	</dl>
      </section>
      <section anchor="mediatypes">
        <name>Media Types Registry</name>
        <t>IANA has added the media type "application/coap-eap" to the "Media Types" registry. <xref target="coap-eap-media-type"/> defines the format.</t>

	<dl spacing="normal" newline="false">
          <dt>Type name:</dt><dd>application</dd>
          <dt>Subtype name:</dt><dd>coap-eap</dd>
          <dt>Required parameters:</dt><dd>N/A</dd>
          <dt>Optional parameters:</dt><dd>N/A</dd>
          <dt>Encoding considerations:</dt><dd>binary</dd>
          <dt>Security considerations:</dt><dd>See <xref target="security_considerations"/> of RFC 9820.</dd>
          <dt>Interoperability considerations:</dt><dd>N/A</dd>
          <dt>Published specification:</dt><dd>RFC 9820</dd>
          <dt>Applications that use this media type:</dt><dd>To be identified</dd>
          <dt>Fragment identifier considerations:</dt><dd>N/A</dd>
          <dt>Additional information:</dt>
	  <dd><t><br/></t>
	  <dl spacing="compact">
            <dt>Magic number(s):</dt><dd>N/A</dd>
            <dt>File extension(s):</dt><dd>N/A</dd>
            <dt>Macintosh file type code(s):</dt><dd>N/A</dd>
          </dl></dd>
          <dt>Person and email address to contact for further information:</dt><dd>ace@ietf.org</dd>
          <dt>Intended usage:</dt><dd>COMMON</dd>
          <dt>Restrictions on usage:</dt><dd>N/A</dd>
          <dt>Author:</dt><dd>See the "Authors' Addresses" section of RFC 9820.</dd>
          <dt>Change Controller:</dt><dd>IETF</dd>
        </dl>
      </section>
      <section anchor="content-format">
        <name>CoAP Content-Formats Registry</name>
        <t>IANA has added the media type "application/coap-eap" to the "CoAP Content-Formats" registry under the "Constrained RESTful Environments (CoRE) Parameters" registry group, following the specification in <xref target="RFC7252" sectionFormat="of" section="12.3"/>.</t>
        <table anchor="content-format_registry">
          <name>CoAP Content-Formats Registry</name>
          <thead>
            <tr>
              <th>Media Type</th>
              <th>Content Encoding</th>
              <th>ID</th>
              <th>Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>application/coap-eap</td>
              <td>-</td>
              <td>269</td>
              <td>RFC 9820</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="resource-type">
        <name>Resource Type (rt=) Link Target Attribute Values Registry</name>
        <t>IANA has added the resource type "core.coap-eap" to the "Resource Type (rt=) Link Target Attribute Values" registry under the "Constrained RESTful Environments (CoRE) Parameters" registry group.</t>

<table anchor="resource-type-reg">
  <name>Resource Type (rt=) Link Target Attribute Values Registry</name>    
  <thead>
    <tr>
      <th>Value</th>
      <th>Description</th>
      <th>Reference</th>
    </tr>
  </thead>
  <tbody>      
    <tr>
      <td>core.coap-eap</td>
      <td>CoAP-EAP resource</td>
      <td>RFC 9820</td>
    </tr>
  </tbody>
</table>

      </section>
      <section anchor="expert-review-instructions">
        <name>Expert Review Instructions</name>
        <t>The IANA registries established in this document apply the
   "Specification Required", "Private Use", "Standards Action with Expert Review",
and "Experimental Use" policies.  (See also <xref target="RFC8126"/>.)
   This section provides general guidelines for what experts should focus on, but as they are designated experts for a reason, they should be granted flexibility.</t>
        <ul spacing="normal">
          <li>
            <t>When defining the use of CoAP-EAP Information Elements (IEs), experts are expected to evaluate how the values are defined, their scope, and whether they align with CoAP-EAP's functionality and constraints. They are expected to assess whether the values are clear, well structured, and follow CoAP and CoAP-EAP conventions, such as concise encoding for constrained environments. They should ensure that these IEs can seamlessly integrate with existing CoAP implementations and extensions. Experts are also expected to verify that IE values are protected from unauthorized modification or misuse during transmission.</t>
          </li>
          <li>
            <t>When adding new cipher suites, experts must ensure that algorithm values are sourced from the appropriate registry when required. They should also consider seeking input from relevant IETF working groups regarding the accuracy of registered parameters.</t>
          </li>
        </ul>
      </section>
    </section>
  </middle>
  <back>

    <displayreference target="I-D.ietf-emu-eap-edhoc" to="EAP-EDHOC"/>

    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5247.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3748.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7252.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8613.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6677.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8323.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8949.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7959.xml"/>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>

<!-- draft-ietf-emu-eap-edhoc (I-D Exists) (need "long way" for surnames) -->
<reference anchor="I-D.ietf-emu-eap-edhoc">
   <front>
      <title>Using the Extensible Authentication Protocol (EAP) with Ephemeral Diffie-Hellman over COSE (EDHOC)</title>
      <author initials="D." surname="Garcia-Carrillo" fullname="Dan Garcia-Carrillo">
         <organization>University of Oviedo</organization>
      </author>
      <author initials="R." surname="Marin-Lopez" fullname="Rafael Marin-Lopez">
         <organization>University of Murcia</organization>
      </author>
      <author initials="G." surname="Selander" fullname="Göran Selander">
         <organization>Ericsson</organization>
      </author>
      <author initials="J." surname="Preuß Mattsson" fullname="John Preuß Mattsson">
         <organization>Ericsson</organization>
      </author>
      <author initials="F." surname="Lopez-Gomez" fullname="Francisco Lopez-Gomez">
         <organization>University of Murcia</organization>
      </author>
      <date month="July" day="30" year="2025" />
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-emu-eap-edhoc-05"/>   
</reference>

	<xi:include
href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7967.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5869.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4764.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5191.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5433.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5448.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6696.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7833.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8824.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9147.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4137.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9140.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9176.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8615.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9200.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9190.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9031.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4017.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9053.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4186.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8446.xml"/>

        <reference anchor="EAP-Framework-IoT" target="https://ieeexplore.ieee.org/document/9579387">
          <front>
            <title>Secure Network Access Authentication for IoT Devices: EAP Framework vs. Individual Protocols</title>
            <author initials="M." surname="Sethi" fullname="Mohit Sethi">
              <organization/>
            </author>
            <author initials="T." surname="Aura" fullname="Tuomas Aura">
              <organization/>
            </author>
            <date year="2021"/>
          </front>
          <seriesInfo name="DOI" value="10.1109/MCOMSTD.201.2000088"/>
          <refcontent>IEEE Communications Standards Magazine, vol. 5, no. 3, pp. 34-39</refcontent>
        </reference>

        <reference anchor="LO-CoAP-EAP" target="https://www.mdpi.com/1424-8220/17/11/2646">
          <front>
            <title>A CoAP-Based Network Access Authentication Service for Low-Power Wide Area Networks: LO-CoAP-EAP</title>
            <author initials="D." surname="Garcia-Carrillo" fullname="Dan Garcia-Carrillo">
              <organization/>
            </author>
            <author initials="R." surname="Marin-Lopez" fullname="Rafael Marin-Lopez">
              <organization/>
            </author>
            <author initials="A." surname="Kandasamy" fullname="Arunprabhu Kandasamy">
              <organization/>
            </author>
            <author initials="A." surname="Pelov" fullname="Alexander Pelov">
              <organization/>
            </author>
            <date year="2017"/>
          </front>
          <seriesInfo name="DOI" value="10.3390/s17112646"/>
          <refcontent>Sensors, vol. 17, no. 11</refcontent>
        </reference>

        <reference anchor="CoAP-EAP" target="https://www.mdpi.com/1424-8220/16/3/358">
          <front>
            <title>Lightweight CoAP-Based Bootstrapping Service for the Internet of Things</title>
            <author initials="D." surname="Garcia-Carrillo" fullname="Dan Garcia-Carrillo">
              <organization/>
            </author>
            <author initials="R." surname="Marin-Lopez" fullname="Rafael Marin-Lopez">
              <organization/>
            </author>
            <date year="2016"/>
          </front>
          <seriesInfo name="DOI" value="10.3390/s16030358"/>
          <refcontent>Sensors, vol. 16, no. 3</refcontent>
        </reference>

        <reference anchor="TS133.501" target="https://www.etsi.org/deliver/etsi_ts/133500_133599/133501/18.09.00_60/ts_133501v180900p.pdf">
          <front>
            <title>5G; Security architecture and procedures for 5G System</title>
            <author>
              <organization>ETSI</organization>
            </author>
            <date month="April" year="2025"/>
          </front>
          <seriesInfo name="ETSI TS" value="133 501"/>
          <refcontent>V18.9.0</refcontent>
        </reference>
        <reference anchor="IEEE802159" target="">
          <front>
            <title>IEEE Standard for Transport of Key Management Protocol (KMP) Datagrams</title>
            <author>
              <organization>IEEE</organization>
            </author>
            <date month="January" year="2022"/>
          </front>
          <seriesInfo name="IEEE Std" value="802.15.9-2021"/>
          <seriesInfo name="DOI" value="10.1109/IEEESTD.2022.9690134"/>
        </reference>

        <reference anchor="THREAD" target="https://www.threadgroup.org/Portals/0/Documents/Thread_1.4_Features_White_Paper_September_2024.pdf">
          <front>
            <title>Thread 1.4 Features White Paper</title>
            <author initials="S." surname="Kumar" fullname="Saurabh Kumar">
            </author>
            <author initials="E." surname="Dijk" fullname="Esko Dijk">
            </author>
            <date month="September" year="2024"/>
          </front>
        </reference>
      </references>
    </references>

<section anchor="flow-of-operation-dtls">
      <name>Flow of Operation (DTLS Establishment)</name>
      <t>CoAP-EAP makes it possible to derive a Pre-Shared Key (PSK) from the MSK to allow (D)TLS PSK-based authentication between the EAP peer and the EAP authenticator instead of using OSCORE. In the case of using (D)TLS to establish a security association, there is a limitation on the use of intermediaries between the EAP peer and the EAP authenticator, as (D)TLS breaks the end-to-end communications when using intermediaries such as proxies.</t>
      <t><xref target="fig-dtls"/> shows the last steps of the flow of operation for CoAP-EAP when (D)TLS is used to protect the communication between the EAP peer and the EAP authenticator using the keying material exported by the EAP authentication. The general flow is essentially the same as in the case of OSCORE, except that DTLS negotiation is established in Step 7. Once DTLS negotiation has finished successfully, the EAP peer is granted access to the domain. Step 7 <bcp14>MUST</bcp14> be interpreted by the EAP peer as an alternate success indication, which will end up with the MSK and the DTLS_PSK derivation for the (D)TLS authentication based on the PSK.</t>
      <figure anchor="fig-dtls">
        <name>CoAP-EAP Flow of Operation with DTLS</name>
        <artset>
          <artwork type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="504" viewBox="0 0 504 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 32,176 L 32,192" fill="none" stroke="black"/>
            <path d="M 88,80 L 88,208" fill="none" stroke="black"/>
            <path d="M 424,80 L 424,208" fill="none" stroke="black"/>
            <path d="M 448,144 L 448,160" fill="none" stroke="black"/>
            <path d="M 16,48 L 112,48" fill="none" stroke="black"/>
            <path d="M 336,48 L 432,48" fill="none" stroke="black"/>
            <path d="M 96,112 L 416,112" fill="none" stroke="black"/>
            <path d="M 96,160 L 416,160" fill="none" stroke="black"/>
            <path d="M 96,190 L 192,190" fill="none" stroke="black"/>
            <path d="M 96,194 L 192,194" fill="none" stroke="black"/>
            <path d="M 328,190 L 416,190" fill="none" stroke="black"/>
            <path d="M 328,194 L 416,194" fill="none" stroke="black"/>
            <path d="M 144,224 L 160,224" fill="none" stroke="black"/>
            <path d="M 352,224 L 368,224" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="456,160 444,154.4 444,165.6" fill="black" transform="rotate(90,448,160)"/>
            <polygon class="arrowhead" points="424,112 412,106.4 412,117.6" fill="black" transform="rotate(0,416,112)"/>
            <polygon class="arrowhead" points="376,224 364,218.4 364,229.6" fill="black" transform="rotate(0,368,224)"/>
            <polygon class="arrowhead" points="152,224 140,218.4 140,229.6" fill="black" transform="rotate(180,144,224)"/>
            <polygon class="arrowhead" points="104,160 92,154.4 92,165.6" fill="black" transform="rotate(180,96,160)"/>
            <polygon class="arrowhead" points="40,192 28,186.4 28,197.6" fill="black" transform="rotate(90,32,192)"/>
            <g class="text">
              <text x="40" y="36">EAP</text>
              <text x="76" y="36">peer</text>
              <text x="344" y="36">EAP</text>
              <text x="416" y="36">authenticator</text>
              <text x="216" y="68">...</text>
              <text x="116" y="84">2.01</text>
              <text x="168" y="84">Created</text>
              <text x="256" y="84">Location-Path</text>
              <text x="364" y="84">[/a/eap/(n)]</text>
              <text x="176" y="100">Payload(EAP-X-Resp)</text>
              <text x="76" y="116">6)</text>
              <text x="448" y="132">MSK</text>
              <text x="172" y="148">(D)TLS</text>
              <text x="216" y="148">1.3</text>
              <text x="260" y="148">Client</text>
              <text x="312" y="148">Hello</text>
              <text x="32" y="164">MSK</text>
              <text x="76" y="164">7)</text>
              <text x="468" y="180">DTLS_PSK</text>
              <text x="220" y="196">DTLS</text>
              <text x="280" y="196">handshake</text>
              <text x="36" y="212">DTLS_PSK</text>
              <text x="208" y="228">Protected</text>
              <text x="268" y="228">with</text>
              <text x="316" y="228">(D)TLS</text>
            </g>
          </svg>
          </artwork>
          <artwork type="ascii-art" align="center"><![CDATA[
    EAP peer                              EAP authenticator
  -------------                           -------------
                          ...
            | 2.01 Created Location-Path [/a/eap/(n)] |
            | Payload(EAP-X-Resp)                     |
          6)|---------------------------------------->|
            |                                         | MSK
            |       (D)TLS 1.3 Client Hello           |  |
    MSK   7)|<----------------------------------------|  v
     |      |                                         | DTLS_PSK
     v      |============= DTLS handshake ============|
  DTLS_PSK  |                                         |
                  <-- Protected with (D)TLS -->
]]></artwork>

        </artset>
      </figure>
      <t>According to <xref target="RFC8446"/>, the provision of the PSK out of band also requires the provision of the KDF hash algorithm and the PSK identity. To simplify the design in CoAP-EAP, the KDF hash algorithm can be included in the list of cipher suites exchanged in Steps 1 and 2 (<xref target="figure8"/>) if one wants to use DTLS instead of OSCORE. For the same reason, the PSK identity is derived from RID-C || RID-I as defined in <xref target="dtls-psk"/>.</t>
      <t>Analogous to how the cipher suite is negotiated for OSCORE (<xref target="crypto-negotiation"/>), the EAP authenticator sends a list, in decreasing order of preference, with the identifiers of the hash algorithms supported (Step 1). In the response, the EAP peer sends its choice.</t>
      <t>This list is included in the payload after the EAP message with a CBOR array that contains the cipher suites. This CBOR array is enclosed as one of the elements of the CBOR Object used for transporting information in CoAP-EAP (see <xref target="cbor-coap-eap"/>).   An example of how the fields are arranged in the CoAP payload can be seen in <xref target="figure7"/>.</t>
      <t>If there is no CBOR array specifying the cipher suites, the default cipher suites are applied. If the EAP authenticator sends a restricted list of cipher suites that can be accepted, it <bcp14>MUST</bcp14> include the default value 0, since it is mandatory to implement. The EAP peer will have at least that option available.</t>
      <t>For DTLS, the negotiated cipher suite is used to determine the hash function to be used to derive the "DTLS_PSK" from the MSK. The following hash algorithms are considered in cases where the specification includes DTLS support in the future:</t>
      <ul spacing="normal">
        <li>
          <t>5) TLS_SHA256</t>
        </li>
        <li>
          <t>6) TLS_SHA384</t>
        </li>
        <li>
          <t>7) TLS_SHA512</t>
        </li>
      </ul>
      <t>The inclusion of these values, apart from indicating the hash algorithm, indicates that the EAP authenticator intends to establish an OSCORE security association or a DTLS security association after the authentication is completed. If both options appear in the cipher suite negotiation, the OSCORE security association will be preferred over DTLS.</t>
      <section anchor="dtls-psk">
        <name>Deriving DTLS_PSK and Identity</name>
        <t>To enable DTLS after an EAP authentication, Identity and the PSK for DTLS are defined. Identity in this case is generated by concatenating the exchanged Sender ID and the Recipient ID.</t>
        <artwork><![CDATA[
                CoAP-EAP PSK Identity = RID-C || RID-I
]]></artwork>
        <t>It is also possible to derive a PSK for DTLS <xref target="RFC9147"/>, referred to here as "DTLS_PSK", from the MSK between both the EAP peer and EAP authenticator if required. The length of the DTLS_PSK will depend on the cipher suite. To have keying material with sufficient length, a key of 32 bytes is derived that can be truncated later if needed:</t>
        <artwork><![CDATA[
                DTLS_PSK = KDF(MSK, "CoAP-EAP DTLS_PSK", length)
]]></artwork>
        <t>where:</t>
        <ul spacing="normal">
          <li>
            <t>The MSK is exported by the EAP method.</t>
          </li>
          <li>
            <t>"CoAP-EAP DTLS_PSK" is the ASCII code representation of the non-NULL-terminated string (excluding the double quotes around it).</t>
          </li>
          <li>
            <t>length is the size of the output key material.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="using-coap-eap-for-distributing-key-material-for-iot-networks">
      <name>Using CoAP-EAP for Distributing Key Material for IoT Networks</name>
      <t>Similarly to the example in <xref target="dtls-psk"/>, where a PSK for DTLS is derived, it is possible to provide key material to different link layers after the CoAP-EAP authentication is complete.</t>
      <t>For example, CoAP-EAP could be used to derive the PSK required to run the Constrained Join Protocol (CoJP) for IPv6 over the TSCH mode of IEEE 802.15.4e (6TiSCH) <xref target="RFC9031"/>. ("TSCH" stands for "Time-Slotted Channel Hopping".)</t>
      <t>Another example would be when a shared Network Key is required by the devices that join a network. An example of this Network Key can be found in the THREAD protocol <xref target="THREAD"/>. After CoAP-EAP execution, a security association based on OSCORE protects any exchange between the EAP peer and the EAP authenticator. This security association can be used for distributing the Network Key securely and other required parameters. How the Network Key is distributed after a successful CoAP-EAP authentication is outside the scope of this document.</t>
      <t>How a particular link-layer technology uses the MSK to derive further key material for protecting the link layer or uses OSCORE protection to distribute key material is outside the scope of this document.</t>
    </section>
    <section anchor="examples-of-use-case-scenario">
      <name>Example Use Case Scenarios</name>
      <t>In IoT networks, for an EAP peer to act as a trustworthy entity within a security domain, certain key material needs to be shared between the EAP peer and the EAP authenticator.</t>
      <t>Next, examples of different use case scenarios will be elaborated on as related to the usage of CoAP-EAP.</t>
      <t>Generally, four entities are involved:</t>
      <ul spacing="normal">
        <li>
          <t>Two EAP peers (A and B).</t>
        </li>
        <li>
          <t>One EAP authenticator (C). The EAP authenticator manages a domain where EAP peers can be deployed. In IoT networks, it can be considered a more powerful machine than the EAP peers.</t>
        </li>
        <li>
          <t>One AAA server. Optional. The AAA server is not constrained. Here, the EAP authenticator is operating in pass-through mode.</t>
        </li>
      </ul>
      <t>Generally, any EAP peer wanting to join the domain managed by the EAP authenticator <bcp14>MUST</bcp14> perform a CoAP-EAP authentication with the EAP authenticator (C). This authentication <bcp14>MAY</bcp14> involve an external AAA server.  This means that the EAP peers (A and B), once deployed, will run CoAP-EAP once, as a bootstrapping phase, to establish a security association with C. Moreover, any other entity that wants to join and establish communications with EAP peers under
C's domain must also do the same.</t>
      <t>By using EAP, the flexibility of having different types of credentials can be achieved. For instance, if a device that is not battery dependent and not very constrained is available, a heavier authentication method could be used. With varied EAP peers and networks, authentication methods that are more lightweight (e.g., EAP-NOOB <xref target="RFC9140"/>, EAP-AKA' <xref target="RFC5448"/>, EAP-PSK <xref target="RFC4764"/>, EAP-EDHOC <xref target="I-D.ietf-emu-eap-edhoc"/>, etc.) and
are able to adapt to different types of devices according to organization policies or device capabilities might need to be used.</t>
      <section anchor="example-1-coap-eap-in-ace">
        <name>Example 1:  CoAP-EAP Using ACE</name>
        <t>When using ACE, the process of client registration and provisioning of credentials to the client is not specified. The process of client registration and provisioning can be achieved using CoAP-EAP. Once the process of authentication with EAP is completed, the fresh key material is shared between the EAP peer and the EAP authenticator. With ACE, the EAP authenticator and the Authorization Server (AS) can be co-located.</t>
        <t>Next, a general way to exemplify how client registration can be performed using CoAP-EAP is presented, to allow two EAP peers (A and B) to communicate and interact after a successful client registration.</t>
        <t>EAP peer A wants to communicate with EAP peer B (e.g., to activate a light switch).  The overall process is divided into three phases.</t>

<ul spacing="normal">
<li><t>In the first phase, EAP peer A does not yet belong to EAP authenticator C's domain.  Then, it communicates with C and authenticates with CoAP-EAP, which, optionally, communicates with the AAA server to complete the authentication process. If the authentication is successful, a fresh MSK is shared between C and EAP peer A. This key material allows EAP peer A to establish a security association with C. Some authorization information may also be provided in this step. If EAP is used in standalone mode, the AS itself, having information about the devices, can be the entity providing said authorization information.</t>
        <t>If authentication and authorization are correct, EAP peer A is enrolled in EAP authenticator C's domain for some period of time. In particular, <xref target="RFC5247"/> recommends 8 hours, though the entity providing the authorization information can establish this lifetime.  In the same manner, B needs to perform the same process with CoAP-EAP to be part of EAP authenticator C's domain.</t></li>
        <li><t>In the second phase, when EAP peer A wants to talk to EAP peer B, it contacts EAP authenticator C for authorization to access EAP peer B and obtain all the required information to do that securely (e.g., keys, tokens, authorization information, etc.).  This phase does NOT require the usage of CoAP-EAP.  The details of this phase are outside the scope of this document; the ACE framework is used for this purpose. See <xref target="RFC9200"/>.</t></li>
        <li><t>In the third phase, EAP peer A can access EAP peer B with the credentials and information obtained from EAP authenticator C during the second phase. This access can be repeated without contacting the EAP authenticator, as long as the credentials given to A are still valid.  The details of this phase are outside the scope of this document.</t></li>
</ul>
        <t>It is worth noting that to join EAP authenticator C's domain, the first phase (authentication via CoAP-EAP) is required.  Once it is performed successfully, the communications are local to EAP authenticator C's domain and there is no need to perform a new EAP authentication as long as the key material is still valid. When the keys are about to expire, the EAP peer can engage in a re-authentication to renew the key material,
as explained in <xref target="re-authentication"/>.</t>
      </section>
      <section anchor="example-2-multi-domain-with-aaa-infrastructures">
        <name>Example 2: Multiple Domains with AAA Infrastructures</name>
        <t>A device (A) of the domain acme.org uses a specific kind of credential
and intends to join the um.es domain. This user does not belong to this domain, for which it first performs a client registration using CoAP-EAP. To do this, it interacts with the EAP authenticator's domain, which in turn communicates with a AAA infrastructure (acting as a AAA client). Then, the local AAA server communicates with the home AAA server to complete the authentication. This way, the device can be considered as a trustworthy entity within EAP authenticator C's domain. In this scenario, the AS, in the role of the EAP authenticator, receives the key material from the AAA infrastructure.</t>
      </section>
      <section anchor="example-3-single-domain-with-aaa-infrastructure">
        <name>Example 3: Single Domain with a AAA Infrastructure</name>
        <t>In this scenario, a university campus has several faculty buildings, where each building has its criteria or policies in place to manage EAP peers under an AS. All buildings belong to the same domain (e.g., um.es). All these buildings are managed with a AAA infrastructure. A new device (A) with credentials from the domain (e.g., um.es) will be able to perform the device registration with an EAP authenticator (C) of any building if they are managed by the same general domain.</t>
      </section>
      <section anchor="example-4-single-domain-without-aaa-infrastructure">
        <name>Example 4: Single Domain Without a AAA Infrastructure</name>
        <t>In another case, without a AAA infrastructure, with an EAP authenticator that has co-located the EAP server, and using EAP standalone mode, all the devices can be managed within the same domain locally. Client registration of an EAP peer (A) with a Controller (C) can also be performed in the same manner.</t>
      </section>
      <section anchor="other-use-cases">
        <name>Other Use Cases</name>
        <section anchor="coap-eap-network-access-control">
          <name>CoAP-EAP for Network Access Authentication</name>
          <t>One of the first steps for an EAP peer is to perform the authentication to gain access to the network. To do so, the device must first be authenticated and granted authorization to gain access to the network. Additionally, security parameters such as credentials can be derived from the authentication process, allowing the trustworthy operation of the EAP peer in a particular network by joining the security domain. By using EAP, this can be achieved with flexibility and scalability, because of the different EAP methods available and the ability to rely on AAA infrastructures if needed to support multi-domain scenarios, which is a key feature when the EAP peers deployed under the same security domain belong, for example, to different organizations.</t>
          <t>The following two cases apply to the process of joining a network:
1)&nbsp;the node has an IPv6 address (e.g., link-local IPv6 or IPv6 global address) and 2)&nbsp;the node does not have an IPv6 address.</t>
          <t>In networks where the device is in place but no IP support is available until the EAP peer is authenticated, specific support for this EAP lower layer has to be defined to allow CoAP-EAP messages to be exchanged between the EAP peer and the EAP authenticator. For example, in IEEE 802.15.4 networks, a new Key Management
Protocol (KMP) ID can be defined to add such support in the case of IEEE 802.15.9 <xref target="IEEE802159"/>, where it can be assumed that the device has at least a link-layer IPv6 address.</t>
          <t>When the EAP peer intends to be admitted into the network, it would search for an entity that offers the CoAP-EAP service, be it directly via the EAP authenticator or through an intermediary (e.g., proxy). See <xref target="discovery-section"/>.</t>
          <t>CoAP-EAP will run between the EAP peer and the EAP authenticator or through an intermediary entity such as a proxy, as happens in a mesh network, where the EAP authenticator could be placed one or more hops away from the EAP peer. In the case that a proxy participates in CoAP-EAP, it will be because it is already a trustworthy entity within the domain and communicates through a secure channel with the EAP authenticator, as illustrated by <xref target="fig-network-proxy"/>.</t>
          <t>If the EAP peer cannot connect to the EAP authenticator directly, the
EAP peer can follow the same process as that described in
<xref target="proxy"/> to perform the authentication (i.e., can connect via
an intermediary entity (e.g., proxy) that is already part of the network (already shares
key material and communicates through a secure channel with the authenticator) and
can aid in running CoAP-EAP).</t>
          <t>When CoAP-EAP is completed and the OSCORE security association is established with the EAP authenticator, the EAP peer receives the local configuration parameters for the network (e.g., a Network Key) and can configure a global IPv6 address. Moreover, there is no need for an intermediary entity after a successful authentication.</t>
          <t>For removal, if the EAP authenticator decides to remove a particular EAP peer from the network or the peer itself intends to leave, either the EAP peer or the EAP authenticator can directly send a DELETE command to explicitly express that the network access state is removed, and the device will no longer belong to the network. Thus, any state related to the EAP peer is removed in the EAP authenticator. Forced removal can be done by sending new specific key material to the devices that still belong to the network, excluding the removed device, following a model similar to CoJP for 6TiSCH <xref target="RFC9031"/>. The specifics on how this process is to be done are outside the scope of this document.</t>
          <figure anchor="fig-network-proxy">
            <name>CoAP-EAP Through CoAP Proxy</name>
            <artset>
              <artwork type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="144" width="568" viewBox="0 0 568 144" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,80" fill="none" stroke="black"/>
                <path d="M 72,32 L 72,80" fill="none" stroke="black"/>
                <path d="M 144,32 L 144,80" fill="none" stroke="black"/>
                <path d="M 216,32 L 216,80" fill="none" stroke="black"/>
                <path d="M 440,32 L 440,80" fill="none" stroke="black"/>
                <path d="M 560,32 L 560,80" fill="none" stroke="black"/>
                <path d="M 8,32 L 72,32" fill="none" stroke="black"/>
                <path d="M 144,32 L 216,32" fill="none" stroke="black"/>
                <path d="M 440,32 L 560,32" fill="none" stroke="black"/>
                <path d="M 80,64 L 136,64" fill="none" stroke="black"/>
                <path d="M 224,64 L 432,64" fill="none" stroke="black"/>
                <path d="M 8,80 L 72,80" fill="none" stroke="black"/>
                <path d="M 144,80 L 216,80" fill="none" stroke="black"/>
                <path d="M 440,80 L 560,80" fill="none" stroke="black"/>
                <path d="M 224,112 L 240,112" fill="none" stroke="black"/>
                <path d="M 424,112 L 440,112" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="448,112 436,106.4 436,117.6" fill="black" transform="rotate(0,440,112)"/>
                <polygon class="arrowhead" points="440,64 428,58.4 428,69.6" fill="black" transform="rotate(0,432,64)"/>
                <polygon class="arrowhead" points="232,112 220,106.4 220,117.6" fill="black" transform="rotate(180,224,112)"/>
                <polygon class="arrowhead" points="232,64 220,58.4 220,69.6" fill="black" transform="rotate(180,224,64)"/>
                <polygon class="arrowhead" points="144,64 132,58.4 132,69.6" fill="black" transform="rotate(0,136,64)"/>
                <polygon class="arrowhead" points="88,64 76,58.4 76,69.6" fill="black" transform="rotate(180,80,64)"/>
                <g class="text">
                  <text x="32" y="52">EAP</text>
                  <text x="180" y="52">CoAP</text>
                  <text x="480" y="52">EAP</text>
                  <text x="36" y="68">peer</text>
                  <text x="184" y="68">proxy</text>
                  <text x="504" y="68">authenticator</text>
                  <text x="108" y="84">CoAP</text>
                  <text x="324" y="84">CoAP</text>
                  <text x="328" y="100">OSCORE/DTLS</text>
                  <text x="284" y="116">security</text>
                  <text x="368" y="116">association</text>
                </g>
              </svg>
              </artwork>
              <artwork type="ascii-art" align="center"><![CDATA[
  +-------+        +--------+                           +--------------+
  | EAP   |        |  CoAP  |                           |   EAP        |
  | peer  |<------>|  proxy |<------------------------->| authenticator|
  +-------+  CoAP  +--------+           CoAP            +--------------+
                                      OSCORE/DTLS
                              <-- security association -->
]]></artwork>
            </artset>
          </figure>
          <t>Given that EAP is also used for network access authentication, this service can be adapted to other technologies -- for instance, to provide network access control to very constrained technologies (e.g., Long Range (LoRa) networks). The authors of <xref target="LO-CoAP-EAP"/> provide a study of a minimal version of CoAP-EAP for LPWANs, with interesting results. In this specific case, compression as provided by Static Context Header Compression (SCHC) for CoAP <xref target="RFC8824"/> can be leveraged.</t>
        </section>
        <section anchor="coap-eap-for-service-authentication">
          <name>CoAP-EAP for Service Authentication</name>
          <t>It is not uncommon that the infrastructure where the device is deployed and the services of the EAP peer are managed by different organizations. Therefore, in addition to the authentication for network access control, the possibility of a secondary authentication to access different services has to be considered. This process of authentication, for example, will provide the necessary key material to establish a secure channel and interact with the entity in charge of granting access to different services.</t>
          <t>In 5G, for example, consider primary and secondary authentication using EAP <xref target="TS133.501"/>.</t>
        </section>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>We would like to thank the reviewers of this work: <contact
      fullname="Paul Wouters"/>, <contact fullname="Heikki Vatiainen"/>,
      <contact fullname="Josh Howlett"/>, <contact fullname="Deb Cooley"/>,
      <contact fullname="Eliot Lear"/>, <contact fullname="Alan DeKok"/>,
      <contact fullname="Carsten Bormann"/>, <contact fullname="Mohit
      Sethi"/>, <contact fullname="Benjamin Kaduk"/>, <contact
      fullname="Christian Amsüss"/>, <contact fullname="John Preuß Mattsson"/>,
      <contact fullname="Göran Selander"/>, <contact fullname="Alexandre
      Petrescu"/>, <contact fullname="Pedro Moreno-Sanchez"/>, and <contact
      fullname="Eduardo Ingles-Sanchez"/>.</t>
      <t>We would also like to thank <contact fullname="Gabriel
      Lopez-Millan"/> for the first review of this document, <contact fullname="Ivan Jimenez-Sanchez"/> for the first
      proof-of-concept implementation of this idea, <contact fullname="Julian
      Niklas Schimmelpfennig"/> for the implementation of the Erbium-based IoT
      device implementation, and <contact fullname="Daniel Menendez
      Gonzalez"/> for the Python implementation.</t>
      <t>Thanks also to <contact fullname="Alexander Pelov"/> and <contact
 fullname="Laurent Toutain"/> for their valuable comments, especially regarding the
      potential optimizations of CoAP-EAP.</t>
      <t>This work was supported in part by Grant PID2020-112675RB-C44 funded
      by MCIN/AEI/10.13039/5011000011033 (ONOFRE-3-UMU) and in part by the
      H2020 EU project IoTCrawler under contract 779852.</t>
    </section>
  </back>
</rfc>
