<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp "&#160;">
  <!ENTITY zwsp "&#8203;">
  <!ENTITY nbhy "&#8209;">
  <!ENTITY wj "&#8288;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     ipr="trust200902"
     docName="draft-manelidis-dnsop-domain-affiliation-01"
     category="std"
     consensus="true"
     submissionType="IETF"
     xml:lang="en"
     tocInclude="true"
     tocDepth="3"
     symRefs="true"
     sortRefs="true"
     version="3">

  <front>
    <title abbrev="Domain Affiliation Confirmation">Domain Affiliation Confirmation (DAC)</title>
    <seriesInfo name="Internet-Draft" value="draft-manelidis-dnsop-domain-affiliation-01"/>

    <author fullname="Dimitri Manelidis" initials="D." surname="Manelidis">
      <address>
        <email>tastypepperoni@gmail.com</email>
      </address>
    </author>

    <author fullname="Fabio Ramos" initials="F." surname="Ramos">
      <address>
        <email>fabio@martian.pink</email>
      </address>
    </author>

    <date year="2026" month="October" day="31"/>

    <area>Operations and Management</area>
    <workgroup>Network Working Group</workgroup>

    <keyword>DNS</keyword>
    <keyword>affiliation</keyword>
    <keyword>phishing</keyword>
    <keyword>takedown</keyword>
    <keyword>reputation</keyword>
    <keyword>TXT</keyword>

    <abstract>
      <t>
        Security systems assess domain names one at a time.  A new domain of an
        established organization therefore starts with no reputation, and a
        legitimate domain that resembles another organization's name can be
        reported as an impersonation.  This document defines Domain Affiliation
        Confirmation (DAC), by which the operator of one domain, the confirming
        domain, confirms that another domain, the affiliated domain, is operated
        by it or under its authority.  The two domains need not be related in the
        DNS hierarchy.  The affiliated domain publishes a DNS record naming the
        confirming domain and a random token; the confirming domain confirms that
        token, in the DNS or over HTTPS, by naming the affiliated domain.
        Verification takes at most three DNS queries and one HTTPS request.  The
        confirming domain
        publishes no list of its domains, and an affiliation is ended by deleting
        one record.  The document also states
        what a confirmation means to relying parties such as takedown services and
        reputation systems.
      </t>
    </abstract>

    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Discussion of this document takes place on the Domain Name System Operations
        (DNSOP) Working Group mailing list (dnsop@ietf.org).  A reference
        implementation with test vectors accompanies this draft (<xref target="impl"/>).
      </t>
    </note>
  </front>

  <middle>

    <section anchor="intro">
      <name>Introduction</name>

      <section anchor="problem">
        <name>Problem Statement</name>
        <t>
          Mail filters, browser warning systems, secure web gateways, and
          brand-protection services evaluate domain names individually.  Two
          consequences follow for organizations that operate more than one domain.
        </t>
        <dl newline="false" spacing="normal">
          <dt>New domains start without reputation.</dt>
          <dd>
            When an organization launches a product or service under a new domain
            name, that name is treated as unknown, and often as suspicious, because
            nothing tells the evaluating system that it is operated by the same
            organization as an established domain.
          </dd>
          <dt>Legitimate look-alikes are reported as impersonations.</dt>
          <dd>
            Brand-protection services search for newly registered names that resemble
            their clients' names.  A legitimate domain of one organization can
            resemble the name of an unrelated organization.  The service has no
            standard way to learn that the domain is operated by an established
            organization and may ask the domain's registrar or hosting provider to
            suspend it.  Erroneous takedown requests can disable an entire
            legitimate domain <xref target="ITCHIO"/>.
          </dd>
        </dl>
        <t>
          Both problems would be reduced if an evaluating system could ask a precise
          question and get an answer from the party able to give it: "Does the
          operator of this established domain confirm that it operates this other
          domain?"  No deployed mechanism answers it.  Registration data
          <xref target="RFC9083"/> is frequently redacted and was not designed to
          express relationships between domains, and certificates bind keys to names,
          not names to each other.
        </t>
        <t>
          An organization's internal records and policies do not answer the question
          either.  They tell the organization which domains it operates, but a
          takedown service, a mail filter, or a reputation system that encounters one
          of those domains has no access to them and no means of checking them.  The
          answer has to be published where any such party can retrieve it, and it has
          to come from the operator of the established domain.
        </t>
        <t>
          The same question arises when software agents act for an organization under
          domain names of their own.  A party that receives a request from an agent's
          domain, which may be new and have no reputation, may want to know which
          established domain stands behind it.
        </t>
      </section>

      <section anchor="overview-intro">
        <name>This Document</name>
        <t>
          This document defines Domain Affiliation Confirmation (DAC).  The domain to
          be affiliated (the affiliated domain) publishes a DNS record that names the
          established domain (the confirming domain) and carries a random token.  The
          confirming domain confirms the affiliation by publishing, under a name derived
          from that token, a record that names the affiliated domain.  A verifier reads
          the affiliated domain's record, reads the confirming domain's confirmation, and
          checks that the confirmation names the affiliated domain it started from.
        </t>
        <t>
          "Confirming domain" and "affiliated domain" name roles in this protocol only.
          They imply no hierarchy or delegation in the DNS.  The two domains can be at
          the same level, under different top-level domains, or in different scripts,
          and either can be the older one.  Publishing an affiliation requires no
          action by a registry or registrar.
        </t>
        <t>
          The document also states what a confirmation means
          (<xref target="semantics"/>): the confirming operator indicates that it
          operates the affiliated domain or authorizes its operation, and that reports of abuse
          concerning the affiliated domain may be directed to it.  A relationship that relying
          parties are not meant to act on would leave the problems above unsolved
          (<xref target="rationale-meaning"/>).
        </t>
        <t>
          DAC is intended for systems that evaluate domains without a person in the
          loop, such as takedown services, reputation systems, mail filters, and
          registries.  Such systems already examine a domain at a defined time, for
          example when a report about it is received, when it is first observed, or
          when it is scored, and they perform the verification at that time.  DAC
          does not require that affiliations be shown to users.
        </t>
      </section>

      <section anchor="goals">
        <name>Design Goals</name>
        <ol spacing="normal">
          <li>
            <t>
              Only the confirming domain can create an affiliation.  A claim the confirming domain has not
              confirmed has no effect, and a confirmation for one affiliated domain cannot be
              reused for another.
            </t>
          </li>
          <li>
            <t>
              The confirming domain publishes nothing from which its affiliated domains can be
              listed.  Each affiliated domain's claim is public, so affiliated domains can be
              found by examining domains individually, as with any public DNS data.
            </t>
          </li>
          <li>
            <t>
              An affiliation is ended by deleting one record at the confirming domain, without
              any change at the affiliated domain.  The change takes effect within cache and
              DNSSEC signature lifetimes (<xref target="sec-replay"/>).
            </t>
          </li>
          <li>
            <t>
              No new key material.  The protocol relies on the confirming domain's existing
              control of its DNS zone or, optionally, its web origin.
            </t>
          </li>
          <li>
            <t>
              Bounded cost.  Verification takes at most three TXT queries, plus one
              HTTPS request and its address resolution when the confirming domain
              uses that channel or its marker is not validated as secure, with no
              recursion and no searching.
            </t>
          </li>
          <li>
            <t>
              Deployable with existing tools.  Records are TXT records at
              underscored names <xref target="RFC8552"/>.
            </t>
          </li>
          <li>
            <t>
              The verification procedure does not consult a list of public suffixes.
              Every confirmation requires a record that only the confirming operator
              can publish.
            </t>
          </li>
        </ol>
      </section>

      <section anchor="nongoals">
        <name>Non-Goals</name>
        <t>
          DAC does not establish the identity, legitimacy, or licensing of the
          confirming operator.  It conveys a statement by whoever operates the confirming
          domain; whether that party deserves trust is for each relying party to
          decide (<xref target="semantics"/>).
        </t>
        <t>
          DAC does not express relationships between independent organizations, such
          as partnerships or service providers (<xref target="rationale-transitive"/>).
        </t>
        <t>
          DAC does not define where administrative boundaries in the DNS lie.
          Relying parties may still need such information to decide which names to
          evaluate.
        </t>
        <t>
          DAC does not detect impersonation.  A domain that impersonates an
          organization can publish a claim naming that organization's domain, but the
          claim is not confirmed (<xref target="sec-forged"/>), and the organization
          can learn of it through failure reports (<xref target="reports"/>).  A
          domain that publishes no claim, or whose claim is not confirmed, is not
          thereby shown to be an impersonation (<xref target="semantics-use"/>).
        </t>
        <t>
          DAC does not establish which legal entity operates a domain.  A
          confirmation can state whether the two domains are operated by the same
          legal entity (<xref target="confirmation"/>), but that statement is made by
          the confirming operator and is not verified by DAC.
        </t>
      </section>

      <section anchor="related">
        <name>Relationship to Other Work</name>
        <t>
          <xref target="I-D.ietf-dnsop-domain-verification-techniques"/> describes
          how a service verifies that a user controls a domain.  DAC follows its
          practices for TXT records at underscored names and for tokens, but records
          a standing relationship between two domains rather than proving control of
          one domain to one service.
        </t>
        <t>
          <xref target="I-D.ietf-regext-epp-same-entity"/> lets registries and
          registrars keep a set of names that a registry policy treats as related,
          such as variants of an internationalized name, with one registrant.  DAC
          depends on no registry policy and is published by the domains'
          operators.  A registry or registrar can, however, use DAC results when it
          registers a domain or reuses an earlier verification of a registrant
          (<xref target="registry"/>).
        </t>
        <t>
          Related Domains By DNS <xref target="I-D.brotman-rdbd"/> lets a domain
          declare or disavow a relationship with another domain, using new resource
          record types and optional signatures.  It signals that some relationship
          exists without defining its meaning.  DAC uses TXT records, requires a
          record by each of the two domains, defines what a confirmation states
          (<xref target="semantics"/>), and uses no key material
          (<xref target="rationale-signatures"/>).
        </t>
        <t>
          The DBOUND work <xref target="I-D.tjw-dbound2-problem-statement"/> addresses
          administrative boundaries in the DNS, such as where one organization's names
          end and another's begin below a common suffix.  DAC does not define such
          boundaries (<xref target="nongoals"/>); it relates two domains that may be
          anywhere in the DNS.
        </t>
        <t>
          Related Website Sets <xref target="RWS"/> let a group of web sites
          declare that they belonged together, through a file at each site and a
          centrally reviewed list, so that a browser could apply its privacy rules
          to the group.  DAC involves no central list, is not specific to the web,
          and is intended for systems that assess abuse.
        </t>
        <t>
          <xref target="I-D.ihsanullah-dnsid"/> binds the domain name of a software
          agent to an accountable entity identified by a domain under that entity's
          control.  DAC is not specific to agents and expresses a relationship
          between any two domains (<xref target="overview-intro"/>).
        </t>
        <t>
          <xref target="I-D.mozleywilliams-dnsop-dnsaid"/> describes how an
          organization publishes its software agents in the DNS under a domain.
          When the agents are published under a domain of their own, DAC relates
          that domain to the organization's established domain.
        </t>
        <t>
          <xref target="I-D.barrett-dnsop-domain-set"/> lets the domains operated by
          one organization attest to each other by listing other members, in the DNS or
          in a file over HTTPS; in DAC, the confirming domain publishes nothing from
          which its affiliated domains can be listed (<xref target="rationale-list"/>).
        </t>
      </section>

      <section anchor="bcp14">
        <name>Requirements Language</name>
        <t>
          The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
          "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
          NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>",
          "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
          "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to
          be interpreted as described in BCP&nbsp;14 <xref target="RFC2119"/>
          <xref target="RFC8174"/> when, and only when, they appear in all capitals,
          as shown here.
        </t>
      </section>
    </section>

    <section anchor="terminology">
      <name>Terminology</name>
      <t>
        DNS terms are used as defined in <xref target="RFC9499"/>.  This document
        also uses the following terms.
      </t>
      <dl newline="false" spacing="normal">
        <dt>Affiliated domain:</dt>
        <dd>The domain name whose affiliation is declared or verified.</dd>
        <dt>Confirming domain:</dt>
        <dd>The domain name that the affiliated domain names as its confirming domain.</dd>
        <dt>Confirming operator:</dt>
        <dd>
          The party that controls the content of the confirming domain's DNS zone or,
          for confirmations over HTTPS, of the confirming domain's HTTPS origin.
        </dd>
        <dt>Claim:</dt>
        <dd>The TXT record published by the affiliated domain (<xref target="claim"/>).</dd>
        <dt>Marker:</dt>
        <dd>
          The TXT record by which a confirming domain indicates that it participates and
          selects a confirmation channel (<xref target="marker"/>).
        </dd>
        <dt>Confirmation:</dt>
        <dd>
          The record by which the confirming domain confirms one claim, published in the
          DNS (<xref target="confirmation"/>) or over HTTPS
          (<xref target="https"/>).
        </dd>
        <dt>Token:</dt>
        <dd>
          A random value, unique to one affiliated domain, that links a claim to its
          confirmation (<xref target="tokens"/>).
        </dd>
        <dt>Verifier:</dt>
        <dd>A party that carries out the procedure in <xref target="verify"/>.</dd>
        <dt>Relying party:</dt>
        <dd>
          A party that makes decisions using verification results, such as a
          takedown service, a mail filter, or a reputation system.
        </dd>
      </dl>
      <t>
        In examples, "bank.example" is the confirming domain and "embank.example" is the
        affiliated domain <xref target="RFC2606"/>.  The token used in examples,
        "mfrggzdfmztwq2lknnwg23tpobyxe43u", is illustrative and not random.
      </t>
    </section>

    <section anchor="overview">
      <name>Protocol Overview</name>
      <t>
        An affiliation consists of three records.  The claim is published by the
        affiliated domain; the marker and the confirmation are published by the confirming domain.
      </t>
      <figure anchor="fig-overview">
        <name>Records and Verification Steps</name>
        <artwork type="ascii-art" align="left"><![CDATA[
 Affiliated: embank.example         Confirming: bank.example
+-------------------------------+  +--------------------------------+
| _affiliation.embank.example.  |  | _affiliation.bank.example.     |
|   TXT "v=DAC1;                |  |   TXT "v=DAC1"        (marker) |
|     p=bank.example;           |  |                                |
|     t=<token>"        (claim) |  | <token>._affiliation.          |
+-------------------------------+  |        bank.example.           |
                                   |   TXT "v=DAC1;                 |
                                   |     d=embank.example"          |
                                   |                 (confirmation) |
                                   +--------------------------------+

Verifier:
 1. TXT _affiliation.embank.example  -> p=bank.example, t=<token>
 2. TXT _affiliation.bank.example    -> marker, channel "dns"
 3. TXT <token>._affiliation.bank.example
                                     -> d=embank.example
 4. d= equals the affiliated domain  -> result "confirmed"
]]></artwork>
      </figure>
      <t>
        A claim copied to another domain fails because the confirmation names the
        original affiliated domain.  Confirmation names cannot be found without the
        corresponding claims, because they contain the token.  The marker prevents
        a wildcard elsewhere in the confirming domain's zone from answering for confirmation
        names (<xref target="sec-wildcard"/>) and tells the verifier which channel
        the confirming domain uses.
      </t>
    </section>

    <section anchor="records">
      <name>Records</name>

      <section anchor="syntax">
        <name>Common Syntax</name>
        <t>
          The three records share one tag-list syntax: a version tag followed by
          zero or more tags, separated by semicolons.  The ABNF
          <xref target="RFC5234"/> below uses case-sensitive strings
          <xref target="RFC7405"/>; WSP, ALPHA, and DIGIT are the core rules of
          <xref target="RFC5234"/>.
        </t>
        <sourcecode type="abnf" name="dac.abnf" markers="true"><![CDATA[
record      = *WSP v-tag *( *WSP ";" *WSP tag ) [ *WSP ";" ] *WSP
v-tag       = %s"v" *WSP "=" *WSP %s"DAC1"
tag         = tag-name *WSP "=" *WSP tag-value
tag-name    = ALPHA *( ALPHA / DIGIT / "_" )
tag-value   = 1*tval-char
tval-char   = %x21-3A / %x3C-7E        ; VCHAR except ";"

p-value     = domain                   ; claim: confirming domain
t-value     = 26*52b32-char            ; claim: token
c-value     = 1*tval-char              ; marker: channel
m-value     = 1*tval-char              ; marker: mode
r-value     = 1*tval-char              ; marker: abuse contact URI
d-value     = domain                   ; confirmation: affiliated
s-value     = 1*tval-char              ; confirmation: scope
rel-value   = 1*tval-char              ; confirmation: relationship
x-value     = 4DIGIT "-" 2DIGIT "-" 2DIGIT ; confirmation: expiry
f-value     = 1*tval-char              ; marker: report URI

domain      = label *( "." label )
label       = ld-char [ *61ldh-char ld-char ]
ld-char     = %x61-7A / DIGIT          ; lowercase letters and digits
ldh-char    = ld-char / "-"
b32-char    = %x61-7A / %x32-37        ; RFC 4648 base32, lowercase
]]></sourcecode>
        <t>
          A TXT record is a DAC record if its text, after any leading spaces or tabs,
          begins with "v", optional whitespace, "=", optional whitespace, and
          "DAC1", followed by whitespace, ";", or the end of the text.  Other TXT
          records are ignored, so DAC records can share a name with other TXT
          records.  A DAC record is well-formed if it matches the "record" rule,
          contains no tag name more than once, and the value of every tag defined in
          this document matches the rule given for it, with an "x" value that is also a
          valid calendar date.  A DAC record that is not well-formed is malformed.
        </t>
        <ul spacing="normal">
          <li>
            <t>
              Tag names are case-sensitive.  Verifiers <bcp14>MUST</bcp14> ignore
              tags they do not recognize.  New tags are registered as described in
              <xref target="iana-tags"/>; adding a tag does not change the version.
            </t>
          </li>
          <li>
            <t>
              A TXT record consisting of several character-strings is interpreted as
              their concatenation without separators, as in
              <xref section="3.3" sectionFormat="of" target="RFC7208"/>.  Publishers
              <bcp14>SHOULD</bcp14> keep each record within a single character-string
              of at most 255 octets.
            </t>
          </li>
          <li>
            <t>
              Domain names in records are in canonical form: A-labels
              <xref target="RFC5890"/> in lowercase, without a trailing dot, at most
              253 octets long, with a last label that is not entirely numeric.  A
              label with hyphens in both the third and fourth
              positions <bcp14>MUST</bcp14> be a valid A-label.  The "domain" rule
              expresses the character-level constraints; a name violating the others
              is malformed.  Verifiers do not repair names.
            </t>
          </li>
        </ul>
      </section>

      <section anchor="claim">
        <name>Claim Record</name>
        <t>
          An affiliated domain declares its confirming domain with one TXT record at the name formed by
          prepending the label "_affiliation" to the affiliated domain:
        </t>
        <sourcecode type="dns-rr"><![CDATA[
_affiliation.embank.example. 3600 IN TXT
    "v=DAC1; p=bank.example; t=mfrggzdfmztwq2lknnwg23tpobyxe43u"
]]></sourcecode>
        <dl newline="false" spacing="normal">
          <dt>p (required):</dt>
          <dd>The confirming domain, matching the "p-value" rule.</dd>
          <dt>t (required):</dt>
          <dd>The token, matching the "t-value" rule (<xref target="tokens"/>).</dd>
        </dl>
        <t>
          An affiliated domain has at most one confirming domain and <bcp14>MUST NOT</bcp14> publish
          more than one DAC record at its "_affiliation" name; a domain that is also
          a confirming domain includes its marker tags in the same record
          (<xref target="marker"/>).  The confirming domain
          <bcp14>MUST NOT</bcp14> be the affiliated domain itself.  The claim name
          <bcp14>MAY</bcp14> be a CNAME, for example when the affiliated domain's records are
          managed by the confirming operator.
        </t>
      </section>

      <section anchor="scope">
        <name>Scope of an Affiliation</name>
        <t>
          A claim is published at, and an affiliation is verified for, one domain
          name.  Organizations typically publish claims at their registrable domains,
          such as "embank.example", not at every host name.
        </t>
        <t>
          A relying party assessing a name below such a domain, for example
          "marketing.embank.example", determines the domain it regards as responsible
          for that name, as it already does when attributing reputation, and verifies
          that domain.  Claims are not published at names like
          "marketing.embank.example" for this purpose.
        </t>
        <t>
          By default, a confirmation states nothing about names below the affiliated
          domain, and relying parties apply their usual practice to them.  A confirming domain
          that operates, or authorizes the operation of, every name below the affiliated domain
          states this by including the "s" tag with the value "subtree" in the
          confirmation (<xref target="confirmation"/>).  The confirmation then also
          covers every name below the affiliated domain.  A confirming domain <bcp14>MUST NOT</bcp14> include
          it when names below the affiliated domain are operated by parties not acting under the
          confirming domain's authority, such as customers of a hosting or platform service
          (<xref target="sec-subtree"/>).
        </t>
        <t>
          If a name below an affiliated domain with a subtree confirmation publishes its own
          claim, that claim governs the name and the names below it.
        </t>
      </section>

      <section anchor="marker">
        <name>Marker Record</name>
        <t>
          A confirming domain that confirms affiliations publishes exactly one DAC
          record at the name formed by prepending "_affiliation" to the confirming
          domain.  A domain that is both an affiliated domain and a confirming
          domain publishes a single record there containing both the claim tags and
          the marker tags.
        </t>
        <t>
          A confirming domain whose zone is not signed and that publishes its
          confirmations only over HTTPS can omit the marker, because verifiers then
          consult its HTTPS resources (step 5 of <xref target="verify-steps"/>).  It
          still needs the marker to convey its mode and abuse contact.
        </t>
        <sourcecode type="dns-rr"><![CDATA[
_affiliation.bank.example. 3600 IN TXT
    "v=DAC1; r=mailto:abuse@bank.example"
]]></sourcecode>
        <dl newline="false" spacing="normal">
          <dt>c (optional):</dt>
          <dd>
            The confirmation channel.  This document defines "dns", the default
            (<xref target="confirmation"/>), and "https" (<xref target="https"/>).
            Other values are registered as described in
            <xref target="iana-channels"/>.  With "https", DNS confirmation records
            are not consulted.
          </dd>
          <dt>r (optional):</dt>
          <dd>
            A URI <xref target="RFC3986"/> for reports of abuse concerning the
            confirming domain's affiliated domains, with scheme "mailto"
            <xref target="RFC6068"/> or "https".  Semicolons and whitespace in the
            URI are percent-encoded.  Verifiers ignore an "r" tag with any other
            scheme.
          </dd>
          <dt>m (optional):</dt>
          <dd>
            The mode: "enforce", the default, or "test".  In "test" mode the confirming domain
            is deploying the protocol and asks that its confirmations not be acted
            on (<xref target="ops-staged"/>).  Verifiers treat any value other than
            "enforce" as "test".
          </dd>
          <dt>f (optional):</dt>
          <dd>
            A URI to which verifiers may send reports of claims naming this confirming domain
            that were not confirmed (<xref target="reports"/>).  It is either
            "https://" followed by a host and an optional path, without userinfo,
            port, query, or fragment, or "mailto:" followed by exactly one address,
            without header fields.  The host, or the domain of the address, is in
            canonical form (<xref target="syntax"/>) and is the confirming domain or a
            name below it.  Verifiers ignore an "f" tag that does not meet these
            conditions.
          </dd>
        </dl>
        <t>
          The marker <bcp14>MUST</bcp14> be a TXT record owned by the
          "_affiliation" name itself, not data reached through a CNAME or DNAME
          record.  The marker makes "_affiliation" an
          existing node in the confirming domain's zone, so that a wildcard higher in the zone
          cannot answer for names below it (<xref target="sec-wildcard"/>).  The
          "_affiliation" name <bcp14>MAY</bcp14> be delegated as a separate zone, in
          which case that zone's operator publishes the marker and confirmations.  A
          DNAME record <xref target="RFC6672"/> at that name redirects the queries for
          confirmations to another zone and has the same effect as delegating them.
        </t>
      </section>

      <section anchor="confirmation">
        <name>Confirmation Record (DNS Channel)</name>
        <t>
          For each confirmed affiliated domain, a confirming domain using the DNS channel publishes one TXT
          record at the name formed by prepending the affiliated domain's token to the confirming domain's
          "_affiliation" name:
        </t>
        <sourcecode type="dns-rr"><![CDATA[
mfrggzdfmztwq2lknnwg23tpobyxe43u._affiliation.bank.example.
    3600 IN TXT "v=DAC1; d=embank.example"
]]></sourcecode>
        <dl newline="false" spacing="normal">
          <dt>d (required):</dt>
          <dd>The affiliated domain, matching the "d-value" rule.</dd>
          <dt>s (optional):</dt>
          <dd>
            The scope.  The value "subtree" states that the confirmation also covers
            every name below the affiliated domain (<xref target="scope"/>).  Verifiers
            ignore any other value; other scopes would be defined with a new tag.
          </dd>
          <dt>rel (optional):</dt>
          <dd>
            The relationship between the operators of the two domains, matching the
            "rel-value" rule.  The value "same-entity" states that the affiliated domain
            is operated by the legal entity that operates the confirming domain.  The
            value "third-party" states that it is operated by another party acting
            under the confirming operator's authority, such as another legal entity
            of the same group or a contractor.  Other values are registered as
            described in <xref target="iana-rel"/>.  Without "rel", or with a value
            the verifier does not recognize, the confirmation does not state which
            of these applies.  Confirming operators <bcp14>SHOULD</bcp14> include
            "rel".
          </dd>
          <dt>x (optional):</dt>
          <dd>
            The last day of validity, as a full-date in UTC <xref target="RFC3339"/>,
            matching the "x-value" rule.  The confirmation applies until the end of
            that day, 23:59:59 UTC, and not afterwards.  Without "x", the
            confirmation applies until it is removed.
          </dd>
        </dl>
        <t>
          An expiry date suits domains used for a limited time, such as campaign
          sites.  It also limits the consequences of a confirmation that is not
          removed when the affiliated domain's registration lapses and the domain is
          registered by someone else (<xref target="sec-stale"/>).  For this reason,
          confirming operators <bcp14>SHOULD</bcp14> include "x" and
          <bcp14>SHOULD</bcp14> set it no later than the expiry date of the
          affiliated domain's registration.  A confirming operator extends a
          confirmation by replacing the record with one carrying a later date.
        </t>
        <t>
          A tool that publishes confirmations (<xref target="ops-automation"/>) can
          obtain the expiry and creation dates of the affiliated domain's
          registration through the Registration Data Access Protocol (RDAP)
          <xref target="RFC9082"/> <xref target="RFC9083"/> <xref target="RFC9224"/>,
          or have them entered by the operator where RDAP does not provide them.
          Such a tool extends "x" only when the registration has been renewed, that
          is, when the expiry date has moved forward, the creation date is
          unchanged, and no transfer of the registration has been recorded since
          the previous check.  A recorded transfer can mean a sale; the tool then
          does not extend the confirmation and alerts the operator.  Many
          registries move the expiry date forward automatically when it is reached,
          before the registrant has paid, and delete the domain later if no
          payment follows.  The tool therefore ends the confirmation, and alerts the
          operator, when the registration data shows the domain as deleted or
          scheduled for deletion, for example through the RDAP statuses
          "redemption period" and "pending delete" <xref target="RFC8056"/>, or
          when the creation date has changed, which indicates that the domain was
          deleted and registered again, possibly by someone else.
        </t>
        <t>
          An expiry date tied to the registration does not end a confirmation when
          the affiliated domain is sold without a recorded transfer, when the
          registrant's account at its registrar is taken over, or when the domain is
          moved to another DNS operator.  In these cases the confirming operator has
          to remove the confirmation (<xref target="publish-end"/>).  Verifiers
          cannot determine whether a confirming operator follows the practice above.
        </t>
        <t>
          A confirmation name <bcp14>MUST NOT</bcp14> hold more than one DAC record.
          It <bcp14>MAY</bcp14> be a CNAME, for example to a name hosted by a DNS
          provider.  The confirming domain <bcp14>MUST NOT</bcp14> publish wildcard records at or
          below its "_affiliation" name.
        </t>
      </section>

      <section anchor="tokens">
        <name>Tokens</name>
        <t>
          A token links one claim to one confirmation.  It makes confirmation names
          unpredictable, so that a confirming domain's confirmations cannot be found by guessing
          names, whether by online queries or, for DNSSEC-signed zones using NSEC3,
          by offline guessing of hashed names.  A token is not a secret: it is
          published in the claim and appears in queries.  The protocol's resistance
          to forged affiliations does not depend on tokens being unknown
          (<xref target="sec-copy"/>).
        </t>
        <ul spacing="normal">
          <li>
            <t>
              A token <bcp14>MUST</bcp14> contain at least 128 bits, and
              <bcp14>SHOULD</bcp14> contain 160 bits, from a cryptographically secure
              random source <xref target="RFC4086"/>.  At 128 bits, guessing a
              confirmation name is infeasible and collisions between tokens are
              negligible.
            </t>
          </li>
          <li>
            <t>
              A token is encoded in base32 (<xref section="6" sectionFormat="of"
              target="RFC4648"/>) with lowercase letters and without padding, giving
              26 to 52 characters; a 160-bit token is 32 characters, well within the
              63-octet limit on a DNS label <xref target="RFC1035"/>.  Case-sensitive
              encodings such as base64 cannot be used, because DNS name matching
              ignores case <xref target="RFC4343"/> and some resolvers alter the case
              of query names.
            </t>
          </li>
          <li>
            <t>
              Tokens are opaque; verifiers do not decode them.  A confirming domain
              <bcp14>MUST</bcp14> use a different token for each affiliated domain and
              <bcp14>SHOULD</bcp14> use a new token when re-establishing an
              affiliation that was previously ended.
            </t>
          </li>
        </ul>
      </section>
    </section>

    <section anchor="publish">
      <name>Publishing an Affiliation</name>

      <section anchor="publish-create">
        <name>Creating an Affiliation</name>
        <ol spacing="normal">
          <li>The confirming operator publishes the marker, once, before its first affiliation.</li>
          <li>
            The confirming operator generates a token for the affiliated domain and publishes the
            confirmation (<xref target="confirmation"/> or <xref target="https"/>).
          </li>
          <li>
            The operator of the affiliated domain publishes the claim.  When the
            confirming domain and the affiliated domain are operated by the same
            organization, one tool performs all of these steps
            (<xref target="ops-automation"/>).
          </li>
        </ol>
        <t>
          Publishing the confirmation first lets the affiliation verify as soon as
          the claim is visible.
        </t>
      </section>

      <section anchor="publish-end">
        <name>Ending an Affiliation</name>
        <t>
          The confirming operator ends an affiliation by removing the confirmation; no
          change at the affiliated domain is needed.  A confirming operator <bcp14>MUST</bcp14>
          remove the confirmation for an affiliated domain that it no longer operates or
          authorizes, including when the affiliated domain is transferred, sold, or
          allowed to expire, except as described in <xref target="publish-move"/>.
          A claim left in the affiliated domain's zone, or copied there by a later
          registrant, has no effect once the confirmation is gone.
        </t>
        <t>
          A confirming domain that withdraws from the protocol removes its marker
          and any confirmations it serves over HTTPS, which ends all of its
          affiliations.
        </t>
      </section>

      <section anchor="publish-move">
        <name>Moving an Affiliated Domain to Another Confirming Domain</name>
        <t>
          When an affiliated domain moves from one confirming domain to another, for example after an
          acquisition, the operators proceed in this order so that the affiliated domain remains
          confirmed throughout:
        </t>
        <ol spacing="normal">
          <li>
            The new confirming domain publishes its marker, if it has none, and a confirmation
            for the affiliated domain under a new token.
          </li>
          <li>
            The affiliated domain replaces its claim with one naming the new
            confirming domain and the new token.
          </li>
          <li>
            After verifying that the affiliated domain's claim names the new
            confirming domain, and after the TTL of the old claim has passed (86400
            seconds if the old confirming domain does not know it), the old
            confirming domain removes its confirmation.
          </li>
        </ol>
        <t>
          If the affiliated domain leaves both organizations, for example because it is
          sold, the confirming domain removes its confirmation no later than the transfer
          (<xref target="publish-end"/>), and the new operator of the affiliated domain replaces or
          removes the claim.
        </t>
      </section>

      <section anchor="publish-levels">
        <name>Organizations with Several Levels</name>
        <t>
          A confirming domain can itself be the affiliated domain of another affiliation, for
          example when a subsidiary's primary domain is affiliated with its group's
          primary domain.  Each affiliation is confirmed separately and means only
          what <xref target="semantics"/> states about that pair: a confirmation of
          a confirming domain by its own confirming domain says nothing about the
          affiliated domains of the former.
          Verifiers <bcp14>MAY</bcp14> repeat the procedure with the confirming domain
          as the affiliated domain.  A verifier that does so <bcp14>MUST NOT</bcp14>
          follow more than two levels beyond the first confirming domain and
          <bcp14>MUST</bcp14> stop if a domain repeats.
        </t>
      </section>
    </section>

    <section anchor="verify">
      <name>Verification</name>

      <section anchor="verify-io">
        <name>Inputs and Outputs</name>
        <t>
          The input is an affiliated domain in canonical form (<xref target="syntax"/>).
          Verifiers that accept names containing non-ASCII characters convert them to
          A-labels as specified in <xref target="RFC5891"/>; the processing of
          <xref target="UTS46"/> with non-transitional processing is a common way of
          doing so.  A name that cannot be converted yields "permerror".
        </t>
        <t>
          The output is a result (<xref target="results"/>) and, when available, the
          confirming domain, the channel, whether the result is authenticated
          (<xref target="verify-auth"/>), whether the confirmation covers names below
          the affiliated domain (<xref target="scope"/>), the relationship stated by
          the confirmation (<xref target="confirmation"/>), the confirming domain's
          mode and abuse contact, and the time for which the result may be reused
          (<xref target="verify-cache"/>).
        </t>
      </section>

      <section anchor="verify-steps">
        <name>Procedure</name>
        <t>
          Verifiers <bcp14>MUST</bcp14> use a DNS interface that exposes the answer
          section of responses, so that CNAME <xref target="RFC1034"/> and DNAME
          <xref target="RFC6672"/> records in an answer can be detected.  In the steps below, "no record" means that the query returned
          NXDOMAIN, or NOERROR with no DAC record; this includes a name that exists
          only as an empty non-terminal.  NXDOMAIN and NOERROR without data are
          treated alike because servers differ in which they return.  Other DNS
          outcomes are handled as described in <xref target="verify-dns-errors"/>.
        </t>
        <ol spacing="normal">
          <li>
            <t>Query TXT at "_affiliation." followed by the affiliated domain.</t>
            <ul>
              <li>No record: the result is "none".</li>
              <li>More than one DAC record, or a malformed one: "permerror".</li>
              <li>
                Neither a "p" nor a "t" tag: the record is only a marker, and the
                result is "none".
              </li>
              <li>
                Only one of "p" and "t", or "p" equal to the affiliated domain:
                "permerror".
              </li>
            </ul>
          </li>
          <li>
            <t>
              Query TXT at "_affiliation." followed by the confirming domain.  Any "p"
              and "t" tags in the marker belong to the confirming domain's own claim and are
              ignored here.  Apply the following checks in order.
            </t>
            <ol type="a">
              <li>The answer contains a CNAME or DNAME record: "permerror".</li>
              <li>No record: "not-confirmed".</li>
              <li>More than one DAC record, or a malformed one: "permerror".</li>
              <li>
                A "c" value not supported by the verifier: "not-confirmed".
              </li>
            </ol>
          </li>
          <li>
            <t>
              If the channel is "dns", query TXT at the token, followed by
              "._affiliation.", followed by the confirming domain.
            </t>
            <ul>
              <li>No record: "not-confirmed".</li>
              <li>More than one DAC record, or a malformed one: "permerror".</li>
            </ul>
            <t>
              If the channel is "https", obtain the confirmation as described in
              <xref target="https"/>.
            </t>
          </li>
          <li>
            <t>Examine the confirmation's "d" tag.</t>
            <ul>
              <li>Missing: "permerror".</li>
              <li>Not equal to the affiliated domain: "not-confirmed".</li>
              <li>
                Equal to the affiliated domain, but the confirmation has an "x" tag and the
                time of verification is after the end of that day: "not-confirmed".
              </li>
              <li>
                Otherwise: "confirmed".  If the confirmation has "s=subtree", the
                verifier reports that the result covers names below the affiliated
                domain.  If it has "rel" with the value "same-entity" or
                "third-party", the verifier reports that value.
              </li>
            </ul>
          </li>
          <li>
            <t>
              Step 5 applies when step 1 yielded a claim, the query in step 2
              returned NOERROR or NXDOMAIN and that answer was not validated as
              secure (<xref target="verify-auth"/>), the HTTPS channel was not
              used in step 3, and steps 2 to 4 did not yield "confirmed".  A
              verifier that supports the HTTPS channel <bcp14>MUST</bcp14> then
              obtain the confirmation as described in <xref target="https"/> and
              examine it as in step 4, whatever the marker contains and also when
              there is no marker.  If this yields "confirmed", that is the result,
              with channel "https".  Otherwise, the result of steps 2 to 4 stands;
              if the HTTPS request failed with a temporary error, that result is
              not reused (<xref target="verify-cache"/>).
            </t>
          </li>
        </ol>
        <t>
          Step 5 lets a confirming domain whose zone is not signed with DNSSEC
          obtain authenticated results (<xref target="verify-auth"/>) by
          publishing its confirmations over HTTPS, without the marker deciding
          whether its HTTPS origin is consulted.  For a confirming domain whose
          zone is signed, a verifier that validates DNSSEC obtains a secure
          answer in step 2 or, for a forged or otherwise bogus answer, "temperror"
          (<xref target="verify-dns-errors"/>), so step 5 does not apply and the
          marker alone selects the channel.  A verifier that does not validate
          DNSSEC treats every answer as not validated as secure.
        </t>
        <t>
          When the result is obtained in step 5, the mode and the abuse contact are
          taken from the marker if step 2 obtained a well-formed marker that was
          not reached through a CNAME or DNAME record; otherwise the mode is
          "enforce" and there is no abuse contact.
        </t>
        <t>
          Domain names are compared as octet strings in canonical form.  The
          procedure does not query any other names, follow references found in
          record content, or consult a list of public suffixes.  It makes at most
          one HTTPS request.
        </t>
      </section>

      <section anchor="results">
        <name>Results</name>
        <dl newline="false" spacing="normal">
          <dt>confirmed:</dt>
          <dd>The confirming domain confirms the affiliated domain.</dd>
          <dt>not-confirmed:</dt>
          <dd>
            The affiliated domain claims a confirming domain, and the verifier did not obtain a confirmation.
            This covers a confirming domain that does not participate, an ended affiliation, a
            copied or fabricated claim, and a channel the verifier does not support.
          </dd>
          <dt>none:</dt>
          <dd>The affiliated domain makes no claim.</dd>
          <dt>temperror:</dt>
          <dd>A temporary failure prevented a result; the verifier can retry later.</dd>
          <dt>permerror:</dt>
          <dd>
            A record is malformed or the configuration is invalid; the result will
            not change until a record is corrected.
          </dd>
        </dl>
        <t>Only "confirmed" establishes an affiliation.</t>
      </section>

      <section anchor="verify-dns-errors">
        <name>DNS Errors</name>
        <t>
          Any response code other than NOERROR and NXDOMAIN, a timeout, or a
          truncated response that cannot be retried over TCP yields "temperror".  A
          response that fails DNSSEC validation ("bogus" <xref target="RFC4035"/>)
          also yields "temperror" and <bcp14>MUST NOT</bcp14> contribute to a
          "confirmed" result.  Verifiers <bcp14>MUST</bcp14> support DNS over TCP.
        </t>
      </section>

      <section anchor="verify-auth">
        <name>Authenticated Results</name>
        <t>
          Verifiers report whether a result is authenticated, and how, as one of
          the following values:
        </t>
        <dl newline="false" spacing="normal">
          <dt>dnssec:</dt>
          <dd>
            No HTTPS response was used, and all DNS answers used were validated as
            secure <xref target="RFC4035"/>, either by the verifier or by a
            validating resolver reached over a trusted path.
          </dd>
          <dt>dnssec+webpki:</dt>
          <dd>
            The marker selected the HTTPS channel, an HTTPS response was obtained,
            and the claim and the marker were validated as secure.
          </dd>
          <dt>webpki:</dt>
          <dd>
            The result is "confirmed", the confirmation was obtained over HTTPS,
            and the claim or the marker was not validated as secure, or there was
            no marker.
          </dd>
        </dl>
        <t>
          A result to which none of these applies is not authenticated.  A
          "temperror" result is never authenticated.
        </t>
        <t>
          Over HTTPS, the Web PKI authenticates the confirmation itself.  Because a
          "confirmed" result requires a confirmation that names the affiliated
          domain, a forged marker can at most cause the verifier to fetch a
          confirmation that the confirming operator published.  This depends on the
          confirming operator controlling every resource under
          "/.well-known/affiliation/" on its origin (<xref target="https-resource"/>).
          "webpki" does not authenticate the claim: an attacker able to forge the
          claim can make a domain appear to claim a confirming domain that the
          attacker operates (<xref target="sec-false-signal"/>).  "dnssec+webpki"
          also authenticates the claim.
        </t>
        <t>
          The abuse contact is taken from the marker and is authenticated only when
          the marker is.
        </t>
      </section>

      <section anchor="verify-cache">
        <name>Caching</name>
        <t>
          A verifier <bcp14>MAY</bcp14> reuse a result for the smallest of: the TTLs
          <xref target="RFC2181"/> of the DNS answers used, where the TTL of a negative answer is determined as
          in <xref target="RFC2308"/>; the freshness lifetime of the HTTPS response
          (<xref target="https-fetch"/>); the time remaining until a confirmation's
          expiry; and 86400 seconds.  A result for which the HTTPS request of step
          5 failed with a temporary error is not reused.
        </t>
        <t>
          After "temperror", verifiers retry with increasing intervals and
          <bcp14>SHOULD NOT</bcp14> retry more often than once a minute.  Resolvers
          that serve stale data <xref target="RFC8767"/> can extend the time for
          which an ended affiliation still verifies.
        </t>
      </section>
    </section>

    <section anchor="https">
      <name>HTTPS Channel</name>
      <t>
        A confirming domain can publish its confirmations as HTTPS resources
        instead of DNS records, which suits operators that manage such data through
        a web application rather than their DNS provider, and lets a confirming
        domain whose zone is not signed obtain authenticated results
        (<xref target="verify-auth"/>).  A confirming domain selects this channel
        with "c=https" in its marker.  For a confirming domain whose marker is not
        validated as secure, verifiers that support the HTTPS channel also consult
        the HTTPS resource when the DNS channel does not yield "confirmed" (step 5
        of <xref target="verify-steps"/>), so such a domain can use this channel
        without a marker; a marker with "c=https" still saves verifiers DNS
        queries and conveys the mode and abuse contact.  The claim remains a DNS
        record.
      </t>

      <section anchor="https-resource">
        <name>Resource</name>
        <t>The confirmation for a token is the resource identified by:</t>
        <artwork type="ascii-art"><![CDATA[
https://<confirming domain>/.well-known/affiliation/<token>
]]></artwork>
        <t>
          A confirmed token is served with status code 200 and media type
          "text/plain".  The content is one DAC confirmation record, with the same
          syntax as in the DNS, optionally followed by a single CRLF or LF:
        </t>
        <artwork type="ascii-art"><![CDATA[
Request:
  GET https://bank.example/.well-known/affiliation/
              mfrggzdfmztwq2lknnwg23tpobyxe43u
  Accept: text/plain

Response:
  200 OK
  Content-Type: text/plain
  Cache-Control: max-age=3600

  v=DAC1; d=embank.example
]]></artwork>
        <t>
          A token that is not confirmed is answered with 404 (Not Found) or 410
          (Gone).
        </t>
        <t>
          Verifiers consult this resource also for confirming domains that have
          not selected the HTTPS channel (step 5 of <xref target="verify-steps"/>).
          A confirming operator <bcp14>MUST NOT</bcp14> allow other parties to
          create or alter resources at or below "/.well-known/affiliation/" on its
          origin <xref target="RFC8615"/>, for example through shared hosting or
          an upload feature.  The same applies in practice to the operator of any
          domain whose zone is not signed, since a claim can name any domain;
          <xref target="sec-https-others"/> discusses the risk.
        </t>
      </section>

      <section anchor="https-fetch">
        <name>Fetching</name>
        <t>A verifier fetching a confirmation:</t>
        <ul spacing="normal">
          <li>
            <bcp14>MUST</bcp14> use the "https" scheme on port 443, with the confirming
            domain as the host, and <bcp14>MUST</bcp14> validate the server's
            certificate for that name <xref target="RFC9110"/>
            <xref target="RFC9525"/>;
          </li>
          <li>
            <bcp14>MUST NOT</bcp14> follow redirects;
          </li>
          <li>
            <bcp14>MUST NOT</bcp14> connect to addresses that the IANA special-purpose
            address registries <xref target="RFC6890"/> mark as not globally
            reachable, and <bcp14>MUST</bcp14> connect to the address it checked;
          </li>
          <li>
            <bcp14>MUST NOT</bcp14> send cookies or other credentials; and
          </li>
          <li>
            <bcp14>MUST</bcp14> read no more than 1024 octets of content and
            <bcp14>SHOULD</bcp14> limit the request to 10 seconds.
          </li>
        </ul>
        <t>Responses are handled as follows:</t>
        <ul spacing="normal">
          <li>
            200 with media type "text/plain" (parameters are ignored) and content
            that is exactly one DAC record: the record is the confirmation, examined
            as in step 4 of <xref target="verify-steps"/>.  A malformed record,
            other content, another media type, or more than 1024 octets yields
            "permerror".
          </li>
          <li>404 or 410: "not-confirmed".</li>
          <li>5xx, a connection failure, a timeout, or a TLS failure: "temperror".</li>
          <li>
            Any other status code, including 3xx, or a confirming domain that has no
            globally reachable address: "permerror".
          </li>
        </ul>
        <t>
          The freshness lifetime of a response is zero if it carries Cache-Control
          no-store or no-cache, is otherwise taken from a max-age directive if
          present, and is otherwise 3600 seconds.
        </t>
      </section>
    </section>

    <section anchor="semantics">
      <name>Meaning of a Confirmation</name>
      <t>
        This section states what a "confirmed" result means, so that relying parties
        can use it consistently.  It does not prescribe relying-party policy.
      </t>

      <section anchor="semantics-what">
        <name>What a Confirmation States</name>
        <t>
          A "confirmed" result means that, at the time of verification, the confirming
          operator had published a statement that:
        </t>
        <ol spacing="normal">
          <li>
            the affiliated domain is operated by the confirming operator or by a party acting
            under its authority; and
          </li>
          <li>
            reports of abuse concerning the affiliated domain may be directed to the
            confirming operator, at the contact in the marker or by its usual means.
          </li>
        </ol>
        <t>
          With "s=subtree", both statements also apply to every name below the
          affiliated domain.  With "rel=same-entity", the confirming operator also
          states that the affiliated domain is operated by the same legal entity;
          with "rel=third-party", that it is operated by another party acting under
          its authority.
        </t>
        <t>
          The second element distinguishes an affiliation from a mere association:
          a confirming domain that confirms an affiliated domain is the expected
          recipient of complaints about it.  The statement is made by whoever
          controls the confirming domain's DNS zone or, when the confirmation was
          obtained over HTTPS, its HTTPS origin.
        </t>
      </section>

      <section anchor="semantics-not">
        <name>What a Confirmation Does Not State</name>
        <t>
          A confirmation says nothing about the trustworthiness, identity, or
          licensing of the confirming operator, or about the content served by the affiliated domain.
          A confirmation from a confirming domain registered yesterday is as valid as one
          from a long-established organization.  A confirmation therefore conveys at
          most the standing that a relying party already attributes to the confirming
          domain.  In particular, look-alike domains that confirm one another gain
          nothing: each confirmation conveys at most the standing of its own
          confirming domain, and a look-alike confirming domain has none of the
          standing of the name it resembles (<xref target="sec-homograph"/>).
        </t>
        <t>
          A "rel" value is a statement by the confirming operator, not a verified
          fact.  DAC does not establish which legal entity operates either domain.
        </t>
      </section>

      <section anchor="semantics-use">
        <name>Considerations for Relying Parties</name>
        <ul spacing="normal">
          <li>
            <t>
              Takedown decisions.  When a domain resembling a protected name is
              confirmed as affiliated with a confirming domain that the relying party already
              regards as legitimate, the resemblance is unlikely to be an
              impersonation of the confirming domain's own name, and a conflict with another
              organization's name is a dispute between organizations.  Relying
              parties can direct such reports to the confirming domain's abuse contact or to the
              dispute processes for name conflicts.  A confirmation alone does not
              justify delaying action on abuse that has been observed
              (<xref target="sec-deflect"/>).
            </t>
          </li>
          <li>
            <t>
              Reputation.  A relying party may extend to a confirmed affiliated domain some or
              all of the reputation it attributes to the confirming domain.  Attributing more
              standing to the affiliated domain than to the confirming domain is inconsistent with the
              meaning above, and taking abuse observed on a confirmed affiliated domain into
              account when assessing the confirming domain gives confirming operators a reason to
              confirm only domains they control.  A reputation system may use a
              confirmation as the starting standing of a new affiliated domain,
              replaced by the domain's own record as it accumulates one.
            </t>
          </li>
          <li>
            <t>
              Relationship.  A relying party that treats domains differently
              depending on whether they are operated by the same legal entity, such
              as a registry reusing an earlier verification
              (<xref target="registry"/>), can use the "rel" value.  A
              confirmation without "rel" does not indicate either relationship.
            </t>
          </li>
          <li>
            <t>
              Testing mode.  Confirmations from a confirming domain in "test" mode are
              intended for reporting to the confirming domain, not for decisions.
            </t>
          </li>
          <li>
            <t>
              Other results.  "none", "not-confirmed", "temperror", and "permerror"
              are not, by themselves, evidence that a domain is malicious.  Most
              domains publish no claim.  A claim that a well-known confirming domain does not
              confirm may be an attempt to borrow its standing, but it may also result
              from misconfiguration or from records an attacker caused to appear in a
              victim's zone (<xref target="sec-false-signal"/>).
            </t>
          </li>
          <li>
            <t>
              Assurance.  Relying parties taking consequential actions can consider
              whether a result was authenticated (<xref target="verify-auth"/>) and,
              for unauthenticated results, the measures in
              <xref target="sec-spoof"/>.
            </t>
          </li>
        </ul>
      </section>
    </section>

    <section anchor="registry">
      <name>Reuse of Registrant Verification</name>
      <t>
        A domain registry or registrar that has verified the legal entity behind a
        domain, for example under a policy requiring verification of registrants,
        may rely on that verification when the same organization registers or
        operates another domain.  DAC results can support such reuse within the
        limits below.  This section does not change the procedure in
        <xref target="verify"/>.
      </t>
      <t>
        A confirmation is a statement by the confirming operator
        (<xref target="semantics"/>), and the reuse also relies on the earlier
        verification of the confirming domain's registrant.  Registries and
        registrars reusing
        verification <bcp14>SHOULD</bcp14> require an authenticated result
        (<xref target="verify-auth"/>) and verify at the time of reuse.
      </t>
      <dl newline="true" spacing="normal">
        <dt>Delegated DNS administration:</dt>
        <dd>
          DAC conveys the statement of whoever controls the confirming domain's DNS
          zone or HTTPS origin, which can be a DNS provider, an agency, or another
          company of the group rather than the verified registrant.  The registry
          therefore checks separately, from its own records or from registration
          data, that the confirming domain is registered to the entity it verified.
          A confirmation does not show this.
        </dd>
        <dt>Legal entities of one group:</dt>
        <dd>
          Reusing the verification of one legal entity for a domain is appropriate
          only if the same legal entity operates that domain.  A registry reusing
          such verification requires "rel=same-entity" (<xref target="confirmation"/>).
          With "rel=third-party", or without "rel", the operator of the affiliated
          domain is verified on its own.  The "rel" value is the confirming
          operator's statement and is not verified by DAC.
        </dd>
        <dt>Changes of control:</dt>
        <dd>
          A verification reflects the situation at one time.  The registry verifies
          the affiliation when it reuses the verification and does not reuse it if
          either domain's registrant has changed since the verification.  Expiry
          dates tied to the registration (<xref target="confirmation"/>) limit how
          long a forgotten confirmation remains effective.
        </dd>
        <dt>Domains not yet registered:</dt>
        <dd>
          A domain that is not yet registered cannot publish a claim.  The
          confirming operator can instead publish a confirmation for that domain
          before it is registered, and the registrant gives the registry the
          confirming domain and the token.  The registry performs steps 2 to 5 of
          <xref target="verify-steps"/> with that confirming domain and token, as if
          they had been read from a claim, and checks that the confirmation names
          the domain being registered.  After registration, the registrant
          publishes the claim with the same token, and the affiliation verifies
          normally.  If the domain is registered by another party, the confirming
          operator removes the confirmation (<xref target="publish-end"/>).
        </dd>
      </dl>
    </section>

    <section anchor="reports">
      <name>Failure Reports</name>
      <t>
        A confirming domain can ask verifiers to report claims that name it but are not
        confirmed, for example by a domain that copied a claim or fabricated one.
        Such reports let the confirming domain learn about attempts to borrow its standing, and
        about confirmations that have expired or been removed by mistake.  Sending
        reports is optional for verifiers.
      </t>

      <section anchor="reports-when">
        <name>When Reports Are Sent</name>
        <t>
          A verifier <bcp14>MAY</bcp14> send a report when it obtained the confirming domain's
          marker, the marker carries an "f" tag, and the result is "not-confirmed" or
          "permerror" for a reason arising after step 2 of
          <xref target="verify-steps"/>, that is, a missing, mismatched, expired, or
          malformed confirmation, or a confirmation that could not be obtained over
          HTTPS.  Reports are not sent for "temperror" or for an unsupported channel,
          nor when step 5 of <xref target="verify-steps"/> yields "confirmed".
          Reports are particularly useful while a confirming domain is in "test" mode, and
          verifiers may send them then.
        </t>
        <t>
          A verifier <bcp14>MUST NOT</bcp14> send a report to an "f" URI that does not
          meet the conditions in <xref target="marker"/>; in particular, reports go
          only to the confirming domain or names below it, which prevents a marker from
          directing reports at third parties.  A confirming domain that wants reports processed
          by a provider points a name below its domain, or its mail routing, at that
          provider.  Because an attacker can create any number of affiliated domains, a
          verifier <bcp14>MUST</bcp14> send at most one message per report
          destination in 24 hours, combining reports into it, and
          <bcp14>SHOULD</bcp14> limit the number of reports per message, for example
          to 1000.
        </t>
      </section>

      <section anchor="reports-format">
        <name>Report Format</name>
        <t>
          A report is a JSON <xref target="RFC8259"/> array of objects, each with the
          following members:
        </t>
        <dl newline="false" spacing="normal">
          <dt>version:</dt><dd>The string "DAC1".</dd>
          <dt>observed:</dt>
          <dd>The time of verification, as an RFC 3339 date-time <xref target="RFC3339"/> in UTC.</dd>
          <dt>child:</dt><dd>The affiliated domain, in canonical form.</dd>
          <dt>parent:</dt><dd>The confirming domain, in canonical form.</dd>
          <dt>result:</dt><dd>"not-confirmed" or "permerror".</dd>
          <dt>reason:</dt>
          <dd>
            One of the values in the "DAC Report Reasons" registry
            (<xref target="iana-reasons"/>).
          </dd>
          <dt>reporter (optional):</dt>
          <dd>A domain name identifying the organization sending the report.</dd>
        </dl>
        <sourcecode type="json"><![CDATA[
[
  {
    "version": "DAC1",
    "observed": "2026-10-22T09:30:00Z",
    "child": "embank-login.example",
    "parent": "bank.example",
    "result": "not-confirmed",
    "reason": "different-child",
    "reporter": "filter.example"
  }
]
]]></sourcecode>
        <t>
          Receivers ignore members and reason values they do not recognize.
        </t>
      </section>

      <section anchor="reports-transport">
        <name>Delivery</name>
        <t>
          For an "https" URI, the verifier sends the report in an HTTP POST request
          with media type "application/json", subject to the same restrictions as in
          <xref target="https-fetch"/>, except that the content may be up to 65536
          octets.  For a "mailto" URI, the verifier sends an email message with the
          subject "DAC report for" followed by the confirming domain, whose body, or one
          of whose body parts, is the report with media type "application/json".
          Verifiers <bcp14>SHOULD</bcp14> send report email from a domain that
          authenticates its mail, so that receivers can filter it.  Failure to
          deliver a report is not retried more than once.
        </t>
      </section>

      <section anchor="reports-handling">
        <name>Handling Reports</name>
        <t>
          Reports are unauthenticated assertions by whoever sent them.  A confirming domain
          treats a report as a prompt to verify the named affiliated domain itself, not as
          evidence, and rate-limits what it accepts.  Reports are not a substitute for
          the monitoring described in <xref target="ops-monitor"/>.
        </t>
      </section>
    </section>

    <section anchor="ops">
      <name>Operational Considerations</name>

      <section anchor="ops-automation">
        <name>Automation and Inventory</name>
        <t>
          Apart from the expiry date, the records contain no dates.  An organization
          with many domains maintains the records with a tool that generates tokens,
          writes records through its DNS providers' interfaces, and updates expiry
          dates when the affiliated domains' registrations are renewed
          (<xref target="confirmation"/>).
        </t>
        <t>
          Affiliations go stale when domains change hands.  The most reliable control
          is to derive confirmations from the organization's registrar accounts or
          domain inventory, so that a confirmation is removed when its domain leaves
          the inventory.  Registrars and DNS providers can offer this as a service.
        </t>
      </section>

      <section anchor="ops-ttl">
        <name>TTLs, Signatures, and Revocation Time</name>
        <t>
          The time for an ended affiliation to stop verifying is normally bounded by
          the TTL of the confirmation (or the freshness lifetime of the HTTPS
          confirmation) and by the 86400-second limit in
          <xref target="verify-cache"/>; serve-stale resolvers and replay can extend
          it (<xref target="verify-cache"/>, <xref target="sec-replay"/>).  A TTL of 3600
          seconds is a reasonable default.  For signed zones, the validity period of
          signatures over confirmation records also bounds how long a deleted
          confirmation can be replayed (<xref target="sec-replay"/>); confirming domains
          wanting prompt revocation keep it short for names below "_affiliation".
          The negative-caching TTL of the confirming domain's zone affects how soon a new
          confirmation becomes visible.
        </t>
      </section>

      <section anchor="ops-staged">
        <name>Staged Deployment</name>
        <t>
          A confirming domain can publish its marker with "m=test", create confirmations, and
          check results before changing the marker to "enforce".  Relying parties
          can likewise verify in a reporting-only mode before acting on results.
        </t>
      </section>

      <section anchor="ops-channels">
        <name>Choosing and Changing Channels</name>
        <t>
          The DNS channel needs only DNS records and benefits from DNSSEC.  The HTTPS
          channel suits confirming domains that prefer to manage confirmations in a
          web application; it requires that the confirming domain itself serve HTTPS
          on port 443 without redirecting, which many organizations' apex domains do
          not do by default.  A confirming domain that changes channel publishes
          confirmations in the new channel before changing the marker and removes the
          old ones after the marker's TTL has passed.
        </t>
        <t>
          The primary zones of many large organizations are not signed.  Such a
          confirming domain obtains authenticated results ("webpki") by publishing
          its confirmations over HTTPS, either with "c=https" in its marker or
          without a marker (step 5 of <xref target="verify-steps"/>).  With an
          unsigned marker selecting the DNS channel and DNS confirmations, results
          are not authenticated.
        </t>
        <t>
          Confirmations may be hosted by a DNS provider through CNAME records or by
          delegating the "_affiliation" name; the provider can then create and remove
          confirmations (<xref target="sec-wildcard"/>).
        </t>
      </section>

      <section anchor="ops-load">
        <name>Load and Scale</name>
        <t>
          Verification costs at most three TXT queries and one HTTPS request.
          Markers are shared by all affiliated domains of a confirming domain and are
          cached accordingly.  Most domains publish no claim, and for them the cost is
          one query.  A confirming domain using the HTTPS channel receives a request
          for each verification of a claim naming it that is not answered from a
          cache, and a confirming domain whose marker is not validated as secure
          receives one for each such verification not confirmed in the DNS; such
          confirming domains
          <bcp14>SHOULD</bcp14> serve confirmations from infrastructure able to
          handle that load and <bcp14>SHOULD</bcp14> set a Cache-Control max-age,
          also on 404 responses.
        </t>
      </section>

      <section anchor="ops-dns">
        <name>DNS Configuration</name>
        <ul spacing="normal">
          <li>
            Confirming domains <bcp14>SHOULD</bcp14> sign their zones with DNSSEC so that
            verifiers can obtain authenticated results.  A signed confirming domain's zone
            <bcp14>SHOULD</bcp14> use NSEC3 <xref target="RFC5155"/> with the
            parameters in <xref target="RFC9276"/>, compact denial of existence
            <xref target="RFC9824"/>, or minimally covering NSEC records
            <xref target="RFC4470"/>, and <bcp14>SHOULD NOT</bcp14> use NSEC records
            that allow the zone to be walked (<xref target="privacy"/>).
          </li>
          <li>
            Confirming domains <bcp14>SHOULD</bcp14> restrict zone transfers to their own
            secondary servers <xref target="RFC5936"/> <xref target="RFC9103"/>.
          </li>
          <li>
            Confirming domains and affiliated domains <bcp14>MUST NOT</bcp14> publish wildcard records at
            or below their "_affiliation" names, and <bcp14>SHOULD NOT</bcp14> publish
            wildcard CNAME records that cover those names.
          </li>
        </ul>
      </section>

      <section anchor="ops-monitor">
        <name>Monitoring</name>
        <t>
          Confirming operators can check newly observed domains, for example from
          Certificate Transparency logs, for claims naming their domain.  A claim
          carrying a token the confirming domain did not issue indicates a domain attempting to
          borrow its standing; a claim for a domain no longer in the confirming domain's
          inventory indicates a confirmation that should already have been removed.
        </t>
      </section>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>

      <section anchor="sec-threats">
        <name>Threat Model</name>
        <t>
          The attacker wants a domain it controls to verify as affiliated with a
          confirming domain it does not control, to prevent a legitimate affiliation from
          verifying, to use an affiliation to delay action against abuse, or to learn
          a confirming domain's affiliated domains.  The attacker can register domains, publish
          records in zones it controls, place content on web hosting it has access
          to, observe public DNS data, and in some cases forge or replay DNS responses
          on the path to a verifier.  Compromise of the confirming domain's DNS zone or web
          origin is discussed in <xref target="sec-compromise"/>.
        </t>
      </section>

      <section anchor="sec-forged">
        <name>Fabricated Claims</name>
        <t>
          Anyone can publish a claim naming any confirming domain.  The claim is
          confirmed only if a record exists under the confirming domain's
          "_affiliation" node, or at the confirming domain's HTTPS origin, that names
          the claiming domain.  Absent forged responses (<xref target="sec-spoof"/>),
          only the confirming operator, or a party able to create resources on its
          HTTPS origin (<xref target="sec-https-others"/>), can create such a
          record.
        </t>
        <t>
          A fabricated claim therefore does not make an impersonating domain appear
          affiliated with the organization it imitates.  If the organization's
          marker carries an "f" tag, verifiers can report the claim to it with the
          reason "unconfirmed-token" (<xref target="reports"/>).
        </t>
      </section>

      <section anchor="sec-copy">
        <name>Copied Claims and Token Disclosure</name>
        <t>
          Claims and tokens are public.  An attacker that copies a legitimate claim to
          its own domain obtains a confirmation naming the legitimate affiliated domain, and the
          result is "not-confirmed".  The binding between token and affiliated domain is in the
          confirming domain's confirmation, which the attacker cannot alter.
        </t>
      </section>

      <section anchor="sec-stale">
        <name>Stale Confirmations</name>
        <t>
          If a confirming domain fails to remove the confirmation of an affiliated domain that has
          changed hands, the new registrant of the affiliated domain inherits the affiliation.
          This is the most likely failure in practice.  The requirement in
          <xref target="publish-end"/>, inventory-driven automation
          (<xref target="ops-automation"/>), and monitoring
          (<xref target="ops-monitor"/>) address it.  An expiry date tied to the
          registration (<xref target="confirmation"/>), maintained by a tool that
          ends the confirmation when the domain is deleted, limits the time a
          lapsed registration stays confirmed, but does not help when the domain
          is sold before then.  Relying parties with access to
          registration data <xref target="RFC9083"/> <xref target="RFC9224"/> can
          treat a confirmation with caution when the affiliated domain's registration changed
          after the confirmation was first observed.
        </t>
        <t>
          Likewise, if a confirming domain expires and is registered by someone else,
          the new registrant can confirm arbitrary domains.  Relying parties that
          attribute standing to a confirming domain based on its history can reassess a confirming domain
          whose registration has changed rather than carrying standing across the
          change.
        </t>
      </section>

      <section anchor="sec-spoof">
        <name>Forged DNS Responses</name>
        <t>
          An attacker able to forge DNS responses to a verifier, for example through
          cache poisoning <xref target="RFC5452"/> or by hijacking routes to
          authoritative servers, can produce any result for unsigned zones.  For the
          DNS channel, the forgery has to cover the confirming domain's records; forging the
          claim alone cannot produce "confirmed".
        </t>
        <t>
          Forging the marker of an unsigned zone, or the marker of any zone toward
          a verifier that does not validate DNSSEC, can switch the channel or
          change the mode, for example by removing "m=test".  Switching to the DNS
          channel helps the
          attacker only together with forged confirmation records, and the result
          is then not authenticated.  Switching to the HTTPS channel, or removing
          the marker, causes the verifier to fetch the confirmation from the
          confirming domain's HTTPS origin, where the Web PKI protects against
          forged DNS answers: the
          result is "confirmed" only if that origin serves a confirmation naming
          the affiliated domain.  This is why the fixed HTTPS resource is consulted
          for unsigned zones whatever the marker says (step 5 of
          <xref target="verify-steps"/>), and why no party other than the confirming
          operator may create resources under it (<xref target="https-resource"/>).
        </t>
        <t>
          Results authenticated with DNSSEC or the Web PKI are not affected by
          forged DNS responses for the records they authenticate
          (<xref target="verify-auth"/>).
          Relying parties taking consequential actions on unauthenticated results
          can perform the queries from several network locations and require the
          answers to agree, as certification authorities are required to do for
          domain validation <xref target="CABF-BR"/>.
        </t>
      </section>

      <section anchor="sec-replay">
        <name>Replay of Deleted Records</name>
        <t>
          An attacker on the path to a verifier can replay a confirmation that the
          confirming domain has deleted.  For unsigned zones, any response can be forged
          anyway.  For signed zones, a replayed RRset validates until its signatures
          expire, which can be weeks.  Confirming domains that want deletion to take effect
          promptly against such attackers use short signature validity periods for
          names below "_affiliation" (<xref target="ops-ttl"/>).  A confirmation with
          an expiry date cannot be replayed to effect beyond that date.
        </t>
      </section>

      <section anchor="sec-wildcard">
        <name>Wildcards, Aliases, and Delegation</name>
        <t>
          If a confirming domain's zone contained a wildcard such as "*.bank.example" and no
          "_affiliation" node existed, queries for confirmation names would be
          answered from the wildcard <xref target="RFC4592"/>.  If that wildcard
          were a CNAME into a zone operated by a third party, such as a hosting
          platform, a tenant of that platform might be able to publish a TXT record
          there confirming a domain of its choosing.  The marker prevents this: since
          its owner name exists, a wildcard above it cannot match names below it, and
          verifiers reject a marker reached through a CNAME or DNAME record.  An empty
          non-terminal at "_affiliation" also blocks the wildcard, and the result
          is "not-confirmed" unless a confirmation is obtained over HTTPS in step 5
          of <xref target="verify-steps"/>.
        </t>
        <t>
          Confirmation names may be CNAMEs, and the "_affiliation" name may be
          delegated or carry a DNAME record.  The operator of the target or delegated zone can then create
          and remove confirmations.  Confirming domains delegate in this way only to parties they
          would trust to publish confirmations on their behalf.
        </t>
      </section>

      <section anchor="sec-compromise">
        <name>Compromise of the Confirming Domain</name>
        <t>
          An attacker controlling the confirming domain's DNS zone can confirm any domain; it can
          also redirect the confirming domain itself, so DAC does not add to the
          consequences of that compromise.  An attacker controlling only the
          confirming domain's web origin, or able to create resources under
          "/.well-known/affiliation/" on it, can confirm domains through the HTTPS
          channel when the confirming domain's marker selects that channel or is
          not validated as secure (<xref target="verify-steps"/>).  A confirming
          domain whose zone is signed and whose marker selects the DNS channel is
          not exposed in this way to verifiers that validate DNSSEC.  Verifiers
          report the channel used, and relying
          parties concerned about web compromise can give less weight to
          confirmations obtained over HTTPS.  A confirming domain can detect
          confirmations it did not create by comparing them with its inventory, and
          recovers by deleting them.
        </t>
      </section>

      <section anchor="sec-https-others">
        <name>HTTPS Resources Created by Others</name>
        <t>
          Verifiers consult "/.well-known/affiliation/" on the HTTPS origin of any
          confirming domain whose marker is not validated as secure (step 5 of
          <xref target="verify-steps"/>).  A party able to create resources there
          can therefore confirm domains in that domain's name, whether or not its
          operator takes part in DAC.  Examples are web hosting shared by several
          customers, upload features that store files at paths the uploader
          chooses, and content delivery configurations that pass unknown paths to
          a customer's server.  Other uses of fixed paths on an origin, such as
          the "http-01" challenge of ACME <xref target="RFC8555"/>, carry the same
          exposure.  Confirming operators <bcp14>MUST NOT</bcp14> allow it
          (<xref target="https-resource"/>).  Operators of other origins that let
          others create resources at arbitrary paths can avoid it by signing their
          zones or by answering every request under "/.well-known/affiliation/"
          with 404 (Not Found).  Relying parties concerned about this risk can give
          less weight to "webpki" results for confirming domains whose web
          content is not under their operator's sole control.
        </t>
      </section>

      <section anchor="sec-deflect">
        <name>Use of Affiliations to Deflect Takedowns</name>
        <t>
          An attacker that controls a confirming domain to which relying parties
          attribute standing, for example an expired domain re-registered for its
          history or a compromised DNS account, can confirm look-alike domains used
          for phishing.  Takedown requests may then be directed to an abuse contact
          that the attacker controls.  Relying parties should not let a confirmation
          alone delay action against abuse they have observed, and can reassess
          confirming domains whose registration has changed (<xref target="sec-stale"/>) or
          whose set of confirmed domains grows unexpectedly.
        </t>
      </section>

      <section anchor="sec-false-signal">
        <name>Inducing Adverse Results</name>
        <t>
          An attacker able to place a TXT record at "_affiliation" under a victim's
          domain, for example through a dangling or wildcard CNAME in the victim's
          zone pointing to a platform the attacker uses, controls the victim's claim.
          It can make the victim appear to claim a confirming domain that does not confirm it,
          which is one reason why results other than "confirmed" are not by
          themselves evidence of malice (<xref target="semantics-use"/>).  It can
          also name a confirming domain the attacker operates and confirm the claim there,
          making the victim appear affiliated with the attacker and directing abuse
          reports about the victim to the attacker's contact.  Affiliated domains therefore
          <bcp14>MUST NOT</bcp14> publish wildcards covering their "_affiliation"
          name (<xref target="ops-dns"/>) and <bcp14>SHOULD</bcp14> make their claim
          name a CNAME only to names they or their confirming operator control.
        </t>
      </section>

      <section anchor="sec-dos">
        <name>Resource Consumption</name>
        <t>
          Verification is bounded at three TXT queries and one HTTPS request with its
          address resolution, with no recursion and no references in record
          content, avoiding the lookup-limit
          problems experienced with <xref target="RFC7208"/>; following several
          levels (<xref target="publish-levels"/>) is bounded at nine queries and
          three HTTPS requests.
        </t>
        <t>
          An attacker can publish claims with random tokens naming a participating
          confirming domain, so that each verification causes a query for a new name at the
          confirming domain's authoritative servers, or a request to its HTTPS origin.
          Claims naming a confirming domain whose marker is not validated as secure
          cause an HTTPS request even if that domain does not participate (step 5
          of <xref target="verify-steps"/>); verifiers cache the response, including
          404 responses, for its freshness lifetime.
          Aggressive use of DNSSEC-validated caches <xref target="RFC8198"/> can absorb
          such queries only where denial of existence covers ranges of names; the
          configurations recommended in <xref target="ops-dns"/> to prevent zone
          walking, and unsigned zones, give up that protection, so confirming domains using them
          depend on verifiers limiting their query rates.  Verifiers that accept names to verify from untrusted
          sources <bcp14>SHOULD</bcp14> rate-limit the queries and requests they send
          for each confirming domain.
        </t>
      </section>

      <section anchor="sec-subtree">
        <name>Subtree Confirmations</name>
        <t>
          A subtree confirmation extends the confirming domain's statement to names that the
          confirming domain does not list individually.  If anyone other than the confirming domain's
          organization can create names below the affiliated domain, for example because the
          affiliated domain offers subdomains to customers or has a delegation or wildcard record
          pointing to a third party, those parties' names would appear affiliated
          with the confirming domain.  A subtree confirmation is also not evidence about the
          content of any particular name below the affiliated domain; abuse observed there is
          handled as in <xref target="sec-deflect"/>.  This is why confirming domains include
          "s=subtree" only for affiliated domains
          whose entire namespace they control (<xref target="scope"/>).  A dangling
          record below the affiliated domain, such as a CNAME to a deprovisioned cloud resource,
          has the same effect if taken over, so confirming domains using subtree confirmations
          keep the affiliated domain's zone free of such records.
        </t>
      </section>

      <section anchor="sec-reports">
        <name>Failure Reports</name>
        <t>
          An attacker can publish many claims naming a confirming domain so that verifiers send
          reports to it; the per-destination limit in <xref target="reports-when"/> and
          rate limiting at the confirming domain bound the effect.  Restricting report
          destinations to the confirming domain's own names prevents markers from being used to
          direct reports at third parties.  A forged marker can direct reports from
          a verifier to a name chosen by the attacker only within the same limits as
          other forged responses (<xref target="sec-spoof"/>).  Reports are never
          evidence that a domain is malicious (<xref target="reports-handling"/>).
        </t>
      </section>

      <section anchor="sec-expiry">
        <name>Expiry Dates</name>
        <t>
          Expiry dates are evaluated against the verifier's clock.  An expiry date
          limits how long a forgotten confirmation remains effective but does not
          replace removing confirmations (<xref target="publish-end"/>).
        </t>
      </section>

      <section anchor="sec-homograph">
        <name>Confusable Names</name>
        <t>
          An attacker can create its own confirming domain and affiliated domains with
          names resembling a legitimate organization's, and confirm them, including
          in a chain in which each look-alike confirms the next.  Their affiliations
          verify, but convey only the standing of the attacker's confirming domains,
          which is none of the standing of the names they resemble
          (<xref target="semantics-not"/>).  The legitimate organization is not
          involved and receives no reports about them.  User
          interfaces that display affiliations <bcp14>SHOULD</bcp14> display names
          in a form that makes confusable characters evident <xref target="UTS39"/>.
        </t>
      </section>
    </section>

    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>
        A claim publicly discloses that the affiliated domain declares an affiliation with the
        confirming domain; this disclosure is the purpose of the claim.  The confirming domain publishes
        no list of its domains: a query at the confirming domain reveals nothing about which
        affiliated domains exist, and confirmations can be located only from the
        corresponding claims.  A third party can still find affiliated domains by
        examining domains one by one, for example those listed in Certificate
        Transparency logs or zone files, so organizations should assume that every
        domain publishing a claim is discoverable.  Domains that publish no claim,
        such as names held defensively or not yet launched, are not revealed.
      </t>
      <t>
        This property depends on confirmation names not being enumerable.  Zone
        transfers and DNSSEC denial of existence using NSEC records can reveal them;
        NSEC3 hashes of names containing random tokens of 128 bits or more cannot
        feasibly be reversed.  <xref target="ops-dns"/> gives recommendations.
      </t>
      <t>
        Queries reveal to resolver operators, and to passive DNS collections, which
        domains a verifier is evaluating.  QNAME minimisation
        <xref target="RFC9156"/> reduces exposure of full names to servers higher
        in the DNS tree.  An HTTPS request, including one made in step 5 of
        <xref target="verify-steps"/> to a confirming domain that does not
        participate, reveals to the confirming domain's web servers that one of
        its affiliated domains, or a domain claiming it, is being evaluated, and
        reveals the token.
      </t>
      <t>
        Failure reports disclose to the confirming domain which of the verifier's evaluations
        involved claims naming the confirming domain.  Verifiers that do not wish to disclose
        this do not send reports, and the reports contain no information about why
        an evaluation took place.
      </t>
      <t>
        The abuse contact in the marker is published, and confirming domains
        <bcp14>SHOULD</bcp14> use role addresses.  Publishers <bcp14>SHOULD
        NOT</bcp14> include personal data in records.
      </t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>

      <section anchor="iana-underscore">
        <name>Underscored and Globally Scoped DNS Node Name</name>
        <t>
          IANA is requested to add the following entry to the "Underscored and
          Globally Scoped DNS Node Names" registry <xref target="RFC8552"/>:
        </t>
        <table anchor="tab-underscore">
          <name>Underscored Node Name</name>
          <thead>
            <tr><th>RR Type</th><th>_NODE NAME</th><th>Reference</th></tr>
          </thead>
          <tbody>
            <tr><td>TXT</td><td>_affiliation</td><td>RFC XXXX</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="iana-wellknown">
        <name>Well-Known URI</name>
        <t>
          IANA is requested to register the following in the "Well-Known URIs"
          registry <xref target="RFC8615"/>:
        </t>
        <dl newline="false" spacing="compact">
          <dt>URI Suffix:</dt><dd>affiliation</dd>
          <dt>Change Controller:</dt><dd>IETF</dd>
          <dt>Specification Document:</dt><dd>RFC XXXX, <xref target="https"/></dd>
          <dt>Status:</dt><dd>permanent</dd>
          <dt>Related Information:</dt><dd>None</dd>
        </dl>
      </section>

      <section anchor="iana-group">
        <name>Domain Affiliation Confirmation Registry Group</name>
        <t>
          IANA is requested to create a registry group titled "Domain Affiliation
          Confirmation (DAC)" containing the four registries below.  Registrations in
          all four are made under the Specification Required policy
          <xref target="RFC8126"/>.
        </t>

        <section anchor="iana-tags">
          <name>DAC Tags</name>
          <t>
            Each entry contains a tag name matching the "tag-name" rule, the record
            in which it appears (claim, marker, or confirmation; a tag may appear in
            more than one), a short description, and a reference.  The designated
            expert checks that the tag is clearly defined and that verifiers that
            ignore it remain interoperable.  The initial contents are:
          </t>
          <table anchor="tab-tags">
            <name>Initial DAC Tags</name>
            <thead>
              <tr><th>Tag</th><th>Record</th><th>Description</th><th>Reference</th></tr>
            </thead>
            <tbody>
              <tr><td>v</td><td>claim, marker, confirmation</td><td>version</td><td>RFC XXXX</td></tr>
              <tr><td>p</td><td>claim</td><td>confirming domain</td><td>RFC XXXX</td></tr>
              <tr><td>t</td><td>claim</td><td>token</td><td>RFC XXXX</td></tr>
              <tr><td>c</td><td>marker</td><td>confirmation channel</td><td>RFC XXXX</td></tr>
              <tr><td>r</td><td>marker</td><td>abuse contact URI</td><td>RFC XXXX</td></tr>
              <tr><td>m</td><td>marker</td><td>mode</td><td>RFC XXXX</td></tr>
              <tr><td>d</td><td>confirmation</td><td>affiliated domain</td><td>RFC XXXX</td></tr>
              <tr><td>s</td><td>confirmation</td><td>scope</td><td>RFC XXXX</td></tr>
              <tr><td>x</td><td>confirmation</td><td>expiry date</td><td>RFC XXXX</td></tr>
              <tr><td>rel</td><td>confirmation</td><td>relationship</td><td>RFC XXXX</td></tr>
              <tr><td>f</td><td>marker</td><td>failure report URI</td><td>RFC XXXX</td></tr>
            </tbody>
          </table>
        </section>

        <section anchor="iana-channels">
          <name>DAC Confirmation Channels</name>
          <t>
            Each entry contains a channel name consisting of lowercase letters,
            digits, and hyphens, a short
            description, and a reference.  The designated expert checks that the
            specification states how a confirmation is obtained, which outcomes map to
            which results, and the security properties of the channel.  The initial
            contents are:
          </t>
          <table anchor="tab-channels">
            <name>Initial DAC Confirmation Channels</name>
            <thead>
              <tr><th>Channel</th><th>Description</th><th>Reference</th></tr>
            </thead>
            <tbody>
              <tr><td>dns</td><td>TXT record under the confirming domain's "_affiliation" name</td><td>RFC XXXX</td></tr>
              <tr><td>https</td><td>Resource under "/.well-known/affiliation/"</td><td>RFC XXXX</td></tr>
            </tbody>
          </table>
        </section>

        <section anchor="iana-reasons">
          <name>DAC Report Reasons</name>
          <t>
            Each entry contains a reason value consisting of lowercase letters,
            digits, and hyphens, a short description, and a reference.  The
            designated expert checks that the reason describes a distinct outcome of
            the procedure in <xref target="verify-steps"/> or of a channel.  The
            initial contents are:
          </t>
          <table anchor="tab-reasons">
            <name>Initial DAC Report Reasons</name>
            <thead>
              <tr><th>Reason</th><th>Description</th><th>Reference</th></tr>
            </thead>
            <tbody>
              <tr><td>unconfirmed-token</td><td>No confirmation exists for the claim's token</td><td>RFC XXXX</td></tr>
              <tr><td>different-child</td><td>The confirmation names another domain</td><td>RFC XXXX</td></tr>
              <tr><td>expired</td><td>The confirmation's expiry date has passed</td><td>RFC XXXX</td></tr>
              <tr><td>malformed-confirmation</td><td>The confirmation is malformed, not unique, or cannot be obtained</td><td>RFC XXXX</td></tr>
            </tbody>
          </table>
        </section>

        <section anchor="iana-rel">
          <name>DAC Relationship Values</name>
          <t>
            Each entry contains a value of the "rel" tag consisting of lowercase
            letters, digits, and hyphens, a short description, and a reference.  The
            designated expert checks that the value states a relationship between
            the operators of the two domains that is distinct from those already
            registered.  The initial contents are:
          </t>
          <table anchor="tab-rel">
            <name>Initial DAC Relationship Values</name>
            <thead>
              <tr><th>Value</th><th>Description</th><th>Reference</th></tr>
            </thead>
            <tbody>
              <tr><td>same-entity</td><td>Operated by the legal entity that operates the confirming domain</td><td>RFC XXXX</td></tr>
              <tr><td>third-party</td><td>Operated by another party under the confirming operator's authority</td><td>RFC XXXX</td></tr>
            </tbody>
          </table>
        </section>
      </section>
    </section>

    <section anchor="impl" removeInRFC="true">
      <name>Implementation Status</name>
      <t>
        This section records the status of known implementations of the protocol
        defined by this specification at the time of posting of this Internet-Draft,
        and is based on a proposal described in <xref target="RFC7942"/>.  The
        description of implementations in this section is intended to assist the
        IETF in its decision processes in progressing drafts to RFCs.  Please note
        that the listing of any individual implementation here does not imply
        endorsement by the IETF.  Furthermore, no effort has been spent to verify
        the information presented here that was supplied by IETF contributors.
        This is not intended as, and must not be construed to be, a catalog of
        available implementations or their features.  Readers are advised to note
        that other implementations may exist.
      </t>
      <t>
        According to <xref target="RFC7942"/>, "this will allow reviewers and
        working groups to assign due consideration to documents that have the
        benefit of running code, which may serve as evidence of valuable
        experimentation and feedback that have made the implemented protocols more
        mature.  It is up to the individual working groups to use this information
        as they see fit".
      </t>
      <dl newline="false" spacing="normal">
        <dt>Organization:</dt>
        <dd>The first author.</dd>
        <dt>Implementation:</dt>
        <dd>
          "dac", a library and command-line tool in Go:
          <eref target="https://github.com/tastypepperoni/dac"/>.
        </dd>
        <dt>Description:</dt>
        <dd>
          A verifier implementing <xref target="verify"/> and
          <xref target="https"/> with its own DNS client, including step 5 of
          <xref target="verify-steps"/> and the check of a domain before it is
          registered (<xref target="registry"/>); failure reporting
          (<xref target="reports"/>); a publisher that maintains an inventory of
          affiliations, generates claims, markers and confirmations with "rel"
          values, and keeps expiry dates no later than the registration expiry
          using RDAP or dates entered by the operator
          (<xref target="confirmation"/>); a server for the HTTPS channel; checks
          of published records; and a test DNS server.  All test vectors of
          <xref target="vectors"/> are automated tests, and every record example
          in this document is checked against the ABNF in <xref target="syntax"/>.
        </dd>
        <dt>Level of maturity:</dt>
        <dd>Prototype; not yet deployed.</dd>
        <dt>Coverage:</dt>
        <dd>All of the protocol.</dd>
        <dt>Licensing:</dt>
        <dd>BSD 3-Clause.</dd>
        <dt>Contact:</dt>
        <dd>The first author.</dd>
      </dl>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>

        <reference anchor="RFC1034" target="https://www.rfc-editor.org/info/rfc1034">
          <front>
            <title>Domain names - concepts and facilities</title>
            <author initials="P." surname="Mockapetris" fullname="P. Mockapetris"/>
            <date year="1987" month="November"/>
          </front>
          <seriesInfo name="STD" value="13"/>
          <seriesInfo name="RFC" value="1034"/>
          <seriesInfo name="DOI" value="10.17487/RFC1034"/>
        </reference>

        <reference anchor="RFC1035" target="https://www.rfc-editor.org/info/rfc1035">
          <front>
            <title>Domain names - implementation and specification</title>
            <author initials="P." surname="Mockapetris" fullname="P. Mockapetris"/>
            <date year="1987" month="November"/>
          </front>
          <seriesInfo name="STD" value="13"/>
          <seriesInfo name="RFC" value="1035"/>
          <seriesInfo name="DOI" value="10.17487/RFC1035"/>
        </reference>

        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author initials="S." surname="Bradner" fullname="S. Bradner"/>
            <date year="1997" month="March"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>

        <reference anchor="RFC2181" target="https://www.rfc-editor.org/info/rfc2181">
          <front>
            <title>Clarifications to the DNS Specification</title>
            <author initials="R." surname="Elz" fullname="R. Elz"/>
            <author initials="R." surname="Bush" fullname="R. Bush"/>
            <date year="1997" month="July"/>
          </front>
          <seriesInfo name="RFC" value="2181"/>
          <seriesInfo name="DOI" value="10.17487/RFC2181"/>
        </reference>

        <reference anchor="RFC2308" target="https://www.rfc-editor.org/info/rfc2308">
          <front>
            <title>Negative Caching of DNS Queries (DNS NCACHE)</title>
            <author initials="M." surname="Andrews" fullname="M. Andrews"/>
            <date year="1998" month="March"/>
          </front>
          <seriesInfo name="RFC" value="2308"/>
          <seriesInfo name="DOI" value="10.17487/RFC2308"/>
        </reference>

        <reference anchor="RFC3339" target="https://www.rfc-editor.org/info/rfc3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author initials="G." surname="Klyne" fullname="G. Klyne"/>
            <author initials="C." surname="Newman" fullname="C. Newman"/>
            <date year="2002" month="July"/>
          </front>
          <seriesInfo name="RFC" value="3339"/>
          <seriesInfo name="DOI" value="10.17487/RFC3339"/>
        </reference>

        <reference anchor="RFC8259" target="https://www.rfc-editor.org/info/rfc8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author initials="T." surname="Bray" fullname="T. Bray" role="editor"/>
            <date year="2017" month="December"/>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>

        <reference anchor="RFC3986" target="https://www.rfc-editor.org/info/rfc3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author initials="T." surname="Berners-Lee" fullname="T. Berners-Lee"/>
            <author initials="R." surname="Fielding" fullname="R. Fielding"/>
            <author initials="L." surname="Masinter" fullname="L. Masinter"/>
            <date year="2005" month="January"/>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>

        <reference anchor="RFC4035" target="https://www.rfc-editor.org/info/rfc4035">
          <front>
            <title>Protocol Modifications for the DNS Security Extensions</title>
            <author initials="R." surname="Arends" fullname="R. Arends"/>
            <author initials="R." surname="Austein" fullname="R. Austein"/>
            <author initials="M." surname="Larson" fullname="M. Larson"/>
            <author initials="D." surname="Massey" fullname="D. Massey"/>
            <author initials="S." surname="Rose" fullname="S. Rose"/>
            <date year="2005" month="March"/>
          </front>
          <seriesInfo name="RFC" value="4035"/>
          <seriesInfo name="DOI" value="10.17487/RFC4035"/>
        </reference>

        <reference anchor="RFC4086" target="https://www.rfc-editor.org/info/rfc4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <author initials="D." surname="Eastlake 3rd" fullname="D. Eastlake 3rd"/>
            <author initials="J." surname="Schiller" fullname="J. Schiller"/>
            <author initials="S." surname="Crocker" fullname="S. Crocker"/>
            <date year="2005" month="June"/>
          </front>
          <seriesInfo name="BCP" value="106"/>
          <seriesInfo name="RFC" value="4086"/>
          <seriesInfo name="DOI" value="10.17487/RFC4086"/>
        </reference>

        <reference anchor="RFC4592" target="https://www.rfc-editor.org/info/rfc4592">
          <front>
            <title>The Role of Wildcards in the Domain Name System</title>
            <author initials="E." surname="Lewis" fullname="E. Lewis"/>
            <date year="2006" month="July"/>
          </front>
          <seriesInfo name="RFC" value="4592"/>
          <seriesInfo name="DOI" value="10.17487/RFC4592"/>
        </reference>

        <reference anchor="RFC4648" target="https://www.rfc-editor.org/info/rfc4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author initials="S." surname="Josefsson" fullname="S. Josefsson"/>
            <date year="2006" month="October"/>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>

        <reference anchor="RFC5234" target="https://www.rfc-editor.org/info/rfc5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author initials="D." surname="Crocker" fullname="D. Crocker" role="editor"/>
            <author initials="P." surname="Overell" fullname="P. Overell"/>
            <date year="2008" month="January"/>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>

        <reference anchor="RFC5890" target="https://www.rfc-editor.org/info/rfc5890">
          <front>
            <title>Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework</title>
            <author initials="J." surname="Klensin" fullname="J. Klensin"/>
            <date year="2010" month="August"/>
          </front>
          <seriesInfo name="RFC" value="5890"/>
          <seriesInfo name="DOI" value="10.17487/RFC5890"/>
        </reference>

        <reference anchor="RFC5891" target="https://www.rfc-editor.org/info/rfc5891">
          <front>
            <title>Internationalized Domain Names in Applications (IDNA): Protocol</title>
            <author initials="J." surname="Klensin" fullname="J. Klensin"/>
            <date year="2010" month="August"/>
          </front>
          <seriesInfo name="RFC" value="5891"/>
          <seriesInfo name="DOI" value="10.17487/RFC5891"/>
        </reference>

        <reference anchor="RFC6068" target="https://www.rfc-editor.org/info/rfc6068">
          <front>
            <title>The 'mailto' URI Scheme</title>
            <author initials="M." surname="Duerst" fullname="M. Duerst"/>
            <author initials="L." surname="Masinter" fullname="L. Masinter"/>
            <author initials="J." surname="Zawinski" fullname="J. Zawinski"/>
            <date year="2010" month="October"/>
          </front>
          <seriesInfo name="RFC" value="6068"/>
          <seriesInfo name="DOI" value="10.17487/RFC6068"/>
        </reference>

        <reference anchor="RFC6672" target="https://www.rfc-editor.org/info/rfc6672">
          <front>
            <title>DNAME Redirection in the DNS</title>
            <author initials="S." surname="Rose" fullname="S. Rose"/>
            <author initials="W." surname="Wijngaards" fullname="W. Wijngaards"/>
            <date year="2012" month="June"/>
          </front>
          <seriesInfo name="RFC" value="6672"/>
          <seriesInfo name="DOI" value="10.17487/RFC6672"/>
        </reference>

        <reference anchor="RFC6890" target="https://www.rfc-editor.org/info/rfc6890">
          <front>
            <title>Special-Purpose IP Address Registries</title>
            <author initials="M." surname="Cotton" fullname="M. Cotton"/>
            <author initials="L." surname="Vegoda" fullname="L. Vegoda"/>
            <author initials="R." surname="Bonica" fullname="R. Bonica" role="editor"/>
            <author initials="B." surname="Haberman" fullname="B. Haberman"/>
            <date year="2013" month="April"/>
          </front>
          <seriesInfo name="BCP" value="153"/>
          <seriesInfo name="RFC" value="6890"/>
          <seriesInfo name="DOI" value="10.17487/RFC6890"/>
        </reference>

        <reference anchor="RFC7208" target="https://www.rfc-editor.org/info/rfc7208">
          <front>
            <title>Sender Policy Framework (SPF) for Authorizing Use of Domains in Email, Version 1</title>
            <author initials="S." surname="Kitterman" fullname="S. Kitterman"/>
            <date year="2014" month="April"/>
          </front>
          <seriesInfo name="RFC" value="7208"/>
          <seriesInfo name="DOI" value="10.17487/RFC7208"/>
        </reference>

        <reference anchor="RFC7405" target="https://www.rfc-editor.org/info/rfc7405">
          <front>
            <title>Case-Sensitive String Support in ABNF</title>
            <author initials="P." surname="Kyzivat" fullname="P. Kyzivat"/>
            <date year="2014" month="December"/>
          </front>
          <seriesInfo name="RFC" value="7405"/>
          <seriesInfo name="DOI" value="10.17487/RFC7405"/>
        </reference>

        <reference anchor="RFC8126" target="https://www.rfc-editor.org/info/rfc8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author initials="M." surname="Cotton" fullname="M. Cotton"/>
            <author initials="B." surname="Leiba" fullname="B. Leiba"/>
            <author initials="T." surname="Narten" fullname="T. Narten"/>
            <date year="2017" month="June"/>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>

        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author initials="B." surname="Leiba" fullname="B. Leiba"/>
            <date year="2017" month="May"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>

        <reference anchor="RFC8552" target="https://www.rfc-editor.org/info/rfc8552">
          <front>
            <title>Scoped Interpretation of DNS Resource Records through "Underscored" Naming of Attribute Leaves</title>
            <author initials="D." surname="Crocker" fullname="D. Crocker"/>
            <date year="2019" month="March"/>
          </front>
          <seriesInfo name="BCP" value="222"/>
          <seriesInfo name="RFC" value="8552"/>
          <seriesInfo name="DOI" value="10.17487/RFC8552"/>
        </reference>

        <reference anchor="RFC8615" target="https://www.rfc-editor.org/info/rfc8615">
          <front>
            <title>Well-Known Uniform Resource Identifiers (URIs)</title>
            <author initials="M." surname="Nottingham" fullname="M. Nottingham"/>
            <date year="2019" month="May"/>
          </front>
          <seriesInfo name="RFC" value="8615"/>
          <seriesInfo name="DOI" value="10.17487/RFC8615"/>
        </reference>

        <reference anchor="RFC9110" target="https://www.rfc-editor.org/info/rfc9110">
          <front>
            <title>HTTP Semantics</title>
            <author initials="R." surname="Fielding" fullname="R. Fielding" role="editor"/>
            <author initials="M." surname="Nottingham" fullname="M. Nottingham" role="editor"/>
            <author initials="J." surname="Reschke" fullname="J. Reschke" role="editor"/>
            <date year="2022" month="June"/>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>

        <reference anchor="RFC9499" target="https://www.rfc-editor.org/info/rfc9499">
          <front>
            <title>DNS Terminology</title>
            <author initials="P." surname="Hoffman" fullname="P. Hoffman"/>
            <author initials="K." surname="Fujiwara" fullname="K. Fujiwara"/>
            <date year="2024" month="March"/>
          </front>
          <seriesInfo name="BCP" value="219"/>
          <seriesInfo name="RFC" value="9499"/>
          <seriesInfo name="DOI" value="10.17487/RFC9499"/>
        </reference>

        <reference anchor="RFC9525" target="https://www.rfc-editor.org/info/rfc9525">
          <front>
            <title>Service Identity in TLS</title>
            <author initials="P." surname="Saint-Andre" fullname="P. Saint-Andre"/>
            <author initials="R." surname="Salz" fullname="R. Salz"/>
            <date year="2023" month="November"/>
          </front>
          <seriesInfo name="RFC" value="9525"/>
          <seriesInfo name="DOI" value="10.17487/RFC9525"/>
        </reference>
      </references>

      <references>
        <name>Informative References</name>

        <reference anchor="RFC2606" target="https://www.rfc-editor.org/info/rfc2606">
          <front>
            <title>Reserved Top Level DNS Names</title>
            <author initials="D." surname="Eastlake 3rd" fullname="D. Eastlake 3rd"/>
            <author initials="A." surname="Panitz" fullname="A. Panitz"/>
            <date year="1999" month="June"/>
          </front>
          <seriesInfo name="BCP" value="32"/>
          <seriesInfo name="RFC" value="2606"/>
          <seriesInfo name="DOI" value="10.17487/RFC2606"/>
        </reference>

        <reference anchor="RFC3597" target="https://www.rfc-editor.org/info/rfc3597">
          <front>
            <title>Handling of Unknown DNS Resource Record (RR) Types</title>
            <author initials="A." surname="Gustafsson" fullname="A. Gustafsson"/>
            <date year="2003" month="September"/>
          </front>
          <seriesInfo name="RFC" value="3597"/>
          <seriesInfo name="DOI" value="10.17487/RFC3597"/>
        </reference>

        <reference anchor="RFC4343" target="https://www.rfc-editor.org/info/rfc4343">
          <front>
            <title>Domain Name System (DNS) Case Insensitivity Clarification</title>
            <author initials="D." surname="Eastlake 3rd" fullname="D. Eastlake 3rd"/>
            <date year="2006" month="January"/>
          </front>
          <seriesInfo name="RFC" value="4343"/>
          <seriesInfo name="DOI" value="10.17487/RFC4343"/>
        </reference>

        <reference anchor="RFC4470" target="https://www.rfc-editor.org/info/rfc4470">
          <front>
            <title>Minimally Covering NSEC Records and DNSSEC On-line Signing</title>
            <author initials="S." surname="Weiler" fullname="S. Weiler"/>
            <author initials="J." surname="Ihren" fullname="J. Ihren"/>
            <date year="2006" month="April"/>
          </front>
          <seriesInfo name="RFC" value="4470"/>
          <seriesInfo name="DOI" value="10.17487/RFC4470"/>
        </reference>

        <reference anchor="RFC5155" target="https://www.rfc-editor.org/info/rfc5155">
          <front>
            <title>DNS Security (DNSSEC) Hashed Authenticated Denial of Existence</title>
            <author initials="B." surname="Laurie" fullname="B. Laurie"/>
            <author initials="G." surname="Sisson" fullname="G. Sisson"/>
            <author initials="R." surname="Arends" fullname="R. Arends"/>
            <author initials="D." surname="Blacka" fullname="D. Blacka"/>
            <date year="2008" month="March"/>
          </front>
          <seriesInfo name="RFC" value="5155"/>
          <seriesInfo name="DOI" value="10.17487/RFC5155"/>
        </reference>

        <reference anchor="RFC5452" target="https://www.rfc-editor.org/info/rfc5452">
          <front>
            <title>Measures for Making DNS More Resilient against Forged Answers</title>
            <author initials="A." surname="Hubert" fullname="A. Hubert"/>
            <author initials="R." surname="van Mook" fullname="R. van Mook"/>
            <date year="2009" month="January"/>
          </front>
          <seriesInfo name="RFC" value="5452"/>
          <seriesInfo name="DOI" value="10.17487/RFC5452"/>
        </reference>

        <reference anchor="RFC5507" target="https://www.rfc-editor.org/info/rfc5507">
          <front>
            <title>Design Choices When Expanding the DNS</title>
            <author>
              <organization>IAB</organization>
            </author>
            <author initials="P." surname="Faltstrom" fullname="P. Faltstrom" role="editor"/>
            <author initials="R." surname="Austein" fullname="R. Austein" role="editor"/>
            <author initials="P." surname="Koch" fullname="P. Koch" role="editor"/>
            <date year="2009" month="April"/>
          </front>
          <seriesInfo name="RFC" value="5507"/>
          <seriesInfo name="DOI" value="10.17487/RFC5507"/>
        </reference>

        <reference anchor="RFC5936" target="https://www.rfc-editor.org/info/rfc5936">
          <front>
            <title>DNS Zone Transfer Protocol (AXFR)</title>
            <author initials="E." surname="Lewis" fullname="E. Lewis"/>
            <author initials="A." surname="Hoenes" fullname="A. Hoenes" role="editor"/>
            <date year="2010" month="June"/>
          </front>
          <seriesInfo name="RFC" value="5936"/>
          <seriesInfo name="DOI" value="10.17487/RFC5936"/>
        </reference>

        <reference anchor="RFC6686" target="https://www.rfc-editor.org/info/rfc6686">
          <front>
            <title>Resolution of the Sender Policy Framework (SPF) and Sender ID Experiments</title>
            <author initials="M." surname="Kucherawy" fullname="M. Kucherawy"/>
            <date year="2012" month="July"/>
          </front>
          <seriesInfo name="RFC" value="6686"/>
          <seriesInfo name="DOI" value="10.17487/RFC6686"/>
        </reference>

        <reference anchor="RFC7942" target="https://www.rfc-editor.org/info/rfc7942">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author initials="Y." surname="Sheffer" fullname="Y. Sheffer"/>
            <author initials="A." surname="Farrel" fullname="A. Farrel"/>
            <date year="2016" month="July"/>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>

        <reference anchor="RFC8198" target="https://www.rfc-editor.org/info/rfc8198">
          <front>
            <title>Aggressive Use of DNSSEC-Validated Cache</title>
            <author initials="K." surname="Fujiwara" fullname="K. Fujiwara"/>
            <author initials="A." surname="Kato" fullname="A. Kato"/>
            <author initials="W." surname="Kumari" fullname="W. Kumari"/>
            <date year="2017" month="July"/>
          </front>
          <seriesInfo name="RFC" value="8198"/>
          <seriesInfo name="DOI" value="10.17487/RFC8198"/>
        </reference>

        <reference anchor="RFC8767" target="https://www.rfc-editor.org/info/rfc8767">
          <front>
            <title>Serving Stale Data to Improve DNS Resiliency</title>
            <author initials="D." surname="Lawrence" fullname="D. Lawrence"/>
            <author initials="W." surname="Kumari" fullname="W. Kumari"/>
            <author initials="P." surname="Sood" fullname="P. Sood"/>
            <date year="2020" month="March"/>
          </front>
          <seriesInfo name="RFC" value="8767"/>
          <seriesInfo name="DOI" value="10.17487/RFC8767"/>
        </reference>

        <reference anchor="RFC9083" target="https://www.rfc-editor.org/info/rfc9083">
          <front>
            <title>JSON Responses for the Registration Data Access Protocol (RDAP)</title>
            <author initials="S." surname="Hollenbeck" fullname="S. Hollenbeck"/>
            <author initials="A." surname="Newton" fullname="A. Newton"/>
            <date year="2021" month="June"/>
          </front>
          <seriesInfo name="STD" value="95"/>
          <seriesInfo name="RFC" value="9083"/>
          <seriesInfo name="DOI" value="10.17487/RFC9083"/>
        </reference>

        <reference anchor="RFC9103" target="https://www.rfc-editor.org/info/rfc9103">
          <front>
            <title>DNS Zone Transfer over TLS</title>
            <author initials="W." surname="Toorop" fullname="W. Toorop"/>
            <author initials="S." surname="Dickinson" fullname="S. Dickinson"/>
            <author initials="S." surname="Sahib" fullname="S. Sahib"/>
            <author initials="P." surname="Aras" fullname="P. Aras"/>
            <author initials="A." surname="Mankin" fullname="A. Mankin"/>
            <date year="2021" month="August"/>
          </front>
          <seriesInfo name="RFC" value="9103"/>
          <seriesInfo name="DOI" value="10.17487/RFC9103"/>
        </reference>

        <reference anchor="RFC9156" target="https://www.rfc-editor.org/info/rfc9156">
          <front>
            <title>DNS Query Name Minimisation to Improve Privacy</title>
            <author initials="S." surname="Bortzmeyer" fullname="S. Bortzmeyer"/>
            <author initials="R." surname="Dolmans" fullname="R. Dolmans"/>
            <author initials="P." surname="Hoffman" fullname="P. Hoffman"/>
            <date year="2021" month="November"/>
          </front>
          <seriesInfo name="RFC" value="9156"/>
          <seriesInfo name="DOI" value="10.17487/RFC9156"/>
        </reference>

        <reference anchor="RFC9224" target="https://www.rfc-editor.org/info/rfc9224">
          <front>
            <title>Finding the Authoritative Registration Data Access Protocol (RDAP) Service</title>
            <author initials="M." surname="Blanchet" fullname="M. Blanchet"/>
            <date year="2022" month="March"/>
          </front>
          <seriesInfo name="STD" value="95"/>
          <seriesInfo name="RFC" value="9224"/>
          <seriesInfo name="DOI" value="10.17487/RFC9224"/>
        </reference>

        <reference anchor="RFC9276" target="https://www.rfc-editor.org/info/rfc9276">
          <front>
            <title>Guidance for NSEC3 Parameter Settings</title>
            <author initials="W." surname="Hardaker" fullname="W. Hardaker"/>
            <author initials="V." surname="Dukhovni" fullname="V. Dukhovni"/>
            <date year="2022" month="August"/>
          </front>
          <seriesInfo name="BCP" value="236"/>
          <seriesInfo name="RFC" value="9276"/>
          <seriesInfo name="DOI" value="10.17487/RFC9276"/>
        </reference>

        <reference anchor="RFC9824" target="https://www.rfc-editor.org/info/rfc9824">
          <front>
            <title>Compact Denial of Existence in DNSSEC</title>
            <author initials="S." surname="Huque" fullname="S. Huque"/>
            <author initials="C." surname="Elmerot" fullname="C. Elmerot"/>
            <author initials="O." surname="Gudmundsson" fullname="O. Gudmundsson"/>
            <date year="2025" month="September"/>
          </front>
          <seriesInfo name="RFC" value="9824"/>
          <seriesInfo name="DOI" value="10.17487/RFC9824"/>
        </reference>

        <reference anchor="RFC9989" target="https://www.rfc-editor.org/info/rfc9989">
          <front>
            <title>Domain-Based Message Authentication, Reporting, and Conformance (DMARC)</title>
            <author initials="T." surname="Herr" fullname="T. Herr" role="editor"/>
            <author initials="J." surname="Levine" fullname="J. Levine" role="editor"/>
            <date year="2026" month="May"/>
          </front>
          <seriesInfo name="RFC" value="9989"/>
          <seriesInfo name="DOI" value="10.17487/RFC9989"/>
        </reference>

        <reference anchor="UTS46" target="https://www.unicode.org/reports/tr46/">
          <front>
            <title>Unicode IDNA Compatibility Processing</title>
            <author initials="M." surname="Davis" fullname="Mark Davis"/>
            <author initials="M." surname="Suignard" fullname="Michel Suignard"/>
            <date/>
          </front>
          <seriesInfo name="Unicode Technical Standard" value="#46"/>
        </reference>

        <reference anchor="UTS39" target="https://www.unicode.org/reports/tr39/">
          <front>
            <title>Unicode Security Mechanisms</title>
            <author initials="M." surname="Davis" fullname="Mark Davis"/>
            <author initials="M." surname="Suignard" fullname="Michel Suignard"/>
            <date/>
          </front>
          <seriesInfo name="Unicode Technical Standard" value="#39"/>
        </reference>

        <reference anchor="I-D.ietf-dnsop-domain-verification-techniques"
                   target="https://datatracker.ietf.org/doc/html/draft-ietf-dnsop-domain-verification-techniques-13">
          <front>
            <title>Domain Control Validation using DNS</title>
            <author initials="S." surname="Sahib" fullname="Shivan Sahib"/>
            <author initials="S." surname="Huque" fullname="Shumon Huque"/>
            <author initials="P." surname="Wouters" fullname="Paul Wouters"/>
            <author initials="E." surname="Nygren" fullname="Erik Nygren"/>
            <date year="2026" month="June" day="22"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-dnsop-domain-verification-techniques-13"/>
        </reference>


        <reference anchor="I-D.ietf-regext-epp-same-entity"
                   target="https://datatracker.ietf.org/doc/html/draft-ietf-regext-epp-same-entity-01">
          <front>
            <title>Same Entity Set Support for the Extensible Provisioning Protocol (EPP)</title>
            <author initials="J." surname="Galvin" fullname="James Galvin"/>
            <author initials="M." surname="Bauland" fullname="M. Bauland"/>
            <date year="2026" month="July" day="13"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-regext-epp-same-entity-01"/>
        </reference>
        <reference anchor="I-D.brotman-rdbd"
                   target="https://datatracker.ietf.org/doc/html/draft-brotman-rdbd-03">
          <front>
            <title>Related Domains By DNS</title>
            <author initials="A." surname="Brotman" fullname="Alex Brotman"/>
            <author initials="S." surname="Farrell" fullname="Stephen Farrell"/>
            <date year="2019" month="September" day="18"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-brotman-rdbd-03"/>
        </reference>
        <reference anchor="I-D.tjw-dbound2-problem-statement"
                   target="https://datatracker.ietf.org/doc/html/draft-tjw-dbound2-problem-statement-00">
          <front>
            <title>Domain Boundaries 2.0 Problem Statement</title>
            <author initials="T." surname="Wicinski" fullname="Tim Wicinski" role="editor"/>
            <date year="2023" month="March" day="13"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-tjw-dbound2-problem-statement-00"/>
        </reference>
        <reference anchor="I-D.ihsanullah-dnsid"
                   target="https://datatracker.ietf.org/doc/html/draft-ihsanullah-dnsid-01">
          <front>
            <title>DNS-Anchored Durable Identity for AI Agents (DNSid)</title>
            <author initials="N." surname="Ihsanullah" fullname="Naveed Ihsanullah"/>
            <date year="2026" month="June" day="29"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ihsanullah-dnsid-01"/>
        </reference>
        <reference anchor="I-D.mozleywilliams-dnsop-dnsaid"
                   target="https://datatracker.ietf.org/doc/html/draft-mozleywilliams-dnsop-dnsaid-02">
          <front>
            <title>DNS for AI Discovery</title>
            <author initials="J." surname="Mozley" fullname="Jim Mozley"/>
            <author initials="N." surname="Williams" fullname="Nic Williams"/>
            <author initials="B." surname="Sarikaya" fullname="Behcet Sarikaya"/>
            <author initials="R." surname="Schott" fullname="Roland Schott"/>
            <author initials="J." surname="Damick" fullname="Jeff Damick"/>
            <date year="2026" month="May" day="27"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mozleywilliams-dnsop-dnsaid-02"/>
        </reference>
        <reference anchor="I-D.barrett-dnsop-domain-set"
                   target="https://datatracker.ietf.org/doc/html/draft-barrett-dnsop-domain-set-00">
          <front>
            <title>The Domain Set Discovery Protocol (domain-set)</title>
            <author initials="T." surname="Barrett" fullname="Thomas Barrett"/>
            <author initials="C." surname="Schaub" fullname="Chris Schaub"/>
            <author initials="A." surname="Barrett" fullname="Andrew Barrett"/>
            <author initials="P." surname="Kowalik" fullname="P. Kowalik"/>
            <date year="2026" month="August" day="20"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-barrett-dnsop-domain-set-00"/>
        </reference>
        <reference anchor="RWS" target="https://github.com/WICG/first-party-sets">
          <front>
            <title>Related Website Sets</title>
            <author>
              <organization>Web Platform Incubator Community Group</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC8056" target="https://www.rfc-editor.org/info/rfc8056">
          <front>
            <title>Extensible Provisioning Protocol (EPP) and Registration Data Access Protocol (RDAP) Status Mapping</title>
            <author initials="J." surname="Gould" fullname="J. Gould"/>
            <date year="2017" month="January"/>
          </front>
          <seriesInfo name="RFC" value="8056"/>
          <seriesInfo name="DOI" value="10.17487/RFC8056"/>
        </reference>
        <reference anchor="RFC8555" target="https://www.rfc-editor.org/info/rfc8555">
          <front>
            <title>Automatic Certificate Management Environment (ACME)</title>
            <author initials="R." surname="Barnes" fullname="R. Barnes"/>
            <author initials="J." surname="Hoffman-Andrews" fullname="J. Hoffman-Andrews"/>
            <author initials="D." surname="McCarney" fullname="D. McCarney"/>
            <author initials="J." surname="Kasten" fullname="J. Kasten"/>
            <date year="2019" month="March"/>
          </front>
          <seriesInfo name="RFC" value="8555"/>
          <seriesInfo name="DOI" value="10.17487/RFC8555"/>
        </reference>
        <reference anchor="RFC9082" target="https://www.rfc-editor.org/info/rfc9082">
          <front>
            <title>Registration Data Access Protocol (RDAP) Query Format</title>
            <author initials="S." surname="Hollenbeck" fullname="S. Hollenbeck"/>
            <author initials="A." surname="Newton" fullname="A. Newton"/>
            <date year="2021" month="June"/>
          </front>
          <seriesInfo name="STD" value="95"/>
          <seriesInfo name="RFC" value="9082"/>
          <seriesInfo name="DOI" value="10.17487/RFC9082"/>
        </reference>


        <reference anchor="CABF-BR" target="https://cabforum.org/working-groups/server/baseline-requirements/requirements/">
          <front>
            <title>Baseline Requirements for the Issuance and Management of Publicly-Trusted TLS Server Certificates</title>
            <author>
              <organization>CA/Browser Forum</organization>
            </author>
            <date/>
          </front>
        </reference>

        <reference anchor="PSL" target="https://publicsuffix.org/">
          <front>
            <title>Public Suffix List</title>
            <author>
              <organization>Mozilla Foundation</organization>
            </author>
            <date/>
          </front>
        </reference>


        <reference anchor="ITCHIO" target="https://videogameschronicle.com/news/funko-and-brandshield-say-it-wasnt-their-fault-itch-io-was-taken-offline-site-creator-says-otherwise">
          <front>
            <title>Funko and BrandShield say it wasn't their fault itch.io was taken offline, site creator says otherwise</title>
            <author>
              <organization>Video Games Chronicle</organization>
            </author>
            <date year="2024" month="December"/>
          </front>
        </reference>
      </references>
    </references>

    <section anchor="rationale">
      <name>Design Rationale</name>

      <section anchor="rationale-txt">
        <name>Why TXT Records</name>
        <t>
          <xref target="RFC5507"/> discourages overloading TXT records, mainly
          because unrelated uses collide at the same owner name.  DAC uses a
          dedicated underscored name <xref target="RFC8552"/> and a version tag,
          which avoid that collision.  A dedicated resource record type would remove
          the need for version-tag parsing, and authoritative servers handle unknown
          types <xref target="RFC3597"/>.  TXT was chosen because DNS provisioning
          interfaces used by domain operators support it universally, and because
          experience with the dedicated SPF type <xref target="RFC6686"/>, which
          <xref target="RFC7208"/> removed, showed the deployment cost of requiring
          one.  The data model is simple enough that a dedicated type could be added
          later without changing it.
        </t>
        <t>
          Verifiers query TXT records only at fixed names under the two domains
          concerned, formed with "_affiliation" and, for confirmations, a token.  No
          name is found by walking up or across the DNS tree, so the difficulties
          of discovering policy at arbitrary points in the tree do not arise.
        </t>
      </section>

      <section anchor="rationale-list">
        <name>Why Not a List of Domains</name>
        <t>
          If the confirming domain published a list of its domains, a single query at the
          confirming domain would disclose the organization's entire portfolio at once,
          including domains not otherwise easy to find, which is a ready-made target
          list for attackers and can reveal products before launch.  Every new
          domain would require editing a shared record, and the list would be bounded
          by record size or moved to a separate document fetched over HTTPS, adding a
          dependency.  Hashing list entries does not help, because domain names are
          guessable.  Confirmations per affiliated domain reveal nothing at the confirming domain and are
          each located only from a claim.
        </t>
      </section>

      <section anchor="rationale-signatures">
        <name>Why Not Signatures</name>
        <t>
          A confirming domain could publish a public key and sign each affiliated domain's name, with the
          signature published by the affiliated domain, so that the confirming domain's zone would not
          change per affiliated domain.  Signatures remain valid after an affiliated domain changes hands,
          however, so they need expiry dates, periodic re-signing of every affiliated domain,
          revocation lists for urgent cases, and procedures for key rotation and
          compromise.  DAC instead relies on the confirming domain's existing control of its DNS
          zone or web origin, at the cost of one record per affiliated domain at the confirming domain.
        </t>
      </section>

      <section anchor="rationale-psl">
        <name>Why the Procedure Does Not Use the Public Suffix List</name>
        <t>
          Mechanisms that infer relationships between names depend on the Public
          Suffix List <xref target="PSL"/>, a community-maintained list without a
          standard update model; <xref target="RFC9989"/> replaced its use in DMARC
          for this reason.  DAC infers nothing: each confirmation requires a record
          that only the confirming operator can publish.  A claim naming a public suffix
          as its confirming domain is confirmed only if that suffix's operator confirms it.
          Relying parties may still use boundary information to decide which names to
          evaluate and how to attribute standing.
        </t>
      </section>

      <section anchor="rationale-transitive">
        <name>Why Affiliation Is Not Transitive Across Organizations</name>
        <t>
          A mechanism in which organizations vouch for one another, with vouching
          that propagates, lets an attacker gain standing by compromising or paying
          any participant, dilutes the meaning of each step, and makes revocation
          depend on parties who may not know about the chain.  DAC expresses only that
          one operator operates or authorizes a domain.  The protocol cannot tell
          whether two levels belong to the same organization, which is why a
          confirmation says nothing about the confirmed domain's own affiliated domains
          (<xref target="publish-levels"/>).
        </t>
      </section>

      <section anchor="rationale-mesh">
        <name>Why One Confirming Domain per Affiliated Domain</name>
        <t>
          In designs where every member of a group lists, and must be confirmed by,
          every other member, each new domain requires changes at every member, and a
          verifier must compute the group as the closure of pairwise links, at a cost
          that grows with the size of the group and has to be capped by arbitrary
          limits.  DAC relates each affiliated domain to exactly one confirming domain, so adding a domain
          changes two records and verification has a fixed cost.  Organizations with
          several levels are handled one affiliation at a time
          (<xref target="publish-levels"/>).
        </t>
      </section>

      <section anchor="rationale-auth">
        <name>Why Authentication Is Reported Rather Than Required</name>
        <t>
          Requiring DNSSEC or an HTTPS origin on both sides of every relationship
          would exclude most domains, including names held defensively that serve no
          content, and would make the mechanism unusable for most of the
          organizations it is meant to help.  DAC instead reports whether each result
          is authenticated (<xref target="verify-auth"/>), so that relying parties
          can require authentication where their decisions warrant it.
        </t>
        <t>
          The primary zones of many large organizations are not signed, so DNSSEC
          alone would leave most confirming domains without authenticated results.
          The Web PKI authenticates a confirmation obtained over HTTPS whatever
          selected the channel, because a "confirmed" result requires a
          confirmation that names the affiliated domain.  What an attacker could
          still forge is the decision whether to consult the HTTPS origin.  The
          procedure therefore consults the fixed HTTPS resource whenever the marker
          is not validated as secure and the DNS channel does not yield
          "confirmed" (<xref target="verify-steps"/>), so that a forged or removed
          marker cannot hide an HTTPS confirmation or select a resource the
          confirming operator does not control (<xref target="https-resource"/>).
          Toward verifiers that validate DNSSEC, a signed confirming domain keeps
          full control of the channel through its marker.
        </t>
      </section>

      <section anchor="rationale-registration">
        <name>Why Confirmations Are Not Bound to Registration Data</name>
        <t>
          A confirmation could carry data identifying the affiliated domain's
          registration or DNS configuration, such as a digest of its DNSSEC key or
          its name servers, so that it stops verifying when that data changes.  Such
          data changes for many reasons other than a change of hands, such as key
          rollovers and changes of DNS provider, and is often shared by unrelated
          domains, such as the name servers of a registrar or DNS provider.  Each
          such change would end affiliations that should continue, while a new
          registrant using the same provider could keep them.  DAC instead
          recommends an expiry date tied to the registration, extended only on
          renewal (<xref target="confirmation"/>), and relies on the confirming
          operator to remove confirmations when a domain changes hands
          (<xref target="publish-end"/>).
        </t>
        <t>
          A profile for a specific use, such as DNSSEC-signed domains operated
          for software agents, may add a binding to the affiliated domain's key,
          as a tag registered as described in <xref target="iana-tags"/>.
        </t>
      </section>

      <section anchor="rationale-rel">
        <name>Why the Relationship Is Optional</name>
        <t>
          Most relying parties need only the statement that the confirming operator
          operates or authorizes the affiliated domain (<xref target="semantics"/>).
          Some, such as registries reusing a verification of a legal entity
          (<xref target="registry"/>), need to know whether the same legal entity
          operates both domains.  The "rel" tag lets the confirming operator state
          this without changing the meaning of confirmations that omit it, so
          confirmations published without it remain valid, and verifiers that do not
          recognize it ignore it.
        </t>
      </section>

      <section anchor="rationale-infra">
        <name>Why No Aggregators</name>
        <t>
          DAC needs no index, registry of relationships, or submission service.
          Every verifier obtains results directly from the domains concerned, so
          there is no additional party to operate, trust, or keep current, and no
          endpoint that can be used to make a service send traffic to arbitrary
          domains.  Claims can still cause verifiers to send queries and HTTPS
          requests to the domains they name (<xref target="sec-dos"/>).
          Aggregators can be built on DAC, but nothing depends on them.
        </t>
      </section>

      <section anchor="rationale-meaning">
        <name>Why the Meaning of a Confirmation Is Defined</name>
        <t>
          A mechanism that declares a relationship between domains, but whose
          specification forbids relying parties to draw conclusions from it, gives
          those parties nothing to act on, and the problems in
          <xref target="problem"/> remain.  DAC addresses a specific operational
          problem with intended consumers, takedown services and reputation systems,
          and states what a confirmation means (<xref target="semantics"/>),
          including where reports of abuse are to be sent.  It also bounds that
          meaning: a confirmation conveys no more standing than the confirming domain already
          has (<xref target="semantics-not"/>).  The authors invite operators of such
          services to comment on whether the stated meaning meets their needs.
        </t>
      </section>
    </section>

    <section anchor="example">
      <name>Complete Example</name>
      <t>The operator of bank.example launches embank.example and uses the DNS channel.</t>
      <sourcecode type="dns-rr"><![CDATA[
; In the bank.example zone (once):
_affiliation.bank.example.   3600 IN TXT
    "v=DAC1; r=mailto:abuse@bank.example"

; In the bank.example zone (per affiliated domain):
mfrggzdfmztwq2lknnwg23tpobyxe43u._affiliation.bank.example.
                             3600 IN TXT "v=DAC1; d=embank.example"

; In the embank.example zone:
_affiliation.embank.example. 3600 IN TXT
    "v=DAC1; p=bank.example; t=mfrggzdfmztwq2lknnwg23tpobyxe43u"
]]></sourcecode>
      <t>A verifier evaluating embank.example:</t>
      <ol spacing="normal">
        <li>
          queries TXT at _affiliation.embank.example and obtains confirming domain
          "bank.example" and the token;
        </li>
        <li>
          queries TXT at _affiliation.bank.example and obtains the marker: channel
          "dns", mode "enforce", contact "mailto:abuse@bank.example";
        </li>
        <li>
          queries TXT at mfrggzdfmztwq2lknnwg23tpobyxe43u._affiliation.bank.example
          and obtains "d=embank.example", which equals the affiliated domain.
        </li>
      </ol>
      <t>
        The result is "confirmed", reusable for 3600 seconds, and authenticated
        ("dnssec") if all three answers validate as secure.  If embank.example is
        operated by the same legal entity as bank.example, the confirmation can
        state this as "v=DAC1; d=embank.example; rel=same-entity".
      </t>
      <t>
        If the bank.example zone is not signed, its operator can instead serve the
        confirmation at https://bank.example/.well-known/affiliation/ followed by
        the token (<xref target="https"/>).  A verifier that finds no confirmation in
        the DNS then fetches that resource, and the result is "confirmed" over HTTPS,
        authenticated as "webpki".
      </t>
      <t>
        A mail filter assessing "statements.embank.example" verifies
        "embank.example", the domain it already treats as responsible for that name.
        Because the confirmation above has no "s" tag, the result states nothing
        about "statements.embank.example" itself.  If bank.example operates every
        name under embank.example, it publishes the confirmation as
        "v=DAC1; d=embank.example; s=subtree", and the result covers
        "statements.embank.example" too.
      </t>
      <t>
        An attacker registers embank-login.example and publishes a copy of the
        claim.  Step 3 returns "d=embank.example", which differs from
        "embank-login.example", so the result is "not-confirmed".  When the operator
        of bank.example sells embank.example, it deletes the confirmation; from then
        on, embank.example yields "not-confirmed" whatever its new operator
        publishes.
      </t>
    </section>

    <section anchor="vectors">
      <name>Test Vectors</name>
      <t>
        Each vector describes a change to the data of <xref target="example"/> and
        the expected result for the affiliated domain "embank.example" (in vector
        6, "embank-login.example").  T is the example token.  Unless a vector says
        otherwise, no answer validates as secure, and requests for resources
        under "/.well-known/affiliation/" at bank.example yield 404, so step 5 of
        <xref target="verify-steps"/> does not change the result of vectors 1 to
        60.  "Unauthenticated" means a "confirmed" result that is not
        authenticated (<xref target="verify-auth"/>).  The reference
        implementation (<xref target="impl"/>) runs these vectors as tests.
      </t>
      <table anchor="tab-vectors">
        <name>Test Vectors</name>
        <thead>
          <tr><th>#</th><th>Change from the example</th><th>Result</th></tr>
        </thead>
        <tbody>
          <tr><td>1</td><td>None</td><td>confirmed</td></tr>
          <tr><td>2</td><td>No claim at the affiliated domain</td><td>none</td></tr>
          <tr><td>3</td><td>Affiliated domain has only "v=spf1 -all"</td><td>none</td></tr>
          <tr><td>4</td><td>Affiliated domain has "v=DAC10; p=bank.example; t=T"</td><td>none</td></tr>
          <tr><td>5</td><td>No marker at the confirming domain</td><td>not-confirmed</td></tr>
          <tr><td>6</td><td>Affiliated domain is embank-login.example with a copy of the claim</td><td>not-confirmed</td></tr>
          <tr><td>7</td><td>Claim carries a token the confirming domain never issued</td><td>not-confirmed</td></tr>
          <tr><td>8</td><td>Confirmation deleted</td><td>not-confirmed</td></tr>
          <tr><td>9</td><td>Marker name is an empty non-terminal (NOERROR, no data)</td><td>not-confirmed</td></tr>
          <tr><td>10</td><td>Marker answer contains a CNAME</td><td>permerror</td></tr>
          <tr><td>11</td><td>Marker answer contains a CNAME and no TXT data</td><td>permerror</td></tr>
          <tr><td>12</td><td>Claim answer contains a CNAME</td><td>confirmed</td></tr>
          <tr><td>13</td><td>Confirmation answer contains a CNAME</td><td>confirmed</td></tr>
          <tr><td>14</td><td>Two DAC records at the claim name</td><td>permerror</td></tr>
          <tr><td>15</td><td>Two DAC records at the confirmation name</td><td>permerror</td></tr>
          <tr><td>16</td><td>Confirmation repeats the "d" tag</td><td>permerror</td></tr>
          <tr><td>17</td><td>Confirmation has no "d" tag</td><td>permerror</td></tr>
          <tr><td>18</td><td>Token in uppercase</td><td>permerror</td></tr>
          <tr><td>19</td><td>Token of 8 characters</td><td>permerror</td></tr>
          <tr><td>20</td><td>Token of 26 characters, confirmed under that token</td><td>confirmed</td></tr>
          <tr><td>21</td><td>Claim has "p=Bank.Example."</td><td>permerror</td></tr>
          <tr><td>22</td><td>Claim has an additional tag "z=future"</td><td>confirmed</td></tr>
          <tr><td>23</td><td>Claim repeats the "p" tag</td><td>permerror</td></tr>
          <tr><td>24</td><td>Claim names embank.example as its confirming domain</td><td>permerror</td></tr>
          <tr><td>25</td><td>Confirming domain is the single-label name "bank"</td><td>confirmed</td></tr>
          <tr><td>26</td><td>Claim has "p=192.0.2.1"</td><td>permerror</td></tr>
          <tr><td>27</td><td>Marker has "m=test"</td><td>confirmed, mode test</td></tr>
          <tr><td>28</td><td>Marker has "m=other"</td><td>confirmed, mode test</td></tr>
          <tr><td>29</td><td>Confirmation has "s=subtree"</td><td>confirmed, covers names below</td></tr>
          <tr><td>30</td><td>Confirmation has "s=other"</td><td>confirmed, affiliated domain only</td></tr>
          <tr><td>31</td><td>Confirmation has "x=2099-12-31"</td><td>confirmed</td></tr>
          <tr><td>32</td><td>Confirmation has "x=2020-01-01"</td><td>not-confirmed (report reason "expired")</td></tr>
          <tr><td>33</td><td>Confirmation has "x=2027-02-30"</td><td>permerror</td></tr>
          <tr><td>34</td><td>Confirmation has an "x" value equal to the current UTC date</td><td>confirmed</td></tr>
          <tr><td>35</td><td>Confirmation has "s=subtree; x=2099-12-31"</td><td>confirmed, covers names below</td></tr>
          <tr><td>36</td><td>Marker has "f=mailto:dac-reports@bank.example"; claim carries a token the confirming domain never issued</td><td>not-confirmed; report with reason "unconfirmed-token" to that address</td></tr>
          <tr><td>37</td><td>Marker has "f=mailto:reports@other.example"; claim carries a token the confirming domain never issued</td><td>not-confirmed; no report</td></tr>
          <tr><td>38</td><td>Marker has "f=mailto:r@bank.example?cc=x@other.example"</td><td>no reports (tag ignored)</td></tr>
          <tr><td>39</td><td>Marker has "f=https://user@bank.example/r" or "f=https://bank.example:8443/r"</td><td>no reports (tag ignored)</td></tr>
          <tr><td>40</td><td>Marker has "f=https://reports.bank.example/dac"; "c=https" and the resource returns 404</td><td>not-confirmed; report reason "unconfirmed-token"</td></tr>
          <tr><td>41</td><td>Confirmation repeats the "d" tag, marker has a valid "f"</td><td>permerror; report reason "malformed-confirmation"</td></tr>
          <tr><td>42</td><td>Affiliated domain record has only marker tags ("v=DAC1; r=mailto:abuse@embank.example")</td><td>none</td></tr>
          <tr><td>43</td><td>Affiliated domain record has claim and marker tags; its own affiliated domains verify against it</td><td>confirmed (both)</td></tr>
          <tr><td>44</td><td>Claim has "p=bank.example" but no "t"</td><td>permerror</td></tr>
          <tr><td>45</td><td>Marker has "r=ftp://x.example"</td><td>confirmed, no contact</td></tr>
          <tr><td>46</td><td>Marker has "c=future" or "c=HTTPS"</td><td>not-confirmed</td></tr>
          <tr><td>47</td><td>SERVFAIL, timeout, or DNSSEC bogus at any of the three names</td><td>temperror</td></tr>
          <tr><td>48</td><td>Confirmation name returns NOERROR without data</td><td>not-confirmed</td></tr>
          <tr><td>49</td><td>"c=https"; 200, "text/plain", "v=DAC1; d=embank.example"</td><td>confirmed</td></tr>
          <tr><td>50</td><td>"c=https"; 200, "text/plain; charset=utf-8", "v=DAC1; d=embank.example"</td><td>confirmed</td></tr>
          <tr><td>51</td><td>"c=https"; 200, "text/plain", "Cache-Control: no-store", "v=DAC1; d=embank.example"</td><td>confirmed, not reusable</td></tr>
          <tr><td>52</td><td>"c=https"; 404</td><td>not-confirmed</td></tr>
          <tr><td>53</td><td>"c=https"; 301</td><td>permerror</td></tr>
          <tr><td>54</td><td>"c=https"; 200 with "text/html"</td><td>permerror</td></tr>
          <tr><td>55</td><td>"c=https"; content longer than 1024 octets</td><td>permerror</td></tr>
          <tr><td>56</td><td>"c=https"; content is two records</td><td>permerror</td></tr>
          <tr><td>57</td><td>"c=https"; malformed record</td><td>permerror</td></tr>
          <tr><td>58</td><td>"c=https"; 503 or connection failure</td><td>temperror</td></tr>
          <tr><td>59</td><td>"c=https"; confirming domain has no globally reachable address</td><td>permerror</td></tr>
          <tr><td>60</td><td>"c=https"; no resource, but a DNS confirmation exists</td><td>not-confirmed</td></tr>
          <tr><td>61</td><td>Confirmation has "rel=same-entity"</td><td>confirmed, relationship same-entity</td></tr>
          <tr><td>62</td><td>Confirmation has "rel=third-party"</td><td>confirmed, relationship third-party</td></tr>
          <tr><td>63</td><td>Confirmation has "rel=other"</td><td>confirmed, no relationship</td></tr>
          <tr><td>64</td><td>No marker; resource returns "v=DAC1; d=embank.example"</td><td>confirmed over HTTPS, "webpki"</td></tr>
          <tr><td>65</td><td>Confirmation deleted; resource returns "v=DAC1; d=embank.example"</td><td>confirmed over HTTPS, "webpki"</td></tr>
          <tr><td>66</td><td>As vector 65, but the marker validates as secure</td><td>not-confirmed</td></tr>
          <tr><td>67</td><td>As vector 49, stating the authentication</td><td>confirmed over HTTPS, "webpki"</td></tr>
          <tr><td>68</td><td>As vector 67, but the claim and the marker validate as secure</td><td>confirmed over HTTPS, "dnssec+webpki"</td></tr>
          <tr><td>69</td><td>All three answers validate as secure</td><td>confirmed, "dnssec"</td></tr>
          <tr><td>70</td><td>No marker; resource returns 404</td><td>not-confirmed</td></tr>
          <tr><td>71</td><td>Marker answer contains a CNAME; resource returns "v=DAC1; d=embank.example"</td><td>confirmed over HTTPS, "webpki"</td></tr>
          <tr><td>72</td><td>Marker has "c=future"; resource returns "v=DAC1; d=embank.example"</td><td>confirmed over HTTPS, "webpki"</td></tr>
          <tr><td>73</td><td>Resource returns "v=DAC1; d=other.example"</td><td>confirmed over DNS, unauthenticated</td></tr>
          <tr><td>74</td><td>No marker; resource returns "v=DAC1; d=embank.example; x=2020-01-01"</td><td>not-confirmed</td></tr>
        </tbody>
      </table>
    </section>

    <section anchor="changes" removeInRFC="true">
      <name>Changes since -00</name>
      <ul spacing="normal">
        <li>
          Renamed the roles "parent" and "child" to "confirming domain" and
          "affiliated domain" and stated that they imply no hierarchy in the DNS.
          Tag names and report member names are unchanged.
        </li>
        <li>
          Added the "rel" tag to confirmations, with the values "same-entity" and
          "third-party", and the "DAC Relationship Values" registry.
        </li>
        <li>
          Added step 5 to the verification procedure: when the marker is not
          validated as secure and the DNS channel does not yield "confirmed",
          verifiers fetch the HTTPS resource, taking the mode and abuse contact
          from the marker if there is one.  Added the "webpki" authentication
          value, required that only the confirming operator create resources under
          "/.well-known/affiliation/", added a security consideration on such
          resources created by others, and updated the operational, security, and
          privacy considerations accordingly.
        </li>
        <li>
          Recommended an expiry date no later than the affiliated domain's
          registration expiry, extended only on renewal, and stated the limits of
          this practice.
        </li>
        <li>
          Added a section on reuse of registrant verification by registries and
          registrars, including verification before a domain is registered.
          Later sections are renumbered.
        </li>
        <li>
          Added rationale on why confirmations are not bound to registration data,
          noting that a profile may add such a binding, and on why the
          relationship is optional.  Added a note that a reputation system may use
          a confirmation as the starting standing of a new affiliated domain.
        </li>
        <li>
          Added text on why organizations' internal policies do not solve the
          problem, on software agents, on which systems verify and when, on
          impersonation, and on why TXT records at fixed underscored names are used.
        </li>
        <li>
          Added references to related work: Related Domains By DNS, DBOUND, Related
          Website Sets, DNSid, DNS-AID, and domain-set.
        </li>
        <li>
          Added test vectors 61 to 74, and updated the implementation status.
        </li>
        <li>
          Added Fabio Ramos as an author.
        </li>
      </ul>
    </section>

    <section anchor="ack" numbered="false">
      <name>Acknowledgments</name>
      <t>
        This document builds on the practices collected in
        <xref target="I-D.ietf-dnsop-domain-verification-techniques"/> and on
        operational experience with SPF, DMARC, MTA-STS, and ACME.
      </t>
      <t>
        The authors thank John Klensin, John Levine, and Andrew Sullivan for
        their comments on the DNSOP mailing list.
      </t>
    </section>
  </back>
</rfc>
