<?xml version='1.0' encoding='utf-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" category="std" consensus="true" docName="draft-ietf-dnsop-compact-denial-of-existence-07" number="9824" ipr="trust200902" updates="4034, 4035" obsoletes="" submissionType="IETF" xml:lang="en" tocInclude="true" tocDepth="4" symRefs="true" sortRefs="true" prepTime="2025-09-18T11:59:33" indexInclude="true" scripts="Common,Latin">
  <link href="https://datatracker.ietf.org/doc/draft-ietf-dnsop-compact-denial-of-existence-07" rel="prev"/>
  <link href="https://dx.doi.org/10.17487/rfc9824" rel="alternate"/>
  <link href="urn:issn:2070-1721" rel="alternate"/>
  <front>
    <title abbrev="Compact Denial of Existence in DNSSEC">Compact Denial of Existence in DNSSEC</title>
    <seriesInfo name="RFC" value="9824" stream="IETF"/>
    <author fullname="Shumon Huque" initials="S." surname="Huque">
      <organization showOnFrontPage="true">Salesforce</organization>
      <address>
        <postal>
          <street>415 Mission Street, 3rd Floor</street>
          <city>San Francisco</city>
          <region>CA</region>
          <code>94105</code>
          <country>United States of America</country>
        </postal>
        <email>shuque@gmail.com</email>
      </address>
    </author>
    <author fullname="Christian Elmerot" initials="C." surname="Elmerot">
      <organization showOnFrontPage="true">Cloudflare</organization>
      <address>
        <postal>
          <street>101 Townsend St.</street>
          <city>San Francisco</city>
          <region>CA</region>
          <code>94107</code>
          <country>United States of America</country>
        </postal>
        <email>elmerot@cloudflare.com</email>
      </address>
    </author>
    <author fullname="Olafur Gudmundsson" initials="O." surname="Gudmundsson">
      <organization showOnFrontPage="true"/>
      <address>
        <email>ogud@ogud.com</email>
      </address>
    </author>
    <date month="09" year="2025"/>
    <area>OPS</area>
    <workgroup>dnsop</workgroup>
    <keyword>DNS</keyword>
    <keyword>DNSSEC</keyword>
    <keyword>Denial of Existence</keyword>
    <keyword>Compact Denial of Existence</keyword>
    <keyword>Compact Answers</keyword>
    <keyword>Black Lies</keyword>
    <keyword>NXDOMAIN</keyword>
    <keyword>NODATA</keyword>
    <keyword>Empty Non-Terminal</keyword>
    <abstract pn="section-abstract">
      <t indent="0" pn="section-abstract-1">
       This document describes a technique to generate a signed DNS response
       on demand for a nonexistent name by claiming that the name exists
       but doesn't have any data for the queried record type. Such responses
       require only one minimally covering NSEC or NSEC3 record, allow online
       signing servers to minimize signing operations and response sizes,
       and prevent zone content disclosure.
      </t>
      <t indent="0" pn="section-abstract-2">
       This document updates RFCs 4034 and 4035.
      </t>
    </abstract>
    <boilerplate>
      <section anchor="status-of-memo" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.1">
        <name slugifiedName="name-status-of-this-memo">Status of This Memo</name>
        <t indent="0" pn="section-boilerplate.1-1">
            This is an Internet Standards Track document.
        </t>
        <t indent="0" pn="section-boilerplate.1-2">
            This document is a product of the Internet Engineering Task Force
            (IETF).  It represents the consensus of the IETF community.  It has
            received public review and has been approved for publication by
            the Internet Engineering Steering Group (IESG).  Further
            information on Internet Standards is available in Section 2 of 
            RFC 7841.
        </t>
        <t indent="0" pn="section-boilerplate.1-3">
            Information about the current status of this document, any
            errata, and how to provide feedback on it may be obtained at
            <eref target="https://www.rfc-editor.org/info/rfc9824" brackets="none"/>.
        </t>
      </section>
      <section anchor="copyright" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.2">
        <name slugifiedName="name-copyright-notice">Copyright Notice</name>
        <t indent="0" pn="section-boilerplate.2-1">
            Copyright (c) 2025 IETF Trust and the persons identified as the
            document authors. All rights reserved.
        </t>
        <t indent="0" pn="section-boilerplate.2-2">
            This document is subject to BCP 78 and the IETF Trust's Legal
            Provisions Relating to IETF Documents
            (<eref target="https://trustee.ietf.org/license-info" brackets="none"/>) in effect on the date of
            publication of this document. Please review these documents
            carefully, as they describe your rights and restrictions with
            respect to this document. Code Components extracted from this
            document must include Revised BSD License text as described in
            Section 4.e of the Trust Legal Provisions and are provided without
            warranty as described in the Revised BSD License.
        </t>
      </section>
    </boilerplate>
    <toc>
      <section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" pn="section-toc.1">
        <name slugifiedName="name-table-of-contents">Table of Contents</name>
        <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1">
          <li pn="section-toc.1-1.1">
            <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.1"><xref derivedContent="1" format="counter" sectionFormat="of" target="section-1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-introduction-and-motivation">Introduction and Motivation</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.1.2">
              <li pn="section-toc.1-1.1.2.1">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.1.1"><xref derivedContent="1.1" format="counter" sectionFormat="of" target="section-1.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-requirements-language">Requirements Language</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.2">
            <t indent="0" keepWithNext="true" pn="section-toc.1-1.2.1"><xref derivedContent="2" format="counter" sectionFormat="of" target="section-2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-distinguishing-nonexistent-">Distinguishing Nonexistent Names</xref></t>
          </li>
          <li pn="section-toc.1-1.3">
            <t indent="0" pn="section-toc.1-1.3.1"><xref derivedContent="3" format="counter" sectionFormat="of" target="section-3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-generating-responses-with-n">Generating Responses with NSEC</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.3.2">
              <li pn="section-toc.1-1.3.2.1">
                <t indent="0" pn="section-toc.1-1.3.2.1.1"><xref derivedContent="3.1" format="counter" sectionFormat="of" target="section-3.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-responses-for-nonexistent-n">Responses for Nonexistent Names</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.2">
                <t indent="0" pn="section-toc.1-1.3.2.2.1"><xref derivedContent="3.2" format="counter" sectionFormat="of" target="section-3.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-responses-for-nonexistent-t">Responses for Nonexistent Types</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.3">
                <t indent="0" pn="section-toc.1-1.3.2.3.1"><xref derivedContent="3.3" format="counter" sectionFormat="of" target="section-3.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-responses-for-wildcard-matc">Responses for Wildcard Matches</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.4">
                <t indent="0" pn="section-toc.1-1.3.2.4.1"><xref derivedContent="3.4" format="counter" sectionFormat="of" target="section-3.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-responses-for-unsigned-refe">Responses for Unsigned Referrals</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.5">
                <t indent="0" pn="section-toc.1-1.3.2.5.1"><xref derivedContent="3.5" format="counter" sectionFormat="of" target="section-3.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-responses-to-explicit-queri">Responses to Explicit Queries for NXNAME</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.4">
            <t indent="0" pn="section-toc.1-1.4.1"><xref derivedContent="4" format="counter" sectionFormat="of" target="section-4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-generating-responses-with-ns">Generating Responses with NSEC3</xref></t>
          </li>
          <li pn="section-toc.1-1.5">
            <t indent="0" pn="section-toc.1-1.5.1"><xref derivedContent="5" format="counter" sectionFormat="of" target="section-5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-response-code-restoration">Response Code Restoration</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.5.2">
              <li pn="section-toc.1-1.5.2.1">
                <t indent="0" pn="section-toc.1-1.5.2.1.1"><xref derivedContent="5.1" format="counter" sectionFormat="of" target="section-5.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-signaled-response-code-rest">Signaled Response Code Restoration</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.6">
            <t indent="0" pn="section-toc.1-1.6.1"><xref derivedContent="6" format="counter" sectionFormat="of" target="section-6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-operational-implications">Operational Implications</xref></t>
          </li>
          <li pn="section-toc.1-1.7">
            <t indent="0" pn="section-toc.1-1.7.1"><xref derivedContent="7" format="counter" sectionFormat="of" target="section-7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-updates-to-rfcs">Updates to RFCs</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.7.2">
              <li pn="section-toc.1-1.7.2.1">
                <t indent="0" pn="section-toc.1-1.7.2.1.1"><xref derivedContent="7.1" format="counter" sectionFormat="of" target="section-7.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-updates-to-rfc-4034">Updates to RFC 4034</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.2">
                <t indent="0" pn="section-toc.1-1.7.2.2.1"><xref derivedContent="7.2" format="counter" sectionFormat="of" target="section-7.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-updates-to-rfc-4035">Updates to RFC 4035</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.8">
            <t indent="0" pn="section-toc.1-1.8.1"><xref derivedContent="8" format="counter" sectionFormat="of" target="section-8"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-security-considerations">Security Considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.9">
            <t indent="0" pn="section-toc.1-1.9.1"><xref derivedContent="9" format="counter" sectionFormat="of" target="section-9"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-iana-considerations">IANA Considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.10">
            <t indent="0" pn="section-toc.1-1.10.1"><xref derivedContent="10" format="counter" sectionFormat="of" target="section-10"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-references">References</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.10.2">
              <li pn="section-toc.1-1.10.2.1">
                <t indent="0" pn="section-toc.1-1.10.2.1.1"><xref derivedContent="10.1" format="counter" sectionFormat="of" target="section-10.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-normative-references">Normative References</xref></t>
              </li>
              <li pn="section-toc.1-1.10.2.2">
                <t indent="0" pn="section-toc.1-1.10.2.2.1"><xref derivedContent="10.2" format="counter" sectionFormat="of" target="section-10.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-informative-references">Informative References</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.11">
            <t indent="0" pn="section-toc.1-1.11.1"><xref derivedContent="Appendix A" format="default" sectionFormat="of" target="section-appendix.a"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-other-approaches">Other Approaches</xref></t>
          </li>
          <li pn="section-toc.1-1.12">
            <t indent="0" pn="section-toc.1-1.12.1"><xref derivedContent="Appendix B" format="default" sectionFormat="of" target="section-appendix.b"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-historical-implementation-n">Historical Implementation Notes</xref></t>
          </li>
          <li pn="section-toc.1-1.13">
            <t indent="0" pn="section-toc.1-1.13.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.c"/><xref derivedContent="" format="title" sectionFormat="of" target="name-acknowledgements">Acknowledgements</xref></t>
          </li>
          <li pn="section-toc.1-1.14">
            <t indent="0" pn="section-toc.1-1.14.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.d"/><xref derivedContent="" format="title" sectionFormat="of" target="name-authors-addresses">Authors' Addresses</xref></t>
          </li>
        </ul>
      </section>
    </toc>
  </front>
  <middle>
    <section anchor="intro" numbered="true" removeInRFC="false" toc="include" pn="section-1">
      <name slugifiedName="name-introduction-and-motivation">Introduction and Motivation</name>
      <t indent="0" pn="section-1-1">
        One of the functions of DNS Security Extensions
        (DNSSEC) <xref target="RFC9364" format="default" sectionFormat="of" derivedContent="RFC9364"/> is
        "authenticated denial of existence",
        i.e., proving that a DNS name or record type does not exist.
        Normally, this is done by means of signed NSEC or NSEC3 records.
        In the precomputed signature model, these records chain together
        existing names, or cryptographic hashes of them, in the zone. In
        the online signing model, described for NSEC in <xref target="RFC4470" format="default" sectionFormat="of" derivedContent="RFC4470"/> and for NSEC3 in
        <xref target="RFC7129" sectionFormat="of" section="B" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7129#appendix-B" derivedContent="RFC7129"/>,
        they are used to dynamically compute an epsilon
        function around the QNAME. The Type Bit Maps field in the data
        of the NSEC or NSEC3 record asserts which resource record (RR) types are
        present at the name.
      </t>
      <t indent="0" pn="section-1-2">
        The response for a nonexistent name requires up to two signed NSEC
        records or up to three signed NSEC3 records (and for online signers,
        the associated cryptographic computation) to prove that (1) the
        name did not explicitly exist in the zone and (2) it could
        not have been synthesized by a wildcard.
      </t>
      <t indent="0" pn="section-1-3">
        This document describes an alternative technique, "Compact Denial
        of Existence" or "Compact Answers",
        to generate a signed DNS response on demand for a nonexistent
        name by claiming that the name exists but has no resource record sets
        associated with the queried type, i.e., it returns a NODATA response
        rather than an NXDOMAIN response. A NODATA response, which has a
        response code (RCODE) of NOERROR and an empty ANSWER section,
        requires only one NSEC or NSEC3 record matching the QNAME.
        This has two advantages: The DNS response size is smaller, and it
        reduces the online cryptographic work involved in generating the
        response.
      </t>
      <t indent="0" pn="section-1-4">
        The use of minimally covering NSEC or NSEC3 records also prevents
        adversaries from enumerating the entire contents of DNS zones
        by walking the NSEC chain or performing an offline dictionary
        attack on the hashes in the NSEC3 chain.
      </t>
      <t indent="0" pn="section-1-5">
        This document assumes a reasonable level of familiarity with DNS
        operations and protocol terms.  Much of the terminology is explained
        in further detail in "DNS Terminology" <xref target="RFC9499" format="default" sectionFormat="of" derivedContent="RFC9499"/>.
      </t>
      <section anchor="reserved-words" numbered="true" removeInRFC="false" toc="include" pn="section-1.1">
        <name slugifiedName="name-requirements-language">Requirements Language</name>
        <t indent="0" pn="section-1.1-1">
    The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
    "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
    described in BCP 14 <xref target="RFC2119" format="default" sectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="default" sectionFormat="of" derivedContent="RFC8174"/> 
    when, and only when, they appear in all capitals, as shown here.
        </t>
      </section>
    </section>
    <section anchor="distinguish" numbered="true" removeInRFC="false" toc="include" pn="section-2">
      <name slugifiedName="name-distinguishing-nonexistent-">Distinguishing Nonexistent Names</name>
      <t indent="0" pn="section-2-1">
        This method generates NODATA responses for nonexistent names
        that don't match a DNS wildcard. Since there are clearly no
        record types for such names, the NSEC Type Bit Maps field in
        the response will only contain the NSEC and RRSIG types
        (and in the case of NSEC3, the Type Bit Maps field will be empty).
        Tools that need to accurately identify nonexistent names in
        responses cannot rely on this specific type bitmap because Empty
        Non-Terminal (ENT) names (which positively exist) also have no
        record types at the name and will return exactly the same Type
        Bit Maps field.
      </t>
      <t indent="0" pn="section-2-2">
        This specification defines the use of NXNAME (128), a synthetic RR
        type to signal the presence of a nonexistent name. See <xref target="iana" format="default" sectionFormat="of" derivedContent="Section 9"/>. The
        mnemonic for this RR type is NXNAME, chosen to clearly
        distinguish it from the response code mnemonic NXDOMAIN.
      </t>
      <t indent="0" pn="section-2-3">
        This RR type is added to the NSEC Type Bit Maps field for responses
        to nonexistent names, in addition to the mandated RRSIG and
        NSEC types. If NSEC3 is being used, this RR type is the sole
        entry in the Type Bit Maps field. It is a "Meta-TYPE", as defined in
        <xref target="RFC6895" format="default" sectionFormat="of" derivedContent="RFC6895"/>, and it stores no data in a DNS zone and
        cannot be usefully queried. <xref target="response-nxname" format="default" sectionFormat="of" derivedContent="Section 3.5"/>
        describes what a DNS resolver or authoritative server should
        do if it receives an explicit query for NXNAME.
      </t>
      <t indent="0" pn="section-2-4">

        No special handling of this RR type is required on the part of
        DNS resolvers. However, resolvers may optionally implement the
        behavior described in <xref target="signaled-rcode" format="default" sectionFormat="of" derivedContent="Section 5.1"/> ("Signaled Response Code Restoration")
        to better restore NXDOMAIN visibility
        to various applications that may remain oblivious to the new
        NXNAME signal.
      </t>
    </section>
    <section anchor="responses" numbered="true" removeInRFC="false" toc="include" pn="section-3">
      <name slugifiedName="name-generating-responses-with-n">Generating Responses with NSEC</name>
      <t indent="0" pn="section-3-1">
    This section describes various types of answers generated by
    authoritative servers implementing Compact Denial of Existence
    using NSEC. <xref target="nsec3" format="default" sectionFormat="of" derivedContent="Section 4"/> describes changes needed to
    support NSEC3.
      </t>
      <section anchor="response-nxd" numbered="true" removeInRFC="false" toc="include" pn="section-3.1">
        <name slugifiedName="name-responses-for-nonexistent-n">Responses for Nonexistent Names</name>
        <t indent="0" pn="section-3.1-1">
        When the authoritative server receives a query for a nonexistent
        name in a zone that it serves, a NODATA response (response code
        NOERROR, empty Answer section) is generated with a dynamically
        constructed NSEC record with the owner name matching the
        QNAME placed in the Authority section.
        </t>
        <t indent="0" pn="section-3.1-2">
        The Next Domain Name field <bcp14>SHOULD</bcp14> be set to the immediate
        lexicographic successor of the QNAME. This is accomplished by
        adding a leading label with a single null (zero-value) octet.
        The Type Bit Maps field <bcp14>MUST</bcp14> only have the bits set for the
        following RR Types: RRSIG, NSEC, and NXNAME.
        </t>
        <t indent="0" pn="section-3.1-3">
        For example, a request for the nonexistent name "a.example.com."
        would result in the generation of the following NSEC record (in DNS
        presentation format):
        </t>
        <sourcecode type="" markers="false" pn="section-3.1-4">
