| rfc9953.original.md | rfc9953.md | |||
|---|---|---|---|---|
| --- | --- | |||
| v: 3 | title: "DNS over the Constrained Application Protocol (DoC)" | |||
| title: "DNS over CoAP (DoC)" | ||||
| abbrev: DoC | abbrev: DoC | |||
| docname: draft-ietf-core-dns-over-coap-20 | docname: draft-ietf-core-dns-over-coap-20 | |||
| number: 9953 | ||||
| ipr: trust200902 | ||||
| lang: en | ||||
| consensus: true | ||||
| obsoletes: | ||||
| updates: | ||||
| pi: [toc, symrefs, sortrefs] | ||||
| category: std | category: std | |||
| submissiontype: IETF | submissiontype: IETF | |||
| v: 3 | ||||
| v3xml2rfc: | date: 2026-03 | |||
| silence: | area: WIT | |||
| - Found SVG with width or height specified | ||||
| area: Applications | ||||
| workgroup: CoRE | workgroup: CoRE | |||
| keyword: | keyword: | |||
| - Internet-Draft | ||||
| - CoRE | - CoRE | |||
| - CoAP | - CoAP | |||
| - DNS | - DNS | |||
| venue: | ||||
| group: CoRE | ||||
| type: Working Group | ||||
| mail: core@ietf.org | ||||
| arch: "https://mailarchive.ietf.org/arch/browse/core/" | ||||
| github: "core-wg/draft-dns-over-coap" | ||||
| latest: "https://core-wg.github.io/draft-dns-over-coap/draft-ietf-core-dns-over-c | ||||
| oap.html" | ||||
| author: | author: | |||
| - name: Martine Sophie Lenders | - name: Martine Sophie Lenders | |||
| org: TUD Dresden University of Technology | org: TUD Dresden University of Technology | |||
| abbrev: TU Dresden | abbrev: TU Dresden | |||
| street: Helmholtzstr. 10 | street: Helmholtzstr. 10 | |||
| city: Dresden | city: Dresden | |||
| code: D-01069 | code: D-01069 | |||
| country: Germany | country: Germany | |||
| email: martine.lenders@tu-dresden.de | email: martine.lenders@tu-dresden.de | |||
| skipping to change at line 83 ¶ | skipping to change at line 78 ¶ | |||
| RFC8484: doh | RFC8484: doh | |||
| RFC8613: oscore | RFC8613: oscore | |||
| RFC8765: dns-push | RFC8765: dns-push | |||
| RFC8768: coap-hop-limit | RFC8768: coap-hop-limit | |||
| RFC8949: cbor | RFC8949: cbor | |||
| RFC9147: dtls13 | RFC9147: dtls13 | |||
| RFC9460: svcb | RFC9460: svcb | |||
| RFC9461: svcb-dns | RFC9461: svcb-dns | |||
| RFC9462: ddr | RFC9462: ddr | |||
| RFC9463: dnr | RFC9463: dnr | |||
| I-D.ietf-core-coap-dtls-alpn: coap-dtls-alpn | PRE-RFC9952: | |||
| title: > | ||||
| The Application-Layer Protocol Negotiation (ALPN) ID Specification for the Cons | ||||
| trained Application Protocol (CoAP) over DTLS | ||||
| target: https://www.rfc-editor.org/info/rfc9952 | ||||
| seriesinfo: | ||||
| RFC: PRE-9952 | ||||
| DOI: 10.17487/PRE-RFC9952 | ||||
| date: March 2026 | ||||
| author: | ||||
| - | ||||
| ins: M. S. Lenders | ||||
| surname: Lenders | ||||
| fullname: Martine Sophie Lenders | ||||
| - | ||||
| ins: C. Amsüss | ||||
| surname: Amsüss | ||||
| fullname: Christian Amsüss | ||||
| - | ||||
| ins: T. C. Schmidt | ||||
| surname: Schmidt | ||||
| fullname: Thomas C. Schmidt | ||||
| - | ||||
| ins: M. Wählisch | ||||
| surname: Wählisch | ||||
| fullname: Matthias Wählisch | ||||
| informative: | informative: | |||
| BCP219: dns-terminology | BCP219: dns-terminology | |||
| BCP237: dnssec | BCP237: dnssec | |||
| RFC3833: dns-threats | RFC3833: dns-threats | |||
| RFC6690: core-link-format | RFC6690: core-link-format | |||
| RFC7228: constr-nodes | RFC7228: constr-nodes | |||
| RFC7858: dot | RFC7858: dot | |||
| RFC8094: dodtls | RFC8094: dodtls | |||
| RFC9076: dns-privacy | RFC9076: dns-privacy | |||
| RFC9176: core-rd | RFC9176: core-rd | |||
| RFC9250: doq | RFC9250: doq | |||
| RFC9528: edhoc | RFC9528: edhoc | |||
| I-D.ietf-core-href: cri | I-D.ietf-core-href: | |||
| I-D.ietf-core-transport-indication: transport-indication | display: CRI | |||
| I-D.ietf-iotops-7228bis: constr-nodes-bis | I-D.ietf-core-transport-indication: | |||
| I-D.amsuess-core-cachable-oscore: cachable-oscore | display: TRANSPORT-IND | |||
| DoC-paper: DOI.10.1145/3609423 | I-D.ietf-iotops-7228bis: | |||
| I-D.ietf-core-corr-clar: core-corrclar | display: RFC7228bis | |||
| I-D.amsuess-core-cachable-oscore: | ||||
| display: CACHABLE-OSCORE | ||||
| DoC-paper: | ||||
| seriesinfo: | ||||
| DOI: 10.1145/3609423 | ||||
| title: 'Securing Name Resolution in the IoT: DNS over CoAP' | ||||
| author: | ||||
| - name: Martine S. Lenders | ||||
| ins: M. Lenders | ||||
| org: TU Dresden, Germany | ||||
| - name: Christian Amsüss | ||||
| ins: C. Amsüss | ||||
| org: Unaffiliated, Vienna, Austria | ||||
| - name: Cenk Gündogan | ||||
| ins: C. Gündogan | ||||
| org: Huawei Technologies, Munich, Germany | ||||
| - name: Marcin Nawrocki | ||||
| ins: M. Nawrocki | ||||
| org: TU Dresden, Germany | ||||
| - name: Thomas C. Schmidt | ||||
| ins: T. Schmidt | ||||
| org: HAW Hamburg, Hamburg, Germany | ||||
| - name: Matthias Wählisch | ||||
| ins: M. Wählisch | ||||
| org: TU Dresden & Barkhausen Institut, Dresden, Germany | ||||
| date: '2023-09-28' | ||||
| refcontent: Proceedings of the ACM on Networking, vol. 1, no. CoNEXT2, pp. 1-25 | ||||
| I-D.ietf-core-corr-clar: | ||||
| display: CoAP-CORR-CLAR | ||||
| REST: | REST: | |||
| target: https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation .pdf | target: https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation .pdf | |||
| title: Architectural Styles and the Design of Network-based Software Architecture s | title: Architectural Styles and the Design of Network-based Software Architecture s | |||
| author: | author: | |||
| ins: R. Fielding | ins: R. Fielding | |||
| name: Roy Thomas Fielding | name: Roy Thomas Fielding | |||
| org: University of California, Irvine | org: University of California, Irvine | |||
| date: 2000 | date: 2000 | |||
| seriesinfo: | refcontent: | |||
| "Ph.D.": "Dissertation, University of California, Irvine" | "Ph.D. Dissertation, University of California, Irvine" | |||
| format: | format: | |||
| HTML: https://ics.uci.edu/~fielding/pubs/dissertation/top.htm | HTML: https://ics.uci.edu/~fielding/pubs/dissertation/top.htm | |||
| PDF: https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation. pdf | PDF: https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation. pdf | |||
| --- abstract | --- abstract | |||
| <!--[rfced] FYI: We updated [I-D.ietf-core-coap-dtls-alpn] to [PRE-RFC9952] | ||||
| for now. We will make the final updates in RFCXML (i.e., remove "PRE-"). | ||||
| --> | ||||
| <!--[rfced] Please note that the title of the document has been | ||||
| updated as follows. The abbreviation has been expanded per Section 3.6 | ||||
| of RFC 7322 ("RFC Style Guide"). We also added "the". Please review. | ||||
| Original: | ||||
| DNS over CoAP (DoC) | ||||
| Current: | ||||
| DNS over the Constrained Application Protocol (DoC) | ||||
| --> | ||||
| <!--[rfced] May we remove "(CoAPS)" in the Abstract as this | ||||
| term/abbreviation is not used elsewhere in the document? Please | ||||
| review. | ||||
| Original: | ||||
| These CoAP messages can be protected by (D)TLS-Secured CoAP (CoAPS) | ||||
| or Object Security for Constrained RESTful Environments (OSCORE) to | ||||
| provide encrypted DNS message exchange for constrained devices in | ||||
| the Internet of Things (IoT). | ||||
| Perhaps: | ||||
| These CoAP messages can be protected by (D)TLS-Secured CoAP or | ||||
| Object Security for Constrained RESTful Environments (OSCORE) to | ||||
| provide encrypted DNS message exchange for constrained devices in | ||||
| the Internet of Things (IoT). | ||||
| --> | ||||
| This document defines a protocol for exchanging DNS queries (OPCODE 0) over the | This document defines a protocol for exchanging DNS queries (OPCODE 0) over the | |||
| Constrained Application Protocol (CoAP). These CoAP messages can be protected | Constrained Application Protocol (CoAP). These CoAP messages can be protected | |||
| by (D)TLS-Secured CoAP (CoAPS) or Object Security for Constrained RESTful | by (D)TLS-Secured CoAP (CoAPS) or Object Security for Constrained RESTful | |||
| Environments (OSCORE) to provide encrypted DNS message exchange for | Environments (OSCORE) to provide encrypted DNS message exchange for | |||
| constrained devices in the Internet of Things (IoT). | constrained devices in the Internet of Things (IoT). | |||
| --- middle | --- middle | |||
| Introduction | Introduction | |||
| ============ | ============ | |||
| This document defines DNS over CoAP (DoC), a protocol to send DNS | This document defines DNS over CoAP (DoC), a protocol to send DNS | |||
| {{-dns}} queries and get DNS responses over the Constrained Application | {{-dns}} queries and get DNS responses over the Constrained Application | |||
| Protocol (CoAP) {{-coap}} using OPCODE 0 (Query). Each DNS query-response pair is map ped into a | Protocol (CoAP) {{-coap}} using OPCODE 0 (Query). Each DNS query-response pair is map ped into a | |||
| CoAP message exchange. Each CoAP message can be secured by DTLS 1.2 or newer {{-dtls1 2}} {{-dtls13}} | CoAP message exchange. Each CoAP message can be secured by DTLS 1.2 or newer {{-dtls1 2}} {{-dtls13}} | |||
| as well as Object Security for Constrained RESTful Environments (OSCORE) {{-oscore}} | as well as Object Security for Constrained RESTful Environments (OSCORE) {{-oscore}} | |||
| but also TLS 1.3 or newer {{-coap-tcp}} {{?RFC8446}} | and TLS 1.3 or newer {{-coap-tcp}} {{?RFC8446}} | |||
| to ensure message integrity and confidentiality. | to ensure message integrity and confidentiality. | |||
| The application use case of DoC is inspired by DNS over HTTPS {{-doh}} | The application use case of DoC is inspired by DNS over HTTPS (DoH) {{-doh}}. | |||
| (DoH). DoC, however, aims for deployment in the constrained Internet of | However, DoC aims for deployment in the constrained Internet of | |||
| Things (IoT), which usually conflicts with the requirements introduced by | Things (IoT), which usually conflicts with the requirements introduced by | |||
| HTTPS. | HTTPS. | |||
| Constrained IoT devices may be restricted in memory, power consumption, | Constrained IoT devices may be restricted in memory, power consumption, | |||
| link-layer frame sizes, throughput, and latency. They may | link-layer frame sizes, throughput, and latency. They may | |||
| only have a handful kilobytes of both RAM and ROM. They may sleep for long | only have a handful kilobytes of both RAM and ROM. They may sleep for long | |||
| durations of time, after which they need to refresh the named resources they | durations of time, after which they need to refresh the named resources they | |||
| know about. Name resolution in such scenarios must take into account link | know about. Name resolution in such scenarios must take into account link-layer | |||
| layer frame sizes of only a few hundred bytes, bit rates in the magnitude | frame sizes of only a few hundred bytes, bit rates in the magnitude | |||
| of kilobits per second, and latencies of several seconds {{-constr-nodes}} {{-constr- | of kilobits per second, and latencies of several seconds {{-constr-nodes}} {{I-D.ietf | |||
| nodes-bis}} [^remove-constr-nodes]. | -iotops-7228bis}}. | |||
| [^remove-constr-nodes]: RFC Ed.: Please remove the {{-constr-nodes}} reference and re | <!--[rfced] FYI: draft-ietf-iotops-7228bis has not been published yet | |||
| place it with {{-constr-nodes-bis}} throughout the document in case {{-constr-nodes-b | (currently, its IESG state is "I-D Exists"). Thus, we have left | |||
| is}} becomes an RFC before publication. | references to RFC 7228 and draft-ietf-iotops-7228bis as is. | |||
| Author note: | ||||
| Please remove the {{-constr-nodes}} reference and replace | ||||
| it with {{I-D.ietf-iotops-7228bis}} throughout the document in case | ||||
| {{I-D.ietf-iotops-7228bis}} becomes an RFC before publication. | ||||
| --> | ||||
| In order not to be burdened by the resource requirements of TCP and HTTPS, constraine d IoT devices could use DNS over DTLS {{-dodtls}}. | In order not to be burdened by the resource requirements of TCP and HTTPS, constraine d IoT devices could use DNS over DTLS {{-dodtls}}. | |||
| In contrast to DNS over DTLS, DoC | In contrast to DNS over DTLS, DoC | |||
| can take advantage of CoAP features to mitigate drawbacks of datagram-based | can take advantage of CoAP features to mitigate drawbacks of datagram-based | |||
| communication. These features include: block-wise transfer {{-coap-blockwise}}, which | communication. These features include (1) block-wise transfer {{-coap-blockwise}}, wh | |||
| solves | ich solves | |||
| the Path MTU problem of DNS over DTLS (see {{-dodtls, Section 5}}); CoAP | the Path MTU problem of DNS over DTLS (see {{-dodtls, Section 5}}), (2) CoAP | |||
| proxies, which provide an additional level of caching; re-use of data | proxies, which provide an additional level of caching, and (3) reuse of data | |||
| structures for application traffic and DNS information, which saves memory | structures for application traffic and DNS information, which saves memory | |||
| on constrained devices. | on constrained devices. | |||
| To avoid the resource requirements of DTLS or TLS on top of UDP (e.g., introduced by DNS over DTLS {{-dodtls}} or DNS over QUIC {{-doq}}), DoC allows for lightweight mess age protection based on OSCORE. | To avoid the resource requirements of DTLS or TLS on top of UDP (e.g., introduced by DNS over DTLS {{-dodtls}} or DNS over QUIC {{-doq}}), DoC allows for lightweight mess age protection based on OSCORE. | |||
| ~~~ aasvg | ~~~ aasvg | |||
| . FETCH coaps://[2001:db8::1]/ | . FETCH coaps://[2001:db8::1]/ | |||
| / | / | |||
| / | / | |||
| CoAP request | CoAP request | |||
| +------+ [DNS query] +------+------+ DNS query .---------------. | +------+ [DNS query] +------+------+ DNS query .---------------. | |||
| | DoC |---------------->| DoC | DNS |--- --- --- --->| DNS | | | DoC |---------------->| DoC | DNS |--- --- --- --->| DNS | | |||
| |Client|<----------------|Server|Client|<--- --- --- ---| Infrastructure | | |Client|<----------------|Server|Client|<--- --- --- ---| Infrastructure | | |||
| +------+ CoAP response +------+------+ DNS response '---------------' | +------+ CoAP response +------+------+ DNS response '---------------' | |||
| [DNS response] | [DNS response] | |||
| \ / \ / | \ / \ / | |||
| '------DNS over CoAP------' '----DNS over UDP/HTTPS/QUIC/...----' | '------DNS over CoAP------' '----DNS over UDP/HTTPS/QUIC/...----' | |||
| ~~~ | ~~~ | |||
| {: #fig-overview-arch title="Basic DoC architecture"} | {: #fig-overview-arch title="Basic DoC Architecture"} | |||
| <!--[rfced] FYI - We updated "authoritive name server" to "authoritative name | ||||
| server" to match other usage in this document and in other RFCs. | ||||
| Original: | ||||
| That DoC server can be the authoritive name server for the queried | ||||
| record or a DNS client (i.e., a stub or recursive resolver) that | ||||
| resolves DNS information by using other DNS transports such as DNS | ||||
| over UDP [STD13], DNS over HTTPS [RFC8484], or DNS over QUIC | ||||
| [RFC9250] when communicating with the upstream DNS infrastructure. | ||||
| Updated: | ||||
| That DoC server can be the authoritative name server for the queried | ||||
| record or a DNS client (i.e., a stub or recursive resolver) that | ||||
| resolves DNS information by using other DNS transports such as DNS | ||||
| over UDP [STD13], DNS over HTTPS [RFC8484], or DNS over QUIC | ||||
| [RFC9250] when communicating with the upstream DNS infrastructure. | ||||
| --> | ||||
| The most important components of DoC can be seen in {{fig-overview-arch}}: a DoC | The most important components of DoC can be seen in {{fig-overview-arch}}: a DoC | |||
| client tries to resolve DNS information by sending DNS queries carried within | client tries to resolve DNS information by sending DNS queries carried within | |||
| CoAP requests to a DoC server. | CoAP requests to a DoC server. | |||
| That DoC server can be the authoritive name server for the queried record or a DNS cl ient (i.e., a stub or recursive resolver) that resolves DNS information by using othe r DNS transports such | That DoC server can be the authoritative name server for the queried record or a DNS client (i.e., a stub or recursive resolver) that resolves DNS information by using ot her DNS transports such | |||
| as DNS over UDP {{-dns}}, DNS over HTTPS {{-doh}}, or DNS over QUIC {{-doq}} when com municating with the upstream | as DNS over UDP {{-dns}}, DNS over HTTPS {{-doh}}, or DNS over QUIC {{-doq}} when com municating with the upstream | |||
| DNS infrastructure. | DNS infrastructure. | |||
| Using that information, the DoC server then replies to the queries of the DoC client with DNS | Using that information, the DoC server then replies to the queries of the DoC client with DNS | |||
| responses carried within CoAP responses. | responses carried within CoAP responses. | |||
| A DoC server MAY also serve as DNSSEC validator to provide DNSSEC validation to the m ore | A DoC server MAY also serve as a DNSSEC validator to provide DNSSEC validation to the more | |||
| constrained DoC clients. | constrained DoC clients. | |||
| Note that this specification is distinct from DoH, since the CoAP-specific FETCH meth | Note that this specification is distinct from DoH because the CoAP-specific FETCH met | |||
| od {{-coap-fetch}} is used. | hod {{-coap-fetch}} is used. | |||
| This has the benefit of having the DNS query in the body as when using the POST metho | A benefit of using this method is having the DNS query in the body such as when using | |||
| d, but still with the same caching advantages of responses to requests that use the G | the POST method, but with the same caching advantages of responses to requests that | |||
| ET method. | use the GET method. | |||
| Having the DNS query in the body means that we do not need extra base64 encoding, whi | Having the DNS query in the body means that there is no need for extra base64 encodin | |||
| ch would increase | g, which would increase | |||
| code complexity and message sizes. | code complexity and message sizes. | |||
| Also, this allows for the block-wise transfer of queries {{-coap-blockwise}}. | Also, this allows for the block-wise transfer of queries {{-coap-blockwise}}. | |||
| Terminology and Conventions | Terminology and Conventions | |||
| =========================== | =========================== | |||
| {::boilerplate bcp14-tagged} | {::boilerplate bcp14-tagged} | |||
| A server that provides the service specified in this document is called a "DoC | A server that provides the service specified in this document is called a "DoC | |||
| server" to differentiate it from a classic "DNS server". | server" to differentiate it from a classic "DNS server". | |||
| A DoC server acts either as a DNS stub resolver or a DNS recursive resolver {{-dns-te rminology}}. | A DoC server acts as either a DNS stub resolver or a DNS recursive resolver {{-dns-te rminology}}. | |||
| As such, the DoC server communicates with an "upstream DNS infrastructure" or a singl e "upstream DNS server". | As such, the DoC server communicates with an "upstream DNS infrastructure" or a singl e "upstream DNS server". | |||
| A "DoC resource" is a CoAP resource {{-coap}} at the DoC server that DoC clients can target to send a DNS query in a CoAP request. | A "DoC resource" is a CoAP resource {{-coap}} at the DoC server that DoC clients can target in order to send a DNS query in a CoAP request. | |||
| A client using the service specified in this document to retrieve the | A client using the service specified in this document to retrieve | |||
| DNS information is called a "DoC client". | the DNS information is called a "DoC client". | |||
| The term "constrained nodes" is used as defined in {{-constr-nodes}}. | The term "constrained nodes" is used as defined in {{-constr-nodes}}. | |||
| {{-core-link-format}} describes that "Constrained RESTful Environments (CoRE)" realiz e the Representational State Transfer (REST) architecture {{REST}} in a suitable form for such constrained nodes. | {{-core-link-format}} describes that Constrained RESTful Environments (CoRE) realize the Representational State Transfer (REST) architecture {{REST}} in a suitable form f or such constrained nodes. | |||
| A DoC server can provide Observe capabilities as defined in {{-coap-observe, Section 1.2}}. | A DoC server can provide Observe capabilities as defined in {{-coap-observe, Section 1.2}}. | |||
| As part of that, it administers a "list of observers". | As part of that, it administers a "list of observers". DoC clients using these capabi | |||
| DoC clients using these capabilities are "observers" as defined in {{-coap-observe, S | lities are "observers" as defined in {{-coap-observe, Section 1.2}}. | |||
| ection 1.2}} in that case. | A "notification" is a CoAP response message with an Observe option; see {{-coap-obser | |||
| A "notification" is a CoAP response message with an Observe option, see {{-coap-obser | ve, Section 4.2}}. | |||
| ve, Section 4.2}}. | ||||
| The terms "payload" and "body" are used as defined in {{-coap-blockwise, Section 2}}. | The terms "payload" and "body" are used as defined in {{-coap-blockwise, Section 2}}. | |||
| Note that, when block-wise transfer is not used, the terms "payload" and "body" are t o be understood as equal. | Note that, when block-wise transfer is not used, the terms "payload" and "body" are t o be understood as equal. | |||
| For better readability, in the examples in this document the binary payload and resou | In the examples in this document, the binary payload and resource records are shown i | |||
| rce records are shown in a hexadecimal representation as well as a human-readable for | n a hexadecimal representation as well as a human-readable format for better readabil | |||
| mat. | ity. However, in the actual message sent and received, they are encoded in the binary | |||
| In the actual message sent and received, however, they are encoded in the binary mess | message format defined in {{-dns}}. | |||
| age format defined in {{-dns}}. | ||||
| Selection of a DoC Server {#sec:doc-server-selection} | Selection of a DoC Server {#sec:doc-server-selection} | |||
| ========================= | ========================= | |||
| While there is no path specified for the DoC resource, it is RECOMMENDED to use the r oot path "/" | While there is no path specified for the DoC resource, it is RECOMMENDED to use the r oot path "/" | |||
| to keep the CoAP requests small. | to keep the CoAP requests small. | |||
| The DoC client needs to know the DoC server and the DoC resource at the DoC server. | The DoC client needs to know the DoC server and the DoC resource at the DoC server. | |||
| Possible options to assure this could be manual configuration of a Uniform Resource I | Possible options to assure this could be (1) manual configuration of a Uniform Resour | |||
| dentifier (URI) {{-uri}} or Constrained Resource Identifier (CRI) {{-cri}}, | ce Identifier (URI) {{-uri}} or Constrained Resource Identifier (CRI) {{I-D.ietf-core | |||
| or automatic configuration, e.g., using a CoRE resource directory | -href}} | |||
| or (2) automatic configuration, e.g., using a CoRE resource directory | ||||
| {{-core-rd}}, DHCP or Router Advertisement options {{-dnr}}, or discovery of designat ed resolvers | {{-core-rd}}, DHCP or Router Advertisement options {{-dnr}}, or discovery of designat ed resolvers | |||
| {{-ddr}}. | {{-ddr}}. | |||
| Automatic configuration MUST only be done from a trusted source. | Automatic configuration MUST only be done from a trusted source. | |||
| ## Discovery by Resource Type | ## Discovery by Resource Type | |||
| For discovery of the DoC resource through a link mechanism that allows describing a r esource type | For discovery of the DoC resource through a link mechanism that allows describing a r esource type | |||
| (e.g., the Resource Type attribute in {{-core-link-format}}), this document introduce s the resource type "core.dns". | (e.g., the Resource Type attribute in {{-core-link-format}}), this document introduce s the resource type "core.dns". | |||
| It can be used to identify a generic DNS resolver that is available to the client. | It can be used to identify a generic DNS resolver that is available to the client. | |||
| ## Discovery using SVCB Resource Records or DNR | ## Discovery Using SVCB Resource Records or DNR | |||
| A DoC server can also be discovered using Service Binding (SVCB) Resource Records (RR | A DoC server can also be discovered using Service Binding (SVCB) Resource Records (RR | |||
| ) {{-svcb}} {{-svcb-dns}} resolved via another DNS service (e.g., provided by an unen | s) {{-svcb}} {{-svcb-dns}} resolved via another DNS service (e.g., provided by an une | |||
| crypted local resolver) or Discovery of Network-designated Resolvers (DNR) | ncrypted local resolver) or Discovery of Network-designated Resolvers (DNR) | |||
| Service Parameters {{-dnr}} via DHCP or Router Advertisements. | Service Parameters {{-dnr}} via DHCP or Router Advertisements. | |||
| {{-coap-tcp}} defines the Application-Layer Protocol Negotiation (ALPN) ID for CoAP o | {{-coap-tcp}} defines the Application-Layer Protocol Negotiation (ALPN) ID for CoAP o | |||
| ver TLS servers and {{-coap-dtls-alpn}} defines the ALPN ID for CoAP over DTLS server | ver TLS servers and {{PRE-RFC9952}} defines the ALPN ID for CoAP over DTLS servers. | |||
| s. | DoC servers that use only OSCORE {{-oscore}} and Ephemeral Diffie-Hellman Over COSE ( | |||
| DoC servers that use only OSCORE {{-oscore}} and Ephemeral Diffie-Hellman Over COSE ( | EDHOC) {{-edhoc}} (COSE stands for "Concise Binary Object Notation (CBOR) Object Sign | |||
| EDHOC) {{-edhoc}} (with COSE abbreviating "Concise Binary Object Notation (CBOR) Obje | ing and Encryption" {{?RFC9052}}) to support security cannot be discovered using thes | |||
| ct Signing and Encryption" {{?RFC9052}}) to support security cannot be discovered usi | e SVCB RR or DNR mechanisms. | |||
| ng these SVCB RR or DNR mechanisms. | Specifying an alternate discovery mechanism is out of the scope of this document. | |||
| Specifying an alternate discovery mechanism is out of scope of this document. | ||||
| This document is not an SVCB mapping document for the CoAP schemes | This document is not an SVCB mapping document for the CoAP schemes | |||
| as defined in {{Section 2.4.3 of -svcb}}. | as defined in {{Section 2.4.3 of -svcb}}. | |||
| A full SVCB mapping is specified in {{-transport-indication}}. | A full SVCB mapping is specified in {{I-D.ietf-core-transport-indication}}. | |||
| It generalizes mechanisms for all CoAP services. | It generalizes mechanisms for all CoAP services. | |||
| This document introduces only the discovery of DoC services. | This document introduces only the discovery of DoC services. | |||
| This document specifies "docpath" as | This document specifies "docpath" as | |||
| a single-valued SvcParamKey that is mandatory for DoC SVCB records. | a single-valued Service Parameter Key (SvcParamKey) that is mandatory for DoC SVCB re cords. | |||
| If the "docpath" SvcParamKey is absent, the service should not be considered a valid DoC service. | If the "docpath" SvcParamKey is absent, the service should not be considered a valid DoC service. | |||
| The docpath is devided up into segments of the absolute path to the DoC resource (doc path-segment), | The docpath is divided up into segments of the absolute path to the DoC resource (doc path-segment), | |||
| each a sequence of 1-255 octets. | each a sequence of 1-255 octets. | |||
| In ABNF {{-abnf}}: | In ABNF {{-abnf}}: | |||
| ~~~ | ~~~ abnf | |||
| docpath-segment = 1*255OCTET | docpath-segment = 1*255OCTET | |||
| ~~~ | ~~~ | |||
| Note that this restricts the length of each docpath-segment to at most 255 octets. | Note that this restricts the length of each docpath-segment to at most 255 octets. | |||
| Paths with longer segments cannot be advertised with the "docpath" SvcParam and are t hus NOT | Paths with longer segments cannot be advertised with the "docpath" SvcParam and are t hus NOT | |||
| RECOMMENDED for the path to the DoC resource. | RECOMMENDED for the path to the DoC resource. | |||
| The presentation format value of "docpath" SHALL be a comma-separated list ({{Appendi x A.1 of -svcb}}) | The presentation format value of "docpath" SHALL be a comma-separated list ({{Appendi x A.1 of -svcb}}) | |||
| of 0 or more docpath-segments. | of 0 or more docpath-segments. | |||
| The root path "/" is represented by 0 docpath-segments, i.e., an empty list. | The root path "/" is represented by 0 docpath-segments, i.e., an empty list. | |||
| The same considerations for the "," and "\" characters in docpath-segments for zone-f | The same considerations apply for the "," and "\" characters in docpath-segments for | |||
| ile | zone-file | |||
| implementations as for the alpn-ids in an "alpn" SvcParam apply ({{Section 7.1.1 of - | implementations and the alpn-ids in an "alpn" SvcParam ({{Section 7.1.1 of -svcb}}). | |||
| svcb}}). | ||||
| The wire-format value for "docpath" consists of 0 or more sequences of octets prefixe d by their | The wire-format value for "docpath" consists of 0 or more sequences of octets prefixe d by their | |||
| respective length as a single octet. | respective length as a single octet. | |||
| We call this single octet the length octet. | We call this single octet the length octet. | |||
| The length octet and the corresponding sequence form a length-value pair. | The length octet and the corresponding sequence form a length-value pair. | |||
| These length-value pairs are concatenated to form the SvcParamValue. | These length-value pairs are concatenated to form the SvcParamValue. | |||
| These pairs MUST exactly fill the SvcParamValue; otherwise, the SvcParamValue is malf ormed. | These pairs MUST exactly fill the SvcParamValue; otherwise, the SvcParamValue is malf ormed. | |||
| Each such length-value pair represents one segment of the absolute path to the DoC re source. | Each such length-value pair represents one segment of the absolute path to the DoC re source. | |||
| The root path "/" is represented by 0 length-value pairs, i.e., SvcParamValue length 0. | The root path "/" is represented by 0 length-value pairs, i.e., SvcParamValue length 0. | |||
| Note that this format uses the same encoding as the "alpn" SvcParam and can reuse the | <!-- [rfced] Please clarify "is of length 0 and 24 octets" in this sentence. | |||
| Original: | ||||
| As long as each docpath- | ||||
| segment is of length 0 and 24 octets, it is easily transferred into | ||||
| the path representation in CRIs [I-D.ietf-core-href] by masking each | ||||
| length octet with the CBOR text string major type 3 (0x60 as an | ||||
| octet, see [RFC8949]). | ||||
| Perhaps: | ||||
| As long as each docpath- | ||||
| segment has a length between 0 and 24 octets, it is easily transferred into | ||||
| the path representation in CRIs [CRI] by masking each length octet | ||||
| with the CBOR text string major type 3 (0x60 as an octet; see | ||||
| [RFC8949]). | ||||
| --> | ||||
| <!--[rfced] We are having trouble parsing this sentence. Please let us | ||||
| know if it can be revised as shown below for clarity. | ||||
| Original: | ||||
| Likewise, it can be transferred into a URI path-abempty form by | ||||
| replacing each length octet with the "/" character None of the | ||||
| abovementioned prevent longer docpath-segments than the considered, | ||||
| they just make the translation harder, as they require to make space | ||||
| for the longer delimiters, in turn requiring to move octets. | ||||
| Perhaps: | ||||
| Likewise, it can be transferred into a URI path-abempty form by | ||||
| replacing each length octet with the "/" character. None of the | ||||
| abovementioned prevent longer docpath-segments than the considered | ||||
| ones; they just make the translation harder as space is required | ||||
| for the longer delimiters, which in turn require octets to be | ||||
| moved. | ||||
| --> | ||||
| <!-- [rfced] May we update "going through" to "with" here to improve clarity? | ||||
| Original: | ||||
| The construction algorithm for DoC | ||||
| requests is as follows, going through the provided records in order | ||||
| of their priority. | ||||
| Perhaps: | ||||
| The construction algorithm for DoC | ||||
| requests is as follows, with the provided records in order | ||||
| of their priority. | ||||
| --> | ||||
| Note that this format uses the same encoding as the "alpn" SvcParam, and it can reuse | ||||
| the | ||||
| decoders and encoders for that SvcParam with the adaption that a length of zero is al lowed. | decoders and encoders for that SvcParam with the adaption that a length of zero is al lowed. | |||
| As long as each docpath-segment is of length 0 and 24 octets, it is easily transferre d into the path | As long as each docpath-segment is of length 0 and 24 octets, it is easily transferre d into the path | |||
| representation in CRIs {{-cri}} by masking each length octet with the CBOR text strin | representation in CRIs {{I-D.ietf-core-href}} by masking each length octet with the C | |||
| g major type 3 | BOR text string major type 3 | |||
| (`0x60` as an octet, see {{-cbor}}). | (`0x60` as an octet; see {{-cbor}}). | |||
| Furthermore, it is easily transferable into a sequence of CoAP Uri-Path options by | Furthermore, it is easily transferable into a sequence of CoAP Uri-Path options by | |||
| mapping each length octet into the Option Delta and Option Length of the correspondin g CoAP Uri-Path | mapping each length octet into the Option Delta and Option Length of the correspondin g CoAP Uri-Path | |||
| option, provided the docpath-segments are all of a length between 0 and 12 octets (se e {{-coap, | option, provided the docpath-segments are all of a length between 0 and 12 octets (se e {{-coap, | |||
| Section 3.1}}). | Section 3.1}}). Likewise, it can be transferred into a URI path-abempty form by repla | |||
| Likewise, it can be transferred into a URI path-abempty form by replacing each length | cing each length octet with the "/" character | |||
| octet with the "/" character | ||||
| None of the abovementioned prevent longer docpath-segments than the considered, they just make the | None of the abovementioned prevent longer docpath-segments than the considered, they just make the | |||
| translation harder, as they require to make space for the longer delimiters, in turn requiring to move octets. | translation harder, as they require to make space for the longer delimiters, in turn requiring to move octets. | |||
| To use the service binding from an SVCB RR or DNR Encrypted DNS option, the DoC clien t MUST send a DoC request constructed from the SvcParams including "docpath". | To use the service binding from an SVCB RR or DNR Encrypted DNS option, the DoC clien t MUST send a DoC request constructed from the SvcParams including "docpath". | |||
| The construction algorithm for DoC requests is as follows, going through the provided records in order of their priority. | The construction algorithm for DoC requests is as follows, going through the provided records in order of their priority. | |||
| For the purposes of this algorithm, the DoC client is assumed to be SVCB-optional (se e {{Section 3 of -svcb}}). | For the purposes of this algorithm, the DoC client is assumed to be SVCB-optional (se e {{Section 3 of -svcb}}). | |||
| <!-- [rfced] How may we update the third item in the series for parallel | ||||
| structure? Would either removing "from" or adding "information" be correct? | ||||
| Original: | ||||
| This may include (1) A | ||||
| or AAAA RRs associated with the target name and delivered with the | ||||
| SVCB RR (see [RFC9462]), (2) "ipv4hint" or "ipv6hint" SvcParams | ||||
| from the SVCB RR (see [RFC9461]), or (3) from IPv4 or IPv6 | ||||
| addresses provided if DNR [RFC9463] is used. | ||||
| Perhaps A (cut "from"): | ||||
| This may include (1) A | ||||
| or AAAA RRs associated with the target name and delivered with the | ||||
| SVCB RR (see [RFC9462]), (2) "ipv4hint" or "ipv6hint" SvcParams | ||||
| from the SVCB RR (see [RFC9461]), or (3) IPv4 or IPv6 | ||||
| addresses provided if DNR [RFC9463] is used. | ||||
| or | ||||
| Perhaps B (add "information"): | ||||
| This may include (1) A | ||||
| or AAAA RRs associated with the target name and delivered with the | ||||
| SVCB RR (see [RFC9462]), (2) "ipv4hint" or "ipv6hint" SvcParams | ||||
| from the SVCB RR (see [RFC9461]), or (3) information from IPv4 or IPv6 | ||||
| addresses provided if DNR [RFC9463] is used. | ||||
| --> | ||||
| - If the "alpn" SvcParam value for the service is "coap", a CoAP request for CoAP ove r TLS MUST be constructed {{-coap-tcp}}. | - If the "alpn" SvcParam value for the service is "coap", a CoAP request for CoAP ove r TLS MUST be constructed {{-coap-tcp}}. | |||
| If it is "co", a CoAP request for CoAP over DTLS MUST be constructed {{-coap-dtls-a lpn}}. | If it is "co", a CoAP request for CoAP over DTLS MUST be constructed {{PRE-RFC9952} }. | |||
| Any other SvcParamKeys specifying a transport are out of the scope of this document . | Any other SvcParamKeys specifying a transport are out of the scope of this document . | |||
| - The destination address for the request SHOULD be taken from additional information about the target. | - The destination address for the request SHOULD be taken from additional information about the target. | |||
| This may include (1) A or AAAA RRs associated with the target name and delivered wi th the SVCB RR (see {{-ddr}}), (2) "ipv4hint" or "ipv6hint" SvcParams from the SVCB R R (see {{-svcb-dns}}), or (3) from IPv4 or IPv6 addresses provided if DNR {{-dnr}} is used. | This may include (1) A or AAAA RRs associated with the target name and delivered wi th the SVCB RR (see {{-ddr}}), (2) "ipv4hint" or "ipv6hint" SvcParams from the SVCB R R (see {{-svcb-dns}}), or (3) from IPv4 or IPv6 addresses provided if DNR {{-dnr}} is used. | |||
| As a fallback, an address MAY be queried for the target name of the SVCB record fro m another DNS service. | As a fallback, an address MAY be queried for the target name of the SVCB record fro m another DNS service. | |||
| - The destination port for the request MUST be taken from the "port" SvcParam value, if present. | - The destination port for the request MUST be taken from the "port" SvcParam value, if present. | |||
| Otherwise, take the default port of the CoAP transport, e.g., with regards to this specification TCP port 5684 for "coap" or UDP port 5684 for "co". | Otherwise, take the default port of the CoAP transport, e.g., with regards to this specification, the default is TCP port 5684 for "coap" or UDP port 5684 for "co". | |||
| This document introduces no limitations on the ports that can be used. | This document introduces no limitations on the ports that can be used. | |||
| If a malicious SVCB record allows its originator to influence message payloads, {{S ection 12 of -svcb}} recommends placing such restrictions in the SVCB mapping documen t. | If a malicious SVCB record allows its originator to influence message payloads, {{S ection 12 of -svcb}} recommends placing such restrictions in the SVCB mapping documen t. | |||
| The records used in this document only infuence the Uri-Path option. | The records used in this document only influence the Uri-Path option. | |||
| That option is only sent in the plaintext of an encrytped (D)TLS channel, | That option is only sent in the plaintext of an encrypted (D)TLS channel | |||
| and thus does not warrant any limitations. | and thus does not warrant any limitations. | |||
| - The request URI's hostname component MUST be the Authentication Domain Name (ADN) w hen obtained through DNR | - The request URI's hostname component MUST be the Authentication Domain Name (ADN) w hen obtained through DNR | |||
| and MUST be the target name of the SVCB record when obtained through a `_dns` query | and MUST be the target name of the SVCB record when obtained through a `_dns` query | |||
| (if AliasMode is used, to the target name of the AliasMode record). | (if AliasMode is used to the target name of the AliasMode record). | |||
| This can be achieved efficiently by setting that name in TLS Server Name Indication | This can be achieved efficiently by setting that name in TLS Server Name Indication | |||
| (SNI) {{?RFC8446}}, | (SNI) {{?RFC8446}} | |||
| or by setting the Uri-Host option on each request. | or by setting the Uri-Host option on each request. | |||
| - For each element in the CBOR sequence of the "docpath" SvcParam value, a Uri-Path o ption MUST be added to the request. | - For each element in the CBOR sequence of the "docpath" SvcParam value, a Uri-Path o ption MUST be added to the request. | |||
| - If the request constructed this way receives a response, the same SVCB record MUST be used for construction of future DoC queries. | - If the request constructed this way receives a response, the same SVCB record MUST be used for construction of future DoC queries. | |||
| If not, or if the endpoint becomes unreachable, the algorithm repeats with the SVCB RR or DNR Encrypted DNS option with the next highest Service Priority as a fallback (see {{Sections 2.4.1 and 3 of -svcb}}). | If not, or if the endpoint becomes unreachable, the algorithm repeats with the SVCB RR or DNR Encrypted DNS option with the next highest Service Priority as a fallback (see {{Sections 2.4.1 and 3 of -svcb}}). | |||
| A more generalized construction algorithm for any CoAP request can be found in {{-tra nsport-indication}}. | A more generalized construction algorithm for any CoAP request can be found in {{I-D. ietf-core-transport-indication}}. | |||
| ### Examples | ### Examples | |||
| [^replace-hex] | <!--[rfced] Per the following note, we have replaced "ff 0a" with "00 0a" in | |||
| the examples in Section 3.2.1 (per IANA's assignment of "10" for | ||||
| "docpath"). Please confirm that this is correct and let us know if any further | ||||
| updates are needed. | ||||
| [^replace-hex]: RFC Ed.: Since the number for "docpath" was not assigned at the time | Author note: | |||
| of writing, we | Since the number for "docpath" was not assigned at the time of | |||
| used the hex `ff 0a` (in decimal 65290; from the private use range of SvcParamKey | writing, we used the hex `ff 0a` (in decimal 65290; from the | |||
| s) throughout | private use range of SvcParamKeys) throughout this section. Before | |||
| this section. Before publication, please replace `ff 0a` with the hexadecimal rep | publication, please replace `ff 0a` with the hexadecimal | |||
| resentation of | representation of the final value assigned by IANA in this | |||
| the final value assigned by IANA in this section. Please remove this paragraph af | section. Please remove this paragraph after that. | |||
| ter that. | --> | |||
| A typical SVCB resource record response for a DoC server at the root path "/" of the server looks | A typical SVCB resource record response for a DoC server at the root path "/" of the server looks | |||
| like the following (the "docpath" SvcParam is the last 4 bytes `ff 0a 00 00` in the b inary): | like the following (the "docpath" SvcParam is the last 4 bytes `00 0a 00 00` in the b inary): | |||
| Resource record (binary): | ~~~ | |||
| 04 5f 64 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 | Resource record (binary): | |||
| 67 00 00 40 00 01 00 00 06 28 00 1e 00 01 03 64 | 04 5f 64 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 | |||
| 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 00 | 67 00 00 40 00 01 00 00 06 28 00 1e 00 01 03 64 | |||
| 01 00 03 02 63 6f ff 0a 00 00 | 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 00 | |||
| 01 00 03 02 63 6f 00 0a 00 00 | ||||
| Resource record (human-readable): | Resource record (human-readable): | |||
| _dns.example.org. 1576 IN SVCB 1 dns.example.org ( | _dns.example.org. 1576 IN SVCB 1 dns.example.org ( | |||
| alpn=co docpath ) | alpn=co docpath ) | |||
| ~~~ | ||||
| {: gi="sourcecode"} | ||||
| The root path is RECOMMENDED but not required. Here are two examples where the "docpa th" represents | The root path is RECOMMENDED but not required. Here are two examples where the "docpa th" represents | |||
| paths of varying depth. First, "/dns" is provided in the following example | paths of varying depth. First, "/dns" is provided in the following example | |||
| (the last 8 bytes `ff 0a 00 04 03 64 6e 73`): | (the last 8 bytes `00 0a 00 04 03 64 6e 73`): | |||
| Resource record (binary): | ~~~ | |||
| 04 5f 64 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 | Resource record (binary): | |||
| 67 00 00 40 00 01 00 00 00 55 00 22 00 01 03 64 | 04 5f 64 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 | |||
| 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 00 | 67 00 00 40 00 01 00 00 00 55 00 22 00 01 03 64 | |||
| 01 00 03 02 63 6f ff 0a 00 04 03 64 6e 73 | 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 00 | |||
| 01 00 03 02 63 6f 00 0a 00 04 03 64 6e 73 | ||||
| Resource record (human-readable): | Resource record (human-readable): | |||
| _dns.example.org. 85 IN SVCB 1 dns.example.org ( | _dns.example.org. 85 IN SVCB 1 dns.example.org ( | |||
| alpn=co docpath=dns ) | alpn=co docpath=dns ) | |||
| ~~~ | ||||
| {: gi="sourcecode"} | ||||
| Second, an examples for the path "/n/s" (the last 8 bytes `ff 0a 00 04 01 6e 01 73`): | Second, see an example for the path "/n/s" (the last 8 bytes `00 0a 00 04 01 6e 01 73 `): | |||
| Resource record (binary): | ~~~ | |||
| 04 5f 64 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 | Resource record (binary): | |||
| 67 00 00 40 00 01 00 00 06 6b 00 22 00 01 03 64 | 04 5f 64 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 | |||
| 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 00 | 67 00 00 40 00 01 00 00 06 6b 00 22 00 01 03 64 | |||
| 01 00 03 02 63 6f ff 0a 00 04 01 6e 01 73 | 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 00 | |||
| 01 00 03 02 63 6f 00 0a 00 04 01 6e 01 73 | ||||
| Resource record (human-readable): | Resource record (human-readable): | |||
| _dns.example.org. 643 IN SVCB 1 dns.example.org ( | _dns.example.org. 643 IN SVCB 1 dns.example.org ( | |||
| alpn=co docpath=n,s ) | alpn=co docpath=n,s ) | |||
| ~~~ | ||||
| {: gi="sourcecode"} | ||||
| If the server also provides DNS over HTTPS, "dohpath" and "docpath" MAY co-exist: | If the server also provides DNS over HTTPS, "dohpath" and "docpath" MAY coexist: | |||
| Resource record (binary): | ~~~ | |||
| 04 5f 64 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 | Resource record (binary): | |||
| 67 00 00 40 00 01 00 00 01 ad 00 2b 00 01 03 64 | 04 5f 64 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 | |||
| 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 00 | 67 00 00 40 00 01 00 00 01 ad 00 2b 00 01 03 64 | |||
| 01 00 06 02 68 33 02 63 6f 00 07 00 07 2f 7b 3f | 6e 73 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 00 | |||
| 64 6e 73 7d ff 0a 00 00 | 01 00 06 02 68 33 02 63 6f 00 07 00 07 2f 7b 3f | |||
| 64 6e 73 7d 00 0a 00 00 | ||||
| Resource record (human-readable): | Resource record (human-readable): | |||
| _dns.example.org. 429 IN SVCB 1 dns.example.org ( | _dns.example.org. 429 IN SVCB 1 dns.example.org ( | |||
| alpn=h3,co dohpath=/{?dns} docpath ) | alpn=h3,co dohpath=/{?dns} docpath ) | |||
| ~~~ | ||||
| {: gi="sourcecode"} | ||||
| Basic Message Exchange | Basic Message Exchange | |||
| ====================== | ====================== | |||
| The "application/dns-message" Content-Format {#sec:content-format} | The "application/dns-message" Content-Format {#sec:content-format} | |||
| -------------------------------------------- | -------------------------------------------- | |||
| This document defines a CoAP Content-Format identifier for the Internet | This document defines a CoAP Content-Format ID for the Internet | |||
| media type "application/dns-message" to be the mnemonic 553 — based on the port assig | media type "application/dns-message" to be the mnemonic 553, based on the port assign | |||
| nment of DNS. | ment of DNS. | |||
| This media type is defined as in {{Section 6 of -doh}}, i.e., a single DNS message en coded in the DNS on-the-wire format {{-dns}}. | This media type is defined as in {{Section 6 of -doh}}, i.e., a single DNS message en coded in the DNS on-the-wire format {{-dns}}. | |||
| Both DoC client and DoC server MUST be able to parse contents in the "application/dns -message" Content-Format. | Both DoC client and DoC server MUST be able to parse contents in the "application/dns -message" Content-Format. | |||
| This document only specifies OPCODE 0 (Query) for DNS over CoAP messages. | This document only specifies OPCODE 0 (Query) for DNS over CoAP messages. | |||
| Future documents can provide considerations for additional OPCODEs or extend its spec ification (e.g. by describing whether other CoAP codes need to be used for which OPCO DE). | Future documents can provide considerations for additional OPCODEs or extend its spec ification (e.g., by describing whether other CoAP codes need to be used for which OPC ODE). | |||
| Unless another error takes precedence, a DoC server uses RCODE = 4, NotImp {{-dns}}, in its response to a query with an OPCODE that it does not implement (see also {{sec: resp-examples}}). | Unless another error takes precedence, a DoC server uses RCODE = 4, NotImp {{-dns}}, in its response to a query with an OPCODE that it does not implement (see also {{sec: resp-examples}}). | |||
| DNS Queries in CoAP Requests {#sec:queries} | DNS Queries in CoAP Requests {#sec:queries} | |||
| ---------------------------- | ---------------------------- | |||
| A DoC client encodes a single DNS query in one or more CoAP request | A DoC client encodes a single DNS query in one or more CoAP request | |||
| messages that use the CoAP FETCH {{-coap-fetch}} request method. | messages that use the CoAP FETCH {{-coap-fetch}} request method. | |||
| Requests SHOULD include an Accept option to indicate the type of content that can be parsed in the response. | Requests SHOULD include an Accept option to indicate the type of content that can be parsed in the response. | |||
| Since CoAP provides reliability at the message layer (e.g., through Confirmable messa ges) the retransmission mechanism of the | Since CoAP provides reliability at the message layer (e.g., through Confirmable messa ges), the retransmission mechanism of the | |||
| DNS protocol as defined in {{-dns}} is not needed. | DNS protocol as defined in {{-dns}} is not needed. | |||
| ### Request Format | ### Request Format | |||
| When sending a CoAP request, a DoC client MUST include the DNS query in the body of t he CoAP request. | When sending a CoAP request, a DoC client MUST include the DNS query in the body of t he CoAP request. | |||
| As specified in {{Section 2.3.1 of -coap-fetch}}, the type of content of the body MUS T be indicated using the Content-Format option. | As specified in {{Section 2.3.1 of -coap-fetch}}, the type of content of the body MUS T be indicated using the Content-Format option. | |||
| This document specifies the usage of Content-Format "application/dns-message" (for de tails, see {{sec:content-format}}). | This document specifies the usage of Content-Format "application/dns-message" (for de tails, see {{sec:content-format}}). | |||
| ### Support of CoAP Caching {#sec:req-caching} | ### Support of CoAP Caching {#sec:req-caching} | |||
| The DoC client SHOULD set the ID field of the DNS header to 0 to enable a CoAP cache | <!--[rfced] We note that "Cache-Key" appears as "cache key" in RFC | |||
| (e.g., a CoAP proxy en-route) to respond to the same DNS queries with a cache entry. | 8132. Would you like to match use in RFC 8132? | |||
| Original: | ||||
| This ensures that the CoAP Cache-Key (see [RFC8132], Section 2) | ||||
| does not change when multiple DNS queries for the same DNS data, | ||||
| carried in CoAP requests, are issued. | ||||
| Perhaps: | ||||
| This ensures that the CoAP cache key (see [RFC8132], Section 2) | ||||
| does not change when multiple DNS queries for the same DNS data, | ||||
| carried in CoAP requests, are issued. | ||||
| --> | ||||
| The DoC client SHOULD set the ID field of the DNS header to 0 to enable a CoAP cache | ||||
| (e.g., a CoAP proxy en route) to respond to the same DNS queries with a cache entry. | ||||
| This ensures that the CoAP Cache-Key (see {{-coap-fetch, Section 2}}) does not change when multiple DNS queries for the same DNS data, carried in CoAP requests, are issue d. | This ensures that the CoAP Cache-Key (see {{-coap-fetch, Section 2}}) does not change when multiple DNS queries for the same DNS data, carried in CoAP requests, are issue d. | |||
| Apart from losing these caching benefits, there is no harm it not setting it to 0, e. g., when the query was received from somewhere else. | Apart from losing these caching benefits, there is no harm in not setting it to 0, e. g., when the query was received from somewhere else. | |||
| In any instance, a DoC server MUST copy the ID from the query in its response to that query. | In any instance, a DoC server MUST copy the ID from the query in its response to that query. | |||
| ### Example {#sec:req-examples} | ### Example {#sec:req-examples} | |||
| The following example illustrates the usage of a CoAP message to | The following example illustrates the usage of a CoAP message to | |||
| resolve "example.org. IN AAAA" based on the URI "coaps://\[2001:db8::1\]/". The | resolve "example.org. IN AAAA" based on the URI "coaps://\[2001:db8::1\]/". The | |||
| CoAP body is encoded in the "application/dns-message" Content-Format. | CoAP body is encoded in the "application/dns-message" Content-Format. | |||
| FETCH coaps://[2001:db8::1]/ | ~~~ | |||
| Content-Format: 553 (application/dns-message) | FETCH coaps://[2001:db8::1]/ | |||
| Accept: 553 (application/dns-message) | Content-Format: 553 (application/dns-message) | |||
| Payload (binary): | Accept: 553 (application/dns-message) | |||
| 00 00 01 00 00 01 00 00 00 00 00 00 07 65 78 61 | Payload (binary): | |||
| 6d 70 6c 65 03 6f 72 67 00 00 1c 00 01 | 00 00 01 00 00 01 00 00 00 00 00 00 07 65 78 61 | |||
| 6d 70 6c 65 03 6f 72 67 00 00 1c 00 01 | ||||
| Payload (human-readable): | Payload (human-readable): | |||
| ;; ->>Header<<- opcode: QUERY, status: NOERROR, id: 0 | ;; ->>Header<<- opcode: QUERY, status: NOERROR, id: 0 | |||
| ;; flags: rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 | ;; flags: rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 | |||
| ;; QUESTION SECTION: | ;; QUESTION SECTION: | |||
| ;example.org. IN AAAA | ;example.org. IN AAAA | |||
| ~~~ | ||||
| {: gi="sourcecode"} | ||||
| DNS Responses in CoAP Responses | DNS Responses in CoAP Responses | |||
| ------------------------------- | ------------------------------- | |||
| Each DNS query-response pair is mapped to a CoAP request-response operation. | Each DNS query-response pair is mapped to a CoAP request-response operation. | |||
| DNS responses are provided in the body of the CoAP response, i.e., it is also possibl e to transfer them using block-wise transfer {{-coap-blockwise}}. | DNS responses are provided in the body of the CoAP response, i.e., it is also possibl e to transfer them using block-wise transfer {{-coap-blockwise}}. | |||
| A DoC server MUST be able to produce responses in the "application/dns-message" | A DoC server MUST be able to produce responses in the "application/dns-message" | |||
| Content-Format (for details, see {{sec:content-format}}) when requested. | Content-Format (for details, see {{sec:content-format}}) when requested. | |||
| The use of the Accept option in the request is optional. | The use of the Accept option in the request is optional. | |||
| However, all DoC clients MUST be able to parse a "application/dns-message" response ( see also {{sec:content-format}}). | However, all DoC clients MUST be able to parse an "application/dns-message" response (see also {{sec:content-format}}). | |||
| Any response Content-Format other than "application/dns-message" MUST be indicated wi th | Any response Content-Format other than "application/dns-message" MUST be indicated wi th | |||
| the Content-Format option by the DoC server. | the Content-Format option by the DoC server. | |||
| ### Response Codes and Handling DNS and CoAP errors {#sec:resp-codes} | ### Response Codes and Handling DNS and CoAP Errors {#sec:resp-codes} | |||
| A DNS response indicates either success or failure in the RCODE of the DNS header (se e {{-dns}}). | A DNS response indicates either success or failure in the RCODE of the DNS header (se e {{-dns}}). | |||
| It is RECOMMENDED that CoAP responses that carry a parseable DNS response use a 2.05 (Content) response code. | It is RECOMMENDED that CoAP responses that carry a parsable DNS response use a 2.05 ( Content) response code. | |||
| CoAP responses using non-successful response codes MUST NOT contain a DNS response | CoAP responses using non-successful response codes MUST NOT contain a DNS response | |||
| and MUST only be used for errors in the CoAP layer or when a request does not | and MUST only be used for errors in the CoAP layer or when a request does not | |||
| fulfill the requirements of the DoC protocol. | fulfill the requirements of the DoC protocol. | |||
| Communication errors with an upstream DNS server (e.g., timeouts) MUST be indicated b y including a DNS response with the appropriate RCODE in a successful CoAP response, i.e., using a 2.xx response code. | Communication errors with an upstream DNS server (e.g., timeouts) MUST be indicated b y including a DNS response with the appropriate RCODE in a successful CoAP response, i.e., using a 2.xx response code. | |||
| When an error occurs at the CoAP layer, e.g., if an unexpected request method or an u nsupported Content-Format in the request are used, the DoC server SHOULD respond with an appropriate CoAP error. | When an error occurs at the CoAP layer, e.g., if an unexpected request method or an u nsupported Content-Format in the request are used, the DoC server SHOULD respond with an appropriate CoAP error. | |||
| A DoC client might try to repeat a non-successful exchange unless otherwise prohibite d. | A DoC client might try to repeat a non-successful exchange unless otherwise prohibite d. | |||
| The DoC client might also decide to repeat a non-successful exchange with a different URI, for instance, when the response indicates an unsupported Content-Format. | The DoC client might also decide to repeat a non-successful exchange with a different URI, for instance, when the response indicates an unsupported Content-Format. | |||
| ### Support of CoAP Caching {#sec:resp-caching} | ### Support of CoAP Caching {#sec:resp-caching} | |||
| For reliability and energy saving measures, content decoupling (such as en-route cach ing on proxies) takes a far greater role than it does in HTTP. | For reliability and energy-saving measures, content decoupling (such as en-route cach ing on proxies) takes a far greater role than it does in HTTP. | |||
| Likewise, CoAP makes it possible to use cache validation to refresh stale cache entri es to reduce the number of large response messages. | Likewise, CoAP makes it possible to use cache validation to refresh stale cache entri es to reduce the number of large response messages. | |||
| For cache validation, CoAP implementations regularly use hashing over the message con tent for ETag generation (see {{-coap, Section 5.10.6}}). | For cache validation, CoAP implementations regularly use hashing over the message con tent for ETag generation (see {{-coap, Section 5.10.6}}). | |||
| As such, the approach to guarantee the same cache key for DNS responses as proposed i n DoH ({{-doh, Section 5.1}}) is not sufficient and needs to be updated so that the T TLs in the response are more often the same regardless of query time. | As such, the approach to guarantee the same cache key for DNS responses as proposed i n DoH ({{-doh, Section 5.1}}) is not sufficient and needs to be updated so that the T TLs in the response are more often the same regardless of query time. | |||
| The DoC server MUST ensure that the sum of the Max-Age value of a CoAP response and a ny TTL in the | The DoC server MUST ensure that the sum of the Max-Age value of a CoAP response and a ny TTL in the | |||
| DNS response is less than or equal to the corresponding TTL received from an upstream DNS server. | DNS response is less than or equal to the corresponding TTL received from an upstream DNS server. | |||
| This also includes the default Max-Age value of 60 seconds (see {{Section 5.10.5 of - coap}}) when no Max-Age option is provided. | This also includes the default Max-Age value of 60 seconds (see {{Section 5.10.5 of - coap}}) when no Max-Age option is provided. | |||
| The DoC client MUST then add the Max-Age value of the carrying CoAP response to all T TLs in a DNS response on reception and use these calculated TTLs for the associated r ecords. | The DoC client MUST then add the Max-Age value of the carrying CoAP response to all T TLs in a DNS response on reception and use these calculated TTLs for the associated r ecords. | |||
| The RECOMMENDED algorithm for a DoC server to meet the requirement for DoC is as foll ows: | To meet the requirement for DoC, the RECOMMENDED algorithm for a DoC server is as fol lows: | |||
| Set the Max-Age option of a response to the minimum TTL of a DNS response and subtrac t this value from all TTLs of that DNS response. | Set the Max-Age option of a response to the minimum TTL of a DNS response and subtrac t this value from all TTLs of that DNS response. | |||
| This prevents expired records unintentionally being served from an intermediate CoAP cache. | This prevents expired records from unintentionally being served from an intermediate CoAP cache. | |||
| Additionally, if the ETag for cache validation is based on the content of the respons e, it allows that ETag not to change. | Additionally, if the ETag for cache validation is based on the content of the respons e, it allows that ETag not to change. | |||
| This then remains the case even if the TTL values are updated by an upstream DNS cach e. | This then remains the case even if the TTL values are updated by an upstream DNS cach e. | |||
| If only one record set per DNS response is assumed, a simplification of this algorith m is to just set all TTLs in the response to 0 and set the TTLs at the DoC client to the value of the Max-Age option. | If only one record set per DNS response is assumed, a simplification of this algorith m is to just set all TTLs in the response to 0 and set the TTLs at the DoC client to the value of the Max-Age option. | |||
| If shorter caching periods are plausible, e.g., if the RCODE of the message indicates an error that should only be cached for a minimal duration, the value for the Max-Ag e option SHOULD be set accordingly. | If shorter caching periods are plausible, e.g., if the RCODE of the message indicates an error that should only be cached for a minimal duration, the value for the Max-Ag e option SHOULD be set accordingly. | |||
| This value might be 0, but if the DoC server knows that the error will persist, great er values are also conceivable, depending on the projected duration of the error. | This value might be 0, but if the DoC server knows that the error will persist, great er values are also conceivable, depending on the projected duration of the error. | |||
| The same applies for DNS responses that for any reason do not carry any records with a TTL. | The same applies for DNS responses that, for any reason, do not carry any records wit h a TTL. | |||
| ### Examples {#sec:resp-examples} | ### Examples {#sec:resp-examples} | |||
| The following example illustrates the response to the query "example.org. IN | The following example illustrates the response to the query "example.org. IN | |||
| AAAA record", with recursion turned on. Successful responses carry one answer | AAAA record", with recursion turned on. Successful responses carry one answer | |||
| record including address 2001:db8:1:0:1:2:3:4 and TTL 79689. | record including the address 2001:db8:1:0:1:2:3:4 and TTL 79689. | |||
| A successful response: | A successful response: | |||
| 2.05 Content | ~~~ | |||
| Content-Format: 553 (application/dns-message) | 2.05 Content | |||
| Max-Age: 58719 | Content-Format: 553 (application/dns-message) | |||
| Payload (human-readable): | Max-Age: 58719 | |||
| ;; ->>Header<<- opcode: QUERY, status: NOERROR, id: 0 | Payload (human-readable): | |||
| ;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 | ;; ->>Header<<- opcode: QUERY, status: NOERROR, id: 0 | |||
| ;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 | ||||
| ;; QUESTION SECTION: | ;; QUESTION SECTION: | |||
| ;example.org. IN AAAA | ;example.org. IN AAAA | |||
| ;; ANSWER SECTION: | ;; ANSWER SECTION: | |||
| ;example.org. 79689 IN AAAA 2001:db8:1:0:1:2:3:4 | ;example.org. 79689 IN AAAA 2001:db8:1:0:1:2:3:4 | |||
| ~~~ | ||||
| {: gi="sourcecode"} | ||||
| When a DNS error – NxDomain (RCODE = 3) for "does.not.exist" in this case &ndas h; is noted in the DNS response, the CoAP response still indicates success. | When a DNS error -- NxDomain (RCODE = 3) for "does.not.exist" in this case -- is note d in the DNS response, the CoAP response still indicates success. | |||
| 2.05 Content | ~~~ | |||
| Content-Format: 553 (application/dns-message) | 2.05 Content | |||
| Payload (human-readable): | Content-Format: 553 (application/dns-message) | |||
| ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 0 | Payload (human-readable): | |||
| ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 | ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 0 | |||
| ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 | ||||
| ;; QUESTION SECTION: | ;; QUESTION SECTION: | |||
| ;does.not.exist. IN AAAA | ;does.not.exist. IN AAAA | |||
| ~~~ | ||||
| {: gi="sourcecode"} | ||||
| As described in {{sec:content-format}}, a DoC server uses NotImp (RCODE = 4) if it do | <!-- [rfced] Please review the text starting with "OPCODE—a DNS | |||
| es not support an OPCODE—a DNS Update (OPCODE = 5) for "example.org" in this case. | Update ...". Should this be updated as follows or in some other way? | |||
| 2.05 Content | Original: | |||
| Content-Format: 553 (application/dns-message) | As described in Section 4.1, a DoC server uses NotImp (RCODE = 4) if | |||
| Payload (human-readable): | it does not support an OPCODE—a DNS Update (OPCODE = 5) for | |||
| ;; ->>Header<<- opcode: UPDATE, status: NOTIMP, id: 0 | "example.org" in this case. | |||
| ;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 | ||||
| ;; QUERY SECTION: | Perhaps: | |||
| ;example.org. IN AAAA | As described in Section 4.1, a DoC server uses NotImp (RCODE = 4) if | |||
| it does not support an OPCODE - in this case, a DNS Update (OPCODE = 5) for | ||||
| "example.org" is used. | ||||
| --> | ||||
| As described in {{sec:content-format}}, a DoC server uses NotImp (RCODE = 4) if it do | ||||
| es not support an OPCODE-a DNS Update (OPCODE = 5) for "example.org" in this case. | ||||
| ~~~ | ||||
| 2.05 Content | ||||
| Content-Format: 553 (application/dns-message) | ||||
| Payload (human-readable): | ||||
| ;; ->>Header<<- opcode: UPDATE, status: NOTIMP, id: 0 | ||||
| ;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 | ||||
| ;; QUERY SECTION: | ||||
| ;example.org. IN AAAA | ||||
| ~~~ | ||||
| {: gi="sourcecode"} | ||||
| When an error occurs at the CoAP layer, the DoC server responds with | When an error occurs at the CoAP layer, the DoC server responds with | |||
| an appropriate CoAP error, for instance 4.15 (Unsupported Content-Format) | an appropriate CoAP error, for instance, 4.15 (Unsupported Content-Format) | |||
| if the Content-Format option in the request was not set to | if the Content-Format option in the request was not set to | |||
| "application/dns-message" and the Content-Format is not otherwise supported by | "application/dns-message" and the Content-Format is not otherwise supported by | |||
| the server. | the server. | |||
| 4.15 Unsupported Content-Format | ~~~ | |||
| [no payload] | 4.15 Unsupported Content-Format | |||
| [no payload] | ||||
| ~~~ | ||||
| {: gi="sourcecode"} | ||||
| Interaction with other CoAP and CoRE Features | Interaction with Other CoAP and CoRE Features | |||
| ============================================= | ============================================= | |||
| DNS Push Notifications and CoAP Observe | DNS Push Notifications and CoAP Observe | |||
| --------------------------------------- | --------------------------------------- | |||
| DNS Push Notifications {{-dns-push}} provides the capability to asynchronously notify clients about resource record changes. | DNS Push Notifications {{-dns-push}} provide the capability to asynchronously notify clients about resource record changes. | |||
| However, it results in additional overhead, which conflicts with constrained resource s. | However, it results in additional overhead, which conflicts with constrained resource s. | |||
| This is the reason why it is RECOMMENDED to use CoAP Observe {{-coap-observe}} instea d of DNS Push | This is the reason why it is RECOMMENDED to use CoAP Observe {{-coap-observe}} instea d of DNS Push | |||
| in the DoC domain. | in the DoC domain. | |||
| This is particularly useful if a short-lived record is requested frequently. | This is particularly useful if a short-lived record is requested frequently. | |||
| The DoC server SHOULD provide Observe capabilities on its DoC resource and do as foll ows. | The DoC server SHOULD provide Observe capabilities on its DoC resource and do as foll ows. | |||
| If a DoC clients wants to observe a resource record, a DoC server can respond with a | If a DoC client wants to observe a resource record, a DoC server can respond with a n | |||
| notification | otification | |||
| and add the client to its list of observers for that resource in accordance to {{-coa | and add the client to its list of observers for that resource in accordance with {{-c | |||
| p-observe}}. | oap-observe}}. | |||
| The DoC server MAY subscribe to DNS push notifications for that record. | The DoC server MAY subscribe to DNS push notifications for that record. | |||
| This involves sending a DNS Subscribe message (see ({{Section 6.2 of -dns-push}}), | This involves sending a DNS Subscribe message (see {{Section 6.2 of -dns-push}}), | |||
| instead of a classic DNS query to fetch the | instead of a classic DNS query to fetch the | |||
| information on behalf of the DoC client. | information on behalf of the DoC client. | |||
| <!--[rfced] Please clarify what "a failure to do so" refers to in the | ||||
| following sentence. | ||||
| Original: | ||||
| As there is no CoAP observer anymore from the perspective of the | ||||
| DoC server, a failure to do so cannot be communicated back to any | ||||
| DoC observer. | ||||
| --> | ||||
| After the list of observers for a particular DNS query has become empty | After the list of observers for a particular DNS query has become empty | |||
| (by explicit or implicit cancellation of the observation as per {{Section 3.6 of -coa p-observe}}), | (by explicit or implicit cancellation of the observation as per {{Section 3.6 of -coa p-observe}}), | |||
| and no other reason to subscribe to that request is present, | and no other reason to subscribe to that request is present, | |||
| the DoC server SHOULD cancel the corresponding subscription. | the DoC server SHOULD cancel the corresponding subscription. | |||
| This can involve sending an DNS Unsubscribe message or closing the session (see {{Sec tion 6.4 of -dns-push}}). | This can involve sending a DNS Unsubscribe message or closing the session (see {{Sect ion 6.4 of -dns-push}}). | |||
| As there is no CoAP observer anymore from the perspective of the DoC server, a failur e to do so cannot be communicated back to any DoC observer. | As there is no CoAP observer anymore from the perspective of the DoC server, a failur e to do so cannot be communicated back to any DoC observer. | |||
| As such, error handling (if any) needs to be resolved between the DoC server and the upstream DNS infrastructure. | As such, error handling (if any) needs to be resolved between the DoC server and the upstream DNS infrastructure. | |||
| Whenever the DoC server receives a DNS Push message from the DNS | Whenever the DoC server receives a DNS Push message from the DNS | |||
| infrastructure for an observed resource record, the DoC server sends an appropriate O bserve notification response | infrastructure for an observed resource record, the DoC server sends an appropriate O bserve notification response | |||
| to the DoC client. | to the DoC client. | |||
| A server that responds with notifications (i.e., sends the Observe option) needs to h | A server that responds with notifications (i.e., sends the Observe option) needs to h | |||
| ave means of obtaining current resource records. | ave the means of obtaining current resource records. | |||
| This may happen through DNS Push, but also by upstream polling or implicit circumstan | This may happen through DNS Push or also by upstream polling or implicit circumstance | |||
| ces (e.g., if the DoC server is the authoritative name server for the record and want | s (e.g., if the DoC server is the authoritative name server for the record and wants | |||
| s to notify about changes). | to notify about changes). | |||
| OSCORE | OSCORE | |||
| ------ | ------ | |||
| It is RECOMMENDED to carry DNS messages protected using OSCORE {{-oscore}} between th e DoC client | It is RECOMMENDED to carry DNS messages protected using OSCORE {{-oscore}} between th e DoC client | |||
| and the DoC server. The establishment and maintenance of the OSCORE Security Context is out of the | and the DoC server. The establishment and maintenance of the OSCORE security context is out of the | |||
| scope of this document. | scope of this document. | |||
| {{-cachable-oscore}} describes a method to allow cache retrieval of OSCORE responses and discusses | {{I-D.amsuess-core-cachable-oscore}} describes a method to allow cache retrieval of O SCORE responses and discusses | |||
| the corresponding implications on message sizes and security properties. | the corresponding implications on message sizes and security properties. | |||
| Mapping DoC to DoH | Mapping DoC to DoH | |||
| ------------------ | ------------------ | |||
| This document provides no specification on how to map between DoC and DoH, e.g., at a | This document provides no specification on how to map between DoC and DoH, e.g., at a | |||
| CoAP-to-HTTP-proxy; such a direct mapping is NOT RECOMMENDED: | CoAP-to-HTTP proxy. Such a direct mapping is NOT RECOMMENDED: | |||
| rewriting the FETCH method ({{sec:queries}}) and the TTL rewriting ({{sec:resp-cachin | Rewriting the FETCH method ({{sec:queries}}) and TTL ({{sec:resp-caching}}) as | |||
| g}}) as | specified in this document would be non-trivial. | |||
| specified in this draft would be non-trivial. | ||||
| It is RECOMMENDED to use a DNS forwarder to map between DoC and DoH, as would be the case for | It is RECOMMENDED to use a DNS forwarder to map between DoC and DoH, as would be the case for | |||
| mapping between any other pair of DNS transports. | mapping between any other pair of DNS transports. | |||
| Considerations for Unprotected Use {#sec:unprotected-coap} | Considerations for Unprotected Use {#sec:unprotected-coap} | |||
| ================================== | ================================== | |||
| The use of DoC without confidentiality and integrity protection is NOT RECOMMENDED. | The use of DoC without confidentiality and integrity protection is NOT RECOMMENDED. | |||
| Without secure communication, many possible attacks need to be evaluated in the conte xt of | Without secure communication, many possible attacks need to be evaluated in the conte xt of | |||
| the application's threat model. | the application's threat model. | |||
| This includes known threats for unprotected DNS {{-dns-threats}} {{-dns-privacy}} and CoAP {{Section 11 of -coap}}. | This includes known threats for unprotected DNS {{-dns-threats}} {{-dns-privacy}} and CoAP ({{Section 11 of -coap}}). | |||
| While DoC does not use the random ID of the DNS header (see {{sec:req-caching}}), equ ivalent protection against off-path poisoning attacks is achieved by using random lar ge token values for unprotected CoAP requests. | While DoC does not use the random ID of the DNS header (see {{sec:req-caching}}), equ ivalent protection against off-path poisoning attacks is achieved by using random lar ge token values for unprotected CoAP requests. | |||
| If a DoC message is unprotected it MUST use a random token of at least 2 bytes length | If a DoC message is unprotected, it MUST use a random token with a length of at least | |||
| to mitigate this kind of poisoning attack. | 2 bytes to mitigate this kind of poisoning attack. | |||
| Implementation Status | ||||
| ===================== | ||||
| {::boilerplate rfc7942} | ||||
| [^remove-impl-status] | ||||
| [^remove-impl-status]: RFC Ed.: Please remove this section before publication. When d | ||||
| eleting this | ||||
| section, please also remove RFC7942 from the references of this document. | ||||
| DoC Client | ||||
| The authors of this document provide a [DoC client implementation available | ||||
| in the IoT operating system RIOT][gcoap_dns]. | ||||
| Level of maturity: | ||||
| : production | ||||
| Version compatibility: | ||||
| : draft-ietf-core-dns-over-coap-13 | ||||
| License: | ||||
| : LGPL-2.1 | ||||
| Contact information: | ||||
| : `Martine S. Lenders <martine.lenders@tu-dresden.de>` | ||||
| Last update of this information: | ||||
| : September 2024 | ||||
| DoC Server | ||||
| The authors of this document provide a [DoC server implementation in | ||||
| Python][aiodnsprox]. | ||||
| Level of maturity: | ||||
| : production | ||||
| Version compatibility: | ||||
| : draft-ietf-core-dns-over-coap-13 | ||||
| License: | ||||
| : MIT | ||||
| Contact information: | ||||
| : `Martine S. Lenders <martine.lenders@tu-dresden.de>` | ||||
| Last update of this information: | ||||
| : September 2024 | ||||
| Security Considerations | Security Considerations | |||
| ======================= | ======================= | |||
| General CoAP security considerations ({{RFC7252, Section 11}}) apply to DoC. | General CoAP security considerations ({{RFC7252, Section 11}}) apply to DoC. | |||
| DoC also inherits the security considerations of the protocols used for secure commun ication, e.g., OSCORE ({{-oscore, Section 12}}) as well as DTLS 1.2 or newer ({{-dtls 12, Section 5}} {{-dtls13, Section 11}}). | DoC also inherits the security considerations of the protocols used for secure commun ication, e.g., OSCORE ({{-oscore, Section 12}}) as well as DTLS 1.2 or newer ({{-dtls 12, Section 5}} and {{-dtls13, Section 11}}). | |||
| Additionally, DoC uses request patterns that require the maintenance of long-lived se curity | Additionally, DoC uses request patterns that require the maintenance of long-lived se curity | |||
| contexts. | contexts. | |||
| {{Section 2.6 of -core-corrclar}} provides insights on what can be done when those ar e resumed from a new endpoint. | {{Section 2.6 of I-D.ietf-core-corr-clar}} provides insights on what can be done when those are resumed from a new endpoint. | |||
| Though DTLS v1.2 {{-dtls12}} was obsoleteted by DTLS v1.3 {{-dtls13}} there are still many CoAP | Though DTLS v1.2 {{-dtls12}} was obsoleted by DTLS v1.3 {{-dtls13}}, there are many C oAP | |||
| implementations that still use v1.2 at the time of writing. | implementations that still use v1.2 at the time of writing. | |||
| As such, this document also accounts for the usage of DTLS v1.2 even though newer ver sions are | As such, this document also accounts for the usage of DTLS v1.2 even though newer ver sions are | |||
| RECOMMENDED when using DTLS to secure CoAP. | RECOMMENDED when using DTLS to secure CoAP. | |||
| When using unprotected CoAP (see {{sec:unprotected-coap}}), setting the ID of a DNS m essage to 0 as | When using unprotected CoAP (see {{sec:unprotected-coap}}), setting the ID of a DNS m essage to 0 as | |||
| specified in {{sec:req-caching}} opens the DNS cache of a DoC client to cache poisoni ng attacks | specified in {{sec:req-caching}} opens the DNS cache of a DoC client to cache poisoni ng attacks | |||
| via response spoofing. | via response spoofing. | |||
| This document requires an unpredictable CoAP token in each DoC query from the client when CoAP is | This document requires an unpredictable CoAP token in each DoC query from the client when CoAP is | |||
| not secured to mitigate such an attack over DoC (see {{sec:unprotected-coap}}). | not secured to mitigate such an attack over DoC (see {{sec:unprotected-coap}}). | |||
| For secure communication via (D)TLS or OSCORE, an unpredictable ID against spoofing i | <!--[rfced] FYI: We added "to protect" to this sentence for | |||
| s not necessary. | clarity. Please let us know if it changes the intended meaning. | |||
| Original: | ||||
| For secure communication via (D)TLS or OSCORE, an unpredictable ID | ||||
| against spoofing is not necessary. | ||||
| Updated: | ||||
| For secure communication via (D)TLS or OSCORE, an unpredictable ID | ||||
| to protect against spoofing is not necessary. | ||||
| --> | ||||
| For secure communication via (D)TLS or OSCORE, an unpredictable ID to protect against | ||||
| spoofing is not necessary. | ||||
| Both (D)TLS and OSCORE offer mechanisms to harden against injecting spoofed responses in their protocol design. | Both (D)TLS and OSCORE offer mechanisms to harden against injecting spoofed responses in their protocol design. | |||
| Consequently, the ID of the DNS message can be set to 0 without any concern in order to leverage the advantages of CoAP caching. | Consequently, the ID of the DNS message can be set to 0 without any concern in order to leverage the advantages of CoAP caching. | |||
| A DoC client must be aware that the DoC server | A DoC client must be aware that the DoC server | |||
| may communicate unprotected with the upstream DNS infrastructure, e.g., using DNS ove r UDP. | may communicate unprotected with the upstream DNS infrastructure, e.g., using DNS ove r UDP. | |||
| DoC can only guarantee confidentiality and integrity of communication between parties for which the | DoC can only guarantee confidentiality and integrity of communication between parties for which the | |||
| security context is exchanged. | security context is exchanged. | |||
| The DoC server may use another security context to communicate upstream with both con fidentiality and integrity | The DoC server may use another security context to communicate upstream with both con fidentiality and integrity | |||
| (e.g., DNS over QUIC {{-doq}}), but, while recommended, this is opaque to the DoC cli ent on the protocol level. | (e.g., DNS over QUIC {{-doq}}); however, while recommended, this is opaque to the DoC client on the protocol level. | |||
| Record integrity can also be ensured upstream using DNSSEC {{-dnssec}}. | Record integrity can also be ensured upstream using DNSSEC {{-dnssec}}. | |||
| A DoC client may not be able to perform DNSSEC validation, | A DoC client may not be able to perform DNSSEC validation, | |||
| e.g., due to code size constraints, or due to the size of the responses. | e.g., due to code size constraints or the size of the responses. | |||
| It may trust its DoC server to perform DNSSEC validation; | It may trust its DoC server to perform DNSSEC validation; | |||
| how that trust is expressed is out of the scope of this document. | how that trust is expressed is out of the scope of this document. | |||
| For instance, a DoC client may be, configured to use a particular credential by which it recognizes an eligible DoC server. | For instance, a DoC client may be configured to use a particular credential by which it recognizes an eligible DoC server. | |||
| That information can also imply trust in the DNSSEC validation by that DoC server. | That information can also imply trust in the DNSSEC validation by that DoC server. | |||
| IANA Considerations | IANA Considerations | |||
| =================== | =================== | |||
| [^replace-xxxx] | ||||
| [^replace-xxxx]: RFC Ed.: throughout this section, please replace | ||||
| RFC-XXXX with the RFC number of this specification and remove this | ||||
| note. | ||||
| This document has the following actions for IANA. | ||||
| CoAP Content-Formats Registry | CoAP Content-Formats Registry | |||
| ----------------------------- | ----------------------------- | |||
| IANA is requested to assign a CoAP Content-Format ID for the "application/dns-message | IANA has assigned a CoAP Content-Format ID for the "application/dns-message" media | |||
| " media | type in the "CoAP Content-Formats" registry in the "Constrained RESTful Environments | |||
| type in the "CoAP Content-Formats" registry, within the "Constrained RESTful Environm | (CoRE) Parameters" | |||
| ents (CoRE) Parameters" | registry group {{-coap}}; this corresponds to the "application/dns-message" media | |||
| registry group {{-coap}}, corresponding to the "application/dns-message" media | ||||
| type from the "Media Types" registry (see {{-doh}}). | type from the "Media Types" registry (see {{-doh}}). | |||
| Content Type: application/dns-message | | Content Type | ID | Reference | | |||
| | ------------ | -------- | ---------------------------------- | | ||||
| Content Coding: - | | application/dns-message | 553 | {{-doh}} and RFC 9953, {{sec:content-format}} | |||
| | | ||||
| ID: 553 (suggested) | {: #tab-coap-content-format title="CoAP Content-Format ID"} | |||
| Reference: {{-doh}} and \[RFC-XXXX\], {{sec:content-format}} | ||||
| DNS Service Bindings (SVCB) Registry | DNS SVBC Service Parameter Keys (SvcParamKeys) Registry | |||
| ------------------------------------ | ------------------------------------ | |||
| IANA is requested to add the following entry to the "Service Parameter Keys (SvcParam Keys)" registry within the "DNS Service Bindings (SVCB)" registry group. | IANA has added the following entry to the "DNS SVCB Service Parameter Keys (SvcParamK eys)" registry in the "DNS Service Bindings (SVCB)" registry group. | |||
| The definition of this parameter can be found in {{sec:doc-server-selection}}. | The definition of this parameter can be found in {{sec:doc-server-selection}}. | |||
| | Number | Name | Meaning | Change Controller | Reference | | | Number | Name | Meaning | Change Controller | Reference | | |||
| | ------- | -------------- | ---------------------------------- | ----------------- | --------------- | | | ------- | -------------- | ---------------------------------- | ----------------- | --------------- | | |||
| | 10 (suggested) | docpath | DNS over CoAP resource path | IETF | \[RFC-XX | | 10 | docpath | DNS over CoAP resource path | IETF | RFC 9953, {{sec:doc- | |||
| XX\], {{sec:doc-server-selection}} | | server-selection}} | | |||
| {: #tab-svc-param-keys title="Values for SvcParamKeys"} | {: #tab-svc-param-keys title="Value for SvcParamKeys"} | |||
| Resource Type (rt=) Link Target Attribute Values Registry | Resource Type (rt=) Link Target Attribute Values Registry | |||
| --------------------------------------------------------- | --------------------------------------------------------- | |||
| IANA is requested to add a new Resource Type (rt=) Link Target Attribute "core.dns" | IANA has added "core.dns" to the "Resource Type (rt=) Link Target Attribute Values" r | |||
| to the "Resource Type (rt=) Link Target Attribute Values" registry within the "Constr | egistry in the "Constrained RESTful Environments (CoRE) Parameters" registry group. | |||
| ained RESTful Environments (CoRE) Parameters" registry group. | ||||
| Value: core.dns | ||||
| Description: DNS over CoAP resource. | ||||
| Reference: \[RFC-XXXX\], {{sec:doc-server-selection}} | | Value | Description | Reference | | |||
| | ------------ | ------------ | --------------- | | ||||
| | core.dns | DNS over CoAP resource | RFC 9953, {{sec:doc-server-selectio | ||||
| n}} | | ||||
| {: #tab-resource-type title="Resource Type (rt=) Link Target Attribute"} | ||||
| Operational Considerations | Operational Considerations | |||
| ========================== | ========================== | |||
| ## Co-existence of different DNS and CoAP transports | ## Coexistence of Different DNS and CoAP Transports | |||
| Many DNS transports may co-exist on the DoC server, such as DNS over UDP {{-dns}}, DN S over (D)TLS {{-dot}} {{-dodtls}}, DNS over HTTPS {{-doh}}, or DNS over QUIC {{-doq} }. | Many DNS transports may coexist on the DoC server, such as DNS over UDP {{-dns}}, DNS over (D)TLS {{-dot}} {{-dodtls}}, DNS over HTTPS {{-doh}}, or DNS over QUIC {{-doq}} . | |||
| In principle, transports employing channel or object security should be preferred. | In principle, transports employing channel or object security should be preferred. | |||
| In constrained scenarios, DNS over CoAP is preferable to DNS over DTLS. | In constrained scenarios, DNS over CoAP is preferable to DNS over DTLS. | |||
| The final decision regarding the preference, however, heavily depends on the use case and is therefore left to the implementers or users and is not defined in this docume nt. | The final decision regarding the preference, however, heavily depends on the use case and is therefore left to the implementers or users and is not defined in this docume nt. | |||
| CoAP supports Confirmable and Non-Confirmable messages {{-coap}} to deploy different levels of reliability. | CoAP supports Confirmable and Non-Confirmable messages {{-coap}} to deploy different levels of reliability. | |||
| This document, however, does not enforce any of these message types, as the decision on which one is appropriate depends on the characteristics of the network where DoC i s deployed. | However, this document does not enforce any of these message types, as the decision o n which one is appropriate depends on the characteristics of the network where DoC is deployed. | |||
| ## Redirects | ## Redirects | |||
| Application-layer redirects (e.g., HTTP) redirct a client to a new server. | Application-layer redirects (e.g., HTTP) redirect a client to a new server. | |||
| In the case of DoC, this leads to a new DNS server. | In the case of DoC, this leads to a new DNS server. | |||
| This new DNS server may provide different answers to the same DNS query than the prev ious DNS server. | This new DNS server may provide different answers to the same DNS query than the prev ious DNS server. | |||
| At the time of writing, CoAP does not support redirection. | At the time of writing, CoAP does not support redirection. | |||
| Future specifications of CoAP redirect may need to consider the impact of different r esults between previous and new DNS server. | Future specifications of CoAP redirect may need to consider the impact of different r esults between previous and new DNS servers. | |||
| ## Proxy Hop-Limit | ## Proxy Hop Limit | |||
| Mistakes might lead to CoAP proxies forming infinite loops. | Mistakes might lead to CoAP proxies forming infinite loops. | |||
| Using the CoAP Hop-Limit option {{-coap-hop-limit}} mitigates such loops. | Using the CoAP Hop-Limit option {{-coap-hop-limit}} mitigates such loops. | |||
| ## Error Handling | ## Error Handling | |||
| {{sec:resp-codes}} specifies that DNS operational errors should be reported back to a DoC client | {{sec:resp-codes}} specifies that DNS operational errors should be reported back to a DoC client | |||
| using the appropriate DNS RCODE. | using the appropriate DNS RCODE. | |||
| If a DoC client did not receive any successful DNS message from a DoC server for a wh ile, it might | If a DoC client did not receive any successful DNS messages from a DoC server for a w hile, it might | |||
| indicate that the DoC server lost connectivity to the upstream DNS infrastructure. | indicate that the DoC server lost connectivity to the upstream DNS infrastructure. | |||
| The DoC client should handle this error case like a recursive resolver that lost conn ectivity to the upstream DNS infrastructure. | The DoC client should handle this error case like a recursive resolver that lost conn ectivity to the upstream DNS infrastructure. | |||
| In case of CoAP errors, the usual mechanisms for CoAP response codes apply. | In case of CoAP errors, the usual mechanisms for CoAP response codes apply. | |||
| ## DNS Extensions | ## DNS Extensions | |||
| DNS extensions that are specific to the choice of transport, such as {{?RFC7828}}, ar e not applicable to DoC. | DNS extensions that are specific to the choice of transport, such as described in {{? RFC7828}}, are not applicable to DoC. | |||
| --- back | --- back | |||
| Evaluation {#sec:evaluation} | Evaluation {#sec:evaluation} | |||
| ========== | ========== | |||
| The authors of this document presented the design, implementation, and analysis of Do C in their | The authors of this document presented the design, implementation, and analysis of Do C in their | |||
| paper "Securing Name Resolution in the IoT: DNS over CoAP" {{DoC-paper}}. | paper "Securing Name Resolution in the IoT: DNS over CoAP" {{DoC-paper}}. | |||
| Change Log | <!-- [rfced] FYI: We removed the change log, which included a | |||
| ========== | reference to RFC 2136. If RFC 2136 should be mentioned elsewhere in | |||
| the running text, please let us know. | ||||
| [^remove-changelog] | --> | |||
| [^remove-changelog]: RFC Ed.: Please remove this section before publication. | ||||
| Since [draft-ietf-core-dns-over-coap-18] | ||||
| - Address Address Mohamed Boucadair's COMMENT: | ||||
| - Add Operational Considerations Section | ||||
| - Make SVCB references normative | ||||
| - Remove redundant requirement on parsing application/dns-message | ||||
| - Remove contradicting statement and outdated reference about ALPN | ||||
| - Add DNS client to Fig. 1 | ||||
| - Clarify recursion termination in the CoAP realm | ||||
| - Clarify where addresses are coming from with DDR/DNR | ||||
| - Address Gorry Fairhurst's follow-up DISCUSS: | ||||
| - Refer to Observe terminology in Section 2 | ||||
| - Clarify registration | ||||
| - Provide alternative observation examples | ||||
| - Clarify that error handling is in the hands of the DoC server | ||||
| Since [draft-ietf-core-dns-over-coap-17] | ||||
| - Address Roman Danyliw's COMMENT: | ||||
| - Remove unused RFC8742 reference | ||||
| - Address Vladimír Čunát's DNSDIR review | ||||
| - Address Éric Vyncke' COMMENT: | ||||
| - Mention OPCODE 0 in Abstract and Introduction | ||||
| - Reference to STD13 instead of RFC1035 | ||||
| - Provide extension pointers for future documents on other OPCODES | ||||
| - Use only singular for example section if there is only one example | ||||
| - Improvements on DNSSEC | ||||
| - Hyphenate link-layer as modifier to frame | ||||
| - Address Paul Wouters's DISCUSS and COMMENT: | ||||
| - Remove unnecessary and confusing ad flag from query example | ||||
| - Phrase full SVCB mapping sentence more neutrally | ||||
| - Address Gorry Fairhurst's COMMENT: | ||||
| - Add note (in addition to the `RFC Ed.:`) about paragraph removal | ||||
| - Add references for "coap" and "co" ALPN to SvcParam algorithm | ||||
| - Address Gorry's nits | ||||
| - Address Gorry Fairhurst's DISCUSS: | ||||
| - Update push notifications | ||||
| - observation: Do not use normative language | ||||
| - Address Orie Steele's COMMENT: | ||||
| - Automatic configuration MUST only be done from a trusted source | ||||
| - Remove confusing and unnecessary MAY | ||||
| - Remove normative repeat of SvcParam algorithm by citing RFC 9461 | ||||
| - Fix wording around Accept option | ||||
| - Address Deb Cooley's COMMENT: | ||||
| - Group (D)TLS references | ||||
| - Automatic configuration MUST only be done from a trusted source | ||||
| - Fix wording about unpredictable ID and spoofing | ||||
| - Remove confusing "e.g." | ||||
| Since [draft-ietf-core-dns-over-coap-16] | ||||
| - Mention TLS as possible protection mechanism in abstract and intro | ||||
| - Fix representation format in the docpath examples | ||||
| - Make docpath wire-format paragraph easier to parse | ||||
| Since [draft-ietf-core-dns-over-coap-15] | ||||
| - Address Genart and Artart review: | ||||
| - Add editor's note about removing RFC7228 reference in case rfc7228bis comes out | ||||
| before | ||||
| publication | ||||
| - Address minor nits | ||||
| - Resolve less well-known abbreviations | ||||
| - Name default ports for "coap" and "co" | ||||
| - Add reasoning why we also consider DTLS v1.2 (RFC 6347) | ||||
| - Add illustrative reference for ETag generation | ||||
| - Address DNS SVCB SvcParamKeys IANA expert review: | ||||
| - docpath: clarifications and examples | ||||
| - Rework representation format and wire-format of "docpath" | ||||
| - State that we don't do the full SVCB mapping | ||||
| - Explicitly do not limit what port= can do. | ||||
| - port limitations: We're not the SVCB mapping document | ||||
| - Address Tsvart Review | ||||
| - Prefer ADN for Uri-Host; don't prescribe *how* it is set | ||||
| Since [draft-ietf-core-dns-over-coap-14] | ||||
| - Remove superfluous and confusing step in SVCB to request algorithm | ||||
| - Address AD review: | ||||
| - Remove RFC8949 as CBOR diagnostic notation reference | ||||
| - CoRE-specific FETCH method -> CoAP-specific FETCH method | ||||
| - Remove double reference to BCP 219 | ||||
| - Fix wording and references around SVCB records and ALPN | ||||
| - Move format description for examples to Terminology section | ||||
| - Retitle section 5 to "Interaction with other CoAP and CoRE Features" | ||||
| - Make prevention of poisoning attacks normative for unprotected CoAP | ||||
| - Provide specs on if the SHOULD on ID=0 does not apply | ||||
| - Make construction algorithm normative | ||||
| - Add definition for CoRE | ||||
| - General grammar, wording, and spelling cleanups | ||||
| Since [draft-ietf-core-dns-over-coap-13] | ||||
| - Address shepherd review | ||||
| Since [draft-ietf-core-dns-over-coap-12] | ||||
| - Address Esko's review | ||||
| - Address Marcos's review | ||||
| - Address Mikolai's review | ||||
| Since [draft-ietf-core-dns-over-coap-10] | ||||
| - Replace imprecise or wrong terms: | ||||
| - disjunct => distinct | ||||
| - unencrypted CoAP => unprotected CoAP | ||||
| - security mode => confidential communication | ||||
| - Pull in definition of CBOR sequences and their EDN | ||||
| - Fix broken external section references | ||||
| - Define terminology for "upstream DNS infrastructure" and "upstream DNS server" | ||||
| - Fix wording on DNS error handling | ||||
| - Clarify that any OpCode beyond 0 is not supported for now and remove now redundant | ||||
| DNS Upgrade | ||||
| section as a consequence | ||||
| - Clarify that the DoC/DoH mapping is what is NOT RECOMMENDED | ||||
| - Avoid use of undefined term “CoAP resource identifier” | ||||
| - Discuss Max-Age option value in an error case | ||||
| - Add human-readable format to examples | ||||
| - General language check pass | ||||
| Since [draft-ietf-core-dns-over-coap-09] | ||||
| - Update SVCB SvcParamKey | ||||
| - Update corr-clar reference | ||||
| - Add reference to DNS Update [\[RFC2136\]](https://datatracker.ietf.org/doc/html/rfc | ||||
| 2136), clarify that it is currently not considered | ||||
| - Add to security considerations: unprotected upstream DNS and DNSSEC | ||||
| Since [draft-ietf-core-dns-over-coap-08] | ||||
| - Update Cenk's Affiliation | ||||
| Since [draft-ietf-core-dns-over-coap-07] | ||||
| - Address IANA early review #1368678 | ||||
| - Update normative reference to CoAP over DTLS alpn SvcParam | ||||
| - Add missing DTLSv1.2 reference | ||||
| - Security considerations: Point into corr-clar-future | ||||
| - Implementation Status: Update to current version | ||||
| Since [draft-ietf-core-dns-over-coap-06] | ||||
| - Add "docpath" SVCB ParamKey definition | ||||
| - IANA fixes | ||||
| + Use new column names (see Errata 4954) | ||||
| + Add reference to RFC 8484 for application/dns-message Media Type | ||||
| + IANA: unify self references | ||||
| Since [draft-ietf-core-dns-over-coap-05] | <!--[rfced] We note that "draft-amsuess-core-cachable-oscore" is | |||
| - Add references to relevant SVCB/DNR RFCs and drafts | expired and has been replaced by "draft-ietf-core-cacheable-oscore". | |||
| May we replace the current entry below with the entry for | ||||
| "draft-ietf-core-cacheable-oscore"? | ||||
| Since [draft-ietf-core-dns-over-coap-04] | Current: | |||
| - Add note on cacheable OSCORE | [I-D.amsuess-core-cachable-oscore] | |||
| - Address early IANA review | Amsüss, C. and M. Tiloca, "Cacheable OSCORE", Work in Progress, | |||
| Internet-Draft, draft-amsuess-core-cachable-oscore-11, 6 July 2025, | ||||
| <https://datatracker.ietf.org/doc/html/draft-amsuess-core-cachable- | ||||
| oscore-11>. | ||||
| Since [draft-ietf-core-dns-over-coap-03] | Perhaps: | |||
| - Amended Introduction with short contextualization of constrained environments | [CACHABLE-OSCORE] | |||
| - Add {{sec:evaluation}} on evaluation | Amsüss, C. and M. Tiloca, "Cacheable OSCORE", Work in | |||
| Progress, Internet-Draft, draft-ietf-core-cacheable- | ||||
| oscore-00, 22 September 2025, | ||||
| <https://datatracker.ietf.org/doc/html/draft-ietf-core- | ||||
| cacheable-oscore-00>. | ||||
| --> | ||||
| Since [draft-ietf-core-dns-over-coap-02] | <!--[rfced] Sourcecode and artwork | |||
| - Move implementation details to Implementation Status (in accordance with {{RFC7942} | a) Some lines in Figure 1 are too long for the TXT output. This figure is | |||
| }) | marked as artwork, so it needs to have a width of 72 characters or less. How | |||
| - Recommend root path to keep the CoAP options small | may we revise this figure to fit these parameters? We tested removing some | |||
| - Set Content-Format for application/dns-message to 553 | space in the figure; please check out the following test files and let us know | |||
| - SVCB/DNR: Move to Server Selection Section but leave TBD based on DNSOP discussion | if this would work (see TXT file for ascii art and HTML for SVG). If not, please | |||
| for now | provide an updated figure. | |||
| - Clarify that DoC and DoH are distinct | ||||
| - Clarify mapping between DoC and DoH | ||||
| - Update considerations on unprotected use | ||||
| - Don't call OSCORE end-to-end encrypted | ||||
| Since [draft-ietf-core-dns-over-coap-01] | Test files: | |||
| https://www.rfc-editor.org/authors/rfc9953test.md | ||||
| https://www.rfc-editor.org/authors/rfc9953test.txt | ||||
| https://www.rfc-editor.org/authors/rfc9953test.html | ||||
| - Specify DoC server role in terms of DNS terminology | b) We have updated the blocks in Sections 3.2, 3.2.1, 4.2.3, and 4.3.3 to be | |||
| - Clarify communication of DoC to DNS infrastructure is agnostic of the transport | marked as sourcecode. We set the type for the block in Section 3.2 as "abnf" | |||
| - Add subsection on how to implement DNS Push in DoC | (i.e., "~~~ abnf"). Please let us know if the type should be set for the other | |||
| - Add appendix on reference implementation | sourcecode blocks. For example, should the ones in Section 3.2.1 be marked as | |||
| type "dns-rr"? If the current list of preferred values (see link below) does | ||||
| not contain an applicable type, feel free to let us know. Also, it is | ||||
| acceptable to leave the type not set. | ||||
| Since [draft-ietf-core-dns-over-coap-00] | List of sourcecode types: | |||
| https://www.rfc-editor.org/rpc/wiki/doku.php?id=sourcecode-types | ||||
| - SVGify ASCII art | c) The blocks in Section 4.3.3 are too long for the TXT output. We marked | |||
| - Move section on "DoC Server Considerations" (was Section 5.1) to its own draft | these as sourcecode, so they should have a width of 69 characters or less. The | |||
| ([draft-lenders-dns-cns]) | long lines are currently 70 characters. Would moving all the lines with | |||
| - Replace layer violating statement for CON with statement of fact | semicolons over to the left one space (in just this section or in all the | |||
| - Add security considerations on ID=0 | sourcecode in the document) be a good solution? We tried this in the test | |||
| files listed above so you can see what the output will look like. Feel free to | ||||
| offer other suggestions as well. | ||||
| --> | ||||
| Since [draft-lenders-dns-over-coap-04] | <!--[rfced] Please review the "Inclusive Language" portion of the online | |||
| Style Guide <https://www.rfc-editor.org/styleguide/part2/#inclusive_language> | ||||
| and let us know if any changes are needed. Updates of this nature typically | ||||
| result in more precise language, which is helpful for readers. | ||||
| - Removed change log of draft-lenders-dns-over-coap | Note that our script did not flag any words in particular, but this should | |||
| still be reviewed as a best practice. | ||||
| --> | ||||
| # Acknowledgments | # Acknowledgments | |||
| {:unnumbered} | {:unnumbered} | |||
| The authors of this document want to thank Mike Bishop, Carsten Bormann, Mohamed Bouc adair, Deb Cooley, Vladimír Čunát, Roman Danyliw, Elwyn B. Davies, Esko Dijk, Gorry F airhurst, Thomas Fossati, Mikolai Gütschow, Todd Herr, Tommy Pauly, Jan Romann, Ben S chwartz, Orie Steele, Marco Tiloca, Éric Vyncke, Tim Wicinski, and Paul Wouters for t heir feedback and comments. | The authors of this document want to thank {{{Mike Bishop}}}, {{{Carsten Bormann}}}, {{{Mohamed Boucadair}}}, {{{Deb Cooley}}}, {{{Vladimír Čunát}}}, {{{Roman Danyliw}}}, {{{Elwyn B. Davies}}}, {{{Esko Dijk}}}, {{{Gorry Fairhurst}}}, {{{Thomas Fossati}}}, {{{Mikolai Gütschow}}}, {{{Todd Herr}}}, {{{Tommy Pauly}}}, {{{Jan Romann}}}, {{{Ben Schwartz}}}, {{{Orie Steele}}}, {{{Marco Tiloca}}}, {{{Éric Vyncke}}}, {{{Tim Wicins ki}}}, and {{{Paul Wouters}}} for their feedback and comments. | |||
| [draft-ietf-core-dns-over-coap-18]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-18 | [draft-ietf-core-dns-over-coap-18]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-18 | |||
| [draft-ietf-core-dns-over-coap-17]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-17 | [draft-ietf-core-dns-over-coap-17]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-17 | |||
| [draft-ietf-core-dns-over-coap-16]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-16 | [draft-ietf-core-dns-over-coap-16]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-16 | |||
| [draft-ietf-core-dns-over-coap-15]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-15 | [draft-ietf-core-dns-over-coap-15]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-15 | |||
| [draft-ietf-core-dns-over-coap-14]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-14 | [draft-ietf-core-dns-over-coap-14]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-14 | |||
| [draft-ietf-core-dns-over-coap-13]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-13 | [draft-ietf-core-dns-over-coap-13]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-13 | |||
| [draft-ietf-core-dns-over-coap-12]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-12 | [draft-ietf-core-dns-over-coap-12]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-12 | |||
| [draft-ietf-core-dns-over-coap-10]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-10 | [draft-ietf-core-dns-over-coap-10]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-10 | |||
| [draft-ietf-core-dns-over-coap-09]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-09 | [draft-ietf-core-dns-over-coap-09]: https://datatracker.ietf.org/doc/html/draft-ietf- core-dns-over-coap-09 | |||
| End of changes. 131 change blocks. | ||||
| 503 lines changed or deleted | 577 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||