a.example.com. 300 IN NSEC \000.a.example.com. RRSIG NSEC NXNAME
</sourcecode>
        <t indent="0" pn="section-3.1-5">
        The NSEC record <bcp14>MUST</bcp14> have corresponding RRSIGs generated.
        </t>
      </section>
      <section anchor="response-nodata" numbered="true" removeInRFC="false" toc="include" pn="section-3.2">
        <name slugifiedName="name-responses-for-nonexistent-t">Responses for Nonexistent Types</name>
        <t indent="0" pn="section-3.2-1">
        When the authoritative server receives a query for a name
        that exists but has no resource record sets associated with
        the queried type, it generates a NODATA response with
        a dynamically constructed signed NSEC record in the Authority
        section. The owner name of the NSEC record matches the QNAME.
        The Next Domain Name field is set to the immediate lexicographic
        successor of the QNAME. The Type Bit Maps field lists the available
        RR types at the name.
        </t>
        <t indent="0" pn="section-3.2-2">
        An ENT is a special subset of this category,
        where the name has no resource record sets of any type (but
        has descendant names that do). For a query for an ENT,
        the NSEC Type Bit Maps field will only contain RRSIG
        and NSEC. (Note that this is substantially different than the
        ENT response in precomputed NSEC, where the NSEC record has the
        same type bitmap but "covers" rather than matches the ENT and
        has the Next Domain Name field set to the next lexicographic
        descendant of the ENT in the zone.)
        </t>
      </section>
      <section anchor="response-wildcard" numbered="true" removeInRFC="false" toc="include" pn="section-3.3">
        <name slugifiedName="name-responses-for-wildcard-matc">Responses for Wildcard Matches</name>
        <t indent="0" pn="section-3.3-1">
        For wildcard matches, the authoritative server will provide
        a dynamically signed response that claims that the QNAME
        exists explicitly. Specifically, the answer RRset will
        have an RRSIG record demonstrating an exact match (i.e., the
        label count in the RRSIG RDATA will be equal to the number of
        labels in the query name minus the root label). This obviates
        the need to include an NSEC record in the Authority section
        of the response that shows that no closer match than the wildcard
        was possible.
        </t>
        <t indent="0" pn="section-3.3-2">
        For a wildcard NODATA match (where the QNAME matches
        a wildcard but no data for the queried type exists), a response
        akin to a non-wildcard NODATA is returned. The Answer section
        is empty, and the Authority section contains a single NSEC
        record that matches the query name with a Type Bit Maps field
        representing the list of types available at the wildcard.
        </t>
      </section>
      <section anchor="response-referral" numbered="true" removeInRFC="false" toc="include" pn="section-3.4">
        <name slugifiedName="name-responses-for-unsigned-refe">Responses for Unsigned Referrals</name>
        <t indent="0" pn="section-3.4-1">
        Per the DNSSEC protocol, a referral to an unsigned subzone
        includes an NSEC record whose owner name matches the subzone
        and proves the delegation is unsigned by the absence of
        the Delegation Signer (DS) RR type bit in the Type Bit Maps field.
        </t>
        <t indent="0" pn="section-3.4-2">
        With Compact Denial of Existence, the Next Domain Name field
        for this NSEC record is computed with a slightly different
        epsilon function than the immediate lexicographic successor of
        the owner name, as that name would then fall under the delegated
        subzone. Instead, the Next Domain Name field is formed by appending
        a zero octet to the first label of the owner name.
        </t>
        <t indent="0" pn="section-3.4-3">
        For example, a referral response for the subzone sub.example.com
        would include an NSEC record like the following:
        </t>
        <sourcecode type="" markers="false" pn="section-3.4-4">
sub.example.com. 300 IN NSEC sub\000.example.com. NS RRSIG NSEC
</sourcecode>
      </section>
      <section anchor="response-nxname" numbered="true" removeInRFC="false" toc="include" pn="section-3.5">
        <name slugifiedName="name-responses-to-explicit-queri">Responses to Explicit Queries for NXNAME</name>
        <t indent="0" pn="section-3.5-1">
        NXNAME is a Meta-TYPE that <bcp14>SHOULD NOT</bcp14> appear anywhere in
        a DNS message apart from the NSEC type bitmap of a Compact
        Answer response for a nonexistent name. However, if a DNS
        server implementing this specification receives an explicit
        query for the NXNAME RR type, this section describes what the
        response ought to be.
        </t>
        <t indent="0" pn="section-3.5-2">
        If an explicit query for the NXNAME RR type is received, the
        DNS server <bcp14>MUST</bcp14> return a Format Error (response code FORMERR).
        A resolver <bcp14>MUST NOT</bcp14> forward these queries upstream or attempt
        iterative resolution. Many DNS server implementations already
        return errors for all types in the range for Meta-TYPEs and QTYPEs, except
        those types that are already defined to support queries.
        </t>
        <t indent="0" pn="section-3.5-3">
        Optionally, a DNS server <bcp14>MAY</bcp14> also include the following
         Extended DNS Error (EDE) code <xref target="RFC8914" format="default" sectionFormat="of" derivedContent="RFC8914"/> in the
        response: 30 (Invalid Query Type). See <xref target="iana" format="default" sectionFormat="of" derivedContent="Section 9"/>.
        </t>
        <t indent="0" pn="section-3.5-4">
        Note that this EDE code is generally applicable to any
        RR type that ought not appear in DNS queries.
        </t>
      </section>
    </section>
    <section anchor="nsec3" numbered="true" removeInRFC="false" toc="include" pn="section-4">
      <name slugifiedName="name-generating-responses-with-ns">Generating Responses with NSEC3</name>
      <t indent="0" pn="section-4-1">
        NSEC3 <xref target="RFC5155" format="default" sectionFormat="of" derivedContent="RFC5155"/> uses hashed names to
        provide zone enumeration defense. This protection is better
        provided by minimally covering NSEC records. NSEC3's Opt-Out feature
        also provides no specific benefit for online signing implementations
        (minimally covering NSEC3 records provide no useful Opt-Out span).
        Hence, there is no known advantage to implementing Compact Denial
        of Existence with NSEC3. However, an existing implementation of
        conventional NSEC3 online signing migrating to Compact Denial of
        Existence may find it simpler to do so with NSEC3 rather than implementing
        NSEC from scratch.
      </t>
      <t indent="0" pn="section-4-2">
        For NSEC3, the functional details of the protocol remain as
        described in <xref target="responses" format="default" sectionFormat="of" derivedContent="Section 3"/>, with the following
        changes.
      </t>
      <t indent="0" pn="section-4-3">
        NSEC3 records and their signatures are dynamically generated
        instead of NSEC.
      </t>
      <t indent="0" pn="section-4-4">
        The NSEC3 parameters <bcp14>SHOULD</bcp14> be set to algorithm 1, a flags field
        of 0, an additional hash iteration count of 0, and an empty salt.
        In DNS presentation format, this is "1 0 0 -".
      </t>
      <t indent="0" pn="section-4-5">
        The owner name of the NSEC3 resource record is the NSEC3 hash of
        the relevant domain name, encoded in Base32 with Extended Hex
        Alphabet (<xref target="RFC4648" sectionFormat="comma" section="7" format="default" derivedLink="https://rfc-editor.org/rfc/rfc4648#section-7" derivedContent="RFC4648"/>), prepended as a
        single label to the name of the zone. The Next Hashed Owner Name
        is the immediate name successor of the unencoded binary form of
        the previous hash, which can be computed by adding one to the
        binary hash value.
      </t>
      <t indent="0" pn="section-4-6">
        In responses for nonexistent names, the Type Bit Maps field will
        contain only the NXNAME Meta-TYPE. In responses to ENT
        names, the Type Bit Maps field will be empty.
      </t>
      <t indent="0" pn="section-4-7">
        For example, a request for the nonexistent name "a.example.com."
        would result in the generation of the following NSEC3 record:
      </t>
      <sourcecode type="" markers="false" pn="section-4-8">
H64KFA4P1ACER2EBPS9QSDK6DNP8B3JQ.example.com. IN NSEC3 1 0 0 - (
                  H64KFA4P1ACER2EBPS9QSDK6DNP8B3JR NXNAME )
</sourcecode>
      <t indent="0" pn="section-4-9">
        Unlike Compact Denial of Existence with NSEC, no special form of
        the Next Hashed Owner Name field for unsigned referrals is needed. The
        Next Hashed Owner Name field remains the NSEC3 hash of original owner
        name plus one.
      </t>
    </section>
    <section anchor="rcode" numbered="true" removeInRFC="false" toc="include" pn="section-5">
      <name slugifiedName="name-response-code-restoration">Response Code Restoration</name>
      <t indent="0" pn="section-5-1">
        For nonexistent names, implementations should try 
        to preserve the response code value of 3 (NXDOMAIN) whenever possible.  This is
        generally possible for non-DNSSEC-enabled queries, namely those that
        do not set the DO bit ("DNSSEC answer OK") in the EDNS0 OPT header.  For such queries,
        authoritative servers implementing Compact Denial of Existence could
        return a normal NXDOMAIN response. However, there may be limited benefit to
        doing this since most modern DNS resolvers are DNSSEC aware,
        and per <xref target="RFC3225" sectionFormat="of" section="3" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3225#section-3" derivedContent="RFC3225"/>,
        DNSSEC-aware recursive servers are required to set the DO bit on
        outbound queries, regardless of the status of the DO bit on incoming
        requests.
      </t>
      <t indent="0" pn="section-5-2">
        A validating resolver that understands the NXNAME signal from an
        authoritative server could modify the response code from NOERROR
        to NXDOMAIN in responses they return to downstream queriers that
        have not set the DO bit in their requests.
      </t>
      <section anchor="signaled-rcode" numbered="true" removeInRFC="false" toc="include" pn="section-5.1">
        <name slugifiedName="name-signaled-response-code-rest">Signaled Response Code Restoration</name>
        <t indent="0" pn="section-5.1-1">
          This section describes an optional but recommended scheme
          to permit signaled restoration of the NXDOMAIN RCODE for
          DNSSEC-enabled responses. A new EDNS0
          <xref target="RFC6891" format="default" sectionFormat="of" derivedContent="RFC6891"/> header flag is defined
          in the second most significant bit of the flags field in the EDNS0
          OPT header. This flag is referred to as the
          Compact Answers OK (CO) flag.
        </t>
        <artwork name="" type="" align="left" alt="" pn="section-5.1-2">
          +0 (MSB)                +1 (LSB)
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
0: |   EXTENDED-RCODE      |       VERSION         |
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
2: |DO|CO|                 Z                       |
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
</artwork>
        <t indent="0" pn="section-5.1-3">
          When this flag is sent in a query by a resolver, it indicates
          that the resolver will accept a NODATA response with a signed NXNAME
          for a nonexistent name, together with the
          response code field set to NXDOMAIN (3).
        </t>
        <t indent="0" pn="section-5.1-4">
          In responses to such queries, an authoritative server implementing
          both Compact Denial of Existence and this signaling scheme will set
          the Compact Answers OK EDNS header flag and, for nonexistent names,
          will additionally set the response code field to NXDOMAIN.
        </t>
        <t indent="0" pn="section-5.1-5">
          EDNS is a hop-by-hop signal, so resolvers will need to
          record the presence of this flag in associated cache data
          and respond to downstream DNSSEC-enabled queriers
          appropriately. If the querier does not set the Compact
          Answers OK flag, the resolver will need to reset the
          response code back to NOERROR (0) for an NXNAME response.
        </t>
      </section>
    </section>
    <section anchor="operational" numbered="true" removeInRFC="false" toc="include" pn="section-6">
      <name slugifiedName="name-operational-implications">Operational Implications</name>
      <t indent="0" pn="section-6-1">
        For DNSSEC-enabled queries, a signed zone at an authoritative
        server implementing Compact Answers will never return a response
        with a response code of NXDOMAIN, unless they have implemented
        the optional response code restoration feature described in
        <xref target="signaled-rcode" format="default" sectionFormat="of" derivedContent="Section 5.1"/>. Similarly, resolvers not
        implementing this feature will also not be able to return NXDOMAIN.
        In the absence of this, tools that rely on accurately determining
        nonexistent names will need to infer them from the presence of
        the NXNAME RR type in the Type Bit Maps field of the NSEC record
        in NODATA responses from these servers.
      </t>
      <t indent="0" pn="section-6-2">
        Address lookup functions typically invoked by applications
        may need to do more work when dealing with implementations of
        Compact Answers. For example, a NODATA response to the lookup
        of a AAAA record for a nonexistent name can cause such
        functions to issue another query at the same name for an A record,
        whereas an NXDOMAIN response to the first query could suppress
        additional queries for other types at that name. Address lookup
        functions could be enhanced to issue DNSSEC-enabled queries and
        to examine the NSEC Type Bit Maps field in responses to accurately
        determine nonexistent names. Note that this is less of a concern
        with
        connection functions like Happy Eyeballs <xref target="RFC8305" format="default" sectionFormat="of" derivedContent="RFC8305"/> that typically issue back-to-back DNS queries without
        waiting for individual responses.
      </t>
      <t indent="0" pn="section-6-3">
        Protocol optimizations that enable DNS resolvers to synthesize
        NXDOMAIN or wildcard responses, like those described in <xref target="RFC8020" format="default" sectionFormat="of" derivedContent="RFC8020"/> and
        <xref target="RFC8198" format="default" sectionFormat="of" derivedContent="RFC8198"/>, cannot be realized from responses
        that use Compact Denial of Existence. In general, no online signing
        scheme that employs minimally covering NSEC or NSEC3 records
        (including this one) permits NXDOMAIN or wildcard
        response synthesis in the style described in <xref target="RFC8198" format="default" sectionFormat="of" derivedContent="RFC8198"/>. Additionally, this protocol also precludes
        NXDOMAIN synthesis for DNSSEC-enabled responses in the style described in <xref target="RFC8020" format="default" sectionFormat="of" derivedContent="RFC8020"/>.
      </t>
    </section>
    <section anchor="updates" numbered="true" removeInRFC="false" toc="include" pn="section-7">
      <name slugifiedName="name-updates-to-rfcs">Updates to RFCs</name>
      <section anchor="updates4034" numbered="true" removeInRFC="false" toc="include" pn="section-7.1">
        <name slugifiedName="name-updates-to-rfc-4034">Updates to RFC 4034</name>
        <t indent="0" pn="section-7.1-1"><xref target="RFC4034" sectionFormat="of" section="4.1.2" format="default" derivedLink="https://rfc-editor.org/rfc/rfc4034#section-4.1.2" derivedContent="RFC4034"/> 
        ("The Type Bit Maps Field") states the following:</t>
        <blockquote pn="section-7.1-2">
          <t indent="0" pn="section-7.1-2.1">Bits representing pseudo-types <bcp14>MUST</bcp14> be clear, as they do not appear
          in zone data.  If encountered, they <bcp14>MUST</bcp14> be ignored upon being read.</t>
        </blockquote>
        <t indent="0" pn="section-7.1-3">This paragraph is updated to the following:</t>
        <blockquote pn="section-7.1-4">
          <t indent="0" pn="section-7.1-4.1">Bits representing pseudo-types <bcp14>MUST</bcp14> be clear, as
          they do not appear in zone data.  If encountered, they
          <bcp14>MUST</bcp14> be ignored upon being read.  There is one
          exception to this rule for Compact Denial of Existence (RFC 9824),
          where the NXNAME pseudo-type is allowed to appear in responses to
          nonexistent names.</t>
        </blockquote>
        <t indent="0" pn="section-7.1-5">
          Note: As a practical matter, no known resolver insists that
          pseudo-types not be set in the NSEC Type Bit Maps field, so this
          restriction (prior to its revision) has posed no problem for
          the deployment of this mechanism.
        </t>
      </section>
      <section anchor="updates4035" numbered="true" removeInRFC="false" toc="include" pn="section-7.2">
        <name slugifiedName="name-updates-to-rfc-4035">Updates to RFC 4035</name>
        <t indent="0" pn="section-7.2-1"><xref target="RFC4035" sectionFormat="of" section="2.3" format="default" derivedLink="https://rfc-editor.org/rfc/rfc4035#section-2.3" derivedContent="RFC4035"/> 
        ("Including NSEC RRs in a Zone") states the following:</t>
        <blockquote pn="section-7.2-2">
          <t indent="0" pn="section-7.2-2.1">An NSEC record (and its associated RRSIG RRset) <bcp14>MUST NOT</bcp14> be the only RRset at any particular owner name.  That
          is, the signing process <bcp14>MUST NOT</bcp14> create NSEC or RRSIG
          RRs for owner name nodes that were not the owner name of any RRset
          before the zone was signed.  The main reasons for this are a desire
          for namespace consistency between signed and unsigned versions of
          the same zone and a desire to reduce the risk of response
          inconsistency in security oblivious recursive name servers.</t>
        </blockquote>
        <t indent="0" pn="section-7.2-3">
          This paragraph is updated to the following:
        </t>
        <blockquote pn="section-7.2-4">
          <t indent="0" pn="section-7.2-4.1">An NSEC record (and its associated RRSIG RRset) <bcp14>MUST NOT</bcp14> be the only
          RRset at any particular owner name.  That is, the signing process
          <bcp14>MUST NOT</bcp14> create NSEC or RRSIG RRs for owner name nodes that were not
          the owner name of any RRset before the zone was signed.  The main
          reasons for this are a desire for namespace consistency between
          signed and unsigned versions of the same zone and a desire to reduce
          the risk of response inconsistency in security oblivious recursive
          name servers. This concern only applies to implementations of DNSSEC
          that employ precomputed signatures. There is an exception to this
          rule for online signing implementations of DNSSEC (e.g., minimally
          covering NSEC and Compact Denial of Existence), where
          dynamically generated NSEC records can be produced for owner names
          that don't exist or are ENTs.</t>
        </blockquote>
      </section>
    </section>
    <section anchor="security" numbered="true" removeInRFC="false" toc="include" pn="section-8">
      <name slugifiedName="name-security-considerations">Security Considerations</name>
      <t indent="0" pn="section-8-1">
        Online signing of DNS records requires authoritative servers
        for the DNS zone to have access to the private signing keys.
        Exposing signing keys on Internet-reachable servers makes them
        more vulnerable to attack.
      </t>
      <t indent="0" pn="section-8-2">
        Additionally, generating signatures on demand is more
        computationally intensive than returning precomputed
        signatures. Although the Compact Answers scheme reduces the
        number of online signing operations compared to previous
        techniques like White Lies, it still may make authoritative
        servers more vulnerable to computational denial-of-service
        attacks than precomputed signatures. The use of signature
        algorithms (like those based on elliptic curves) that have
        a comparatively low cost for signing is recommended.
      </t>
      <t indent="0" pn="section-8-3">
        Some security tools rely on detection of nonexistent
        domain names by examining the response code field of DNS
        response messages. A NOERROR (rather than
        NXDOMAIN) code in that field will impact such tools. Implementation of the
        optional response code restoration scheme will help recover
        NXDOMAIN visibility for these tools. Note that the DNS
        header is not cryptographically protected, so the response
        code field cannot be authenticated. Thus, inferring the status
        of a response from signed data in the body of the DNS message
        is actually more secure. These tools could be enhanced to
        recognize the (signed) NXNAME signal.
      </t>
      <t indent="0" pn="section-8-4">
        Because this method does not allow for aggressive negative
        caching among resolvers, it allows for certain types
        of denial-of-service attacks to be more effective. This
        includes so-called Pseudorandom Subdomain Attacks
        <xref target="PRSD-ATTACK" format="default" sectionFormat="of" derivedContent="PRSD-ATTACK"/>, where random names
        are queried, either directly via botnets or across a wide
        range of public resolver services, in order to intentionally
        generate nonexistent responses from the authoritative
        servers for a domain. If the resolver cannot synthesize NXDOMAIN
        responses from NSEC records, it must pass all queries on to the
        domain's authority servers, making resource exhaustion more likely
        at those latter servers if they do not have the capacity
        to absorb those additional queries.
      </t>
      <t indent="0" pn="section-8-5">
        If the motivating aspects of this specification (minimizing
        response size and computational costs) are not a concern,
        DNSSEC deployments can opt for a different method (e.g.,
        conventional online signing or precomputed signatures)
        and avoid imposing the challenges of NXDOMAIN visibility.
      </t>
    </section>
    <section anchor="iana" numbered="true" removeInRFC="false" toc="include" pn="section-9">
      <name slugifiedName="name-iana-considerations">IANA Considerations</name>
      <t indent="0" pn="section-9-1">
        IANA has allocated the following in
        the "Resource Record (RR) TYPEs" registry in the "Domain Name System (DNS) Parameters"
        registry group, from the range for Meta-TYPEs. 
        A lower number in this range lowers the size of the
        Type Bit Maps field, which reduces the overall size of the DNS
        response message.
      </t>
      <table align="center" pn="table-1">
        <thead>
          <tr>
            <th align="left" colspan="1" rowspan="1">Type</th>
            <th align="left" colspan="1" rowspan="1">Value</th>
            <th align="left" colspan="1" rowspan="1">Meaning</th>
            <th align="left" colspan="1" rowspan="1">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left" colspan="1" rowspan="1">NXNAME</td>
            <td align="left" colspan="1" rowspan="1">128</td>
            <td align="left" colspan="1" rowspan="1">NXDOMAIN indicator for Compact Denial of Existence</td>
            <td align="left" colspan="1" rowspan="1">RFC 9824</td>
          </tr>
        </tbody>
      </table>
      <t indent="0" pn="section-9-3">
        IANA has also allocated the following flag in the "EDNS Header Flags
        (16 bits)" registry in the "Domain Name System (DNS) Parameters"
        registry group. This flag is described in <xref target="signaled-rcode" format="default" sectionFormat="of" derivedContent="Section 5.1"/>.
      </t>
      <table anchor="blah" align="center" pn="table-2">
        <name/>
        <thead>
          <tr>
            <th align="left" colspan="1" rowspan="1">Bit</th>
            <th align="left" colspan="1" rowspan="1">Flag</th>
            <th align="left" colspan="1" rowspan="1">Description</th>
            <th align="left" colspan="1" rowspan="1">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left" colspan="1" rowspan="1">Bit 1</td>
            <td align="left" colspan="1" rowspan="1">CO</td>
            <td align="left" colspan="1" rowspan="1">Compact Answers OK</td>
            <td align="left" colspan="1" rowspan="1">RFC 9824</td>
          </tr>
        </tbody>
      </table>
      <t indent="0" pn="section-9-5">
        Last, IANA has allocated the following code point in the
        "Extended DNS Error Codes" registry in the "Domain Name System
        (DNS) Parameters" registry group. This code point is described in
        <xref target="response-nxname" format="default" sectionFormat="of" derivedContent="Section 3.5"/>.
      </t>
      <table align="center" pn="table-3">
        <thead>
          <tr>
            <th align="left" colspan="1" rowspan="1">INFO-CODE</th>
            <th align="left" colspan="1" rowspan="1">Purpose</th>
            <th align="left" colspan="1" rowspan="1">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left" colspan="1" rowspan="1">30</td>
            <td align="left" colspan="1" rowspan="1">Invalid Query Type</td>
            <td align="left" colspan="1" rowspan="1">RFC 9824</td>
          </tr>
        </tbody>
      </table>
    </section>
  </middle>
  <back>
    <displayreference target="I-D.valsorda-dnsop-black-lies" to="COMPACT"/>
    <displayreference target="I-D.huque-dnsop-blacklies-ent" to="ENT-SENTINEL"/>
    <displayreference target="I-D.ogud-fake-nxdomain-type" to="NXDOMAIN-TYPE"/>
    <references pn="section-10">
      <name slugifiedName="name-references">References</name>
      <references pn="section-10.1">
        <name slugifiedName="name-normative-references">Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" quoteTitle="true" derivedAnchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t indent="0">In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC3225" target="https://www.rfc-editor.org/info/rfc3225" quoteTitle="true" derivedAnchor="RFC3225">
          <front>
            <title>Indicating Resolver Support of DNSSEC</title>
            <author fullname="D. Conrad" initials="D." surname="Conrad"/>
            <date month="December" year="2001"/>
            <abstract>
              <t indent="0">In order to deploy DNSSEC (Domain Name System Security Extensions) operationally, DNSSEC aware servers should only perform automatic inclusion of DNSSEC RRs when there is an explicit indication that the resolver can understand those RRs. This document proposes the use of a bit in the EDNS0 header to provide that explicit indication and describes the necessary protocol changes to implement that notification. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3225"/>
          <seriesInfo name="DOI" value="10.17487/RFC3225"/>
        </reference>
        <reference anchor="RFC4034" target="https://www.rfc-editor.org/info/rfc4034" quoteTitle="true" derivedAnchor="RFC4034">
          <front>
            <title>Resource Records for the DNS Security Extensions</title>
            <author fullname="R. Arends" initials="R." surname="Arends"/>
            <author fullname="R. Austein" initials="R." surname="Austein"/>
            <author fullname="M. Larson" initials="M." surname="Larson"/>
            <author fullname="D. Massey" initials="D." surname="Massey"/>
            <author fullname="S. Rose" initials="S." surname="Rose"/>
            <date month="March" year="2005"/>
            <abstract>
              <t indent="0">This document is part of a family of documents that describe the DNS Security Extensions (DNSSEC). The DNS Security Extensions are a collection of resource records and protocol modifications that provide source authentication for the DNS. This document defines the public key (DNSKEY), delegation signer (DS), resource record digital signature (RRSIG), and authenticated denial of existence (NSEC) resource records. The purpose and format of each resource record is described in detail, and an example of each resource record is given.</t>
              <t indent="0">This document obsoletes RFC 2535 and incorporates changes from all updates to RFC 2535. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4034"/>
          <seriesInfo name="DOI" value="10.17487/RFC4034"/>
        </reference>
        <reference anchor="RFC4035" target="https://www.rfc-editor.org/info/rfc4035" quoteTitle="true" derivedAnchor="RFC4035">
          <front>
            <title>Protocol Modifications for the DNS Security Extensions</title>
            <author fullname="R. Arends" initials="R." surname="Arends"/>
            <author fullname="R. Austein" initials="R." surname="Austein"/>
            <author fullname="M. Larson" initials="M." surname="Larson"/>
            <author fullname="D. Massey" initials="D." surname="Massey"/>
            <author fullname="S. Rose" initials="S." surname="Rose"/>
            <date month="March" year="2005"/>
            <abstract>
              <t indent="0">This document is part of a family of documents that describe the DNS Security Extensions (DNSSEC). The DNS Security Extensions are a collection of new resource records and protocol modifications that add data origin authentication and data integrity to the DNS. This document describes the DNSSEC protocol modifications. This document defines the concept of a signed zone, along with the requirements for serving and resolving by using DNSSEC. These techniques allow a security-aware resolver to authenticate both DNS resource records and authoritative DNS error indications.</t>
              <t indent="0">This document obsoletes RFC 2535 and incorporates changes from all updates to RFC 2535. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4035"/>
          <seriesInfo name="DOI" value="10.17487/RFC4035"/>
        </reference>
        <reference anchor="RFC4470" target="https://www.rfc-editor.org/info/rfc4470" quoteTitle="true" derivedAnchor="RFC4470">
          <front>
            <title>Minimally Covering NSEC Records and DNSSEC On-line Signing</title>
            <author fullname="S. Weiler" initials="S." surname="Weiler"/>
            <author fullname="J. Ihren" initials="J." surname="Ihren"/>
            <date month="April" year="2006"/>
            <abstract>
              <t indent="0">This document describes how to construct DNSSEC NSEC resource records that cover a smaller range of names than called for by RFC 4034. By generating and signing these records on demand, authoritative name servers can effectively stop the disclosure of zone contents otherwise made possible by walking the chain of NSEC records in a signed zone. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4470"/>
          <seriesInfo name="DOI" value="10.17487/RFC4470"/>
        </reference>
        <reference anchor="RFC4648" target="https://www.rfc-editor.org/info/rfc4648" quoteTitle="true" derivedAnchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t indent="0">This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC5155" target="https://www.rfc-editor.org/info/rfc5155" quoteTitle="true" derivedAnchor="RFC5155">
          <front>
            <title>DNS Security (DNSSEC) Hashed Authenticated Denial of Existence</title>
            <author fullname="B. Laurie" initials="B." surname="Laurie"/>
            <author fullname="G. Sisson" initials="G." surname="Sisson"/>
            <author fullname="R. Arends" initials="R." surname="Arends"/>
            <author fullname="D. Blacka" initials="D." surname="Blacka"/>
            <date month="March" year="2008"/>
            <abstract>
              <t indent="0">The Domain Name System Security (DNSSEC) Extensions introduced the NSEC resource record (RR) for authenticated denial of existence. This document introduces an alternative resource record, NSEC3, which similarly provides authenticated denial of existence. However, it also provides measures against zone enumeration and permits gradual expansion of delegation-centric zones. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5155"/>
          <seriesInfo name="DOI" value="10.17487/RFC5155"/>
        </reference>
        <reference anchor="RFC6891" target="https://www.rfc-editor.org/info/rfc6891" quoteTitle="true" derivedAnchor="RFC6891">
          <front>
            <title>Extension Mechanisms for DNS (EDNS(0))</title>
            <author fullname="J. Damas" initials="J." surname="Damas"/>
            <author fullname="M. Graff" initials="M." surname="Graff"/>
            <author fullname="P. Vixie" initials="P." surname="Vixie"/>
            <date month="April" year="2013"/>
            <abstract>
              <t indent="0">The Domain Name System's wire protocol includes a number of fixed fields whose range has been or soon will be exhausted and does not allow requestors to advertise their capabilities to responders. This document describes backward-compatible mechanisms for allowing the protocol to grow.</t>
              <t indent="0">This document updates the Extension Mechanisms for DNS (EDNS(0)) specification (and obsoletes RFC 2671) based on feedback from deployment experience in several implementations. It also obsoletes RFC 2673 ("Binary Labels in the Domain Name System") and adds considerations on the use of extended labels in the DNS.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="75"/>
          <seriesInfo name="RFC" value="6891"/>
          <seriesInfo name="DOI" value="10.17487/RFC6891"/>
        </reference>
        <reference anchor="RFC6895" target="https://www.rfc-editor.org/info/rfc6895" quoteTitle="true" derivedAnchor="RFC6895">
          <front>
            <title>Domain Name System (DNS) IANA Considerations</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <date month="April" year="2013"/>
            <abstract>
              <t indent="0">This document specifies Internet Assigned Numbers Authority (IANA) parameter assignment considerations for the allocation of Domain Name System (DNS) resource record types, CLASSes, operation codes, error codes, DNS protocol message header bits, and AFSDB resource record subtypes. It obsoletes RFC 6195 and updates RFCs 1183, 2845, 2930, and 3597.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="42"/>
          <seriesInfo name="RFC" value="6895"/>
          <seriesInfo name="DOI" value="10.17487/RFC6895"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" quoteTitle="true" derivedAnchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t indent="0">RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8914" target="https://www.rfc-editor.org/info/rfc8914" quoteTitle="true" derivedAnchor="RFC8914">
          <front>
            <title>Extended DNS Errors</title>
            <author fullname="W. Kumari" initials="W." surname="Kumari"/>
            <author fullname="E. Hunt" initials="E." surname="Hunt"/>
            <author fullname="R. Arends" initials="R." surname="Arends"/>
            <author fullname="W. Hardaker" initials="W." surname="Hardaker"/>
            <author fullname="D. Lawrence" initials="D." surname="Lawrence"/>
            <date month="October" year="2020"/>
            <abstract>
              <t indent="0">This document defines an extensible method to return additional information about the cause of DNS errors. Though created primarily to extend SERVFAIL to provide additional information about the cause of DNS and DNSSEC failures, the Extended DNS Errors option defined in this document allows all response types to contain extended error information. Extended DNS Error information does not change the processing of RCODEs.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8914"/>
          <seriesInfo name="DOI" value="10.17487/RFC8914"/>
        </reference>
        <reference anchor="RFC9364" target="https://www.rfc-editor.org/info/rfc9364" quoteTitle="true" derivedAnchor="RFC9364">
          <front>
            <title>DNS Security Extensions (DNSSEC)</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="February" year="2023"/>
            <abstract>
              <t indent="0">This document describes the DNS Security Extensions (commonly called "DNSSEC") that are specified in RFCs 4033, 4034, and 4035, as well as a handful of others. One purpose is to introduce all of the RFCs in one place so that the reader can understand the many aspects of DNSSEC. This document does not update any of those RFCs. A second purpose is to state that using DNSSEC for origin authentication of DNS data is the best current practice. A third purpose is to provide a single reference for other documents that want to refer to DNSSEC.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="237"/>
          <seriesInfo name="RFC" value="9364"/>
          <seriesInfo name="DOI" value="10.17487/RFC9364"/>
        </reference>
      </references>
      <references pn="section-10.2">
        <name slugifiedName="name-informative-references">Informative References</name>
        <reference anchor="I-D.valsorda-dnsop-black-lies" target="https://datatracker.ietf.org/doc/html/draft-valsorda-dnsop-black-lies-00" quoteTitle="true" derivedAnchor="COMPACT">
          <front>
            <title>Compact DNSSEC Denial of Existence or Black Lies</title>
            <author fullname="Filippo Valsorda" initials="F." surname="Valsorda">
              <organization showOnFrontPage="true">CloudFlare Inc.</organization>
            </author>
            <author fullname="Olafur Gudmundsson" initials="O." surname="Gudmundsson">
              <organization showOnFrontPage="true">CloudFlare Inc.</organization>
            </author>
            <date day="21" month="March" year="2016"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-valsorda-dnsop-black-lies-00"/>
          <refcontent>Work in Progress</refcontent>
        </reference>
        <reference anchor="I-D.huque-dnsop-blacklies-ent" target="https://datatracker.ietf.org/doc/html/draft-huque-dnsop-blacklies-ent-01" quoteTitle="true" derivedAnchor="ENT-SENTINEL">
          <front>
            <title>Empty Non-Terminal Sentinel for Black Lies</title>
            <author fullname="Shumon Huque" initials="S." surname="Huque">
              <organization showOnFrontPage="true">Salesforce</organization>
            </author>
            <date day="27" month="July" year="2021"/>
            <abstract>
              <t indent="0">The Black Lies method of providing compact DNSSEC denial of existence proofs has some operational implications. Depending on the specific implementation, it may provide no way to reliably distinguish Empty Non-Terminal names from names that actually do not exist. This draft describes the use of a synthetic DNS resource record type to act as an explicit signal for Empty Non-Terminal names and which is conveyed in an NSEC type bitmap.</t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-huque-dnsop-blacklies-ent-01"/>
          <refcontent>Work in Progress</refcontent>
        </reference>
        <reference anchor="I-D.ogud-fake-nxdomain-type" target="https://datatracker.ietf.org/doc/html/draft-ogud-fake-nxdomain-type-00" quoteTitle="true" derivedAnchor="NXDOMAIN-TYPE">
          <front>
            <title>Signaling NSEC record owner name nonexistence</title>
            <author fullname="Olafur Gudmundsson" initials="O." surname="Gudmundsson">
              <organization showOnFrontPage="true">CloudFlare Inc.</organization>
            </author>
            <author fullname="Filippo Valsorda" initials="F." surname="Valsorda">
              <organization showOnFrontPage="true">CloudFlare Inc.</organization>
            </author>
            <date day="7" month="May" year="2015"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ogud-fake-nxdomain-type-00"/>
          <refcontent>Work in Progress</refcontent>
        </reference>
        <reference anchor="PRSD-ATTACK" target="https://conference.apnic.net/data/39/dnswatertortureonqtnet_1425130417_1425507043.pptx" quoteTitle="true" derivedAnchor="PRSD-ATTACK">
          <front>
            <title>Water Torture: A Slow Drip DNS DDoS Attack on QTNet</title>
            <author fullname="Kei Nishida" initials="K" surname="Nishida"/>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC7129" target="https://www.rfc-editor.org/info/rfc7129" quoteTitle="true" derivedAnchor="RFC7129">
          <front>
            <title>Authenticated Denial of Existence in the DNS</title>
            <author fullname="R. Gieben" initials="R." surname="Gieben"/>
            <author fullname="W. Mekking" initials="W." surname="Mekking"/>
            <date month="February" year="2014"/>
            <abstract>
              <t indent="0">Authenticated denial of existence allows a resolver to validate that a certain domain name does not exist. It is also used to signal that a domain name exists but does not have the specific resource record (RR) type you were asking for. When returning a negative DNS Security Extensions (DNSSEC) response, a name server usually includes up to two NSEC records. With NSEC version 3 (NSEC3), this amount is three.</t>
              <t indent="0">This document provides additional background commentary and some context for the NSEC and NSEC3 mechanisms used by DNSSEC to provide authenticated denial-of-existence responses.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7129"/>
          <seriesInfo name="DOI" value="10.17487/RFC7129"/>
        </reference>
        <reference anchor="RFC8020" target="https://www.rfc-editor.org/info/rfc8020" quoteTitle="true" derivedAnchor="RFC8020">
          <front>
            <title>NXDOMAIN: There Really Is Nothing Underneath</title>
            <author fullname="S. Bortzmeyer" initials="S." surname="Bortzmeyer"/>
            <author fullname="S. Huque" initials="S." surname="Huque"/>
            <date month="November" year="2016"/>
            <abstract>
              <t indent="0">This document states clearly that when a DNS resolver receives a response with a response code of NXDOMAIN, it means that the domain name which is thus denied AND ALL THE NAMES UNDER IT do not exist.</t>
              <t indent="0">This document clarifies RFC 1034 and modifies a portion of RFC 2308: it updates both of them.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8020"/>
          <seriesInfo name="DOI" value="10.17487/RFC8020"/>
        </reference>
        <reference anchor="RFC8198" target="https://www.rfc-editor.org/info/rfc8198" quoteTitle="true" derivedAnchor="RFC8198">
          <front>
            <title>Aggressive Use of DNSSEC-Validated Cache</title>
            <author fullname="K. Fujiwara" initials="K." surname="Fujiwara"/>
            <author fullname="A. Kato" initials="A." surname="Kato"/>
            <author fullname="W. Kumari" initials="W." surname="Kumari"/>
            <date month="July" year="2017"/>
            <abstract>
              <t indent="0">The DNS relies upon caching to scale; however, the cache lookup generally requires an exact match. This document specifies the use of NSEC/NSEC3 resource records to allow DNSSEC-validating resolvers to generate negative answers within a range and positive answers from wildcards. This increases performance, decreases latency, decreases resource utilization on both authoritative and recursive servers, and increases privacy. Also, it may help increase resilience to certain DoS attacks in some circumstances.</t>
              <t indent="0">This document updates RFC 4035 by allowing validating resolvers to generate negative answers based upon NSEC/NSEC3 records and positive answers in the presence of wildcards.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8198"/>
          <seriesInfo name="DOI" value="10.17487/RFC8198"/>
        </reference>
        <reference anchor="RFC8305" target="https://www.rfc-editor.org/info/rfc8305" quoteTitle="true" derivedAnchor="RFC8305">
          <front>
            <title>Happy Eyeballs Version 2: Better Connectivity Using Concurrency</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <date month="December" year="2017"/>
            <abstract>
              <t indent="0">Many communication protocols operating over the modern Internet use hostnames. These often resolve to multiple IP addresses, each of which may have different performance and connectivity characteristics. Since specific addresses or address families (IPv4 or IPv6) may be blocked, broken, or sub-optimal on a network, clients that attempt multiple connections in parallel have a chance of establishing a connection more quickly. This document specifies requirements for algorithms that reduce this user-visible delay and provides an example algorithm, referred to as "Happy Eyeballs". This document obsoletes the original algorithm description in RFC 6555.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8305"/>
          <seriesInfo name="DOI" value="10.17487/RFC8305"/>
        </reference>
        <reference anchor="RFC9499" target="https://www.rfc-editor.org/info/rfc9499" quoteTitle="true" derivedAnchor="RFC9499">
          <front>
            <title>DNS Terminology</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <author fullname="K. Fujiwara" initials="K." surname="Fujiwara"/>
            <date month="March" year="2024"/>
            <abstract>
              <t indent="0">The Domain Name System (DNS) is defined in literally dozens of different RFCs. The terminology used by implementers and developers of DNS protocols, and by operators of DNS systems, has changed in the decades since the DNS was first defined. This document gives current definitions for many of the terms used in the DNS in a single document.</t>
              <t indent="0">This document updates RFC 2308 by clarifying the definitions of "forwarder" and "QNAME". It obsoletes RFC 8499 by adding multiple terms and clarifications. Comprehensive lists of changed and new definitions can be found in Appendices A and B.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="219"/>
          <seriesInfo name="RFC" value="9499"/>
          <seriesInfo name="DOI" value="10.17487/RFC9499"/>
        </reference>
      </references>
    </references>
    <section anchor="other-approaches" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.a">
      <name slugifiedName="name-other-approaches">Other Approaches</name>
      <t indent="0" pn="section-appendix.a-1">
        In the past, some implementations of Compact Denial of Existence
        have used other means to differentiate NXDOMAIN from ENTs.
      </t>
      <t indent="0" pn="section-appendix.a-2">
        One method employed by both Cloudflare and Amazon Route53 for
        a period of time was the following: For responses to ENTs,
        they synthesized the NSEC Type Bit Maps field to include
        all record types supported except for the queried type. This
        method has the undesirable effect of no longer being able to
        reliably determine the existence of ENTs and of making the Type
        Bit Maps field larger than it needs to be. It also has the potential
        to confuse validators and others tools that infer type existence
        from the NSEC record.
      </t>
      <t indent="0" pn="section-appendix.a-3">
        Another way to distinguish NXDOMAIN from ENT is to
        define the synthetic RR type for ENTs instead,
        as specified in <xref target="I-D.huque-dnsop-blacklies-ent" format="default" sectionFormat="of" derivedContent="ENT-SENTINEL"/>.
        This method was successfully deployed in the field by NS1 for a
        period of time. This typically imposes less work on the server
        since NXDOMAIN responses are a lot more common than ENTs. At the
        time it was deployed, it also allowed a common bitmap pattern
        ("NSEC RRSIG") to identify NXDOMAIN across this and other
        implementations that returned a broad bitmap pattern for 
        ENTs. However, the advantage of the NXNAME RR type is
        that it explicitly identifies NXDOMAIN responses and allows
        them to be distinguished conclusively from potential ENT responses
        in other online signing NSEC implementations.
      </t>
    </section>
    <section anchor="implementations" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.b">
      <name slugifiedName="name-historical-implementation-n">Historical Implementation Notes</name>
      <t indent="0" pn="section-appendix.b-1">
        At the time of publication, the basic Compact Denial of Existence
        method using NSEC is implemented by Cloudflare, NS1, Amazon Route53,
        and Knot DNS's optional online signing module. From early 2021 until
        November 2023, NS1 had deployed the ENT distinguisher
        <xref target="I-D.huque-dnsop-blacklies-ent" format="default" sectionFormat="of" derivedContent="ENT-SENTINEL"/> using the private
        RR type code 65281. A version of the NXNAME distinguisher using
        the private RR type code 65238 was deployed by both Cloudflare
        (from July 2023) and NS1 (from November 2023) until roughly
        September 2024. Since September 2024, both Cloudflare and NS1 have
        deployed NXNAME using the officially allocated code point of 128.
        Oracle Cloud Initiative implemented Compact Denial of Existence
        using NSEC3 in October 2024.
      </t>
    </section>
    <section anchor="acks" numbered="false" removeInRFC="false" toc="include" pn="section-appendix.c">
      <name slugifiedName="name-acknowledgements">Acknowledgements</name>
      <t indent="0" pn="section-appendix.c-1">The Compact Answers technique was
      originally proposed in <xref target="I-D.valsorda-dnsop-black-lies" format="default" sectionFormat="of" derivedContent="COMPACT"/> by <contact fullname="Filippo Valsorda"/> and
      <contact fullname="Olafur Gudmundsson"/> and implemented by
      Cloudflare. The ENT distinguisher RR type was originally
      proposed in <xref target="I-D.huque-dnsop-blacklies-ent" format="default" sectionFormat="of" derivedContent="ENT-SENTINEL"/> by <contact fullname="Shumon Huque"/> and deployed by
      NS1.  The NXNAME type is based on the FDOM type proposed in <xref target="I-D.ogud-fake-nxdomain-type" format="default" sectionFormat="of" derivedContent="NXDOMAIN-TYPE"/> by Gudmundsson
      and Valsorda.</t>
      <t indent="0" pn="section-appendix.c-2">Especially detailed discussions on many technical aspects of this
      document were conducted with <contact fullname="Paul Vixie"/>, <contact fullname="Jan Včelák"/>, <contact fullname="Viktor Dukhovni"/>, <contact fullname="Ed Lewis"/>, and <contact fullname="John Levine"/>. The
      authors would also like to thank the many other members of the IETF DNS
      Operations Working Group for helpful comments and discussions.</t>
    </section>
    <section anchor="authors-addresses" numbered="false" removeInRFC="false" toc="include" pn="section-appendix.d">
      <name slugifiedName="name-authors-addresses">Authors' Addresses</name>
      <author fullname="Shumon Huque" initials="S." surname="Huque">
        <organization showOnFrontPage="true">Salesforce</organization>
        <address>
          <postal>
            <street>415 Mission Street, 3rd Floor</street>
            <city>San Francisco</city>
            <region>CA</region>
            <code>94105</code>
            <country>United States of America</country>
          </postal>
          <email>shuque@gmail.com</email>
        </address>
      </author>
      <author fullname="Christian Elmerot" initials="C." surname="Elmerot">
        <organization showOnFrontPage="true">Cloudflare</organization>
        <address>
          <postal>
            <street>101 Townsend St.</street>
            <city>San Francisco</city>
            <region>CA</region>
            <code>94107</code>
            <country>United States of America</country>
          </postal>
          <email>elmerot@cloudflare.com</email>
        </address>
      </author>
      <author fullname="Olafur Gudmundsson" initials="O." surname="Gudmundsson">
        <organization showOnFrontPage="true"/>
        <address>
          <email>ogud@ogud.com</email>
        </address>
      </author>
    </section>
  </back>
</rfc>
